summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES8365
-rw-r--r--CMake/CurlTests.c16
-rw-r--r--CMake/FindGSS.cmake2
-rw-r--r--CMake/FindMbedTLS.cmake13
-rw-r--r--CMake/OtherTests.cmake12
-rw-r--r--CMake/Utilities.cmake13
-rw-r--r--CMakeLists.txt311
-rw-r--r--COPYING2
-rwxr-xr-xMacOSX-Framework9
-rw-r--r--Makefile449
-rw-r--r--Makefile.am40
-rw-r--r--Makefile.in68
-rw-r--r--RELEASE-NOTES240
-rw-r--r--acinclude.m448
-rw-r--r--aclocal.m447
-rwxr-xr-xbuildconf5
-rw-r--r--buildconf.bat35
-rwxr-xr-xconfigure789
-rw-r--r--configure.ac226
-rwxr-xr-xdepcomp6
-rw-r--r--docs/BINDINGS.md50
-rw-r--r--docs/BUGS80
-rw-r--r--docs/CIPHERS.md426
-rw-r--r--docs/CMakeLists.txt3
-rw-r--r--docs/CONTRIBUTE.md62
-rw-r--r--docs/FAQ147
-rw-r--r--docs/FEATURES2
-rw-r--r--docs/HISTORY.md85
-rw-r--r--docs/INSTALL.cmake91
-rw-r--r--docs/INSTALL.md10
-rw-r--r--docs/INTERNALS.md74
-rw-r--r--docs/KNOWN_BUGS61
-rw-r--r--docs/MAIL-ETIQUETTE60
-rw-r--r--docs/MANUAL25
-rw-r--r--docs/Makefile.am47
-rw-r--r--docs/Makefile.in80
-rw-r--r--docs/README.cmake16
-rw-r--r--docs/README.md12
-rw-r--r--docs/README.netware9
-rw-r--r--docs/README.win327
-rw-r--r--docs/RELEASE-PROCEDURE12
-rw-r--r--docs/ROADMAP.md42
-rw-r--r--docs/SSLCERTS.md10
-rw-r--r--docs/THANKS114
-rw-r--r--docs/TODO187
-rw-r--r--docs/TheArtOfHttpScripting34
-rw-r--r--docs/cmdline-opts/CMakeLists.txt12
-rw-r--r--docs/cmdline-opts/MANPAGE.md6
-rw-r--r--docs/cmdline-opts/Makefile.am53
-rw-r--r--docs/cmdline-opts/Makefile.in124
-rw-r--r--docs/cmdline-opts/Makefile.inc48
-rw-r--r--docs/cmdline-opts/abstract-unix-socket.d9
-rw-r--r--docs/cmdline-opts/ciphers.d7
-rw-r--r--docs/cmdline-opts/config.d15
-rw-r--r--docs/cmdline-opts/environment.d7
-rw-r--r--docs/cmdline-opts/fail-early.d15
-rwxr-xr-xdocs/cmdline-opts/gen.pl32
-rw-r--r--docs/cmdline-opts/header.d9
-rw-r--r--docs/cmdline-opts/include.d9
-rw-r--r--docs/cmdline-opts/insecure.d14
-rw-r--r--docs/cmdline-opts/netrc-file.d2
-rw-r--r--docs/cmdline-opts/next.d2
-rw-r--r--docs/cmdline-opts/no-keepalive.d2
-rw-r--r--docs/cmdline-opts/noproxy.d4
-rw-r--r--docs/cmdline-opts/oauth2-bearer.d1
-rw-r--r--docs/cmdline-opts/page-footer25
-rw-r--r--docs/cmdline-opts/page-header7
-rw-r--r--docs/cmdline-opts/preproxy.d5
-rw-r--r--docs/cmdline-opts/proxy-header.d8
-rw-r--r--docs/cmdline-opts/proxy.d15
-rw-r--r--docs/cmdline-opts/proxytunnel.d3
-rw-r--r--docs/cmdline-opts/referer.d2
-rw-r--r--docs/cmdline-opts/request-target.d8
-rw-r--r--docs/cmdline-opts/silent.d3
-rw-r--r--docs/cmdline-opts/socks4.d4
-rw-r--r--docs/cmdline-opts/socks4a.d4
-rw-r--r--docs/cmdline-opts/socks5-basic.d7
-rw-r--r--docs/cmdline-opts/socks5-gssapi.d8
-rw-r--r--docs/cmdline-opts/socks5-hostname.d4
-rw-r--r--docs/cmdline-opts/socks5.d4
-rw-r--r--docs/cmdline-opts/suppress-connect-headers.d8
-rw-r--r--docs/cmdline-opts/tcp-nodelay.d2
-rw-r--r--docs/cmdline-opts/tls-max.d24
-rw-r--r--docs/cmdline-opts/use-ascii.d2
-rw-r--r--docs/cmdline-opts/write-out.d14
-rw-r--r--docs/curl-config.13
-rw-r--r--docs/curl.1234
-rw-r--r--docs/examples/Makefile.am8
-rw-r--r--docs/examples/Makefile.in83
-rw-r--r--docs/examples/Makefile.inc4
-rw-r--r--docs/examples/Makefile.m322
-rw-r--r--docs/examples/Makefile.netware6
-rw-r--r--docs/examples/anyauthput.c24
-rw-r--r--docs/examples/asiohiper.cpp181
-rw-r--r--docs/examples/cacertinmem.c4
-rw-r--r--docs/examples/certinfo.c19
-rw-r--r--docs/examples/cookie_interface.c11
-rw-r--r--docs/examples/curlx.c2
-rw-r--r--docs/examples/debug.c1
-rw-r--r--docs/examples/evhiperfifo.c4
-rw-r--r--docs/examples/externalsocket.c15
-rw-r--r--docs/examples/fopen.c14
-rw-r--r--docs/examples/ftpuploadfrommem.c124
-rw-r--r--docs/examples/ghiper.c11
-rw-r--r--docs/examples/hiperfifo.c14
-rw-r--r--docs/examples/htmltitle.cpp63
-rw-r--r--docs/examples/http2-download.c9
-rw-r--r--docs/examples/http2-serverpush.c5
-rw-r--r--docs/examples/http2-upload.c11
-rw-r--r--docs/examples/imap-copy.c4
-rw-r--r--docs/examples/imap-create.c4
-rw-r--r--docs/examples/imap-delete.c4
-rw-r--r--docs/examples/imap-examine.c4
-rw-r--r--docs/examples/imap-search.c4
-rw-r--r--docs/examples/multi-debugcallback.c1
-rw-r--r--docs/examples/multi-uv.c32
-rw-r--r--docs/examples/multithread.c8
-rw-r--r--docs/examples/pop3-top.c4
-rw-r--r--docs/examples/post-callback.c2
-rw-r--r--docs/examples/sampleconv.c74
-rw-r--r--docs/examples/sendrecv.c2
-rw-r--r--docs/examples/usercertinmem.c5
-rw-r--r--docs/libcurl/CMakeLists.txt55
-rw-r--r--docs/libcurl/Makefile.am78
-rw-r--r--docs/libcurl/Makefile.in122
-rw-r--r--docs/libcurl/Makefile.inc20
-rw-r--r--docs/libcurl/curl_easy_cleanup.33
-rw-r--r--docs/libcurl/curl_easy_duphandle.33
-rw-r--r--docs/libcurl/curl_easy_escape.314
-rw-r--r--docs/libcurl/curl_easy_getinfo.335
-rw-r--r--docs/libcurl/curl_easy_init.33
-rw-r--r--docs/libcurl/curl_easy_pause.33
-rw-r--r--docs/libcurl/curl_easy_perform.33
-rw-r--r--docs/libcurl/curl_easy_recv.33
-rw-r--r--docs/libcurl/curl_easy_reset.33
-rw-r--r--docs/libcurl/curl_easy_send.33
-rw-r--r--docs/libcurl/curl_easy_setopt.315
-rw-r--r--docs/libcurl/curl_easy_strerror.33
-rw-r--r--docs/libcurl/curl_easy_unescape.33
-rw-r--r--docs/libcurl/curl_escape.33
-rw-r--r--docs/libcurl/curl_formadd.37
-rw-r--r--docs/libcurl/curl_formfree.33
-rw-r--r--docs/libcurl/curl_formget.33
-rw-r--r--docs/libcurl/curl_free.33
-rw-r--r--docs/libcurl/curl_getdate.33
-rw-r--r--docs/libcurl/curl_getenv.33
-rw-r--r--docs/libcurl/curl_global_cleanup.33
-rw-r--r--docs/libcurl/curl_global_init.33
-rw-r--r--docs/libcurl/curl_global_init_mem.33
-rw-r--r--docs/libcurl/curl_mprintf.33
-rw-r--r--docs/libcurl/curl_multi_add_handle.33
-rw-r--r--docs/libcurl/curl_multi_assign.33
-rw-r--r--docs/libcurl/curl_multi_cleanup.33
-rw-r--r--docs/libcurl/curl_multi_fdset.33
-rw-r--r--docs/libcurl/curl_multi_info_read.33
-rw-r--r--docs/libcurl/curl_multi_init.33
-rw-r--r--docs/libcurl/curl_multi_perform.33
-rw-r--r--docs/libcurl/curl_multi_remove_handle.33
-rw-r--r--docs/libcurl/curl_multi_setopt.33
-rw-r--r--docs/libcurl/curl_multi_socket.33
-rw-r--r--docs/libcurl/curl_multi_socket_action.33
-rw-r--r--docs/libcurl/curl_multi_strerror.33
-rw-r--r--docs/libcurl/curl_multi_timeout.33
-rw-r--r--docs/libcurl/curl_multi_wait.33
-rw-r--r--docs/libcurl/curl_share_cleanup.33
-rw-r--r--docs/libcurl/curl_share_init.33
-rw-r--r--docs/libcurl/curl_share_setopt.33
-rw-r--r--docs/libcurl/curl_share_strerror.33
-rw-r--r--docs/libcurl/curl_slist_append.331
-rw-r--r--docs/libcurl/curl_slist_free_all.321
-rw-r--r--docs/libcurl/curl_strequal.37
-rw-r--r--docs/libcurl/curl_unescape.33
-rw-r--r--docs/libcurl/curl_version.33
-rw-r--r--docs/libcurl/curl_version_info.33
-rw-r--r--docs/libcurl/libcurl-easy.33
-rw-r--r--docs/libcurl/libcurl-errors.33
-rw-r--r--docs/libcurl/libcurl-multi.37
-rw-r--r--docs/libcurl/libcurl-share.33
-rw-r--r--docs/libcurl/libcurl-symbols.364
-rw-r--r--docs/libcurl/libcurl-thread.314
-rw-r--r--docs/libcurl/libcurl-tutorial.35
-rw-r--r--docs/libcurl/libcurl.33
-rw-r--r--docs/libcurl/opts/CMakeLists.txt12
-rw-r--r--docs/libcurl/opts/CURLINFO_ACTIVESOCKET.325
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_CERTINFO.337
-rw-r--r--docs/libcurl/opts/CURLINFO_CONDITION_UNMET.330
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.327
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.363
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.328
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.362
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_TYPE.324
-rw-r--r--docs/libcurl/opts/CURLINFO_COOKIELIST.333
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.322
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME.324
-rw-r--r--docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.324
-rw-r--r--docs/libcurl/opts/CURLINFO_HEADER_SIZE.324
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.332
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.324
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_VERSION.33
-rw-r--r--docs/libcurl/opts/CURLINFO_LASTSOCKET.325
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_IP.324
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_PORT.329
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_NUM_CONNECTS.322
-rw-r--r--docs/libcurl/opts/CURLINFO_OS_ERRNO.322
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_IP.325
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_PORT.321
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIVATE.322
-rw-r--r--docs/libcurl/opts/CURLINFO_PROTOCOL.33
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.333
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.323
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.320
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_URL.324
-rw-r--r--docs/libcurl/opts/CURLINFO_REQUEST_SIZE.321
-rw-r--r--docs/libcurl/opts/CURLINFO_RESPONSE_CODE.33
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.319
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.319
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.319
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.319
-rw-r--r--docs/libcurl/opts/CURLINFO_SCHEME.318
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.329
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.365
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.327
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.360
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.327
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.360
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.326
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.359
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_ENGINES.320
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.319
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.322
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SESSION.317
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.317
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME.322
-rw-r--r--docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAXCONNECTS.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.311
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING.312
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.33
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.33
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHDATA.337
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETDATA.334
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.334
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERDATA.341
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.354
-rw-r--r--docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.359
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.36
-rw-r--r--docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_APPEND.33
-rw-r--r--docs/libcurl/opts/CURLOPT_AUTOREFERER.322
-rw-r--r--docs/libcurl/opts/CURLOPT_BUFFERSIZE.336
-rw-r--r--docs/libcurl/opts/CURLOPT_CAINFO.323
-rw-r--r--docs/libcurl/opts/CURLOPT_CAPATH.327
-rw-r--r--docs/libcurl/opts/CURLOPT_CERTINFO.337
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.352
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_DATA.352
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.324
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.317
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.317
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.33
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_ONLY.318
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_TO.33
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.326
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.325
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.325
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEFILE.322
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEJAR.323
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIELIST.33
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIESESSION.322
-rw-r--r--docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLF.316
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLFILE.319
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.323
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGDATA.33
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.36
-rw-r--r--docs/libcurl/opts/CURLOPT_DIRLISTONLY.319
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.323
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_INTERFACE.318
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.318
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.318
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SERVERS.318
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_EGDSOCKET.318
-rw-r--r--docs/libcurl/opts/CURLOPT_ERRORBUFFER.33
-rw-r--r--docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.317
-rw-r--r--docs/libcurl/opts/CURLOPT_FAILONERROR.322
-rw-r--r--docs/libcurl/opts/CURLOPT_FILETIME.324
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_DATA.325
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.325
-rw-r--r--docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_FORBID_REUSE.316
-rw-r--r--docs/libcurl/opts/CURLOPT_FRESH_CONNECT.314
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPPORT.318
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPSSLAUTH.317
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.321
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.321
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.318
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.318
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.317
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.318
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.317
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.33
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.319
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_PRET.319
-rw-r--r--docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.331
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADER.33
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERDATA.335
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADEROPT.324
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP200ALIASES.320
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPAUTH.317
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPGET.33
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPHEADER.33
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPOST.33
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.339
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.315
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.315
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_VERSION.318
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.33
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERFACE.321
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.319
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.319
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLDATA.323
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.323
-rw-r--r--docs/libcurl/opts/CURLOPT_IPRESOLVE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT.318
-rw-r--r--docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.316
-rw-r--r--docs/libcurl/opts/CURLOPT_KEYPASSWD.320
-rw-r--r--docs/libcurl/opts/CURLOPT_KRBLEVEL.318
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORT.317
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.318
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.321
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.321
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_AUTH.318
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_FROM.318
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT.319
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXCONNECTS.316
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE.316
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXREDIRS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.315
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC.321
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC_FILE.319
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.316
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.315
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.310
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROGRESS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROXY.325
-rw-r--r--docs/libcurl/opts/CURLOPT_NOSIGNAL.33
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.344
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.343
-rw-r--r--docs/libcurl/opts/CURLOPT_PASSWORD.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PATH_AS_IS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.312
-rw-r--r--docs/libcurl/opts/CURLOPT_PIPEWAIT.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PORT.315
-rw-r--r--docs/libcurl/opts/CURLOPT_POST.319
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDS.311
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTQUOTE.323
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTREDIR.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PREQUOTE.338
-rw-r--r--docs/libcurl/opts/CURLOPT_PRE_PROXY.318
-rw-r--r--docs/libcurl/opts/CURLOPT_PRIVATE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSDATA.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROTOCOLS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY.353
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYAUTH.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYHEADER.325
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPASSWORD.320
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPORT.316
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYTYPE.345
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERNAME.320
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERPWD.319
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAINFO.320
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAPATH.336
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.319
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.319
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.319
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.318
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.322
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.322
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.323
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.319
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.318
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.33
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.321
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_PUT.37
-rw-r--r--docs/libcurl/opts/CURLOPT_QUOTE.323
-rw-r--r--docs/libcurl/opts/CURLOPT_RANDOM_FILE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_RANGE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_READDATA.33
-rw-r--r--docs/libcurl/opts/CURLOPT_READFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_REFERER.36
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.357
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM.33
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.315
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_REQUEST.317
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.315
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.319
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.320
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.320
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_IR.315
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKDATA.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKFUNCTION.320
-rw-r--r--docs/libcurl/opts/CURLOPT_SERVICE_NAME.318
-rw-r--r--docs/libcurl/opts/CURLOPT_SHARE.329
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTDATA.330
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.343
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.364
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYDATA.326
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.326
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT.320
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERTTYPE.321
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE.318
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY.320
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEYTYPE.321
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLVERSION.325
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.323
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.387
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.366
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.315
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.315
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_FALSESTART.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_OPTIONS.319
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.316
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.37
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.316
-rw-r--r--docs/libcurl/opts/CURLOPT_STDERR.33
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.321
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.319
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.320
-rw-r--r--docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.357
-rw-r--r--docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.396
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.316
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.35
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.37
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_NODELAY.325
-rw-r--r--docs/libcurl/opts/CURLOPT_TELNETOPTIONS.319
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.316
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMECONDITION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT_MS.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.320
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.320
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFERTEXT.315
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.316
-rw-r--r--docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.36
-rw-r--r--docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.325
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD.33
-rw-r--r--docs/libcurl/opts/CURLOPT_URL.36
-rw-r--r--docs/libcurl/opts/CURLOPT_USERAGENT.36
-rw-r--r--docs/libcurl/opts/CURLOPT_USERNAME.321
-rw-r--r--docs/libcurl/opts/CURLOPT_USERPWD.321
-rw-r--r--docs/libcurl/opts/CURLOPT_USE_SSL.33
-rw-r--r--docs/libcurl/opts/CURLOPT_VERBOSE.33
-rw-r--r--docs/libcurl/opts/CURLOPT_WILDCARDMATCH.33
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEDATA.33
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFODATA.33
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.33
-rw-r--r--docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.318
-rw-r--r--docs/libcurl/opts/Makefile.am938
-rw-r--r--docs/libcurl/opts/Makefile.in1276
-rw-r--r--docs/libcurl/opts/Makefile.inc314
-rw-r--r--docs/libcurl/symbols-in-versions30
-rw-r--r--docs/mk-ca-bundle.1119
-rw-r--r--include/Makefile.in19
-rw-r--r--include/README26
-rw-r--r--include/curl/Makefile.am25
-rw-r--r--include/curl/Makefile.in77
-rw-r--r--include/curl/curl.h56
-rw-r--r--include/curl/curlbuild.h.cmake197
-rw-r--r--include/curl/curlbuild.h.in197
-rw-r--r--include/curl/curlrules.h262
-rw-r--r--include/curl/curlver.h18
-rw-r--r--include/curl/multi.h2
-rw-r--r--include/curl/system.h (renamed from include/curl/curlbuild.h)280
-rw-r--r--include/curl/typecheck-gcc.h174
-rw-r--r--lib/CMakeLists.txt11
-rw-r--r--lib/Makefile.Watcom10
-rw-r--r--lib/Makefile.am14
-rw-r--r--lib/Makefile.b322
-rw-r--r--lib/Makefile.in35
-rw-r--r--lib/Makefile.m3216
-rw-r--r--lib/Makefile.netware46
-rw-r--r--lib/Makefile.vc10691
-rw-r--r--lib/Makefile.vc11691
-rw-r--r--lib/Makefile.vc12691
-rw-r--r--lib/Makefile.vc14691
-rw-r--r--lib/Makefile.vc6691
-rw-r--r--lib/Makefile.vc7691
-rw-r--r--lib/Makefile.vc8691
-rw-r--r--lib/Makefile.vc9691
-rw-r--r--lib/asyn-ares.c47
-rw-r--r--lib/asyn-thread.c48
-rwxr-xr-xlib/checksrc.pl4
-rw-r--r--lib/config-win32.h8
-rw-r--r--lib/config-win32ce.h4
-rw-r--r--lib/conncache.c61
-rw-r--r--lib/conncache.h6
-rw-r--r--lib/connect.c52
-rw-r--r--lib/connect.h10
-rw-r--r--lib/content_encoding.c5
-rw-r--r--lib/cookie.c50
-rw-r--r--lib/curl_addrinfo.c32
-rw-r--r--lib/curl_addrinfo.h2
-rw-r--r--lib/curl_config.h.cmake22
-rw-r--r--lib/curl_config.h.in30
-rw-r--r--lib/curl_des.c2
-rw-r--r--lib/curl_endian.c114
-rw-r--r--lib/curl_endian.h26
-rw-r--r--lib/curl_fnmatch.c8
-rw-r--r--lib/curl_md4.h8
-rw-r--r--lib/curl_memory.h4
-rw-r--r--lib/curl_ntlm_core.c22
-rw-r--r--lib/curl_ntlm_core.h27
-rw-r--r--lib/curl_ntlm_wb.c21
-rw-r--r--lib/curl_rtmp.c9
-rw-r--r--lib/curl_sasl.c9
-rw-r--r--lib/curl_setup.h54
-rw-r--r--lib/curl_setup_once.h16
-rw-r--r--lib/curl_threads.c15
-rw-r--r--lib/dict.c3
-rw-r--r--lib/dotdot.c3
-rw-r--r--lib/easy.c84
-rw-r--r--lib/escape.c4
-rw-r--r--lib/file.c33
-rw-r--r--lib/fileinfo.c14
-rw-r--r--lib/fileinfo.h12
-rw-r--r--lib/formdata.c165
-rw-r--r--lib/ftp.c252
-rw-r--r--lib/ftp.h3
-rw-r--r--lib/ftplistparser.c59
-rw-r--r--lib/getinfo.c55
-rw-r--r--lib/gopher.c7
-rw-r--r--lib/hash.c82
-rw-r--r--lib/hash.h7
-rw-r--r--lib/hostcheck.c2
-rw-r--r--lib/hostip.c14
-rw-r--r--lib/hostip.h4
-rw-r--r--lib/http.c231
-rw-r--r--lib/http.h15
-rw-r--r--lib/http2.c216
-rw-r--r--lib/http2.h7
-rw-r--r--lib/http_ntlm.c2
-rw-r--r--lib/http_proxy.c380
-rw-r--r--lib/http_proxy.h17
-rw-r--r--lib/if2ip.c8
-rw-r--r--lib/imap.c88
-rw-r--r--lib/inet_ntop.c12
-rw-r--r--lib/inet_pton.c6
-rw-r--r--lib/inet_pton.h5
-rw-r--r--lib/krb5.c14
-rw-r--r--lib/ldap.c102
-rw-r--r--lib/libcurl.plist6
-rw-r--r--lib/libcurl.rc4
-rw-r--r--lib/llist.c57
-rw-r--r--lib/llist.h19
-rw-r--r--lib/makefile.dj9
-rw-r--r--lib/md4.c12
-rw-r--r--lib/md5.c2
-rw-r--r--lib/memdebug.c31
-rwxr-xr-xlib/mk-ca-bundle.pl2
-rw-r--r--lib/mprintf.c18
-rw-r--r--lib/multi.c452
-rw-r--r--lib/multihandle.h19
-rw-r--r--lib/multiif.h7
-rw-r--r--lib/netrc.c5
-rw-r--r--lib/non-ascii.c21
-rw-r--r--lib/nonblock.c3
-rw-r--r--lib/objnames.inc4
-rw-r--r--lib/openldap.c2
-rw-r--r--lib/parsedate.c10
-rw-r--r--lib/pingpong.c21
-rw-r--r--lib/pingpong.h8
-rw-r--r--lib/pipeline.c146
-rw-r--r--lib/pipeline.h6
-rw-r--r--lib/pop3.c88
-rw-r--r--lib/progress.c112
-rw-r--r--lib/progress.h6
-rw-r--r--lib/rand.c71
-rw-r--r--lib/rand.h12
-rw-r--r--lib/rtsp.c93
-rw-r--r--lib/rtsp.h2
-rw-r--r--lib/security.c4
-rw-r--r--lib/select.c18
-rw-r--r--lib/select.h11
-rw-r--r--lib/sendf.c176
-rw-r--r--lib/smb.c72
-rw-r--r--lib/smtp.c89
-rw-r--r--lib/socks.c80
-rw-r--r--lib/speedcheck.c65
-rw-r--r--lib/speedcheck.h4
-rw-r--r--lib/splay.c124
-rw-r--r--lib/splay.h16
-rw-r--r--lib/ssh.c341
-rw-r--r--lib/strcase.c6
-rw-r--r--lib/strerror.c57
-rw-r--r--lib/strtoofft.c4
-rw-r--r--lib/system_win32.c4
-rw-r--r--lib/telnet.c151
-rw-r--r--lib/tftp.c24
-rw-r--r--lib/timeval.c78
-rw-r--r--lib/timeval.h21
-rw-r--r--lib/transfer.c180
-rw-r--r--lib/url.c890
-rw-r--r--lib/urldata.h198
-rw-r--r--lib/vauth/digest.c27
-rw-r--r--lib/vauth/digest_sspi.c290
-rw-r--r--lib/vauth/krb5_gssapi.c4
-rw-r--r--lib/vauth/krb5_sspi.c4
-rw-r--r--lib/vauth/ntlm.c36
-rw-r--r--lib/vauth/ntlm.h2
-rw-r--r--lib/vauth/spnego_gssapi.c4
-rw-r--r--lib/vauth/spnego_sspi.c3
-rw-r--r--lib/vtls/axtls.c28
-rw-r--r--lib/vtls/axtls.h8
-rw-r--r--lib/vtls/cyassl.c111
-rw-r--r--lib/vtls/cyassl.h10
-rw-r--r--lib/vtls/darwinssl.c387
-rw-r--r--lib/vtls/darwinssl.h31
-rw-r--r--lib/vtls/gskit.c52
-rw-r--r--lib/vtls/gtls.c215
-rw-r--r--lib/vtls/gtls.h8
-rw-r--r--lib/vtls/mbedtls.c179
-rw-r--r--lib/vtls/mbedtls.h12
-rw-r--r--lib/vtls/nss.c373
-rw-r--r--lib/vtls/nssg.h8
-rw-r--r--lib/vtls/openssl.c430
-rw-r--r--lib/vtls/openssl.h6
-rw-r--r--lib/vtls/polarssl.c100
-rw-r--r--lib/vtls/polarssl.h3
-rw-r--r--lib/vtls/schannel.c96
-rw-r--r--lib/vtls/schannel.h4
-rw-r--r--lib/vtls/vtls.c63
-rw-r--r--lib/warnless.c5
-rw-r--r--lib/wildcard.c18
-rw-r--r--lib/wildcard.h9
-rw-r--r--lib/x509asn1.c1
-rw-r--r--m4/ax_code_coverage.m4264
-rw-r--r--m4/curl-compilers.m458
-rw-r--r--m4/curl-confopts.m48
-rw-r--r--m4/curl-override.m42
-rw-r--r--m4/xc-lt-iface.m410
-rw-r--r--m4/zz50-xc-ovr.m42
-rwxr-xr-xmaketgz37
-rw-r--r--packages/AIX/Makefile.in23
-rw-r--r--packages/AIX/RPM/Makefile.in23
-rw-r--r--packages/AIX/RPM/curl.spec.in2
-rw-r--r--packages/Android/Android.mk3
-rw-r--r--packages/EPM/Makefile.in19
-rw-r--r--packages/EPM/curl.list.in2
-rw-r--r--packages/Linux/Makefile.in23
-rw-r--r--packages/Linux/RPM/Makefile.in23
-rw-r--r--packages/Makefile.in23
-rw-r--r--packages/OS400/README.OS4005
-rw-r--r--packages/OS400/ccsidcurl.c5
-rw-r--r--packages/OS400/curl.inc.in18
-rw-r--r--packages/OS400/make-include.sh9
-rw-r--r--packages/OS400/os400sys.c4
-rw-r--r--packages/Solaris/Makefile.in23
-rw-r--r--packages/Symbian/readme.txt2
-rw-r--r--packages/Win32/Makefile.in23
-rw-r--r--packages/Win32/README2
-rw-r--r--packages/Win32/cygwin/Makefile.in23
-rw-r--r--packages/Win32/cygwin/README2
-rw-r--r--packages/vms/Makefile.in23
-rw-r--r--packages/vms/clean_gnv_curl.com8
-rw-r--r--packages/vms/curl_gnv_build_steps.txt2
-rw-r--r--packages/vms/generate_vax_transfer.com2
-rw-r--r--packages/vms/gnv_link_curl.com2
-rw-r--r--packages/vms/pcsi_gnv_curl_file_list.txt3
-rw-r--r--packages/vms/readme2
-rw-r--r--packages/vms/stage_curl_install.com8
-rw-r--r--projects/Windows/VC10/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC11/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC12/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC14/src/curl.vcxproj2
-rw-r--r--projects/Windows/VC6/src/curl.dsp8
-rw-r--r--projects/Windows/VC7.1/src/curl.vcproj6
-rw-r--r--projects/Windows/VC7/src/curl.vcproj6
-rw-r--r--projects/Windows/VC8/src/curl.vcproj8
-rw-r--r--projects/Windows/VC9/src/curl.vcproj8
-rw-r--r--projects/checksrc.bat2
-rw-r--r--projects/generate.bat439
-rw-r--r--projects/wolfssl_options.h224
-rw-r--r--projects/wolfssl_override.props40
-rw-r--r--scripts/Makefile.in23
-rwxr-xr-xscripts/coverage.sh16
-rwxr-xr-xscripts/updatemanpages.pl355
-rw-r--r--src/CMakeLists.txt14
-rw-r--r--src/Makefile.am30
-rw-r--r--src/Makefile.in316
-rw-r--r--src/Makefile.inc2
-rw-r--r--src/Makefile.m322
-rw-r--r--src/Makefile.vc10550
-rw-r--r--src/Makefile.vc11550
-rw-r--r--src/Makefile.vc12550
-rw-r--r--src/Makefile.vc14550
-rw-r--r--src/Makefile.vc6550
-rw-r--r--src/Makefile.vc7550
-rw-r--r--src/Makefile.vc8550
-rw-r--r--src/Makefile.vc9550
-rw-r--r--src/curl.rc4
-rw-r--r--src/macos/MACINSTALL.TXT2
-rw-r--r--src/makefile.dj2
-rw-r--r--src/mkhelp.pl72
-rw-r--r--src/tool_cb_dbg.c10
-rw-r--r--src/tool_cb_dbg.h2
-rw-r--r--src/tool_cb_hdr.c11
-rw-r--r--src/tool_cb_hdr.h2
-rw-r--r--src/tool_cb_prg.c2
-rw-r--r--src/tool_cb_wrt.c38
-rw-r--r--src/tool_cb_wrt.h2
-rw-r--r--src/tool_cfgable.c4
-rw-r--r--src/tool_cfgable.h18
-rw-r--r--src/tool_dirhie.c2
-rw-r--r--src/tool_doswin.c10
-rw-r--r--src/tool_formparse.c5
-rw-r--r--src/tool_getparam.c601
-rw-r--r--src/tool_getparam.h6
-rw-r--r--src/tool_getpass.c14
-rw-r--r--src/tool_help.c692
-rw-r--r--src/tool_helpers.c6
-rw-r--r--src/tool_homedir.c4
-rw-r--r--src/tool_hugehelp.c11629
-rw-r--r--src/tool_main.c2
-rw-r--r--src/tool_metalink.c4
-rw-r--r--src/tool_msgs.c2
-rw-r--r--src/tool_operate.c179
-rw-r--r--src/tool_paramhlp.c72
-rw-r--r--src/tool_paramhlp.h7
-rw-r--r--src/tool_parsecfg.c8
-rw-r--r--src/tool_setopt.c1
-rw-r--r--src/tool_setopt.h2
-rw-r--r--src/tool_sleep.c10
-rw-r--r--src/tool_urlglob.c48
-rw-r--r--src/tool_util.c37
-rw-r--r--src/tool_util.h25
-rw-r--r--src/tool_version.h2
-rw-r--r--src/tool_writeenv.c113
-rw-r--r--src/tool_writeout.c6
-rw-r--r--src/tool_xattr.c2
-rw-r--r--tests/FILEFORMAT13
-rw-r--r--tests/Makefile.am37
-rw-r--r--tests/Makefile.in61
-rw-r--r--tests/README35
-rw-r--r--tests/certs/Makefile.in19
-rw-r--r--tests/certs/Server-localhost-sv.pem2
-rw-r--r--tests/certs/Server-localhost-sv.prm2
-rw-r--r--tests/certs/Server-localhost.nn-sv.pem2
-rw-r--r--tests/certs/Server-localhost.nn-sv.prm2
-rw-r--r--tests/certs/scripts/Makefile.in19
-rwxr-xr-xtests/certs/scripts/genserv.sh2
-rwxr-xr-xtests/curl_test_data.py56
-rw-r--r--tests/data/DISABLED4
-rw-r--r--tests/data/Makefile.in62
-rw-r--r--tests/data/Makefile.inc39
-rw-r--r--tests/data/test12
-rw-r--r--tests/data/test10072
-rw-r--r--tests/data/test10083
-rw-r--r--tests/data/test10104
-rw-r--r--tests/data/test10216
-rw-r--r--tests/data/test103412
-rw-r--r--tests/data/test103512
-rw-r--r--tests/data/test10492
-rw-r--r--tests/data/test10632
-rw-r--r--tests/data/test10681
-rw-r--r--tests/data/test10932
-rw-r--r--tests/data/test10942
-rw-r--r--tests/data/test10992
-rw-r--r--tests/data/test11002
-rw-r--r--tests/data/test11042
-rw-r--r--tests/data/test11052
-rw-r--r--tests/data/test11092
-rw-r--r--tests/data/test11102
-rw-r--r--tests/data/test11112
-rw-r--r--tests/data/test11393
-rw-r--r--tests/data/test114540
-rw-r--r--tests/data/test114645
-rw-r--r--tests/data/test114764
-rw-r--r--tests/data/test114857
-rw-r--r--tests/data/test12052
-rw-r--r--tests/data/test12152
-rw-r--r--tests/data/test12312
-rw-r--r--tests/data/test12322
-rw-r--r--tests/data/test12382
-rw-r--r--tests/data/test12422
-rw-r--r--tests/data/test12432
-rw-r--r--tests/data/test12452
-rw-r--r--tests/data/test124849
-rw-r--r--tests/data/test124952
-rw-r--r--tests/data/test125053
-rw-r--r--tests/data/test125154
-rw-r--r--tests/data/test125252
-rw-r--r--tests/data/test125353
-rw-r--r--tests/data/test125453
-rw-r--r--tests/data/test125553
-rw-r--r--tests/data/test125654
-rw-r--r--tests/data/test125754
-rw-r--r--tests/data/test125854
-rw-r--r--tests/data/test125947
-rw-r--r--tests/data/test126036
-rw-r--r--tests/data/test126161
-rw-r--r--tests/data/test126240
-rw-r--r--tests/data/test128245
-rw-r--r--tests/data/test128357
-rw-r--r--tests/data/test128489
-rw-r--r--tests/data/test128597
-rw-r--r--tests/data/test1286110
-rw-r--r--tests/data/test128791
-rw-r--r--tests/data/test128896
-rw-r--r--tests/data/test128935
-rw-r--r--tests/data/test129856
-rw-r--r--tests/data/test129955
-rw-r--r--tests/data/test1301
-rw-r--r--tests/data/test1309111
-rw-r--r--tests/data/test132332
-rw-r--r--tests/data/test13331
-rw-r--r--tests/data/test139926
-rw-r--r--tests/data/test14004
-rw-r--r--tests/data/test14016
-rw-r--r--tests/data/test14026
-rw-r--r--tests/data/test14036
-rw-r--r--tests/data/test14044
-rw-r--r--tests/data/test14054
-rw-r--r--tests/data/test140613
-rw-r--r--tests/data/test140715
-rw-r--r--tests/data/test142015
-rw-r--r--tests/data/test1425bin0 -> 1726 bytes
-rw-r--r--tests/data/test1426bin0 -> 1663 bytes
-rw-r--r--tests/data/test142729
-rw-r--r--tests/data/test14294
-rw-r--r--tests/data/test14302
-rw-r--r--tests/data/test14312
-rw-r--r--tests/data/test14322
-rw-r--r--tests/data/test143320
-rw-r--r--tests/data/test144035
-rw-r--r--tests/data/test144135
-rw-r--r--tests/data/test144235
-rw-r--r--tests/data/test144368
-rw-r--r--tests/data/test144452
-rw-r--r--tests/data/test144535
-rw-r--r--tests/data/test144642
-rw-r--r--tests/data/test145034
-rw-r--r--tests/data/test145136
-rwxr-xr-xtests/data/test145241
-rw-r--r--tests/data/test1502
-rw-r--r--tests/data/test152130
-rw-r--r--tests/data/test15342
-rw-r--r--tests/data/test153745
-rw-r--r--tests/data/test1538149
-rw-r--r--tests/data/test154064
-rw-r--r--tests/data/test1552
-rw-r--r--tests/data/test155029
-rw-r--r--tests/data/test155172
-rw-r--r--tests/data/test160626
-rw-r--r--tests/data/test1657
-rw-r--r--tests/data/test1692
-rw-r--r--tests/data/test18002
-rw-r--r--tests/data/test18012
-rw-r--r--tests/data/test19004
-rw-r--r--tests/data/test19014
-rw-r--r--tests/data/test19024
-rw-r--r--tests/data/test19034
-rw-r--r--tests/data/test1992
-rw-r--r--tests/data/test20312
-rw-r--r--tests/data/test203234
-rw-r--r--tests/data/test203333
-rw-r--r--tests/data/test20466
-rw-r--r--tests/data/test20476
-rwxr-xr-xtests/data/test205580
-rw-r--r--tests/data/test2073
-rw-r--r--tests/data/test2092
-rw-r--r--tests/data/test2132
-rw-r--r--tests/data/test2164
-rw-r--r--tests/data/test2181
-rw-r--r--tests/data/test2392
-rw-r--r--tests/data/test2432
-rw-r--r--tests/data/test2566
-rw-r--r--tests/data/test2652
-rw-r--r--tests/data/test2672
-rw-r--r--tests/data/test2712
-rw-r--r--tests/data/test2832
-rw-r--r--tests/data/test2842
-rw-r--r--tests/data/test2852
-rw-r--r--tests/data/test2862
-rw-r--r--tests/data/test312
-rw-r--r--tests/data/test386
-rw-r--r--tests/data/test472
-rw-r--r--tests/data/test5002
-rw-r--r--tests/data/test5012
-rw-r--r--tests/data/test5065
-rw-r--r--tests/data/test5101
-rw-r--r--tests/data/test54013
-rw-r--r--tests/data/test5472
-rw-r--r--tests/data/test5482
-rw-r--r--tests/data/test552bin142985 -> 142985 bytes
-rw-r--r--tests/data/test5542
-rw-r--r--tests/data/test5554
-rw-r--r--tests/data/test55950
-rw-r--r--tests/data/test5632
-rw-r--r--tests/data/test5651
-rw-r--r--tests/data/test5694
-rw-r--r--tests/data/test5714
-rw-r--r--tests/data/test5782
-rw-r--r--tests/data/test592
-rw-r--r--tests/data/test5902
-rw-r--r--tests/data/test5991
-rw-r--r--tests/data/test601
-rw-r--r--tests/data/test672
-rw-r--r--tests/data/test682
-rw-r--r--tests/data/test692
-rw-r--r--tests/data/test7002
-rw-r--r--tests/data/test7012
-rw-r--r--tests/data/test7082
-rw-r--r--tests/data/test7121
-rwxr-xr-xtests/data/test71349
-rwxr-xr-xtests/data/test71467
-rwxr-xr-xtests/data/test71569
-rw-r--r--tests/data/test812
-rw-r--r--tests/data/test8224
-rw-r--r--tests/data/test8234
-rw-r--r--tests/data/test8274
-rw-r--r--tests/data/test8422
-rw-r--r--tests/data/test8432
-rw-r--r--tests/data/test8442
-rw-r--r--tests/data/test8452
-rw-r--r--tests/data/test8684
-rw-r--r--tests/data/test8694
-rw-r--r--tests/data/test874
-rw-r--r--tests/data/test8734
-rw-r--r--tests/data/test8872
-rw-r--r--tests/data/test8882
-rw-r--r--tests/data/test8892
-rw-r--r--tests/data/test894
-rw-r--r--tests/data/test8902
-rw-r--r--tests/data/test904
-rw-r--r--tests/data/test9064
-rw-r--r--tests/data/test9074
-rw-r--r--tests/data/test912
-rw-r--r--tests/data/test9214
-rw-r--r--tests/data/test9462
-rw-r--r--tests/data/test9472
-rw-r--r--tests/data/test9482
-rw-r--r--tests/data/test9492
-rwxr-xr-xtests/extern-scan.pl4
-rw-r--r--tests/fuzz/CMakeLists.txt1
-rw-r--r--tests/fuzz/Makefile.am57
-rw-r--r--tests/fuzz/Makefile.in880
-rw-r--r--tests/fuzz/Makefile.inc19
-rw-r--r--tests/fuzz/README14
-rw-r--r--tests/fuzz/curl_fuzzer.c128
-rwxr-xr-xtests/http2-server.pl10
-rwxr-xr-xtests/httpserver.pl2
-rw-r--r--tests/libtest/CMakeLists.txt13
-rw-r--r--tests/libtest/Makefile.am23
-rw-r--r--tests/libtest/Makefile.in1154
-rw-r--r--tests/libtest/Makefile.inc32
-rw-r--r--tests/libtest/first.c2
-rw-r--r--tests/libtest/lib1501.c25
-rw-r--r--tests/libtest/lib1507.c21
-rw-r--r--tests/libtest/lib1509.c2
-rw-r--r--tests/libtest/lib1515.c7
-rw-r--r--tests/libtest/lib1521.c2512
-rw-r--r--tests/libtest/lib1525.c2
-rw-r--r--tests/libtest/lib1526.c2
-rw-r--r--tests/libtest/lib1527.c2
-rw-r--r--tests/libtest/lib1531.c11
-rw-r--r--tests/libtest/lib1537.c94
-rw-r--r--tests/libtest/lib1538.c51
-rw-r--r--tests/libtest/lib1540.c121
-rw-r--r--tests/libtest/lib1550.c (renamed from src/tool_writeenv.h)26
-rw-r--r--tests/libtest/lib1551.c45
-rw-r--r--tests/libtest/lib1900.c30
-rw-r--r--tests/libtest/lib505.c7
-rw-r--r--tests/libtest/lib506.c16
-rw-r--r--tests/libtest/lib509.c14
-rw-r--r--tests/libtest/lib510.c4
-rw-r--r--tests/libtest/lib518.c16
-rw-r--r--tests/libtest/lib525.c7
-rw-r--r--tests/libtest/lib526.c4
-rw-r--r--tests/libtest/lib537.c20
-rw-r--r--tests/libtest/lib540.c2
-rw-r--r--tests/libtest/lib541.c7
-rw-r--r--tests/libtest/lib552.c3
-rw-r--r--tests/libtest/lib555.c2
-rw-r--r--tests/libtest/lib557.c22
-rw-r--r--tests/libtest/lib559.c56
-rw-r--r--tests/libtest/lib571.c2
-rw-r--r--tests/libtest/lib574.c6
-rw-r--r--tests/libtest/lib578.c2
-rw-r--r--tests/libtest/lib582.c13
-rw-r--r--tests/libtest/lib583.c8
-rw-r--r--tests/libtest/lib586.c4
-rw-r--r--tests/libtest/lib591.c4
-rw-r--r--tests/libtest/libauthretry.c5
-rw-r--r--tests/libtest/libntlmconnect.c66
-rw-r--r--tests/libtest/mk-lib1521.pl303
-rw-r--r--tests/libtest/test.h2
-rwxr-xr-xtests/libtest/test613.pl4
-rw-r--r--tests/libtest/testtrace.c1
-rw-r--r--tests/libtest/testutil.c15
-rw-r--r--tests/libtest/testutil.h2
-rw-r--r--tests/manpage-scan.pl10
-rw-r--r--tests/python_dependencies/impacket/__init__.py25
-rw-r--r--tests/python_dependencies/impacket/nmb.py980
-rw-r--r--tests/python_dependencies/impacket/nt_errors.py3586
-rw-r--r--tests/python_dependencies/impacket/ntlm.py971
-rw-r--r--tests/python_dependencies/impacket/smb.py4099
-rw-r--r--tests/python_dependencies/impacket/smb3.py1629
-rw-r--r--tests/python_dependencies/impacket/smb3structs.py1363
-rw-r--r--tests/python_dependencies/impacket/smbserver.py4168
-rw-r--r--tests/python_dependencies/impacket/spnego.py372
-rw-r--r--tests/python_dependencies/impacket/structure.py743
-rw-r--r--tests/python_dependencies/impacket/uuid.py68
-rw-r--r--tests/python_dependencies/impacket/version.py12
-rwxr-xr-xtests/rtspserver.pl4
-rw-r--r--tests/runtests.17
-rw-r--r--tests/runtests.html98
-rw-r--r--tests/runtests.pdfbin7639 -> 0 bytes
-rwxr-xr-xtests/runtests.pl519
-rwxr-xr-xtests/secureserver.pl8
-rw-r--r--tests/server/CMakeLists.txt6
-rw-r--r--tests/server/Makefile.am17
-rw-r--r--tests/server/Makefile.in43
-rw-r--r--tests/server/fake_ntlm.c30
-rw-r--r--tests/server/getpart.c4
-rw-r--r--tests/server/resolve.c54
-rw-r--r--tests/server/rtspd.c4
-rw-r--r--tests/server/sockfilt.c7
-rw-r--r--tests/server/sws.c46
-rw-r--r--tests/server/testpart.c3
-rw-r--r--tests/server/tftpd.c10
-rw-r--r--tests/server/util.c22
-rw-r--r--tests/serverhelp.pm2
-rwxr-xr-xtests/smbserver.py377
-rwxr-xr-xtests/sshserver.pl2
-rw-r--r--tests/testcurl.13
-rw-r--r--tests/testcurl.html122
-rw-r--r--tests/testcurl.pdfbin7238 -> 0 bytes
-rwxr-xr-xtests/testcurl.pl17
-rwxr-xr-xtests/tftpserver.pl4
-rw-r--r--tests/unit/CMakeLists.txt2
-rw-r--r--tests/unit/Makefile.am15
-rw-r--r--tests/unit/Makefile.in249
-rw-r--r--tests/unit/Makefile.inc15
-rw-r--r--tests/unit/curlcheck.h7
-rw-r--r--tests/unit/unit1300.c214
-rw-r--r--tests/unit/unit1303.c8
-rw-r--r--tests/unit/unit1305.c7
-rw-r--r--tests/unit/unit1309.c47
-rw-r--r--tests/unit/unit1323.c66
-rw-r--r--tests/unit/unit1395.c11
-rw-r--r--tests/unit/unit1396.c2
-rw-r--r--tests/unit/unit1399.c100
-rw-r--r--tests/unit/unit1600.c4
-rw-r--r--tests/unit/unit1604.c35
-rw-r--r--tests/unit/unit1605.c3
-rw-r--r--tests/unit/unit1606.c90
-rw-r--r--tests/valgrind.pm4
-rw-r--r--tests/valgrind.supp21
-rw-r--r--winbuild/BUILD.WINDOWS.txt13
-rw-r--r--winbuild/Makefile.msvc.names81
-rw-r--r--winbuild/Makefile.vc27
-rw-r--r--winbuild/MakefileBuild.vc40
1107 files changed, 57681 insertions, 32345 deletions
diff --git a/CHANGES b/CHANGES
index a925724b..fe245766 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,5822 +6,6359 @@
Changelog
-Version 7.52.1 (22 Dec 2016)
+Version 7.55.0 (9 Aug 2017)
-Daniel Stenberg (22 Dec 2016)
-- RELEASE-NOTES: curl 7.52.1
+Daniel Stenberg (9 Aug 2017)
+- RELEASE-NOTES: curl 7.55.0
-- lib557.c: use a shorter MAXIMIZE representation
-
- Since several compilers had problems with the previous one
-
- Reported-by: Ray Satiro
- Bug: https://curl.haxx.se/mail/lib-2016-12/0098.html
+- THANKS: 20 new contributors in 7.55.0
-- runtests: remove the valgrind parser
-
- Old legacy parsing that 1) hid problems for us and 2) probably isn't
- needed anymore.
-
-- [Kamil Dudka brought this change]
-
- randit: store the value in the buffer
+- [Viktor Szakats brought this change]
-- tests/Makefile: run checksrc on debug builds
+ docs/comments: Update to secure URL versions
- ... just like we already do in src/ and lib/
+ Closes #1741
-- lib557: move the "enable LONGLINE" to allow more long lines
+- configure: fix recv/send/select detection on Android
- This file is riddled with them...
-
-- bump: toward next release
-
-Marcel Raad (21 Dec 2016)
-- lib: fix MSVC compiler warnings
+ ... since they now provide several functions as
+ __attribute__((overloadable)), the argument detection logic need
+ updates.
- Visual C++ complained:
- warning C4267: '=': conversion from 'size_t' to 'long', possible loss of data
- warning C4701: potentially uninitialized local variable 'path' used
-
-Version 7.52.0 (20 Dec 2016)
+ Patched-by: destman at github
+
+ Fixes #1738
+ Closes #1739
-Daniel Stenberg (20 Dec 2016)
-- THANKS: 13 new contributors from 7.52.0
+Marcel Raad (8 Aug 2017)
+- ax_code_coverage.m4: update to latest version
+
+ This updates the script to aad5ad5fedb306b39f901a899b7bd305b66c418d
+ from August 01, 2017. Notably, this removes the lconv version whitelist.
+
+ Closes https://github.com/curl/curl/pull/1716
-- RELEASE-NOTES: 7.52.0
+Daniel Stenberg (7 Aug 2017)
+- test1427: verify command line parser integer overflow detection
-- ssh: inhibit coverity warning with (void)
+- curl: detect and bail out early on parameter integer overflows
- CID 1397391 (#1 of 1): Unchecked return value (CHECKED_RETURN)
-
-- Curl_recv_has_postponed_data: silence compiler warnings
+ Make the number parser aware of the maximum limit curl accepts for a
+ value and return an error immediately if larger, instead of running an
+ integer overflow later.
- Follow-up to d00f2a8f2
+ Fixes #1730
+ Closes #1736
-Jay Satiro (19 Dec 2016)
-- tests: checksrc compliance
-
-- http_proxy: Fix proxy CONNECT hang on pending data
+- glob: do not continue parsing after a strtoul() overflow range
- - Check for pending data before waiting on the socket.
+ Added test 1289 to verify.
- Bug: https://github.com/curl/curl/issues/1156
- Reported-by: Adam Langley
+ CVE-2017-1000101
+
+ Bug: https://curl.haxx.se/docs/adv_20170809A.html
+ Reported-by: Brian Carpenter
-Daniel Stenberg (19 Dec 2016)
-- cmdline-opts/tlsv1.d: rephrased
+- tftp: reject file name lengths that don't fit
+
+ ... and thereby avoid telling send() to send off more bytes than the
+ size of the buffer!
+
+ CVE-2017-1000100
+
+ Bug: https://curl.haxx.se/docs/adv_20170809B.html
+ Reported-by: Even Rouault
+
+ Credit to OSS-Fuzz for the discovery
-- [Dan McNulty brought this change]
+- [Even Rouault brought this change]
- schannel: fix wildcard cert name validation on Win CE
+ file: output the correct buffer to the user
- Fixes a few issues in manual wildcard cert name validation in
- schannel support code for Win32 CE:
- - when comparing the wildcard name to the hostname, the wildcard
- character was removed from the cert name and the hostname
- was checked to see if it ended with the modified cert name.
- This allowed cert names like *.com to match the connection
- hostname. This violates recommendations from RFC 6125.
- - when the wildcard name in the certificate is longer than the
- connection hostname, a buffer overread of the connection
- hostname buffer would occur during the comparison of the
- certificate name and the connection hostname.
+ Regression brought by 7c312f84ea930d8 (April 2017)
+
+ CVE-2017-1000099
+
+ Bug: https://curl.haxx.se/docs/adv_20170809C.html
+
+ Credit to OSS-Fuzz for the discovery
-- printf: fix floating point buffer overflow issues
+- easy_events: make event data static
- ... and add a bunch of floating point printf tests
+ First: this function is only used in debug-builds and not in
+ release/real builds. It is used to drive tests using the event-based
+ API.
+
+ A pointer to the local struct is passed to CURLMOPT_TIMERDATA, but the
+ CURLMOPT_TIMERFUNCTION calback can in fact be called even after this
+ funtion returns, namely when curl_multi_remove_handle() is called.
+
+ Reported-by: Brian Carpenter
-- config-amigaos.h: (embarrassed) made the line shorter
+- getparameter: avoid returning uninitialized 'usedarg'
+
+ Fixes #1728
-- config-amigaos.h: fix bug report email reference
+Marcel Raad (5 Aug 2017)
+- [Isaac Boukris brought this change]
-- RELEASE-NOTES: synced with 4517158abfeba
+ gssapi: fix memory leak of output token in multi round context
+
+ When multiple rounds are needed to establish a security context
+ (usually ntlm), we overwrite old token with a new one without free.
+ Found by proposed gss tests using stub a gss implementation (by
+ valgrind error), though I have confirmed the leak with a real
+ gssapi implementation as well.
+
+ Closes https://github.com/curl/curl/pull/1733
-- CIPHERS.md: backtick the names to show underscores fine
+- darwinssl: fix compiler warning
+
+ clang complains:
+ vtls/darwinssl.c:40:8: error: extra tokens at end of #endif directive
+ [-Werror,-Wextra-tokens]
+
+ This breaks the darwinssl build on Travis. Fix it by making this token
+ a comment.
+
+ Closes https://github.com/curl/curl/pull/1734
-- form-string.d: fix format mistake
+- CMake: fix CURL_WERROR for MSVC
- and regenerated curl.1
+ When using CURL_WERROR in MSVC builds, the debug flags were overridden
+ by the release flags and /WX got added twice in debug mode.
- Reported-by: Gisle Vanem
+ Closes https://github.com/curl/curl/pull/1715
-Michael Kaufmann (18 Dec 2016)
-- openssl: simplify expression in Curl_ossl_version
+Daniel Stenberg (4 Aug 2017)
+- RELEASE-NOTES: synced with 561e9217c
-- curl_easy_recv: Improve documentation and example program
+- test1010: verify that #1718 is fixed
- Follow-up to 82245ea: Fix the example program sendrecv.c (handle
- CURLE_AGAIN, handle incomplete send). Improve the documentation
- for curl_easy_recv() and curl_easy_send().
+ ... by doing two transfers in nocwd mode and check that there's no
+ superfluous CWD command.
+
+- FTP: skip unnecessary CWD when in nocwd mode
- Reviewed-by: Frank Meier
- Assisted-by: Jay Satiro
+ ... when reusing a connection. If it didn't do any CWD previously.
- See https://github.com/curl/curl/pull/1134
-
-- [Isaac Boukris brought this change]
+ Fixes #1718
- Curl_getconnectinfo: avoid checking if the connection is closed
+Marcel Raad (4 Aug 2017)
+- travis: explicitly specify dist
- It doesn't benefit us much as the connection could get closed at
- any time, and also by checking we lose the ability to determine
- if the socket was closed by reading zero bytes.
+ This makes the builds more reproducible as travis is currently rolling
+ out trusty as default dist [1]. Specifically, this avoids coverage
+ check failures when trusty is used as seen in [2] until we figure out
+ what's wrong.
- Reported-by: Michael Kaufmann
+ [1] https://blog.travis-ci.com/2017-07-11-trusty-as-default-linux-is-coming
+ [2] https://github.com/curl/curl/pull/1692
- Closes https://github.com/curl/curl/pull/1134
+ Closes https://github.com/curl/curl/pull/1725
-Daniel Stenberg (18 Dec 2016)
-- CIPHERS.md: attempt to document TLS cipher names
+Daniel Stenberg (4 Aug 2017)
+- travis: BUILD_TYPE => T
- As the official docs seems really hard to keep track of and link to over
- time
+ (to make the full line appear nicer on travis web UI)
-- curl.1: generated after 6cce4dbf830
-
-- cmdline-opts/post30X.d: fix the RFC references
+- travis: add osx build with darwinssl
+
+ Closes #1706
-- curl.1: regenerated
+- darwin: silence compiler warnings
- Fixed trailing whitespace and numerous formatting glitches
+ With a clang pragma and three type fixes
+
+ Fixes #1722
-- cmdline-opts: formatting fixes
+- BUILD.WINDOWS: mention buildconf.bat for builds off git
-- curl_easy_setopt.3: removed CURLOPT_SOCKS_PROXYTYPE
+- darwinssl: fix curlssl_sha256sum() compiler warnings on first argument
-- tool_getparam.c: make comments use the up-to-date option names
+- test130: verify comments in .netrc
-- manpage-scan.pl: allow deprecated options to get removed from curl.1
+- [Gisle Vanem brought this change]
+
+ netrc: skip lines starting with '#'
- --krb4, --ftp-ssl and --ftp-ssl-reqd no longer need to be documented in the
- man page
+ Bug: https://curl.haxx.se/mail/lib-2017-08/0008.html
-- cmdline-opts/gen.pl: trim off trailing spaces
+Marcel Raad (3 Aug 2017)
+- CMake: set MSVC warning level to 4
+
+ The MSVC warning level defaults to 3 in CMake. Change it to 4, which is
+ consistent with the Visual Studio and NMake builds. Disable level 4
+ warning C4127 for the library and additionally C4306 for the test
+ servers to get a clean CURL_WERROR build as that warning is raised in
+ some macros in older Visual Studio versions.
+
+ Ref: https://github.com/curl/curl/pull/1667#issuecomment-314082794
+ Closes https://github.com/curl/curl/pull/1711
-- cmdline-opts/proxy-tlsuser.d: remove trailing .d
+Daniel Stenberg (2 Aug 2017)
+- CURLOPT_NETRC.3: fix typo in 7e48aa386156f9c2
+
+ Reported-by: Viktor Szakats
-- curl_easy_setopt.3: CURLOPT_PRE_PROXY instead of CURLOPT_SOCKS_PROXY
+- CURLOPT_NETRC.3: mention the file name on windows
+
+ ... and CURLOPT_NETRC_FILE(3).
-- symbols: removed two, added one
+- travis: build osx with libressl too
-- cmdline-opts: include the man page split up files in the dist
+- travis: build osx with openssl too
-- curl.1: generated with gen.pl
+- tests/server/util: fix curltime mistake from 4dee50b9c80f9
+
+Marcel Raad (1 Aug 2017)
+- curl_threads: fix MSVC compiler warning
- This is the first time we replace the manually edited curt.1 with the
- generated one created by gen.pl and the individual option documentation
- pages.
+ Use LongToHandle to convert from long to HANDLE in the Win32
+ implementation.
+ This should fix the following warning when compiling with
+ MSVC 11 (2012) in 64-bit mode:
+ lib\curl_threads.c(113): warning C4306:
+ 'type cast' : conversion from 'long' to 'HANDLE' of greater size
- Do not edit this file, edit the individual pages and regenerate this
- output.
+ Closes https://github.com/curl/curl/pull/1717
+
+Daniel Stenberg (1 Aug 2017)
+- BUGS: improved phrasing about security bugs
- This file will be generated by the build system soon and then removed
- from git.
+ Reported-by: Max Dymond
-- cmdline-opts: added some missing info
+- BUGS: clarify how to report security related bugs
-- CURLINFO_SSL_VERIFYRESULT.3: language
+- [Brad Spencer brought this change]
-- HTTPS-PROXY docs: update/polish
-
-- cmdline-opts/page-header: mention it is generated
+ multi: fix request timer management
- ... to avoid people from trying to edit the pending curl.1 version that
- gets generated by gen.pl
+ There are some bugs in how timers are managed for a single easy handle
+ that causes the wrong "next timeout" value to be reported to the
+ application when a new minimum needs to be recomputed and that new
+ minimum should be an existing timer that isn't currently set for the
+ easy handle. When the application drives a set of easy handles via the
+ `curl_multi_socket_action()` API (for example), it gets told to wait the
+ wrong amount of time before the next call, which causes requests to
+ linger for a long time (or, it is my guess, possibly forever).
+
+ Bug: https://curl.haxx.se/mail/lib-2017-07/0033.html
-- preproxy: renamed what was added as SOCKS_PROXY
+Jay Satiro (1 Aug 2017)
+- curl_setup: Define CURL_NO_OLDIES for building libcurl
- CURLOPT_SOCKS_PROXY -> CURLOPT_PRE_PROXY
+ .. to catch accidental use of deprecated error codes.
- Added the corresponding --preroxy command line option. Sets a SOCKS
- proxy to connect to _before_ connecting to a HTTP(S) proxy.
+ Ref: https://github.com/curl/curl/issues/1688#issuecomment-316764237
-- curl: normal socks proxies still use CURLOPT_PROXY
-
- ... the newly introduced CURLOPT_SOCKS_PROXY is special and should be
- asked for specially. (Needs new code.)
+Daniel Stenberg (1 Aug 2017)
+- [Jeremy Tan brought this change]
+
+ configure: fix the check for IdnToUnicode
- Unified proxy type to a single variable in the config struct.
+ Fixes #1669
+ Closes #1713
-- CURLOPT_SOCKS_PROXYTYPE: removed
+- http: fix response code parser to avoid integer overflow
- This was added as part of the SOCKS+HTTPS proxy merge but there's no
- need to support this as we prefer to have the protocol specified as a
- prefix instead.
+ test 1429 and 1433 were updated to work with the stricter HTTP status line
+ parser.
+
+ Closes #1714
+ Reported-by: Brian Carpenter
-- curl_multi_socket.3: fix typo
+Jay Satiro (31 Jul 2017)
+- [Dwarakanath Yadavalli brought this change]
-- checksrc: warn for assignments within if() expressions
+ libcurl: Stop using error codes defined under CURL_NO_OLDIES
- ... they're already frowned upon in our source code style guide, this
- now enforces the rule harder.
+ Fixes https://github.com/curl/curl/issues/1688
+ Closes https://github.com/curl/curl/pull/1712
-- checksrc: stricter no-space-before-paren enforcement
+- include.d: clarify --include is only for response headers
- In order to make the code style more uniform everywhere
+ Follow-up to 171f8de and de6de94.
+
+ Bug: https://github.com/curl/curl/commit/de6de94#commitcomment-23370851
+ Reported-by: Daniel Stenberg
-- ISSUE_TEMPLATE: try mentioning known bugs/todo in new issue template
+Daniel Stenberg (30 Jul 2017)
+- [jasjuang brought this change]
-- RELEASE-NOTES: synced with 71a55534fa6
+ cmake: support make uninstall
+
+ Closes #1674
-- [Adam Langley brought this change]
+- RELEASE-NOTES: synced with 001701c47
- openssl: don't use OpenSSL's ERR_PACK.
+Marcel Raad (29 Jul 2017)
+- AppVeyor: now really use CURL_WERROR
- ERR_PACK is an internal detail of OpenSSL. Also, when using it, a
- function name must be specified which is overly specific: the test will
- break whenever OpenSSL internally change things so that a different
- function creates the error.
+ It was misspelled as CURL_ERROR in commit
+ 2d86e8d1286e0fbe3d811e2e87fa0b5e53722db4.
- Closes #1157
+ Closes https://github.com/curl/curl/pull/1686
-Dan Fandrich (5 Dec 2016)
-- test2032: Mark test as flaky
+Jay Satiro (29 Jul 2017)
+- tool_help: clarify --include is only for response headers
+
+ Follow-up to 171f8de.
+
+ Ref: https://github.com/curl/curl/issues/1704
-Jay Satiro (3 Dec 2016)
-- [Jeremy Pearson brought this change]
+- splay: fix signed/unsigned mismatch warning
+
+ Follow-up to 4dee50b.
+
+ Ref: https://github.com/curl/curl/pull/1693
- libcurl-multi.3: typo
+Daniel Stenberg (28 Jul 2017)
+- include.d: clarify that it concerns the response headers
- Closes https://github.com/curl/curl/pull/1153
+ Reported-by: olesteban at github
+ Fixes #1704
-Dan Fandrich (2 Dec 2016)
-- test1281: added http as a required feature
+- [Johannes Schindelin brought this change]
-Daniel Stenberg (2 Dec 2016)
-- curl: support zero-length argument strings in config files
+ curl_rtmp: fix a compiler warning
- ... like 'user-agent = ""'
+ The headers of librtmp declare the socket as `int`, and on Windows, that
+ disagrees with curl_socket_t.
- Adjusted test 71 to verify.
-
-- http_proxy: simplify CONNECT response reading
+ Bug: #1652
- Since it now reads responses one byte a time, a loop could be removed
- and it is no longer limited to get the whole response within 16K, it is
- now instead only limited to 16K maximum header line lengths.
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-- tests: fix CONNECT test cases to be more strict
-
- ... as they broke with the cleaned up CONNECT handling
+- test1323: verify curlx_tvdiff
-- CONNECT: read responses one byte at a time
+- timeval: struct curltime is a struct timeval replacement
- ... so that it doesn't read data that is actually coming from the
- remote. 2xx responses have no body from the proxy, that data is from the
- peer.
+ ... to make all libcurl internals able to use the same data types for
+ the struct members. The timeval struct differs subtly on several
+ platforms so it makes it cumbersome to use everywhere.
- Fixes #1132
+ Ref: #1652
+ Closes #1693
-- CONNECT: reject TE or CL in 2xx responses
+- darwinssl: fix variable type mistake (regression)
- A server MUST NOT send any Transfer-Encoding or Content-Length header
- fields in a 2xx (Successful) response to CONNECT. (RFC 7231 section
- 4.3.6)
+ ... which made --tlsv1.2 not work because it would blank the max tls
+ version variable.
- Also fixes the three test cases that did this.
+ Reported-by: Nick Miyake
+ Bug: #1703
-- URL parser: reject non-numerical port numbers
+- multi: mention integer overflow risk if using > 500 million sockets
- Test 1281 added to verify
-
-Dan Fandrich (30 Nov 2016)
-- runtests: made Servers: output be more consistent by removing OFF
-
-- cyassl: fixed typo introduced in 4f8b1774
+ Reported-by: ovidiu-benea@users.noreply.github.com
+
+ Closes #1675
+ Closes #1683
-Michael Kaufmann (30 Nov 2016)
-- CURLOPT_CONNECT_TO: Skip non-matching "connect-to" entries properly
+- checksrc: escape open brace in regex
- If a port number in a "connect-to" entry does not match, skip this
- entry instead of connecting to port 0.
+ ... to silence warning.
+
+Kamil Dudka (20 Jul 2017)
+- nss: fix a possible use-after-free in SelectClientCert()
- If a port number in a "connect-to" entry matches, use this entry
- and look no further.
+ ... causing a SIGSEGV in showit() in case the handle used to initiate
+ the connection has already been freed.
- Reported-by: Jay Satiro
- Assisted-by: Jay Satiro, Daniel Stenberg
+ This commit fixes a bug introduced in curl-7_19_5-204-g5f0cae803.
- Closes #1148
+ Reported-by: Rob Sanders
+ Bug: https://bugzilla.redhat.com/1436158
-Daniel Stenberg (29 Nov 2016)
-- BUGS: describe bug handling process
-
-- RELEASE-NOTES: synced with 19613fb3
+- nss: unify the coding style of nss_send() and nss_recv()
+
+ No changes in behavior intended by this commit.
-Jay Satiro (28 Nov 2016)
-- http2: check nghttp2_session_set_local_window_size exists
+Marcel Raad (18 Jul 2017)
+- tests/server/resolve.c: fix deprecation warning
- The function only exists since nghttp2 1.12.0.
+ MSVC warns that gethostbyname is deprecated. Always use getaddrinfo
+ instead to fix this when IPv6 is enabled, also for IPv4 resolves. This
+ is also consistent with what libcurl does.
- Bug: https://github.com/curl/curl/commit/a4d8888#commitcomment-19985676
- Reported-by: Michael Kaufmann
-
-Daniel Stenberg (28 Nov 2016)
-- [Anders Bakken brought this change]
+ Closes https://github.com/curl/curl/pull/1682
- http2: Fix crashes when parent stream gets aborted
+Jay Satiro (17 Jul 2017)
+- darwinssl: fix pinnedpubkey build error
- Closes #1125
-
-- cmdline-docs: more options converted and fixed
+ - s/SessionHandle/Curl_easy/
- Now all options are in the new system.
-
-- gen: include footer in mainpage output
-
-Jay Satiro (28 Nov 2016)
-- lib1536: checksrc compliance
+ Bug: https://github.com/curl/curl/commit/eb16305#commitcomment-23035670
+ Reported-by: Gisle Vanem
-Daniel Stenberg (28 Nov 2016)
-- cmdline-opts: more command line options documented
+Marcel Raad (16 Jul 2017)
+- rtspd: fix GCC warning after MSVC warning fix
- Moved over to the new format
+ Older GCC warns:
+ /tests/server/rtspd.c:1194:10: warning: missing braces around
+ initializer [-Wmissing-braces]
+
+ Fix this by using memset instead of an initializer.
-- curl: remove --proxy-ssl* options
+- libtest: fix MSVC warning C4706
- There's mostly likely no need to allow setting SSLv2/3 version for HTTPS
- proxy. Those protocols are insecure by design and deprecated.
+ With warning level 4, MSVC warns about assignments within conditional
+ expressions. Change the while loop to a do-while loop to fix this. This
+ change is also consistent with CODE_STYLE.md.
-- CURLOPT_PROXY_*.3: polished some proxy option man pages
+- sockfilt: suppress conversion warning with explicit cast
+
+ MSVC warns when implicitly casting -1 to unsigned long.
-Patrick Monnerat (26 Nov 2016)
-- os400: support CURLOPT_PROXY_PINNEDPUBLICKEY
+- rtspd: fix MSVC level 4 warning
- Also define it in ILE/RPG binding.
+ warning C4701: potentially uninitialized local variable 'req' used
-Daniel Stenberg (26 Nov 2016)
-- [Okhin Vasilij brought this change]
+- winbuild: re-enable warning C4127 for curl tool
+
+ Disabled in cda19a345f6970e22fe8b7a808aeb8f086a21eac. It only needs to
+ be disabled for libcurl.
- curl_version_info: add CURL_VERSION_HTTPS_PROXY
+- winbuild: build with warning level 4
- Closes #1142
+ This is consistent with 7bc64561a2e63ca93e4b0b31d350773ba80955c2, which
+ changed the warning level from 3 to 4 for the Visual Studio project
+ files. But disable the level 4 warning C4127 "conditional expression is
+ constant", as that one is issued by older versions of the Windows SDK
+ as well as curl itself under some circumstances.
+
+ Closes https://github.com/curl/curl/pull/1667
-- [Frank Gevaerts brought this change]
+Jay Satiro (12 Jul 2017)
+- [Max Dymond brought this change]
- tests: Add some testcases for recent new features.
+ travis: install libidn2
- Add missing tests for CURLINFO_SCHEME, CURLINFO_PROTOCOL, %{scheme},
- and %{http_version}
+ Install libidn2 to increase test coverage (IDN tests)
- closes #1143
-
-- [Frank Gevaerts brought this change]
+ Closes https://github.com/curl/curl/pull/1673
- curl_easy_reset: clear info for CULRINFO_PROTOCOL and CURLINFO_SCHEME
+Marcel Raad (12 Jul 2017)
+- travis: enable warnings also in release mode
+
+ ... to get warnings also on Linux/GCC and OSX/clang.
+
+ Closes https://github.com/curl/curl/pull/1666
-- CURLOPT_PROXY_CAINFO.3: clarify proxy use
+Daniel Stenberg (12 Jul 2017)
+- [Max Dymond brought this change]
-- CURLOPT_PROXY_CRLFILE.3: clarify https proxy and availability
+ travis: install libssh2
+
+ Install libssh2 to increase test coverage (SFTP, SCP)
-- curl_easy_setopt.3: add CURLOPT_PROXY_PINNEDPUBLICKEY
+Marcel Raad (12 Jul 2017)
+- system.h: include winsock2.h before windows.h
- Follow-up to 4f8b17743d7c55a
+ ... to avoid compiler warnings if the user doesn't want
+ WIN32_LEAN_AND_MEAN.
-- docs: include all opts man pages in dist
+- build: remove WIN32_LEAN_AND_MEAN from individual build systems
- Sorted the lists too.
+ It's defined for all build systems in curl_setup.h since commit
+ beb08481d01a07a8b10938b1078a5e298b1c2912. This caused macro
+ redefinition warnings in the configure builds.
- ... and include the new ones in the PDF and HTML generation targets
+ Closes https://github.com/curl/curl/pull/1677
-- [Thomas Glanzmann brought this change]
+Jay Satiro (11 Jul 2017)
+- ISSUE_TEMPLATE: Add a comment not to file security issues on github
- HTTPS Proxy: Implement CURLOPT_PROXY_PINNEDPUBLICKEY
+Marcel Raad (11 Jul 2017)
+- curl_setup: always define WIN32_LEAN_AND_MEAN on Windows
+
+ Make sure to always define WIN32_LEAN_AND_MEAN before including any
+ Windows headers to avoid pulling in unnecessary headers. This avoids
+ unnecessary macro clashes and compiler warnings.
+
+ Ref: https://github.com/curl/curl/issues/1562
+ Closes https://github.com/curl/curl/pull/1672
-- [Thomas Glanzmann brought this change]
+Jay Satiro (11 Jul 2017)
+- strerror: Preserve Windows error code in some functions
+
+ This is a follow-up to af02162 which removed (SET_)ERRNO macros. That
+ commit was an earlier draft that I committed by mistake, which was then
+ remedied by a5834e5 and e909de6, and now this commit. With this commit
+ there is now no difference between the current code and the changes that
+ were approved in the final draft.
+
+ Thanks-to: Max Dymond, Marcel Raad, Daniel Stenberg, Gisle Vanem
+ Ref: https://github.com/curl/curl/pull/1589
- url: proxy: Use 443 as default port for https proxies
+Marcel Raad (10 Jul 2017)
+- [Max Dymond brought this change]
-- TODO: removed "HTTPS proxy"
+ tests: Fix up issues with errno in test files
+
+ Closes https://github.com/curl/curl/pull/1671
-- [Jan-E brought this change]
+Daniel Stenberg (10 Jul 2017)
+- errno: fix non-windows builds after af0216251b94e7
- winbuild: add config option ENABLE_NGHTTP2
+- [Ryan Winograd brought this change]
+
+ make: fix docs build on OpenBSD
- Closes #1141
+ Ref: #1591
-Jay Satiro (24 Nov 2016)
-- tool_urlglob: Improve sanity check in glob_range
+Marcel Raad (10 Jul 2017)
+- ldap: fix MinGW compiler warning
- Prior to this change we depended on errno if strtol could not perform a
- conversion. POSIX says EINVAL *may* be set. Some implementations like
- Microsoft's will not set it if there's no conversion.
+ ldap_bind_s is marked as deprecated in w32api's winldap.h shipping with
+ the latest original MinGW, resulting in compiler warnings since commit
+ f0fe66f13c93d3d0af45d9fb1231c9164e0f9dc8. Fix this for the non-SSPI
+ case by using ldap_simple_bind_s again instead of ldap_bind_s with
+ LDAP_AUTH_SIMPLE.
- Ref: https://github.com/curl/curl/commit/ee4f7660#commitcomment-19658189
+ Closes https://github.com/curl/curl/pull/1664
-- tool_help: Change description for --retry-connrefused
+- curl-compilers.m4: disable warning spam with Cygwin's clang
- Ref: https://github.com/curl/curl/pull/1064#issuecomment-260052409
-
-Patrick Monnerat (25 Nov 2016)
-- os400: sync ILE/RPG binding
-
-Jay Satiro (24 Nov 2016)
-- test1135: Fix curl_easy_duphandle prototype for code style
+ When building with Cygwin or MinGW, libtool uses a wrapper executable
+ instead of a wrapper script [1], which is written in C and throws
+ missing-variable-declarations warnings. Don't enable these warnings on
+ Cygwin and MinGW in order to avoid warnings for every executable built,
+ which spams the test suite output when using Cygwin's clang.
- Follow-up to dbadaeb which changed the style.
+ [1] https://www.gnu.org/software/libtool/manual/html_node/Wrapper-executables.html
+
+ Closes https://github.com/curl/curl/pull/1665
-- x509asn1: Restore the parameter check in Curl_getASN1Element
+Jay Satiro (10 Jul 2017)
+- curl_setup_once: Remove ERRNO/SET_ERRNO macros
- - Restore the removed parts of the parameter check.
+ Prior to this change (SET_)ERRNO mapped to GetLastError/SetLastError
+ for Win32 and regular errno otherwise.
- Follow-up to 945f60e which altered the parameter check.
-
-Daniel Stenberg (25 Nov 2016)
-- RELEASE-NOTES: update option counters
+ I reviewed the code and found no justifiable reason for conflating errno
+ on WIN32 with GetLastError/SetLastError. All Win32 CRTs support errno,
+ and any Win32 multithreaded CRT supports thread-local errno.
+
+ Fixes https://github.com/curl/curl/issues/895
+ Closes https://github.com/curl/curl/pull/1589
-- [Frank Gevaerts brought this change]
+- tool_getparam: fix potentially uninitialized err
- add CURLINFO_SCHEME, CURLINFO_PROTOCOL, and %{scheme}
+Marcel Raad (9 Jul 2017)
+- smb: rename variable to fix shadowing warning
- Adds access to the effectively used protocol/scheme to both libcurl and
- curl, both in string and numeric (CURLPROTO_*) form.
+ GCC 4.6.3 on travis complains:
+ smb.c: In function ‘get_posix_time’:
+ smb.c:725:13: error: declaration of ‘time’ shadows a global declaration
+ [-Werror=shadow]
- Note that the string form will be uppercase, as it is just the internal
- string.
+ Fix this by renaming the variable.
+
+- tool_cb_wrt: fix variable shadowing warning
- As these strings are declared internally as const, and all other strings
- returned by curl_easy_getinfo() are de-facto const as well, string
- handling in getinfo.c got const-ified.
+ GCC 4.4 complains:
+ tool_cb_wrt.c:81: error: declaration of ‘isatty’ shadows a global
+ declaration
+ /usr/include/unistd.h:782: error: shadowed declaration is here
- Closes #1137
+ Fix this by renaming the variable.
+
+ Closes https://github.com/curl/curl/pull/1661
-- RELEASE-NOTES: synced with 63198a4750aeb
+Daniel Stenberg (8 Jul 2017)
+- RELEASE-NOTES: synced with be2c999b8
-- curl.1: the new --proxy options ship in 7.52.0
+- travis: install stunnel
-- checksrc: move open braces to comply with function declaration style
+- valgrind.supp: supress OpenSSL false positive seen on travis
-- checksrc: detect wrongly placed open braces in func declarations
+- travis: detect and use valgrind for normal builds
+
+ Closes #1653
-- checksrc: white space edits to comply to stricter checksrc
+- travis: add SMB, DICT, TELNET torture to coverage test
-- checksrc: verify ASTERISKNOSPACE
+- [Paul Harris brought this change]
+
+ cmake: offer CMAKE_DEBUG_POSTFIX when building with MSVC
- Detects (char*) and 'char*foo' uses.
+ Removes BUILD_RELEASE_DEBUG_DIRS since it wasn't used anywhere.
+
+ Closes #1649
-- checksrc: code style: use 'char *name' style
+- CURLOPT_POSTFIELDS.3: explain the 100-continue magic better
-- checksrc: add ASTERISKSPACE
-
- Verifies a 'char *name' style, with no space after the asterisk.
+- [Max Dymond brought this change]
-- openssl: remove dead code
+ test1452: add telnet negotiation
- Coverity CID 1394666
-
-- [Okhin Vasilij brought this change]
+ Add a basic telnet server for negotiating some telnet options before
+ echoing back any data that's sent to it.
+
+ Closes #1645
- HTTPS-proxy: fixed mbedtls and polishing
+- travis: do more tests in the coverage run
+
+ I added a selection of torture and event tests that run "fast enough"
-- darwinssl: adopted to the HTTPS proxy changes
+- curl_easy_escape.3: mention the (lack of) encoding
- It builds and runs all test cases. No adaptations for actual HTTPS proxy
- support has been made.
+ Fixes #1612
+ Reported-by: Jeroen Ooms
-- gtls: fix indent to silence compiler warning
+- [Gisle Vanem brought this change]
+
+ memdebug: don't setbuf() if the file open failed
- vtls/gtls.c: In function ‘Curl_gtls_data_pending’:
- vtls/gtls.c:1429:3: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation]
- if(conn->proxy_ssl[connindex].session &&
- ^~
- vtls/gtls.c:1433:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
- return res;
+ Bug: https://github.com/curl/curl/issues/828#issuecomment-313475151
-- [Thomas Glanzmann brought this change]
+- appveyor: enable CURL_WERROR on all builds
- mbedtls: Fix compile errors
+- cmake: add CURL_WERROR for enabling "warning as errors"
-- [Alex Rousskov brought this change]
+- [Hannes Magnusson brought this change]
- proxy: Support HTTPS proxy and SOCKS+HTTP(s)
-
- * HTTPS proxies:
-
- An HTTPS proxy receives all transactions over an SSL/TLS connection.
- Once a secure connection with the proxy is established, the user agent
- uses the proxy as usual, including sending CONNECT requests to instruct
- the proxy to establish a [usually secure] TCP tunnel with an origin
- server. HTTPS proxies protect nearly all aspects of user-proxy
- communications as opposed to HTTP proxies that receive all requests
- (including CONNECT requests) in vulnerable clear text.
+ cmake: remove spurious "-l" from linker flags
- With HTTPS proxies, it is possible to have two concurrent _nested_
- SSL/TLS sessions: the "outer" one between the user agent and the proxy
- and the "inner" one between the user agent and the origin server
- (through the proxy). This change adds supports for such nested sessions
- as well.
-
- A secure connection with a proxy requires its own set of the usual SSL
- options (their actual descriptions differ and need polishing, see TODO):
+ Fixes #1552
+
+- test506: skip if threaded-resolver
+
+- runtests: support "threaded-resolver" as a feature
- --proxy-cacert FILE CA certificate to verify peer against
- --proxy-capath DIR CA directory to verify peer against
- --proxy-cert CERT[:PASSWD] Client certificate file and password
- --proxy-cert-type TYPE Certificate file type (DER/PEM/ENG)
- --proxy-ciphers LIST SSL ciphers to use
- --proxy-crlfile FILE Get a CRL list in PEM format from the file
- --proxy-insecure Allow connections to proxies with bad certs
- --proxy-key KEY Private key file name
- --proxy-key-type TYPE Private key file type (DER/PEM/ENG)
- --proxy-pass PASS Pass phrase for the private key
- --proxy-ssl-allow-beast Allow security flaw to improve interop
- --proxy-sslv2 Use SSLv2
- --proxy-sslv3 Use SSLv3
- --proxy-tlsv1 Use TLSv1
- --proxy-tlsuser USER TLS username
- --proxy-tlspassword STRING TLS password
- --proxy-tlsauthtype STRING TLS authentication type (default SRP)
+ ... to let tests require it or skip if present
+
+- asyn-thread.c: fix unused variable warnings on macOS
+
+- http: s/TINY_INITIAL_POST_SIZE/EXPECT_100_THRESHOLD
- All --proxy-foo options are independent from their --foo counterparts,
- except --proxy-crlfile which defaults to --crlfile and --proxy-capath
- which defaults to --capath.
+ Make the name reflect its use better, and add a short comment describing
+ what it's for.
+
+- cmake: if inet_pton is used, bump _WIN32_WINNT
- Curl now also supports %{proxy_ssl_verify_result} --write-out variable,
- similar to the existing %{ssl_verify_result} variable.
+ ... and make sure inet_pton is always checked for when *not* using Windows,
+ which is a regression from 4fc6ebe18.
- Supported backends: OpenSSL, GnuTLS, and NSS.
+ Idea-by: Sergei Nikulov
+
+- select.h: avoid macro redefinition harder
- * A SOCKS proxy + HTTP/HTTPS proxy combination:
+ ... by checking the POLLIN define, as the header file checks don't work
+ on Windows.
+
+- inet_pton: fix include on windows to get prototype
- If both --socks* and --proxy options are given, Curl first connects to
- the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS
- proxy.
+ inet_pton() exists on Windows and gets used by our cmake builds. Make
+ sure the correct header file is included to avoid compiler warnings.
- TODO: Update documentation for the new APIs and --proxy-* options.
- Look for "Added in 7.XXX" marks.
+ Closes #1639
-Patrick Monnerat (24 Nov 2016)
-- Declare endian read functions argument as a const pointer.
- This is done for all functions of the form Curl_read[136][624]_[lb]e.
+- TODO: 1.10 auto-detect proxy
+
+ Closes #1572
-- Limit ASN.1 structure sizes to 256K. Prevent some allocation size overflows.
- See CRL-01-006.
+- TODO: HTTP proxy CONNECT is non-blocking now
-Jay Satiro (22 Nov 2016)
-- url: Fix conn reuse for local ports and interfaces
+- cmake: fix send/recv argument scanner for windows
- - Fix connection reuse for when the proposed new conn 'needle' has a
- specified local port but does not have a specified device interface.
+ ... by simply trying the Windows argument types first.
- Bug: https://curl.haxx.se/mail/lib-2016-11/0137.html
- Reported-by: bjt3[at]hotmail.com
+ Fixes #1640
-Daniel Stenberg (21 Nov 2016)
-- rand: pass in number of randoms as an unsigned argument
+- RELEASE-NOTES: synced with 596cfb6c0
-Jay Satiro (20 Nov 2016)
-- rand: Fix potentially uninitialized result warning
+- [Gisle Vanem brought this change]
-Marcel Raad (19 Nov 2016)
-- vtls: fix build warnings
+ smb: add support for CURLOPT_FILETIME
- Fix warnings about conversions from long to time_t in openssl.c and
- schannel.c.
+ Bug: https://curl.haxx.se/mail/lib-2017-07/0005.html
- Follow-up to de4de4e3c7c
+ Closes #1643
-Daniel Stenberg (18 Nov 2016)
-- [Marcel Raad brought this change]
-
- lib: fix compiler warnings after de4de4e3c7c
-
- Visual C++ now complains about implicitly casting time_t (64-bit) to
- long (32-bit). Fix this by changing some variables from long to time_t,
- or explicitly casting to long where the public interface would be
- affected.
+- travis: install nghttp2 on linux builds
- Closes #1131
+ Closes #1642
-Peter Wu (17 Nov 2016)
-- [Isaac Boukris brought this change]
+- [Gisle Vanem brought this change]
- Don't mix unix domain sockets with regular ones
+ smb: fix build for djgpp/MSDOS
- When reusing a connection, make sure the unix domain
- socket option matches.
+ bug: https://curl.haxx.se/mail/lib-2017-07/0005.html
-Jay Satiro (17 Nov 2016)
-- tests: Fix HTTP2-Settings header for huge window size
+- configure: try ldap/lber in reversed order first
- Follow-up to a4d8888. Changing the window size in that commit resulted
- in a different HTTP2-Settings upgrade header, causing test 1800 to fail.
+ When scanning for which LDAP libraries to use, try the -lldap -llber
+ combination before the reversed order since it has a greater chance of
+ working when linking with libcurl statically.
+
+ Fixes #1619
+ Closes #1634
+ Reported-by: David E. Narváez
-- http2: Use huge HTTP/2 windows
+- configure: remove checks for 5 functions never used
- - Improve performance by using a huge HTTP/2 window size.
+ fork, getprotobyname, inet_addr, perror, uname
- Bug: https://github.com/curl/curl/issues/1102
- Reported-by: afrind@users.noreply.github.com
- Assisted-by: Tatsuhiro Tsujikawa
+ closes #1638
-Daniel Stenberg (16 Nov 2016)
-- cmdline-docs: more conversion
+- dist: add SMB python deps into the tarball
-- gen: support 'protos'
-
- and warn on unrecognized lines
+- [Max Dymond brought this change]
-- gen: support 'single' to make an individual page man page
+ test1451: add SMB support to the testbed
+
+ Add test 1451 which does some very basic SMB testing using the impacket
+ SMB server.
+
+ Closes #1630
-- cmdline-docs: more options converted over
+- [Max Dymond brought this change]
-- gen: support 'redirect'
+ test: add impacket for SMB testing
- ... and warn for too long --help lines
+ Import impacket 0.9.15 for use in SMB testing. This was generated by
+ doing "pip2.7 install -t . impacket"
+
+ Unnecessary files for current testing were deleted.
-- cmdline/gen: replace options in texts better
+- travis.yml: use --enable-werror on debug builds
+
+ ... to better detect and fault on compiler warnings/errors
+
+ Closes #1637
-Jay Satiro (16 Nov 2016)
-- http2: Fix address sanitizer memcpy warning
+- tool_sleep: typecast to avoid macos compiler warning
- - In Curl_http2_switched don't call memcpy when src is NULL.
+ tool_sleep.c:54:24: error: implicit conversion loses integer precision:
+ 'long' to '__darwin_suseconds_t' (aka 'int')
+ [-Werror,-Wshorten-64-to-32]
+
+- [Martin Kepplinger brought this change]
+
+ timeval.c: Use long long constant type for timeval assignment
- Curl_http2_switched can be called like:
+ On a 64 bit host, sparse says:
- Curl_http2_switched(conn, NULL, 0);
+ timeval.c:148:15: warning: constant 0x7fffffffffffffff is so big it is long
+ timeval.c:149:12: warning: constant 0x7fffffffffffffff is so big it is long
- .. and prior to this change memcpy was then called like:
+ so let's use long long constant types in order to prevent undesired overflow
+ failures.
- memcpy(dest, NULL, 0)
+ Bug: https://curl.haxx.se/mail/lib-2017-07/0003.html
- .. causing address sanitizer to warn:
+ Closes #1636
- http2.c:2057:3: runtime error: null pointer passed as argument 2, which
- is declared to never be null
-
-- tool_help: Clarify --dump-header only writes received headers
-
-- curl.1: Clarify --dump-header only writes received headers
-
-Daniel Stenberg (15 Nov 2016)
-- [Alex Chan brought this change]
-
- docs: Spelling fixes
+ Signed-off-by: Martin Kepplinger <martink@posteo.de>
-Kamil Dudka (15 Nov 2016)
-- docs: the next release will be 7.52.0
-
-Daniel Stenberg (15 Nov 2016)
-- cmdline-opts: support generating the --help output
+- url: make the original string get used on subsequent transfers
+
+ ... since CURLOPT_URL should follow the same rules as other options:
+ they remain set until changed or cleared.
+
+ Added test 1551 to verify.
+
+ Fixes #1631
+ Closes #1632
+ Reported-by: Pavel Rochnyak
-- [David Schweikert brought this change]
+- [Johannes Schindelin brought this change]
- darwinssl: fix SSL client certificate not found on MacOS Sierra
+ gtls: fix build when sizeof(long) < sizeof(void *)
- Reviewed-by: Nick Zitzmann
+ - Change gnutls pointer/int macros to pointer/curl_socket_t.
+ Prior to this change they used long type as well.
- Closes #1105
-
-- curl: add --fail-early to help output
+ The size of the `long` data type can be shorter than that of pointer
+ types. This is the case most notably on Windows.
- Fixes test 1139 failures
+ If C99 were acceptable, we could simply use `intptr_t` here. But we
+ want to retain C89 compatibility.
- Follow-up to f82bbe01c8835
-
-- glob: fix [a-c] globbing regression
+ Simply use the trick of performing pointer arithmetic with the NULL
+ pointer: to convert an integer `i` to a pointer, simply take the
+ address of the `i`th element of a hypothetical character array
+ starting at address NULL. To convert back, simply cast the pointer
+ difference.
- Brought in ee4f76606cf
+ Thanks to Jay Satiro for the initial modification to use curl_socket_t
+ instead of int/long.
- Added test case 1280 to verify
+ Closes #1617
- Reported-by: Dave Reisner
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+- [Ryan Winograd brought this change]
+
+ unit1399: fix integer overflow
- Bug: https://github.com/curl/curl/commit/ee4f76606cfa4ee068bf28edd37c8dae7e8db317#commitcomment-19823146
+ Bug: #1616
+ Closes #1633
-- curl: add --fail-early
+- [Per Malmberg brought this change]
+
+ cmake: Added compatibility options for older Windows versions
- Exit with an error on the first transfer error instead of continuing to
- do the rest of the URLs.
+ CURL_STATIC_CRT and ENABLE_INET_PTON
- Discussion: https://curl.haxx.se/mail/archive-2016-11/0038.html
+ Closes #1621
-- Curl_rand: fixed and moved to rand.c
+- unit1399: add logging to time comparison
- Now Curl_rand() is made to fail if it cannot get the necessary random
- level.
+ ... to enable tracking down why autobuilds fail on this
- Changed the proto of Curl_rand() slightly to provide a number of ints at
- once.
+ Bug: #1616
+
+- make: build the docs subdir only from within src
- Moved out from vtls, since it isn't a TLS function and vtls provides
- Curl_ssl_random() for this to use.
+ ... and don't build at all in include
- Discussion: https://curl.haxx.se/mail/lib-2016-11/0119.html
+ Prompted-by-work-by: Simon Warta
+ Ref: #1590
+ Closes #1591
-- cmdline-opts: first test version of a new man page generator kit
-
- See MANPAGE.md for the description of how this works. Each command line
- option is now described in a separate .d file.
+- [Max Dymond brought this change]
-- time_t fix: follow-up to de4de4e3c7c
+ test1450: fix up DICT server in torture mode
- Blah, I accidentally wrote size_t instead of time_t for two variables.
+ As per https://github.com/curl/curl/pull/1615, the DICT server is a
+ little spammy in torture mode due to the sockets being torn down
+ unexpectedly. Fix this by adding some error handling to the handling
+ function.
- Reported-by: Dave Reisner
+ Closes #1629
-- timeval: prefer time_t to hold seconds instead of long
-
- ... as long is still 32bit on modern 64bit windows machines, while
- time_t is generally 64bit.
+- [Max Dymond brought this change]
-Dan Fandrich (12 Nov 2016)
-- tests: fixed variable might be clobbered warning
+ test1450: add simple testing for DICT
- This stops the compiler from potentially making invalid assumptions
- about the immutability of sdp and sap across the longjmp boundary.
+ Add a new server which provides a DICT interface. This is intended to
+ begin coverage testing for lib/dict.c
+
+ Closes #1615
-Daniel Stenberg (12 Nov 2016)
-- RELEASE-NOTES: synced with 346340808c
+- [Dan Fandrich brought this change]
-- URL-parser: for file://[host]/ URLs, the [host] must be localhost
+ test1521: fix out-of-tree builds, broken with 467da3af
- Previously, the [host] part was just ignored which made libcurl accept
- strange URLs misleading users. like "file://etc/passwd" which might've
- looked like it refers to "/etc/passwd" but is just "/passwd" since the
- "etc" is an ignored host name.
+ The test.h file is no longer in the same directory as the source file,
+ so that directory needs to be added to the include path.
- Reported-by: Mike Crowe
- Assisted-by: Kamil Dudka
-
-- test558: adapt to 0649433da
+ Fixes #1627
+ Closes #1628
-- openssl: make sure to fail in the unlikely event that PRNG seeding fails
+- [Max Dymond brought this change]
-- openssl: avoid unnecessary seeding if already done
+ http2: handle PING frames
- 1.1.0+ does more of this by itself so we can avoid extra processing this
- way.
-
-- openssl: RAND_status always exists in OpenSSL >= 0.9.7
+ Add a connection check function to HTTP2 based off RTSP. This causes
+ PINGs to be handled the next time the connection is reused.
- and remove RAND_screen from configure since nothing is using that
- function
+ Closes #1521
-- Curl_pgrsUpdate: use dedicated function for time passed
+- [Max Dymond brought this change]
-- realloc: use Curl_saferealloc to avoid common mistakes
+ handler: refactor connection checking
- Discussed: https://curl.haxx.se/mail/lib-2016-11/0087.html
+ Add a new type of callback to Curl_handler which performs checks on
+ the connection. Alter RTSP so that it uses this callback to do its
+ own check on connection health.
-- [Daniel Hwang brought this change]
+- [dmitrykos brought this change]
- curl: Add --retry-connrefused
+ openssl: improve fallback seed of PRNG with a time based hash
- to consider ECONNREFUSED as a transient error.
-
- Closes #1064
+ Fixes #1620
-- openssl: raise the max_version to 1.3 if asked for
-
- Now I've managed to negotiate TLS 1.3 with https://enabled.tls13.com/ when
- using boringssl.
+- [Ryan Winograd brought this change]
-Jay Satiro (9 Nov 2016)
-- vtls: Fail on unrecognized param for CURLOPT_SSLVERSION
-
- - Fix GnuTLS code for CURL_SSLVERSION_TLSv1_2 that broke when the
- TLS 1.3 support was added in 6ad3add.
+ progress: prevent resetting t_starttransfer
- - Homogenize across code for all backends the error message when TLS 1.3
- is not available to "<backend>: TLS 1.3 is not yet supported".
-
- - Return an error when a user-specified ssl version is unrecognized.
+ Prevent `Curl_pgrsTime` from modifying `t_starttransfer` when invoked
+ with `TIMER_STARTTRANSFER` more than once during a single request.
- ---
+ When a redirect occurs, this is considered a new request and
+ `t_starttransfer` can be updated to reflect the `t_starttransfer` time
+ of the redirect request.
- Prior to this change our code for some of the backends used the
- 'default' label in the switch statement (ie ver unrecognized) for
- ssl.version and treated it the same as CURL_SSLVERSION_DEFAULT.
+ Closes #1616
- Bug: https://curl.haxx.se/mail/lib-2016-11/0048.html
- Reported-by: Kamil Dudka
-
-Daniel Stenberg (9 Nov 2016)
-- [Isaac Boukris brought this change]
+ Bug: https://github.com/curl/curl/pull/1602#issuecomment-310267370
- SPNEGO: Fix memory leak when authentication fails
+- curl_strequal.3: fix typo in SYNOPSIS
- If SPNEGO fails, cleanup the negotiate handle right away.
-
- Fixes #1115
+ Reported-by: Jesse Chisholm
- Signed-off-by: Isaac Boukris <iboukris@gmail.com>
- Reported-by: ashman-p
+ Fixes #1623
-- CODE_STYLE.md: link to INTERNALS.md correctly
+- RELEASE-NOTES: synced with ce2c3ebda
-- bump: next version will be 7.52.0
-
-- RELEASE-NOTES: synced with dfcdaaba371e9a3
-
-- examples/fileupload.c: fclose the file as well
+Kamil Dudka (28 Jun 2017)
+- curl --socks5-{basic,gssapi}: control socks5 auth
+
+ Closes https://github.com/curl/curl/pull/1454
-- printf: fix ".*f" handling
+- CURLOPT_SOCKS5_AUTH: allowed methods for SOCKS5 proxy auth
- It would always use precision 1 instead of reading it from the argument
- list as intended.
+ If libcurl was built with GSS-API support, it unconditionally advertised
+ GSS-API authentication while connecting to a SOCKS5 proxy. This caused
+ problems in environments with improperly configured Kerberos: a stock
+ libcurl failed to connect, despite libcurl built without GSS-API
+ connected fine using username and password.
- Reported-by: Ray Satiro
+ This commit introduces the CURLOPT_SOCKS5_AUTH option to control the
+ allowed methods for SOCKS5 authentication at run time.
- Bug: #1113
-
-- curl_formadd.3: *_FILECONTENT and *_FILE need the file to be kept
+ Note that a new option was preferred over reusing CURLOPT_PROXYAUTH
+ for compatibility reasons because the set of authentication methods
+ allowed by default was different for HTTP and SOCKS5 proxies.
- Reported-by: Frank Gevaerts
+ Bug: https://curl.haxx.se/mail/lib-2017-01/0005.html
+ Closes https://github.com/curl/curl/pull/1454
-Kamil Dudka (7 Nov 2016)
-- nss: silence warning 'SSL_NEXT_PROTO_EARLY_VALUE not handled in switch'
-
- ... with nss-3.26.0 and newer
-
- Reported-by: Daniel Stenberg
+- socks: deduplicate the code for auth request
-Daniel Stenberg (7 Nov 2016)
-- openssl: initial TLS 1.3 adaptions
+- socks: use proxy_user instead of proxy_name
- BoringSSL supports TLSv1.3 already, but these changes don't seem to be anough
- to get it working.
+ ... to make it obvious what the data is used for
-- ssh: check md5 fingerprints case insensitively (regression)
+Daniel Stenberg (27 Jun 2017)
+- libtest/make: generate lib1521.c
- Revert the change from ce8d09483eea but use the new function
+ ... instead of having the generated code checked in. This saves space in
+ the tarball but primarily automatically adapts to newly added options.
- Reported-by: Kamil Dudka
- Bug: https://github.com/curl/curl/commit/ce8d09483eea2fcb1b50e323e1a8ed1f3613b2e3#commitcomment-19666146
+ Closes #1614
-Kamil Dudka (7 Nov 2016)
-- curl: introduce the --tlsv1.3 option to force TLS 1.3
+Jay Satiro (26 Jun 2017)
+- tool_getparam: fix memory leak on test 1147 OOM (torture tests)
- Fully implemented with the NSS backend only for now.
-
- Reviewed-by: Ray Satiro
+ Bug: https://github.com/curl/curl/pull/1486#issuecomment-310926872
+ Reported-by: Dan Fandrich
-- vtls: support TLS 1.3 via CURL_SSLVERSION_TLSv1_3
-
- Fully implemented with the NSS backend only for now.
-
- Reviewed-by: Ray Satiro
+Dan Fandrich (25 Jun 2017)
+- test1537: fixed memory leak on OOM
-- nss: map CURL_SSLVERSION_DEFAULT to NSS default
+Marcel Raad (25 Jun 2017)
+- test1521: fix compiler warnings
- ... but make sure we use at least TLSv1.0 according to libcurl API
+ The integer literal 3123123123 doesn't fit into a 32-bit signed
+ integer, so GCC with 32-bit long warns in C90 mode:
+ this decimal constant is unsigned only in ISO C90 [enabled by default]
+ Fix this by using ULONG_MAX, which should fit in any curl_off_t and has
+ the correct suffix to not issue any warnings.
+ Also adds the missing CURLOPT_REQUEST_TARGET from commit
+ 9b167fd090f596eac828817d48c247eeae53407f.
- Reported-by: Cure53
- Reviewed-by: Ray Satiro
+ Closes https://github.com/curl/curl/pull/1611
-Daniel Stenberg (7 Nov 2016)
-- s/cURL/curl
+Daniel Stenberg (24 Jun 2017)
+- curl/system.h: add check for XTENSA for 32bit gcc
- We're mostly saying just "curl" in lower case these days so here's a big
- cleanup to adapt to this reality. A few instances are left as the
- project could still formally be considered called cURL.
+ Reported-by: Neil Kolban
+ Fixes: 1598
-Jay Satiro (7 Nov 2016)
-- [Tatsuhiro Tsujikawa brought this change]
+- [Henrik S. Gaßmann brought this change]
- http2: Don't send header fields prohibited by HTTP/2 spec
+ winbuild: fix boringssl build
- Previously, we just ignored "Connection" header field. But HTTP/2
- specification actually prohibits few more header fields. This commit
- ignores all of them so that we don't send these bad header fields.
+ Compile with `WIN32_LEAN_AND_MEAN` which prevents `windows.h` from
+ including too much clutter including `wincrypt.h` which in turn contains
+ some preprocessor macros that clash with boringssl symbols.
- Bug: https://curl.haxx.se/mail/archive-2016-10/0033.html
- Reported-by: Ricki Hirner
+ Detect boringssl by checking the existance of `is_boringssl.h` and set
+ the corresponding `HAVE_BORINGSSL` for compilation which is used in
+ `ldap.c` to undefine the evil macros.
- Closes https://github.com/curl/curl/pull/1092
+ Closes #1610
-Daniel Stenberg (7 Nov 2016)
-- curl.1: explain the SMTP data expected for -T
-
- Fixes #1107
+- progress: progress.timespent needs to be us
- Reported-by: Adam Piggott
+ follow-up to 64ed44a815e4e to fix test 500 failures
-Peter Wu (6 Nov 2016)
-- cmake: disable poll for macOS
+Marcel Raad (24 Jun 2017)
+- curl-compilers.m4: fix unknown-warning-option on Apple clang
- Mirrors the autotools behavior introduced with curl-7_50_3-83-ga34c7ce.
+ Since 5598b0bd63f690c151074494ce47ef872f004ab4, clang -v is used to
+ detect the clang version. The version number was expected to come after
+ the word "version". For Apple clang, this doesn't work as it has its
+ own versioning scheme.
+ The version number is now first searched after the string
+ "based on LLVM". This works for Apple clang before version 7, and also
+ for e.g. Ubuntu's clang up to version 3.7. If it's not found and the
+ version string contains "Apple LLVM version", clang version 3.7 is
+ assumed, which is the version that comes with Xcode 7. Otherwise, the
+ version number is still expected after the word "version", which works
+ for very old Apple clang versions.
- Fixes #1089
+ Ref: https://trac.macports.org/wiki/XcodeVersionInfo
+ Fixes https://github.com/curl/curl/issues/1606
+ Closes https://github.com/curl/curl/pull/1607
-Jay Satiro (5 Nov 2016)
-- easy: Initialize info variables on easy init and duphandle
+Daniel Stenberg (24 Jun 2017)
+- progress: fix "time spent", broke in adef394ac
+
+- CURLINFO_REDIRECT_URL.3: mention the CURLOPT_MAXREDIRS case
- - Call Curl_initinfo on init and duphandle.
+ ... supported since 7.54.1
+
+- maketgz: switch to -6e for xz
- Prior to this change the statistical and informational variables were
- simply zeroed by calloc on easy init and duphandle. While zero is the
- correct default value for almost all info variables, there is one where
- it isn't (filetime initializes to -1).
+ To reduce the memory requirement for decompress, and still do almost as
+ good compression as with -9e.
- Bug: https://github.com/curl/curl/issues/1103
- Reported-by: Neal Poole
+ Pointed-out-by: Dan Fandrich
+
+- libtest/Makefile: remove unused lib1541 variables
-Daniel Stenberg (5 Nov 2016)
-- [Mauro Rappa brought this change]
+- CONTRIBUTE.md: mention the out-of-tree build test too
- curl -w: added more decimal digits to timing counters
+- maketgz: switch to xz instead of lzma
- Now showing microsecond resolution.
+ The compressed output size seems to be a tad bit smaller, but generally
+ xz seems more preferred these days and is used directly by for example
+ gentoo instead of bz2.
- Closes #1106
-
-Jakub Zakrzewski (4 Nov 2016)
-- dist: add CMakeLists.txt to the tarball
+ "Users of LZMA Utils should move to XZ Utils" =>
+ https://tukaani.org/lzma/
+
+ Closes #1604
-Daniel Stenberg (4 Nov 2016)
-- mbedtls: fix build with mbedtls versions < 2.4.0
+- --request-target: instead of --strip-path-slash
- Regression added in 62a8095e714
+ ... and CURLOPT_REQUEST_TARGET instead of CURLOPT_STRIP_PATH_SLASH.
- Reported-by: Tony Kelman
+ This option instead provides the full "alternative" target to use in the
+ request, instead of extracting the path from the URL.
- Discussed in #1087
-
-- configure: verify that compiler groks -Werror=partial-availability
+ Test 1298 and 1299 updated accordingly.
- Reported-by: bemoody
+ Idea-by: Evert Pot
+ Suggestion: https://daniel.haxx.se/blog/2017/06/19/options-with-curl/comment-page-1/#comment-18373
- Fixes #1104
+ Closes #1593
-- docs: shorten and simplify the top comment in multi-uv.c
+Marcel Raad (21 Jun 2017)
+- lib1521: fix missing-variable-declarations clang warnings
- and change URL to use https
-
-- [Andrei Sedoi brought this change]
-
- docs: handle CURL_POLL_INOUT in multi-uv example
-
-- [Andrei Sedoi brought this change]
+ Declare TU-local variables static.
- docs: multi-uv: don't use CURLMsg after cleanup
-
-- [Andrei Sedoi brought this change]
-
- docs: remove unused variables in multi-uv example
-
-- bump: start working on 7.51.1
-
-- winbuild: remove strcase.obj from curl build
+- travis: enable typecheck-gcc warnings
- Reported-by: Bruce Stephens
+ - switch debug and release configurations so that we get an optimized
+ build with GCC 4.3+ as required by typecheck-gcc
+ - enable warnings-as-errors for release builds
+ (which have warnings disabled)
- Fixes #1098
+ Closes https://github.com/curl/curl/pull/1595
-Dan Fandrich (2 Nov 2016)
-- msvc: removed a straggling reference to strequal.c
+- typecheck-gcc: add support for CURLINFO_OFF_T
- Follow-up to 502acba2
+ typecheck-gcc expected curl_socket_t instead of curl_off_t arguments
+ for CURLINFO_OFF_T. Detected by test1521, unfortunately only when run
+ locally.
+
+ Closes https://github.com/curl/curl/pull/1592
-Version 7.51.0 (2 Nov 2016)
+Daniel Stenberg (21 Jun 2017)
+- [Simon Warta brought this change]
-Daniel Stenberg (2 Nov 2016)
-- THANKS: synced with 7.51.0
+ ci: whitelist branches to avoid testing feature branches twice
-- RELEASE-NOTES: 7.51.0
+- [Gisle Vanem brought this change]
-- ftp_done: don't clobber the passed in error code
+ lib: fix the djgpp build
- Coverity CID 1374359 pointed out the unused result value.
+ Bug: https://github.com/curl/curl/commit/73a2fcea0b4adea6ba342cd7ed1149782c214ae3#commitcomment-22655993
-- ftp: remove dead code in ftp_done
+Marcel Raad (20 Jun 2017)
+- if2ip: fix compiler warning in ISO C90 mode
- Coverity CID 1374358
+ remote_scope_id is only used when both HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
+ and ENABLE_IPV6 are defined instead of only one of them.
-Jay Satiro (1 Nov 2016)
-- generate.bat: Include include/curl in libcurl VS projects
-
- .. because including those headers helps Visual Studio's Intellisense.
+Daniel Stenberg (20 Jun 2017)
+- travis: do the distcheck test build out-of-tree as well
-- generate.bat: Remove strcase.[ch] from curl tool VS projects
+- http: add --strip-path-slash and CURLOPT_STRIP_PATH_SLASH
- ..because they're no longer needed in the tool build. strcase is still
- built by the libcurl project and exports curl_str(n)equal which is used
- by the curl tool.
+ ... to enable sending "OPTIONS *" which wasn't possible previously.
- Bug: https://github.com/curl/curl/commit/9363f1a#all_commit_comments
-
-Daniel Stenberg (2 Nov 2016)
-- metalink: simplify the hex parsing function
+ This option currently only works for HTTP.
- ... and now it avoids using the libcurl toupper() function
-
-Michael Kaufmann (1 Nov 2016)
-- file: fix compiler warning
+ Added test cases 1298 + 1299 to verify
- follow-up to 46133aa5
+ Fixes #1280
+ Closes #1462
-Dan Fandrich (1 Nov 2016)
-- strcase: fixed Metalink builds by redefining checkprefix()
+- test1521: test getinfo's OFF_T types too
- ...to use the public function curl_strnequal(). This isn't ideal because
- it adds extra overhead to any internal calls to checkprefix.
-
- follow-up to 95bd2b3e
-
-Daniel Stenberg (1 Nov 2016)
-- curl.1: typo
+ Closes #1588
-- curl.1: expand on how multiple uses of -o looks
+- lib1521: add curl_easy_getinfo calls to the test set
- Suggested-by: Dan Jacobson
- Issue: https://github.com/curl/curl/issues/1097
+ Also added return value checks to make sure no unexpected return codes
+ are used.
-- tests/util: get a private strncasecompare clone
-
- ... since the curlx_* code no longer provides one and we don't link
- libcurl to these test servers.
+- [Simon Warta brought this change]
-- strcase: make the tool use curl_str[n]equal instead
+ automake: use $(MKHELP) variable instead if constant mkhelp.pl
- As they are after all part of the public API. Saves space and reduces
- complexity. Remove the strcase defines from the curlx_ family.
-
- Suggested-by: Dan Fandrich
- Idea: https://curl.haxx.se/mail/lib-2016-10/0136.html
+ this improves symmetry with the rule above
-Kamil Dudka (31 Oct 2016)
-- gskit, nss: do not include strequal.h
-
- follow-up to 811a693b80
+- [Simon Warta brought this change]
-Dan Fandrich (31 Oct 2016)
-- strcasecompare: include curl.h in strcase.c
-
- This should fix the "warning: 'curl_strequal' redeclared without
- dllimport attribute: previous dllimport ignored" message and subsequent
- link error on Windows because of the missing CURL_EXTERN on the
- prototype.
+ mkhelp.pl: fix script name in usage text
-Daniel Stenberg (31 Oct 2016)
-- strcase: fix the remaining rawstr users
+- RELEASE-NOTES: synced with 3b80d3ca4
-- msvc builds: s/rawstr/strcase
+- getinfo: return sizes as curl_off_t
- Follow-up to 811a693b
-
-Dan Fandrich (31 Oct 2016)
-- strcasecompare: replaced remaining rawstr.h with strcase.h
+ This change introduces new alternatives for the existing six
+ curl_easy_getinfo() options that return sizes or speeds as doubles. The
+ new versions are named like the old ones but with an appended '_T':
- This is a followup to commit 811a693b
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+ CURLINFO_CONTENT_LENGTH_UPLOAD_T
+ CURLINFO_SIZE_DOWNLOAD_T
+ CURLINFO_SIZE_UPLOAD_T
+ CURLINFO_SPEED_DOWNLOAD_T
+ CURLINFO_SPEED_UPLOAD_T
+
+ Closes #1511
-Marcel Raad (31 Oct 2016)
-- digest_sspi: fix include
+- PIPELINING_SERVER_BL: cleanup the internal list use
+
+ The list was freed incorrectly since the llist refactor of
+ cbae73e1dd959. Added test 1550 to verify that it works and avoid future
+ regressions.
- Fix compile break from 811a693b80
+ Reported-by: Pascal Terjan
+
+ Fixes #1584
+ Closes #1585
-Dan Fandrich (31 Oct 2016)
-- libauthretry: use the external function curl_strequal
+- http2: fix OOM crash
- The internal version strcasecompare isn't available outside libcurl
+ torture mode with test 1021 found it
-Daniel Stenberg (31 Oct 2016)
-- RELEASE-NOTES: synced with d14538d2501ef0da
+- CURLOPT_PREQUOTE.3: spellfix man page reference
-- configure: raise the default minimum version for macos to 10.8
+Marcel Raad (18 Jun 2017)
+- http_proxy: fix build with http and proxy
- follow-up to 4f8d0b6f02aa7043. Since the darwinssl code breaks
- otherwise. If you build without darwinssl 10.5 works fine.
+ After deff7de0eb0e22d2d142b96b9cc84cd8db5d2a48, the build without
+ CURL_DISABLE_PROXY and CURL_DISABLE_HTTP was failing because of missing
+ includes.
-- unit1301: keep testing curl_strequal
+- http_proxy: fix compiler warning
- as that is still part of the API, fix from 8fe4bd084412f30
+ With CURL_DISABLE_PROXY or CURL_DISABLE_HTTP, GCC complained about a
+ missing prototype for Curl_connect_free.
-- ldap: fix include
-
- Fix bug from 811a693b80
+Daniel Stenberg (18 Jun 2017)
+- TODO: update the TOC too
-- url: remove unconditional idn2.h include
+- TODO: implement support for CURLOPT_PREQUOTE with SFTP
- Mistake brought by 9c91ec778104a
-
-- curl_strequal: part of public API/ABI, needs to be kept
+ ... also updated the CURLOPT_PREQUOTE.3 man page to mention the correct
+ protocol support.
- These two public functions have been mentioned as deprecated since a
- very long time but since they are still part of the API and ABI we need
- to keep them around.
+ Closes #1514
-- strcase: s/strequal/strcasecompare
+- tool_wrte_cb: remove check for config == NULL
- some more follow-ups to 811a693b80
-
-- ldap: fix strcase use
+ ... as it really cannot have reached this far with config being NULL,
+ thus this is unnecesary and misleading.
- follow-up to 811a693b80
-
-- test165: adapted to the libidn2 use and IDNA2008 fix
+ Bug: https://news.ycombinator.com/item?id=14577585 and
+ https://daniel.haxx.se/blog/2017/06/17/curl-doesnt-spew-binary-anymore/comment-page-1/#comment-18356
+
+ Forwarded-to-us-by: Jakub Wilk
-- cookie: replace use of fgets() with custom version
+- curl: prevent binary output spewed to terminal
- ... that will ignore lines that are too long to fit in the buffer.
+ ... unless "--output -" is used. Binary detection is done by simply
+ checking for a binary zero in early data.
- CVE-2016-8615
+ Added test 1425 1426 to verify.
- Bug: https://curl.haxx.se/docs/adv_20161102A.html
- Reported-by: Cure53
+ Closes #1512
-- strcasecompare: all case insensitive string compares ignore locale now
+Marcel Raad (16 Jun 2017)
+- Makefile.m32: enable -W for MinGW32 build
- We had some confusions on when each function was used. We should not act
- differently on different locales anyway.
-
-- strcasecompare: is the new name for strequal()
+ The configure-based build also has this in addition to -Wall.
- ... to make it less likely that we forget that the function actually
- does case insentive compares. Also replaced several invokes of the
- function with a plain strcmp when case sensitivity is not an issue (like
- comparing with "-").
+ Closes https://github.com/curl/curl/pull/1578
-- ftp: check for previous patch must be case sensitive!
+- curl-compilers.m4: enable comma clang warning
- ... otherwise example.com/PATH and example.com/path would be assumed to
- be the same and they usually aren't!
-
-- SSH: check md5 fingerprint case sensitively
+ It usually warns when using commas instead of semicolons or other
+ operators by accident.
+
+ Closes https://github.com/curl/curl/pull/1578
-- connectionexists: use case sensitive user/password comparisons
+- curl-compilers.m4: enable missing-variable-declarations clang warning
- CVE-2016-8616
+ It usually warns when forgetting to declare TU-local variables static.
- Bug: https://curl.haxx.se/docs/adv_20161102B.html
- Reported-by: Cure53
+ Closes https://github.com/curl/curl/pull/1578
-- base64: check for integer overflow on large input
+- curl-compilers.m4: enable double-promotion warning
- CVE-2016-8617
+ Enable -Wdouble-promotion for both GCC and clang. It warns on implicit
+ promotion from float to double.
- Bug: https://curl.haxx.se/docs/adv_20161102C.html
- Reported-by: Cure53
+ Closes https://github.com/curl/curl/pull/1578
-- krb5: avoid realloc(0)
-
- If the requested size is zero, bail out with error instead of doing a
- realloc() that would cause a double-free: realloc(0) acts as a free()
- and then there's a second free in the cleanup path.
+- curl-compilers.m4: enable vla warning for clang
- CVE-2016-8619
+ Previously, that warning was only implicitly active in C90 mode.
+ Enable it unconditionally as already done for GCC.
- Bug: https://curl.haxx.se/docs/adv_20161102E.html
- Reported-by: Cure53
+ Closes https://github.com/curl/curl/pull/1578
-- aprintf: detect wrap-around when growing allocation
+Daniel Stenberg (16 Jun 2017)
+- http-proxy: fix chunked-encoded CONNECT responses
- On 32bit systems we could otherwise wrap around after 2GB and allocate 0
- bytes and crash.
+ Regression since 5113ad0424.
- CVE-2016-8618
+ ... and remove 'flaky' from test 1061 again
- Bug: https://curl.haxx.se/docs/adv_20161102D.html
- Reported-by: Cure53
+ Closes #1579
-- range: reject char globs with missing end like '[L-]'
+- http-proxy: deal with EAGAIN
- ... which previously would lead to out of boundary reads.
+ ... the previous code would reset the header length wrongly (since
+ 5113ad0424). This makes test 1060 reliable again.
- Reported-by: Luật Nguyễn
+ Also: make sws send even smaller chunks of data to increase the
+ likeliness of this happening.
-- glob_next_url: make sure to stay within the given output buffer
+- libtest/libntlmconnect: fix compiler warnings from f94fcdb
-- range: prevent negative end number in a glob range
+- [Jay Satiro brought this change]
+
+ HTTPS-Proxy: don't offer h2 for https proxy connections
- CVE-2016-8620
+ Bug: https://github.com/curl/curl/issues/1254
- Bug: https://curl.haxx.se/docs/adv_20161102F.html
- Reported-by: Luật Nguyễn
+ Closes #1546
-- parsedate: handle cut off numbers better
+- tests: stabilize test 2032 and 2033
- ... and don't read outside of the given buffer!
+ Both these tests run the same underlying test code: libntlmconnect.c -
+ this test code made some assumptions about socket ordering when it used
+ curl_easy_fdset() and when we changed timing or got accidental changes
+ in libcurl the tests would fail.
- CVE-2016-8621
+ The tests verify that the different transfers keep using the same
+ connections, which I now instead made sure by adding the number of bytes
+ each transfer gets and then verifies that they always get the same
+ amount as when these tests worked.
- bug: https://curl.haxx.se/docs/adv_20161102G.html
- Reported-by: Luật Nguyễn
+ Closes #1576
-- escape: avoid using curl_easy_unescape() internally
+- test1148: verify the -# progressbar
- Since the internal Curl_urldecode() function has a better API.
+ Closes #1569
-- unescape: avoid integer overflow
+- test1061: mark as flaky
- CVE-2016-8622
+ Fails intermittently on travis builds since a few days. Likely due to
+ 5113ad0424.
+
+Jay Satiro (16 Jun 2017)
+- url: refactor the check for Windows drive letter in path
- Bug: https://curl.haxx.se/docs/adv_20161102H.html
- Reported-by: Cure53
+ - Move the logic to detect a Windows drive letter prefix
+ (eg c: in c:foo) into a function-like macro.
+
+ Closes https://github.com/curl/curl/pull/1571
-- cookies: getlist() now holds deep copies of all cookies
+- mk-ca-bundle.pl: Check curl's exit code after certdata download
- Previously it only held references to them, which was reckless as the
- thread lock was released so the cookies could get modified by other
- handles that share the same cookie jar over the share interface.
+ - No longer allow partial downloads of certdata.
- CVE-2016-8623
+ Prior to this change partial downloads were (erroneously?) allowed since
+ only the server code was checked to be 200.
- Bug: https://curl.haxx.se/docs/adv_20161102I.html
- Reported-by: Cure53
+ Bug: https://github.com/curl/curl/pull/1577
+ Reported-by: Matteo B.
-- TODO: remove IDNA2008
+Daniel Stenberg (16 Jun 2017)
+- dist: add the fuzz dir to the tarball
-- idn: switch to libidn2 use and IDNA2008 support
+- configure: disable nghttp2 too if HTTP has been disabled
+
+- http-proxy: fix build with --disable-proxy or --disable-http
- CVE-2016-8625
+ Reported-by: Dan Fandrich
+
+- fuzz/README: document how to build
- Bug: https://curl.haxx.se/docs/adv_20161102K.html
- Reported-by: Christian Heimes
+ Fixes #1476
-- test1246: verify URL parsing with host name ending with '#'
+- [Frederik B brought this change]
-- urlparse: accept '#' as end of host name
+ fuzz: corpora file structure, initial commit
+
+- [Frederik B brought this change]
+
+ fuzz: bring oss-fuzz initial code converted to C89
+
+- http-proxy: only attempt FTP over HTTP proxy
- 'http://example.com#@127.0.0.1/x.txt' equals a request to example.com
- for the '/' document with the rest of the URL being a fragment.
+ ... all other non-HTTP protocol schemes are now defaulting to "tunnel
+ trough" mode if a HTTP proxy is specified. In reality there are no HTTP
+ proxies out there that allow those other schemes.
- CVE-2016-8624
+ Assisted-by: Ray Satiro, Michael Kaufmann
- Bug: https://curl.haxx.se/docs/adv_20161102J.html
- Reported-by: Fernando Muñoz
+ Closes #1505
-Jay Satiro (31 Oct 2016)
-- INTERNALS: better markdown (follow-up)
-
- - Wrap more words with underscores in backticks.
+- TODO: the generated include file is gone
- Follow-up to 13f4913.
+ ... since commit 73a2fcea0b
-Daniel Stenberg (30 Oct 2016)
-- INTERNALS: better markdown
+- curl_setup.h: error out on CURL_WANTS_CA_BUNDLE_ENV use
- words with underscore need to be within `these`
+ ... to make it really apparent if there's any user using this on purpose.
- Bug: https://github.com/curl/curl-www/issues/19
- Reported-by : Jay Satiro
-
-Jay Satiro (30 Oct 2016)
-- mk-ca-bundle.vbs: Fix UTF-8 output
+ Suggested-by: Jay Satiro
- - Change initial message box to mention delay when downloading/parsing.
+ Closes #1542
+
+- lib/curl_setup.h: remove CURL_WANTS_CA_BUNDLE_ENV
- Since there is no progress meter it was somewhat unexpected that after
- choosing a filename nothing appears to happen, when actually the cert
- data is in the process of being downloaded and parsed.
+ When this define was set, libcurl would check the environment variable
+ named CURL_CA_BUNDLE at run-time and use that CA cert bundle. This
+ feature was only defined by the watcom and m32 makefiles and caused
+ inconsistent behaviours among libcurls built on different platforms.
- - Warn if OpenSSL is not present.
+ The curl tool does already feature its own similar logic and the library
+ does not really need it, and it isn't documented libcurl behavior. So
+ this change removes it.
- - Use a UTF-8 stream to make the ca-bundle data.
+ Ref: #1538
+
+- test1147: verify -H on a file
+
+- curl: allow --header and --proxy-header read from file
- - Save the UTF-8 ca-bundle stream as binary so that no BOM is added.
+ So many headers can be provided as @filename.
- ---
+ Suggested-by: Timothe Litt
- This is a follow-up to d2c6d15 which switched mk-ca-bundle.vbs output to
- ANSI due to corrupt UTF-8 output, now fixed.
+ Closes #1486
+
+- RELEASE-NOTES: synced with 2ad80eec5
+
+- curl/curlver.h: start working on 7.55.0
+
+- http-proxy: do the HTTP CONNECT process entirely non-blocking
- This change completes making the default certificate bundle output of
- mk-ca-bundle.vbs as close as possible to that of mk-ca-bundle.pl, which
- should make it easier to review any difference between their output.
+ Mentioned as a problem since 2007 (8f87c15bdac63) and of course it
+ existed even before that.
- Ref: https://github.com/curl/curl/pull/1012
+ Closes #1547
-Daniel Stenberg (28 Oct 2016)
-- BINDINGS: converted to markdown
+- progress: let "current speed" be UL + DL speeds combined
- To make it render better on the web site, at the price of it becoming
- slightly less readable as text.
+ Bug #1556
+ Reported-by: Paul Harris
+ Closes #1559
-Jay Satiro (27 Oct 2016)
-- CURLMOPT_MAX_PIPELINE_LENGTH.3: Clarify it's not for HTTP/2
+Marcel Raad (14 Jun 2017)
+- system.h: fix MinGW build
- - Clarify that this option is only for HTTP/1.1 pipelining.
+ CURLSYS_PULL_WS2TCPIP_H got renamed to CURL_PULL_WS2TCPIP_H in commit
+ 73a2fcea0b4adea6ba342cd7ed1149782c214ae3.
+
+Daniel Stenberg (14 Jun 2017)
+- timers: store internal time stamps as time_t instead of doubles
- Bug: https://github.com/curl/curl/issues/1059
- Reported-by: Jeroen Ooms
+ This gives us accurate precision and it allows us to avoid storing "no
+ time" for systems with too low timer resolution as we then bump the time
+ up to 1 microsecond. Should fix test 573 on windows.
- Assisted-by: Daniel Stenberg
-
-Daniel Stenberg (27 Oct 2016)
-- KNOWN_BUGS: HTTP/2 server push enabled when no pushes can be accepted
+ Remove the now unused curlx_tvdiff_secs() function.
- Closes #927
-
-- KNOWN_BUGS: c-ares deviates from stock resolver on http://1346569778
+ Maintains the external getinfo() API with using doubles.
- Closes #893
+ Fixes #1531
-Michael Osipov (27 Oct 2016)
-- configure.in: Fix test syntax
+- dist: make the hugehelp.c not get regenerated unnecessarily
- Some versions of test allow == for equality, but others (such as the HP-UX
- version) do not. Use a single = for correctness.
+ The maketgz script now makes sure the generated hugehelp.c file in the
+ tarball is newer than the generated curl.1 man page, so that it doesn't
+ have to get unnecessarily rebuilt first thing in a typical build. It
+ thus also removes the need for perl to build off a plain release
+ tarball.
- Error output:
- checking for monotonic clock_gettime... ./configure[20445]: ==: A test command parameter is not valid.
+ Fixes #1565
-Daniel Stenberg (27 Oct 2016)
-- SECURITY: minor updates
+- includes: remove curl/curlbuild.h and curl/curlrules.h
- - we allow the security push up to 48 hours before the release
+ Rely entirely on curl/system.h now.
- - add a mention about possible pre-notifications
+ Introduced in Aug 2008 with commit 14240e9e109f. Now gone.
- - lower case the 'curl-security' title
+ Fixes #1456
-- [Andrei Sedoi brought this change]
+Version 7.54.1 (14 Jun 2017)
- docs: fix req->data in multi-uv example
-
- Closes #1088
+Daniel Stenberg (14 Jun 2017)
+- release: 7.54.1
-- mbedtls: stop using deprecated include file
-
- Reported-by: wyattoday
- Fixes #1087
+Dan Fandrich (13 Jun 2017)
+- mk-lib1521.pl: updated to match the test changes in 916ec30a
-Kamil Dudka (25 Oct 2016)
-- [Martin Frodl brought this change]
+Daniel Stenberg (13 Jun 2017)
+- [Stuart Henderson brought this change]
- nss: fix tight loop in non-blocking TLS handhsake over proxy
+ libressl: OCSP and intermediate certs workaround no longer needed
- ... in case the handshake completes before entering
- CURLM_STATE_PROTOCONNECT
+ lib/vtls/openssl.c has a workaround for a bug with OCSP responses signed
+ by intermediate certs, this was fixed in LibreSSL in
+ https://github.com/libressl-portable/openbsd/commit/912c64f68f7ac4f225b7d1fdc8fbd43168912ba0
- Bug: https://bugzilla.redhat.com/1388162
+ Bug: https://curl.haxx.se/mail/lib-2017-06/0038.html
-Jay Satiro (25 Oct 2016)
-- mk-ca-bundle: Update the vbscript version
+- url: fix buffer overwrite with file protocol (CVE-2017-9502)
- Bring the VBScript version more in line with the perl version:
+ Bug: https://github.com/curl/curl/issues/1540
+ Advisory: https://curl.haxx.se/docs/adv_20170614.html
- - Change timestamp to UTC.
+ Assisted-by: Ray Satiro
+ Reported-by: Marcel Raad
+
+- urlglob: fix division by zero
- - Change URL retrieval to HTTPS-only by default.
+ The multiply() function that is used to avoid integer overflows, was
+ itself reason for a possible division by zero error when passed a
+ specially formatted glob.
- - Comment out the options that disabled SSL cert checking by default.
+ Reported-by: GwanYeong Kim
+
+- configure: update the copyright year in the output
+
+- [ygrek brought this change]
+
+ BINDINGS: update SP-Forth and OCaml urls
+
+Michael Kaufmann (11 Jun 2017)
+- FindWin32CACert: Use a temporary buffer on the stack
- - Assume OpenSSL is present, get SHA256. And add a flag to toggle it.
+ Don't malloc() the temporary buffer, and use the correct type:
+ SearchPath() works with TCHAR, but SearchPathA() works with char.
+ Set the buffer size to MAX_PATH, because the terminating null byte
+ is already included in MAX_PATH.
- - Fix cert issuer name output.
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Marcel Raad
- The cert issuer output is now ansi, converted from UTF-8. Prior to this
- it was corrupt UTF-8. It turns out though we can work with UTF-8 the
- FSO object that writes ca-bundle can't write UTF-8, so there will have
- to be some alternative if UTF-8 is needed (like an ADODB.Stream).
+ Closes #1548
+
+Dan Fandrich (11 Jun 2017)
+- test1521: fixed OOM handling
+
+Daniel Stenberg (9 Jun 2017)
+- RELEASE-PROCEDURE: updated future release dates
+
+- [Paul Harris brought this change]
+
+ gitignore: ignore all vim swap files
- - Disable the certificate text info feature.
+ Closes #1561
+
+- lib1521: fix compiler warnings on the use of bad 'long' values
- The certificate text info doesn't work properly with any recent OpenSSL.
+ Reported-by: Marcel Raad
+ Bug: https://github.com/curl/curl/commit/cccac4fb2b20d6ed87da7978408c3ecacc464fe4#commitcomment-22453387
-Daniel Stenberg (24 Oct 2016)
-- TODO: indent code to make it render properly
+- setopt: check CURLOPT_ADDRESS_SCOPE option range
+
+ ... and return error instead of triggering an assert() when being way
+ out of range.
-- TODO: Remove the generated include file
+Jay Satiro (8 Jun 2017)
+- [TheAssassin brought this change]
-- TODO: add "--retry should resume"
+ cmake: Fix inconsistency regarding mbed TLS include directory
+
+ Previously, one had to set MBEDTLS_INCLUDE_DIR to make CMake find the
+ headers, but the system complained that mbed TLS wasn't found due to
+ MBEDTLS_INCLUDE_DIRS (note the trailing s) was not set. This commit
+ attempts to fix that.
- See #1084
+ Closes https://github.com/curl/curl/pull/1541
-- mk-ca-bundle.1: document -k
+Daniel Stenberg (8 Jun 2017)
+- [Ryuichi KAWAMATA brought this change]
+
+ examples/multi-uv.c: fix deprecated symbol
- Brought in 1ad2bdcf110266c. Now does HTTPS by default and needs -k to
- fall back to plain HTTP.
+ Closes #1557
-- [Jay Satiro brought this change]
+- asyn-ares: s/Curl_expire_latest/Curl_expire
- mk-ca-bundle: Change URL retrieval to HTTPS-only by default
+- expire: remove Curl_expire_latest()
- - Change all predefined Mozilla URLs to HTTPS (Gregory Szorc).
+ With the introduction of expire IDs and the fact that existing timers
+ can be removed now and thus never expire, the concept with adding a
+ "latest" timer is not working anymore as it risks to not expire at all.
- - New option -k to allow URLs other than HTTPS and enable HTTP fallback.
+ So, to be certain the timers actually are in line and will expire, the
+ plain Curl_expire() needs to be used. The _latest() function was added
+ as a sort of shortcut in the past that's quite simply not necessary
+ anymore.
- Prior to this change the default URL retrieval mode was to fall back to
- HTTP if HTTPS didn't work.
+ Follow-up to 31b39c40cf90
- Reported-by: Gregory Szorc
+ Reported-by: Paul Harris
- Closes #1012
+ Closes #1555
-- RELEASE-NOTES: synced with 50ee3aaf1a9b22d
+- [Chris Carlmar brought this change]
-Dan Fandrich (23 Oct 2016)
-- INSTALL.md: Updated minimum file sizes for 7.50.3
+ configure: fix link with librtmp when specifying path
+
+ Bug: https://curl.haxx.se/mail/lib-2017-06/0017.html
-Daniel Stenberg (22 Oct 2016)
-- multi: force connections to get closed in close_all_connections
+- file: make speedcheck use current time for checks
- Several independent reports on infinite loops hanging in the
- close_all_connections() function when closing a multi handle, can be
- fixed by first marking the connection to get closed before calling
- Curl_disconnect.
+ ... as it would previously just get the "now" timestamp before the
+ transfer starts and then not update it again.
- This is more fixing-the-symptom rather than the underlying problem
- though.
+ Closes #1550
+
+- metalink: remove unused printf() argument
+
+- travis: let some builds *not* use --enable-debug
- Bug: https://curl.haxx.se/mail/lib-2016-10/0011.html
- Bug: https://curl.haxx.se/mail/lib-2016-10/0059.html
+ typecheck-gcc and other things require optimized builds
- Reported-by: Dan Fandrich, Valentin David, Miloš Ljumović
-
-- [Anders Bakken brought this change]
+ Closes #1544
- curl_multi_remove_handle: fix a double-free
-
- In short the easy handle needs to be disconnected from its connection at
- this point since the connection still is serving other easy handles.
-
- In our app we can reliably reproduce a crash in our http2 stress test
- that is fixed by this change. I can't easily reproduce the same test in
- a small example.
-
- This is the gdb/asan output:
-
- ==11785==ERROR: AddressSanitizer: heap-use-after-free on address 0xe9f4fb80 at pc 0x09f41f19 bp 0xf27be688 sp 0xf27be67c
- READ of size 4 at 0xe9f4fb80 thread T13 (RESOURCE_HTTP)
- #0 0x9f41f18 in curl_multi_remove_handle /path/to/source/3rdparty/curl/lib/multi.c:666
-
- 0xe9f4fb80 is located 0 bytes inside of 1128-byte region [0xe9f4fb80,0xe9f4ffe8)
- freed by thread T13 (RESOURCE_HTTP) here:
- #0 0xf7b1b5c2 in __interceptor_free /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_malloc_linux.cc:45
- #1 0x9f7862d in conn_free /path/to/source/3rdparty/curl/lib/url.c:2808
- #2 0x9f78c6a in Curl_disconnect /path/to/source/3rdparty/curl/lib/url.c:2876
- #3 0x9f41b09 in multi_done /path/to/source/3rdparty/curl/lib/multi.c:615
- #4 0x9f48017 in multi_runsingle /path/to/source/3rdparty/curl/lib/multi.c:1896
- #5 0x9f490f1 in curl_multi_perform /path/to/source/3rdparty/curl/lib/multi.c:2123
- #6 0x9c4443c in perform /path/to/source/src/net/resourcemanager/ResourceManagerCurlThread.cpp:854
- #7 0x9c445e0 in ...
- #8 0x9c4cf1d in ...
- #9 0xa2be6b5 in ...
- #10 0xf7aa5780 in asan_thread_start /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_interceptors.cc:226
- #11 0xf4d3a16d in __clone (/lib/i386-linux-gnu/libc.so.6+0xe716d)
-
- previously allocated by thread T13 (RESOURCE_HTTP) here:
- #0 0xf7b1ba27 in __interceptor_calloc /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_malloc_linux.cc:70
- #1 0x9f7dfa6 in allocate_conn /path/to/source/3rdparty/curl/lib/url.c:3904
- #2 0x9f88ca0 in create_conn /path/to/source/3rdparty/curl/lib/url.c:5797
- #3 0x9f8c928 in Curl_connect /path/to/source/3rdparty/curl/lib/url.c:6438
- #4 0x9f45a8c in multi_runsingle /path/to/source/3rdparty/curl/lib/multi.c:1411
- #5 0x9f490f1 in curl_multi_perform /path/to/source/3rdparty/curl/lib/multi.c:2123
- #6 0x9c4443c in perform /path/to/source/src/net/resourcemanager/ResourceManagerCurlThread.cpp:854
- #7 0x9c445e0 in ...
- #8 0x9c4cf1d in ...
- #9 0xa2be6b5 in ...
- #10 0xf7aa5780 in asan_thread_start /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_interceptors.cc:226
- #11 0xf4d3a16d in __clone (/lib/i386-linux-gnu/libc.so.6+0xe716d)
-
- SUMMARY: AddressSanitizer: heap-use-after-free /path/to/source/3rdparty/curl/lib/multi.c:666 in curl_multi_remove_handle
- Shadow bytes around the buggy address:
- 0x3d3e9f20: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9f30: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9f40: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9f50: fd fd fd fd fd fd fd fd fd fd fd fd fd fa fa fa
- 0x3d3e9f60: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
- =>0x3d3e9f70:[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9f80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9f90: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9fa0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9fb0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- 0x3d3e9fc0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
- Shadow byte legend (one shadow byte represents 8 application bytes):
- Addressable: 00
- Partially addressable: 01 02 03 04 05 06 07
- Heap left redzone: fa
- Heap right redzone: fb
- Freed heap region: fd
- Stack left redzone: f1
- Stack mid redzone: f2
- Stack right redzone: f3
- Stack partial redzone: f4
- Stack after return: f5
- Stack use after scope: f8
- Global redzone: f9
- Global init order: f6
- Poisoned by user: f7
- Container overflow: fc
- Array cookie: ac
- Intra object redzone: bb
- ASan internal: fe
- Left alloca redzone: ca
- Right alloca redzone: cb
- ==11785==ABORTING
-
- Thread 14 "RESOURCE_HTTP" received signal SIGABRT, Aborted.
- [Switching to Thread 0xf27bfb40 (LWP 12324)]
- 0xf7fd8be9 in __kernel_vsyscall ()
- (gdb) bt
- #0 0xf7fd8be9 in __kernel_vsyscall ()
- #1 0xf4c7ee89 in __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:54
- #2 0xf4c803e7 in __GI_abort () at abort.c:89
- #3 0xf7b2ef2e in __sanitizer::Abort () at /opt/toolchain/src/gcc-6.2.0/libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cc:122
- #4 0xf7b262fa in __sanitizer::Die () at /opt/toolchain/src/gcc-6.2.0/libsanitizer/sanitizer_common/sanitizer_common.cc:145
- #5 0xf7b21ab3 in __asan::ScopedInErrorReport::~ScopedInErrorReport (this=0xf27be171, __in_chrg=<optimized out>) at /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_report.cc:689
- #6 0xf7b214a5 in __asan::ReportGenericError (pc=166993689, bp=4068206216, sp=4068206204, addr=3925146496, is_write=false, access_size=4, exp=0, fatal=true) at /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_report.cc:1074
- #7 0xf7b21fce in __asan::__asan_report_load4 (addr=3925146496) at /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_rtl.cc:129
- #8 0x09f41f19 in curl_multi_remove_handle (multi=0xf3406080, data=0xde582400) at /path/to/source3rdparty/curl/lib/multi.c:666
- #9 0x09f6b277 in Curl_close (data=0xde582400) at /path/to/source3rdparty/curl/lib/url.c:415
- #10 0x09f3354e in curl_easy_cleanup (data=0xde582400) at /path/to/source3rdparty/curl/lib/easy.c:860
- #11 0x09c6de3f in ...
- #12 0x09c378c5 in ...
- #13 0x09c48133 in ...
- #14 0x09c4d092 in ...
- #15 0x0a2be6b6 in ...
- #16 0xf7aa5781 in asan_thread_start (arg=0xf2d22938) at /opt/toolchain/src/gcc-6.2.0/libsanitizer/asan/asan_interceptors.cc:226
- #17 0xf5de52b5 in start_thread (arg=0xf27bfb40) at pthread_create.c:333
- #18 0xf4d3a16e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:114
-
- Fixes #1083
-
-- testcurl.1: fix the URL to the autobuild summary
-
-- testcurl.1: update URLs
-
-- INSTALL: converted to markdown => INSTALL.md
-
- Also heavily edited for content. Removed lots of old cruft that we added
- like 10+ years ago that is likely incorrect by now.
-
- Also removed INSTALL.devcpp for same reason.
-
-- [Martin Storsjo brought this change]
-
- configure: Check for other variants of the -m*os*-version-min flags
-
- In addition to -miphoneos-version-min, the same version can be set
- using -mios-version-min. And for WatchOS and TvOS, there's
- -mwatchos-version-min and -mtvos-version-min.
-
-- configure: set min version flags for builds on mac
-
- This helps building binaries that can work on multiple macOS versions.
-
- Help-by: Martin Storsjö
-
- Fixes #1069
-
-- curl_multi_add_handle: set timeouts in closure handles
-
- The closure handle only ever has default timeouts set. To improve the
- state somewhat we clone the timeouts from each added handle so that the
- closure handle always has the same timeouts as the most recently added
- easy handle.
-
- Fixes #739
-
-- configure/CURL_CHECK_FUNC_POLL: disable poll completely on mac
-
- ... so that the same libcurl build easier can run on any version.
-
- Follow-up to issue #1057
-
-- RELEASE-NOTES: synced with f36f8c14551efc6772
-
-- test14xx: fixed --libcurl output tests again after 8e8afa82cbb
+- README.md: show the coverall coverage on github
-- s/cURL/curl
-
- The tool was never called cURL, only the project. But even so, we have
- more and more over time switched to just use lower case.
+- lib1521: fix compiler warnings
-- polarssl: indented code, removed unused variables
+- test1521: make the code < 80 columns wide
-- polarssl: reduce #ifdef madness with a macro
+- test1121: use stricter types to work with typcheck-gcc
-- polarssl: fix unaligned SSL session-id lock
+- typecheck-gcc: allow CURLOPT_STDERR to be NULL too
-- Curl_polarsslthreadlock_thread_setup: clear array at init
+- test1521: test *all* curl_easy_setopt options
+
+ mk-lib1521.pl generates a test program (lib1521.c) that calls
+ curl_easy_setopt() for every known option with a few typical values to
+ make sure they work (ignoring the return codes).
+
+ Some small changes were necessary to avoid asserts and NULL accesses
+ when doing this.
+
+ The perl script needs to be manually rerun when we add new options.
- ... since if it fails to init the entire array and then tries to clean
- it up, it would attempt to work on an uninitialized pointer.
+ Closes #1543
-- curl: set INTERLEAVEDATA too
+Dan Fandrich (5 Jun 2017)
+- test1538: added "verbose logs" keyword
- As otherwise the callback could be called with a NULL pointer when RTSP
- data is provided.
+ These error messages are not displayed with --disable-verbose
-- gopher: properly return error for poll failures
+Daniel Stenberg (5 Jun 2017)
+- test1262: verify ftp download with -z for "if older than this"
-- select: switch to macros in uppercase
+Marcel Raad (5 Jun 2017)
+- curl_ntlm_core: use Curl_raw_toupper instead of toupper
- Curl_select_ready() was the former API that was replaced with
- Curl_select_check() a while back and the former arg setup was provided
- with a define (in order to leave existing code unmodified).
+ This was the only remaining use of toupper in the entire source code.
- Now we instead offer SOCKET_READABLE and SOCKET_WRITABLE for the most
- common shortcuts where only one socket is checked. They're also more
- visibly macros.
+ Suggested-by: Daniel Stenberg
-- select: use more proper macro-looking names
+Daniel Stenberg (4 Jun 2017)
+- RELEASE-NOTES: synced with 65ba92650
+
+Marcel Raad (4 Jun 2017)
+- curl_ntlm_core: pass unsigned char to toupper
- ... so that it becomes more obvious in the code what is what. Also added
- a typecast for one of the calculations.
+ Otherwise, clang on Cygwin64 warns:
+ curl_ntlm_core.c:525:35: error: array subscript is of type 'char'
+ [-Werror,-Wchar-subscripts]
+ dest[2 * i] = (unsigned char)(toupper(src[i]));
+ ^~~~~~~~~~~~~~~
+ /usr/include/ctype.h:152:25: note: expanded from macro 'toupper'
+ (void) __CTYPE_PTR[__x]; (toupper) (__x);})
+ ^~~~
-- Curl_socket_check: add extra check to avoid integer overflow
+Jay Satiro (3 Jun 2017)
+- [Mahmoud Samir Fayed brought this change]
-- maketgz: make it support "only" generating version info
+ BINDINGS: add Ring binding
- ... to allow you to update the local repository with the given version
- number data.
+ Closes https://github.com/curl/curl/pull/1539
-Jay Satiro (17 Oct 2016)
-- url: skip to-be-closed connections when pipelining (follow-up)
-
- - Change back behavior so that pipelining is considered possible for
- connections that have not yet reached the protocol level.
+Daniel Stenberg (4 Jun 2017)
+- CONTRIBUTE.md: mention tests done on pull requests
+
+- travis: add coverage, distcheck and cmake builds
- This is a follow-up to e5f0b1a which had changed the behavior of
- checking if pipelining is possible to ignore connections that had
- 'bits.close' set. Connections that have not yet reached the protocol
- level also have that bit set, and we need to consider pipelining
- possible on those connections.
+ Closes #1534
-Daniel Stenberg (17 Oct 2016)
-- HTTP2: mention the tool's limited support
+Marcel Raad (3 Jun 2017)
+- libtest: fix int-in-bool-context warnings
+
+ GCC 7 complained:
+ ‘*’ in boolean context, suggest ‘&&’ instead [-Wint-in-bool-context]
-- RELEASE-NOTES: synced with a1a5cd04877fd6fd
+- libtest: fix implicit-fallthrough warnings with GCC 7
-- [David Woodhouse brought this change]
+- x509asn1: fix implicit-fallthrough warning with GCC 7
- curl: do not set CURLOPT_SSLENGINEDEFAULT automatically
-
- There were bugs in the PKCS#11 engine, and fixing them triggers bugs in
- OpenSSL. Just don't get involved; there's no need to be making the
- engine methods the default anyway.
+- curl_sasl: fix unused-variable warning
- https://github.com/OpenSC/libp11/pull/108
- https://github.com/openssl/openssl/pull/1639
+ This fixes the following warning with CURL_DISABLE_CRYPTO_AUTH,
+ as seen in the autobuilds:
- Merges #1042
+ curl_sasl.c:417:9: warning: unused variable 'serverdata'
+ [-Wunused-variable]
-- KNOWN_BUGS: two more existing problems
+Daniel Stenberg (3 Jun 2017)
+- updatemanpages.pl: error out on too old git version
-Marcel Raad (16 Oct 2016)
-- win: fix Universal Windows Platform build
+Marcel Raad (3 Jun 2017)
+- cyassl: define build macros before including ssl.h
- This fixes a merge error in commit 7f3df80 caused by commit 332e8d6.
+ cyassl/ssl.h needs the macros from cyassl/options.h, so define them
+ before including cyassl/ssl.h the first time, which happens in
+ urldata.h.
+ This broke the build on Ubuntu Xenial, which comes with WolfSSL 3.4.8
+ and therefore redefines the symbols from cyassl/options.h instead of
+ including the header.
- Additionally, this changes Curl_verify_windows_version for Windows App
- builds to assume to always be running on the target Windows version.
- There seems to be no way to determine the Windows version from a
- UWP app. Neither GetVersion(Ex), nor VerifyVersionInfo, nor the
- Version Helper functions are supported.
-
- Bug: https://github.com/curl/curl/pull/820#issuecomment-250889878
- Reported-by: Paul Joyce
-
- Closes https://github.com/curl/curl/pull/1048
+ Closes https://github.com/curl/curl/pull/1536
-Daniel Stenberg (16 Oct 2016)
-- KNOWN_BUGS: minor formatting edit
-
-Jay Satiro (14 Oct 2016)
-- [Rider Linden brought this change]
+Daniel Stenberg (3 Jun 2017)
+- tool_util: remove unused tvdiff_secs and remove tool_ prefix
+
+ Closes #1532
- url: skip to-be-closed connections when pipelining
+- dedotdot: fixed output for ".." and "." only input
- No longer attempt to use "doomed" to-be-closed connections when
- pipelining. Prior to this change connections marked for deletion (e.g.
- timeout) would be erroneously used, resulting in sporadic crashes.
+ Found when updating test 1395, which I did to increase test coverage of
+ this source file...
- As originally reported and fixed by Carlo Wood (origin unknown).
+ Closes #1535
+
+Marcel Raad (2 Jun 2017)
+- mbedtls: make TU-local variable static
- Bug: https://github.com/curl/curl/issues/627
- Reported-by: Rider Linden
+ mbedtls_x509_crt_profile_fr is only used locally.
+ This fixes a missing-variable-declarations warning with clang.
+
+- MD(4|5): silence cast-align clang warning
- Closes https://github.com/curl/curl/pull/1075
- Participation-by: nopjmp@users.noreply.github.com
+ Unaligned access is on purpose here and the warning is harmless on
+ affected architectures. GCC knows that, while clang warns on all
+ architectures.
+
+Daniel Stenberg (2 Jun 2017)
+- test1538: fix typo
+
+- test1538: verify the libcurl strerror API calls
-Daniel Stenberg (13 Oct 2016)
-- vtls: only re-use session-ids using the same scheme
+- curl_endian: remove unused functions
- To make it harder to do cross-protocol mistakes
+ Closes #1529
-Jay Satiro (11 Oct 2016)
-- [Torben Dannhauer brought this change]
+- test1537: dedicated tests of the URL (un)escape API calls
+
+ Closes #1530
- dist: add missing cmake modules to the tarball
+- coverage: run event tests too
- Closes https://github.com/curl/curl/pull/1070
+ ... the torture ones are commented out only because they are slooooow.
-Daniel Stenberg (11 Oct 2016)
-- configure: detect the broken poll() in macOS 10.12
+- build: provide easy code coverage measuring
- Fixes #1057
+ Closes #1528
-- dist: remove PDF and HTML converted docs from the releases
+- typecheck-gcc.h: check CURLINFO_CERTINFO
+
+ ... and update the certinfo.c example accordingly.
+
+ Fixes https://github.com/curl/curl/issues/846
-- [Remo E brought this change]
+- typecheck-gcc.h: check CURLINFO_TLS_SSL_PTR and CURLINFO_TLS_SESSION
+
+ ... so that they get the required "struct curl_tlssessioninfo **"
+ arguments.
- cmake: add nghttp2 support
+- typecheck-gcc.h: separate getinfo slist checks from other pointers
- Closes #922
+ Fixes #1524
-- [Andreas Streichardt brought this change]
+Marcel Raad (1 Jun 2017)
+- curl-compilers.m4: escape square brackets in regex
+
+ Otherwise, they are removed in the final configure file.
+ Also changed sed to "$SED" like in most other calls in this file.
- resolve: add error message when resolving using SIGALRM
+- curl-compilers.m4: fix compiler_num for clang
+
+ "clang -dumpversion" always returns "4.2.1", the GCC version that clang
+ was initially compatible to. Use "clang -v" instead, which returns the
+ actual clang version.
- Closes #1066
+ Fixes https://github.com/curl/curl/issues/1522
+ Closes https://github.com/curl/curl/pull/1523
-- GIT-INFO: remove the Mac 10.1-specific details
+Daniel Stenberg (31 May 2017)
+- examples/externalsocket.c: s/closesocket/closecb
- There shouldn't be many devs out there anymore using such outdated macOS
- versions. And it removes the dead link.
+ ... since closesocket is a function in WinSock.
- Closes #1049
+ Reported-by: Marcel Raad
+ Bug: https://github.com/curl/curl/commit/55fcb8485914700132fd1854c9509b66c955efbe#co
+ mmitcomment-22347818
-- RELEASE-NOTES: spellfix
+Marcel Raad (31 May 2017)
+- lib583: fix compiler warning
+
+ Use CURLMcode for variable 'res' and cast to int where necessary
+ instead of the other way around. Other tests do the same.
+
+ This fixes the following clang warning:
+ lib583.c:68:15: warning: cast from function call of type 'CURLMcode' to
+ non-matching type 'int' [-Wbad-function-cast]
-- RELEASE-NOTES: synced with 82720490628cb53a
+Daniel Stenberg (31 May 2017)
+- CURLOPT_SSH_KEY*.3: typos
- 5 more fixes, 2 more contributors
+ Reported-by: Gisle Vanem
-- [Tobias Stoeckmann brought this change]
+- CURLOPT_STREAM_DEPENDS.3: typo
- smb: properly check incoming packet boundaries
-
- Not all reply messages were properly checked for their lengths, which
- made it possible to access uninitialized memory (but this does not lead
- to out of boundary accesses).
-
- Closes #1052
+- CURLOPT_FNMATCH_FUNCTION.3: also modified example to avoid fcpp issues
-- test557: verify printf() with 128 and 129 arguments
+- CURLOPT_FNMATCH_DATA.3: modified example to avoid fcpp issues
-- mprintf: return error on too many arguments
-
- 128 arguments should be enough for everyone
+- opts: more than 100 more examples for man pages...
+
+- libtest/lib574.c: use correct callback proto
-- ftp: fix Curl_ftpsendf()
+- examples/sampleconv.c: indent changes, made callbacks static
+
+- example/externalsocket.c: make it use CLOSESOCKETFUNCTION too
+
+Marcel Raad (31 May 2017)
+- curl-compilers.m4: enable -Wshift-sign-overflow for clang
- ... it no longer takes printf() arguments since it was only really taken
- advantage by one user and it was not written and used in a safe
- way. Thus the 'f' is removed from the function name and the proto is
- changed.
+ clang 2.9+ supports -Wshift-sign-overflow, which warns about undefined
+ behavior on signed left shifts when shifting by too many places.
- Although the current code wouldn't end up in badness, it was a risk that
- future changes could end up springf()ing too large data or passing in a
- format string inadvertently.
+ Ref: https://github.com/curl/curl/issues/1516
+ Closes https://github.com/curl/curl/pull/1517
-- formpost: avoid silent snprintf() truncation
+Daniel Stenberg (31 May 2017)
+- CURLOPT_PROXY.3: fix test 1140 breakage
+
+Jay Satiro (31 May 2017)
+- build-wolfssl: Sync config with wolfSSL 3.11
+
+ wolfSSL configure script relevant changes from 3.10 to 3.11:
- The previous use of snprintf() could make libcurl silently truncate some
- input data and not report that back on overly large input, which could
- make data get sent over the network in a bad format.
+ - Async threading support added; disabled by default without async
+ crypto, which continues to be disabled by default.
- Example:
+ wolfSSL configure script relevant changes from 3.11 to 3.11.1 (beta):
- $ curl --form 'a=b' -H "Content-Type: $(perl -e 'print "A"x4100')"
+ - TLS 1.3 beta support added; disabled by default.
+
+ For experimenting I put in a comment block the defines needed to enable
+ TLS 1.3 support (ie the equivalent of --enable-tls13).
-- TODO: build: Enable PIE and RELRO by default
+Daniel Stenberg (30 May 2017)
+- opts: more examples added to man pages
-- TODO: Support better than MD5 hostkey hash (for ssh)
+- docs: clarify NO_PROXY further
+
+ Fixes #1208
-- [Daniel Gustafsson brought this change]
+- CURLOPT_PROXY.3: describe the environment variables more
- tests: Fix a small typo in the tests README (#1060)
+- transfer: init the infilesize from the postfields...
+
+ ... with a strlen() if no size was set, and do this in the pretransfer
+ function so that the info is set early. Otherwise, the default strlen()
+ done on the POSTFIELDS data never sets state.infilesize.
- The subdirectory for logs in tests/ is named log/ without an 's'
- at the end.
+ Reported-by: Vincas Razma
+ Bug: #1294
-- TODO: Introduce --fail-fast to exit on first transfer fail
+Jay Satiro (29 May 2017)
+- test557: fix ubsan runtime error due to int left shift
- See #1054
+ - Test curl_msnprintf negative int width arg using INT_MIN instead of
+ 1 << 31 which is undefined behavior.
+
+ Closes https://github.com/curl/curl/issues/1516
-- TODO: Leave secure cookies alone
+- mbedtls: fix variable shadow warning
+
+ vtls/mbedtls.c:804:69: warning: declaration of 'entropy' shadows a global declaration [-Wshadow]
+ CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
+ ^~~~~~~
-- [Rainer Müller brought this change]
+Daniel Stenberg (29 May 2017)
+- RELEASE-NOTES: synced with 3aaac8c2f
- CURLOPT_DEBUGFUNCTION.3: unused argument warning (#1056)
-
- The 'userp' argument is unused in this example code.
+Dan Fandrich (28 May 2017)
+- tests: removed some redundant empty <stdout> sections
-- TODO: TCP Fast Open for windows
+- runtests.pl: removed <precommand> feature
+
+ This hasn't been used in over a decade. <precheck> can still be used to
+ run commands before the main test.
-- RELEASE-NOTES: synced with 8fd2a754f0de
+Daniel Stenberg (27 May 2017)
+- opts: more examples added in option man pages
-- CURLOPT_KEEP_SENDING_ON_ERROR.3: mention when it is added
+Dan Fandrich (27 May 2017)
+- runtests.pl: removed unused arguments to valgrindparse
-- memdup: use 'void *' as return and source type
+Daniel Stenberg (25 May 2017)
+- TODO: 6.4 is done, send telnet data in chunks
-- TODO: Add easy argument to formpost functions
+- [Phil Crump brought this change]
-- formpost: trying to attach a directory no longer crashes
+ docs/CURLOPT_SSLVERSION.3: Correct define name in example
- The error path would previously add a freed entry to the linked list.
+ Closes #1509
+
+- ssh: fix 'left' may be used uninitialized
- Reported-by: Toby Peterson
+ follow-up to f31760e63b4e
- Fixes #1053
-
-- [Sergei Kuzmin brought this change]
+ Reported-by: Michael Kaufmann
+ Bug: https://github.com/curl/curl/pull/1495#issuecomment-303982793
- cookies: same domain handling changed to match browser behavior
+Michael Kaufmann (24 May 2017)
+- time: fix type conversions and compiler warnings
- Cokie with the same domain but different tailmatching property are now
- considered different and do not replace each other. If header contains
- following lines then two cookies will be set: Set-Cookie: foo=bar;
- domain=.foo.com; expires=Thu Mar 3 GMT 8:56:27 2033 Set-Cookie: foo=baz;
- domain=foo.com; expires=Thu Mar 3 GMT 8:56:27 2033
+ Fix bugs and compiler warnings on systems with 32-bit long and
+ 64-bit time_t.
- This matches Chrome, Opera, Safari, and Firefox behavior. When sending
- stored tokens to foo.com Chrome, Opera, Firefox store send them in the
- stored order, while Safari pre-sort the cookies.
+ Reviewed-by: Daniel Stenberg
- Closes #1050
+ Closes #1499
-- [Stephen Brokenshire brought this change]
-
- FAQ: Fix typos in section 5.14 (#1047)
+Marcel Raad (24 May 2017)
+- examples: fix Wimplicit-fallthrough warnings
- Type required for YourClass::func C++ function (using size_t in line
- with the documentation for CURLOPT_WRITEFUNCTION) and missing second
- colon when specifying the static function for CURLOPT_WRITEFUNCTION.
+ This is contained in -Wextra with GCC 7.
-- [Sebastian Mundry brought this change]
+Daniel Stenberg (24 May 2017)
+- [Anatol Belski brought this change]
- KNOWN_BUGS: Fix typos in section 5.8.
+ winbuild: fix the nghttp2 build
- Closes #1046
+ Closes #1321
-- [mundry brought this change]
+GitHub (24 May 2017)
+- [Sergei Nikulov brought this change]
- CONTRIBUTE.md: Fix typo in 'About pull requests' section. (#1045)
+ LDAP: documentation update per #878 changes (#1506)
-- curl.1: --trace supports % for sending to stderr!
+Daniel Stenberg (23 May 2017)
+- redirect: store the "would redirect to" URL when max redirs is reached
+
+ Test 1261 added to verify.
+
+ Reported-by: Lloyd Fournier
+
+ Fixes #1489
+ Closes #1497
-- KNOWN_BUGS: 5.8 configure finding libs in wrong directory
+GitHub (24 May 2017)
+- [Sergei Nikulov brought this change]
-Dan Fandrich (24 Sep 2016)
-- configure: Fixed builds with libssh2 in a custom location
-
- A libssh2 library in the standard system location was being used in
- preference to the desired one while linking.
+ LDAP: fixed checksrc issue
-Daniel Stenberg (23 Sep 2016)
-- SECURITY: remove the top ascii logo
+- [Sergei Nikulov brought this change]
-Michael Kaufmann (22 Sep 2016)
-- New libcurl option to keep sending on error
+ LDAP: using ldap_bind_s on Windows with methods (#878)
- Add the new option CURLOPT_KEEP_SENDING_ON_ERROR to control whether
- sending the request body shall be completed when the server responds
- early with an error status code.
+ * LDAP: using ldap_bind_s on Windows with methods(BASIC/DIGEST/NTLM/AUTONEG)
- This is suitable for manual NTLM authentication.
-
- Reviewed-by: Jay Satiro
+ * ldap: updated per build options handling
- Closes https://github.com/curl/curl/pull/904
+ * ldap: fixed logic for auth selection
-Kamil Dudka (22 Sep 2016)
-- nss: add chacha20-poly1305 cipher suites if supported by NSS
+Daniel Stenberg (23 May 2017)
+- [Akhil Kedia brought this change]
-- nss: add cipher suites using SHA384 if supported by NSS
-
-- nss: fix typo in ecdhe_rsa_null cipher suite string
+ cmake: fix build on Ubuntu 14.04
- As it seems to be a rarely used cipher suite (for securely established
- but _unencrypted_ connections), I believe it is fine not to provide an
- alias for the misspelled variant.
-
-Jay Satiro (21 Sep 2016)
-- docs: Remove that --proto is just used for initial retrieval
+ Fixed a syntax error with setting cache variables (The type and
+ docstring were missing), resulting in build errors. Quoted the
+ CURL_CA_PATH and CURL_CA_BUNDLE otherwise the path was written without
+ quotes in C code, resulting in build errors.
- .. and add that --proto-redir and CURLOPT_REDIR_PROTOCOLS do not
- override protocols denied by --proto and CURLOPT_PROTOCOLS.
+ Closes #1503
- - Add a test to enforce: --proto deny must override --proto-redir allow
+ Signed-off-by: Akhil <akhil.kedia@samsung.com>
+
+- url: fix declaration of 'pipe' shadows a global declaration
- Closes https://github.com/curl/curl/pull/1031
+ follow-up to 4cdb1be8246c
-Daniel Stenberg (21 Sep 2016)
-- dist: add CurlSymbolHiding.cmake to the tarball
+Kamil Dudka (22 May 2017)
+- memdebug: fix compilation failure
- Follow-up to 6140dfcf3e784
+ .... caused by a typo in the last commit (fixing issue #1504):
- Reported-by: Alexander Sinditskiy
+ memdebug.c: In function ‘curl_fclose’:
+ memdebug.c:444:3: error: implicit declaration of function
+ ‘DEBUGDEBUGASSERT’ [-Werror=implicit-function-declaration]
-- curl_global_cleanup.3: don't unload the lib with sub threads running
+Daniel Stenberg (22 May 2017)
+- assert: avoid, use DEBUGASSERT instead!
- Discussed in #997
+ ... as it does extra checks to actually work.
- Assisted-by: Jay Satiro
+ Reported-by: jonrumsey at github
+ Fixes #1504
-- MAIL-ETIQUETTE: language
+- [Simon Warta brought this change]
-Jay Satiro (20 Sep 2016)
-- easy: Reset all statistical session info in curl_easy_reset
-
- Bug: https://github.com/curl/curl/issues/1017
- Reported-by: Jeroen Ooms
+ cmake: remove unused variables: GNUTLS_ENABLED, NSS_ENABLED
+
+- [Simon Warta brought this change]
-Daniel Stenberg (19 Sep 2016)
-- RELEASE-NOTES: synced with 79607eec51055
+ cmake: remove CURL_CA_BUNDLE from cmake TODO
-Jay Satiro (19 Sep 2016)
-- [Daniel Gustafsson brought this change]
+- [Simon Warta brought this change]
- darwinssl: Fix typo in comment
+ cmake: auto detection of CURL_CA_BUNDLE/CURL_CA_PATH
- Closes https://github.com/curl/curl/pull/1028
+ Closes #1461
-Daniel Stenberg (19 Sep 2016)
-- [Bernard Spil brought this change]
+- [Simon Warta brought this change]
- libressl: fix version output
-
- LibreSSL defines `OPENSSL_VERSION_NUMBER` as `0x20000000L` for all
- versions returning `LibreSSL/2.0.0` for any LibreSSL version.
-
- This change provides a local OpenSSL_version_num function replacement
- returning LIBRESSL_VERSION_NUMBER instead.
-
- Closes #1029
+ cmake: add CURL_CA_BUNDLE/CURL_CA_FALLBACK/CURL_CA_PATH options
-- [rugk brought this change]
+- [Simon Warta brought this change]
- TODO: Add PINNEDPUBLICKEY - HPKP compatibility, HSTS & HPKP
+ cmake: Add CURL_CA_FALLBACK to curl_config.h.cmake
- Closes #1025
- Closes #1026
- Closes #1027
+ This is for symmetry with the autoconf generated curl_config.h.in
-- openssl: don't call ERR_remote_thread_state on >= 1.1.0
+- RELEASE-NOTES: synced with 052a14e3c
+
+Michael Kaufmann (20 May 2017)
+- tests: stabilize test 1034
+
+ Pass the invalid domain name on stdin. On some systems, the test
+ framework cannot pass invalid UTF-8 sequences on the command line.
- Follow-up fix to d9321562
+ Closes #1488
-- openssl: don’t call CRYTPO_cleanup_all_ex_data
+Daniel Stenberg (20 May 2017)
+- ssh: ignore timeouts during disconnect
- The OpenSSL function CRYTPO_cleanup_all_ex_data() cannot be called
- multiple times without crashing - and other libs might call it! We
- basically cannot call it without risking a crash. The function is a
- no-op since OpenSSL 1.1.0.
+ ... as otherwise it risks not cleaning up the libssh2 handle properly
+ which leads to memory leak!
- Not calling this function only risks a small memory leak with OpenSSL <
- 1.1.0.
+ Assisted-by: Joel Depooter
- Bug: https://curl.haxx.se/mail/lib-2016-09/0045.html
- Reported-by: Todd Short
-
-- TODO: Support SSLKEYLOGFILE
+ Closes #1495
+ Closes #1479
+
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0024.html
-Jay Satiro (18 Sep 2016)
-- CURLOPT_PINNEDPUBLICKEY.3: fix the AVAILABILITY formatting
+- ghiper.c/hiperfifo.c: add comment about missing timer functionality
+
+ It takes someone to read up on the APIs of these libraries to figure out
+ how to do this correctly.
+
+ Reported-by: Michael Kaufmann
+
+ Closes #1253
-Nick Zitzmann (18 Sep 2016)
-- darwinssl: disable RC4 cipher-suite support
+- asiohiper.cpp / evhiperfifo.c: deal with negative timerfunction input
+
+ That means delete the timer.
- RC4 was a nice alternative to CBC back in the days of BEAST, but it's insecure and obsolete now.
+ Reported-by: Michael Kaufmann
+ Ref: #1253
-- configure: change "iOS/Mac OS X native" to "Apple OS native"
+- cmdline-opts/write-out.d: s/-L/--location
- Since I first wrote that text, Apple introduced tvOS and watchOS, and renamed "Mac OS X" to "macOS." Let's make the text a little more inclusive, since curl can be built for all four operating systems.
+ Since the man page generator wants the long option name version to
+ generate the proper output.
-Jay Satiro (18 Sep 2016)
-- test2048: fix url
+- [Bernhard M. Wiedemann brought this change]
-- examples/imap-append: Set size of data to be uploaded
+ mkhelp.pl: do not add current time into curl binary
- Prior to this commit this example failed with error
- 'Cannot APPEND with unknown input file size'.
+ ... as part of hugehelpgz rodata to make build reproducible.
- Bug: https://github.com/curl/curl/issues/1008
- Reported-by: lukaszgn@users.noreply.github.com
+ See https://reproducible-builds.org/ for why this is good
- Closes https://github.com/curl/curl/pull/1011
+ Closes #1490
-Daniel Stenberg (16 Sep 2016)
-- [Tony Kelman brought this change]
+- oauth2-bearer.d: mention the <token> argument
- LICENSE-MIXING.md: update with mbedTLS dual licensing
+Nick Zitzmann (16 May 2017)
+- darwinssl: Fix exception when processing a client-side certificate file
+ if no error was raised by the API but the SecIdentityRef was null
- Recent versions of mbedTLS are available under either Apache 2.0 or GPL
- 2.0, see https://tls.mbed.org/how-to-get
+ Fixes #1450
+
+Daniel Stenberg (16 May 2017)
+- curl_sasl: fix build error with CURL_DISABLE_CRYPTO_AUTH + USE_NTLM
- Closes #1019
+ Reported-by: wyattoday at github
+ Fixes #1487
-- KNOWN_BUGS: chunked-encoded requests with HTTP/2 is fixed
+- docs/cmdline-opts/config.d: edit for language
-- http2: debug ouput sent HTTP/2 request headers
+- RELEASE-NOTES: synced with eb16305e6
-- http: accept "Transfer-Encoding: chunked" for HTTP/2 as well
-
- ... but don't send the actual header over the wire as it isn't accepted.
- Chunked uploading is still triggered using this method.
-
- Fixes #1013
- Fixes #662
+- [moparisthebest brought this change]
-- openssl: fix per-thread memory leak usiong 1.0.1 or 1.0.2
+ SecureTransport/DarwinSSL: Implement public key pinning
- OpenSSL 1.0.1 and 1.0.2 build an error queue that is stored per-thread
- so we need to clean it when easy handles are freed, in case the thread
- will be killed in which the easy handle was used. All OpenSSL code in
- libcurl should extract the error in association with the error already
- so clearing this queue here should be harmless at worst.
+ Closes #1400
+
+- man pages: fix example syntax errors
- Fixes #964
+ follow-up to 5ddad099b42b50
-- RELEASE-NOTES: reset and go toward 7.51.0 (again)
+- docs/libcurl/opts: added more examples in man pages
-Version 7.50.3 (14 Sep 2016)
+- CURLOPT_HTTPPROXYTUNNEL: clarify, add example
-Daniel Stenberg (14 Sep 2016)
-- THANKS: updated with curl 7.50.3 contributors
+- curl: show the libcurl release date in --version output
+
+ ... and support and additional "security patched" date for those who
+ enhance older versions that way. Pass on the define CURL_PATCHSTAMP with
+ a date for that.
+
+ Building with non-release headers shows the date as [unreleased].
+
+ Also: this changes the date format generated in the curlver.h file to be
+ "YYYY-MM-DD" (no name of the day or month, no time, no time zone) to
+ make it easier on the eye and easier to parse. Example (new) date
+ string: 2017-05-09
+
+ Suggested-by: Brian Childs
+
+ Closes #1474
+
+Dan Fandrich (13 May 2017)
+- url.c: add a compile-time check that CURL_MAX_WRITE_SIZE is large enough
+
+ Some code (e.g. Curl_fillreadbuffer) assumes that this buffer is not
+ exceedingly tiny and will break if it is. This same check is already
+ done at run time in the CURLOPT_BUFFERSIZE option.
-- RELEASE-NOTES: curl 7.50.3
+- lib510: don't write past the end of the buffer if it's too small
-- test1605: verify negative input lengths to (un)escape functions
+- tests: added missing keywords "chunked Transfer-Encoding"
-- curl_easy_unescape: deny negative string lengths as input
+Daniel Stenberg (13 May 2017)
+- THANKS: add a few missing names
- CVE-2016-7167
+ ... I found them in the commit logs from the early years
+
+Dan Fandrich (13 May 2017)
+- tests: made a couple of prechecks consistent with others
- Bug: https://curl.haxx.se/docs/adv_20160914.html
+ Also removed a TODO suggesting caching the precheck results. Tests
+ showed this would save about 0.1 sec on the total test run time on a
+ relatively modern system, an unnoticeable gain at the cost of longer and
+ more complicated code. There would also be a danger that a cached test
+ result would be inappropriately returned, such as when other test
+ dependencies (like environment variables) are different or when the
+ precheck causes side effects (like filesystem changes).
-- curl_easy_escape: deny negative string lengths as input
+Daniel Stenberg (12 May 2017)
+- FAQ: add 7.4 to toc
- CVE-2016-7167
+ ... and delete trailing whitespace
- Bug: https://curl.haxx.se/docs/adv_20160914.html
+ Fixes #1484
-- curl: make --create-dirs on windows grok both forward and backward slashes
+- multi: remove leftover debug infof() calls from e9fd794a6
+
+- pipeline: fix mistakenly trying to pipeline POSTs
- Reported-by: Ryan Scott
+ The function IsPipeliningPossible() would return TRUE if either
+ pipelining OR HTTP/2 were possible on a connection, which would lead to
+ it returning TRUE even for POSTs on HTTP/1 connections.
- Fixes #1007
-
-- RELEASE-NOTES: synced with 665694979b6
+ It now returns a bitmask so that the caller can differentiate which kind
+ the connection allows.
+
+ Fixes #1481
+ Closes #1483
+ Reported-by: stootill at github
-- [Tony Kelman brought this change]
+Jay Satiro (12 May 2017)
+- [Ron Eldor brought this change]
- mbedtls: switch off NTLM in build if md4 isn't available
+ mbedtls: Support server renegotiation request
- NTLM support with mbedTLS was added in 497e7c9 but requires that mbedTLS
- is built with the MD4 functions available, which it isn't in default
- builds. This now adapts if the funtion isn't there and builds libcurl
- without NTLM support if so.
+ Tested with servers: IIS 7.5; OpenSSL 1.0.2.
- Fixes #1004
+ Closes https://github.com/curl/curl/pull/1475
-Jay Satiro (12 Sep 2016)
-- CODE_STYLE: fix long-line guideline
+Marcel Raad (11 May 2017)
+- cookie_interface: fix -Wcomma warning
- - Change maximum allowed line length from 80 to 79.
+ clang 5.0 complains:
+ possible misuse of comma operator here [-Wcomma]
-- CODE_STYLE: add column alignment section
+- formdata: fix -Wcomma warning
+
+ clang 5.0 complains:
+ possible misuse of comma operator here [-Wcomma]
- Note that since the added examples are for column alignment I had to
- encapsulate with ~~~c markdown to preserve their alignment.
+ Change the comma to a semicolon to fix that.
-Peter Wu (11 Sep 2016)
-- cmake: fix curl-config --static-libs
+Daniel Stenberg (10 May 2017)
+- multi: use a fixed array of timers instead of malloc
- The `curl-config --static-libs` command should not output paths like
- -l/usr/lib/libssl.so, instead print the absolute path without `-l`.
+ ... since the total amount is low this is faster, easier and reduces
+ memory overhead.
- This also removes the confusing message "Static linking is broken" which
- was printed because curl-config --static-libs was disfunctional even
- though the static libcurl.a library works properly.
+ Also, Curl_expire_done() can now mark an expire timeout as done so that
+ it never times out.
- Fixes https://github.com/curl/curl/issues/841
+ Closes #1472
-Daniel Stenberg (11 Sep 2016)
-- http: refuse to pass on response body with NO_NODY was set
-
- ... like when a HTTP/0.9 response comes back without any headers at all
- and just a body this now prevents that body from being sent to the
- callback etc.
-
- Adapted test 1144 to verify.
+- multi: assign IDs to all timers and make each timer singleton
- Fixes #973
+ A) reduces the timeout lists drastically
- Assisted-by: Ray Satiro
+ B) prevents a lot of superfluous loops for timers that expires "in vain"
+ when it has actually already been extended to fire later on
-- RELEASE-NOTES: synced with 257bf3ac67eb6
+- [Richard Hsu brought this change]
-Jakub Zakrzewski (10 Sep 2016)
-- CMake: Don't build unit tests if private symbols are hidden
+ tests: remove superfluous test 1399
- This only excludes building unit tests from default build ( 'all' Make
- target or "Build Solution" in VisualStudio). The projects and Make
- targets will still be generated and shown in supporting IDEs.
+ @MarcelRaad noted that `test1399` causes infinite loop on MinGW.
+ Looking into this, seems like it is related to how Windows handles
+ CRLF. See https://github.com/curl/curl/commit/9e093f by @mback2k.
+ Removing `test1399` as it's identical to `test1326` then with such a
+ fix.
- Fixes https://github.com/curl/curl/issues/981
- Reported-by: Randy Armstrong
+ Test 1399 was broughy by commit 862b02f8947039e
- Closes https://github.com/curl/curl/pull/990
+ Closes #1478
-- CMake: Try to (un-)hide private library symbols
-
- Detect support for compiler symbol visibility flags and apply those
- according to CURL_HIDDEN_SYMBOLS option.
- It should work true to the autotools build except it tries to unhide
- symbols on Windows when requested and prints warning if it fails.
+Dan Fandrich (9 May 2017)
+- tests: make test file names more unique
- Ref: https://github.com/curl/curl/issues/981#issuecomment-242665951
- Reported-by: Daniel Stenberg
+ Include the test number in the names of files written out by tests to
+ reduce the chance of accidental duplication and to make it more clear
+ which test is associated with which file.
-Daniel Stenberg (9 Sep 2016)
-- openssl: fix bad memory free (regression)
+- tests: removed redundant --trace-ascii arguments
- ... by partially reverting f975f06033b1. The allocation could be made by
- OpenSSL so the free must be made with OPENSSL_free() to avoid problems.
+ This is already added by the test suite; it's not clear why all these
+ tests had it, unless it's cargo-culting.
+
+Marcel Raad (9 May 2017)
+- tool: fix remaining -Wcast-qual warnings
- Reported-by: Harold Stuart
- Fixes #1005
+ Avoid casting away low-level const.
-- http2: support > 64bit sized uploads
+Daniel Stenberg (9 May 2017)
+- formboundary: convert assert into run-time check
- ... by making sure we don't count down the "upload left" counter when the
- uploaded size is unknown and then it can be allowed to continue forever.
+ ... to really make sure the boundary fits in the target buffer.
- Fixes #996
+ Fixes unused parameter 'buflen' warning.
+
+ Reported-by: Michael Kaufmann
+ Bug: https://github.com/curl/curl/pull/1468#issuecomment-300078754
+
+Dan Fandrich (9 May 2017)
+- tests: list the primary server first in the server section
-Jay Satiro (7 Sep 2016)
-- errors: new alias CURLE_WEIRD_SERVER_REPLY (8)
+Daniel Stenberg (8 May 2017)
+- curl: generate the --help output
- Since we're using CURLE_FTP_WEIRD_SERVER_REPLY in imap, pop3 and smtp as
- more of a generic "failed to parse" introduce an alias without FTP in
- the name.
+ ... using the docs/cmdline-opts/gen.pl script, so that we get all the
+ command line option documentation from the same source.
- Closes https://github.com/curl/curl/pull/975
+ The generation of the list has to be done manually and pasted into the
+ source code.
+
+ Closes #1465
-Daniel Stenberg (7 Sep 2016)
-- bump: toward 7.51.0
+- tests: updated for modified fake random
-- HISTORY: remove ascii logo to render nicer on web
+- [Jay Satiro brought this change]
-- curl: whitelist use of strtok() in non-threaded context
+ rand: treat fake entropy the same regardless of endianness
+
+ When the random seed is purposely made predictable for testing purposes
+ by using the CURL_ENTROPY environment variable, process that data in an
+ endian agnostic way so the the initial random seed is the same
+ regardless of endianness.
+
+ - Change Curl_rand to write to a char array instead of int array.
+
+ - Add Curl_rand_hex to write random hex characters to a buffer.
+
+ Fixes #1315
+ Closes #1468
+
+ Co-authored-by: Daniel Stenberg
+ Reported-by: Michael Kaufmann
-- checksrc: detect strtok() use
+Dan Fandrich (8 May 2017)
+- tests: give each stunnel.conf file a unique name
- ... as that function slipped through once before.
+ Otherwise, subsequent uses of stunnel overwrite the configuration file
+ of previous invocations so they can no longer be inspected.
-GitHub (7 Sep 2016)
-- [Viktor Szakats brought this change]
+Marcel Raad (8 May 2017)
+- tool_msgs: remove wrong cast
+
+ Commit 481e0de00a9003b9c5220b120e3fc302d9b0932d changed the variable
+ type from int to size_t, so don't cast the result of strlen to int
+ anymore.
- mk-ca-bundle.pl: use SHA256 instead of SHA1
+- tftpd: fix signed/unsigned mismatch warnings
- This hash is used to verify the original downloaded certificate bundle
- and also included in the generated bundle's comment header. Also
- rename related internal symbols to algorithm-agnostic names.
+ alarm's argument is unsigned.
-Version 7.50.2 (7 Sep 2016)
+- libtest: fix MinGW-w64 warnings
+
+ long is 32 bits while size_t is 64 bits on MinGW-w64, so
+ typecheck-gcc.h complains when using size_t for a long option.
+ Also, curl_socket_t is unsigned long long rather than int.
-Daniel Stenberg (7 Sep 2016)
-- RELEASE-NOTES: curl 7.50.2 release
+Daniel Stenberg (8 May 2017)
+- curl.1: depend the build on the Makefile.inc too
+
+ ... to also make it update when we remove files, like we did for
+ --environment in commit a8e388dd1095.
-- THANKS: updated for 7.50.2
+- RELEASE-NOTES: synced with e3f84efc32d6b01a
-Jay Satiro (6 Sep 2016)
-- [Gaurav Malhotra brought this change]
+- runtests: fix "use of undefined value" warning in -R handling
- openssl: fix CURLINFO_SSL_VERIFYRESULT
+Marcel Raad (8 May 2017)
+- test537: use correct variable type
- CURLINFO_SSL_VERIFYRESULT does not get the certificate verification
- result when SSL_connect fails because of a certificate verification
- error.
+ Avoids narrowing conversion warnings because rlim_t is usually
+ unsigned long.
- This fix saves the result of SSL_get_verify_result so that it is
- returned by CURLINFO_SSL_VERIFYRESULT.
-
- Closes https://github.com/curl/curl/pull/995
+ Closes https://github.com/curl/curl/pull/1469
-Daniel Stenberg (6 Sep 2016)
-- [Daniel Gustafsson brought this change]
+- sendrecv: fix MinGW-w64 warning
+
+ The first argument to select is an int, while curl_socket_t is
+ unsigned long long when using WinSock. It's ignored anyway [1].
+
+ [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141.aspx
- darwinssl: test for errSecSuccess in PKCS12 import rather than noErr (#993)
+- tool_parsecfg: fix -Wcast-qual warning
- While noErr and errSecSuccess are defined as the same value, the API
- documentation states that SecPKCS12Import() returns errSecSuccess if
- there were no errors in importing. Ensure that a future change of the
- defined value doesn't break (however unlikely) and be consistent with
- the API docs.
+ Don't convert string literal to char * before assigning it to
+ const char *.
-- [Daniel Gustafsson brought this change]
+- asyn-thread: fix unused macro warnings
+
+ Don't do anything in this file if CURLRES_THREADED is not defined.
- docs: Fix link to CONTRIBUTE in Github contribution guidelines (#994)
+- tftp: silence bad-function-cast warning
+
+ The cases this warns about are handled elsewhere, so just use an
+ intermediate variable to silence the warning.
-- [Marcel Raad brought this change]
+Daniel Stenberg (7 May 2017)
+- [canavan at github brought this change]
- openssl: Fix compilation with OPENSSL_API_COMPAT=0x10100000L
+ buildconf: fix hang on IRIX
- With OPENSSL_API_COMPAT=0x10100000L (OpenSSL 1.1 API), the cleanup
- functions are unavailable (they're no-ops anyway in OpenSSL 1.1). The
- replacements for SSL_load_error_strings, SSLeay_add_ssl_algorithms, and
- OpenSSL_add_all_algorithms are called automatically [1][2]. SSLeay() is
- now called OpenSSL_version_num().
+ Apparently, /usr/bin/m4 ignores the --version parameter and waits for
+ input from stdin.
- [1]: https://www.openssl.org/docs/man1.1.0/ssl/OPENSSL_init_ssl.html
- [2]: https://www.openssl.org/docs/man1.1.0/crypto/OPENSSL_init_crypto.html
+ Fixes #1471
+
+- opts: fix bad example formatting \n => \\n
- Closes #992
+ ...to render properly nroff.
-- RELEASE-NOTES: synced with 3d4c0c8b9bc1d
+- opts: examples added to 8 more libcurl option man pages
-- http2: return EOF when done uploading without known size
+- curl: remove tool_writeenv.[ch]
+
+ ... and USE_ENVIRONMENT and --environment. It was once added for RISC OS
+ support and its platform specific behavior has been annoying ever
+ since. Added in commit c3c8bbd3b2688da8e, mostly unchanged since
+ then. Most probably not actually used for years.
- Fixes #982
+ Closes #1463
-- http2: skip the content-length parsing, detect unknown size
+Dan Fandrich (6 May 2017)
+- runtests.pl: simplify the datacheck read section
+
+ Also, document that numbered datacheck sections are possible.
-- http2: minor white space edit
+Marcel Raad (5 May 2017)
+- tests: fix -Wcast-qual warnings
+
+ Avoid casting string literals to non-const char *.
-- http2: use named define instead of magic constant in read callback
+Daniel Stenberg (5 May 2017)
+- docs/opts: 24 more man pages now have examples
-- [Craig Davison brought this change]
+- docs/opts: 23 more man pages now have examples
- configure: make the cpp -P detection not clobber CPPFLAGS
-
- CPPPFLAGS is now CPPPFLAG. Fixes CURL_CHECK_DEF.
-
- Fixes #958
+- tests/server: run checksrc by default in debug-builds
-- [Olivier Brunel brought this change]
+- curl_slist_append.3: clarify a NULL input creates a new list
- speed caps: not based on average speeds anymore
+Marcel Raad (5 May 2017)
+- unit1305: fix compiler warning
- Speed limits (from CURLOPT_MAX_RECV_SPEED_LARGE &
- CURLOPT_MAX_SEND_SPEED_LARGE) were applied simply by comparing limits
- with the cumulative average speed of the entire transfer; While this
- might work at times with good/constant connections, in other cases it
- can result to the limits simply being "ignored" for more than "short
- bursts" (as told in man page).
+ calloc and ai_addrlen expect different (usually unsigned) types.
+
+Daniel Stenberg (5 May 2017)
+- runtests: use -R for random order
- Consider a download that goes on much slower than the limit for some
- time (because bandwidth is used elsewhere, server is slow, whatever the
- reason), then once things get better, curl would simply ignore the limit
- up until the average speed (since the beginning of the transfer) reached
- the limit. This could prove the limit useless to effectively avoid
- using the entire bandwidth (at least for quite some time).
+ Suggested-by: Dan Fandrich
+
+- runtests: add -o to run test cases in scrambled order
- So instead, we now use a "moving starting point" as reference, and every
- time at least as much as the limit as been transferred, we can reset
- this starting point to the current position. This gets a good limiting
- effect that applies to the "current speed" with instant reactivity (in
- case of sudden speed burst).
+ ... instead of numerical order.
- Closes #971
+ Closes #1466
-- HISTORY.md: the multi socket was put in the wrong year!
+Dan Fandrich (4 May 2017)
+- sockfilt.c: shortened too long line
-- [Mark Hamilton brought this change]
+Marcel Raad (4 May 2017)
+- tests/server: make string literals const
+
+ assign string literals to const char * instead of char * in order to
+ avoid a lot of these warnings:
+ cast from 'const char *' to 'char *' drops const qualifier
+ [-Wcast-qual]
- tool_helpers.c: fix comment typo (#989)
+Dan Fandrich (4 May 2017)
+- schannel: return a more specific error code for SEC_E_UNTRUSTED_ROOT
-- [Mark Hamilton brought this change]
+- test557: set a known good numeric locale
+
+ Windows does not allow setting the locale with environment variables (as
+ the test attempted to do), so the test failed when run with a user
+ locale that has a comma as radixchar. Changed the test to call
+ setlocale() explicitly to ensure that a known working locale is set even
+ on Windows.
- libtest/test.h: fix typo (#988)
+Daniel Stenberg (4 May 2017)
+- curl: fix warning "comma at end of enumerator list"
-- CURLMOPT_PIPELINING.3: language
+- test559: verify use of minimum CURLOPT_BUFFERSIZE
-- CURLMOPT_PIPELINING.3: extended and clarified
+Marcel Raad (4 May 2017)
+- curl_setup_once: use SEND_QUAL_ARG2 for swrite
- Especially in regards to the multiplexing part.
-
-Steve Holme (31 Aug 2016)
-- curl_sspi.c: Updated function description comments
+ SEND_QUAL_ARG2 had to be set, but was never used. Use it in swrite to
+ avoid warnings about casting away low-level const.
- * Added description to Curl_sspi_free_identity()
- * Added parameter and return explanations to Curl_sspi_global_init()
- * Added parameter explaination to Curl_sspi_global_cleanup()
+ Closes https://github.com/curl/curl/pull/1464
-- README: Corrected the supported Visual Studio versions
-
- Missed from commit 8356022d17.
+Daniel Stenberg (4 May 2017)
+- CURLINFO_REDIRECT_URL.3: add example
-- KNOWN_BUGS: Move the Visual Studio project shortcomings from local README
+- CURLINFO_EFFECTIVE_URL.3: add example
-- KNOWN_BUGS: Expand 6.4 to include Kerberos V5
+Marcel Raad (3 May 2017)
+- lib: fix compiler warnings
- ...and discuss a possible solution.
+ Fix the following warnings when building the tests by using the correct
+ types:
+ cast from 'const char *' to 'void *' drops const qualifier
+ [-Wcast-qual]
+ implicit conversion changes signedness [-Wsign-conversion]
-Daniel Stenberg (30 Aug 2016)
-- connect: fix #ifdefs for debug versions of conn/streamclose() macros
-
- CURLDEBUG is for the memory debugging
-
- DEBUGBUILD is for the extra debug stuff
+- typecheck-gcc: add support for CURLINFO_SOCKET
- Pointed-out-by: Steve Holme
+ Closes https://github.com/curl/curl/pull/1452
-- KNOWN_BUGS: mention some cmake "support gaps"
-
-Nick Zitzmann (28 Aug 2016)
-- darwinssl: add documentation stating that the --cainfo option is intended for backward compatibility only
+- typecheck-gcc: add missing string options
- In other news, I changed one other reference to "Mac OS X" in the documentation (that I previously wrote) to say "macOS" instead.
+ Closes https://github.com/curl/curl/pull/1452
-Daniel Stenberg (28 Aug 2016)
-- http2: return CURLE_HTTP2_STREAM for unexpected stream close
-
- Follow-up to c3e906e9cd0f, seems like a more appropriate error code
-
- Suggested-by: Jay Satiro
+Daniel Stenberg (3 May 2017)
+- abstract-unix-socket.d: shorten the help text to fit within 79 cols
-- [Tatsuhiro Tsujikawa brought this change]
+- RELEASE-NOTES: synced with 862b02f89
+
+- [Richard Hsu brought this change]
- http2: handle closed streams when uploading
+ Telnet: Write full buffer instead of byte-by-byte
- Fixes #986
+ Previous TODO wanting to write in chunks. We should support writing more
+ at once since some TELNET servers may respond immediately upon first
+ byte written such as WHOIS servers.
+
+ Closes #1389
-- http2: make sure stream errors don't needlessly close the connection
+- curl: non-boolean command line args reject --no- prefixes
- With HTTP/2 each transfer is made in an indivial logical stream over the
- connection, making most previous errors that caused the connection to get
- forced-closed now instead just kill the stream and not the connection.
+ ... and instead properly respond with an error message to the user
+ instead of silently ignoring.
- Fixes #941
+ Fixes #1453
+ Closes #1458
-- Curl_verify_windows_version: minor edit to avoid compiler warnings
+Marcel Raad (2 May 2017)
+- testpart: remove _MPRINTF_REPLACE
- ... instead of if() before the switch(), add a default to the switch so
- that the compilers don't warn on "warning: enumeration value
- 'PLATFORM_DONT_CARE' not handled in switch" anymore.
+ Support for _MPRINTF_REPLACE in mprintf.h was removed in
+ 55452ebdff47f98bf3cc383f1dfc3623fcaefefd, replaced with curl_printf.h.
-Steve Holme (27 Aug 2016)
-- RELEASE-NOTES: Added missing fix from commit 15592143f
+Dan Fandrich (2 May 2017)
+- gtls: fixed a lingering BUFSIZE reference
-Jay Satiro (26 Aug 2016)
-- schannel: Disable ALPN for Wine since it is causing problems
-
- - Disable ALPN on Wine.
-
- - Don't pass input secbuffer when ALPN is disabled.
-
- When ALPN support was added a change was made to pass an input secbuffer
- to initialize the context. When ALPN is enabled the buffer contains the
- ALPN information, and when it's disabled the buffer is empty. In either
- case this input buffer caused problems with Wine and connections would
- not complete.
+Daniel Stenberg (2 May 2017)
+- ssh: fix compiler warning from e40e9d7f0de
+
+- url: let CURLOPT_BUFFERSIZE realloc to smaller sizes too
- Bug: https://github.com/curl/curl/issues/983
- Reported-by: Christian Fillion
+ Closes #1449
+
+- BUFSIZE: rename to READBUFFER_*, make separate MASTERBUF_SIZE
-Kamil Dudka (26 Aug 2016)
-- [Peter Wang brought this change]
+- openssl: use local stack for temp storage
- nss: work around race condition in PK11_FindSlotByName()
+- sendf: remove use of BUFSIZE from debug data conversions
- Serialise the call to PK11_FindSlotByName() to avoid spurious errors in
- a multi-threaded environment. The underlying cause is a race condition
- in nssSlot_IsTokenPresent().
+ The buffer can have other sizes.
+
+- buffer: use data->set.buffer_size instead of BUFSIZE
- Bug: https://bugzilla.mozilla.org/1297397
+ ... to properly use the dynamically set buffer size!
+
+- krb5: use private buffer for temp string, not receive buffer
+
+- upload: UPLOAD_BUFSIZE is now for the upload buffer
+
+- unit1606: do not print/access buffer
- Closes #985
+ It was a wrong assumption that it could do that!
-- nss: refuse previously loaded certificate from file
+- http-proxy: use a dedicated CONNECT response buffer
- ... when we are not asked to use a certificate from file
+ To make it suitably independent of the receive buffer and its flexible
+ size.
-Daniel Stenberg (26 Aug 2016)
-- ftp_done: remove dead code
+- transfer: fix minor buffer_size mistake
-- TLS: random file/egd doesn't have to match for conn reuse
+- failf: use private buffer, don't clobber receive buffer
-- test161: add comment for the exit code
+- pingpong: use the set buffer size
-Dan Fandrich (26 Aug 2016)
-- test219: Add http as a required feature
+- http2: use the correct set buffer size
-Daniel Stenberg (25 Aug 2016)
-- [Michael Kaufmann brought this change]
+- http: don't clobber the receive buffer for timecond
- HTTP: stop parsing headers when switching to unknown protocols
+- buffer_size: make sure it always has the correct size
- - unknown protocols probably won't send more headers (e.g. WebSocket)
- - improved comments and moved them to the correct case statements
+ Removes the need for CURL_BUFSIZE
+
+- file: use private buffer for C-L output
- Closes #899
+ ... instead of clobbering the download buffer.
-- openssl: make build with 1.1.0 again
+- CURLOPT_BUFFERSIZE: 1024 bytes is now the minimum size
- synced with OpenSSL git master commit cc06906707
+ The buffer is needed to receive FTP, HTTP CONNECT responses etc so
+ already at this size things risk breaking and smaller is certainly not
+ wise.
-- INTERNALS: fix title
+- ftp: use private buffer for temp storage, not receive buffer
-- configure: detect zlib with our pkg-config macros
-
- ... instead of relying on the pkg-config autoconf macros to be present.
+- http: use private user:password output buffer
- Fixes #972 (again...)
+ Don't clobber the receive buffer.
-Jay Satiro (25 Aug 2016)
-- http2: Remove incorrect comments
+Marcel Raad (1 May 2017)
+- anyauthput: remove unused code
- .. also remove same from scp
+ The definition of TRUE was introduced in
+ 4a728747e6f8845e500910e397dfc99aaf4a7984 and is not used anymore since
+ e664cd5826d43930fcc5b5dbaedbec94af33184b.
+ The usage of intptr_t was removed in
+ 32e38b8f42477cf5ce3c3fef2fcc9db82f7fb7be.
-Daniel Stenberg (23 Aug 2016)
-- [Ales Novak brought this change]
-
- ftp: fix wrong poll on the secondary socket
+Jay Satiro (1 May 2017)
+- tool: Fix missing prototype warnings for CURL_DOES_CONVERSIONS
- When we're uploading using FTP and the server issues a tiny pause
- between opening the connection to the client's secondary socket, the
- client's initial poll() times out, which leads to second poll() which
- does not wait for POLLIN on the secondary socket. So that poll() also
- has to time out, creating a long (200ms) pause.
+ - Include tool_convert.h where needed.
- This patch adds the correct flag to the secondary socket, making the
- second poll() correctly wait for the connection there too.
+ Bug: https://github.com/curl/curl/issues/1460
+ Reported-by: Gisle Vanem
+
+- curl_setup: Ensure no more than one IDN lib is enabled
- Signed-off-by: Ales Novak <alnovak@suse.cz>
+ Prior to this change it was possible for libcurl to be built with both
+ Windows' native IDN lib (normaliz) and libidn2 enabled. It appears that
+ doesn't offer any benefit --and could cause a bug-- since libcurl's IDN
+ handling is written to use either one but not both.
- Closes #978
-
-- RELEASE-NOTES: synced with 95ded2c56
+ Bug: https://github.com/curl/curl/issues/1441#issuecomment-297689856
+ Reported-by: Gisle Vanem
-- configure: make it work without PKG_CHECK_MODULES
-
- With commit c2f9b78 we added a new dependency on pkg-config for
- developers which may be unwanted. This change make the configure script
- still work as before if pkg-config isn't installed, it'll just use the
- old zlib detection logic without pkg-config.
+Marcel Raad (1 May 2017)
+- getpart: use correct variable type
- Reported-by: Marc Hörsken
+ This fixes the following clang warning:
+ getpart.c:201:17: warning: cast from function call of type 'CURLcode'
+ to non-matching type 'int' [-Wbad-function-cast]
+
+- tests: declare TU-local variables static
- Fixes #972
+ This fixes missing-variable-declarations warnings when building with
+ clang.
-Marc Hoersken (21 Aug 2016)
-- Revert "KNOWN_BUGS: SOCKS proxy not working via IPv6"
+- tool_cb_prg: fix double-promotion warning
- This reverts commit 9cb1059f92286a6eb5d28c477fdd3f26aed1d554.
+ clang complains:
+ tool_cb_prg.c:86:22: error: implicit conversion increases
+ floating-point precision: 'float' to 'double'
+ [-Werror,-Wdouble-promotion]
- As discussed in #835 SOCKS5 supports IPv6 proxies and destinations.
+ Fix this by using a double instead of a float constant.
-Daniel Stenberg (21 Aug 2016)
-- [Marco Deckel brought this change]
+Dan Fandrich (1 May 2017)
+- examples: fixed too long line and too long string warnings
- win: Basic support for Universal Windows Platform apps
+Marcel Raad (30 Apr 2017)
+- examples: declare TU-local variables static
- Closes #820
+ This fixes missing-variable-declarations warnings when building with
+ clang.
-Steve Holme (21 Aug 2016)
-- sasl: Don't use GSSAPI authentication when domain name not specified
+- http2: declare TU-local variables static
- Only choose the GSSAPI authentication mechanism when the user name
- contains a Windows domain name or the user is a valid UPN.
+ This fixes the following clang warnings:
- Fixes #718
+ http2.c:184:27: error: no previous extern declaration for non-static
+ variable 'Curl_handler_http2' [-Werror,-Wmissing-variable-declarations]
+ http2.c:204:27: error: no previous extern declaration for non-static
+ variable 'Curl_handler_http2_ssl'
+ [-Werror,-Wmissing-variable-declarations]
-- vauth: Added check for supported SSPI based authentication mechanisms
-
- Completing commit 00417fd66c and 2708d4259b.
+Dan Fandrich (30 Apr 2017)
+- unit1604: fixed indentation
-- http.c: Remove duplicate (authp->avail & CURLAUTH_DIGEST) check
+- unit1604: fixed compilation under Windows, broken in the previous commit
+
+- tests: fixed OOM handling of unit tests to abort test
- From commit 2708d4259b.
+ It's dangerous to continue to run the test when a memory alloc fails.
-Marc Hoersken (20 Aug 2016)
-- socks.c: display the hostname returned by the SOCKS5 proxy server
+Marcel Raad (29 Apr 2017)
+- curl_rtmp: fix missing-variable-declarations warnings
- Instead of displaying the requested hostname the one returned
- by the SOCKS5 proxy server is used in case of connection error.
- The requested hostname is displayed earlier in the connection sequence.
+ clang complains:
- The upper-value of the port is moved to a temporary variable and
- replaced with a 0-byte to make sure the hostname is 0-terminated.
-
-Steve Holme (20 Aug 2016)
-- urldata.h: Corrected comment for httpcode which is also populated by SMTP
+ curl_rtmp.c:61:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmp' [-Werror,-Wmissing-variable-declarations]
+ curl_rtmp.c:81:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmpt' [-Werror,-Wmissing-variable-declarations]
+ curl_rtmp.c:101:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmpe' [-Werror,-Wmissing-variable-declarations]
+ curl_rtmp.c:121:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmpte' [-Werror,-Wmissing-variable-declarations]
+ curl_rtmp.c:141:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmps' [-Werror,-Wmissing-variable-declarations]
+ curl_rtmp.c:161:27: error: no previous extern declaration for non-static variable 'Curl_handler_rtmpts' [-Werror,-Wmissing-variable-declarations]
- As of 7.25.0 and commit 5430007222.
+ Fix this by including the header file.
-Marc Hoersken (20 Aug 2016)
-- socks.c: use Curl_printable_address in SOCKS5 connection sequence
-
- Replace custom string formatting with Curl_printable_address.
- Add additional debug and error output in case of failures.
+Dan Fandrich (29 Apr 2017)
+- url: fixed a memory leak on OOM while setting CURLOPT_BUFFERSIZE
-- socks.c: align SOCKS4 connection sequence with SOCKS5
-
- Calling sscanf is not required since the raw IPv4 address is
- available and the protocol can be detected using ai_family.
+- tests: added --remote-time tests for remaining protocols that support it
-Steve Holme (20 Aug 2016)
-- http.c: Corrected indentation change from commit 2708d4259b
-
- Made by Visual Studio's auto-correct feature and missed by me in my own
- code reviews!
+- runtests.pl: support multiline <postcheck> commands
-- http: Added calls to Curl_auth_is_<mechansism>_supported()
-
- Hooked up the HTTP authentication layer to query the new 'is mechanism
- supported' functions when deciding what mechanism to use.
+- tool_operate: use utimes instead of obsolescent utime when available
+
+- test1443: test --remote-time
+
+- http-proxy: removed unused argument in CURL_DISABLE_PROXY case
- As per commit 00417fd66c existing functionality is maintained for now.
+ Missed in commit 55c3c02e
+
+Daniel Stenberg (27 Apr 2017)
+- cookie_interface.c: changed the other domain to example.com too
-Marc Hoersken (20 Aug 2016)
-- socks.c: improve verbose output of SOCKS5 connection sequence
+- cookie_interface.c: fix cookie domain so the example works
-- configure.ac: add missing quotes to PKG_CHECK_MODULES
+Dan Fandrich (26 Apr 2017)
+- Makefile: fix make dist
+
+ Commit 80a87e8a broke 'make dist' as it can't handle installing from
+ absolute target names. Rearranged the dependencies so the absolute name
+ is used for building but the relative name is use for distributing.
-Steve Holme (20 Aug 2016)
-- sasl: Added calls to Curl_auth_is_<mechansism>_supported()
+Marcel Raad (26 Apr 2017)
+- lib: remove unused code
- Hooked up the SASL authentication layer to query the new 'is mechanism
- supported' functions when deciding what mechanism to use.
+ This fixes the following clang warnings:
+ macro is not used [-Wunused-macros]
+ will never be executed [-Wunreachable-code]
- For now existing functionality is maintained.
+ Closes https://github.com/curl/curl/pull/1448
-Daniel Stenberg (19 Aug 2016)
-- [Miroslav Franc brought this change]
+Daniel Stenberg (26 Apr 2017)
+- http-proxy: remove unused argument from Curl_proxyCONNECT()
- spnego_sspi: fix memory leak in case *outlen is zero (#970)
+- [Martin Kepplinger brought this change]
-- CURLMOPT_MAX_TOTAL_CONNECTIONS.3: mention it can also multiplex
+ url: declare get_protocol_family() static
+
+ get_protocol_family() is not defined static even though there is a
+ static local forward declaration. Let's simply make the definition match
+ it's declaration.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0127.html
-Steve Holme (18 Aug 2016)
-- vauth: Introduced Curl_auth_is_<mechansism>_supported() functions
+- examples: ftpuploadfrommem.c
- As Windows SSPI authentication calls fail when a particular mechanism
- isn't available, introduced these functions for DIGEST, NTLM, Kerberos 5
- and Negotiate to allow both HTTP and SASL authentication the opportunity
- to query support for a supported mechanism before selecting it.
+ Uploads data to an FTP site, directly from memory.
- For now each function returns TRUE to maintain compatability with the
- existing code when called.
+ Closes #1451
-Daniel Stenberg (18 Aug 2016)
-- test1144: verify HEAD with body-only response
+Kamil Dudka (25 Apr 2017)
+- nss: load libnssckbi.so if no other trust is specified
+
+ The module contains a more comprehensive set of trust information than
+ supported by nss-pem, because libnssckbi.so also includes information
+ about distrusted certificates.
+
+ Reviewed-by: Kai Engert
+ Closes #1414
-Steve Holme (17 Aug 2016)
-- RELEASE-PROCEDURE: Added some more future release dates
+- nss: factorize out nss_{un,}load_module to separate fncs
- ...and removed some old ones
+ No change of behavior is intended by this commit.
-Daniel Stenberg (17 Aug 2016)
-- [David Woodhouse brought this change]
+- nss: do not leak PKCS #11 slot while loading a key
+
+ It could prevent nss-pem from being unloaded later on.
+
+ Bug: https://bugzilla.redhat.com/1444860
- curl: allow "pkcs11:" prefix for client certificates
+Marcel Raad (25 Apr 2017)
+- typecheck-gcc: fix _curl_is_slist_info
- RFC7512 provides a standard method to reference certificates in PKCS#11
- tokens, by means of a URI starting 'pkcs11:'.
+ Info values starting with CURLINFO_SOCKET expect a curl_socket_t, not a
+ curl_slist argument.
- We're working on fixing various applications so that whenever they would
- have been able to use certificates from a file, users can simply insert
- a PKCS#11 URI instead and expect it to work. This expectation is now a
- part of the Fedora packaging guidelines, for example.
+ This fixes the following GCC warning when building the examples with
+ --enable-optimize:
- This doesn't work with cURL because of the way that the colon is used
- to separate the certificate argument from the passphrase. So instead of
+ ../../include/curl/typecheck-gcc.h:126:42: warning: call to
+ ‘_curl_easy_getinfo_err_curl_slist’ declared with attribute warning:
+ curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this
+ info [enabled by default]
+ sendrecv.c:90:11: note: in expansion of macro ‘curl_easy_getinfo’
+ res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
- curl -E 'pkcs11:manufacturer=piv_II;id=%01' …
+ Closes https://github.com/curl/curl/pull/1447
+
+Daniel Stenberg (25 Apr 2017)
+- curl: set a 100K buffer size by default
- I instead need to invoke cURL with the colon escaped, like this:
+ Test command 'time curl http://localhost/80GB -so /dev/null' on a Debian
+ Linux.
- curl -E 'pkcs11\:manufacturer=piv_II;id=%01' …
+ Before (middle performing run out 9):
- This is suboptimal because we want *consistency* — the URI should be
- usable in place of a filename anywhere, without having strange
- differences for different applications.
+ real 0m28.078s
+ user 0m11.240s
+ sys 0m12.876s
- This patch therefore disables the processing in parse_cert_parameter()
- when the string starts with 'pkcs11:'. It means you can't pass a
- passphrase with an unescaped PKCS#11 URI, but there's no need to do so
- because RFC7512 allows a PIN to be given as a 'pin-value' attribute in
- the URI itself.
+ After (middle performing run out 9)
- Also, if users are already using RFC7512 URIs with the colon escaped as
- in the above example — even providing a passphrase for cURL to handling
- instead of using a pin-value attribute, that will continue to work
- because their string will start 'pkcs11\:' and won't match the check.
+ real 0m26.356s (93.9%)
+ user 0m5.324s (47.4%)
+ sys 0m8.368s (65.0%)
- What *does* break with this patch is the extremely unlikely case that a
- user has a file which is in the local directory and literally named
- just "pkcs11", and they have a passphrase on it. If that ever happened,
- the user would need to refer to it as './pkcs11:<passphrase>' instead.
-
-- nss: make the global variables static
-
-- openssl: use regular malloc instead of OPENSSL_malloc
+ Also, doing SFTP over a 200 millsecond latency link is now about 6 times
+ faster.
- This allows for better memmory debugging and torture tests.
+ Closes #1446
-- proxy: fix tests as follow-up to 93b0d907d5
+- transfer: remove 'uploadbuf' pointer and cleanup readwrite_upload()
- This fixes tests that were added after 113f04e664b as the tests would
- fail otherwise.
+ The data->req.uploadbuf struct member served no good purpose, instead we
+ use ->state.uploadbuffer directly. It makes it clearer in the code which
+ buffer that's being used.
- We bring back "Proxy-Connection: Keep-Alive" now unconditionally to fix
- regressions with old and stupid proxies, but we could possibly switch to
- using it only for CONNECT or only for NTLM in a future if we want to
- gradually reduce it.
+ Removed the 'SingleRequest *' argument from the readwrite_upload() proto
+ as it can be derived from the Curl_easy struct. Also made the code in
+ the readwrite_upload() function use the 'k->' shortcut to all references
+ to struct fields in 'data->req', which previously was made with a mix of
+ both.
+
+Jay Satiro (25 Apr 2017)
+- configure: stop prepending to LDFLAGS, CPPFLAGS
- Fixes #954
+ - Change prepends to appends because user's LDFLAGS and CPPFLAGS should
+ always come first so they're searched before ours.
- Reported-by: János Fekete
+ Bug: https://github.com/curl/curl/issues/1420
+ Reported-by: Helmut K. C. Tessarek
-- Revert "Proxy-Connection: stop sending this header by default"
+Marcel Raad (25 Apr 2017)
+- if2ip: fix -Wcast-align warning
- This reverts commit 113f04e664b16b944e64498a73a4dab990fe9a68.
+ Follow-up to 119037325de02579f5c58256ca2ed2a0aa592c86, which fixed the
+ warning in the HAVE_GETIFADDRS block, but not in the
+ HAVE_IOCTL_SIOCGIFADDR block.
-- CURLOPT_PROXY.3: unsupported schemes cause errors now
+Dan Fandrich (24 Apr 2017)
+- Makefile: avoid use of GNU-specific form of $<
- Follow-up to a96319ebb9 (document the new behavior)
-
-- tests/README: mention nghttpx for HTTP/2 tests
+ $< is only allowed in implicit rules in some non-GNU makes (e.g. BSD,
+ AIX) so avoid use elsewhere by referencing the dependent curl.1 file
+ directly instead. This is somewhat tricky because the file is supplied
+ in the packaged tar ball (but not in git) but must still be able to be
+ rebuilt when its dependencies change. The right thing must happen in
+ both tar ball and git source trees, as well as in both in-tree and
+ out-of-tree builds.
-- README.md: add our CII Best Practices badge
-
-- proxy: polished the error message for unsupported schemes
+Kamil Dudka (24 Apr 2017)
+- nss: adapt to the new Curl_llist API
- Follow up to a96319ebb93
-
-- test219: verify unsupported scheme for proxies get rejected
+ This commit fixes compilation failure caused by
+ cbae73e1dd95946597ea74ccb580c30f78e3fa73.
-- proxy: reject attempts to use unsupported proxy schemes
+Marcel Raad (24 Apr 2017)
+- curl-compilers.m4: accept -Og and -Ofast GCC flags
- I discovered some people have been using "https://example.com" style
- strings as proxy and it "works" (curl doesn't complain) because curl
- ignores unknown schemes and then assumes plain HTTP instead.
+ -Og, introduced in GCC 4.8, optimizes for debugging experience.
+ -Ofast, introduced in GCC 4.7, builds on -O3 and enables further
+ optimizations breaking strict standards compliance.
+ When specified in CFLAGS, these were always overridden by -O0 or -O2.
+ Fix this by adding them to flags_opt_all.
- I think this misleads users into believing curl uses HTTPS to proxies
- when it doesn't. Now curl rejects proxy strings using unsupported
- schemes instead of just ignoring and defaulting to HTTP.
+ Ref: https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Optimize-Options.html
+ Ref: https://github.com/curl/curl/pull/1404#issuecomment-296401570
+ Closes https://github.com/curl/curl/pull/1440
-- RELEASE-NOTES: synced with b7ee5316c2fd5b
+Daniel Stenberg (24 Apr 2017)
+- RELEASE-NOTES: synced with c68fed875
-Marc Hoersken (14 Aug 2016)
-- socks.c: Correctly calculate position of port in response packet
+- configure: fix the -ldl check for openssl, add -lpthread check
- Third commit to fix issue #944 regarding SOCKS5 error handling.
+ The check for if -ldl is needed to build with (a statically built)
+ openssl was broken. This repairs the check, and adds a check for
+ -lpthread as well since OpenSSL 1.1.0+ does in fact require -lpthread so
+ only adding -ldl for a static openssl build is no longer enough.
- Reported-by: David Kalnischkies
+ Reported-by: Jay Satiro
+ Ref: #1426
+ Closes #1427
-- socks.c: Do not modify and invalidate calculated response length
-
- Second commit to fix issue #944 regarding SOCKS5 error handling.
+- llist: fix a comment after cbae73e1dd9
- Reported-by: David Kalnischkies
+ Pointed-it-by: Kevin Ji
+ URL: https://github.com/curl/curl/commit/cbae73e1dd95946597ea74ccb580c30f78e3fa73#commitcomment-21872622
-- socks.c: Move error output after reading the whole response packet
+Jay Satiro (22 Apr 2017)
+- schannel: Don't treat encrypted partial record as pending data
- First commit to fix issue #944 regarding SOCKS5 error handling.
-
- Reported-by: David Kalnischkies
-
-Daniel Stenberg (13 Aug 2016)
-- [Ronnie Mose brought this change]
-
- MANUAL: Remove invalid link to LDAP documentation (#962)
+ - Track when the cached encrypted data contains only a partial record
+ that can't be decrypted without more data (SEC_E_INCOMPLETE_MESSAGE).
- The server developer.netscape.com does not resolve into any
- ip address and can be removed.
-
-Jay Satiro (13 Aug 2016)
-- openssl: accept subjectAltName iPAddress if no dNSName match
+ - Change Curl_schannel_data_pending to return false in such a case.
- Undo change introduced in d4643d6 which caused iPAddress match to be
- ignored if dNSName was present but did not match.
+ Other SSL libraries have pending data functions that behave similarly.
- Also, if iPAddress is present but does not match, and dNSName is not
- present, fail as no-match. Prior to this change in such a case the CN
- would be checked for a match.
+ Ref: https://github.com/curl/curl/pull/1387
- Bug: https://github.com/curl/curl/issues/959
- Reported-by: wmsch@users.noreply.github.com
+ Closes https://github.com/curl/curl/pull/1392
-Daniel Stenberg (12 Aug 2016)
-- [Dambaev Alexander brought this change]
+Daniel Stenberg (22 Apr 2017)
+- [Alan Jenkins brought this change]
- configure.ac: add zlib search with pkg-config
+ multi: clarify condition in curl_multi_wait
- Closes #956
-
-- rtsp: ignore whitespace in session id
+ `if(nfds || extra_nfds) {` is followed by `malloc(nfds * ...)`.
+
+ If `extra_fs` could be non-zero when `nfds` was zero, then we have
+ `malloc(0)` which is allowed to return `NULL`. But, malloc returning
+ NULL can be confusing. In this code, the next line would treat the NULL
+ as an allocation failure.
- Follow-up to e577c43bb to fix test case 569 brekage: stop the parser at
- whitespace as well.
+ It turns out, if `nfds` is zero then `extra_nfds` must also be zero.
+ The final value of `nfds` includes `extra_nfds`. So the test for
+ `extra_nfds` is redundant. It can only confuse the reader.
- Help-by: Erik Janssen
+ Closes #1439
-- HTTP: retry failed HEAD requests too
+Marcel Raad (22 Apr 2017)
+- lib: fix maybe-uninitialized warnings
- Mark's new document about HTTP Retries
- (https://mnot.github.io/I-D/httpbis-retry/) made me check our code and I
- spotted that we don't retry failed HEAD requests which seems totally
- inconsistent and I can't see any reason for that separate treatment.
+ With -Og, GCC complains:
- So, no separate treatment for HEAD starting now. A HTTP request sent
- over a reused connection that gets cut off before a single byte is
- received will be retried on a fresh connection.
+ easy.c:628:7: error: ‘mcode’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
- Made-aware-by: Mark Nottingham
-
-- mk-ca-bundle.1: document -m, added in 1.26
-
-- RELEASE-NOTES: synced with e577c43bb5
+ ../lib/strcase.h:35:29: error: ‘tok_buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
+ vauth/digest.c:208:9: note: ‘tok_buf’ was declared here
+
+ ../lib/strcase.h:35:29: error: ‘tok_buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
+ vauth/digest.c:566:15: note: ‘tok_buf’ was declared here
+
+ Fix this by initializing the variables.
-- [Erik Janssen brought this change]
+Dan Fandrich (22 Apr 2017)
+- gnutls: removed some code when --disable-verbose is configured
+
+ This reduces the binary size and fixes a compile warning.
- rtsp: accept any RTSP session id
+Daniel Stenberg (22 Apr 2017)
+- llist: no longer uses malloc
+
+ The 'list element' struct now has to be within the data that is being
+ added to the list. Removes 16.6% (tiny) mallocs from a simple HTTP
+ transfer. (96 => 80)
- Makes libcurl work in communication with gstreamer-based RTSP
- servers. The original code validates the session id to be in accordance
- with the RFC. I think it is better not to do that:
+ Also removed return codes since the llist functions can't fail now.
- - For curl the actual content is a don't care.
+ Test 1300 updated accordingly.
- - The clarity of the RFC is debatable, is $ allowed or only as \$, that
- is imho not clear
+ Closes #1435
+
+Marcel Raad (21 Apr 2017)
+- typecheck-gcc: handle function pointers properly
- - Gstreamer seems to url-encode the session id but % is not allowed by
- the RFC
+ All the callbacks passed to curl_easy_setopt are defined as function
+ pointers. The possibility to pass both functions and function pointers
+ was handled for the callbacks that typecheck-gcc.h defined as
+ compatible, but not for the public callback types themselves.
- - less code
+ This makes all compatible callback types defined in typecheck-gcc.h
+ function pointers too and checks all functions uniformly with
+ _curl_callback_compatible, which handles both functions and function
+ pointers.
- With this patch curl will correctly handle real-life lines like:
- Session: biTN4Kc.8%2B1w-AF.; timeout=60
+ A symptom of the problem was a warning in tool_operate.c with
+ --disable-libcurl-option and without --enable-debug as that file
+ passes the callback functions to curl_easy_setopt directly.
- Bug: https://curl.haxx.se/mail/lib-2016-08/0076.html
+ Fixes https://github.com/curl/curl/issues/1403
+ Closes https://github.com/curl/curl/pull/1404
-- symbols-in-versions: add CURL_STRICTER
+Dan Fandrich (21 Apr 2017)
+- mbedtls: enable NTLM (& SMB) even if MD4 support is unavailable
- Added in 5fce88aa8c12564
+ In that case, use libcurl's internal MD4 routine. This fixes tests 1013
+ and 1014 which were failing due to configure assuming NTLM and SMB were
+ always available whenever mbed TLS was in use (which is now true).
-- [Simon Warta brought this change]
+Daniel Stenberg (21 Apr 2017)
+- tests: remove the html and PDF versions from the tarball
- winbuild: Allow changing C compiler via environment variable CC (#952)
-
- This makes it possible to use specific compilers or a cache.
+- openssl: fix memory leak in servercert
- Sample use for clcache:
- set CC=clcache.bat
- nmake /f Makefile.vc DEBUG=no MODE=static VC=14 GEN_PDB=no
+ ... when failing to get the server certificate.
-- LICENSE-MIXING.md: switched to markdown
-
-- docs-make: have markdown files use .md
+- Revert "src/Makefile.am: avoid explicit $<"
+
+ This reverts commit 5b4cbcf11d5100ff793a8e9edbaa6fe1fc7495f5.
+
+ Since it broke out-of-tree builds from tarballs. See discussion in #1432
-- curl.h: make CURL_NO_OLDIES define CURL_STRICTER
+- bump: start working on next release
-- HISTORY.md: use markdown extension
+- src/Makefile.am: avoid explicit $<
+
+ ... since apparently "BSD make" doesn't support it.
+
+ Reported-by: Thomas Klausner
+ Fixes #1432
-- SSLCERTS.md: renamed to markdown extension
+Version 7.54.0 (19 Apr 2017)
-- INTERNALS.md: use markdown extension for markdown content
+Daniel Stenberg (19 Apr 2017)
+- THANKS: add contributors from 7.54.0 release notes
-- CONTRIBUTE.md: markdown extension
+- RELEASE-NOTES: curl 7.54.0
-- CONTRIBUTE: changed to markdown
+Marcel Raad (18 Apr 2017)
+- nss: fix MinGW compiler warnings
+
+ This fixes 3 warnings issued by MinGW:
+ 1. PR_ImportTCPSocket actually has a paramter of type PROsfd instead of
+ PRInt32, which is 64 bits on Windows. Fixed this by including the
+ corresponding header file instead of redeclaring the function, which is
+ supported even though it is in the private include folder. [1]
+ 2. In 64-bit mode, size_t is 64 bits while CK_ULONG is 32 bits, so an explicit
+ narrowing cast is needed.
+ 3. Curl_timeleft returns time_t instead of long since commit
+ 21aa32d30dbf319f2d336e0cb68d3a3235869fbb.
+
+ [1] https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSPR/Reference/PR_ImportTCPSocket
+
+ Closes https://github.com/curl/curl/pull/1393
-- CONTRIBUTE: refreshed
+Daniel Stenberg (18 Apr 2017)
+- [Jay Satiro brought this change]
-- TODO: added an SSH section and two SFTP things to do
+ TLS: Fix switching off SSL session id when client cert is used
+
+ Move the sessionid flag to ssl_primary_config so that ssl and proxy_ssl
+ will each have their own sessionid flag.
+
+ Regression since HTTPS-Proxy support was added in cb4e2be. Prior to that
+ this issue had been fixed in 247d890, CVE-2016-5419.
+
+ Bug: https://github.com/curl/curl/issues/1341
+ Reported-by: lijian996@users.noreply.github.com
+
+ The new incarnation of this bug is called CVE-2017-7468 and is documented
+ here: https://curl.haxx.se/docs/adv_20170419.html
-- TODO: remove the 1.22 duplicated item
+- [David Benjamin brought this change]
-- TODO: move "CURLOPT_MAIL_CLIENT" to SMTP section
+ openssl: don't try to print nonexistant peer private keys
+
+ X.509 certificates carry public keys, not private keys. Fields
+ corresponding to the private half of the key will always be NULL.
+
+ Closes #1425
-- TODO: API for URL parsing/splitting
+- [David Benjamin brought this change]
-- TODO: move QUIC to the HTTP section
+ openssl: fix thread-safety bugs in error-handling
+
+ ERR_error_string with NULL parameter is not thread-safe. The library
+ writes the string into some static buffer. Two threads doing this at
+ once may clobber each other and run into problems. Switch to
+ ERR_error_string_n which avoids this problem and is explicitly
+ bounds-checked.
+
+ Also clean up some remnants of OpenSSL 0.9.5 around here. A number of
+ comments (fixed buffer size, explaining that ERR_error_string_n was
+ added in a particular version) date to when ossl_strerror tried to
+ support pre-ERR_error_string_n OpenSSLs.
+
+ Closes #1424
-- [Simon Warta brought this change]
+- [David Benjamin brought this change]
- winbuild: Free name $(CC) in Makefile (#950)
+ openssl: make SSL_ERROR_to_str more future-proof
- In the old line number 290, CC and CURL_CC had the same value. After
- that, /DCURL_STATICLIB was added to CC but not CURL_CC (intended?).
+ Rather than making assumptions about the values, use a switch-case.
- This gets rid of the CC variable entirely. It is a first step to make it
- possible to manualyl set a CC variable in order to be able to change the
- compiler.
-
-- TODO: Use huge HTTP/2 windows
+ Closes #1424
-- [Simon Warta brought this change]
+- [Daniel Gustafsson brought this change]
- winbuild: Avoid setting redundant CFLAGS to compile commands (#949)
+ code: fix typos and style in comments
- $(CURL_CC) is always used with $(CURL_CFLAGS) appended, so before this,
- all arguments in CURL_CFLAGS have been added twice.
+ A few random typos, and minor whitespace cleanups, found in comments
+ while reading code.
+
+ Closes #1423
-Jay Satiro (8 Aug 2016)
-- cmake: Enable win32 threaded resolver by default
+Marcel Raad (17 Apr 2017)
+- extern-scan.pl: strip trailing CR
- - Turn on USE_THREADS_WIN32 in Windows if ares isn't on
+ This makes test 1135 pass with CRLF checkouts.
- This change is similar to what we already do in the autotools build.
+ Ref: https://github.com/curl/curl/pull/1344#issuecomment-289243166
+ Closes https://github.com/curl/curl/pull/1422
-- cmake: Enable win32 large file support by default
+- configure.ac: ignore CR after version numbers
- All compilers used by cmake in Windows should support large files.
+ Ignore everything after the version numbers in LIBCURL_VERSION and
+ LIBCURL_VERSION_NUM to ged rid of the extra CR character.
+ This makes tests 1022 and 1023 pass on Linux with a CRLF checkout.
- - Add test SIZEOF_OFF_T
- - Remove outdated test SIZEOF_CURL_OFF_T
- - Turn on USE_WIN32_LARGE_FILES in Windows
- - Check for 'Largefile' during the features output
-
-Daniel Stenberg (7 Aug 2016)
-- TODO: added several ideas, removed SPDY
+ Ref: https://github.com/curl/curl/pull/1344#issuecomment-289243166
+ Closes https://github.com/curl/curl/pull/1422
-- http2: always wait for readable socket
+- .gitattributes: force shell scripts to LF
- Since the server can at any time send a HTTP/2 frame to us, we need to
- wait for the socket to be readable during all transfers so that we can
- act on incoming frames even when uploading etc.
+ Bash on Linux errors out on CR characters.
+ This makes tests 1221 and 1222 pass on Linux with a CRLF checkout.
- Reminded-by: Tatsuhiro Tsujikawa
+ Ref: https://github.com/curl/curl/pull/1344#issuecomment-289243166
+ Closes https://github.com/curl/curl/pull/1422
-- RELEASE-NOTES: synced with 7b4bf37a44791
+- unit1303: fix compiler warning
+
+ MinGW-w64 complains:
+ warning: conversion to 'long int' from 'time_t {aka long long int}' may
+ alter its value [-Wconversion]
+ Fix this by using the correct type.
-- [Thomas Glanzmann brought this change]
+Daniel Stenberg (16 Apr 2017)
+- RELEASE-NOTES: synced with 1451271e0
- mbedtls: set debug threshold to 4 (verbose) when MBEDTLS_DEBUG is defined
-
- In order to make MBEDTLS_DEBUG work, the debug threshold must be unequal
- to 0. This patch also adds a comment how mbedtls must be compiled in
- order to make debugging work, and explains the possible debug levels.
+- [Larry Stefani brought this change]
-- CURLOPT_TCP_NODELAY: now enabled by default
-
- After a few wasted hours hunting down the reason for slowness during a
- TLS handshake that turned out to be because of TCP_NODELAY not being
- set, I think we have enough motivation to toggle the default for this
- option. We now enable TCP_NODELAY by default and allow applications to
- switch it off.
+ http2: fix handle leak in error path
- This also makes --tcp-nodelay unnecessary, but --no-tcp-nodelay can be
- used to disable it.
+ Add missing newhandle free call in push_promise().
- Thanks-to: Tim Rühsen
- Bug: https://curl.haxx.se/mail/lib-2016-06/0143.html
+ Closes #1416
-- [Serj Kalichev brought this change]
+- [Larry Stefani brought this change]
- TFTP: Fix upload problem with piped input
+ mbedtls: fix memory leak in error path
- When input stream for curl is stdin and input stream is not a file but
- generated by a script then curl can truncate data transfer to arbitrary
- size since a partial packet is treated as end of transfer by TFTP.
+ Add missing our_ssl_sessionid free call in mbed_connect_step3().
- Fixes #857
+ Closes #1417
-- mk-ca-bundle.pl: -m keeps ca cert meta data in output
+Marcel Raad (15 Apr 2017)
+- curl-compilers.m4: turn implicit function declarations into errors
- Makes the script pass on comments holding meta data to the output
- file. Like fingerprinters, issuer, date ranges etc.
+ This adds -Werror-implicit-function-declaration for GCC 2.95+ so that
+ these errors are visible at the point where they occur instead of only
+ at link time.
+ Implicit function declarations are illegal in C99 and C++ anyway, and
+ the same warning has been turned into an error for ICC in commit
+ 3072c5b8a127057aa922b7c51051bbb4a630b091.
- Closes #937
+ Ref: https://gcc.gnu.org/onlinedocs/gcc-2.95.2/gcc_2.html#SEC8
+ Ref: https://curl.haxx.se/mail/lib-2017-04/0001.html
+ Closes https://github.com/curl/curl/pull/1419
-- multi: make Curl_expire() work with 0 ms timeouts
+- test1541: also test for CURL_PULL_WS2TCPIP_H
- Previously, passing a timeout of zero to Curl_expire() was a magic code
- for clearing all timeouts for the handle. That is now instead made with
- the new Curl_expire_clear() function and thus a 0 timeout is fine to set
- and will trigger a timeout ASAP.
-
- This will help removing short delays, in particular notable when doing
- HTTP/2.
+ Ref: https://github.com/curl/curl/issues/1408
+ Closes https://github.com/curl/curl/pull/1412
-- transfer: return without select when the read loop reached maxcount
+- tests/server/util: prefer <poll.h> over <sys/poll.h>
- Regression added in 790d6de48515. The was then added to avoid one
- particular transfer to starve out others. But when aborting due to
- reading the maxcount, the connection must be marked to be read from
- again without first doing a select as for some protocols (like SFTP/SCP)
- the data may already have been read off the socket.
+ Follow-up to aa573c3c55cda72ec5ef677d87f6f46a53385f0c
- Reported-by: Dan Donahue
- Bug: https://curl.haxx.se/mail/lib-2016-07/0057.html
+ Ref: https://github.com/curl/curl/pull/1406
-Steve Holme (3 Aug 2016)
-- [Bill Nagel brought this change]
+Daniel Stenberg (11 Apr 2017)
+- Curl_expire_latest: ignore already expired timers
+
+ If the existing timer is still in there but has expired, the new timer
+ should be added.
+
+ Reported-by: Rainer Canavan
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0030.html
+ Closes #1407
- mbedtls: Added support for NTLM
+- system.h: fix mingw section
+
+ Reported-by: Marcel Raad
+ Fixes #1408
+ Closes #1409
-Daniel Stenberg (3 Aug 2016)
-- [Sergei Nikulov brought this change]
+Marcel Raad (11 Apr 2017)
+- polarssl: unbreak build with versions < 1.3.8
+
+ ssl_session_init was only introduced in version 1.3.8, the penultimate
+ version. The function only contains a memset, so replace it with that.
+
+ Suggested-by: Jay Satiro
+ Fixes https://github.com/curl/curl/issues/1401
- travis: removed option to rebuild autotool from source
+- poll: prefer <poll.h> over <sys/poll.h>
+
+ The POSIX standard location is <poll.h>. Using <sys/poll.h> results in
+ warning spam when using the musl standard library.
- Fixes #943
+ Closes https://github.com/curl/curl/pull/1406
-- bump: start working toward 7.50.2
+Daniel Stenberg (10 Apr 2017)
+- [Alexis La Goutte brought this change]
-Version 7.50.1 (3 Aug 2016)
+ openssl: fix this statement may fall through [-Wimplicit-fallthrough=]
+
+ Closes #1402
+
+Kamil Dudka (10 Apr 2017)
+- nss: load CA certificates even with --insecure
+
+ ... because they may include an intermediate certificate for a client
+ certificate and the intermediate certificate needs to be presented to
+ the server, no matter if we verify the peer or not.
+
+ Reported-by: thraidh
+ Closes #851
-Daniel Stenberg (3 Aug 2016)
-- THANKS: 7 new contributors from the 7.50.1 release
+Daniel Stenberg (10 Apr 2017)
+- RELEASE-NOTES: synced with f9d1e9a27f7e1
-- RELEASE-NOTES: 7.50.1
+Dan Fandrich (10 Apr 2017)
+- libcurl-thread.3: fixed a bad macro that caused test 1140 to fail
-- TLS: only reuse connections with the same client cert
+Daniel Stenberg (9 Apr 2017)
+- libcurl-thread.3: also mention threaded-resolver
- CVE-2016-5420
- Bug: https://curl.haxx.se/docs/adv_20160803B.html
+ Reported-by: Alex Bligh
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0044.html
-- TLS: switch off SSL session id when client cert is used
+- .github/stale.yml: enable the stale bot
- CVE-2016-5419
- Bug: https://curl.haxx.se/docs/adv_20160803A.html
- Reported-by: Bru Rom
- Contributions-by: Eric Rescorla and Ray Satiro
+ Issues and PRs with no activity for 180 days will get marked as stale,
+ and if no further activity happens within 14 more days, the issue gets
+ closed.
+
+ This follows our established policy of not letting stalled bugs "get in
+ the way": https://curl.haxx.se/docs/bugs.html#Closing_off_stalled_bugs
+
+ Closes #1398
-- curl_multi_cleanup: clear connection pointer for easy handles
+Jay Satiro (8 Apr 2017)
+- CURLINFO_SCHEME.3: fix variable type
- CVE-2016-5421
- Bug: https://curl.haxx.se/docs/adv_20160803C.html
- Reported-by: Marcelo Echeverria and Fernando Muñoz
+ - Change documented param type to char ** from incorrect long *.
-- KNOWN_BUGS: SOCKS proxy not working via IPv6
+Marcel Raad (8 Apr 2017)
+- INSTALL.md: fix secure transport configure arguments
- Closes #835
+ --without-ssl is needed instead of --with-winssl.
-- KNOWN_BUGS: CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
+- vtls: fix unreferenced variable warnings
- Closes #768
+ ... by moving the variables into the correct #ifdef block.
-- KNOWN_BUGS: transfer-encoding: chunked in HTTP/2
+Daniel Stenberg (7 Apr 2017)
+- BUGS: "Bugs in old versions"
+
+- system.h: add section for tcc
- Closes #662
+ Closes #1397
-- TODO: Provide cmake config-file
+Marcel Raad (7 Apr 2017)
+- schannel: fix compiler warnings
+
+ When UNICODE is not defined, the Curl_convert_UTF8_to_tchar macro maps
+ directly to its argument. As it is declared as a pointer to const and
+ InitializeSecurityContext expects a pointer to non-const, both MSVC and MinGW
+ issue a warning about implicitly casting away the const. Fix this by declaring
+ the variables as pointers to non-const.
- Closes #885
+ Closes https://github.com/curl/curl/pull/1394
-Patrick Monnerat (2 Aug 2016)
-- os400: define BUILDING_LIBCURL in make script.
+- [Isaac Boukris brought this change]
-Daniel Stenberg (1 Aug 2016)
-- RELEASE-NOTES: synced with aa9f536a18b
+ sspi: print out InitializeSecurityContext() error message
+
+ Reported-by: Carsten (talksinmath)
+
+ Fixes #1384
+ Closes #1395
-Jay Satiro (1 Aug 2016)
-- [Thomas Glanzmann brought this change]
+- gtls: fix compiler warning
+
+ Curl_timeleft returns time_t instead of long since commit
+ 21aa32d30dbf319f2d336e0cb68d3a3235869fbb.
+
+Daniel Stenberg (6 Apr 2017)
+- test1606: verify speedcheck
- mbedtls: Fix debug function name
+- low_speed_limit: improved function for longer time periods
- This patch is necessary so that curl compiles if MBEDTLS_DEBUG is
- defined.
+ Previously, periods of fast speed between periods of slow speed would
+ not count and could still erroneously trigger a timeout.
- Bug: https://curl.haxx.se/mail/lib-2016-08/0001.html
+ Reported-by: Paul Harris
+ Fixes #1345
+ Closes #1390
-Daniel Stenberg (1 Aug 2016)
-- [Sergei Nikulov brought this change]
+- system.h: set sizeof long to 4 on "default 32 bit" systems
+
+ Triggered a test failure on test 1541 for the build known as
+ "Linux 4.4 i686 tcc 0.9.26 glibc 2.20"
- travis: fix OSX build by re-installing libtool
+Marcel Raad (6 Apr 2017)
+- nss: fix build after e60fe20fdf94e829ba5fce33f7a9d6c281149f7d
- Apparently due to a broken homebrew install
+ Curl_llist_alloc is now Curl_llist_init.
- fixes #934
- Closes #939
+ Closes https://github.com/curl/curl/pull/1391
-- [Martin Vejnár brought this change]
+Daniel Stenberg (6 Apr 2017)
+- INSTALL.cmake: more problems
+
+ and mention specific issues where they are discussed
- win32: fix a potential memory leak in Curl_load_library
+- test1541: ignore the curl_off_t variable type name comparison
- If a call to GetSystemDirectory fails, the `path` pointer that was
- previously allocated would be leaked. This makes sure that `path` is
- always freed.
+ ... the sizes and the formatting strings are what's really important and
+ avoids problems with int64_t vs "long long".
- Closes #938
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0019.html
-- include: revert 9adf3c4 and make public types void * again
+- Revert "configure: prefer 'long long' to int64_t for curl_off_t"
+
+ This reverts commit 81284374bf3c670d2050f8562edeb69f060b07cc.
- Many applications assume the actual contents of the public types and use
- that do for example forward declarations (saving them from including our
- public header) which then breaks when we switch from void * to a struct
- *.
+ Due to mingw32 brekage.
+
+Marcel Raad (5 Apr 2017)
+- tool_operate: fix MinGW compiler warning
- I'm not convinced we were wrong, but since this practise seems
- widespread enough I'm willing to (partly) step down.
+ MinGW complains:
+ tool_operate.c:197:15: error: comparison is always true due to limited range
+ of data type [-Werror=type-limits]
- Now libcurl uses the struct itself when it is built and it allows
- applications to use the struct type if CURL_STRICTER is defined at the
- time of the #include.
+ Fix this by only doing the comparison if 'long' is large enough to hold the
+ constant it is compared with.
- Reported-by: Peter Frühberger
- Fixes #926
+ Closes https://github.com/curl/curl/pull/1378
-Jay Satiro (28 Jul 2016)
-- [Yonggang Luo brought this change]
+- tool_operate: move filetime code to its own function
+
+ Ref: https://github.com/curl/curl/pull/1378
- cmake: Fix for schannel support
+Daniel Stenberg (5 Apr 2017)
+- configure: prefer 'long long' to int64_t for curl_off_t
- The check_library_exists_concat do not check crypt32 library properly.
- So include it directly.
+ Since it is a native type and it makes it less complicated to find a
+ matching one in system.h
- Bug: https://github.com/curl/curl/pull/917
- Reported-by: Yonggang Luo
+ Bug: https://curl.haxx.se/mail/lib-2017-04/0010.html
+ Reported-by: Dan Fandrich
- Bug: https://github.com/curl/curl/issues/935
- Reported-by: Alain Danteny
+ Closes #1388
-- Revert "travis: Install libtool for OS X builds"
-
- Didn't work.
-
- This reverts commit 50723585ed380744358de054e2a55dccee65dfd7.
+- [Dániel Bakai brought this change]
-- travis: Install libtool for OS X builds
+ tests: added test for Curl_splaygetbest to unit1309
- CI is failing due to missing libtoolize, so I'm trying this.
+ This checks the new behavior of Curl_splaygetbest, so that the smallest
+ node not larger than the key is removed, and FIFO behavior is kept even
+ when there are multiple nodes with the same key.
+
+ Closes #1358
-Daniel Stenberg (26 Jul 2016)
-- [Viktor Szakats brought this change]
+- [Dániel Bakai brought this change]
- TODO: minor typo in last commit
+ multi: fix queueing of pending easy handles
- merged #931
+ Multi handles repeatedly invert the queue of pending easy handles when
+ used with CURLMOPT_MAX_TOTAL_CONNECTIONS. This is caused by a multistep
+ process involving Curl_splaygetbest and violates the FIFO property of
+ the multi handle.
+ This patch fixes this issue by redefining the "best" node in the
+ context of timeouts as the "smallest not larger than now", and
+ implementing the necessary data structure modifications to do this
+ effectively, namely:
+ - splay nodes with the same key are now stored in a doubly-linked
+ circular list instead of a non-circular one to enable O(1)
+ insertion to the tail of the list
+ - Curl_splayinsert inserts nodes with the same key to the tail of
+ the same list
+ - in case of multiple nodes with the same key, the one on the head of
+ the list gets selected
-- TODO: Timeout idle connections from the pool
+Marcel Raad (4 Apr 2017)
+- tool: fix Windows Unicode build
+
+ ... by explicitly calling the ANSI versions of Windows API functions where
+ required.
-Patrick Monnerat (25 Jul 2016)
-- os400: minimum supported OS version: V6R1M0.
- Do not log compilation informational messages.
+Daniel Stenberg (4 Apr 2017)
+- [Martin Kepplinger brought this change]
-Jay Satiro (24 Jul 2016)
-- tests: Fix for http/2 feature
+ curl_sasl: declare mechtable static
- Bug: https://curl.haxx.se/mail/lib-2016-07/0070.html
- Reported-by: Paul Howarth
+ struct mechtable is only used locally here. It can be declared static.
-Steve Holme (23 Jul 2016)
-- README: Mention wolfSSL in the 'Dependencies' section
+Jay Satiro (4 Apr 2017)
+- [Antti Hätälä brought this change]
-- vauth.h: No need to query HAVE_GSSAPI || USE_WINDOWS_SSPI for SPNEGO
+ url: don't free postponed data on connection reuse
- As SPNEGO is only defined when these pre-processor variables are defined
- there is no need to query them explicitly.
-
-- spnego: Corrected miss-placed * in Curl_auth_spnego_cleanup() declaration
+ - Don't free postponed data on a connection that will be reused since
+ doing so can cause data loss when pipelining.
- Typo introduced in commit ad5e9bfd5d.
-
-Daniel Stenberg (22 Jul 2016)
-- SECURITY: mention how to get windows-specific CVEs
+ Only Windows builds are affected by this.
- ... and make the distros link a proper link
+ Closes https://github.com/curl/curl/issues/1380
-Dan Fandrich (21 Jul 2016)
-- test558: fix test by stripping file paths from FD lines
+Daniel Stenberg (4 Apr 2017)
+- RELEASE-NOTES: synced with 4f2e348f9b42c69c480
-Kamil Dudka (21 Jul 2016)
-- tests: distribute the http2-server.pl script, too
-
-- docs: distribute the CURLINFO_HTTP_VERSION(3) man page, too
+- hash: move key into hash struct to reduce mallocs
+
+ This removes one tiny malloc for each hash struct allocated. In a simple
+ case like "curl localhost", this save three mallocs.
+
+ Closes #1376
-Daniel Stenberg (21 Jul 2016)
-- bump: start working on 7.50.1
+- llist: replace Curl_llist_alloc with Curl_llist_init
+
+ No longer allocate the curl_llist head struct for lists separately.
+
+ Removes 17 (15%) tiny allocations in a normal "curl localhost" invoke.
+
+ closes #1381
-Version 7.50.0 (21 Jul 2016)
+Jay Satiro (4 Apr 2017)
+- easy: silence compiler warning
+
+ Safe to silence warning adding time delta of poll, which can trigger on
+ Windows since sizeof time_t > sizeof long.
+
+ warning C4244: '+=' : conversion from 'time_t' to 'long', possible loss
+ of data
-Daniel Stenberg (21 Jul 2016)
-- RELEASE-NOTES: version 7.50.0 ready
+Daniel Stenberg (4 Apr 2017)
+- [Richlv brought this change]
-- THANKS: 13 new contributors from the 7.50.0 release
+ docs: minor typo in write-out.d
+
+ Closes #1382
-Jay Satiro (21 Jul 2016)
-- winbuild: fix embedded manifest option
+- include: curl/system.h is a run-time version of curlbuild.h
- Embedded manifest option didn't work due to typo.
+ system.h is aimed to replace curlbuild.h at a later point in time when
+ we feel confident system.h works sufficiently well.
- Reported-by: Stefan Kanthak
-
-- vauth: Fix memleak by freeing credentials if out of memory
+ curl/system.h is currently used in parallel with curl/curlbuild.h
- This is a follow up to the parent commit dcdd4be which fixes one leak
- but creates another by failing to free the credentials handle if out of
- memory. Also there's a second location a few lines down where we fail to
- do same. This commit fixes both of those issues.
-
-Daniel Stenberg (20 Jul 2016)
-- [Saurav Babu brought this change]
-
- vauth: Fixed memory leak due to function returning without free
+ curl/system.h determines a data sizes, data types and include file
+ status based on available preprocessor defines instead of getting
+ generated at build-time. This, in order to avoid relying on a build-time
+ generated file that makes it complicated to do 32 and 64 bit bields from
+ the same installed set of headers.
- This patch allocates memory to "output_token" only when it is required
- so that memory is not leaked if function returns.
+ Test 1541 verifies that system.h comes to the same conclusion that
+ curlbuild.h offers.
+
+ Closes #1373
-- test558: updated after ipv6-check move
+- multi: make curl_multi_wait avoid malloc in the typical case
+
+ When only a few additional file descriptors are used, avoid the malloc.
- Follow-up commit to c50980807c5 to make this test pass.
+ Closes #1377
-Jay Satiro (20 Jul 2016)
-- connect: disable TFO on Linux when using SSL
+Marcel Raad (3 Apr 2017)
+- tests/server/util: remove in6addr_any for recent MinGW
- - Linux TFO + TLS is not implemented yet.
+ In ancient MinGW versions, in6addr_any was declared as extern, but not
+ defined. Because of that, 22a0c57746ae12506b1ba0f0fafffd26c1907d6a added
+ definitions for in6addr_any when compiling with MinGW. The bug was fixed in
+ w32api version 3.6 from 2006, so this workaround is not needed anymore for
+ recent versions.
- Bug: https://github.com/curl/curl/issues/907
+ This fixes the following MinGW-w64 warnings because the MinGW-w64 version of
+ IN6ADDR_ANY_INIT has the two additional braces inside the macro:
+ util.c:59:14: warning: braces around scalar initializer
+ util.c:59:40: warning: excess elements in scalar initializer
+
+ Ref: https://sourceforge.net/p/mingw/mingw-org-wsl/ci/e4803e0da25c57ae1ad0fa75ae2b7182ff7fa339/tree/w32api/ChangeLog
+ Closes https://github.com/curl/curl/pull/1379
-Daniel Stenberg (19 Jul 2016)
-- ROADMAP: QUIC and TLS 1.3
+Daniel Stenberg (3 Apr 2017)
+- docs: added examples for CURLINFO_FILETIME.3 and CURLOPT_FILETIME.3
-- RELEASE-NOTES: synced with c50980807c5
+Jay Satiro (31 Mar 2017)
+- fail-early.d: fix typos
-Jay Satiro (18 Jul 2016)
-- [Brian Prodoehl brought this change]
+- docs: Explain --fail-early does not imply --fail
+
+ Closes https://github.com/curl/curl/pull/1375
- curl_global_init: Check if IPv6 works
+Daniel Stenberg (1 Apr 2017)
+- telnet: (win32) fix read callback return variable
+
+ telnet.c(1427,21): warning: comparison of constant 268435456 with
+ expression of type 'CURLcode' is always false
- - Curl_ipv6works() is not thread-safe until after the first call, so
- call it once during global init to avoid a possible race condition.
+ telnet.c(1433,21): warning: comparison of constant 268435457 with
+ expression of type 'CURLcode' is always false
- Bug: https://github.com/curl/curl/issues/915
- PR: https://github.com/curl/curl/pull/918
+ Reviewed-by: Jay Satiro
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/issues/1225#issuecomment-290340890
+
+ Closes #1374
-- [Timothy Polich brought this change]
+- CTestConfig.cmake: removed, unused
- CURLMOPT_SOCKETFUNCTION.3: fix typo
-
- Closes https://github.com/curl/curl/pull/914
+- libcurl.def: removed, unused
-- [Miroslav Franc brought this change]
+- docs/index.html: removed, was not shipped anyway
- library: Fix memory leaks found during static analysis
+- dist: add missing files to the tarball
+
+Peter Wu (30 Mar 2017)
+- cmake: fix build with cmake 2.8.12.2
+
+ For some reason, CMake 2.8.12.2 did not expand the list argument in a
+ single DEPENDS argument. Remove the quotes, so it gets expanded into
+ multiple arguments for add_custom_command and add_custom_target.
- Closes https://github.com/curl/curl/pull/913
+ Fixes https://github.com/curl/curl/issues/1370
+ Closes #1372
-- [Viktor Szakats brought this change]
+Marcel Raad (30 Mar 2017)
+- ssh: fix narrowing conversion warning
+
+ 'left' is used as time_t but declared as long.
+ MinGW complains:
+ error: conversion to 'long int' from 'time_t {aka long long int}' may alter
+ its value [-Werror=conversion]
+ Changed the declaration to time_t.
- cookie.c: Fix misleading indentation
+- http2: silence unused parameter warnings
- Closes https://github.com/curl/curl/pull/911
+ In release mode, MinGW complains:
+ error: unused parameter 'lib_error_code' [-Werror=unused-parameter]
-- FAQ: Update FTP directory listing section for MLSD command
+Daniel Stenberg (30 Mar 2017)
+- [Hanno Böck brought this change]
+
+ curl: fix callback functions to match prototype
- Explain how some FTP servers support the machine readable listing
- format MLSD from RFC 3659 and compare it to LIST.
+ The function tool_debug_cb doesn't match curl_debug_callback in curl.h
+ (unsigned vs. signed char* for 3rd param).
- Ref: https://github.com/curl/curl/issues/906
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0120.html
-Daniel Stenberg (1 Jul 2016)
-- [Sergei Nikulov brought this change]
+- [Alexis La Goutte brought this change]
- Appveyor: Updates for options - CURL_STATICLIB/BUILD_TESTING
+ gcc7: fix ‘*’ in boolean context, suggest ‘&&’ instead [-Wint-in-bool-context]
- Closes #892
+ Closes #1371
-- TODO: 17.4 also brings more HTTP/2 support
-
-- TODO: try next proxy if one doesn't work
+Marcel Raad (30 Mar 2017)
+- schannel: fix unused variable warning
- Closes #896
+ If CURL_DISABLE_VERBOSE_STRINGS is defined, hostname is not used in
+ schannel_connect_step3.
-- conn: don't free easy handle data in handler->disconnect
+- connect: fix unreferenced parameter warning
- Reported-by: Gou Lingfeng
- Bug: https://curl.haxx.se/mail/lib-2016-06/0139.html
+ When CURL_DISABLE_VERBOSE_STRINGS is defined, the reason parameter in
+ Curl_conncontrol is not used as the infof macro expands to nothing.
-- test1244: test different proxy ports same URL
+- select: use correct SIZEOF_ constant
+
+ At least under Windows, there is no SIZEOF_LONG, so it evaluates to 0 even
+ though sizeof(int) == sizeof(long). This should probably have been
+ CURL_SIZEOF_LONG, but the type of timeout_ms changed from long to time_t
+ anyway.
+ This triggered MSVC warning C4668 about implicitly replacing undefined
+ macros with '0'.
+
+ Closes https://github.com/curl/curl/pull/1362
-- curl_global_init.3: improved formatting of the flags
+Daniel Stenberg (30 Mar 2017)
+- cmake: add cmake file in docs/libcurl/opts/ to dist
-- curl_global_init.3: expand on the SSL and WIN32 bits purpose
-
- Reported-by: Richard Gray
- Bug: https://curl.haxx.se/mail/lib-2016-06/0136.html
+- cmake: add more missing files to the dist
-- [Michael Kaufmann brought this change]
+- docs/Makefile.am: include CMakeLists.txt in the dist tarball
- cleanup: minor code cleanup in Curl_http_readwrite_headers()
+Marcel Raad (29 Mar 2017)
+- NTLM: check for features with #ifdef instead of #if
- - the expression of an 'if' was always true
- - a 'while' contained a condition that was always true
- - use 'if(k->exp100 > EXP100_SEND_DATA)' instead of 'if(k->exp100)'
- - fixed a typo
+ Feature defines are normally checked with #ifdef instead of #if in the rest of
+ the codebase. Additionally, some compilers warn when a macro is implicitly
+ evaluated to 0 because it is not defined, which was the case here.
- Closes #889
+ Ref: https://github.com/curl/curl/pull/1362#discussion_r108605101
+ Closes https://github.com/curl/curl/pull/1367
-- SFTP: set a generic error when no SFTP one exists...
+Daniel Stenberg (29 Mar 2017)
+- [Hanno Böck brought this change]
+
+ curl: fix callback argument inconsistency
- ... as otherwise we could get a 0 which would count as no error and we'd
- wrongly continue and could end up segfaulting.
+ As you can see the callback definition uses a char* for the first
+ argument, while the function uses a void*.
- Bug: https://curl.haxx.se/mail/lib-2016-06/0052.html
- Reported-by: 暖和的和暖
+ URL: https://curl.haxx.se/mail/lib-2017-03/0116.html
-- ROADMAP: http2 tests are merged, mention http2 perf
+- RELEASE-NOTES: synced with 556c51a2df
-- docs/README.md: to render nicer pages on github
-
- ... as previously the README.cmake would be picked and put at the bottom
- of the docs page there and it wasn't very representative!
+- [madblobfish brought this change]
-- README.md: change host name for the svg logo
-
- rawgit.com asks to use the domain cdn.rawgit.com for production
+ KNOWN_BUGS: typo
- See #900
+ Closes #1364
-- [Viktor Szakats brought this change]
+- [Maksim Stsepanenka brought this change]
- README.md: use the SVG logo
+ make: use the variable MAKE for recursive calls
+
+ Closes #1366
-- README.md: logo on top!
+- conncache: make hashkey avoid malloc
+
+ ... to make it much faster. Idea developed with primepie on IRC.
+
+ Closes #1365
-- KNOWN_BUGS: 3.4 POP3 expects "CRLF.CRLF" eob for some
+Kamil Dudka (28 Mar 2017)
+- http: do not treat FTPS over CONNECT as HTTPS
- Closes #740
+ If we use FTPS over CONNECT, the TLS handshake for the FTPS control
+ connection needs to be initiated in the SENDPROTOCONNECT state, not
+ the WAITPROXYCONNECT state. Otherwise, if the TLS handshake completed
+ without blocking, the information about the completed TLS handshake
+ would be saved to a wrong flag. Consequently, the TLS handshake would
+ be initiated in the SENDPROTOCONNECT state once again on the same
+ connection, resulting in a failure of the TLS handshake. I was able to
+ observe the failure with the NSS backend if curl ran through valgrind.
+
+ Note that this commit partially reverts curl-7_21_6-52-ge34131d.
-- RELEASE-NOTES: synced with d61c80515aa8
+Daniel Stenberg (28 Mar 2017)
+- pause: handle mixed types of data when paused
+
+ When receiving chunked encoded data with trailers, and the write
+ callback returns PAUSE, there might be both body and header to store to
+ resend on unpause. Previously libcurl returned error for that case.
+
+ Added test case 1540 to verify.
+
+ Reported-by: Stephen Toub
+ Fixes #1354
+ Closes #1357
-- [Michael Osipov brought this change]
+Jay Satiro (28 Mar 2017)
+- [Isaac Boukris brought this change]
- acinclude.m4: improve autodetection of CA bundle on FreeBSD
+ http: Fix proxy connection reuse with basic-auth
- The FreeBSD Port security/ca_root_nss installs the Mozilla NSS CA bundle
- to /usr/local/share/certs/ca-root-nss.crt. Use this bundle in the
- discovery process.
+ When using basic-auth, connections and proxy connections
+ can be re-used with different Authorization headers since
+ it does not authenticate the connection (like NTLM does).
- This change also removes the former FreeBSD path that has been obsolete
- for 8 years since this FreeBSD ports commit:
- https://svnweb.freebsd.org/ports/head/security/?view=revision&revision=215953
+ For instance, the below command should re-use the proxy
+ connection, but it currently doesn't:
+ curl -v -U alice:a -x http://localhost:8181 http://localhost/
+ --next -U bob:b -x http://localhost:8181 http://localhost/
- Closes #894
-
-- configure: don't specify .lib for libs on windows
+ This is a regression since refactoring of ConnectionExists()
+ as part of: cb4e2be7c6d42ca0780f8e0a747cecf9ba45f151
+
+ Fix the above by removing the username and password compare
+ when re-using proxy connection at proxy_info_matches().
+
+ However, this fix brings back another bug would make curl
+ to re-print the old proxy-authorization header of previous
+ proxy basic-auth connection because it wasn't cleared.
+
+ For instance, in the below command the second request should
+ fail if the proxy requires authentication, but would succeed
+ after the above fix (and before aforementioned commit):
+ curl -v -U alice:a -x http://localhost:8181 http://localhost/
+ --next -x http://localhost:8181 http://localhost/
+
+ Fix this by clearing conn->allocptr.proxyuserpwd after use
+ unconditionally, same as we do for conn->allocptr.userpwd.
- Another follow up for crypt32.lib linking with winssl
+ Also fix test 540 to not expect digest auth header to be
+ resent when connection is reused.
+
+ Signed-off-by: Isaac Boukris <iboukris@gmail.com>
+
+ Closes https://github.com/curl/curl/pull/1350
-- configure: fix winssl LIBS change typo
+- openssl: exclude DSA code when OPENSSL_NO_DSA is defined
+
+ - Fix compile errors that occur in openssl.c when OpenSSL lib was
+ built without DSA support.
- follow-up from 120bf29e
+ Bug: https://github.com/curl/curl/issues/1361
+ Reported-by: neheb@users.noreply.github.com
-- TODO: "TCP Fast Open" is done, add monitor pool connections
+- examples/fopen: checksrc compliance
-- configure: add crypt32.lib for winssl builds
+Marcel Raad (28 Mar 2017)
+- schannel: fix variable shadowing warning
- Necessary since 6cabd78531f
+ No need to redeclare the variable.
-- Makefile.vc: link with crypt32.lib for winssl builds
+- multi: fix MinGW-w64 compiler warnings
- Necessary since 6cabd78531f
+ error: conversion to 'long int' from 'time_t {aka long long int}' may alter
+ its value [-Werror=conversion]
+
+- .gitattributes: turn off CRLF for *.am
- Fixes #853
+ If Makefile.am uses CRLF, buildconf in a Windows checkout fails with:
+ ".ibtoolize: error: AC_CONFIG_MACRO_DIRS([m4]) conflicts with
+ ACLOCAL_AMFLAGS=-I m4"
-- [Joel Depooter brought this change]
+Daniel Stenberg (26 Mar 2017)
+- [klemens brought this change]
- VC: Add crypt32.lib to Visual Sudio project template files
+ spelling fixes
- Closes #854
+ Closes #1356
-- vc: fix the build for schannel certinfo support
+- curl: check for end of input in writeout backslash handling
+
+ Reported-by: Brian Carpenter
- Broken since 6cabd785, which adds use of the Curl_extract_certinfo
- function from the x509asn1.c file.
+ Added test 1442 to verify
-- typedefs: use the full structs in internal code...
+Marcel Raad (24 Mar 2017)
+- tests/README: make "Run" section foolproof
- ... and save the typedef'ed names for headers and external APIs.
+ curl must be built before building the tests.
+
+ Closes https://github.com/curl/curl/pull/1352
+
+Daniel Stenberg (23 Mar 2017)
+- openssl: fix comparison between signed and unsigned integer expressions
-- internals: rename the SessionHandle struct to Curl_easy
+Marcel Raad (23 Mar 2017)
+- [Edward Kimmel brought this change]
-- headers: forward declare CURL, CURLM and CURLSH as structs
+ asiohiper: make sure socket is open in event_cb
- Instead of typedef'ing to void, typedef to their corresponding actual
- struct names to allow compilers to type-check.
+ Send curl_socket_t to event_cb and make sure it hasn't been closed yet.
- Assisted-by: Reinhard Max
+ Closes https://github.com/curl/curl/pull/1318
-Jay Satiro (22 Jun 2016)
-- vtls: Only call add/getsession if session id is enabled
+Dan Fandrich (23 Mar 2017)
+- openssl: made the error table static const
+
+Jay Satiro (23 Mar 2017)
+- openssl: fall back on SSL_ERROR_* string when no error detail
+
+ - If SSL_get_error is called but no extended error detail is available
+ then show that SSL_ERROR_* as a string.
- Prior to this change we called Curl_ssl_getsessionid and
- Curl_ssl_addsessionid regardless of whether session ID reusing was
- enabled. According to comments that is in case session ID reuse was
- disabled but then later enabled.
+ Prior to this change there was some inconsistency in that case: the
+ SSL_ERROR_* code may or may not have been shown, or may have been shown
+ as unknown even if it was known.
- The old way was not intuitive and probably not something users expected.
- When a user disables session ID caching I'd guess they don't expect the
- session ID to be cached anyway in case the caching is later enabled.
+ Ref: https://github.com/curl/curl/issues/1300
+
+ Closes https://github.com/curl/curl/pull/1348
-Daniel Stenberg (22 Jun 2016)
-- curl.1: the used progress meter suffix is k in lower case
+Dan Fandrich (23 Mar 2017)
+- mkhelp: disable compression if the perl gzip module is unavailable
- Closes #883
+ This is nowadays included with the base perl distribution, but wasn't
+ prior to about perl 5.14
-- [Sergei Nikulov brought this change]
+Daniel Stenberg (23 Mar 2017)
+- [Anders Roxell brought this change]
- cmake: now using BUILD_TESTING=ON/OFF
+ tests/README: mention nroff for --manual tests
- CMake build now using BUILD_TESTING=ON/OFF (default is OFF) to build
- tests and enabling CTest integration. Options BUILD_CURL_TESTS and
- BUILD_DASHBOARD_REPORTS was removed.
+ Signed-off-by: Anders Roxell <anders.roxell@gmail.com>
- Closes #882
+ Closes #1342
+
+- CURLINFO_PRIMARY_IP.3: add example
+
+- travis: run tests-nonflaky instead of tests-full
+
+- make: introduce 'test-nonflaky' target
- Reviewed-by: Brad King
+ Running this in the root build dir will invoke the test suite to only
+ run tests not marked as 'flaky'.
+
+- test2033: flaky
-- [Michael Kaufmann brought this change]
+Jay Satiro (21 Mar 2017)
+- [Ales Mlakar brought this change]
- cleanup: fix method names in code comments
+ mbedtls: add support for CURLOPT_SSL_CTX_FUNCTION
- Closes #887
+ Ref: https://curl.haxx.se/mail/lib-2017-02/0097.html
+
+ Closes https://github.com/curl/curl/pull/1272
-Kamil Dudka (21 Jun 2016)
-- curl-compilers.m4: improve detection of GCC's -fvisibility= flag
+Peter Wu (21 Mar 2017)
+- cmake: add support for building HTML and PDF docs
+
+ Note that for some reason there is this warning (that also exists with
+ autotools, added since curl-7_15_1-94-ga718cb05f):
+
+ docs/libcurl/curl_multi_socket_all.3:1: can't open `man3/curl_multi_socket.3': No such file or directory
- Some builds of GCC produce output on both stdout and stderr when --help
- --verbose is used. The 2>&1 redirection caused them to be arbitrarily
- interleaved with each other because of stream buffering. Consequently,
- grep failed to match the fvisibility= string in the mixed output, even
- though the string was present in GCC's standard output.
+ Additionally, adjust the roffit --mandir option to support creating
+ links when doing out-of-tree builds.
- This led to silently disabling symbol hiding in some builds of curl.
+ Ref: https://github.com/curl/curl/pull/1288
-Daniel Stenberg (19 Jun 2016)
-- tests: fix the HTTP/2 tests
+- cmake: build manual pages (including curl.1)
- The HTTP/2 tests brought with commit bf05606ef1f were using the internal
- name 'http2' for the HTTP/2 server, while in fact that name was already
- used for the second instance of the HTTP server. This made tests using
- the second instance (like test 2050) fail after a HTTP/2 test had run.
+ Also make Perl mandatory to allow building the docs.
- The server is now known as HTTP/2 internally and within the <server>
- section in test cases. 1700, 1701 and 1702 were updated accordingly.
+ While CMakeLists.txt could probably read the list of manual pages from
+ Makefile.am, actually putting those in CMakeLists.txt is cleaner so that
+ is what is done here.
+
+ Fixes #1230
+ Ref: https://github.com/curl/curl/pull/1288
-- openssl: use more 'const' to fix build warnings with 1.1.0 branch
+- docs: split file lists into Makefile.inc
+
+ For easier sharing with CMake. The contents were reformatted to use
+ two-space indent and expanded tabs (matching lib/Makefile.common).
+
+ Ref: https://github.com/curl/curl/pull/1288
-- curl.1: missed 'T' in the progress unit suffixes
+Daniel Stenberg (21 Mar 2017)
+- examples: comment typos in http2 examples
-- curl.1: mention the unix for the progress meter
+- RELEASE-NOTES: typo
-Patrick Monnerat (16 Jun 2016)
-- os400: add new definitions to ILE/RPG binding.
+- RELEASE-NOTES: synced with 6e0f26c8a8c28df
-Daniel Stenberg (16 Jun 2016)
-- openssl: fix cert check with non-DNS name fields present
+- multi: fix streamclose() crash in debug mode
- Regression introduced in 5f5b62635 (released in 7.48.0)
+ The code would refer to the wrong data pointer. Only debug builds do
+ this - for verbosity.
- Reported-by: Fabian Ruff
- Fixes #875
-
-Dan Fandrich (16 Jun 2016)
-- axtls: Use Curl_wait_ms instead of the less-portable usleep
+ Reported-by: zelinchen@users.noreply.github.com
+ Fixes #1329
-- axtls: Fixed compile after compile 31c521b0
+- CONTRIBUTE: mention referring to github issues in commit msgs
-- tests: Added HTTP proxy keywords to tests 1141 & 1142
+Dan Fandrich (20 Mar 2017)
+- runtests.pl: fixed display of the Gopher IPv6 port number
-Jay Satiro (15 Jun 2016)
-- [Sergei Nikulov brought this change]
+- tests: fixed the documented test server port numbers
- cmake: Fix build with winldap
+- test714/5: added HTTP as a required feature
- Bug: https://github.com/curl/curl/pull/874
- Reported-by: Sergei Nikulov
+ These tests use an HTTP proxy so require that curl be built with HTTP
+ support.
-- CURLOPT_POSTFIELDS.3: Clarify what happens when set empty
+- tests: strip more options from non-HTTP --libcurl tests
- When CURLOPT_POSTFIELDS is set to an empty string libcurl will send a
- zero-byte POST. Prior to this change it was documented as sending data
- from the read callback.
+ The CURLOPT_USERAGENT and CURLOPT_MAXREDIRS options are only set if HTTP
+ support is available, so ignore them in tests where HTTP is not
+ guaranteed.
+
+Jay Satiro (18 Mar 2017)
+- [Palo Markovic brought this change]
+
+ darwinssl: fix typo in variable name
- This also changes the wording of what happens when empty or NULL so that
- it's hopefully easier to understand for people whose primary language
- isn't English.
+ Broken a week ago in 6448f98.
- Bug: https://github.com/curl/curl/issues/862
- Reported-by: Askar Safin
-
-- [Michael Wallner brought this change]
+ Closes https://github.com/curl/curl/pull/1337
- curl_multi_socket_action.3: Fix rewording
+- tool_operate: Fix showing HTTPS-Proxy options on CURLE_SSL_CACERT
- - Remove some erroneous text.
+ - Show the HTTPS-proxy options on CURLE_SSL_CACERT if libcurl was built
+ with HTTPS-proxy support.
- Closes https://github.com/curl/curl/pull/865
+ Prior to this change those options were shown only if an HTTPS-proxy was
+ specified by --proxy, but that did not take into account environment
+ variables such as http_proxy, https_proxy, etc. Follow-up to e1187c4.
+
+ Bug: https://github.com/curl/curl/issues/1331
+ Reported-by: Nehal J Wani
+
+- CURLINFO_LOCAL_PORT.3: fix typo
-- [Luo Jinghua brought this change]
+Daniel Stenberg (16 Mar 2017)
+- CURLINFO_LOCAL_PORT.3: added example
- resolve: enable protocol family logic for synthesized IPv6
+- SSLCERTS.md: mention HTTPS proxies and their separate options
+
+- BINDINGS: a Delphi binding
+
+- KNOWN_BUGS: remove libidn related issue
- - Enable protocol family logic for IPv6 resolves even when support
- for synthesized addresses is enabled.
+ ... as we no longer use libidn
+
+Dan Fandrich (14 Mar 2017)
+- build: removed redundant DEPENDENCIES from makefiles
+
+Daniel Stenberg (13 Mar 2017)
+- [Sylvestre Ledru brought this change]
+
+ Improve code readbility
- This is a follow up to the parent commit that added support for
- synthesized IPv6 addresses from IPv4 on iOS/OS X. The protocol family
- logic needed for IPv6 was inadvertently excluded if support for
- synthesized addresses was enabled.
+ ... by removing the else branch after a return, break or continue.
- Bug: https://github.com/curl/curl/issues/863
- Ref: https://github.com/curl/curl/pull/866
- Ref: https://github.com/curl/curl/pull/867
+ Closes #1310
-Daniel Stenberg (7 Jun 2016)
-- [Luo Jinghua brought this change]
+Jay Satiro (13 Mar 2017)
+- [Anatol Belski brought this change]
- resolve: add support for IPv6 DNS64/NAT64 Networks on OS X + iOS
+ winbuild: add basic support for OpenSSL 1.1.x
- Use getaddrinfo() to resolve the IPv4 address literal on iOS/Mac OS X.
- If the current network interface doesn’t support IPv4, but supports
- IPv6, NAT64, and DNS64.
+ - Auto-detect OpenSSL 1.1 libs
- Closes #866
- Fixes #863
+ Closes https://github.com/curl/curl/pull/1322
-- tests: two more HTTP/2 tests
-
- 1701 and 1702
+Daniel Stenberg (13 Mar 2017)
+- RELEASE-NOTES: synced with c25e0761d0fc49c4
-- runtests: don't display logs when http2 server fails to start
+- make: regenerate docs/curl.1 by runinng make in docs
+
+ ... previously, docs/ was only a dist subdir, now also a build subdir.
+
+ Reported-by: Dan Fandrich
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0017.html
-- runtests: make stripfile work on stdout as well
+Dan Fandrich (12 Mar 2017)
+- test1440/1: depend on well-defined file: behaviour
- ... and have test 1700 use that to strip out the nghttpx server: headers
+ Depend on the known behaviour of URLs for nonexistent files rather than
+ the undefined behaviour of URLs for directories (which fails on Windows).
+ The test isn't about file: URLs at all, so the URL used doesn't really
+ matter.
-- http2-tests: test1700 is the first real HTTP/2 test
+- tests: clear the SSL_CERT_FILE variable on --libcurl tests
- It requires that 'nghttpx' is in the PATH, and it will run the tests
- using nghttpx as a front-end proxy in front of the standard HTTP/1 test
- server. This uses HTTP/2 over plain TCP.
+ Otherwise, the contents will end up in the output and fail the
+ verification.
+
+- test1287: added verbose logs keyword
+
+- tool_writeout: fixed a buffer read overrun on --write-out
- If you like me have nghttpx installed in a custom path, you can run test 1700
- like this:
+ If a % ended the statement, the string's trailing NUL would be skipped
+ and memory past the end of the buffer would be accessed and potentially
+ displayed as part of the --write-out output. Added tests 1440 and 1441
+ to check for this kind of condition.
- $ PATH=$PATH:$HOME/build-nghttp2/bin/ ./runtests.pl 1700
+ Reported-by: Brian Carpenter
-- RELEASE-NOTES: synced with 34855feeb4c299
+Jay Satiro (12 Mar 2017)
+- [Desmond O. Chang brought this change]
-Steve Holme (6 Jun 2016)
-- schannel: Disable ALPN on Windows < 8.1
+ url: add option CURLOPT_SUPPRESS_CONNECT_HEADERS
- Calling QueryContextAttributes with SECPKG_ATTR_APPLICATION_PROTOCOL
- fails on Windows < 8.1 so we need to disable ALPN on these OS versions.
+ - Add new option CURLOPT_SUPPRESS_CONNECT_HEADERS to allow suppressing
+ proxy CONNECT response headers from the user callback functions
+ CURLOPT_HEADERFUNCTION and CURLOPT_WRITEFUNCTION.
- Inspiration provide by: Daniel Seither
+ - Add new tool option --suppress-connect-headers to expose
+ CURLOPT_SUPPRESS_CONNECT_HEADERS and allow suppressing proxy CONNECT
+ response headers from --dump-header and --include.
- Closes #848
- Fixes #840
+ Assisted-by: Jay Satiro
+ Assisted-by: CarloCannas@users.noreply.github.com
+ Closes https://github.com/curl/curl/pull/783
-Jay Satiro (5 Jun 2016)
-- checksrc: Add LoadLibrary to the banned functions list
+- http_proxy: Ignore TE and CL in CONNECT 2xx responses
- LoadLibrary was supplanted by Curl_load_library for security
- reasons in 6df916d.
-
-- http: Fix HTTP/2 connection reuse
+ A client MUST ignore any Content-Length or Transfer-Encoding header
+ fields received in a successful response to CONNECT.
+ "Successful" described as: 2xx (Successful). RFC 7231 4.3.6
- - Change the parser to not require a minor version for HTTP/2.
+ Prior to this change such a case would cause an error.
- HTTP/2 connection reuse broke when we changed from HTTP/2.0 to HTTP/2
- in 8243a95 because the parser still expected a minor version.
+ In some ways this bug appears to be a regression since c50b878. Prior to
+ that libcurl may have appeared to function correctly in such cases by
+ acting on those headers instead of causing an error. But that behavior
+ was also incorrect.
- Bug: https://github.com/curl/curl/issues/855
- Reported-by: Andrew Robbins, Frank Gevaerts
+ Bug: https://github.com/curl/curl/issues/1317
+ Reported-by: mkzero@users.noreply.github.com
-Steve Holme (4 Jun 2016)
-- connect.c: Fixed compilation warning from commit 332e8d6164
-
- connect.c:952:5: warning: suggest explicit braces to avoid ambiguous 'else'
+- [Thomas Glanzmann brought this change]
-- win32: Used centralised verify windows version function
+ mbedtls: fix typo in variable name
- Closes #845
-
-- win32: Added verify windows version functionality
+ Broken a few days ago in 6448f98.
+
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0015.html
-- win32: Introduced centralised verify windows version function
+Michael Kaufmann (11 Mar 2017)
+- tests: fix the authretry tests
+
+ Do not call curl_easy_reset() between the requests, because the
+ auth state must be preserved for these tests.
+
+ Follow-up to 0afbcfd
-Kamil Dudka (3 Jun 2016)
-- tool_urlglob: fix off-by-one error in glob_parse()
+- proxy: skip SSL initialization for closed connections
- ... causing SIGSEGV while parsing URL with too many globs.
- Minimal example:
+ This prevents a "Descriptor is not a socket" error for WinSSL.
- $ curl $(for i in $(seq 101); do printf '{a}'; done)
+ Reported-by: Antony74@users.noreply.github.com
+ Reviewed-by: Jay Satiro
- Reported-by: Romain Coltel
- Bug: https://bugzilla.redhat.com/1340757
-
-Daniel Stenberg (1 Jun 2016)
-- [Benjamin Kircher brought this change]
+ Fixes https://github.com/curl/curl/issues/1239
- libcurl-multi.3: fix small typo
+- curl_easy_reset: Also reset the authentication state
- Closes #850
+ Follow-up to 5278462
+ See https://github.com/curl/curl/issues/1095
-- [Viktor Szakats brought this change]
+- [Isaac Boukris brought this change]
- makefile.m32: add crypt32 for winssl builds
+ authneg: clear auth.multi flag at http_done
- Dependency added by 6cabd78
+ This flag is meant for the current request based on authentication
+ state, once the request is done we can clear the flag.
- Closes #849
-
-- [Ivan Avdeev brought this change]
-
- vtls: fix ssl session cache race condition
+ Also change auth.multi to auth.multipass for better readability.
- Sessionid cache management is inseparable from managing individual
- session lifetimes. E.g. for reference-counted sessions (like those in
- SChannel and OpenSSL engines) every session addition and removal
- should be accompanied with refcount increment and decrement
- respectively. Failing to do so synchronously leads to a race condition
- that causes symptoms like use-after-free and memory corruption.
- This commit:
- - makes existing session cache locking explicit, thus allowing
- individual engines to manage lock's scope.
- - fixes OpenSSL and SChannel engines by putting refcount management
- inside this lock's scope in relevant places.
- - adds these explicit locking calls to other engines that use
- sessionid cache to accommodate for this change. Note, however,
- that it is unknown whether any of these engines could also have
- this race.
+ Fixes https://github.com/curl/curl/issues/1095
+ Closes https://github.com/curl/curl/pull/1326
- Bug: https://github.com/curl/curl/issues/815
- Fixes #815
- Closes #847
+ Signed-off-by: Isaac Boukris <iboukris@gmail.com>
+ Reported-by: Michael Kaufmann
-- [Andrew Kurushin brought this change]
+Dan Fandrich (11 Mar 2017)
+- url: don't compile detect_proxy if HTTP support is disabled
- schannel: add CURLOPT_CERTINFO support
-
- Closes #822
+- cmdline-opts: fixed a few typos
-- RELEASE-NOTES: synced with 142ee9fa15002315
+Daniel Stenberg (10 Mar 2017)
+- README.md: add coverity and travis badges
-- openssl: rename the private SSL_strerror
+- ISSUE_TEMPLATE: for bugs, ask questions on the mailing list
- ... to make it not look like an OpenSSL function
+ and try to add the top comment within an HTML comment in the hope
+ that it might get hidden if the text is kept
-- [Michael Kaufmann brought this change]
-
- openssl: Use correct buffer sizes for error messages
+- openssl: add two /* FALLTHROUGH */ to satisfy coverity
- Closes #844
+ CID 1402159 and 1402158
-- curl: fix -q [regression]
+- tests: disabled 1903 now
- This broke in 7.49.0 with commit e200034425a7625
+ Test 1903 is doing HTTP pipelining, and that is a timing and ordering
+ sensitive operation and this fails far too often on the Travis CI
+ leading to people more or less ignoring test failures there. Not good.
- Fixes #842
+ The end of pipelning is probably coming sooner rather than later
+ anyway...
-- URL parser: allow URLs to use one, two or three slashes
-
- Mostly in order to support broken web sites that redirect to broken URLs
- that are accepted by browsers.
-
- Browsers are typically even more leniant than this as the WHATWG URL
- spec they should allow an _infinite_ amount. I tested 8000 slashes with
- Firefox and it just worked.
+Dan Fandrich (9 Mar 2017)
+- tls-max.d: added to the makefile
+
+- build: fixed making man page in out-of-tree tarball builds
- Added test case 1141, 1142 and 1143 to verify the new parser.
+ The man page taken from the release package is found in a different
+ location than if it's built from source. It must be referenced as $< in
+ the rule to get its correct location in the VPATH.
+
+- mkhelp: simplified the gzip code
- Closes #791
+ This eliminates the need for an external gzip program, which wasn't
+ working with Busybox's gzip, anyway. It now compresses using perl's
+ IO::Compress::Gzip
-- [Renaud Lehoux brought this change]
+- polarssl: fixed compile errors introduced in 6448f98c
- cmake: Added missing mbedTLS support
+Daniel Stenberg (8 Mar 2017)
+- bump: next release will be known as 7.54.0
- Closes #837
-
-- [Renaud Lehoux brought this change]
+ ...due to the newly added CURL_SSLVERSION_MAX_* functionality
- mbedtls: removed unused variables
+- openssl: unbreak the build after 6448f98c1857de
- Closes #838
+ Verified with OpenSSL 1.1.0e and OpenSSL master (1.1.1)
-- [Frank Gevaerts brought this change]
+Kamil Dudka (8 Mar 2017)
+- [Jozef Kralik brought this change]
- http: add CURLINFO_HTTP_VERSION and %{http_version}
+ vtls: add options to specify range of enabled TLS versions
- Adds access to the effectively used http version to both libcurl and
- curl.
+ This commit introduces the CURL_SSLVERSION_MAX_* constants as well as
+ the --tls-max option of the curl tool.
- Closes #799
+ Closes https://github.com/curl/curl/pull/1166
-- bump: start the journey toward 7.50.0
+Daniel Stenberg (8 Mar 2017)
+- RELEASE-NOTES: synced with 6888a670aa01
-- [Marcel Raad brought this change]
+- MANPAGE: clarify the dash situation in meta data
- openssl: fix build with OPENSSL_NO_COMP
+- insecure.d: clarify that this is for server connections
- With OPENSSL_NO_COMP defined, there is no function
- SSL_COMP_free_compression_methods
-
- Closes #836
+ Assisted-by: Ray Satiro
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0002.html
-- [Gisle Vanem brought this change]
+Dan Fandrich (8 Mar 2017)
+- test1260: added http as a required feature
+
+Daniel Stenberg (7 Mar 2017)
+- [Steve Brokenshire brought this change]
- memdebug: fix MSVC crash with -DMEMDEBUG_LOG_SYNC
+ maketgz: Run updatemanpages.pl to update man pages
+
+ maketgz now runs scripts/updatemanpages.pl to update the man pages .TH
+ section to use the current date and curl/libcurl version.
+
+ (TODO Section 3.1)
- Fixes #828
+ Closes #1058
-- [Jonathan brought this change]
+- [Steve Brokenshire brought this change]
- README.md: polish
+ gitignore: Ignore man page dist files
- Closes #834
+ Ignore man page dist files generated by scripts/updatemanpages.pl
-- RELEASE-NOTES: fix vuln link
+- [Steve Brokenshire brought this change]
-Version 7.49.1 (30 May 2016)
+ Makefile.am: Remove distribution man pages when running 'make clean'
-Daniel Stenberg (30 May 2016)
-- RELEASE-NOTES: 7.49.1
+- [Steve Brokenshire brought this change]
-- [Steve Holme brought this change]
+ Makefile.am: Added scripts/updatemanpages.pl to EXTRA_DIST
- loadlibrary: Only load system DLLs from the system directory
+- [Steve Brokenshire brought this change]
+
+ updatemanpages.pl: Update man pages to use current date and versions
- Inspiration provided by: Daniel Stenberg and Ray Satiro
+ Added script to update man pages to use the current date and
+ curl/libcurl versions.
- Bug: https://curl.haxx.se/docs/adv_20160530.html
+ updatemanpages.pl has three arrays: list of directories to look in,
+ list of extensions to process, list of files to exclude from
+ processing.
- Ref: Windows DLL hijacking with curl, CVE-2016-4802
-
-- ssh: fix version number check typo
-
-Jay Satiro (29 May 2016)
-- curl_share_setopt.3: Add min ver needed for ssl session lock
+ Check man page in git repoistory using the date from the existing man
+ page before updating to avoid updating the man page if no change is
+ made.
- Bug: https://github.com/curl/curl/issues/826
- Reported-by: Michael Wallner
-
-Daniel Stenberg (29 May 2016)
-- ssh: fix build for libssh2 before 1.2.6
+ If data is received from the git command then update the man page with
+ the current date and version otherwise leave alone.
- The statvfs functionality was added to libssh2 in that version, so we
- switch off that functionality when built with older libraries.
+ Applied patch from badger to make the date argument optional, change the
+ git command used, added date argument to processfile subroutine and
+ print to STDERR if no date is found in a man page.
- Fixes #831
-
-- mbedtls: fix includes so snprintf() works
+ Added code to process the changed man page into a new man page with
+ .dist added to the filename to keep the original source files unchanged.
+ Updated POD documentation to reflect that the date argument optional.
- Regression from the previous *printf() rearrangements, this file missed to
- include the correct header to make sure snprintf() works universally.
+ Code style is in line with CODE_STYLE.md.
- Reported-by: Moti Avrahami
- Bug: https://curl.haxx.se/mail/lib-2016-05/0196.html
-
-Steve Holme (23 May 2016)
-- checksrc.pl: Added variants of strcat() & strncat() to banned function list
+ Directories: docs/ docs/libcurl/ docs/libcurl/opts/ tests/
+ Extensions: .1 .3
+ Excluded files: mk-ca-bundle.1 template.3
- Added support for checking the tchar, unicode and mbcs variants of
- strcat() and strncat() in the banned function list.
+ (TODO Section 3.1)
-Daniel Stenberg (23 May 2016)
-- smtp: minor ident (white space) fixes
+- [Tatsuhiro Tsujikawa brought this change]
-- THANKS: updated after script fixes
+ http2: Fix assertion error on redirect with CL=0
- Now giving credit properly to github user names, fixed some UTF-8 issues
- and added names discovered when contrithanks was improved.
-
-- THANKS-filter: more name cleanups
-
-- contrithanks.sh: exclude existing names case insensitively
-
-- contrithanks.sh: use same grep pattern and -a flag as contributors.sh
-
-- contributors.sh: better grep pattern, use grep -a
-
-- THANKS-filter: fix more names
-
-- contrithanks.sh: do the same github fix as contributors.sh
+ This fixes assertion error which occurs when redirect is done with 0
+ length body via HTTP/2, and the easy handle is reused, but new
+ connection is established due to hostname change:
- from 1577bfa35ba
-
-Jay Satiro (23 May 2016)
-- contributors: Show GitHub username if real name unknown
+ curl: http2.c:1572: ssize_t http2_recv(struct connectdata *,
+ int, char *, size_t, CURLcode *):
+ Assertion `httpc->drain_total >= data->state.drain' failed.
- Prior to this change if a GitHub contributor's real name was unknown
- they would be omitted from the list.
+ To fix this bug, ensure that http2_handle_stream is called.
- Bug: https://github.com/curl/curl/issues/824
+ Fixes #1286
+ Closes #1302
-Daniel Stenberg (21 May 2016)
-- RELEASE-NOTES: synced with 3caaeffbe8ded4
+- ares: Curl_resolver_wait_resolv: clear *entry first in function
-Jay Satiro (20 May 2016)
-- openssl: cleanup must free compression methods
+- ares: better error return on timeouts
- - Free compression methods if OpenSSL 1.0.2 to avoid a memory leak.
+ Assisted-by: Ray Satiro
- Bug: https://github.com/curl/curl/issues/817
- Reported-by: jveazey@users.noreply.github.com
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0009.html
-Daniel Stenberg (20 May 2016)
-- [Gisle Vanem brought this change]
+Jay Satiro (6 Mar 2017)
+- KNOWN_BUGS: Add DarwinSSL won't import PKCS#12 without a password
+
+ Bug: https://github.com/curl/curl/issues/1308
+ Reported-by: Justin Clift
+
+Dan Fandrich (6 Mar 2017)
+- test1260: removed errant XML tag
- curl_multibyte: fix compiler error
+Daniel Stenberg (6 Mar 2017)
+- URL: return error on malformed URLs with junk after port number
+
+ ... because it causes confusion with users. Example URLs:
+
+ "http://[127.0.0.1]:11211:80" which a lot of languages' URL parsers will
+ parse and claim uses port number 80, while libcurl would use port number
+ 11211.
- While compiling lib/curl_multibyte.c with '-DUSE_WIN32_IDN' etc. I was
- getting:
+ "http://user@example.com:80@localhost" which by the WHATWG URL spec will
+ be treated to contain user name 'user@example.com' but according to
+ RFC3986 is user name 'user' for the host 'example.com' and then port 80
+ is followed by "@localhost"
- f:\mingw32\src\inet\curl\lib\memdebug.h(38): error C2054: expected '('
- to follow 'CURL_EXTERN'
+ Both these formats are now rejected, and verified so in test 1260.
- f:\mingw32\src\inet\curl\lib\memdebug.h(38): error C2085:
- 'curl_domalloc': not in formal parameter list
+ Reported-by: Orange Tsai
-- THANKS-filter: make Jan-E get proper credit
+- BINDINGS: update the Lua-cURL URL
-- [Jan-E brought this change]
+- [Sylvestre Ledru brought this change]
- winbuild/Makefile.vc: Fix check on SSL, MBEDTLS, WINSSL exclusivity
+ BINDINGS: add Scilab binding
- Closes #818
-
-- [Alexander Traud brought this change]
+ Closes #1312
- libcurl.m4: Avoid obsolete warning
+- BINDINGS: add go-curl and perl6-net-curl
- Closes #821
+ Reported-by: Peter Pentchev
-Jay Satiro (20 May 2016)
-- [Michael Kaufmann brought this change]
-
- CURLOPT_CONNECT_TO.3: user must not free the list prematurely
+- BINDINGS: add misssing C++ bindings
- The connect-to list isn't copied so as long as the handle may be used
- for a transfer the list must be valid.
+ Reported-by: Giuseppe Persico
+
+- ares: return error at once if timed out before name resolve starts
- Bug: https://github.com/curl/curl/pull/819
- Reported-by: Michael Kaufmann
+ Pointed-out-by: Ray Satiro
+ Bug: https://curl.haxx.se/mail/lib-2017-03/0004.html
-Daniel Stenberg (19 May 2016)
-- RELEASE-NOTES: synced with 48114a8634242c
+Peter Wu (5 Mar 2017)
+- [Michael Maltese brought this change]
-- openssl: ERR_remove_thread_state() is deprecated in latest 1.1.0
+ CMake: Set at most one SSL library
- See OpenSSL commit 21e001747d4a
+ Ref: https://github.com/curl/curl/pull/1228
-- http2: use HTTP/2 in the HTTP/1.1-alike header
-
- ... when generating them, not "2.0" as the protocol is called just
- HTTP/2 and nothing else.
+- [Michael Maltese brought this change]
-Jay Satiro (19 May 2016)
-- dist: include curl_multi_socket_all.3
+ CMake: Add mbedTLS support
- Closes https://github.com/curl/curl/pull/816
+ Ref: https://github.com/curl/curl/pull/1228
-Steve Holme (18 May 2016)
-- bump: Start work on 7.49.1
+- [Michael Maltese brought this change]
-Daniel Stenberg (18 May 2016)
-- curlbuild.h.dist: check __LP64__ as well to fix MIPS build
+ CMake: Add DarwinSSL support
- The preprocessor check that sets up the 32bit defines for non-configure
- builds didn't work properly for MIPS systems as __mips__ is defined for
- both 32bit and 64bit. Now __LP64__ is also checked and indicates 64bit.
-
- Reported-by: Tomas Jakobsson
- Fixes #813
+ Assisted-by: Simon Warta <simon@kullo.net>
+ Ref: https://github.com/curl/curl/pull/1228
-- [Marcel Raad brought this change]
+- [Michael Maltese brought this change]
- schannel: fix compile break with MSVC XP toolset
+ CMake: Reorganize SSL support, separate WinSSL and SSPI
- For the Windows XP toolset of Visual C++ 2013/2015, the old Windows SDK
- 7.1 is used. In this case, _USING_V110_SDK71_ is defined.
+ This is closer to how configure.ac does it
- Closes #812
+ Ref: https://github.com/curl/curl/pull/1228
-- dist: include CHECKSRC.md
+Jay Satiro (4 Mar 2017)
+- CURLOPT_SSL_CTX_FUNCTION.3: Fix EXAMPLE formatting errors
- Reported-by: Paul Howarth
- Bug: https://curl.haxx.se/mail/lib-2016-05/0116.html
+ .. also document that CURLE_NOT_BUILT_IN is a RETURN VALUE.
+
+ Ref: https://github.com/curl/curl/pull/1290
+
+Daniel Stenberg (4 Mar 2017)
+- [Andrew Krieger brought this change]
-- test/Makefile.am: include manpage-scan.pl and nroff-scan.pl in dist
+ fix potential use of uninitialized variables
- Reported-by: Ray Satiro
- Bug: https://curl.haxx.se/mail/lib-2016-05/0113.html
+ MSVC with LTCG detects this at warning level 4.
+
+ Closes #1304
-Version 7.49.0 (17 May 2016)
+Dan Fandrich (4 Mar 2017)
+- [Sylvestre Ledru brought this change]
-Daniel Stenberg (17 May 2016)
-- THANKS: 24 new names from 7.49.0 release notes
+ fix some typos in the doc (#1306)
-- RELEASE-NOTES: 7.49.0
+- tests: fixed a typo in some comments
-- mbedtls/polarssl: set "hostname" unconditionally
+Jay Satiro (3 Mar 2017)
+- url: split off proxy init and parsing from create_conn
- ...as otherwise the TLS libs will skip the CN/SAN check and just allow
- connection to any server. curl previously skipped this function when SNI
- wasn't used or when connecting to an IP address specified host.
+ Move the proxy parse/init into helper create_conn_helper_init_proxy to
+ mitigate the chances some non-proxy code will be mistakenly added to it.
- CVE-2016-3739
+ Ref: https://github.com/curl/curl/issues/1274#issuecomment-281556510
+ Ref: https://github.com/curl/curl/pull/1293
- Bug: https://curl.haxx.se/docs/adv_20160518A.html
- Reported-by: Moti Avrahami
+ Closes https://github.com/curl/curl/pull/1298
-- [Frank Gevaerts brought this change]
+- [Alexis La Goutte brought this change]
- CURLOPT_RESOLVE.3: fix typo
+ build: fix gcc7 implicit fallthrough warnings
+
+ Mark intended fallthroughs with /* FALLTHROUGH */ so that gcc will know
+ it's expected and won't warn on [-Wimplicit-fallthrough=].
- Closes #811
+ Closes https://github.com/curl/curl/pull/1297
-- docs: CURLOPT_RESOLVE overrides CURLOPT_IPRESOLVE
+- [Greg Rowe brought this change]
-- KNOWN_BUGS: GnuTLS backend skips really long certificate fields
+ configure: fix --with-zlib when a path is specified
- Closes #762
+ Prior to this change if you attempted to configure curl using
+ --wtih-zlib and specified a path the path would be ignored if you also
+ had pkg-config installed on your system. This situation can easily
+ arise when you are cross compiling. This change moves the test for
+ detecting zlib settings via pkg-config only if OPT_ZLIB is not set.
+
+ Closes https://github.com/curl/curl/pull/1292
-- CURLOPT_HTTPPOST.3: the data needs to be around while in use
+- [c4rlo brought this change]
-- openssl: get_cert_chain: fix NULL dereference
+ no-keepalive.d: fix typo
- CID 1361815: Explicit null dereferenced (FORWARD_NULL)
+ Closes https://github.com/curl/curl/pull/1301
+
+- checksrc.bat: Ignore curl_config.h.in, curl_config.h
-- openssl: get_cert_chain: avoid NULL dereference
+- configure: fix for --enable-pthreads
- CID 1361811: Explicit null dereferenced (FORWARD_NULL)
+ Better handle options conflicts that can occur if --enable-pthreads.
+
+ Bug: https://github.com/curl/curl/pull/1295
+ Reported-by: Marc-Antoine Perennou
+
+- [JDepooter brought this change]
-- dprintf_formatf: fix (false?) Coverity warning
+ darwinssl: Warn that disabling host verify also disables SNI
- CID 1024412: Memory - illegal accesses (OVERRUN). Claimed to happen when
- we run over 'workend' but the condition says <= workend and for all I
- can see it should be safe. Compensating for the warning by adding a byte
- margin in the buffer.
+ In DarwinSSL the SSLSetPeerDomainName function is used to enable both
+ sending SNI and verifying the host. When host verification is disabled
+ the function cannot be called, therefore SNI is disabled as well.
- Also, removed the extra brace level indentation in the code and made it
- so that 'workend' is only assigned once within the function.
+ Closes https://github.com/curl/curl/pull/1240
-- RELEASE-NOTES: synced with 2dcb5adc72d6
+Marcel Raad (28 Feb 2017)
+- warnless: suppress compiler warning
+
+ If size_t is 32 bits, MSVC warns:
+ warning C4310: cast truncates constant value
+ The warning is harmless as CURL_MASK_SCOFFT gets
+ truncated to the maximum value of size_t.
-- THANKS-filter: fixed Jonathan Cardoso
+Dan Fandrich (27 Feb 2017)
+- tests: enable HTTP/2 tests to run with non-default port numbers
-Jay Satiro (15 May 2016)
-- ftp: fix incorrect out-of-memory code in Curl_pretransfer
+Marcel Raad (27 Feb 2017)
+- digest_sspi: fix compilation warning
- - Return value type must match function type.
+ MSVC complains:
+ warning C4701: potentially uninitialized local variable 'output_token_len' used
+
+Jay Satiro (26 Feb 2017)
+- cyassl: get library version string at runtime
- s/CURLM_OUT_OF_MEMORY/CURLE_OUT_OF_MEMORY/
+ wolfSSL >= 3.6.0 supports getting its library version string at runtime.
+
+Dan Fandrich (26 Feb 2017)
+- test1139: allow for the possibility that the man page is not rebuilt
- Caught by Travis CI
+ This is likely to be the case when building from a tar ball release
+ package which includes a prebuilt man page. In that case, test the
+ packaged man page instead. This only makes a difference when building
+ out-of-tree (in-tree, the location in both cases is identical).
+
+Jay Satiro (25 Feb 2017)
+- [Isaac Boukris brought this change]
-Daniel Stenberg (15 May 2016)
-- ftp wildcard: segfault due to init only in multi_perform
+ url: fix unix-socket support for proxy-disabled builds
- The proper FTP wildcard init is now more properly done in Curl_pretransfer()
- and the corresponding cleanup in Curl_close().
+ Prior to this change if curl was built with Unix Socket support
+ (--enable-unix-sockets) and without Proxy support (--disable-proxy) then
+ unix socket options would erroneously be ignored.
- The previous place of init/cleanup code made the internal pointer to be NULL
- when this feature was used with the multi_socket() API, as it was made within
- the curl_multi_perform() function.
+ Regression introduced in:
+ 0b8d682f81ee9acb763dd4c9ad805fe08d1227c0
- Reported-by: Jonathan Cardoso Machado
- Fixes #800
-
-Jay Satiro (13 May 2016)
-- libcurl-tlibcurl-thread: Update OpenSSL links
+ Bug: https://github.com/curl/curl/issues/1274
+ Reported-by: mccormickt12@users.noreply.github.com
- Because the old OpenSSL link now redirects to their master documentation
- (currently 1.1.0), which does not document the required actions for
- OpenSSL <= 1.0.2.
+ Closes https://github.com/curl/curl/pull/1289
-Daniel Stenberg (13 May 2016)
-- [Viktor Szakats brought this change]
+Dan Fandrich (26 Feb 2017)
+- gopher: fixed detection of an error condition from Curl_urldecode
+
+- ftp: fixed a NULL pointer dereference on OOM
- darwinssl.c: fix OS X codename typo in comment
+Jay Satiro (25 Feb 2017)
+- [Peter Wu brought this change]
-- RELEASE-NOTES: synced with 68701e51c1f7
+ docs: de-duplicate file lists in the Makefiles
- Added 8 bug fixes and 5 more contrbutors
+ Make use of macro substitution of suffix patterns to remove duplication
+ of manual names. This approach is portable according to
+ http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html
+
+ Closes https://github.com/curl/curl/pull/1287
-- [Jay Satiro brought this change]
+Dan Fandrich (25 Feb 2017)
+- ftp: removed an erroneous free in an OOM path
- mprintf: Fix processing of width and prec args
-
- Prior to this change a width arg could be erroneously output, and also
- width and precision args could not be used together without crashing.
+- proxy: fixed a memory leak on OOM
+
+- tests: use consistent environment variables for setting charset
- "%0*d%s", 2, 9, "foo"
+ The character set in POSIX is set by the locale defined by (in
+ decreasing order of precedence) the LC_ALL, LC_CTYPE and LANG
+ environment variables (CHARSET was used by libidn but not libidn2).
+ LC_ALL is cleared to ensure that LC_CTYPE takes effect, but LC_ALL is
+ not used to set the locale to ensure that other parts of the locale
+ aren't overridden. Since there doesn't seem to be a cross-platform way
+ of specifying a UTF-8 locale, and not all systems may support UTF-8, a
+ <precheck> is used to skip the test if UTF-8 can't be verified to be
+ available. Test 1035 was also converted to UTF-8 for consistency, as
+ the actual character set used there is irrelevant to the test.
- Before: "092"
- After: "09foo"
+ This patch uses a different UTF-8 locale than the last attempt, namely
+ en_US.UTF-8. This one has been verified on 7 different Linux and BSD
+ distributions and is more complete and usable than the locale UTF-8 (on
+ at least some systems).
+
+- test557: explicitly use the C locale so the numeric output is as expected
+
+Jay Satiro (25 Feb 2017)
+- [Simon Warta brought this change]
+
+ cmake: Replace invalid UTF-8 byte sequence
- "%*.*s", 5, 2, "foo"
+ - Change the encoding of the regex temp placeholder token to UTF-8.
- Before: crash
- After: " fo"
+ Prior to this change the file contained special chars in a different
+ encoding than ASCII or UTF-8 making text editors and Python complain
+ when reading the file.
- Test 557 is updated to verify this and more
+ Closes https://github.com/curl/curl/pull/1271
+ Closes https://github.com/curl/curl/pull/1275
+
+Daniel Stenberg (24 Feb 2017)
+- bump: work on the next release
+
+Version 7.53.1 (24 Feb 2017)
-- [Michael Kaufmann brought this change]
+Daniel Stenberg (24 Feb 2017)
+- release: 7.53.1
- ConnectionExists: follow-up fix for proxy re-use
+- Revert "tests: use consistent environment variables for setting charset"
- Follow-up commit to 5823179
+ This reverts commit ecd1d020abdae3c3ce3643ddab3106501e62e7c0.
- Closes #648
+ That commit caused test failures on my Debian Linux machine for all
+ changed test cases. We need to reconsider how that should get done.
-- [Per Malmberg brought this change]
+Dan Fandrich (23 Feb 2017)
+- tests: use consistent environment variables for setting charset
+
+ Character set in POSIX is set by the locale defined (in decreasing order
+ of precedence) by the LC_ALL, LC_CTYPE and LANG environment variables (I
+ believe CHARSET is only historic). LC_ALL is cleared to ensure that
+ LC_CTYPE takes effect, but LC_ALL is not used to set the locale to
+ ensure that other parts of the locale aren't overriden, if set. Since
+ there doesn't seem to be a cross-platform way of specifying a UTF-8
+ locale, and not all systems may support UTF-8, a <precheck> is used
+ (where relevant) to skip the test if UTF-8 isn't in use. Test 1035 was
+ also converted to UTF-8 for consistency, as the actual character set
+ used there is irrelevant to the test.
- darwinssl: fix certificate verification disable on OS X 10.8
+Jay Satiro (23 Feb 2017)
+- url: Default the CA proxy bundle location to CURL_CA_BUNDLE
- The new way of disabling certificate verification doesn't work on
- Mountain Lion (OS X 10.8) so we need to use the old way in that version
- too. I've tested this solution on versions 10.7.5, 10.8, 10.9, 10.10.2
- and 10.11.
+ If the compile-time CURL_CA_BUNDLE location is defined use it as the
+ default value for the proxy CA bundle location, which is the same as
+ what we already do for the regular CA bundle location.
- Closes #802
+ Ref: https://github.com/curl/curl/pull/1257
-- [Cory Benfield brought this change]
+Daniel Stenberg (23 Feb 2017)
+- [Sergii Pylypenko brought this change]
- http2: Add space between colon and header value
+ rand: added missing #ifdef HAVE_FCNTL_H around fcntl.h header
- curl's representation of HTTP/2 responses involves transforming the
- response to a format that is similar to HTTP/1.1. Prior to this change,
- curl would do this by separating header names and values with only a
- colon, without introducing a space after the colon.
-
- While this is technically a valid way to represent a HTTP/1.1 header
- block, it is much more common to see a space following the colon. This
- change introduces that space, to ensure that incautious tools are safely
- able to parse the header block.
+ Closes #1285
+
+- TODO: "OPTIONS *"
- This also ensures that the difference between the HTTP/1.1 and HTTP/2
- response layout is as minimal as possible.
+ Closes #1280
+
+- RELEASE-NOTES: synced with 443e5b03a7d441
+
+- THANKS-filter: shachaf
+
+- [İsmail Dönmez brought this change]
+
+ tests: Set CHARSET & LANG to UTF-8 in 1035, 2046 and 2047
- Bug: https://github.com/curl/curl/issues/797
+ Closes #1283
+ Fixes #1277
+
+- bump: 7.53.1 coming up
- Closes #798
- Fixes #797
+ synced with df665f4df0f7a352
-Kamil Dudka (12 May 2016)
-- openssl: fix compile-time warning in Curl_ossl_check_cxn()
+- formdata: check for EOF when reading from stdin
- ... introduced in curl-7_48_0-293-g2968c83:
+ Reported-by: shachaf@users.noreply.github.com
- Error: COMPILER_WARNING:
- lib/vtls/openssl.c: scope_hint: In function ‘Curl_ossl_check_cxn’
- lib/vtls/openssl.c:767:15: warning: conversion to ‘int’ from ‘ssize_t’
- may alter its value [-Wconversion]
+ Fixes #1281
-Jay Satiro (11 May 2016)
-- openssl: stricter connection check function
+Jay Satiro (22 Feb 2017)
+- docs: gitignore curl.1
- - In the case of recv error, limit returning 'connection still in place'
- to EINPROGRESS, EAGAIN and EWOULDBLOCK.
+ curl.1 is generated by the cmdline-opts script since 4c49b83.
+
+Daniel Stenberg (22 Feb 2017)
+- TODO: HTTP Digest using SHA-256
+
+- TODO: brotli is deployed widely now
+
+Jay Satiro (21 Feb 2017)
+- [Viktor Szakats brought this change]
+
+ urldata: include curl_sspi.h when Windows SSPI is enabled
- This is an improvement on the parent commit which changed the openssl
- connection check to use recv MSG_PEEK instead of SSL_peek.
+ f77dabe broke builds in Windows using Windows SSPI but not Windows SSL.
- Ref: https://github.com/curl/curl/commit/856baf5#comments
-
-Daniel Stenberg (11 May 2016)
-- [Anders Bakken brought this change]
+ Bug: https://github.com/curl/curl/issues/1276
+ Reported-by: jveazey@users.noreply.github.com
- TLS: SSL_peek is not a const operation
+- url: Improve CURLOPT_PROXY_CAPATH error handling
- Calling SSL_peek can cause bytes to be read from the raw socket which in
- turn can upset the select machinery that determines whether there's data
- available on the socket.
+ - Change CURLOPT_PROXY_CAPATH to return CURLE_NOT_BUILT_IN if the option
+ is not supported, which is the same as what we already do for
+ CURLOPT_CAPATH.
- Since Curl_ossl_check_cxn only tries to determine whether the socket is
- alive and doesn't actually need to see the bytes SSL_peek seems like
- the wrong function to call.
+ - Change the curl tool to handle CURLOPT_PROXY_CAPATH error
+ CURLE_NOT_BUILT_IN as a warning instead of as an error, which is the
+ same as what we already do for CURLOPT_CAPATH.
- We're able to occasionally reproduce a connect timeout due to this
- bug. What happens is that Curl doesn't know to call SSL_connect again
- after the peek happens since data is buffered in the SSL buffer and thus
- select won't fire for this socket.
+ - Fix CAPATH docs to show that CURLE_NOT_BUILT_IN is returned when the
+ respective CAPATH option is not supported by the SSL library.
- Closes #795
+ Ref: https://github.com/curl/curl/pull/1257
-Jay Satiro (9 May 2016)
-- [Daniel Stenberg brought this change]
+- cyassl: fix typo
- TLS: move the ALPN/NPN enable bits to the connection
-
- Only protocols that actually have a protocol registered for ALPN and NPN
- should try to get that negotiated in the TLS handshake. That is only
- HTTPS (well, http/1.1 and http/2) right now. Previously ALPN and NPN
- would wrongly be used in all handshakes if libcurl was built with it
- enabled.
-
- Reported-by: Jay Satiro
-
- Fixes #789
+Version 7.53.0 (22 Feb 2017)
-Daniel Stenberg (8 May 2016)
-- libcurl-thread.3: openssl 1.1.0 is safe, and so is boringssl
+Daniel Stenberg (22 Feb 2017)
+- release: 7.53.0
-- [Antonio Larrosa brought this change]
+- cookie: fix declaration of 'dup' shadows a global declaration
- connect: fix invalid "Network is unreachable" errors
+- TLS: make SSL_VERIFYSTATUS work again
- Sometimes, in systems with both ipv4 and ipv6 addresses but where the
- network doesn't support ipv6, Curl_is_connected returns an error
- (intermittently) even if the ipv4 socket connects successfully.
+ The CURLOPT_SSL_VERIFYSTATUS option was not properly handled by libcurl
+ and thus even if the status couldn't be verified, the connection would
+ be allowed and the user would not be told about the failed verification.
- This happens because there's a for-loop that iterates on the sockets but
- the error variable is not resetted when the ipv4 is checked and is ok.
+ Regression since cb4e2be7c6d42ca
- This patch fixes this problem by setting error to 0 when checking the
- second socket and not having a result yet.
+ CVE-2017-2629
+ Bug: https://curl.haxx.se/docs/adv_20170222.html
- Fixes #794
-
-Jay Satiro (5 May 2016)
-- FAQ: refer to thread safety guidelines
+ Reported-by: Marcus Hoffmann
-Daniel Stenberg (3 May 2016)
-- connections: non-HTTP proxies on different ports aren't reused either
+Jay Satiro (21 Feb 2017)
+- digest_sspi: Handle 'stale=TRUE' directive in HTTP digest
+
+ - If the server has provided another challenge use it as the replacement
+ input token if stale=TRUE. Otherwise previous credentials have failed
+ so return CURLE_LOGIN_DENIED.
- Reported-by: Oleg Pudeyev and fuchaoqun
+ Prior to this change the stale directive was ignored and if another
+ challenge was received it would cause error CURLE_BAD_CONTENT_ENCODING.
- Fixes #648
+ Ref: https://tools.ietf.org/html/rfc2617#page-10
+
+ Bug: https://github.com/curl/curl/issues/928
+ Reported-by: tarek112@users.noreply.github.com
-- http: make sure a blank header overrides accept_decoding
+Daniel Stenberg (20 Feb 2017)
+- smb: use getpid replacement for windows UWP builds
- Reported-by: rcanavan
- Assisted-by: Isaac Boukris
- Closes #785
+ Source: https://github.com/Microsoft/vcpkg/blob/7676b8780db1e1e591c4fc7eba4f96f73c428cb4/ports/curl/0002_fix_uwp.patch
-- CHECKSRC.md: clarified, explained the whitelist file
+- TODO: CURLOPT_RESOLVE for any port number
+
+ Closes #1264
-- nroff-scan.pl: verify that references are made with \fI
+- RELEASE-NOTES: synced with af30f1152d43dcdb
-- docs: unified man page references to use \fI
+- [Jean Gressmann brought this change]
-- TODO: 17.14 --fail without --location should treat 3xx as a failure
+ sftp: improved checks for create dir failures
- Closes #727
-
-- RELEASE-NOTES: synced with 7987f5cb14d
+ Since negative values are errors and not only -1. This makes SFTP upload
+ with --create-dirs work (again).
+
+ Closes #1269
-- [Isaac Boukris brought this change]
+Jay Satiro (20 Feb 2017)
+- [Max Khon brought this change]
- CURLOPT_ACCEPT_ENCODING.3: Follow-up clarification
+ digest_sspi: Fix nonce-count generation in HTTP digest
+
+ - on the first invocation: keep security context returned by
+ InitializeSecurityContext()
- Mention possible content-length mismatch with sum of bytes reported
- by write callbacks when auto decoding is enabled.
+ - on subsequent invocations: use MakeSignature() instead of
+ InitializeSecurityContext() to generate HTTP digest response
- See #785
+ Bug: https://github.com/curl/curl/issues/870
+ Reported-by: Andreas Roth
+
+ Closes https://github.com/curl/curl/pull/1251
-- test1140: run nroff-scan to verify man pages
+- examples/multi-uv: checksrc compliance
-- nroff-scan.pl: verify the .BR references as well
+Michael Kaufmann (19 Feb 2017)
+- string formatting: fix 4 printf-style format strings
-- CURLOPT_CONV_TO_NETWORK_FUNCTION.3: fix bad man page reference
+Dan Fandrich (18 Feb 2017)
+- tests: removed the obsolete name parameter
-- CURLOPT_BUFFERSIZE.3: fix reference to CURLOPT_MAX_RECV_SPEED_LARGE
+Michael Kaufmann (18 Feb 2017)
+- speed caps: update the timeouts if the speed is too low/high
+
+ Follow-up to 4b86113
+
+ Fixes https://github.com/curl/curl/issues/793
+ Fixes https://github.com/curl/curl/issues/942
-- curl_easy_pause.3: fix man page reference
+- docs: fix timeout handling in multi-uv example
-Jay Satiro (1 May 2016)
-- tool_cb_hdr: Fix --remote-header-name with schemeless URL
+- proxy: fix hostname resolution and IDN conversion
- - Move the existing scheme check from tool_operate.
+ Properly resolve, convert and log the proxy host names.
+ Support the "--connect-to" feature for SOCKS proxies and for passive FTP
+ data transfers.
- In the case of --remote-header-name we want to parse Content-disposition
- for a filename, but only if the scheme is http or https. A recent
- adjustment 0dc4d8e was made to account for schemeless URLs however it's
- not 100% accurate. To remedy that I've moved the scheme check to the
- header callback, since at that point the library has already determined
- the scheme.
+ Follow-up to cb4e2be
- Bug: https://github.com/curl/curl/issues/760
- Reported-by: Kai Noda
+ Reported-by: Jay Satiro
+ Fixes https://github.com/curl/curl/issues/1248
-Daniel Stenberg (1 May 2016)
-- tls: make setting pinnedkey option fail if not supported
+Jay Satiro (17 Feb 2017)
+- [Isaac Boukris brought this change]
+
+ http: fix missing 'Content-Length: 0' while negotiating auth
- to make it obvious to users trying to use the feature with TLS backends
- not supporting it.
+ - While negotiating auth during PUT/POST if a user-specified
+ Content-Length header is set send 'Content-Length: 0'.
- Discussed in #781
- Reported-by: Travis Burtrum
-
-- nroff-scan.pl: verifies nroff pages
+ This is what we do already in HTTPREQ_POST_FORM and what we did in the
+ HTTPREQ_POST case (regression since afd288b).
- ... not used by any test yet but can be used stand-alone.
-
-- opts: fix broken/bad references
-
-- [Michael Kaufmann brought this change]
-
- docs: fix bugs in CURLOPT_HTTP_VERSION.3 and CURLOPT_PIPEWAIT.3
+ Prior to this change no Content-Length header would be sent in such a
+ case.
- Closes #786
-
-- CURLOPT_ACCEPT_ENCODING.3: clarified
+ Bug: https://curl.haxx.se/mail/lib-2017-02/0006.html
+ Reported-by: Dominik Hölzl
- As discussed in #785
+ Closes https://github.com/curl/curl/pull/1242
+
+Daniel Stenberg (16 Feb 2017)
+- [Simon Warta brought this change]
-- curl.1: --mail-rcpt can be used multiple times
+ winbuild: add note on auto-detection of MACHINE in Makefile.vc
- Reported-by: mgendre
- Closes #784
+ Closes #1265
-- [Karlson2k brought this change]
+- RELEASE-PROCEDURE: update the upcoming release calendar
- tests: Use 'pathhelp' for paths conversions in secureserver.pl
+- TODO: consider file name from the redirected URL with -O ?
+
+ It isn't easily solved, but with some thinking someone could probably
+ come up with a working approach?
- Closes #675
+ Closes #1241
-- [Karlson2k brought this change]
+Jay Satiro (15 Feb 2017)
+- tool_urlglob: Allow a glob range with the same start and stop
+
+ For example allow ranges like [1-1] and [a-a] etc.
+
+ Regression since 5ca96cb.
+
+ Bug: https://github.com/curl/curl/issues/1238
+ Reported-by: R. Dennis Steed
- tests: Use 'pathhelp' for paths conversions in sshserver.pl
+Daniel Stenberg (15 Feb 2017)
+- axtls: adapt to API changes
+
+ Builds with axTLS 2.1.2. This then also breaks compatibility with axTLS
+ < 2.1.0 (the older API)
+
+ ... and fix the session_id mixup brought in 04b4ee549
+
+ Fixes #1220
-- [Karlson2k brought this change]
+- RELEASE-NOTES: synced with 690935390c29c
- tests: Use 'pathhelp' for current path in runtests.pl
+- [Nick Draffen brought this change]
-- [Karlson2k brought this change]
+ curl: fix typo in time condition warning message
+
+ The warning message had a typo. The argument long form is --time-cond
+ not --timecond
+
+ Closes #1263
- tests: pathhelp.pm to process paths on Msys/Cygwin
+- smb: code indent
-- lib: include curl_printf.h as one of the last headers
+Jay Satiro (14 Feb 2017)
+- configure: Allow disabling pthreads, fall back on Win32 threads
- curl_printf.h defines printf to curl_mprintf, etc. This can cause
- problems with external headers which may use
- __attribute__((format(printf, ...))) markers etc.
+ When the threaded resolver option is specified for configure the default
+ thread library is pthreads. This change makes it possible to
+ --disable-pthreads and then configure can fall back on Win32 threads for
+ native Windows builds.
+
+ Closes https://github.com/curl/curl/pull/1260
+
+Daniel Stenberg (13 Feb 2017)
+- http2: fix memory-leak when denying push streams
- To avoid that they cause problems with system includes, we include
- curl_printf.h after any system headers. That makes the three last
- headers to always be, and we keep them in this order:
+ Reported-by: zelinchen@users.noreply.github.com
+ Fixes #1229
+
+Jay Satiro (11 Feb 2017)
+- tool_operate: Show HTTPS-Proxy options on CURLE_SSL_CACERT
- curl_printf.h
- curl_memory.h
- memdebug.h
+ When CURLE_SSL_CACERT occurs the tool shows a lengthy error message to
+ the user explaining possible solutions such as --cacert and --insecure.
- None of them include system headers, they all do funny #defines.
+ This change appends to that message similar options --proxy-cacert and
+ --proxy-insecure when there's a specified HTTPS proxy.
- Reported-by: David Benjamin
+ Closes https://github.com/curl/curl/issues/1258
+
+Daniel Stenberg (10 Feb 2017)
+- cmdline-opts/page-footer: ftp.sunet.se is no longer an FTP mirror
+
+- URL: only accept ";options" in SMTP/POP3/IMAP URL schemes
- Fixes #743
+ Fixes #1252
-- memdebug.h: remove inclusion of other headers
+Jay Satiro (9 Feb 2017)
+- cmdline-opts/socks*: Mention --preproxy in --socks* opts
- Mostly because they're not needed, because memdebug.h is always included
- last of all headers so the others already included the correct ones.
+ - Document in --socks* opts they're still mutually exclusive of --proxy.
- But also, starting now we don't want this to accidentally include any
- system headers, as the header included _before_ this header may add
- defines and other fun stuff that we won't want used in system includes.
+ Partial revert of 423a93c; I had misinterpreted the SOCKS proxy +
+ HTTP/HTTPS proxy combination.
+
+ - Document in --socks* opts that --preproxy can be used to specify a
+ SOCKS proxy at the same time --proxy is used with an HTTP/HTTPS proxy.
-- [Jay Satiro brought this change]
+Daniel Stenberg (9 Feb 2017)
+- CURLOPT_SSL_VERIFYPEER.3: also the https proxy version
- curl -J: make it work even without http:// scheme on URL
+Kamil Dudka (9 Feb 2017)
+- nss: make FTPS work with --proxytunnel
- It does open up a miniscule risk that one of the other protocols that
- libcurl could use would send back a Content-Disposition header and then
- curl would act on it even if not HTTP.
+ If the NSS code was in the middle of a non-blocking handshake and it
+ was asked to finish the handshake in blocking mode, it unexpectedly
+ continued in the non-blocking mode, which caused a FTPS connection
+ over CONNECT to fail with "(81) Socket not ready for send/recv".
- A future mitigation for this risk would be to allow the callback to ask
- libcurl which protocol is being used.
-
- Verified with test 1312
+ Bug: https://bugzilla.redhat.com/1420327
+
+Daniel Stenberg (9 Feb 2017)
+- examples/multithread.c: link to our multi-thread docs
- Closes #760
+ ... instead of the OpenSSL mutex page.
-- manpage-scan.pl: also verify the command line option docs
+- http_proxy: avoid freeing static memory
- This script now also scans src/tool_getparam.c, docs/curl.1 and
- src/tool_help.c and will warn if any of them lists a command line option
- not mentioned in one of the other places.
+ Follow up to 7fe81ec298e0: make sure 'host' is either NULL or malloced.
-- curl: show the long option version of -q in the -h list
+- [Cameron MacMinn brought this change]
-- curl: remove "--socks" as "--socks5" turned 8
+ http_proxy: Fix tiny memory leak upon edge case connecting to proxy
- In commit 2e42b0a2524 (Jan 2008) we made the option "--socks" deprecated
- and it has not been documented since. The more explicit socks options
- (like --socks4 or --socks5) should be used.
+ Fixes #1255
-- curl.1: document the deprecated --ftp-ssl option
-
-- curl: remove --http-request
+Michael Kaufmann (8 Feb 2017)
+- polarssl, mbedtls: Fix detection of pending data
- It was mentioned as deprecated already in commit ae1912cb0d4 from
- 1999. It has not been documented in this millennium.
+ Reported-by: Dan Fandrich
+ Bug: https://curl.haxx.se/mail/lib-2017-02/0032.html
-- curl: mention --ntlm-wb in -h list
+Dan Fandrich (7 Feb 2017)
+- test1139: Added the --manual keyword since the manual is required
-- curl: -h output lacked --proxy-header
+Daniel Stenberg (7 Feb 2017)
+- RELEASE-NOTES: synced with 102454459dd688c
-- curl.1: document --ntlm-wb
+- THANKS-filter: polish some recent contributors
-- curl.1: document the long format of -q: --disable
+- http2: reset push header counter fixes crash
+
+ When removing an easy handler from a multi before it completed its
+ transfer, and it had pushed streams, it would segfault due to the pushed
+ counted not being cleared.
+
+ Fixed-by: zelinchen@users.noreply.github.com
+ Fixes #1249
-- curl.1: mention the deprecated --krb4 option
+- [Markus Westerlind brought this change]
-- curl.1: document --ftp-ssl-reqd
+ transfer: only retry nobody-requests for HTTP
- Even if deprecated, document it so that people will find it as old
- scripts may still use it.
-
-- curl: use --telnet-option as documented
+ Using sftp to delete a file with CURLOPT_NOBODY set with a reused
+ connection would fail as curl expected to get some data. Thus it would
+ retry the command again which fails as the file has already been
+ deleted.
- The code said "telnet-options" but no documentation ever said so. It
- worked fine since the code is fine with a unique match of the first
- part.
+ Fixes #1243
-- getparam: remove support for --ftpport
-
- It has been deprecated and undocumented since commit ad5ead8bed7 (Dec
- 2003). --ftp-port is the proper long option name.
+Jay Satiro (7 Feb 2017)
+- [Daniel Gustafsson brought this change]
-- curl: make --disable work as long form of -q
+ telnet: Fix typos
- To make the aliases list reflect reality.
+ Ref: https://github.com/curl/curl/pull/1245
-- aliases: remove trailing space from capath string
+- [Daniel Gustafsson brought this change]
-- cmdline parse: only single letter options have single-letter strings
+ test552: Fix typos
- ... moved around options so that parsing the code to find all
- single-letter options easier.
+ Closes https://github.com/curl/curl/pull/1245
+
+- [Daniel Gustafsson brought this change]
-Jay Satiro (28 Apr 2016)
-- CURLINFO_TLS_SSL_PTR.3: Clarify SSL pointer availability
+ darwinssl: Avoid parsing certificates when not in verbose mode
+
+ The information extracted from the server certificates in step 3 is only
+ used when in verbose mode, and there is no error handling or validation
+ performed as that has already been done. Only run the certificate
+ information extraction when in verbose mode and libcurl was built with
+ verbose strings.
- Bug: https://curl.haxx.se/mail/lib-2016-04/0126.html
- Reported-by: Bru Rom
+ Closes https://github.com/curl/curl/pull/1246
-Daniel Stenberg (28 Apr 2016)
-- curl_easy_getinfo.3: remove superfluous blank lines
+- [JDepooter brought this change]
-- test1139: verifies libcurl option man page presence
+ schannel: Remove incorrect SNI disabled message
+
+ - Remove the SNI disabled when host verification disabled message
+ since that is incorrect.
- - checks that each option has its own man page present
+ - Show a message for legacy versions of Windows <= XP that connections
+ may fail since those versions of WinSSL lack SNI, algorithms, etc.
+
+ Bug: https://github.com/curl/curl/pull/1240
+
+Daniel Stenberg (7 Feb 2017)
+- CHANGES: spell fix, use correct path to script
+
+- CHANGES.0: removed
- - checks that each option is mentioned in its corresponding index man
- page
+ This is the previously manually edited changelog, not touched since Aug
+ 2015. Still present in git for those who wants it.
+
+Dan Fandrich (6 Feb 2017)
+- cmdline-opts: Fixed build and test in out of source tree builds
-- curl_easy_getinfo.3: added missing mention of CURLINFO_TLS_SESSION
+Viktor Szakats (6 Feb 2017)
+- use *.sourceforge.io and misc URL updates
- ... although it is deprecated.
+ Ref: https://sourceforge.net/blog/introducing-https-for-project-websites/
+ Closes: https://github.com/curl/curl/pull/1247
-Jay Satiro (28 Apr 2016)
-- mbedtls: Fix session resume
+Jay Satiro (6 Feb 2017)
+- docs: Add more HTTPS proxy documentation
- This also fixes PolarSSL session resume.
+ - Document HTTPS proxy type.
- Prior to this change the TLS session information wasn't properly
- saved and restored for PolarSSL and mbedTLS.
+ - Document --write-out %{proxy_ssl_verify_result}.
- Bug: https://curl.haxx.se/mail/lib-2016-01/0070.html
- Reported-by: Thomas Glanzmann
+ - Document SOCKS proxy + HTTP/HTTPS proxy combination.
- Bug: https://curl.haxx.se/mail/lib-2016-04/0095.html
- Reported-by: Moti Avrahami
-
-Daniel Stenberg (27 Apr 2016)
-- RELEASE-NOTES: synced with f4298fcc6d2
-
-- [Michael Kaufmann brought this change]
+ HTTPS proxy support was added in 7.52.0 for OpenSSL, GnuTLS and NSS.
+
+ Ref: https://github.com/curl/curl/commit/cb4e2be
- opts: Fix some syntax errors in example code fragments
+- OS400: Fix symbols
+
+ - s/CURLOPT_SOCKS_PROXY/CURLOPT_PRE_PROXY
+ Follow-up to 7907a2b and 845522c.
+
+ - Fix incorrect id for CURLOPT_PROXY_PINNEDPUBLICKEY.
+
+ - Add id for CURLOPT_ABSTRACT_UNIX_SOCKET.
- Fixes #779
+ Bug: https://github.com/curl/curl/issues/1237
+ Reported-by: jonrumsey@users.noreply.github.com
-- openssl: avoid BN_print a NULL bignum
+- [Sean Burford brought this change]
+
+ cmake: Support curl --xattr when built with cmake
- OpenSSL 1.1.0-pre seems to return NULL(?) for a whole lot of those
- numbers so make sure the function handles this.
+ - Test for and set HAVE_FSETXATTR when support for extended file
+ attributes is present.
- Reported-by: Linus Nordberg
+ Closes https://github.com/curl/curl/pull/1176
-- [Marcel Raad brought this change]
+- [Adam Langley brought this change]
- CONNECT_ONLY: don't close connection on GSS 401/407 reponses
+ openssl: Don't use certificate after transferring ownership
- Previously, connections were closed immediately before the user had a
- chance to extract the socket when the proxy required Negotiate
- authentication.
+ SSL_CTX_add_extra_chain_cert takes ownership of the given certificate
+ while, despite the similar name, SSL_CTX_add_client_CA does not. Thus
+ it's best to call SSL_CTX_add_client_CA before
+ SSL_CTX_add_extra_chain_cert, while the code still has ownership of the
+ argument.
- This regression was brought in with the security fix in commit
- 79b9d5f1a42578f
+ Closes https://github.com/curl/curl/pull/1236
+
+Daniel Stenberg (29 Jan 2017)
+- [Antoine Aubert brought this change]
+
+ mbedtls: implement CTR-DRBG and HAVEGE random generators
- Closes #655
+ closes #1227
-- CURLINFO_TLS_SESSION.3: clarify TLS library support before 7.48.0
+- docs: we no longer ship HTML versions of man pages
+
+ ... refer to the web site for the web versions.
-- mbedtls.c: silly spellfix of a comment
+- [railsnewbie257 brought this change]
-- KNOWN_BUGS: 1.10 Strips trailing dot from host name
+ docs: proofread README.netware README.win32
- Closes #716
+ Closes #1231
+
+- RELEASE-NOTES; synced with ab08d82648
-- test1322: verify stripping of trailing dot from host name
+Michael Kaufmann (28 Jan 2017)
+- mbedtls: disable TLS session tickets
- While being debated (in #716) and a violation of RFC 7230 section 5.4,
- this test verifies that the existing functionality works as intended. It
- strips the dot from the host name and uses the host without dot
- throughout the internals.
+ SSL session reuse with TLS session tickets is not supported yet.
+ Use SSL session IDs instead.
+
+ See https://github.com/curl/curl/issues/1109
-- multi: accidentally used resolved host name instead of proxy
+- gnutls: disable TLS session tickets
- Regression introduced in 09b5a998
+ SSL session reuse with TLS session tickets is not supported yet.
+ Use SSL session IDs instead.
- Bug: https://curl.haxx.se/mail/lib-2016-04/0084.html
- Reported-by: BoBo
+ Fixes https://github.com/curl/curl/issues/1109
-- symbols-in-versions: added new CURLSSLBACKEND_ symbols
+- polarssl: fix hangs
+
+ This bugfix is similar to commit c111178bd4.
-- test148: fixed after the --ftp-create-dirs retry change
+Daniel Stenberg (27 Jan 2017)
+- cookies: do not assume a valid domain has a dot
- follow-up commit to 3c1e84f569 as it made curl try a little harder
+ This repairs cookies for localhost.
+
+ Non-PSL builds will now only accept "localhost" without dots, while PSL
+ builds okeys everything not listed as PSL.
+
+ Added test 1258 to verify.
+
+ This was a regression brought in a76825a5efa6b4
-- curl.h: clarify curl_sslbackend for openssl clones and renames
+- TODO: remove "Support TLS v1.3"
+
+ Support is trickling in already.
-- [Karlson2k brought this change]
+- [railsnewbie257 brought this change]
- url.c: fixed DEBUGASSERT() for WinSock workaround
+ INTERNALS.md: language improvements
- If buffer is allocated, but nothing is received during prereceive
- stage, than number of processed bytes must be zero.
-
- Closes #778
+ Closes #1226
-- KNOWN_BUGS: --interface for ipv6 binds to unusable IP address
+- telnet: fix windows compiler warnings
+
+ Thumbs-up-by: Jay Satiro
- Closes #686 for now.
+ Closes #1225
-- TODO: 1.17 Add support for IRIs
+- VC: remove the makefile.vc6 build infra
- Adding support for IRIs is a mouthful, but is probably interesting at
- least for areas and countries where the use of such "URLs" are growing
- popularity.
+ The winbuild/ build files is now the single MSVC makefile build choice.
- Closes #776
+ Closes #1215
-- THANKS-filter: Travis Burtrum
+- [Jay Satiro brought this change]
-- lib1517: checksrc compliance
+ cmdline-opts/gen.pl: Open input files in CRLF mode
+
+ On Windows it's possible to have input files with CRLF line endings and
+ a perl that defaults to LF line endings (eg msysgit). Currently that
+ results in generator output of mixed line endings of CR, LF and CRLF.
+
+ This change fixes that issue in the most succinct way by opening the
+ files in :crlf text mode even when the perl being used does not default
+ to that mode. (On operating systems that don't have a separate text mode
+ it's essentially a no-op.) The output continues to be in the perl's
+ native line ending.
-- [moparisthebest brought this change]
+- docs/curl.1: generate from the cmdline-opts script
- PolarSSL: Implement public key pinning
+- vtls: source indentation fix
-Patrick Monnerat (22 Apr 2016)
-- os400: upgrade ILE/RPG binding
+- contri*.sh: cut off parentheses from names too
-- curl.h: CURLOPT_CONNECT_TO sets a struct slist *, not a string
+- RELEASE-NOTES: synced with 01ab7c30bba6f
-Daniel Stenberg (22 Apr 2016)
-- contributors.sh: make --releasenotes implied
+- vtls: fix PolarSSL non-blocking handling
- It got too annoying to type =)
+ A regression brought in cb4e2be
+
+ Reported-by: Michael Kaufmann
+ Bug: https://github.com/curl/curl/issues/1174#issuecomment-274018791
-- RELEASE-NOTES: synced with 3c1e84f5693d8093
+- [Antoine Aubert brought this change]
-- curl: make --ftp-create-dirs retry on failure
+ vtls: fix mbedtls multi non blocking handshake.
- The underlying libcurl option used for this feature is
- CURLOPT_FTP_CREATE_MISSING_DIRS which has the ability to retry the dir
- creation, but it was never set to do that by the command line tool.
+ When using multi, mbedtls handshake is in non blocking mode. vtls must
+ set wait for read/write flags for the socket.
- Now it does.
-
- Bug: https://curl.haxx.se/mail/archive-2016-04/0021.html
- Reported-by: John Wanghui
- Help-by: Leif W
+ Closes #1223
-- [Henrik Gaßmann brought this change]
+- [Richy Kim brought this change]
- winbuild: add mbedtls support
+ CURLOPT_BUFFERSIZE: support enlarging receive buffer
- Add WITH_MBEDTLS option. Make WITH_SSL, WITH_MBEDTLS and ENABLE_WINSSL
- options mutual exclusive.
+ Replace use of fixed macro BUFSIZE to define the size of the receive
+ buffer. Reappropriate CURLOPT_BUFFERSIZE to include enlarging receive
+ buffer size. Upon setting, resize buffer if larger than the current
+ default size up to a MAX_BUFSIZE (512KB). This can benefit protocols
+ like SFTP.
- Closes #606
+ Closes #1222
-- KNOWN_BUGS: fixed "5.6 Improper use of Autoconf cache variables"
+- sws: use SOCKERRNO, not errno
- As of commit d9f3b365a3
-
-- [Irfan Adilovic brought this change]
+ Reported-by: Gisle Vanem
- configure: ac_cv_ -> curl_cv_ for write-only vars
+Michael Kaufmann (19 Jan 2017)
+- KNOWN_BUGS: HTTP/2 server push enabled when no pushes can be accepted
- These configure vars are modified in a curl-specific way but never
- evaluated or loaded from cache, even though they are designated as
- _cv_. We could either implement proper AC_CACHE_CHECKs for them, or
- remove them completely.
+ This has been implemented with commit 9ad034e.
+
+Viktor Szakats (19 Jan 2017)
+- *.rc: escape non-ASCII/non-UTF-8 character for clarity
- Fixes #603 as ac_cv_func_gethostbyname is no longer clobbered, and
- AC_CHECK_FUNC(gethostbyname...) will no longer spuriously succeed after
- the first configure run with caching.
+ Closes https://github.com/curl/curl/pull/1217
+
+Kamil Dudka (19 Jan 2017)
+- docs: non-blocking SSL handshake is now supported with NSS
- `ac_cv_func_strcasecmp` is curious, see #770.
+ Implemented since curl-7_36_0-130-g8868a22
- `eval "ac_cv_func_$func=yes"` can still cause problems as it works in
- tandem with AC_CHECK_FUNCS and then potentially modifies its result. It
- would be best to rewrite this test to use a new CURL_CHECK_FUNCS macro,
- which works the same as AC_CHECK_FUNCS but relies on caching the values
- of curl_cv_func_* variables, without modifiying ac_cv_func_*.
-
-- [Irfan Adilovic brought this change]
+ Reported-by: Fahim Chandurwala
- configure: ac_cv_ -> curl_cv_ for r/w vars
+Michael Kaufmann (18 Jan 2017)
+- CURLOPT_CONNECT_TO: Fix compile warnings
- These configure vars are modified in a curl-specific way and modified by
- the configure process, but are never loaded from cache, even though they
- are designated as _cv_. We should implement proper AC_CACHE_CHECKs for
- them eventually.
+ Fix compile warnings that appeared only when curl has been configured
+ with '--disable-verbose'.
-- [Irfan Adilovic brought this change]
+Daniel Stenberg (18 Jan 2017)
+- usercertinmem.c: improve the short description
- configure: ac_cv_func_clock_gettime -> curl_...
+- parseurl: move back buffer to function scope
- This variable must not be cached in its current form, as any cached
- information will prevent the next configure run from determining the
- correct LIBS needed for the function. Thus, rename prefix `ac_cv_` to
- just `curl_`.
-
-- [Irfan Adilovic brought this change]
-
- configure: ac_cv_ -> curl_cv_ for all cached vars
+ Regression since 1d4202ad, which moved the buffer into a more narrow
+ scope, but the data in that buffer was used outside of that more narrow
+ scope.
- This was automated by:
+ Reported-by: Dan Fandrich
+ Bug: https://curl.haxx.se/mail/lib-2017-01/0093.html
+
+Jay Satiro (17 Jan 2017)
+- openssl: Fix random generation
- sed -b -i -f <(ack -A1 AC_CACHE_CHECK | \
- ack -o 'ac_cv_.*?\b' | \
- sort -u | xargs -n1 bash -c \
- 'echo "s/$0/curl_cv_${0#ac_cv_}/g"') \
- $(git ls-files)
+ - Fix logic error in Curl_ossl_random.
- This only changed the prefix for 16 variables actually checked with
- AC_CACHE_CHECK.
+ Broken a few days ago in 807698d.
-- openssl: builds with OpenSSL 1.1.0-pre5
+Daniel Stenberg (17 Jan 2017)
+- TODO: share OpenSSL contexts
- The RSA, DSA and DH structs are now opaque and require use of new APIs
+ By supporting this, subsequent connects would load a lot less data from
+ disk.
- Fixes #763
+ Closes #1110
-Steve Holme (20 Apr 2016)
-- url.c: Prefer we don't use explicit NULLs in conditions
-
- Fixed commit fa5fa65a30 to not use NULLs in if condition.
+- bump: next release will be 7.53.0
-Daniel Stenberg (20 Apr 2016)
-- [Isaac Boukris brought this change]
+Kamil Dudka (15 Jan 2017)
+- nss: use the correct lock in nss_find_slot_by_name()
- NTLM: check for NULL pointer before deferencing
-
- At ConnectionExists, both check->proxyuser and check->proxypasswd
- could be NULL, so make sure to check first.
+Alessandro Ghedini (15 Jan 2017)
+- http2: disable server push if not requested
- Fixes #765
+ Ref: https://github.com/curl/curl/pull/1160
-- [Karlson2k brought this change]
+Daniel Stenberg (14 Jan 2017)
+- [railsnewbie257 brought this change]
- tests: added test1517
+ docs: improved language in README.md HISTORY.md CONTRIBUTE.md
- ... for checking ability to receive full HTTP response when POST request
- is used with slow read callback function.
+ Closes #1211
+
+Alessandro Ghedini (14 Jan 2017)
+- http: print correct HTTP string in verbose output when using HTTP/2
- This test checks for bug #657 and verifies the work-around from
- 72d5e144fbc6.
+ Before:
+ ```
+ % src/curl https://sigsegv.ninja/ -v --http2
+ ...
+ > GET / HTTP/1.1
+ > Host: sigsegv.ninja
+ > User-Agent: curl/7.52.2-DEV
+ > Accept: */*
+ >
+ ...
+ ```
- Closes #720
+ After:
+ ```
+ % src/curl https://sigsegv.ninja/ -v --http2
+ ...
+ > GET / HTTP/2
+ > Host: sigsegv.ninja
+ > User-Agent: curl/7.52.2-DEV
+ > Accept: */*
+ >
+ ```
-- [Karlson2k brought this change]
+Daniel Stenberg (14 Jan 2017)
+- TODO: send only part of --data
+
+ Closes #1200
- sendf.c: added ability to call recv() before send() as workaround
+- TODO: implemened "--fail-fast to exit on first transfer fail"
- WinSock destroys recv() buffer if send() is failed. As result - server
- response may be lost if server sent it while curl is still sending
- request. This behavior noticeable on HTTP server short replies if
- libcurl use several send() for request (usually for POST request).
- To workaround this problem, libcurl use recv() before every send() and
- keeps received data in intermediate buffer for further processing.
+ Even though it is called --fail-early
+
+- TODO: Chunked transfer multipart formpost
- Fixes: #657
- Closes: #668
+ Closes #1139
+
+- TODO: Improve formpost API, not just add an easy argument
-Kamil Dudka (19 Apr 2016)
-- connect: make sure that rc is initialized in singleipconnect()
+- addrinfo: fix compiler warning on offsetof() use
- This commit fixes a Clang warning introduced in curl-7_48_0-190-g8f72b13:
+ curl_addrinfo.c:519:20: error: conversion to ‘curl_socklen_t {aka
+ unsigned int}’ from ‘long unsigned int’ may alter its value
+ [-Werror=conversion]
- Error: CLANG_WARNING:
- lib/connect.c:1120:11: warning: The right operand of '==' is a garbage value
- 1118| }
- 1119|
- 1120|-> if(-1 == rc)
- 1121| error = SOCKERRNO;
- 1122| }
+ Follow-up to 1d786faee1046f
-Daniel Stenberg (19 Apr 2016)
-- make/checksrc: use $srcdir, not $top_srcdir
+- THANKS-filter: Jiri Malak
-- src/checksrc.whitelist: removed
+- RELEASE-NOTES: synced with a7c73ae309c
-- tool_operate: switch to inline checksrc ignore
+Peter Wu (13 Jan 2017)
+- [Isaac Boukris brought this change]
-- lib/checksrc.whitelist: not needed anymore
+ unix_socket: add support for abstract unix domain socket
- ... as checksrc now skips comments
-
-- vtls.h: remove a space before semicolon
+ In addition to unix domain sockets, Linux also supports an
+ abstract namespace which is independent of the filesystem.
- ... that the new checksrc detected
-
-- darwinssl: removed commented out code
-
-- http_chunks: removed checksrc disable
+ In order to support it, add new CURLOPT_ABSTRACT_UNIX_SOCKET
+ option which uses the same storage as CURLOPT_UNIX_SOCKET_PATH
+ internally, along with a flag to specify abstract socket.
- ... since checksrc now skips comments
-
-- imap: inlined checksrc disable instead of whitelist edit
-
-- checksrc: taught to skip comments
+ On non-supporting platforms, the abstract address will be
+ interpreted as an empty string and fail gracefully.
+
+ Also add new --abstract-unix-socket tool parameter.
- ... but output non-stripped version of the line, even if that then can
- make the script identify the wrong position in the line at
- times. Showing the line stripped (ie without comments) is just too
- surprising.
+ Signed-off-by: Isaac Boukris <iboukris@gmail.com>
+ Reported-by: Chungtsun Li (typeless)
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Peter Wu
+ Closes #1197
+ Fixes #1061
-- opts/Makefile.am: list all docs file one by one
+Daniel Stenberg (13 Jan 2017)
+- write-out.d: 'time_total' is not always shown with ms precision
- ... to make it easier to add lines in patches that won't just break all
- other patches trying to add lines too.
+ We have higher resolution since 7.52.0
-- curl_easy_setopt.3: mention CURLOPT_TCP_FASTOPEN
+- next.d: --trace and --trace-ascii are also global
-- RELEASE-NOTES: synced with 03de4e4b219
+- [Isaac Boukris brought this change]
+
+ curl: reset the easy handle at --next
- (since we just merged two major features)
+ So that only "global" options (verbose mostly) survive into the next
+ transfer, and the others have to be set again unless default is fine.
-- [Alessandro Ghedini brought this change]
+- [Frank Gevaerts brought this change]
- connect: implement TCP Fast Open for Linux
+ docs: Add note about libcurl copying strings to CURLOPT_* manpages
- Closes #660
+ Closes #1169
-- [Alessandro Ghedini brought this change]
+- [Frank Gevaerts brought this change]
- tool: add --tcp-fastopen option
+ CURLOPT_PREQUOTE.3: takes a struct curl_slist*, not a char*
-- [Alessandro Ghedini brought this change]
+- IDN: Use TR46 non-transitional
+
+ Assisted-by: Tim Rühsen
- connect: implement TCP Fast Open for OS X
+- IDN: revert use of the transitional option
+
+ It made the german ß get converted to ss, IDNA2003 style, and we can't
+ have that for the .de TLD - a primary reason for our switch to IDNA2008.
+
+ Test 165 verifies.
-- [Alessandro Ghedini brought this change]
+- [Tim Rühsen brought this change]
- url: add CURLOPT_TCP_FASTOPEN option
+ IDN: Fix compile time detection of linidn2 TR46
+
+ Follow-up to f30cbcac1
+
+ Closes #1207
-- checksrc: pass on -D so the whitelists are found correctly
+- [ERAMOTO Masaya brought this change]
-- configure: remove check for libresolve
+ url: --noproxy option overrides NO_PROXY environment variable
- 'strncasecmp' was once provided by libresolv (no trailing e) for SunOS,
- but this check is broken and most likely adds nothing useful. Removing
- now.
+ Under condition using http_proxy env var, noproxy list was the
+ combination of --noproxy option and NO_PROXY env var previously. Since
+ this commit, --noproxy option overrides NO_PROXY environment variable
+ even if use http_proxy env var.
- Reported-by: Irfan Adilovic
-
- Discussed in #770
+ Closes #1140
+
+- [ERAMOTO Masaya brought this change]
-- scripts/make: use $(EXEEXT) for executables
+ url: Refactor detect_proxy()
- Reported-by: bodop
+ If defined CURL_DISABLE_HTTP, detect_proxy() returned NULL. If not
+ defined CURL_DISABLE_HTTP, detect_proxy() checked noproxy list.
- Fixes #771
+ Thus refactor to set proxy to NULL instead of calling detect_proxy() if
+ define CURL_DISABLE_HTTP, and refactor to call detect_proxy() if not
+ define CURL_DISABLE_HTTP and the host is not in the noproxy list.
-- includes: avoid duplicate memory callback typdefs even harder
+- [ERAMOTO Masaya brought this change]
-- checksrc/makefile.am: use $top_srcdir to find source files
+ url: Fix NO_PROXY env var to work properly with --proxy option.
+
+ The combination of --noproxy option and http_proxy env var works well
+ both for proxied hosts and non-proxied hosts.
+
+ However, when combining NO_PROXY env var with --proxy option,
+ non-proxied hosts are not reachable while proxied host is OK.
- ... to properly support out of source tree builds.
+ This patch allows us to access non-proxied hosts even if using NO_PROXY
+ env var with --proxy option.
-- RELEASE-NOTES: synced with 26ec93dd6aeba8dfb5
+- [Tim Rühsen brought this change]
-- opts: fix option references missing (section)
+ IDN: Use TR46 'transitional' for toASCII translations
+
+ References: http://unicode.org/faq/idn.html
+ http://unicode.org/reports/tr46
+
+ Closes #1206
-- [Michael Kaufmann brought this change]
+- [railsnewbie257 brought this change]
- news: CURLOPT_CONNECT_TO and --connect-to
+ docs: FAQ MAIL-ETIQUETTE language fixes
- Makes curl connect to the given host+port instead of the host+port found
- in the URL.
+ Closes #1194
-- makefile.vc6: use d suffix on debug object
-
- To allow both release and debug builds in parallel.
+- [Marcus Hoffmann brought this change]
+
+ gnutls: check for alpn and ocsp in configure
- Reported-by: Rod Widdowson
+ Check for presence of gnutls_alpn_* and gnutls_ocsp_* functions during
+ configure instead of relying on the version number. GnuTLS has options
+ to turn these features off and we ca just work with with such builds
+ like we work with older versions.
- Fixes #769
-
-Jay Satiro (12 Apr 2016)
-- http2: Use size_t type for data drain count
+ Signed-off-by: Marcus Hoffmann <m.hoffmann@cartelsol.com>
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
+ Closes #1204
-- http2: Improve header parsing
+Jay Satiro (12 Jan 2017)
+- url: Fix parsing for when 'file' is the default protocol
- - Error if a header line is larger than supported.
+ Follow-up to 3463408.
- - Warn if cumulative header line length may be larger than supported.
+ Prior to 3463408 file:// hostnames were silently stripped.
- - Allow spaces when parsing the path component.
+ Prior to this commit it did not work when a schemeless url was used with
+ file as the default protocol.
- - Make sure each header line ends in \r\n. This fixes an out of bounds.
+ Ref: https://curl.haxx.se/mail/lib-2016-11/0081.html
+ Closes https://github.com/curl/curl/pull/1124
- - Disallow header continuation lines until we decide what to do.
+ Also fix for drive letters:
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
-
-- http2: Add Curl_http2_strerror for HTTP/2 error codes
+ - Support --proto-default file c:/foo/bar.txt
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- http2: Don't increment drain when one header field is received
+ - Support file://c:/foo/bar.txt
- Sicne we write header field in temporary location, not in the memory
- that upper layer provides, incrementing drain should not happen.
+ - Fail when a file:// drive letter is detected and not MSDOS/Windows.
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Bug: https://github.com/curl/curl/issues/1187
+ Reported-by: Anatol Belski
+ Assisted-by: Anatol Belski
- http2: Ensure that http2_handle_stream_close is called
+Daniel Stenberg (12 Jan 2017)
+- rand: make it work without TLS backing
- This commit ensures that streams which was closed in on_stream_close
- callback gets passed to http2_handle_stream_close. Previously, this
- might not happen. To achieve this, we increment drain property to
- forcibly call recv function for that stream.
+ Regression introduced in commit f682156a4fc6c4
- To more accurately check that we have no pending event before shutting
- down HTTP/2 session, we sum up drain property into
- http_conn.drain_total. We only shutdown session if that value is 0.
-
- With this commit, when stream was closed before reading response
- header fields, error code CURLE_HTTP2_STREAM is returned even if
- HTTP/2 level error is NO_ERROR. This signals the upper layer that
- stream was closed by error just like TCP connection close in HTTP/1.
-
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
+ Reported-by: John Kohl
+ Bug: https://curl.haxx.se/mail/lib-2017-01/0055.html
-- [Tatsuhiro Tsujikawa brought this change]
-
- http2: Process paused data first before tear down http2 session
-
- This commit ensures that data from network are processed before HTTP/2
- session is terminated. This is achieved by pausing nghttp2 whenever
- different stream than current easy handle receives data.
+Jay Satiro (12 Jan 2017)
+- STARTTLS: Don't print response character in denied messages
- This commit also fixes the bug that sometimes processing hangs when
- multiple HTTP/2 streams are multiplexed.
+ Both IMAP and POP3 response characters are used internally, but when
+ appended to the STARTTLS denial message likely could confuse the user.
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
+ Closes https://github.com/curl/curl/pull/1203
-- [Tatsuhiro Tsujikawa brought this change]
+- smtp: Fix STARTTLS denied error message
+
+ - Format the numeric denial code as an integer instead of a character.
- http2: Check session closure early in http2_recv
+Daniel Stenberg (11 Jan 2017)
+- http2_send: avoid unsigned integer wrap around
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
+ ... when checking for a too large request.
-- [Tatsuhiro Tsujikawa brought this change]
+Jay Satiro (9 Jan 2017)
+- [Jiri Malak brought this change]
- http2: Add handling stream level error
+ cmake: Fix passing _WINSOCKAPI_ macro to compiler
- Previously, when a stream was closed with other than NGHTTP2_NO_ERROR
- by RST_STREAM, underlying TCP connection was dropped. This is
- undesirable since there may be other streams multiplexed and they are
- very much fine. This change introduce new error code
- CURLE_HTTP2_STREAM, which indicates stream error that only affects the
- relevant stream, and connection should be kept open. The existing
- CURLE_HTTP2 means connection error in general.
+ Define _WINSOCKAPI_ blank rather than to 1 in order to match the value
+ used by Microsoft's winsock header files.
- Ref: https://github.com/curl/curl/issues/659
- Ref: https://github.com/curl/curl/pull/663
+ Closes https://github.com/curl/curl/pull/1195
-Daniel Stenberg (11 Apr 2016)
-- http2: drain the socket better...
+Daniel Stenberg (9 Jan 2017)
+- sws: retry send() on EWOULDBLOCK
- ... but ignore EAGAIN if the stream has ended so that we don't end up in
- a loop. This is a follow-up to c8ab613 in order to avoid the problem
- d261652 was made to fix.
+ Fixes spurious test 1060 and 1061 failures on OpenBSD, Solaris and more.
- Reported-by: Jay Satiro
- Clues-provided-by: Tatsuhiro Tsujikawa
+ Bug: https://curl.haxx.se/mail/lib-2017-01/0009.html
+ Reported-by: Christian Weisgerber
+
+- RELEASE-NOTES: synced with a41e8592d6b3e58
+
+- examples: make the C++ examples follow our code style too
- Discussed in #750
+ At least mostly, not counting // comments.
-- KNOWN_BUGS: added info for "Hangs with PolarSSL"
+- [Aulddays brought this change]
-- KNOWN_BUGS: 1.9 HTTP/2 frames while in the connection pool kill reuse
+ asiohiper: improved socket handling
- Closes #750
+ libcurl requires CURLMOPT_SOCKETFUNCTION to KEEP watching socket events
+ and notify back. Modify event_cb() to continue watching events when
+ fired.
+
+ Fixes #1191
+ Closes #1192
+ Fixed-by: Mingliang Zhu
-- build: include scripts/ in the dist
+- [Jiří Malák brought this change]
-Steve Holme (9 Apr 2016)
-- CURLOPT_SOCKS5_GSSAPI_SERVICE: Merged with CURLOPT_PROXY_SERVICE_NAME
+ lib506: fix build for Open Watcom
- As these two options provide identical functionality, the former for
- SOCK5 proxies and the latter for HTTP proxies, merged the two options
- together.
+ Rename symbol lock to locks to not clash with OW CRTL function name.
- As such CURLOPT_SOCKS5_GSSAPI_SERVICE is marked as deprecated as of
- 7.49.0.
+ Closes #1196
-- urldata: Use bool for socks5_gssapi_nec as it is a flag
+- ROADMAP: 2017 cleanup
- This value is set to TRUE or FALSE so should be a bool and not a long.
+ Removed items already fixed, clarified a few others.
-- url: Ternary operator code style changes
+- COPYING: update the generic copyright year range
-- CODE_STYLE: Added ternary operator example to 'Space around operators'
+- docs/silent: mention --show-error in --silent description
- Following conversation on the libcurl mailing list.
+ Reported in #1190
+ Reported-by: Dan Jacobson
-- sasl: Fixed compilation errors from commit 9d89a0387
+- docs/page-header: mention how to disable the progress meter
+
+ curl.1 is regenerated
- ...when GSS-API or Windows SSPI are not used.
+ Fixes #1190
-- url: Corrected comments following 9d89a0387
+Dan Fandrich (7 Jan 2017)
+- wolfssl: display negotiated SSL version and cipher
-- docs: Added clarification following commit 9d89a0387
+- wolfssl: support setting cipher list
-- Makefile: Fixed echo of checksrc check
+Patrick Monnerat (6 Jan 2017)
+- CIPHERS.md: document GSKit ciphers
-- checksrc: Fix issue with the autobuilds not picking up the whitelist
+Jay Satiro (5 Jan 2017)
+- [peterpih brought this change]
-- checksrc: Added missing vauth and vtls directories
+ TheArtOfHttpScripting: grammar
-- ftp/imap/pop3/smtp: Allow the service name to be overridden
+Nick Zitzmann (3 Jan 2017)
+- darwinssl: --insecure overrides --cacert if both settings are in use
- Allow the service name to be overridden for DIGIST-MD5 and Kerberos 5
- authentication in FTP, IMAP, POP3 and SMTP.
+ Fixes #1184
-- http_negotiate: Calculate service name and proxy service name locally
+Jay Satiro (2 Jan 2017)
+- docs/libcurl: TCP_KEEPALIVE start and interval default to 60
- Calculate the service name and proxy service names locally, rather than
- in url.c which will allow for us to support overriding the service name
- for other protocols such as FTP, IMAP, POP3 and SMTP.
-
-- ROADMAP: Updated following the move of the authentication code
-
-Patrick Monnerat (8 Apr 2016)
-- KNOWN_BUGS: openldap hangs. TODO: binary SASL.
-
-Daniel Stenberg (8 Apr 2016)
-- KNOWN_BUGS: 5.6 Improper use of Autoconf cache variables
+ Since the TCP keep-alive options were added in 705f0f7 the start and
+ interval default values have been 60, but that wasn't documented.
- Closes #603
+ Bug: https://curl.haxx.se/mail/lib-2017-01/0000.html
+ Reported-by: Praveen Pvs
-- KNOWN_BUGS: 11.2 error buffer not set...
+Daniel Stenberg (29 Dec 2016)
+- curl.h: CURLE_FUNCTION_NOT_FOUND is no longer in use
- Closes #544
+ This error code was once introduced when some library was dynamically
+ loaded and a funciton within said library couldn't be found.
-- KNOWN_BUGS: 11.1 Curl leaks .onion hostnames in DNS
+- content_encoding: change return code on a failure
- Closes #543
+ Failure to decompress is now a write error instead of the weird
+ "function not found".
-- KNOWN_BUGS: 1.8 DNS timing is wrong for HTTP redirects
-
- Closes #522
+- page-footer: error 36 is protocol agnostic!
-- TODO: HTTP/2 "prior knowledge" is implemented!
-
-- [Damien Vielpeau brought this change]
-
- mbedtls: fix MBEDTLS_DEBUG builds
-
-- mbedtls: implement and provide *_data_pending()
+Jay Satiro (28 Dec 2016)
+- tool_operate: Fix --remote-time incorrect times on Windows
- ... as otherwise we might get stuck thinking there's no more data to
- handle.
+ - Use Windows API SetFileTime to set the file time instead of utime.
- Reported-by: Damien Vielpeau
+ Avoid utime on Windows if possible because it may apply a daylight
+ saving time offset to our UTC file time.
- Fixes #737
-
-- mbedtls: follow-up for the previous commit
-
-- mbedtls.c: name space pollution fix, Use 'Curl_'
-
-- mbedtls.c: changed private prefix to mbed_
+ Bug: https://curl.haxx.se/mail/archive-2016-11/0033.html
+ Reported-by: Tim
- mbedtls_ is the prefix used by the mbedTLS library itself so we should
- avoid using that for our private functions.
+ Closes https://github.com/curl/curl/pull/1121
-- mbedtls.h: fix compiler warnings
+Daniel Stenberg (29 Dec 2016)
+- [Max Khon brought this change]
-- Revert "winbuild: trying to set some files eol=crlf for git"
+ digest_sspi: copy terminating NUL as well
- This reverts commit 9c08b4f1e7eced5a4d3782a3e0daa484c9d77d21.
+ Curl_auth_decode_digest_http_message(): copy terminating NUL as later
+ Curl_override_sspi_http_realm() expects a NUL-terminated string.
- Didn't help. Caused problems.
-
- Fixes #756
+ Fixes #1180
-- curl.1: use example.com more
+- curl_formadd.3: CURLFORM_CONTENTSLENGTH not needed when chunked
- Make (most) example snippets use the example.com domain instead of the
- random ones picked and used before. Some of those were probably
- legitimate sites and some not. example.com is designed for this purpose.
+ Mentioned in #1013
-- [Michael Kaufmann brought this change]
+- [Kyselgov E.N brought this change]
- HTTP2: Add a space character after the status code
+ cmake: use crypt32.lib when building with OpenSSL on windows
- The space character after the status code is mandatory, even if the
- reason phrase is empty (see RFC 7230 section 3.1.2)
+ Reviewed-by: Peter Wu
+ Closes #1149
+ Fixes #1147
+
+- [Chris Araman brought this change]
+
+ darwinssl: fix CFArrayRef leak
- Closes #755
+ Reviewed-by: Nick Zitzmann
+ Closes #1173
-- [Viktor Szakats brought this change]
+- [Chris Araman brought this change]
- URLs: change http to https in many places
+ darwinssl: fix iOS build
- Closes #754
+ Reviewed-by: Nick Zitzmann
+ Fixes #1172
-- winbuild: trying to set some files eol=crlf for git
+- curl: remove superfluous include file
- Thinking it might help to apply patches etc with git.
+ The <netinet/tcp.h> is a leftover from the past when TCP socket options
+ were set in this file. This include causes build issues on AIX 4.3.
+
+ Reported-by: Kim Minjoong
+
+ Closes #1178
-- [Theodore Dubois brought this change]
+- RELEASE-NOTES: synced with a7b38c9dc98481e
- curl.1: change example for -F
+- vtls: s/SSLEAY/OPENSSL
- It's a bad idea to send your passwords anywhere, especially over HTTP.
- Modified example to send a picture instead.
+ Fixed an old leftover use of the USE_SSLEAY define which would make a
+ socket get removed from the applications sockets to monitor when the
+ multi_socket API was used, leading to timeouts.
- Fixes #752
+ Bug: #1174
-- KNOWN_BUGS: reorganized and cleaned up
+- docs/ciphers: link to our own new page about ciphers
- Now sorted into categories and organized in the same style we do the
- TODO document. It will make each issue linked properly on the
- https://curl.haxx.se/docs/knownbugs.html web page.
-
- The sections should make it easier to find issues and issues related to
- areas of the reader's specific interest.
+ ... as the former ones always go stale!
-Jay Satiro (6 Apr 2016)
-- KNOWN_BUGS: #95 curl in Windows can't handle Unicode arguments
+- cmdline-opts/page-footer: add three more exit codes
+
+ ... and regenerated curl.1
-Steve Holme (6 Apr 2016)
-- KNOWN_BUGS: Use https://curl.haxx.se URL for github based issues
+- formdata: use NULL, not 0, when returning pointers
-- CHECKSRC.md: Corrected some typos
+- ftp: failure to resolve proxy should return that error code
-- RELEASE-NOTES: Corrected last updated
+- configure: accept --with-libidn2 instead
- Included a summary of the checksrc.bat updates and combined two krb5
- changes as they should have been implemented at the same time.
-
-- vauth: Corrected a number of typos in comments
+ ... which the help text already implied since we switched to libidn2
+ from libidn in commit 9c91ec778104ae3b back in October 2016.
- Reported-by: Michael Osipov
+ Reported-by: Christian Weisgerber
+ Bug: https://curl.haxx.se/mail/lib-2016-12/0110.html
-Jay Satiro (5 Apr 2016)
-- KNOWN_BUGS: #94 IMAP custom requests use the LIST handler
-
- Bug: https://github.com/curl/curl/issues/536
- Reported-by: eXeC64@users.noreply.github.com
+- test1282: verify the ftp-gss check
-Daniel Stenberg (5 Apr 2016)
-- KNOWN_BUGS: remove 68, 70 and 72.
+- ftp-gss: check for init before use
- Due to their age (we don't fully know if they actually remain) and lack
- of detail - very few people will bother to find out what they're about
- or work on them. If people truly still suffer from any of these, I
- assume they will be reported again and then we'll deal with them.
+ To avoid dereferencing a NULL pointer.
- 72. "Pausing pipeline problems."
- https://curl.haxx.se/mail/lib-2009-07/0214.html
+ Reported-by: Daniel Romero
+
+Jay Satiro (24 Dec 2016)
+- build-wolfssl: Sync config with wolfSSL 3.10
- 70. Problem re-using easy handle after call to curl_multi_remove_handle
- https://curl.haxx.se/mail/lib-2009-07/0249.html
+ wolfSSL configure script relevant changes from 3.9 to 3.10:
- 68. "More questions about ares behavior".
- https://curl.haxx.se/mail/lib-2009-08/0012.html
+ - DES3 no longer enabled by default
+ - Shamir no longer enabled by default
+ - Extended master secret enabled by default
+ - RSA and ECC timing protections enabled by default
+
+ For backwards compatibility I enabled DES3 and ECC shamir config options
+ (ie no change from 3.9), and the other changes are included.
-- KNOWN_BUGS: remove 92 and 88, fixed
+- cyassl: use time_t instead of long for timeout
-- http2: fix connection reuse when PING comes after last DATA
-
- It turns out the google GFE HTTP/2 servers send a PING frame immediately
- after a stream ends and its last DATA has been received by curl. So if
- we don't drain that from the socket, it makes the socket readable in
- subsequent checks and libcurl then (wrongly) assumes the connection is
- dead when trying to reuse the connection.
-
- Reported-by: Joonas Kuorilehto
+Daniel Stenberg (23 Dec 2016)
+- bump: toward next release
+
+- http: remove "Curl_http_done: called premature" message
- Discussed in #750
+ ... it only confuses people.
-- multi: remove trailing space in debug output
+- openssl-random: check return code when asking for random
+
+ and fail appropriately if it returns error
-- RELEASE-NOTES: synced with 86e97b642fb
+- gnutls-random: check return code for failed random
-- CHECKSRC.md: mention cmdline options, fix the bullet list
+Version 7.52.1 (22 Dec 2016)
-- docs/CHECKSRC.md: initial version
+Daniel Stenberg (22 Dec 2016)
+- RELEASE-NOTES: curl 7.52.1
-Steve Holme (3 Apr 2016)
-- checksrc.bat: Added support for the examples
+- lib557.c: use a shorter MAXIMIZE representation
+
+ Since several compilers had problems with the previous one
+
+ Reported-by: Ray Satiro
+ Bug: https://curl.haxx.se/mail/lib-2016-12/0098.html
-Daniel Stenberg (3 Apr 2016)
-- lib/src: fix the checksrc invoke
+- runtests: remove the valgrind parser
- ... now works correctly when invoke from the root makefile
+ Old legacy parsing that 1) hid problems for us and 2) probably isn't
+ needed anymore.
-- nw: please the stricter checksrc
+- [Kamil Dudka brought this change]
-Steve Holme (3 Apr 2016)
-- checksrc.bat: Re-enabled the tests directory by default
-
- Following the recent changes to the source in the tests directory,
- re-enabled tests for the default scan.
+ randit: store the value in the buffer
-- checksrc.bat: Added tests/server directory support
+- tests/Makefile: run checksrc on debug builds
- In addition to commit 83b174b3f0 and following the recent changes.
+ ... just like we already do in src/ and lib/
-- tests: Fixed header files to comply with our code style
+- lib557: move the "enable LONGLINE" to allow more long lines
+
+ This file is riddled with them...
-Daniel Stenberg (3 Apr 2016)
-- make checksrc: run it in docs/examples too by default
+- bump: toward next release
-- docs/examples: remove spurious white spaces all over
+Marcel Raad (21 Dec 2016)
+- lib: fix MSVC compiler warnings
- ... to please the new, slightly picker, checksrc.pl
+ Visual C++ complained:
+ warning C4267: '=': conversion from 'size_t' to 'long', possible loss of data
+ warning C4701: potentially uninitialized local variable 'path' used
-- tests: fix make checksrc in servers/
+Version 7.52.0 (20 Dec 2016)
-- tests: 'make checksrc' now checks server/ too
+Daniel Stenberg (20 Dec 2016)
+- THANKS: 13 new contributors from 7.52.0
-- root/make: have checksrc run in include/curl too
+- RELEASE-NOTES: 7.52.0
-- tests/server: comply with our code style
+- ssh: inhibit coverity warning with (void)
+
+ CID 1397391 (#1 of 1): Unchecked return value (CHECKED_RETURN)
-- code: style updates
+- Curl_recv_has_postponed_data: silence compiler warnings
+
+ Follow-up to d00f2a8f2
-- checksrc: check for more malplaced spaces
+Jay Satiro (19 Dec 2016)
+- tests: checksrc compliance
-- unit: make unit test source code checksrc compliant
+- http_proxy: Fix proxy CONNECT hang on pending data
+
+ - Check for pending data before waiting on the socket.
+
+ Bug: https://github.com/curl/curl/issues/1156
+ Reported-by: Adam Langley
-- checksrc: run checksrc in tests when 'make checksrc' in root
+Daniel Stenberg (19 Dec 2016)
+- cmdline-opts/tlsv1.d: rephrased
-- checksrc: remove debug crap
+- [Dan McNulty brought this change]
-- lib557: allow too long lines
+ schannel: fix wildcard cert name validation on Win CE
+
+ Fixes a few issues in manual wildcard cert name validation in
+ schannel support code for Win32 CE:
+ - when comparing the wildcard name to the hostname, the wildcard
+ character was removed from the cert name and the hostname
+ was checked to see if it ended with the modified cert name.
+ This allowed cert names like *.com to match the connection
+ hostname. This violates recommendations from RFC 6125.
+ - when the wildcard name in the certificate is longer than the
+ connection hostname, a buffer overread of the connection
+ hostname buffer would occur during the comparison of the
+ certificate name and the connection hostname.
-- checksrc: allow ignore of specific warnings within a file (section)
+- printf: fix floating point buffer overflow issues
+
+ ... and add a bunch of floating point printf tests
-- checksrc: add warning names, explain on help output
+- config-amigaos.h: (embarrassed) made the line shorter
-Steve Holme (3 Apr 2016)
-- checksrc.bat: Disable tests by default until warnings are fixed
+- config-amigaos.h: fix bug report email reference
-- checksrc.bat: Added support for the tests directory
+- RELEASE-NOTES: synced with 4517158abfeba
-- vauth: Removed the need for a separate GSS-API based SPN function
+- CIPHERS.md: backtick the names to show underscores fine
-- curl_sasl: Fixed potential null pointer utilisation
-
- Although this should never happen due to the relationship between the
- 'mech' and 'resp' variables, and the way they are allocated together,
- it does cause problems for code analysis tools:
+- form-string.d: fix format mistake
- V595 The 'mech' pointer was utilized before it was verified against
- nullptr. Check lines: 376, 381. curl_sasl.c 376
+ and regenerated curl.1
- Bug: https://github.com/curl/curl/issues/745
- Reported-by: Alexis La Goutte
+ Reported-by: Gisle Vanem
-- spnego: Small code tidy up
-
- * Prefer dereference of string pointer rather than strlen()
- * Free challenge pointer in one place
- * Additional comments
+Michael Kaufmann (18 Dec 2016)
+- openssl: simplify expression in Curl_ossl_version
-- krb5: Small code tidy up
+- curl_easy_recv: Improve documentation and example program
- * Prefer dereference of string pointer rather than strlen()
- * Free challenge pointer in one place
- * Additional comments
-
-- krb5_gssapi: Only process challenge when present
+ Follow-up to 82245ea: Fix the example program sendrecv.c (handle
+ CURLE_AGAIN, handle incomplete send). Improve the documentation
+ for curl_easy_recv() and curl_easy_send().
- This wouldn't cause a problem because of the way the function is called,
- but prior to this change, we were processing the challenge message when
- the credentials were NULL rather than when the challenge message was
- populated.
+ Reviewed-by: Frank Meier
+ Assisted-by: Jay Satiro
- This also brings this part of the Kerberos 5 code in line with the
- Negotiate code.
+ See https://github.com/curl/curl/pull/1134
-- krb5: Fixed missing client response when mutual authentication enabled
-
- Although mutual authentication is currently turned off and can only be
- enabled by changing libcurl source code, authentication using Kerberos
- 5 has been broken since commit 79543caf90 in this use case.
+- [Isaac Boukris brought this change]
-- krb5_sspi: Only process challenge when present
-
- This wouldn't cause a problem because of the way the function is called,
- but prior to this change, we were processing the challenge message when
- the credentials were NULL rather than when the challenge message was
- populated.
+ Curl_getconnectinfo: avoid checking if the connection is closed
- This also brings this part of the Kerberos 5 code in line with the
- Negotiate code.
-
-- krb5_sspi: Only generate the output token when its not allocated
+ It doesn't benefit us much as the connection could get closed at
+ any time, and also by checking we lose the ability to determine
+ if the socket was closed by reading zero bytes.
- Prior to this change, we were generating the output token when the
- credentials were NULL rather than when the output token was NULL.
+ Reported-by: Michael Kaufmann
- This also brings this part of the Kerberos 5 code in line with the
- Negotiate code.
+ Closes https://github.com/curl/curl/pull/1134
-- krb5: Only generate a SPN when its not known
-
- Prior to this change, we were generating the SPN in the SSPI code when
- the credentials were NULL and in the GSS-API code when the context was
- empty. It is better to decouple the SPN generation from these checks
- and only generate it when the SPN itself is NULL.
+Daniel Stenberg (18 Dec 2016)
+- CIPHERS.md: attempt to document TLS cipher names
- This also brings this part of the Kerberos 5 code in line with the
- Negotiate code.
+ As the official docs seems really hard to keep track of and link to over
+ time
+
+- curl.1: generated after 6cce4dbf830
-Daniel Stenberg (3 Apr 2016)
-- tests/libtest: follow our code style guidelines better
+- cmdline-opts/post30X.d: fix the RFC references
+
+- curl.1: regenerated
- ... checksrc of all test code is pending.
+ Fixed trailing whitespace and numerous formatting glitches
-- checksrc.whitelist: remove fopen() uses
+- cmdline-opts: formatting fixes
-- formdata: use appropriate fopen() macros
+- curl_easy_setopt.3: removed CURLOPT_SOCKS_PROXYTYPE
-- checksrc: improve the fopen() parser somewhat
-
- The quote scanner was too fragile, now look for a comma instead to find
- the mode argument.
+- tool_getparam.c: make comments use the up-to-date option names
-- unit1604: fix snprintf
-
- follow-up to 0326b06
-
- sizeof(pointer) is no good for the buffer size!
+- manpage-scan.pl: allow deprecated options to get removed from curl.1
- Reported-by: Viktor Szakats
+ --krb4, --ftp-ssl and --ftp-ssl-reqd no longer need to be documented in the
+ man page
-Steve Holme (3 Apr 2016)
-- unittests: Fixed compilation warnings
-
- warning: implicit declaration of function 'sprintf_was_used'
- [-Wimplicit-function-declaration]
-
- Follow up to the modications made to tests/libtest in commit 55452ebdff
- as we prefer not to use sprintf() now.
+- cmdline-opts/gen.pl: trim off trailing spaces
-Daniel Stenberg (2 Apr 2016)
-- curl.1: -w filename_effective was introduced in 7.26.0
-
- We never made a 7.25.1 release
+- cmdline-opts/proxy-tlsuser.d: remove trailing .d
+
+- curl_easy_setopt.3: CURLOPT_PRE_PROXY instead of CURLOPT_SOCKS_PROXY
+
+- symbols: removed two, added one
-- 7.49.0: next release version
+- cmdline-opts: include the man page split up files in the dist
-- http2: make use of the nghttp2 error callback
+- curl.1: generated with gen.pl
- It offers extra info from nghttp2 in certain error cases. Like for
- example when trying prior-knowledge http2 on a server that doesn't speak
- http2 at all. The error message is passed on as a verbose message to
- libcurl.
+ This is the first time we replace the manually edited curt.1 with the
+ generated one created by gen.pl and the individual option documentation
+ pages.
- Discussed in #722
+ Do not edit this file, edit the individual pages and regenerate this
+ output.
- The error callback was added in nghttp2 1.9.0
+ This file will be generated by the build system soon and then removed
+ from git.
-Steve Holme (2 Apr 2016)
-- spnego: Renamed the context's SPN variable
-
- To be consistent with the Kerberos 5 context and other authentication
- code.
+- cmdline-opts: added some missing info
+
+- CURLINFO_SSL_VERIFYRESULT.3: language
+
+- HTTPS-PROXY docs: update/polish
-- krb5_gssapi: Renamed the status variables
+- cmdline-opts/page-header: mention it is generated
- For consistency with the spnego code.
+ ... to avoid people from trying to edit the pending curl.1 version that
+ gets generated by gen.pl
-- krb5: Moved host from Curl_auth_create_gssapi_user_message() to be argument
+- preproxy: renamed what was added as SOCKS_PROXY
- For consistency with the spnego and oauth2 code moved the setting of
- the host name outside of the Curl_auth_create_gssapi_user_messag()
- function.
+ CURLOPT_SOCKS_PROXY -> CURLOPT_PRE_PROXY
- This will allow us to more easily override it in the future.
+ Added the corresponding --preroxy command line option. Sets a SOCKS
+ proxy to connect to _before_ connecting to a HTTP(S) proxy.
-- test1119: Fixed missing CURL_DID_MEMORY_FUNC_TYPEDEFS symbol
+- curl: normal socks proxies still use CURLOPT_PROXY
+
+ ... the newly introduced CURLOPT_SOCKS_PROXY is special and should be
+ asked for specially. (Needs new code.)
+
+ Unified proxy type to a single variable in the config struct.
-- RELEASE-NOTES: Removed "http_negotiate: Corrected host and proxy host name"
+- CURLOPT_SOCKS_PROXYTYPE: removed
- As this was introduced in the recent vauth changes and not a prior
- release.
+ This was added as part of the SOCKS+HTTPS proxy merge but there's no
+ need to support this as we prefer to have the protocol specified as a
+ prefix instead.
-Daniel Stenberg (1 Apr 2016)
-- RELEASE-NOTES: synced with 0aa8da10bbdafa
+- curl_multi_socket.3: fix typo
-Steve Holme (1 Apr 2016)
-- http_negotiate: Corrected host and proxy host name being wrong way round
-
- I had accidentally used the proxy server name for the host and the host
- server name for the proxy in commit ad5e9bfd5d and 6d6f9ca1d9. Whilst
- Windows SSPI was quite happy with this, GSS-API wasn't.
+- checksrc: warn for assignments within if() expressions
- Thanks-to: Michael Osipov
+ ... they're already frowned upon in our source code style guide, this
+ now enforces the rule harder.
-- build: Changed the Visual Studio projects warning level from 3 to 4
+- checksrc: stricter no-space-before-paren enforcement
- After squashing most of our compiler warnings, up'ed the default
- warning level from 3 to 4 in order to increase the likelyhood of
- catching future warnings.
+ In order to make the code style more uniform everywhere
+
+- ISSUE_TEMPLATE: try mentioning known bugs/todo in new issue template
-Daniel Stenberg (1 Apr 2016)
-- [ehlertjd@gmail.com brought this change]
+- RELEASE-NOTES: synced with 71a55534fa6
- IMAP: check pointer before dereferencing it
+- [Adam Langley brought this change]
+
+ openssl: don't use OpenSSL's ERR_PACK.
- may be null in the CURLOPT_CONNECT_ONLY case
+ ERR_PACK is an internal detail of OpenSSL. Also, when using it, a
+ function name must be specified which is overly specific: the test will
+ break whenever OpenSSL internally change things so that a different
+ function creates the error.
- Fixes #747
+ Closes #1157
-Steve Holme (1 Apr 2016)
-- .gitignore: Added new VC14 SQLite based program database files
+Dan Fandrich (5 Dec 2016)
+- test2032: Mark test as flaky
-- curl_memory.h: Fixed typo in comment
-
- From commit 7218b52c49.
+Jay Satiro (3 Dec 2016)
+- [Jeremy Pearson brought this change]
-- spnego: Corrected some typos in comments
+ libcurl-multi.3: typo
- Corrected typos from commit ad5e9bfd5d and 6d6f9ca1d9.
+ Closes https://github.com/curl/curl/pull/1153
-- memdebug: Ensure curl/curl.h is included before curl_memory.h
-
- Follow up to commit 7db9782dd6.
+Dan Fandrich (2 Dec 2016)
+- test1281: added http as a required feature
-Daniel Stenberg (1 Apr 2016)
-- upload: missing rewind call could make libcurl hang
-
- When an upload is done, there are two places where that can be detected
- and only one of them would rewind the input stream - which sometimes is
- necessary for example when doing NTLM HTTP POSTs and more.
-
- This could then end up libcurl hanging.
+Daniel Stenberg (2 Dec 2016)
+- curl: support zero-length argument strings in config files
- Figured-out-by: Isaac Boukris
- Reported-by: Anatol Belski
+ ... like 'user-agent = ""'
- Fixes #741
+ Adjusted test 71 to verify.
-- curl.h: define CURL_DID_MEMORY_FUNC_TYPEDEFS
-
- So that we only do the extra typedefs in curl_memory.h when we really
- need to and avoid double typedefs.
-
- follow-up commit to 7218b52c49aeb1
+- http_proxy: simplify CONNECT response reading
- Thanks-to: Steve Holme
+ Since it now reads responses one byte a time, a loop could be removed
+ and it is no longer limited to get the whole response within 16K, it is
+ now instead only limited to 16K maximum header line lengths.
-- curl/mprintf.h: remove support for _MPRINTF_REPLACE
-
- The define is not in our name space and is therefore not protected by
- our API promises.
+- tests: fix CONNECT test cases to be more strict
- It was only really used by libcurl internals but was mostly erased from
- there already in 8aabbf5 (March 2015). This is supposedly the final
- death blow to that define from everywhere.
+ ... as they broke with the cleaned up CONNECT handling
+
+- CONNECT: read responses one byte at a time
- As a side-effect, making sure _MPRINTF_REPLACE is gone and not used, I
- made the lib tests in tests/libtest/ use curl_printf.h for its redefine
- magic and then subsequently the use of sprintf() got banned in the tests
- as well (as it is in libcurl internals) and I then replaced them all
- with snprintf().
+ ... so that it doesn't read data that is actually coming from the
+ remote. 2xx responses have no body from the proxy, that data is from the
+ peer.
- In the unlikely event that any users is actually using this define and
- gets sad by this change, it is very easily copied to the user's own
- code.
+ Fixes #1132
-- curl_memory.h: avoid the curl/curl.h include
+- CONNECT: reject TE or CL in 2xx responses
- Discussed in #743
-
-Steve Holme (1 Apr 2016)
-- url: Corrected get protocol family for FTP and LDAP
+ A server MUST NOT send any Transfer-Encoding or Content-Length header
+ fields in a 2xx (Successful) response to CONNECT. (RFC 7231 section
+ 4.3.6)
- Fixed copy/paste error from commit a5aec58726.
+ Also fixes the three test cases that did this.
-Jay Satiro (31 Mar 2016)
-- strerror: don't bit shift a signed integer
+- URL parser: reject non-numerical port numbers
- Bug: https://github.com/curl/curl/issues/744
- Reported-by: Alexis La Goutte
+ Test 1281 added to verify
-Daniel Stenberg (31 Mar 2016)
-- http2: more documentation for prior knowledge
+Dan Fandrich (30 Nov 2016)
+- runtests: made Servers: output be more consistent by removing OFF
-- [Diego Bes brought this change]
+- cyassl: fixed typo introduced in 4f8b1774
- http2: support "prior knowledge", no upgrade from HTTP/1.1
+Michael Kaufmann (30 Nov 2016)
+- CURLOPT_CONNECT_TO: Skip non-matching "connect-to" entries properly
- Supports HTTP/2 over clear TCP
+ If a port number in a "connect-to" entry does not match, skip this
+ entry instead of connecting to port 0.
- - Optimize switching to HTTP/2 by removing calls to init and setup
- before switching. Switching will eventually call setup and setup calls
- init.
+ If a port number in a "connect-to" entry matches, use this entry
+ and look no further.
- - Supports new version to “force†the use of HTTP/2 over clean TCP
+ Reported-by: Jay Satiro
+ Assisted-by: Jay Satiro, Daniel Stenberg
- - Add common line parameter “--http2-prior-knowledge†to the Curl
- command line tool.
+ Closes #1148
-- imap: remove duplicated function
-
- The list and search response functions were identical! Merged into one
- now. Detected by PVS Studio.
-
- Reported-by: Alexis La Goutte
+Daniel Stenberg (29 Nov 2016)
+- BUGS: describe bug handling process
+
+- RELEASE-NOTES: synced with 19613fb3
-- SOCKS5_gssapi_negotiate: don't assume little-endian ints
+Jay Satiro (28 Nov 2016)
+- http2: check nghttp2_session_set_local_window_size exists
- The code copied one byte from a 32bit integer, which works fine as long
- as the byte order is the same. Not a fine assumption. Reported by PVS
- Studio.
+ The function only exists since nghttp2 1.12.0.
- Reported-by: Alexis La Goutte
+ Bug: https://github.com/curl/curl/commit/a4d8888#commitcomment-19985676
+ Reported-by: Michael Kaufmann
-- http: remove ((expression)) double parentheses
+Daniel Stenberg (28 Nov 2016)
+- [Anders Bakken brought this change]
-- Curl_add_buffer_send: avoid possible NULL dereference
-
- ... as we check for a NULL pointer below, we move the derefence to after
- the check. Detected by PVS Studio.
+ http2: Fix crashes when parent stream gets aborted
- Reported-by: Alexis La Goutte
+ Closes #1125
-- file: remove duplicate checks of the same variable
-
- ... as it doesn't change in between. Deteced by PVS Studio.
+- cmdline-docs: more options converted and fixed
- Reported-by: Alexis La Goutte
+ Now all options are in the new system.
-Steve Holme (30 Mar 2016)
-- [Marcel Raad brought this change]
+- gen: include footer in mainpage output
- openssl: Fix compilation warnings
-
- When compiling with OpenSSL 1.1.0 (so that the HAVE_X509_GET0_SIGNATURE
- && HAVE_X509_GET0_EXTENSIONS pre-processor block is active), Visual C++
- 14 complains:
-
- warning C4701: potentially uninitialized local variable 'palg' used
- warning C4701: potentially uninitialized local variable 'psig' used
+Jay Satiro (28 Nov 2016)
+- lib1536: checksrc compliance
-Daniel Stenberg (30 Mar 2016)
-- multi: turn Curl_done into file local multi_done
+Daniel Stenberg (28 Nov 2016)
+- cmdline-opts: more command line options documented
- ... as it now is used by multi.c only.
+ Moved over to the new format
-- multi: multi_reconnect_request is the former Curl_reconnect_request
+- curl: remove --proxy-ssl* options
- now a file local function in multi.c
+ There's mostly likely no need to allow setting SSLv2/3 version for HTTPS
+ proxy. Those protocols are insecure by design and deprecated.
-- multi: move Curl_do and Curl_do_done to multi.c and make static
-
- ... called multi_do and multi_do_done as they're file local now.
+- CURLOPT_PROXY_*.3: polished some proxy option man pages
-Jay Satiro (29 Mar 2016)
-- wolfssl: Use ECC supported curves extension
+Patrick Monnerat (26 Nov 2016)
+- os400: support CURLOPT_PROXY_PINNEDPUBLICKEY
- https://github.com/wolfSSL/wolfssl/issues/366
+ Also define it in ILE/RPG binding.
-- build-wolfssl: Allow a broader range of ciphers (Visual Studio)
-
- This is an update to the build-time options used to build wolfSSL in
- Visual Studio for greater compatibility, and make it behave similar to
- the way OpenSSL 1.0.2 behaves. Starting in wolfSSL v3.6.6 static ciphers
- and SSLv3 are disabled by default at build time, but we can use both.
-
- - Enable static cipher suites TLS_ECDH_ and TLS_RSA_.
+Daniel Stenberg (26 Nov 2016)
+- [Okhin Vasilij brought this change]
+
+ curl_version_info: add CURL_VERSION_HTTPS_PROXY
- - Enable SSLv3 hello. Though in libcurl we disable it by default at
- runtime, we make it available so the user can manually select it if
- necessary.
+ Closes #1142
-Daniel Stenberg (29 Mar 2016)
-- [Isaac Boukris brought this change]
+- [Frank Gevaerts brought this change]
- GSS: make Curl_gss_log_error more verbose
-
- Also display the GSS_C_GSS_CODE (major code) when specified instead of
- only GSS_C_MECH_CODE (minor code).
-
- In addition, the old code was printing a colon twice after the prefix
- and also miscalculated the length of the buffer in between calls to
- gss_display_status (the length of ": " was missing).
+ tests: Add some testcases for recent new features.
- Also, gss_buffer is not guaranteed to be NULL terminated and thus need
- to restrict reading by its length.
+ Add missing tests for CURLINFO_SCHEME, CURLINFO_PROTOCOL, %{scheme},
+ and %{http_version}
- Closes #738
+ closes #1143
+
+- [Frank Gevaerts brought this change]
+
+ curl_easy_reset: clear info for CULRINFO_PROTOCOL and CURLINFO_SCHEME
+
+- CURLOPT_PROXY_CAINFO.3: clarify proxy use
+
+- CURLOPT_PROXY_CRLFILE.3: clarify https proxy and availability
-- build: use roffit 0.11 feature
+- curl_easy_setopt.3: add CURLOPT_PROXY_PINNEDPUBLICKEY
- ... load file specified as argument.
+ Follow-up to 4f8b17743d7c55a
-- http2: set correct scheme in handler structs [regression]
+- docs: include all opts man pages in dist
- Since commit a5aec58 the handler schemes need to match for the
- connections to be reused and for HTTP/2 multiplexing to work, reusing
- connections is very important!
+ Sorted the lists too.
- Closes #736
+ ... and include the new ones in the PDF and HTML generation targets
-- hostip.c: minor white space edit for style
+- [Thomas Glanzmann brought this change]
-- [Viktor Szakats brought this change]
+ HTTPS Proxy: Implement CURLOPT_PROXY_PINNEDPUBLICKEY
- TODO: use secure protocol in recently added URL
-
- Closes #733
+- [Thomas Glanzmann brought this change]
-- HTTP2.md: mention libressl and boringssl too
+ url: proxy: Use 443 as default port for https proxies
-- docs/HTTP-COOKIES: converted to markdown
+- TODO: removed "HTTPS proxy"
-- HTTP2: s/polarssl/mbedtls
+- [Jan-E brought this change]
-Jay Satiro (28 Mar 2016)
-- wolfssl: Add ALPN support
+ winbuild: add config option ENABLE_NGHTTP2
+
+ Closes #1141
-- tool_operate: remove mixed declaration
+Jay Satiro (24 Nov 2016)
+- tool_urlglob: Improve sanity check in glob_range
+
+ Prior to this change we depended on errno if strtol could not perform a
+ conversion. POSIX says EINVAL *may* be set. Some implementations like
+ Microsoft's will not set it if there's no conversion.
- This is a follow up to the previous commit.
+ Ref: https://github.com/curl/curl/commit/ee4f7660#commitcomment-19658189
-Daniel Stenberg (28 Mar 2016)
-- curl: warn for --capath use if not supported by libcurl
+- tool_help: Change description for --retry-connrefused
- Closes #492
+ Ref: https://github.com/curl/curl/pull/1064#issuecomment-260052409
-- TODO: 2.5 Edge-triggered sockets should work
+Patrick Monnerat (25 Nov 2016)
+- os400: sync ILE/RPG binding
-- Makefile.am: skip the scripts dir
+Jay Satiro (24 Nov 2016)
+- test1135: Fix curl_easy_duphandle prototype for code style
- Skipping the scripts dir is primarily done for 'make install' so that it
- does not attempt to install the zsh completion script as we've not yet
- found a proper way to do/run that at install time.
+ Follow-up to dbadaeb which changed the style.
+
+- x509asn1: Restore the parameter check in Curl_getASN1Element
- By leaving the script dir's Makefile in place, a user can still opt to
- run make install manually in there.
+ - Restore the removed parts of the parameter check.
- Closes #620
-
-- CURLMOPT_SOCKETFUNCTION.3: describe the 'what' argument
+ Follow-up to 945f60e which altered the parameter check.
-- curl_multi_socket_action.3: mark the options properly
-
- ... to make them appear as links on the html version.
+Daniel Stenberg (25 Nov 2016)
+- RELEASE-NOTES: update option counters
-Steve Holme (27 Mar 2016)
-- RELEASE-NOTES: Synced with f0bdd72c10
+- [Frank Gevaerts brought this change]
-- http_ntlm: Renamed from curl_ntlm.[c|h]
+ add CURLINFO_SCHEME, CURLINFO_PROTOCOL, and %{scheme}
- Renamed the header and source files for this module as they are HTTP
- specific and as such, they should use the naming convention as other
- HTTP authentication source files do - this revert commit 260ee6b7bf.
+ Adds access to the effectively used protocol/scheme to both libcurl and
+ curl, both in string and numeric (CURLPROTO_*) form.
- Note: We could also rename curl_ntlm_wb.[c|h], however, the Winbind
- code needs separating from the HTTP protocol and migrating into the
- vauth directory, thus adding support for Winbind to the SASL based
- protocols such as IMAP, POP3 and SMTP.
-
-Daniel Stenberg (27 Mar 2016)
-- [marquis-de-muesli brought this change]
-
- docs: curlinfo_filetime sftp support, new curlopt_quote "statvfs"
+ Note that the string form will be uppercase, as it is just the internal
+ string.
- Closes #677
+ As these strings are declared internally as const, and all other strings
+ returned by curl_easy_getinfo() are de-facto const as well, string
+ handling in getinfo.c got const-ified.
+
+ Closes #1137
-- [marquis-de-muesli brought this change]
+- RELEASE-NOTES: synced with 63198a4750aeb
- SSH: new CURLOPT_QUOTE command "statvfs"
-
- usage: "statvfs path"
- returns remote file system statistics
+- curl.1: the new --proxy options ship in 7.52.0
-- [marquis-de-muesli brought this change]
+- checksrc: move open braces to comply with function declaration style
- SSH: support CURLINFO_FILETIME
+- checksrc: detect wrongly placed open braces in func declarations
-- [Karlson2k brought this change]
+- checksrc: white space edits to comply to stricter checksrc
- sshserver.pl: use quotes for given options
+- checksrc: verify ASTERISKNOSPACE
- Fixed failed redirection of stderr with some options. At least on Msys2,
- perl fails to redirect stderr if $value contains newline or other weird
- characters.
+ Detects (char*) and 'char*foo' uses.
-Jay Satiro (26 Mar 2016)
-- url: don't use bad offset in tld_check_name to show error
-
- libidn's tld_check_lz returns an error offset of the first character
- that it failed to process, however that offset is not a byte offset and
- may not even be in the locale encoding therefore we can't use it to show
- the user the character that failed to process.
-
- Bug: https://github.com/curl/curl/issues/731
- Reported-by: Karlson2k
+- checksrc: code style: use 'char *name' style
-Steve Holme (26 Mar 2016)
-- http_negotiate: Combine GSS-API and SSPI source files
+- checksrc: add ASTERISKSPACE
- As the GSS-API and SSPI based source files are no longer library/API
- specific, following the extraction of that authentication code to the
- vauth directory, combine these files rather than maintain two separate
- versions.
+ Verifies a 'char *name' style, with no space after the asterisk.
-- vauth: Moved the Negotiate authentication code to the new vauth directory
+- openssl: remove dead code
- Part 2 of 2 - Moved the GSS-API based Negotiate authentication code.
+ Coverity CID 1394666
-- vauth: Moved the Negotiate authentication code to the new vauth directory
-
- Part 1 of 2 - Moved the SSPI based Negotiate authentication code.
+- [Okhin Vasilij brought this change]
-- warnless.h: Removed spurious character from commit 696bc6b9c9
-
- Not picked up by checksrc or Visual Studio but my own code review, this
- would haven broken Intel based Unix builds - Perhaps I should learn to
- type on my laptop's keyboard before committing!
+ HTTPS-proxy: fixed mbedtls and polishing
-- schannel: Fixed compilation warning from commit f8d88a4913
+- darwinssl: adopted to the HTTPS proxy changes
- warning C4244: '=': conversion from 'int' to 'unsigned short', possible
- loss of data
+ It builds and runs all test cases. No adaptations for actual HTTPS proxy
+ support has been made.
-- warnless?: Added some integer based conversion functions
+- gtls: fix indent to silence compiler warning
+
+ vtls/gtls.c: In function ‘Curl_gtls_data_pending’:
+ vtls/gtls.c:1429:3: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation]
+ if(conn->proxy_ssl[connindex].session &&
+ ^~
+ vtls/gtls.c:1433:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
+ return res;
-Daniel Stenberg (25 Mar 2016)
-- [Dusty Mabe brought this change]
+- [Thomas Glanzmann brought this change]
- docs/TODO: Add feature request for metalink in HTTP headers
-
- Closes #729
- Closes #728
+ mbedtls: Fix compile errors
-Steve Holme (25 Mar 2016)
-- build: Corrected typos from commit 70e56939aa
+- [Alex Rousskov brought this change]
-- vauth: Refactored function names after move to new vauth directory
+ proxy: Support HTTPS proxy and SOCKS+HTTP(s)
- Renamed all the SASL functions that moved to the new vauth directory to
- include the correct module name.
-
-- vauth: Updated the copyright year after recent changes
+ * HTTPS proxies:
+
+ An HTTPS proxy receives all transactions over an SSL/TLS connection.
+ Once a secure connection with the proxy is established, the user agent
+ uses the proxy as usual, including sending CONNECT requests to instruct
+ the proxy to establish a [usually secure] TCP tunnel with an origin
+ server. HTTPS proxies protect nearly all aspects of user-proxy
+ communications as opposed to HTTP proxies that receive all requests
+ (including CONNECT requests) in vulnerable clear text.
+
+ With HTTPS proxies, it is possible to have two concurrent _nested_
+ SSL/TLS sessions: the "outer" one between the user agent and the proxy
+ and the "inner" one between the user agent and the origin server
+ (through the proxy). This change adds supports for such nested sessions
+ as well.
+
+ A secure connection with a proxy requires its own set of the usual SSL
+ options (their actual descriptions differ and need polishing, see TODO):
+
+ --proxy-cacert FILE CA certificate to verify peer against
+ --proxy-capath DIR CA directory to verify peer against
+ --proxy-cert CERT[:PASSWD] Client certificate file and password
+ --proxy-cert-type TYPE Certificate file type (DER/PEM/ENG)
+ --proxy-ciphers LIST SSL ciphers to use
+ --proxy-crlfile FILE Get a CRL list in PEM format from the file
+ --proxy-insecure Allow connections to proxies with bad certs
+ --proxy-key KEY Private key file name
+ --proxy-key-type TYPE Private key file type (DER/PEM/ENG)
+ --proxy-pass PASS Pass phrase for the private key
+ --proxy-ssl-allow-beast Allow security flaw to improve interop
+ --proxy-sslv2 Use SSLv2
+ --proxy-sslv3 Use SSLv3
+ --proxy-tlsv1 Use TLSv1
+ --proxy-tlsuser USER TLS username
+ --proxy-tlspassword STRING TLS password
+ --proxy-tlsauthtype STRING TLS authentication type (default SRP)
+
+ All --proxy-foo options are independent from their --foo counterparts,
+ except --proxy-crlfile which defaults to --crlfile and --proxy-capath
+ which defaults to --capath.
+
+ Curl now also supports %{proxy_ssl_verify_result} --write-out variable,
+ similar to the existing %{ssl_verify_result} variable.
+
+ Supported backends: OpenSSL, GnuTLS, and NSS.
+
+ * A SOCKS proxy + HTTP/HTTPS proxy combination:
+
+ If both --socks* and --proxy options are given, Curl first connects to
+ the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS
+ proxy.
- As most of this work was performed in 2015 but not pushed until 2016
- updated the copyright year to reflect the public facing changes.
+ TODO: Update documentation for the new APIs and --proxy-* options.
+ Look for "Added in 7.XXX" marks.
-- vauth: Moved the OAuth 2.0 authentication code to the new vauth directory
+Patrick Monnerat (24 Nov 2016)
+- Declare endian read functions argument as a const pointer.
+ This is done for all functions of the form Curl_read[136][624]_[lb]e.
-- vauth: Moved the NTLM authentication code to the new vauth directory
+- Limit ASN.1 structure sizes to 256K. Prevent some allocation size overflows.
+ See CRL-01-006.
-- vauth: Moved the Kerberos V5 authentication code to the new vauth directory
+Jay Satiro (22 Nov 2016)
+- url: Fix conn reuse for local ports and interfaces
+
+ - Fix connection reuse for when the proposed new conn 'needle' has a
+ specified local port but does not have a specified device interface.
+
+ Bug: https://curl.haxx.se/mail/lib-2016-11/0137.html
+ Reported-by: bjt3[at]hotmail.com
-- digest.c: Fixed checksrc warnings
+Daniel Stenberg (21 Nov 2016)
+- rand: pass in number of randoms as an unsigned argument
-- vauth: Moved the DIGEST authentication code to the new vauth directory
+Jay Satiro (20 Nov 2016)
+- rand: Fix potentially uninitialized result warning
-- vauth: Moved the CRAM-MD5 authentication code to the new vauth directory
+Marcel Raad (19 Nov 2016)
+- vtls: fix build warnings
+
+ Fix warnings about conversions from long to time_t in openssl.c and
+ schannel.c.
+
+ Follow-up to de4de4e3c7c
-- vauth: Moved the ClearText authentication code to the new vauth directory
+Daniel Stenberg (18 Nov 2016)
+- [Marcel Raad brought this change]
-- vauth: Moved Curl_sasl_build_spn() to create the initial vauth source files
+ lib: fix compiler warnings after de4de4e3c7c
+
+ Visual C++ now complains about implicitly casting time_t (64-bit) to
+ long (32-bit). Fix this by changing some variables from long to time_t,
+ or explicitly casting to long where the public interface would be
+ affected.
+
+ Closes #1131
-- checksrc.bat: Added support for checking the new vauth directory
+Peter Wu (17 Nov 2016)
+- [Isaac Boukris brought this change]
-- build: Updated all makefiles and project files for the new vauth directory
+ Don't mix unix domain sockets with regular ones
- Updated the makefiles and Visual Studio project files to support moving
- the authentication code to the new lib/vauth directory that was started
- in commit 0d04e859e1.
+ When reusing a connection, make sure the unix domain
+ socket option matches.
-Daniel Stenberg (24 Mar 2016)
-- [JDepooter brought this change]
+Jay Satiro (17 Nov 2016)
+- tests: Fix HTTP2-Settings header for huge window size
+
+ Follow-up to a4d8888. Changing the window size in that commit resulted
+ in a different HTTP2-Settings upgrade header, causing test 1800 to fail.
- schannel: Add ALPN support
+- http2: Use huge HTTP/2 windows
- Add ALPN support for schannel. This allows cURL to negotiate
- HTTP/2.0 connections when built with schannel.
+ - Improve performance by using a huge HTTP/2 window size.
- Closes #724
+ Bug: https://github.com/curl/curl/issues/1102
+ Reported-by: afrind@users.noreply.github.com
+ Assisted-by: Tatsuhiro Tsujikawa
-Steve Holme (24 Mar 2016)
-- http: Minor update based on CODE_STYLE guidelines
+Daniel Stenberg (16 Nov 2016)
+- cmdline-docs: more conversion
-Daniel Stenberg (23 Mar 2016)
-- multi: fix "Operation timed out after" timer
+- gen: support 'protos'
- Use the local, reasonably updated, 'now' value when creating the message
- string to output for the timeout condition.
+ and warn on unrecognized lines
+
+- gen: support 'single' to make an individual page man page
+
+- cmdline-docs: more options converted over
+
+- gen: support 'redirect'
- Fixes #619
+ ... and warn for too long --help lines
+
+- cmdline/gen: replace options in texts better
-- openssl: boringssl provides the same numbering as openssl
+Jay Satiro (16 Nov 2016)
+- http2: Fix address sanitizer memcpy warning
- ... so we don't need extra boringssl precautions for for
- HAVE_ERR_REMOVE_THREAD_STATE_NOARG.
+ - In Curl_http2_switched don't call memcpy when src is NULL.
- Pointed-out-by: David Benjamin
-
-- openssl: fix ERR_remove_thread_state() for boringssl/libressl
+ Curl_http2_switched can be called like:
- The removed arg is only done in OpenSSL
+ Curl_http2_switched(conn, NULL, 0);
+
+ .. and prior to this change memcpy was then called like:
+
+ memcpy(dest, NULL, 0)
- Bug: https://twitter.com/xtraemeat/status/712564874098917376
+ .. causing address sanitizer to warn:
+
+ http2.c:2057:3: runtime error: null pointer passed as argument 2, which
+ is declared to never be null
-- bump: work on 7.48.1
+- tool_help: Clarify --dump-header only writes received headers
-- RELEASE-PROCEDURE: mention the github release tag edit
-
- ... and update the coming release dates a bit
+- curl.1: Clarify --dump-header only writes received headers
-Steve Holme (23 Mar 2016)
-- checksrc.bat: Updated the help to be consistent with generate.bat
-
- Follow up to commit a8c7f0fcbf prior to release.
+Daniel Stenberg (15 Nov 2016)
+- [Alex Chan brought this change]
-Version 7.48.0 (23 Mar 2016)
+ docs: Spelling fixes
-Daniel Stenberg (23 Mar 2016)
-- RELEASE-NOTES: curl 7.48.0
+Kamil Dudka (15 Nov 2016)
+- docs: the next release will be 7.52.0
-- THANKS: 15 new contributors from 7.48.0 release
+Daniel Stenberg (15 Nov 2016)
+- cmdline-opts: support generating the --help output
-Jay Satiro (23 Mar 2016)
-- CURLINFO_TLS_SSL_PTR.3: Warn about limitations
-
- Bug: https://github.com/curl/curl/issues/685
+- [David Schweikert brought this change]
-Daniel Stenberg (22 Mar 2016)
-- Revert "sshserver: remove use of AuthorizedKeysFile2"
+ darwinssl: fix SSL client certificate not found on MacOS Sierra
- It seems we may have some autobuild problems after this commit went
- in. Trying to see if a revert helps to get them back.
+ Reviewed-by: Nick Zitzmann
- This reverts commit 2716350d1f3edc8e929f6ceeee05051090f6d642.
+ Closes #1105
-- maketgz: add -j to make dist
+- curl: add --fail-early to help output
- ... makes it a lot faster
-
-- libcurl-thread.3: minor nroff format fix
-
-- CURLINFO_TLS_SSL_PTR.3: minor nroff format fix
-
-- CODE_STYLE: indend example code
+ Fixes test 1139 failures
- ... to make it look nicer in markdown outputa
+ Follow-up to f82bbe01c8835
-Jay Satiro (22 Mar 2016)
-- build-wolfssl: Update VS properties for wolfSSL v3.9.0
+- glob: fix [a-c] globbing regression
- - Do not use wolfSSL's sample user-setting files.
+ Brought in ee4f76606cf
- wolfSSL starting in v3.9.0 has added their own sample user settings that
- are applied by default, but we don't use them because we have our own
- settings.
+ Added test case 1280 to verify
- - Do not use wolfSSL's Visual Studio Unicode character setting.
+ Reported-by: Dave Reisner
- wolfSSL Visual Studio projects use the Unicode character set however our
- settings and options imitate mingw build which does not use the Unicode
- character set. This does not appear to have any effect at the moment but
- better safe than sorry.
+ Bug: https://github.com/curl/curl/commit/ee4f76606cfa4ee068bf28edd37c8dae7e8db317#commitcomment-19823146
+
+- curl: add --fail-early
+ Exit with an error on the first transfer error instead of continuing to
+ do the rest of the URLs.
- These changes are backwards compatible with earlier versions.
+ Discussion: https://curl.haxx.se/mail/archive-2016-11/0038.html
-Steve Holme (22 Mar 2016)
-- hostip6: Fixed compilation warnings when verbose strings disabled
+- Curl_rand: fixed and moved to rand.c
- warning C4189: 'data': local variable is initialized but not referenced
+ Now Curl_rand() is made to fail if it cannot get the necessary random
+ level.
- ...and some minor formatting/spacing changes.
-
-Daniel Stenberg (21 Mar 2016)
-- sshserver: remove use of AuthorizedKeysFile2
+ Changed the proto of Curl_rand() slightly to provide a number of ints at
+ once.
- Support for the (undocumented) AuthorizedKeysFile2 was removed in
- OpenSSH 5.9, released in September 2011
+ Moved out from vtls, since it isn't a TLS function and vtls provides
+ Curl_ssl_random() for this to use.
- Closes #715
+ Discussion: https://curl.haxx.se/mail/lib-2016-11/0119.html
-Steve Holme (20 Mar 2016)
-- connect/ntlm/http: Fixed compilation warnings when verbose strings disabled
+- cmdline-opts: first test version of a new man page generator kit
- warning C4189: 'data': local variable is initialized but not referenced
+ See MANPAGE.md for the description of how this works. Each command line
+ option is now described in a separate .d file.
-- openssl: Fixed compilation warning when /Wall enabled
+- time_t fix: follow-up to de4de4e3c7c
- warning C4706: assignment within conditional expression
-
-- CODE_STYLE: Use boolean conditions
+ Blah, I accidentally wrote size_t instead of time_t for two variables.
- Rather than use TRUE, FALSE, NULL, 0 or != 0 in if/while conditions.
+ Reported-by: Dave Reisner
+
+- timeval: prefer time_t to hold seconds instead of long
- Additionally, corrected some example code to adhere to the recommended
- coding style.
+ ... as long is still 32bit on modern 64bit windows machines, while
+ time_t is generally 64bit.
-- inet_pton.c: Fixed compilation warnings
+Dan Fandrich (12 Nov 2016)
+- tests: fixed variable might be clobbered warning
- warning: conversion to 'unsigned char' from 'int' may alter its value
+ This stops the compiler from potentially making invalid assumptions
+ about the immutability of sdp and sap across the longjmp boundary.
-Daniel Stenberg (19 Mar 2016)
-- RELEASE-NOTES: synced with 80851028efc2fa9
+Daniel Stenberg (12 Nov 2016)
+- RELEASE-NOTES: synced with 346340808c
-- mbedtls: fix compiler warning
+- URL-parser: for file://[host]/ URLs, the [host] must be localhost
- vtls/mbedtls.h:67:36: warning: implicit declaration of function
- ‘mbedtls_sha256’ [-Wimplicit-function-declaration]
-
-Steve Holme (19 Mar 2016)
-- easy: Minor coding standard and style updates
+ Previously, the [host] part was just ignored which made libcurl accept
+ strange URLs misleading users. like "file://etc/passwd" which might've
+ looked like it refers to "/etc/passwd" but is just "/passwd" since the
+ "etc" is an ignored host name.
- Following commit c5744340db. Additionally removes the need for a second
- 'result code' variable as well.
+ Reported-by: Mike Crowe
+ Assisted-by: Kamil Dudka
+
+- test558: adapt to 0649433da
+
+- openssl: make sure to fail in the unlikely event that PRNG seeding fails
-Jay Satiro (19 Mar 2016)
-- easy: Remove poll failure check in easy_transfer
+- openssl: avoid unnecessary seeding if already done
- .. because curl_multi_wait can no longer signal poll failure.
+ 1.1.0+ does more of this by itself so we can avoid extra processing this
+ way.
+
+- openssl: RAND_status always exists in OpenSSL >= 0.9.7
- follow-up to 77e1726
+ and remove RAND_screen from configure since nothing is using that
+ function
+
+- Curl_pgrsUpdate: use dedicated function for time passed
+
+- realloc: use Curl_saferealloc to avoid common mistakes
- Bug: https://github.com/curl/curl/issues/707
+ Discussed: https://curl.haxx.se/mail/lib-2016-11/0087.html
-Steve Holme (19 Mar 2016)
-- build: Added missing Visual Studio filter files for VC10 onwards
+- [Daniel Hwang brought this change]
+
+ curl: Add --retry-connrefused
- As these files don't need to contain references to the source files,
- although typically do, added basic files which only include three
- filters and don't require the project file generator to be modified.
+ to consider ECONNREFUSED as a transient error.
- These files allow the source code to be viewed in the Solution Explorer
- in versions of Visual Studio from 2010 onwards in the same manner as
- previous versions did rather than one large view of files.
+ Closes #1064
-- ftp/imap/pop3/smtp: Fixed compilation warning when /Wall enabled
+- openssl: raise the max_version to 1.3 if asked for
- warning C4706: assignment within conditional expression
+ Now I've managed to negotiate TLS 1.3 with https://enabled.tls13.com/ when
+ using boringssl.
-- config-w32.h: Fixed compilation warning when /Wall enabled
+Jay Satiro (9 Nov 2016)
+- vtls: Fail on unrecognized param for CURLOPT_SSLVERSION
- warning C4668: 'USE_IPV6' is not defined as a preprocessor macro,
- replacing with '0' for '#if/#elif'
-
-- imap.c: Fixed compilation warning with /Wall enabled
+ - Fix GnuTLS code for CURL_SSLVERSION_TLSv1_2 that broke when the
+ TLS 1.3 support was added in 6ad3add.
- warning C4701: potentially uninitialized local variable 'size' used
+ - Homogenize across code for all backends the error message when TLS 1.3
+ is not available to "<backend>: TLS 1.3 is not yet supported".
- Technically this can't happen, as the usage of 'size' is protected by
- 'if(parsed)' and 'parsed' is only set after 'size' has been parsed.
+ - Return an error when a user-specified ssl version is unrecognized.
- Anyway, lets keep the compiler happy.
-
-- KNOWN_BUGS: #93 Issue with CURLFORM_CONTENTLEN in arrays on 32-bit platforms
-
-Daniel Stenberg (18 Mar 2016)
-- bump: the coming release is 7.48.0
-
-- configure: use cpp -P when needed
+ ---
- Since gcc 5, the processor output can get split up on multiple lines
- that made the configure script fail to figure out values from
- definitions. The fix is to use cpp -P, and this fix now first checks if
- cpp -P is necessary and then if cpp -P works before it uses that to
- extract defined values.
+ Prior to this change our code for some of the backends used the
+ 'default' label in the switch statement (ie ver unrecognized) for
+ ssl.version and treated it the same as CURL_SSLVERSION_DEFAULT.
- Fixes #719
+ Bug: https://curl.haxx.se/mail/lib-2016-11/0048.html
+ Reported-by: Kamil Dudka
-Steve Holme (18 Mar 2016)
-- formdata.c: Fixed compilation warning
-
- formdata.c:390: warning: cast from pointer to integer of different size
+Daniel Stenberg (9 Nov 2016)
+- [Isaac Boukris brought this change]
+
+ SPNEGO: Fix memory leak when authentication fails
- Introduced in commit ca5f9341ef this happens because a char*, which is
- 32-bits wide in 32-bit land, is being cast to a curl_off_t which is
- 64-bits wide where 64-bit integers are supported by the compiler.
+ If SPNEGO fails, cleanup the negotiate handle right away.
- This doesn't happen in 64-bit land as a pointer is the same size as a
- curl_off_t.
+ Fixes #1115
- This fix doesn't address the fact that a 64-bit value cannot be used
- for CURLFORM_CONTENTLEN when set in a form array and compiled on a
- 32-bit platforms, it does at least suppress the compilation warning.
+ Signed-off-by: Isaac Boukris <iboukris@gmail.com>
+ Reported-by: ashman-p
-Daniel Stenberg (18 Mar 2016)
-- FAQ: 2.5 Install libcurl for both 32bit and 64bit?
+- CODE_STYLE.md: link to INTERNALS.md correctly
-- [Gisle Vanem brought this change]
+- bump: next version will be 7.52.0
- openssl: adapt to API breakage in ERR_remove_thread_state()
+- RELEASE-NOTES: synced with dfcdaaba371e9a3
+
+- examples/fileupload.c: fclose the file as well
+
+- printf: fix ".*f" handling
- The OpenSSL API change that broke this is "Convert ERR_STATE to new
- multi-threading API": openssl commit 8509dcc.
+ It would always use precision 1 instead of reading it from the argument
+ list as intended.
+
+ Reported-by: Ray Satiro
- Closes #713
+ Bug: #1113
-- version: init moved to private name space, added protos
+- curl_formadd.3: *_FILECONTENT and *_FILE need the file to be kept
- follow-up to 80015cdd52145
+ Reported-by: Frank Gevaerts
-- openssl: verbose: show matching SAN pattern
+Kamil Dudka (7 Nov 2016)
+- nss: silence warning 'SSL_NEXT_PROTO_EARLY_VALUE not handled in switch'
- ... to allow users to see which specfic wildcard that matched when such
- is used.
+ ... with nss-3.26.0 and newer
- Also minor logic cleanup to simplify the code, and I removed all tabs
- from verbose strings.
-
-Jay Satiro (16 Mar 2016)
-- version: thread safety
+ Reported-by: Daniel Stenberg
-Steve Holme (16 Mar 2016)
-- transfer: Removed redundant HTTP authentication include files
+Daniel Stenberg (7 Nov 2016)
+- openssl: initial TLS 1.3 adaptions
- It would also seem that share.h is not required here either as there
- are no references to the Curl_share structure or functions.
-
-- easy: Removed redundant HTTP authentication include files
+ BoringSSL supports TLSv1.3 already, but these changes don't seem to be anough
+ to get it working.
-Jay Satiro (15 Mar 2016)
-- CURLOPT_SSLENGINE.3: Only for OpenSSL built with engine support
+- ssh: check md5 fingerprints case insensitively (regression)
- Bug: https://curl.haxx.se/mail/lib-2016-03/0150.html
- Reported-by: Oliver Graute
-
-Steve Holme (15 Mar 2016)
-- curl_sasl: Minor code indent fixes
-
-Daniel Stenberg (14 Mar 2016)
-- runtests: mention when run event-based
-
-- easy: add check to malloc() when running event-based
+ Revert the change from ce8d09483eea but use the new function
- ... to allow torture tests then too.
-
-- memdebug: skip logging the limit countdown, fflush when reached
+ Reported-by: Kamil Dudka
+ Bug: https://github.com/curl/curl/commit/ce8d09483eea2fcb1b50e323e1a8ed1f3613b2e3#commitcomment-19666146
-- CODE_STYLE: Space around operators
+Kamil Dudka (7 Nov 2016)
+- curl: introduce the --tlsv1.3 option to force TLS 1.3
+
+ Fully implemented with the NSS backend only for now.
- As just discussed on the mailing list, also document how we prefer
- spacing in expressions.
+ Reviewed-by: Ray Satiro
-- curl: glob_range: no need to check unsigned variable for negative
+- vtls: support TLS 1.3 via CURL_SSLVERSION_TLSv1_3
- cppcheck warned:
+ Fully implemented with the NSS backend only for now.
- [src/tool_urlglob.c:283]: (style) Checking if unsigned variable 'step_n'
- is less than zero.
-
-- CODE_STYLE: add example for indent style as well
-
-- CODE_STYLE: mention braces for functions too
-
-- docs/Makefile.am: include CODE_STYLE in tarball too
-
-- CONTRIBUTE: moved out code style to a separate document
+ Reviewed-by: Ray Satiro
-- CODE_STYLE: initial version
+- nss: map CURL_SSLVERSION_DEFAULT to NSS default
- Ripped out from CONTRIBUTE into its own document, but also extended from
- there.
-
-- curl_sasl.c: minor code indent fixes
-
-- multi: simplified singlesocket
+ ... but make sure we use at least TLSv1.0 according to libcurl API
- Since sh_getentry() now checks for invalid sockets itself and by
- narrowing the scope of the remove_sock_from_hash variable.
+ Reported-by: Cure53
+ Reviewed-by: Ray Satiro
-- multi: introduce sh_getentry() for looking up sockets in the sockhash
+Daniel Stenberg (7 Nov 2016)
+- s/cURL/curl
- Simplify the code by using a single entry that looks for a socket in the
- socket hash. As indicated in #712, the code looked for CURL_SOCKET_BAD
- at some point and that is ineffective/wrong and this makes it easier to
- avoid that.
+ We're mostly saying just "curl" in lower case these days so here's a big
+ cleanup to adapt to this reality. A few instances are left as the
+ project could still formally be considered called cURL.
-- [Jaime Fullaondo brought this change]
+Jay Satiro (7 Nov 2016)
+- [Tatsuhiro Tsujikawa brought this change]
- multi hash: ensure modulo performed on curl_socket_t
+ http2: Don't send header fields prohibited by HTTP/2 spec
- Closes #712
-
-Steve Holme (13 Mar 2016)
-- base64: Minor coding standard and style updates
-
-- base64: Use 'CURLcode result' for curl result codes
+ Previously, we just ignored "Connection" header field. But HTTP/2
+ specification actually prohibits few more header fields. This commit
+ ignores all of them so that we don't send these bad header fields.
+
+ Bug: https://curl.haxx.se/mail/archive-2016-10/0033.html
+ Reported-by: Ricki Hirner
+
+ Closes https://github.com/curl/curl/pull/1092
diff --git a/CMake/CurlTests.c b/CMake/CurlTests.c
index ceff3915..bc36c8ef 100644
--- a/CMake/CurlTests.c
+++ b/CMake/CurlTests.c
@@ -533,3 +533,19 @@ main () {
return 0;
}
#endif
+#ifdef HAVE_FSETXATTR_6
+#include <sys/xattr.h> /* header from libc, not from libattr */
+int
+main() {
+ fsetxattr(0, 0, 0, 0, 0, 0);
+ return 0;
+}
+#endif
+#ifdef HAVE_FSETXATTR_5
+#include <sys/xattr.h> /* header from libc, not from libattr */
+int
+main() {
+ fsetxattr(0, 0, 0, 0, 0);
+ return 0;
+}
+#endif
diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake
index dfaeaf30..60dcb73c 100644
--- a/CMake/FindGSS.cmake
+++ b/CMake/FindGSS.cmake
@@ -12,7 +12,7 @@
# GSS_LINKER_FLAGS - Additional linker flags
# GSS_COMPILER_FLAGS - Additional compiler flags
# GSS_VERSION - This is set to version advertised by pkg-config or read from manifest.
-# In case the library is found but no version info availabe it'll be set to "unknown"
+# In case the library is found but no version info available it'll be set to "unknown"
set(_MIT_MODNAME mit-krb5-gssapi)
set(_HEIMDAL_MODNAME heimdal-gssapi)
diff --git a/CMake/FindMbedTLS.cmake b/CMake/FindMbedTLS.cmake
new file mode 100644
index 00000000..a9163958
--- /dev/null
+++ b/CMake/FindMbedTLS.cmake
@@ -0,0 +1,13 @@
+find_path(MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h)
+
+find_library(MBEDTLS_LIBRARY mbedtls)
+find_library(MBEDX509_LIBRARY mbedx509)
+find_library(MBEDCRYPTO_LIBRARY mbedcrypto)
+
+set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MBEDTLS DEFAULT_MSG
+ MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
+
+mark_as_advanced(MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake
index 3b203c53..989f04eb 100644
--- a/CMake/OtherTests.cmake
+++ b/CMake/OtherTests.cmake
@@ -32,9 +32,9 @@ int main(void) {
if(curl_cv_recv)
if(NOT DEFINED curl_cv_func_recv_args OR "${curl_cv_func_recv_args}" STREQUAL "unknown")
foreach(recv_retv "int" "ssize_t" )
- foreach(recv_arg1 "int" "ssize_t" "SOCKET")
- foreach(recv_arg2 "void *" "char *")
- foreach(recv_arg3 "size_t" "int" "socklen_t" "unsigned int")
+ foreach(recv_arg1 "SOCKET" "int" )
+ foreach(recv_arg2 "char *" "void *" )
+ foreach(recv_arg3 "int" "size_t" "socklen_t" "unsigned int")
foreach(recv_arg4 "int" "unsigned int")
if(NOT curl_cv_func_recv_done)
unset(curl_cv_func_recv_test CACHE)
@@ -96,9 +96,9 @@ int main(void) {
if(curl_cv_send)
if(NOT DEFINED curl_cv_func_send_args OR "${curl_cv_func_send_args}" STREQUAL "unknown")
foreach(send_retv "int" "ssize_t" )
- foreach(send_arg1 "int" "ssize_t" "SOCKET")
- foreach(send_arg2 "const void *" "void *" "char *" "const char *")
- foreach(send_arg3 "size_t" "int" "socklen_t" "unsigned int")
+ foreach(send_arg1 "SOCKET" "int" "ssize_t" )
+ foreach(send_arg2 "const char *" "const void *" "void *" "char *")
+ foreach(send_arg3 "int" "size_t" "socklen_t" "unsigned int")
foreach(send_arg4 "int" "unsigned int")
if(NOT curl_cv_func_send_done)
unset(curl_cv_func_send_test CACHE)
diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake
index 37cdfe3b..8b6276df 100644
--- a/CMake/Utilities.cmake
+++ b/CMake/Utilities.cmake
@@ -29,3 +29,16 @@ function(IN_STR_LIST LIST_NAME ITEM_SEARCHED RETVAL)
set(${RETVAL} TRUE PARENT_SCOPE)
endif()
endfunction()
+
+# Returns a list of arguments that evaluate to true
+function(collect_true output_var output_count_var)
+ set(${output_var})
+ foreach(option_var IN LISTS ARGN)
+ if(${option_var})
+ list(APPEND ${output_var} ${option_var})
+ endif()
+ endforeach()
+ set(${output_var} ${${output_var}} PARENT_SCOPE)
+ list(LENGTH ${output_var} ${output_count_var})
+ set(${output_count_var} ${${output_count_var}} PARENT_SCOPE)
+endfunction()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a6a73689..0caf3dc1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -72,10 +72,14 @@ 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)
option(BUILD_CURL_EXE "Set to ON to build curl executable." ON)
option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
if(WIN32)
+ option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
+ option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
+
CMAKE_DEPENDENT_OPTION(ENABLE_THREADED_RESOLVER
"Set to ON to enable threaded DNS lookup"
ON "NOT ENABLE_ARES"
@@ -100,6 +104,9 @@ if (ENABLE_CURLDEBUG)
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
endif()
+# For debug libs and exes, add "-d" postfix
+set(CMAKE_DEBUG_POSTFIX "-d" CACHE STRING "Set debug library postfix" FORCE)
+
# initialize CURL_LIBS
set(CURL_LIBS "")
@@ -114,11 +121,6 @@ if(ENABLE_ARES)
set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
endif()
-if(MSVC)
- option(BUILD_RELEASE_DEBUG_DIRS "Set OFF to build each configuration to a separate directory" OFF)
- mark_as_advanced(BUILD_RELEASE_DEBUG_DIRS)
-endif()
-
include(CurlSymbolHiding)
option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
@@ -224,16 +226,33 @@ if(ENABLE_MANUAL)
message(WARNING "Found no *nroff program")
endif()
endif()
+# Required for building manual, docs, tests
+find_package(Perl REQUIRED)
# We need ansi c-flags, especially on HP
set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
+if(CURL_STATIC_CRT)
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
+ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
+endif()
+
# Disable warnings on Borland to avoid changing 3rd party code.
if(BORLAND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
endif(BORLAND)
+if(CURL_WERROR)
+ if(MSVC_VERSION)
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /WX")
+ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
+ else()
+ # this assumes clang or gcc style options
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
+ endif()
+endif(CURL_WERROR)
+
# If we are on AIX, do the _ALL_SOURCE magic
if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
set(_ALL_SOURCE 1)
@@ -251,7 +270,7 @@ include (CMakeDependentOption)
# On windows preload settings
if(WIN32)
- set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_")
+ set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_=")
include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
endif(WIN32)
@@ -289,47 +308,96 @@ endif(NOT NOT_NEED_LIBNSL)
check_function_exists(gethostname HAVE_GETHOSTNAME)
-set(OPENSSL_DEFAULT ON)
if(WIN32)
- set(OPENSSL_DEFAULT OFF)
check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
endif()
-option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${OPENSSL_DEFAULT})
-mark_as_advanced(CMAKE_USE_OPENSSL)
+# check SSL libraries
+# TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL
+if(APPLE)
+ option(CMAKE_USE_DARWINSSL "enable Apple OS native SSL/TLS" OFF)
+endif()
if(WIN32)
- CMAKE_DEPENDENT_OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
- "NOT CMAKE_USE_OPENSSL" OFF)
- mark_as_advanced(CURL_WINDOWS_SSPI)
+ option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
+ cmake_dependent_option(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
+ CMAKE_USE_WINSSL OFF)
endif()
+option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
-set(USE_OPENSSL OFF)
-set(HAVE_LIBCRYPTO OFF)
-set(HAVE_LIBSSL OFF)
+set(openssl_default ON)
+if(WIN32 OR CMAKE_USE_DARWINSSL OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
+ set(openssl_default OFF)
+endif()
+option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
+
+collect_true(enabled_ssl_options enabled_ssl_options_count
+ CMAKE_USE_WINSSL
+ CMAKE_USE_DARWINSSL
+ CMAKE_USE_OPENSSL
+ CMAKE_USE_MBEDTLS
+)
+if(enabled_ssl_options_count GREATER 1)
+ message(FATAL_ERROR "Multiple SSL options specified: ${enabled_ssl_options}. Please pick at most one and disable the rest.")
+endif()
-if(CMAKE_USE_OPENSSL)
- find_package(OpenSSL)
- if(OPENSSL_FOUND)
- list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
- set(USE_OPENSSL ON)
- set(HAVE_LIBCRYPTO ON)
- set(HAVE_LIBSSL ON)
- include_directories(${OPENSSL_INCLUDE_DIR})
- set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
- check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
- check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
- check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H)
- check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H)
- check_include_file("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
- check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
- check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
- check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
- check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H)
- elseif(WIN32)
- set(CURL_WINDOWS_SSPI ON)
+if(CMAKE_USE_WINSSL)
+ set(SSL_ENABLED ON)
+ set(USE_SCHANNEL ON) # Windows native SSL/TLS support
+ set(USE_WINDOWS_SSPI ON) # CMAKE_USE_WINSSL implies CURL_WINDOWS_SSPI
+ list(APPEND CURL_LIBS "crypt32")
+endif()
+if(CURL_WINDOWS_SSPI)
+ set(USE_WINDOWS_SSPI ON)
+ set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
+endif()
+
+if(CMAKE_USE_DARWINSSL)
+ find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation")
+ if(NOT COREFOUNDATION_FRAMEWORK)
+ message(FATAL_ERROR "CoreFoundation framework not found")
+ endif()
+
+ find_library(SECURITY_FRAMEWORK "Security")
+ if(NOT SECURITY_FRAMEWORK)
+ message(FATAL_ERROR "Security framework not found")
endif()
+
+ set(SSL_ENABLED ON)
+ set(USE_DARWINSSL ON)
+ list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}")
+endif()
+
+if(CMAKE_USE_OPENSSL)
+ find_package(OpenSSL REQUIRED)
+ set(SSL_ENABLED ON)
+ set(USE_OPENSSL ON)
+ set(HAVE_LIBCRYPTO ON)
+ set(HAVE_LIBSSL ON)
+ list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
+ include_directories(${OPENSSL_INCLUDE_DIR})
+ set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
+ check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
+ check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
+ check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H)
+ check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H)
+ check_include_file("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
+ check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
+ check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
+ check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
+ check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H)
+ check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS)
+ check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
+ check_symbol_exists(RAND_egd "${CURL_INCLUDES}" HAVE_RAND_EGD)
+endif()
+
+if(CMAKE_USE_MBEDTLS)
+ find_package(MbedTLS REQUIRED)
+ set(SSL_ENABLED ON)
+ set(USE_MBEDTLS ON)
+ list(APPEND CURL_LIBS ${MBEDTLS_LIBRARIES})
+ include_directories(${MBEDTLS_INCLUDE_DIRS})
endif()
option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
@@ -572,24 +640,86 @@ else()
endif()
+#
+# CA handling
+#
+set(CURL_CA_BUNDLE "auto" CACHE STRING
+ "Path to the CA bundle. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
+set(CURL_CA_FALLBACK OFF CACHE BOOL
+ "Set ON to use built-in CA store of TLS backend. Defaults to OFF")
+set(CURL_CA_PATH "auto" CACHE STRING
+ "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
+
+if("${CURL_CA_BUNDLE}" STREQUAL "")
+ message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
+elseif("${CURL_CA_BUNDLE}" STREQUAL "none")
+ unset(CURL_CA_BUNDLE CACHE)
+elseif("${CURL_CA_BUNDLE}" STREQUAL "auto")
+ unset(CURL_CA_BUNDLE CACHE)
+ set(CURL_CA_BUNDLE_AUTODETECT TRUE)
+else()
+ set(CURL_CA_BUNDLE_SET TRUE)
+endif()
+
+if("${CURL_CA_PATH}" STREQUAL "")
+ message(FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path.")
+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)
+else()
+ set(CURL_CA_PATH_SET TRUE)
+endif()
+
+if(CURL_CA_BUNDLE_SET AND CURL_CA_PATH_AUTODETECT)
+ # Skip autodetection of unset CA path because CA bundle is set explicitly
+elseif(CURL_CA_PATH_SET AND CURL_CA_BUNDLE_AUTODETECT)
+ # Skip autodetection of unset CA bundle because CA path is set explicitly
+elseif(CURL_CA_PATH_AUTODETECT OR CURL_CA_BUNDLE_AUTODETECT)
+ # first try autodetecting a CA bundle, then a CA path
+
+ if(CURL_CA_BUNDLE_AUTODETECT)
+ set(SEARCH_CA_BUNDLE_PATHS
+ /etc/ssl/certs/ca-certificates.crt
+ /etc/pki/tls/certs/ca-bundle.crt
+ /usr/share/ssl/certs/ca-bundle.crt
+ /usr/local/share/certs/ca-root-nss.crt
+ /etc/ssl/cert.pem)
+
+ foreach(SEARCH_CA_BUNDLE_PATH ${SEARCH_CA_BUNDLE_PATHS})
+ if(EXISTS "${SEARCH_CA_BUNDLE_PATH}")
+ message(STATUS "Found CA bundle: ${SEARCH_CA_BUNDLE_PATH}")
+ set(CURL_CA_BUNDLE "${SEARCH_CA_BUNDLE_PATH}")
+ set(CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
+ break()
+ endif()
+ endforeach()
+ endif()
+
+ if(CURL_CA_PATH_AUTODETECT AND (NOT CURL_CA_PATH_SET))
+ if(EXISTS "/etc/ssl/certs")
+ set(CURL_CA_PATH "/etc/ssl/certs")
+ set(CURL_CA_PATH_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
+ endif()
+ endif()
+endif()
+
+if(CURL_CA_PATH_SET AND NOT USE_OPENSSL AND NOT USE_MBEDTLS)
+ message(FATAL_ERROR
+ "CA path only supported by OpenSSL, GnuTLS or mbed TLS. "
+ "Set CURL_CA_PATH=none or enable one of those TLS backends.")
+endif()
+
+
# Check for header files
if(NOT UNIX)
check_include_file_concat("windows.h" HAVE_WINDOWS_H)
check_include_file_concat("winsock.h" HAVE_WINSOCK_H)
check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H)
check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H)
- if(CURL_WINDOWS_SSPI)
- set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
- check_include_file_concat("sspi.h" HAVE_SSPI_H)
- if(HAVE_SSPI_H)
- check_include_file_concat("schannel.h" HAVE_SCHANNEL_H)
- set(USE_WINDOWS_SSPI ON)
- if(HAVE_SCHANNEL_H)
- set(USE_SCHANNEL ON)
- set(SSL_ENABLED ON)
- set(CURL_LIBS ${CURL_LIBS} "crypt32")
- endif()
- endif()
+ if(NOT CURL_WINDOWS_SSPI AND USE_OPENSSL)
+ set(CURL_LIBS ${CURL_LIBS} "crypt32")
endif()
endif(NOT UNIX)
@@ -609,6 +739,7 @@ check_include_file_concat("sys/types.h" HAVE_SYS_TYPES_H)
check_include_file_concat("sys/uio.h" HAVE_SYS_UIO_H)
check_include_file_concat("sys/un.h" HAVE_SYS_UN_H)
check_include_file_concat("sys/utime.h" HAVE_SYS_UTIME_H)
+check_include_file_concat("sys/xattr.h" HAVE_SYS_XATTR_H)
check_include_file_concat("alloca.h" HAVE_ALLOCA_H)
check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H)
check_include_file_concat("arpa/tftp.h" HAVE_ARPA_TFTP_H)
@@ -778,14 +909,6 @@ check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT)
check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID)
check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID)
check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME)
-if(CMAKE_USE_OPENSSL)
- check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS)
- check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
- check_symbol_exists(RAND_egd "${CURL_INCLUDES}" HAVE_RAND_EGD)
- if(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
- set(USE_OPENSSL 1)
- endif(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
-endif(CMAKE_USE_OPENSSL)
check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
@@ -818,7 +941,25 @@ check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
# symbol exists in win32, but function does not.
-check_function_exists(inet_pton HAVE_INET_PTON)
+if(WIN32)
+ if(ENABLE_INET_PTON)
+ check_function_exists(inet_pton HAVE_INET_PTON)
+ # _WIN32_WINNT_VISTA (0x0600)
+ add_definitions(-D_WIN32_WINNT=0x0600)
+ else()
+ # _WIN32_WINNT_WINXP (0x0501)
+ add_definitions(-D_WIN32_WINNT=0x0501)
+ endif()
+else()
+ check_function_exists(inet_pton HAVE_INET_PTON)
+endif()
+
+check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
+if(HAVE_FSETXATTR)
+ foreach(CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6)
+ curl_internal_test_run(${CURL_TEST})
+ endforeach(CURL_TEST)
+endif(HAVE_FSETXATTR)
# sigaction and sigsetjmp are special. Use special mechanism for
# detecting those, but only if previous attempt failed.
@@ -998,7 +1139,7 @@ else()
set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
endif()
-# TODO test which of these headers are required for the typedefs used in curlbuild.h
+# TODO test which of these headers are required
if(WIN32)
set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
else()
@@ -1013,11 +1154,6 @@ include(CMake/OtherTests.cmake)
add_definitions(-DHAVE_CONFIG_H)
-# For windows, do not allow the compiler to use default target (Vista).
-if(WIN32)
- add_definitions(-D_WIN32_WINNT=0x0501)
-endif(WIN32)
-
# For windows, all compilers used by cmake should support large files
if(WIN32)
set(USE_WIN32_LARGE_FILES ON)
@@ -1025,6 +1161,11 @@ endif(WIN32)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
+ if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
+ string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+ else(CMAKE_C_FLAGS MATCHES "/W[0-4]")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
+ endif(CMAKE_C_FLAGS MATCHES "/W[0-4]")
endif(MSVC)
# Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
@@ -1033,9 +1174,9 @@ function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
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})
- string(REGEX REPLACE "\\\\\n" "§!§" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
+ string(REGEX REPLACE "\\\\\n" "!π!α!" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
- string(REPLACE "§!§" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
+ string(REPLACE "!π!α!" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace @@ with ${}, even if that may not be read by CMake scripts.
@@ -1043,6 +1184,7 @@ function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
endfunction()
+add_subdirectory(docs)
add_subdirectory(lib)
if(BUILD_CURL_EXE)
add_subdirectory(src)
@@ -1053,11 +1195,6 @@ if(BUILD_TESTING)
add_subdirectory(tests)
endif()
-# TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL, WINSSL, DARWINSSL
-if(USE_OPENSSL)
- set(SSL_ENABLED 1)
-endif()
-
# Helper to populate a list (_items) with a label when conditions (the remaining
# args) are satisfied
function(_add_if label)
@@ -1071,6 +1208,8 @@ endfunction()
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("IPv6" ENABLE_IPV6)
_add_if("unix-sockets" USE_UNIX_SOCKETS)
_add_if("libz" HAVE_LIBZ)
@@ -1087,9 +1226,8 @@ _add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND
_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, DARWINSSL
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR
- USE_WINDOWS_SSPI OR GNUTLS_ENABLED OR NSS_ENABLED OR DARWINSSL_ENABLED))
+# 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))
_add_if("NTLM" 1)
# TODO missing option (autoconf: --enable-ntlm-wb)
_add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
@@ -1138,8 +1276,6 @@ set(CC "${CMAKE_C_COMPILER}")
set(CONFIGURE_OPTIONS "")
# TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
set(CPPFLAG_CURL_STATICLIB "")
-# TODO need to set this (see CURL_CHECK_CA_BUNDLE in acinclude.m4)
-set(CURL_CA_BUNDLE "")
set(CURLVERSION "${CURL_VERSION}")
set(ENABLE_SHARED "yes")
if(CURL_STATICLIB)
@@ -1153,7 +1289,7 @@ set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
set(LIBCURL_LIBS "")
set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
- if(_lib MATCHES ".*/.*")
+ if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-")
set(LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}")
else()
set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}")
@@ -1189,16 +1325,10 @@ if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
set(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
endif()
-# Installation.
-# First, install generated curlbuild.h
-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/curl/curlbuild.h"
- DESTINATION include/curl )
-# Next, install other headers excluding curlbuild.h
+# install headers
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
DESTINATION include
- FILES_MATCHING PATTERN "*.h"
- PATTERN "curlbuild.h" EXCLUDE)
-
+ FILES_MATCHING PATTERN "*.h")
# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
@@ -1208,3 +1338,14 @@ if(MSVC_VERSION EQUAL 1600)
file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")
endif()
endif()
+
+if(NOT TARGET uninstall)
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
+ IMMEDIATE @ONLY)
+
+ add_custom_target(uninstall
+ COMMAND ${CMAKE_COMMAND} -P
+ ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+endif()
diff --git a/COPYING b/COPYING
index a98663e9..1e45a5e2 100644
--- a/COPYING
+++ b/COPYING
@@ -1,6 +1,6 @@
COPYRIGHT AND PERMISSION NOTICE
-Copyright (c) 1996 - 2016, Daniel Stenberg, <daniel@haxx.se>, and many
+Copyright (c) 1996 - 2017, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.
All rights reserved.
diff --git a/MacOSX-Framework b/MacOSX-Framework
index 19b338f1..e6badcde 100755
--- a/MacOSX-Framework
+++ b/MacOSX-Framework
@@ -126,15 +126,6 @@ if test ! -z $SDK32; then
pwd
lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl
rm libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
- cp libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild32.h
- cp include/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild64.h
- cat >libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h <<EOF
-#ifdef __LP64__
-#include "curl/curlbuild64.h"
-#else
-#include "curl/curlbuild32.h"
-#endif
-EOF
fi
pwd
diff --git a/Makefile b/Makefile
index 329e4f3a..8577c8a1 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -20,8 +20,6 @@
#
###########################################################################
-VC=vc6
-
all:
./configure
make
@@ -87,366 +85,13 @@ mingw32%:
$(MAKE) -C lib -f Makefile.m32 CFG=$@
$(MAKE) -C src -f Makefile.m32 CFG=$@
-vc-clean: $(VC)
- cd lib
- nmake -f Makefile.$(VC) clean
- cd ..\src
- nmake -f Makefile.$(VC) clean
-
-vc-all: $(VC)
- cd lib
- nmake -f Makefile.$(VC) cfg=release
- nmake -f Makefile.$(VC) cfg=release-ssl
- nmake -f Makefile.$(VC) cfg=release-zlib
- nmake -f Makefile.$(VC) cfg=release-ssl-zlib
- nmake -f Makefile.$(VC) cfg=release-ssl-dll
- nmake -f Makefile.$(VC) cfg=release-zlib-dll
- nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
- nmake -f Makefile.$(VC) cfg=release-dll
- nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll
- nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll
- nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
- nmake -f Makefile.$(VC) cfg=debug
- nmake -f Makefile.$(VC) cfg=debug-ssl
- nmake -f Makefile.$(VC) cfg=debug-zlib
- nmake -f Makefile.$(VC) cfg=debug-ssl-zlib
- nmake -f Makefile.$(VC) cfg=debug-ssl-dll
- nmake -f Makefile.$(VC) cfg=debug-zlib-dll
- nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll
- nmake -f Makefile.$(VC) cfg=debug-dll
- nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll
- nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
- nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
-
-vc: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release
- cd ..\src
- nmake /f Makefile.$(VC)
-
-vc-x64: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
-
-vc-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
-
-vc-x64-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release WINDOWS_SSPI=1
-
-vc-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release USE_IDN=1
-
-vc-x64-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1
-
-vc-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release USE_IDN=1 WINDOWS_SSPI=1
-
-vc-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-zlib
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-zlib
-
-vc-x64-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib
-
-vc-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-zlib WINDOWS_SSPI=1
-
-vc-x64-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib WINDOWS_SSPI=1
-
-vc-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1
-
-vc-x64-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1
-
-vc-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-ssl: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl
-
-vc-x64-ssl: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl
-
-vc-ssl-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl WINDOWS_SSPI=1
-
-vc-x64-ssl-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl WINDOWS_SSPI=1
-
-vc-ssl-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1
-
-vc-x64-ssl-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1
-
-vc-ssl-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-ssl-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl USE_IDN=1 WINDOWS_SSPI=1
-
-vc-ssl-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib
-
-vc-x64-ssl-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
-
-vc-ssl-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib WINDOWS_SSPI=1
-
-vc-x64-ssl-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib WINDOWS_SSPI=1
-
-vc-ssl-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1
-
-vc-x64-ssl-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1
-
-vc-ssl-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-ssl-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-ssl-ssh2-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib
-
-vc-x64-ssl-ssh2-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib
-
-vc-ssl-ssh2-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1
-
-vc-x64-ssl-ssh2-zlib-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib WINDOWS_SSPI=1
-
-vc-ssl-ssh2-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1
-
-vc-x64-ssl-ssh2-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1
-
-vc-ssl-ssh2-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-ssl-ssh2-zlib-idn-sspi: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-ssh2-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-winssl: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-winssl WINDOWS_SSPI=1
-
-vc-x64-winssl: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl WINDOWS_SSPI=1
-
-vc-winssl-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-winssl-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl USE_IDN=1 WINDOWS_SSPI=1
-
-vc-winssl-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-winssl-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-winssl-zlib WINDOWS_SSPI=1
+vc:
+ cd winbuild
+ nmake /f Makefile.vc MACHINE=x86
-vc-x64-winssl-zlib: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib WINDOWS_SSPI=1
-
-vc-winssl-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-x64-winssl-zlib-idn: $(VC)
- cd lib
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1
- cd ..\src
- nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-winssl-zlib USE_IDN=1 WINDOWS_SSPI=1
-
-vc-ssl-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-dll
-
-vc-dll-ssl-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
-
-vc-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-dll
-
-vc-dll-zlib-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
-
-vc-dll-ssl-dll-zlib-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
-
-vc-ssl-dll-zlib-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
-
-vc-zlib-dll: $(VC)
- cd lib
- nmake /f Makefile.$(VC) cfg=release-zlib-dll
- cd ..\src
- nmake /f Makefile.$(VC) cfg=release-zlib-dll
+vc-x64:
+ cd winbuild
+ nmake /f Makefile.vc MACHINE=x64
djgpp:
$(MAKE) -C lib -f Makefile.dj
@@ -497,86 +142,6 @@ linux: all
linux-ssl: ssl
-# We don't need to do anything for vc6.
-vc6:
-
-# VC7 makefiles are for use with VS.NET and VS.NET 2003
-vc7: lib/Makefile.vc7 src/Makefile.vc7
-
-lib/Makefile.vc7: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s/VC6/VC7/g" lib/Makefile.vc6 > lib/Makefile.vc7
-
-src/Makefile.vc7: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s/VC6/VC7/g" src/Makefile.vc6 > src/Makefile.vc7
-
-# VC8 makefiles are for use with VS2005
-vc8: lib/Makefile.vc8 src/Makefile.vc8
-
-lib/Makefile.vc8: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib bufferoverflowu.lib/g" -e "s/VC6/VC8/g" lib/Makefile.vc6 > lib/Makefile.vc8
-
-src/Makefile.vc8: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib bufferoverflowu.lib/g" -e "s/VC6/VC8/g" src/Makefile.vc6 > src/Makefile.vc8
-
-# VC9 makefiles are for use with VS2008
-vc9: lib/Makefile.vc9 src/Makefile.vc9
-
-lib/Makefile.vc9: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc9/g" -e "s/VC6/VC9/g" lib/Makefile.vc6 > lib/Makefile.vc9
-
-src/Makefile.vc9: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc9/g" -e "s/VC6/VC9/g" src/Makefile.vc6 > src/Makefile.vc9
-
-# VC10 makefiles are for use with VS2010
-vc10: lib/Makefile.vc10 src/Makefile.vc10
-
-lib/Makefile.vc10: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" lib/Makefile.vc6 > lib/Makefile.vc10
-
-src/Makefile.vc10: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" src/Makefile.vc6 > src/Makefile.vc10
-
-# VC11 makefiles are for use with VS2012
-vc11: lib/Makefile.vc11 src/Makefile.vc11
-
-lib/Makefile.vc11: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" lib/Makefile.vc6 > lib/Makefile.vc11
-
-src/Makefile.vc11: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc11/g" -e "s/VC6/VC11/g" src/Makefile.vc6 > src/Makefile.vc11
-
-# VC12 makefiles are for use with VS2013
-vc12: lib/Makefile.vc12 src/Makefile.vc12
-
-lib/Makefile.vc12: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" lib/Makefile.vc6 > lib/Makefile.vc12
-
-src/Makefile.vc12: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc12/g" -e "s/VC6/VC12/g" src/Makefile.vc6 > src/Makefile.vc12
-
-# VC14 makefiles are for use with VS2015
-vc14: lib/Makefile.vc14 src/Makefile.vc14
-
-lib/Makefile.vc14: lib/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc14/g" -e "s/VC6/VC14/g" lib/Makefile.vc6 > lib/Makefile.vc14
-
-src/Makefile.vc14: src/Makefile.vc6
- @echo "generate $@"
- @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc14/g" -e "s/VC6/VC14/g" src/Makefile.vc6 > src/Makefile.vc14
-
ca-bundle: lib/mk-ca-bundle.pl
@echo "generate a fresh ca-bundle.crt"
@perl $< -b -l -u lib/ca-bundle.crt
diff --git a/Makefile.am b/Makefile.am
index f86ffbca..64c1ca20 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -27,10 +27,10 @@ ACLOCAL_AMFLAGS = -I m4
CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \
CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \
- include/curl/curlbuild.h.cmake CMake/Macros.cmake \
+ CMake/Macros.cmake \
CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake \
- CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake
-
+ CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake \
+ CMake/FindMbedTLS.cmake
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -133,16 +133,18 @@ VC_DIST = projects/README \
projects/Windows/VC14/lib/libcurl.sln \
projects/Windows/VC14/lib/libcurl.vcxproj.filters \
projects/Windows/VC14/src/curl.sln \
- projects/Windows/VC14/src/curl.vcxproj.filters
+ projects/Windows/VC14/src/curl.vcxproj.filters \
+ projects/generate.bat \
+ projects/wolfssl_options.h \
+ projects/wolfssl_override.props
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
- winbuild/MakefileBuild.vc winbuild/Makefile.vc \
- winbuild/Makefile.msvc.names
+ winbuild/MakefileBuild.vc winbuild/Makefile.vc
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \
- $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in \
- buildconf.bat
+ scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \
+ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
$(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
@@ -152,8 +154,8 @@ CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
bin_SCRIPTS = curl-config
-SUBDIRS = lib src include
-DIST_SUBDIRS = $(SUBDIRS) tests packages docs scripts
+SUBDIRS = lib src
+DIST_SUBDIRS = $(SUBDIRS) tests packages scripts include docs
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libcurl.pc
@@ -168,14 +170,14 @@ dist-hook:
(distit=`find $(srcdir) -name "*.dist" | grep -v ./ares/`; \
for file in $$distit; do \
strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \
- cp $$file $(distdir)$$strip; \
+ cp -p $$file $(distdir)$$strip; \
done)
html:
- cd docs && make html
+ cd docs && $(MAKE) html
pdf:
- cd docs && make pdf
+ cd docs && $(MAKE) pdf
check: test examples check-docs
@@ -194,9 +196,15 @@ test:
test-full:
@(cd tests; $(MAKE) all full-test)
+test-nonflaky:
+ @(cd tests; $(MAKE) all nonflaky-test)
+
test-torture:
@(cd tests; $(MAKE) all torture-test)
+test-event:
+ @(cd tests; $(MAKE) all event-test)
+
test-am:
@(cd tests; $(MAKE) all am-test)
@@ -251,10 +259,10 @@ rpm:
# pkgadd -d ./HAXXcurl-*
#
-# gak - libtool requires an absoulte directory, hence the pwd below...
+# gak - libtool requires an absolute directory, hence the pwd below...
pkgadd:
umask 022 ; \
- make install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \
+ $(MAKE) install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \
cat COPYING > $(srcdir)/packages/Solaris/copyright ; \
cd $(srcdir)/packages/Solaris && $(MAKE) package
diff --git a/Makefile.in b/Makefile.in
index 8f47ab54..8333e28c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -144,7 +144,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -168,8 +169,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES = curl-config libcurl.pc
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -317,6 +317,12 @@ 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@
@@ -356,6 +362,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -368,6 +376,7 @@ 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@
@@ -498,9 +507,10 @@ ACLOCAL_AMFLAGS = -I m4
CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \
CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \
- include/curl/curlbuild.h.cmake CMake/Macros.cmake \
+ CMake/Macros.cmake \
CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake \
- CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake
+ CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake \
+ CMake/FindMbedTLS.cmake
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -594,16 +604,18 @@ VC_DIST = projects/README \
projects/Windows/VC14/lib/libcurl.sln \
projects/Windows/VC14/lib/libcurl.vcxproj.filters \
projects/Windows/VC14/src/curl.sln \
- projects/Windows/VC14/src/curl.vcxproj.filters
+ projects/Windows/VC14/src/curl.vcxproj.filters \
+ projects/generate.bat \
+ projects/wolfssl_options.h \
+ projects/wolfssl_override.props
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
- winbuild/MakefileBuild.vc winbuild/Makefile.vc \
- winbuild/Makefile.msvc.names
+ winbuild/MakefileBuild.vc winbuild/Makefile.vc
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \
- $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) lib/libcurl.vers.in \
- buildconf.bat
+ scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \
+ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh
CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
$(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
@@ -612,8 +624,8 @@ CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
$(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ)
bin_SCRIPTS = curl-config
-SUBDIRS = lib src include
-DIST_SUBDIRS = $(SUBDIRS) tests packages docs scripts
+SUBDIRS = lib src
+DIST_SUBDIRS = $(SUBDIRS) tests packages scripts include docs
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libcurl.pc
LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c \
@@ -724,7 +736,6 @@ CURL_CFILES = \
tool_urlglob.c \
tool_util.c \
tool_vms.c \
- tool_writeenv.c \
tool_writeout.c \
tool_xattr.c
@@ -769,7 +780,6 @@ CURL_HFILES = \
tool_util.h \
tool_version.h \
tool_vms.h \
- tool_writeenv.h \
tool_writeout.h \
tool_xattr.h
@@ -1058,7 +1068,7 @@ distdir: $(DISTFILES)
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r "$(distdir)"
dist-gzip: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
$(am__post_remove_distdir)
dist-bzip2: distdir
@@ -1084,7 +1094,7 @@ dist-shar: distdir
@echo WARNING: "Support for shar distribution archives is" \
"deprecated." >&2
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
- shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
$(am__post_remove_distdir)
dist-zip: distdir
@@ -1102,7 +1112,7 @@ dist dist-all:
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lz*) \
@@ -1112,7 +1122,7 @@ distcheck: dist
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
@@ -1321,14 +1331,14 @@ dist-hook:
(distit=`find $(srcdir) -name "*.dist" | grep -v ./ares/`; \
for file in $$distit; do \
strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \
- cp $$file $(distdir)$$strip; \
+ cp -p $$file $(distdir)$$strip; \
done)
html:
- cd docs && make html
+ cd docs && $(MAKE) html
pdf:
- cd docs && make pdf
+ cd docs && $(MAKE) pdf
check: test examples check-docs
@@ -1344,9 +1354,15 @@ check: test examples check-docs
@CROSSCOMPILING_FALSE@test-full:
@CROSSCOMPILING_FALSE@ @(cd tests; $(MAKE) all full-test)
+@CROSSCOMPILING_FALSE@test-nonflaky:
+@CROSSCOMPILING_FALSE@ @(cd tests; $(MAKE) all nonflaky-test)
+
@CROSSCOMPILING_FALSE@test-torture:
@CROSSCOMPILING_FALSE@ @(cd tests; $(MAKE) all torture-test)
+@CROSSCOMPILING_FALSE@test-event:
+@CROSSCOMPILING_FALSE@ @(cd tests; $(MAKE) all event-test)
+
@CROSSCOMPILING_FALSE@test-am:
@CROSSCOMPILING_FALSE@ @(cd tests; $(MAKE) all am-test)
@@ -1399,10 +1415,10 @@ rpm:
# pkgadd -d ./HAXXcurl-*
#
-# gak - libtool requires an absoulte directory, hence the pwd below...
+# gak - libtool requires an absolute directory, hence the pwd below...
pkgadd:
umask 022 ; \
- make install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \
+ $(MAKE) install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \
cat COPYING > $(srcdir)/packages/Solaris/copyright ; \
cd $(srcdir)/packages/Solaris && $(MAKE) package
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 2a7d95ca..cb0634b4 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,18 +1,137 @@
-Curl and libcurl 7.52.1
+Curl and libcurl 7.55.0
- Public curl releases: 162
- Command line options: 204
- curl_easy_setopt() options: 243
+ Public curl releases: 167
+ Command line options: 210
+ curl_easy_setopt() options: 247
Public functions in libcurl: 61
- Contributors: 1480
+ Contributors: 1571
+
+This release includes the following changes:
+
+ o curl: allow --header and --proxy-header read from file [7]
+ o getinfo: provide sizes as curl_off_t [6]
+ o curl: prevent binary output spewed to terminal [16]
+ o curl: added --request-target [22]
+ o libcurl: added CURLOPT_REQUEST_TARGET [22]
+ o curl: added --socks5-{basic,gssapi}: control socks5 auth [30]
+ o libcurl: added CURLOPT_SOCKS5_AUTH [30]
This release includes the following bugfixes:
- o CVE-2016-9594: unititialized random [1]
- o lib557: fix checksrc warnings
- o lib: fix MSVC compiler warnings
- o lib557.c: use a shorter MAXIMIZE representation [2]
- o tests: run checksrc on debug builds
+ o glob: do not parse after a strtoul() overflow range (CVE-2017-1000101) [85]
+ o tftp: reject file name lengths that don't fit (CVE-2017-1000100) [84]
+ o file: output the correct buffer to the user (CVE-2017-1000099) [83]
+ o includes: remove curl/curlbuild.h and curl/curlrules.h [1]
+ o dist: make the hugehelp.c not get regenerated unnecessarily [2]
+ o timers: store internal time stamps as time_t instead of doubles [3]
+ o progress: let "current speed" be UL + DL speeds combined [4]
+ o http-proxy: do the HTTP CONNECT process entirely non-blocking [5]
+ o lib/curl_setup.h: remove CURL_WANTS_CA_BUNDLE_ENV [8]
+ o fuzz: bring oss-fuzz initial code converted to C89 [10]
+ o configure: disable nghttp2 too if HTTP has been disabled
+ o mk-ca-bundle.pl: Check curl's exit code after certdata download [11]
+ o test1148: verify the -# progressbar [12]
+ o tests: stabilize test 2032 and 2033 [13]
+ o HTTPS-Proxy: don't offer h2 for https proxy connections [14]
+ o http-proxy: only attempt FTP over HTTP proxy [9]
+ o curl-compilers.m4: enable vla warning for clang [15]
+ o curl-compilers.m4: enable double-promotion warning [15]
+ o curl-compilers.m4: enable missing-variable-declarations clang warning [15]
+ o curl-compilers.m4: enable comma clang warning [15]
+ o Makefile.m32: enable -W for MinGW32 build [15]
+ o CURLOPT_PREQUOTE: not supported for SFTP [17]
+ o http2: fix OOM crash
+ o PIPELINING_SERVER_BL: cleanup the internal list use [18]
+ o mkhelp.pl: fix script name in usage text
+ o lib1521: add curl_easy_getinfo calls to the test set
+ o travis: do the distcheck test build out-of-tree as well
+ o if2ip: fix compiler warning in ISO C90 mode
+ o lib: fix the djgpp build [19]
+ o typecheck-gcc: add support for CURLINFO_OFF_T [20]
+ o travis: enable typecheck-gcc warnings [21]
+ o maketgz: switch to xz instead of lzma [23]
+ o CURLINFO_REDIRECT_URL.3: mention the CURLOPT_MAXREDIRS case
+ o curl-compilers.m4: fix unknown-warning-option on Apple clang [24]
+ o winbuild: fix boringssl build [25]
+ o curl/system.h: add check for XTENSA for 32bit gcc [26]
+ o test1537: fixed memory leak on OOM
+ o test1521: fix compiler warnings [27]
+ o curl: fix memory leak on test 1147 OOM [28]
+ o libtest/make: generate lib1521.c dynamically at build-time [29]
+ o curl_strequal.3: fix typo in SYNOPSIS [31]
+ o progress: prevent resetting t_starttransfer [32]
+ o openssl: improve fallback seed of PRNG with a time based hash [33]
+ o http2: improved PING frame handling [34]
+ o test1450: add simple testing for DICT [35]
+ o make: build the docs subdir only from within src [36]
+ o cmake: Added compatibility options for older Windows versions [37]
+ o gtls: fix build when sizeof(long) < sizeof(void *) [38]
+ o url: make the original string get used on subsequent transfers [39]
+ o timeval.c: Use long long constant type for timeval assignment [40]
+ o tool_sleep: typecast to avoid macos compiler warning
+ o travis.yml: use --enable-werror on debug builds [41]
+ o test1451: add SMB support to the testbed [42]
+ o configure: remove checks for 5 functions never used [43]
+ o configure: try ldap/lber in reversed order first [44]
+ o smb: fix build for djgpp/MSDOS [45]
+ o travis: install nghttp2 on linux builds [46]
+ o smb: add support for CURLOPT_FILETIME [47]
+ o cmake: fix send/recv argument scanner for windows [48]
+ o inet_pton: fix include on windows to get prototype [49]
+ o select.h: avoid macro redefinition harder
+ o cmake: if inet_pton is used, bump _WIN32_WINNT
+ o asyn-thread.c: fix unused variable warnings on macOS
+ o runtests: support "threaded-resolver" as a feature
+ o test506: skip if threaded-resolver
+ o cmake: remove spurious "-l" from linker flags [50]
+ o cmake: add CURL_WERROR for enabling "warning as errors"
+ o memdebug: don't setbuf() if the file open failed [51]
+ o curl_easy_escape.3: mention the (lack of) encoding [52]
+ o test1452: add telnet negotiation [53]
+ o CURLOPT_POSTFIELDS.3: explain the 100-continue magic better
+ o cmake: offer CMAKE_DEBUG_POSTFIX when building with MSVC [54]
+ o tests/valgrind.supp: supress OpenSSL false positive seen on travis [55]
+ o curl_setup_once: Remove ERRNO/SET_ERRNO macros [56]
+ o curl-compilers.m4: disable warning spam with Cygwin's clang [57]
+ o ldap: fix MinGW compiler warning [58]
+ o make: fix docs build on OpenBSD [59]
+ o curl_setup: always define WIN32_LEAN_AND_MEAN on Windows [60]
+ o system.h: include winsock2.h before windows.h
+ o winbuild: build with warning level 4 [61]
+ o rtspd: fix MSVC level 4 warning
+ o sockfilt: suppress conversion warning with explicit cast
+ o libtest: fix MSVC warning C4706
+ o darwinssl: fix pinnedpubkey build error [62]
+ o tests/server/resolve.c: fix deprecation warning [63]
+ o nss: fix a possible use-after-free in SelectClientCert() [64]
+ o checksrc: escape open brace in regex
+ o multi: mention integer overflow risk if using > 500 million sockets [65]
+ o darwinssl: fix --tlsv1.2 regression [66]
+ o timeval: struct curltime is a struct timeval replacement [67]
+ o curl_rtmp: fix a compiler warning [68]
+ o include.d: clarify that it concerns the response headers [69]
+ o cmake: support make uninstall [70]
+ o include.d: clarify --include is only for response headers [71]
+ o libcurl: Stop using error codes defined under CURL_NO_OLDIES [72]
+ o http: fix response code parser to avoid integer overflow [73]
+ o configure: fix the check for IdnToUnicode [74]
+ o multi: fix request timer management [75]
+ o curl_threads: fix MSVC compiler warning [76]
+ o travis: build on osx with openssl
+ o travis: build on osx with libressl
+ o CURLOPT_NETRC.3: mention the file name on windows
+ o cmake: set MSVC warning level to 4 [77]
+ o netrc: skip lines starting with '#' [78]
+ o darwinssl: fix curlssl_sha256sum() compiler warnings on first argument
+ o BUILD.WINDOWS: mention buildconf.bat for builds off git
+ o darwinssl: silence compiler warnings [79]
+ o travis: build on osx with darwinssl
+ o FTP: skip unnecessary CWD when in nocwd mode [80]
+ o gssapi: fix memory leak of output token in multi round context [81]
+ o getparameter: avoid returning uninitialized 'usedarg' [82]
+ o curl (debug build) easy_events: make event data static
+ o curl: detect and bail out early on parameter integer overflows [86]
+ o configure: fix recv/send/select detection on Android [87]
This release includes the following known bugs:
@@ -21,12 +140,105 @@ 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:
- Daniel Stenberg, Kamil Dudka, Marcel Raad, Ray Satiro,
- (4 contributors)
+ Brad Spencer, Brian Carpenter, Dan Fandrich, Daniel Stenberg,
+ David E. Narváez, destman at github, Dmitry Kostjuchenko,
+ Dwarakanath Yadavalli, Even Rouault, Evert Pot, Frederik B, Gisle Vanem,
+ Hannes Magnusson, Henrik Gaßmann, Isaac Boukris, Jakub Wilk, Jeremy Tan,
+ Jeroen Ooms, Jesse Chisholm, Johannes Schindelin, Kamil Dudka, Marcel Raad,
+ Martin Kepplinger, Matteo B., Max Dymond, Michael Kaufmann, Neil Kolban,
+ Nick Miyake, olesteban at github, ovidiu-benea on github, Pascal Terjan,
+ Paul Harris, Pavel Rochnyak, Per Malmberg, Ray Satiro, Rob Sanders,
+ Ryan Winograd, Sergei Nikulov, Simon Warta, Timothe Litt, Viktor Szakáts,
+ (41 contributors)
Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues:
- [1] = https://curl.haxx.se/docs/adv_20161223.html
- [2] = https://curl.haxx.se/mail/lib-2016-12/0098.html
+ [1] = https://daniel.haxx.se/blog/2017/06/15/target-independent-libcurl-headers/
+ [2] = https://curl.haxx.se/bug/?i=1565
+ [3] = https://curl.haxx.se/bug/?i=1531
+ [4] = https://curl.haxx.se/bug/?i=1556
+ [5] = https://curl.haxx.se/bug/?i=1547
+ [6] = https://curl.haxx.se/bug/?i=1511
+ [7] = https://curl.haxx.se/bug/?i=1486
+ [8] = https://curl.haxx.se/bug/?i=1538
+ [9] = https://curl.haxx.se/bug/?i=1505
+ [10] = https://curl.haxx.se/bug/?i=1476
+ [11] = https://curl.haxx.se/bug/?i=1577
+ [12] = https://curl.haxx.se/bug/?i=1569
+ [13] = https://curl.haxx.se/bug/?i=1576
+ [14] = https://curl.haxx.se/bug/?i=1546
+ [15] = https://curl.haxx.se/bug/?i=1578
+ [16] = https://curl.haxx.se/bug/?i=1512
+ [17] = https://curl.haxx.se/bug/?i=1514
+ [18] = https://curl.haxx.se/bug/?i=1584
+ [19] = https://github.com/curl/curl/commit/73a2fcea0b4adea6ba342cd7ed1149782c214ae3#commitcomment-22655993
+ [20] = https://curl.haxx.se/bug/?i=1592
+ [21] = https://curl.haxx.se/bug/?i=1595
+ [22] = https://curl.haxx.se/bug/?i=1593
+ [23] = https://curl.haxx.se/bug/?i=1604
+ [24] = https://curl.haxx.se/bug/?i=1606
+ [25] = https://curl.haxx.se/bug/?i=1610
+ [26] = https://curl.haxx.se/bug/?i=1598
+ [27] = https://curl.haxx.se/bug/?i=1611
+ [28] = https://github.com/curl/curl/pull/1486#issuecomment-310926872
+ [29] = https://curl.haxx.se/bug/?i=1614
+ [30] = https://curl.haxx.se/bug/?i=1454
+ [31] = https://curl.haxx.se/bug/?i=1623
+ [32] = https://curl.haxx.se/bug/?i=1616
+ [33] = https://curl.haxx.se/bug/?i=1620
+ [34] = https://curl.haxx.se/bug/?i=1521
+ [35] = https://curl.haxx.se/bug/?i=1615
+ [36] = https://curl.haxx.se/bug/?i=1591
+ [37] = https://curl.haxx.se/bug/?i=1621
+ [38] = https://curl.haxx.se/bug/?i=1617
+ [39] = https://curl.haxx.se/bug/?i=1631
+ [40] = https://curl.haxx.se/mail/lib-2017-07/0003.html
+ [41] = https://curl.haxx.se/bug/?i=1637
+ [42] = https://curl.haxx.se/bug/?i=1630
+ [43] = https://curl.haxx.se/bug/?i=1638
+ [44] = https://curl.haxx.se/bug/?i=1619
+ [45] = https://curl.haxx.se/mail/lib-2017-07/0005.html
+ [46] = https://curl.haxx.se/bug/?i=1642
+ [47] = https://curl.haxx.se/mail/lib-2017-07/0005.html
+ [48] = https://curl.haxx.se/bug/?i=1640
+ [49] = https://curl.haxx.se/bug/?i=1639
+ [50] = https://curl.haxx.se/bug/?i=1552
+ [51] = https://github.com/curl/curl/issues/828#issuecomment-313475151
+ [52] = https://curl.haxx.se/bug/?i=1612
+ [53] = https://curl.haxx.se/bug/?i=1645
+ [54] = https://curl.haxx.se/bug/?i=1649
+ [55] = https://curl.haxx.se/bug/?i=1653
+ [56] = https://curl.haxx.se/bug/?i=1589
+ [57] = https://curl.haxx.se/bug/?i=1665
+ [58] = https://curl.haxx.se/bug/?i=1664
+ [59] = https://curl.haxx.se/bug/?i=1591
+ [60] = https://curl.haxx.se/bug/?i=1672
+ [61] = https://curl.haxx.se/bug/?i=1667
+ [62] = https://github.com/curl/curl/commit/eb16305#commitcomment-23035670
+ [63] = https://curl.haxx.se/bug/?i=1682
+ [64] = https://bugzilla.redhat.com/1436158
+ [65] = https://curl.haxx.se/bug/?i=1683
+ [66] = https://curl.haxx.se/bug/?i=1703
+ [67] = https://curl.haxx.se/bug/?i=1693
+ [68] = https://curl.haxx.se/bug/?i=1652
+ [69] = https://curl.haxx.se/bug/?i=1704
+ [70] = https://curl.haxx.se/bug/?i=1674
+ [71] = https://github.com/curl/curl/commit/de6de94#commitcomment-23370851
+ [72] = https://curl.haxx.se/bug/?i=1688
+ [73] = https://curl.haxx.se/bug/?i=1714
+ [74] = https://curl.haxx.se/bug/?i=1669
+ [75] = https://curl.haxx.se/mail/lib-2017-07/0033.html
+ [76] = https://curl.haxx.se/bug/?i=1717
+ [77] = https://curl.haxx.se/bug/?i=1711
+ [78] = https://curl.haxx.se/mail/lib-2017-08/0008.html
+ [79] = https://curl.haxx.se/bug/?i=1722
+ [80] = https://curl.haxx.se/bug/?i=1718
+ [81] = https://curl.haxx.se/bug/?i=1733
+ [82] = https://curl.haxx.se/bug/?i=1728
+ [83] = https://curl.haxx.se/docs/adv_20170809C.html
+ [84] = https://curl.haxx.se/docs/adv_20170809B.html
+ [85] = https://curl.haxx.se/docs/adv_20170809A.html
+ [86] = https://curl.haxx.se/bug/?i=1730
+ [87] = https://curl.haxx.se/bug/?i=1738
diff --git a/acinclude.m4 b/acinclude.m4
index 2abae8d8..53932287 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -199,8 +199,6 @@ AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
yes)
AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
[Define to 1 if you have the windows.h header file.])
- AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
- [Define to avoid automatic inclusion of winsock.h])
;;
esac
])
@@ -790,8 +788,8 @@ AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
#
for x_nlibs in '' "$u_libs" \
'-lldap' \
- '-llber -lldap' \
'-lldap -llber' \
+ '-llber -lldap' \
'-lldapssl -lldapx -lldapsdk' \
'-lldapsdk -lldapx -lldapssl' ; do
if test "$curl_cv_ldap_LIBS" = "unknown"; then
@@ -1084,7 +1082,11 @@ AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
#endif
#define GNICALLCONV
#endif
- extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
+ extern int GNICALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
+ getnameinfo($gni_arg1, $gni_arg2,
char *, $gni_arg46,
char *, $gni_arg46,
$gni_arg7);
@@ -1388,6 +1390,9 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
#define RECVCALLCONV
#endif
extern $recv_retv RECVCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
]],[[
$recv_arg1 s=0;
@@ -1522,6 +1527,9 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
#define SENDCALLCONV
#endif
extern $send_retv SENDCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
]],[[
$send_arg1 s=0;
@@ -2079,10 +2087,7 @@ _EOF
dnl CURL_CONFIGURE_LONG
dnl -------------------------------------------------
dnl Find out the size of long as reported by sizeof() and define
-dnl CURL_SIZEOF_LONG as appropriate to be used in template file
-dnl include/curl/curlbuild.h.in to properly configure the library.
-dnl The size of long is a build time characteristic and as such
-dnl must be recorded in curlbuild.h
+dnl CURL_SIZEOF_LONG.
AC_DEFUN([CURL_CONFIGURE_LONG], [
if test -z "$ac_cv_sizeof_long" ||
@@ -2095,10 +2100,6 @@ AC_DEFUN([CURL_CONFIGURE_LONG], [
dnl CURL_CONFIGURE_CURL_SOCKLEN_T
dnl -------------------------------------------------
-dnl Find out suitable curl_socklen_t data type definition and size, making
-dnl appropriate definitions for template file include/curl/curlbuild.h.in
-dnl to properly configure and use the library.
-dnl
dnl The need for the curl_socklen_t definition arises mainly to properly
dnl interface HP-UX systems which on one hand have a typedef'ed socklen_t
dnl data type which is 32 or 64-Bit wide depending on the data model being
@@ -2222,10 +2223,6 @@ AC_DEFUN([CURL_CONFIGURE_CURL_SOCKLEN_T], [
dnl CURL_CONFIGURE_PULL_SYS_POLL
dnl -------------------------------------------------
-dnl Find out if system header file sys/poll.h must be included by the
-dnl external interface, making appropriate definitions for template file
-dnl include/curl/curlbuild.h.in to properly configure and use the library.
-dnl
dnl The need for the sys/poll.h inclusion arises mainly to properly
dnl interface AIX systems which define macros 'events' and 'revents'.
@@ -2378,11 +2375,15 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
long tv_usec;
};
#endif
- extern $sel_retv SELECTCALLCONV select($sel_arg1,
- $sel_arg234,
- $sel_arg234,
- $sel_arg234,
- $sel_arg5);
+ extern $sel_retv SELECTCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
+ select($sel_arg1,
+ $sel_arg234,
+ $sel_arg234,
+ $sel_arg234,
+ $sel_arg5);
]],[[
$sel_arg1 nfds=0;
$sel_arg234 rfds=0;
@@ -2859,8 +2860,7 @@ AC_DEFUN([DO_CURL_OFF_T_SUFFIX_CHECK], [
dnl CURL_CONFIGURE_CURL_OFF_T
dnl -------------------------------------------------
dnl Find out suitable curl_off_t data type definition and associated
-dnl items, and make the appropriate definitions used in template file
-dnl include/curl/curlbuild.h.in to properly configure the library.
+dnl items
AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
diff --git a/aclocal.m4 b/aclocal.m4
index 32d8994d..c17bd614 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.15'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.15.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -408,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -605,7 +605,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -626,7 +626,7 @@ if test x"${install_sh+set}" != xset; then
fi
AC_SUBST([install_sh])])
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -648,7 +648,7 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -683,7 +683,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -733,7 +733,7 @@ rm -f confinc confmf
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -772,7 +772,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -801,7 +801,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -848,7 +848,7 @@ AC_LANG_POP([C])])
# For backward compatibility.
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -867,7 +867,7 @@ AC_DEFUN([AM_RUN_LOG],
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -948,7 +948,7 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file
])
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1008,7 +1008,7 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1036,7 +1036,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1055,7 +1055,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1186,6 +1186,7 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+m4_include([m4/ax_code_coverage.m4])
m4_include([m4/curl-compilers.m4])
m4_include([m4/curl-confopts.m4])
m4_include([m4/curl-functions.m4])
diff --git a/buildconf b/buildconf
index 0d998c2b..50957531 100755
--- a/buildconf
+++ b/buildconf
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -255,7 +255,7 @@ echo "buildconf: libtoolize version $lt_version (ok)"
#--------------------------------------------------------------------------
# m4 check
#
-m4=`(${M4:-m4} --version || ${M4:-gm4} --version) 2>/dev/null | head -n 1`;
+m4=`(${M4:-m4} --version 0<&- || ${M4:-gm4} --version) 2>/dev/null 0<&- | head -n 1`;
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
@@ -306,7 +306,6 @@ for fname in .deps \
configure \
configurehelp.pm \
curl-config \
- curlbuild.h \
depcomp \
libcares.pc \
libcurl.pc \
diff --git a/buildconf.bat b/buildconf.bat
index ad3fba6b..da5c0391 100644
--- a/buildconf.bat
+++ b/buildconf.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+rem * Copyright (C) 1998 - 2017, 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
@@ -73,7 +73,6 @@ rem
echo Generating prerequisite files
call :generate
- if errorlevel 4 goto nogencurlbuild
if errorlevel 3 goto nogenhugehelp
if errorlevel 2 goto nogenmakefile
if errorlevel 1 goto warning
@@ -83,7 +82,6 @@ rem
echo Removing prerequisite files
call :clean
- if errorlevel 3 goto nocleancurlbuild
if errorlevel 2 goto nocleanhugehelp
if errorlevel 1 goto nocleanmakefile
)
@@ -98,7 +96,6 @@ rem 0 - success
rem 1 - success with simplified tool_hugehelp.c
rem 2 - failed to generate Makefile
rem 3 - failed to generate tool_hugehelp.c
-rem 4 - failed to generate curlbuild.h
rem
:generate
if "%OS%" == "Windows_NT" setlocal
@@ -126,16 +123,6 @@ rem
)
cmd /c exit 0
- rem Create curlbuild.h
- echo * %CD%\include\curl\curlbuild.h
- if exist include\curl\curlbuild.h.dist (
- copy /Y include\curl\curlbuild.h.dist include\curl\curlbuild.h 1>NUL 2>&1
- if errorlevel 1 (
- if "%OS%" == "Windows_NT" endlocal
- exit /B 4
- )
- )
-
rem Setup c-ares git tree
if exist ares\buildconf.bat (
echo.
@@ -160,7 +147,6 @@ rem
rem 0 - success
rem 1 - failed to clean Makefile
rem 2 - failed to clean tool_hugehelp.c
-rem 3 - failed to clean curlbuild.h
rem
:clean
rem Remove Makefile
@@ -181,15 +167,6 @@ rem
)
)
- rem Remove curlbuild.h
- echo * %CD%\include\curl\curlbuild.h
- if exist include\curl\curlbuild.h (
- del include\curl\curlbuild.h 2>NUL
- if exist include\curl\curlbuild.h (
- exit /B 3
- )
- )
-
exit /B
rem Function to generate src\tool_hugehelp.c
@@ -304,11 +281,6 @@ rem
echo Error: Unable to generate src\tool_hugehelp.c
goto error
-:nogencurlbuild
- echo.
- echo Error: Unable to generate include\curl\curlbuild.h
- goto error
-
:nocleanmakefile
echo.
echo Error: Unable to clean Makefile
@@ -319,11 +291,6 @@ rem
echo Error: Unable to clean src\tool_hugehelp.c
goto error
-:nocleancurlbuild
- echo.
- echo Error: Unable to clean include\curl\curlbuild.h
- goto error
-
:warning
echo.
echo Warning: The curl manual could not be integrated in the source. This means when
diff --git a/configure b/configure
index 3b495c4c..0e51a636 100755
--- 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 - 2016 Daniel Stenberg, <daniel@haxx.se>
+# Copyright (c) 1998 - 2017 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
@@ -1050,9 +1050,21 @@ libext
AR
EGREP
GREP
-SED
CURL_CFLAG_EXTRAS
CONFIGURE_OPTIONS
+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
+SED
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
@@ -1113,6 +1125,8 @@ enable_symbol_hiding
enable_hidden_symbols
enable_ares
enable_rt
+with_gcov
+enable_code_coverage
enable_dependency_tracking
enable_largefile
enable_shared
@@ -1168,10 +1182,11 @@ with_libssh2
with_librtmp
enable_versioned_symbols
with_winidn
-with_libidn
+with_libidn2
with_nghttp2
with_zsh_functions_dir
enable_threaded_resolver
+enable_pthreads
enable_verbose
enable_sspi
enable_crypto_auth
@@ -1843,6 +1858,7 @@ 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-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
@@ -1899,6 +1915,8 @@ Optional Features:
Enable threaded resolver
--disable-threaded-resolver
Disable threaded resolver
+ --enable-pthreads Enable POSIX threads (default for threaded resolver)
+ --disable-pthreads Disable POSIX threads
--enable-verbose Enable verbose strings
--disable-verbose Disable verbose strings
--enable-sspi Enable SSPI
@@ -1922,6 +1940,7 @@ Optional Features:
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
@@ -2090,7 +2109,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 - 2016 Daniel Stenberg, <daniel@haxx.se>
+Copyright (c) 1998 - 2017 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
@@ -3083,7 +3102,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_config_headers="$ac_config_headers lib/curl_config.h include/curl/curlbuild.h"
+ac_config_headers="$ac_config_headers lib/curl_config.h"
@@ -3368,9 +3387,6 @@ $as_echo "(assumed no)" >&6; }
$as_echo "no" >&6; }
;;
esac
- if test "$dontwant_rt" = "yes" && test "$want_thres" = "yes" ; then
- as_fn_error $? "options --disable-rt and --enable-thread-resolver are mutually exclusive, at most one can be selected." "$LINENO" 5
- fi
#
@@ -3403,6 +3419,445 @@ $as_echo "$xc_PATH_SEPARATOR" >&6; }
as_fn_error $? "path separator mismatch (internal or config.site problem)" "$LINENO" 5
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ 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_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+
+
+
+ # allow to override gcov location
+
+# 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.
+if test "${enable_code_coverage+set}" = set; then :
+ enableval=$enable_code_coverage;
+else
+ enable_code_coverage=no
+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=
+fi
+
+ 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 :
+
+ # 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
+{ $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 :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$GCOV"; then
+ ac_cv_prog_GCOV="$GCOV" # 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_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+ $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
+GCOV=$ac_cv_prog_GCOV
+if test -n "$GCOV"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5
+$as_echo "$GCOV" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+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
+{ $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 :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_GCOV"; then
+ ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # 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_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+ $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
+ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV
+if test -n "$ac_ct_GCOV"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5
+$as_echo "$ac_ct_GCOV" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_GCOV" = x; then
+ GCOV=":"
+ 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
+ GCOV=$ac_ct_GCOV
+ fi
+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.
+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; }
+if ${ac_cv_prog_LCOV+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LCOV"; then
+ ac_cv_prog_LCOV="$LCOV" # 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_LCOV="lcov"
+ $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
+LCOV=$ac_cv_prog_LCOV
+if test -n "$LCOV"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5
+$as_echo "$LCOV" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$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
+'
+
+
+
+
#
# save the configure arguments
@@ -3680,11 +4135,7 @@ fi
-if test -f ${srcdir}/include/curl/curlbuild.h; then
- rm -f ${srcdir}/include/curl/curlbuild.h
-fi
-
-CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h`
+CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)".*/\1/p' ${srcdir}/include/curl/curlver.h`
xc_prog_cc_prev_IFS=$IFS
xc_prog_cc_prev_LIBS=$LIBS
@@ -5623,7 +6074,7 @@ $as_echo "$CURLVERSION" >&6; }
-VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curlver.h`
+VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\([0-9A-Fa-f]*\).*/\1/p' ${srcdir}/include/curl/curlver.h`
PKGADD_PKG="HAXXcurl"
@@ -11213,7 +11664,7 @@ esac
# of non-PIC compiled objects will fail with following linker error
# "relocation R_X86_64_32 can not be used when making a shared object"
# is to build PIC objects even for static libraries. This behavior may
-# be overriden using 'configure --disable-shared --without-pic'.
+# be overridden using 'configure --disable-shared --without-pic'.
#
if test "x$xc_lt_want_with_pic" = 'xdefault'; then
@@ -15921,7 +16372,7 @@ esac
$as_echo "$xc_lt_shlib_use_mimpure_text" >&6; }
#
-# Find out wether libtool libraries would be built wit PIC
+# Find out whether libtool libraries would be built wit PIC
#
case "x$pic_mode" in # ((((
@@ -16542,7 +16993,15 @@ rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
compiler_id="CLANG"
- clangver=`$CC -dumpversion`
+ 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`
@@ -16630,7 +17089,7 @@ $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"
+ flags_opt_all="-O -O0 -O1 -O2 -O3 -Os -Og -Ofast"
flags_opt_yes="-O2"
flags_opt_off="-O0"
@@ -17341,7 +17800,9 @@ squeeze() {
#
GNU_C)
#
- tmp_CFLAGS="$tmp_CFLAGS"
+ if test "$compiler_num" -ge "295"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Werror-implicit-function-declaration"
+ fi
;;
#
HP_UX_C)
@@ -18017,6 +18478,32 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
if test "$compiler_num" -ge "101"; then
tmp_CFLAGS="$tmp_CFLAGS -Wunused"
fi
+ #
+ if test "$compiler_num" -ge "208"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wvla"
+ fi
+ #
+ if test "$compiler_num" -ge "209"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wshift-sign-overflow"
+ fi
+ #
+ if test "$compiler_num" -ge "302"; then
+ case $host_os in
+ cygwin* | mingw*)
+ ;;
+ *)
+ tmp_CFLAGS="$tmp_CFLAGS -Wmissing-variable-declarations"
+ ;;
+ esac
+ fi
+ #
+ if test "$compiler_num" -ge "306"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ fi
+ #
+ if test "$compiler_num" -ge "309"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+ fi
fi
;;
#
@@ -18102,6 +18589,10 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
fi
#
+ if test "$compiler_num" -ge "406"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ fi
+ #
fi
#
if test "$compiler_num" -ge "300"; then
@@ -18754,11 +19245,6 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_WINDOWS_H 1
_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define WIN32_LEAN_AND_MEAN 1
-_ACEOF
-
;;
esac
@@ -19272,6 +19758,7 @@ $as_echo "no" >&6; }
$as_echo "#define CURL_DISABLE_HTTP 1" >>confdefs.h
+ disable_http="yes"
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disable HTTP disables FTP over proxy and RTSP" >&5
$as_echo "$as_me: WARNING: disable HTTP disables FTP over proxy and RTSP" >&2;}
CURL_DISABLE_HTTP=1
@@ -20262,11 +20749,6 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_WINDOWS_H 1
_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define WIN32_LEAN_AND_MEAN 1
-_ACEOF
-
;;
esac
@@ -20725,6 +21207,7 @@ else
OPT_ZLIB=""
fi
+ if test -z "$OPT_ZLIB" ; then
if test -n "$PKG_CONFIG"; then
PKGCONFIG="$PKG_CONFIG"
@@ -20852,15 +21335,13 @@ $as_echo "found" >&6; }
fi
- if test "$PKGCONFIG" != "no" ; then
- LIBS="`$PKGCONFIG --libs-only-l zlib` $LIBS"
- LDFLAGS="`$PKGCONFIG --libs-only-L zlib` $LDFLAGS"
- CPPFLAGS="`$PKGCONFIG --cflags-only-I zlib` $CPPFLAGS"
- OPT_ZLIB=""
- HAVE_LIBZ="1"
- fi
-
- if test -z "$OPT_ZLIB" ; then
+ if test "$PKGCONFIG" != "no" ; then
+ LIBS="`$PKGCONFIG --libs-only-l zlib` $LIBS"
+ LDFLAGS="$LDFLAGS `$PKGCONFIG --libs-only-L zlib`"
+ CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags-only-I zlib`"
+ OPT_ZLIB=""
+ HAVE_LIBZ="1"
+ fi
if test -z "$HAVE_LIBZ"; then
@@ -21438,8 +21919,8 @@ $as_echo_n "checking for LDAP libraries... " >&6; }
#
for x_nlibs in '' "$u_libs" \
'-lldap' \
- '-llber -lldap' \
'-lldap -llber' \
+ '-llber -lldap' \
'-lldapssl -lldapx -lldapsdk' \
'-lldapsdk -lldapx -lldapssl' ; do
if test "$curl_cv_ldap_LIBS" = "unknown"; then
@@ -22425,30 +22906,19 @@ if test "x$ac_cv_lib_crypto_HMAC_Init_ex" = xyes; then :
LIBS="-lcrypto $LIBS"
else
- LDFLAGS="$CLEANLDFLAGS"
- CPPFLAGS="$CLEANCPPFLAGS"
- LIBS="$CLEANLIBS"
-
-fi
-
-fi
-
-
-
- if test X"$HAVECRYPTO" = X"yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking OpenSSL linking without -ldl" >&5
-$as_echo_n "checking OpenSSL linking without -ldl... " >&6; }
- saved_libs=$LIBS
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking OpenSSL linking with -ldl" >&5
+$as_echo_n "checking OpenSSL linking with -ldl... " >&6; }
+ LIBS="-ldl $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- #include <openssl/evp.h>
+ #include <openssl/err.h>
int main (void)
{
- SSLeay_add_all_algorithms();
+ ERR_clear_error();
;
return 0;
@@ -22456,26 +22926,27 @@ int main (void)
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- LIBS="$saved_libs"
+ HAVECRYPTO="yes"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking OpenSSL linking with -ldl" >&5
-$as_echo_n "checking OpenSSL linking with -ldl... " >&6; }
- LIBS="-ldl $LIBS"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking OpenSSL linking with -ldl and -lpthread" >&5
+$as_echo_n "checking OpenSSL linking with -ldl and -lpthread... " >&6; }
+ LIBS="-lpthread $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- #include <openssl/evp.h>
+ #include <openssl/err.h>
int main (void)
{
- SSLeay_add_all_algorithms();
+ ERR_clear_error();
;
return 0;
@@ -22483,15 +22954,17 @@ int main (void)
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- LIBS="$saved_libs -ldl"
+ HAVECRYPTO="yes"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
- LIBS="$saved_libs"
+ LDFLAGS="$CLEANLDFLAGS"
+ CPPFLAGS="$CLEANCPPFLAGS"
+ LIBS="$CLEANLIBS"
fi
@@ -22499,12 +22972,16 @@ rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
-
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- fi
+
+fi
+
+
+fi
+
if test X"$HAVECRYPTO" = X"yes"; then
@@ -23804,12 +24281,13 @@ $as_echo "$as_me: detected GnuTLS version $version" >&6;}
$as_echo "$as_me: Added $gtlslib to LD_LIBRARY_PATH" >&6;}
fi
fi
- for ac_func in gnutls_certificate_set_x509_key_file2
+ for ac_func in gnutls_certificate_set_x509_key_file2 gnutls_alpn_set_protocols gnutls_ocsp_req_init
do :
- ac_fn_c_check_func "$LINENO" "gnutls_certificate_set_x509_key_file2" "ac_cv_func_gnutls_certificate_set_x509_key_file2"
-if test "x$ac_cv_func_gnutls_certificate_set_x509_key_file2" = xyes; then :
+ 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 HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
@@ -25766,8 +26244,8 @@ $as_echo "found" >&6; }
clean_CPPFLAGS="$CPPFLAGS"
clean_LDFLAGS="$LDFLAGS"
clean_LIBS="$LIBS"
- CPPFLAGS="$addcflags $clean_CPPFLAGS"
- LDFLAGS="$addld $clean_LDFLAGS"
+ CPPFLAGS="$clean_CPPFLAGS $addcflags"
+ LDFLAGS="$clean_LDFLAGS $addld"
LIBS="$addlib $clean_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libmetalink is recent enough" >&5
$as_echo_n "checking if libmetalink is recent enough... " >&6; }
@@ -25990,7 +26468,7 @@ $as_echo "found" >&6; }
DIR_SSH2=${PREFIX_SSH2}/lib$libsuff
fi
- LDFLAGS="$LD_SSH2 $LDFLAGS"
+ LDFLAGS="$LDFLAGS $LD_SSH2"
CPPFLAGS="$CPPFLAGS $CPP_SSH2"
LIBS="$LIB_SSH2 $LIBS"
@@ -26237,7 +26715,8 @@ $as_echo "found" >&6; }
LIB_RTMP="-lrtmp"
;;
*)
- PREFIX_RTMP=$OPT_LIBRTMP
+ LIB_RTMP="-lrtmp"
+ PREFIX_RTMP=$OPT_LIBRTMP
;;
esac
@@ -26424,6 +26903,7 @@ if test "$want_winidn" = "yes"; then
clean_LDFLAGS="$LDFLAGS"
clean_LIBS="$LIBS"
WINIDN_LIBS="-lnormaliz"
+ WINIDN_CPPFLAGS="-DWINVER=0x0600"
#
if test "$want_winidn_path" != "default"; then
WINIDN_LDFLAGS="-L$want_winidn_path/lib$libsuff"
@@ -26431,8 +26911,8 @@ if test "$want_winidn" = "yes"; then
WINIDN_DIR="$want_winidn_path/lib$libsuff"
fi
#
- CPPFLAGS="$WINIDN_CPPFLAGS $CPPFLAGS"
- LDFLAGS="$WINIDN_LDFLAGS $LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $WINIDN_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $WINIDN_LDFLAGS"
LIBS="$WINIDN_LIBS $LIBS"
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if IdnToUnicode can be linked" >&5
@@ -26441,24 +26921,13 @@ $as_echo_n "checking if IdnToUnicode can be linked... " >&6; }
/* end confdefs.h. */
-#define IdnToUnicode innocuous_IdnToUnicode
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-#undef IdnToUnicode
-#ifdef __cplusplus
-extern "C"
-#endif
-char IdnToUnicode ();
-#if defined __stub_IdnToUnicode || defined __stub___IdnToUnicode
-choke me
-#endif
+ #include <windows.h>
int main (void)
{
-return IdnToUnicode ();
+
+ IdnToUnicode(0, NULL, 0, NULL, 0);
+
;
return 0;
}
@@ -26504,9 +26973,9 @@ fi
$as_echo_n "checking whether to build with libidn2... " >&6; }
OPT_IDN="default"
-# Check whether --with-libidn was given.
-if test "${with_libidn+set}" = set; then :
- withval=$with_libidn; OPT_IDN=$withval
+# Check whether --with-libidn2 was given.
+if test "${with_libidn2+set}" = set; then :
+ withval=$with_libidn2; OPT_IDN=$withval
fi
case "$OPT_IDN" in
@@ -26852,8 +27321,8 @@ $as_echo "$as_me: IDN_CPPFLAGS: \"$IDN_CPPFLAGS\"" >&6;}
$as_echo "$as_me: IDN_DIR: \"$IDN_DIR\"" >&6;}
fi
#
- CPPFLAGS="$IDN_CPPFLAGS $CPPFLAGS"
- LDFLAGS="$IDN_LDFLAGS $LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $IDN_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $IDN_LDFLAGS"
LIBS="$IDN_LIBS $LIBS"
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if idn2_lookup_ul can be linked" >&5
@@ -26944,6 +27413,12 @@ fi
OPT_H2="yes"
+if test "x$disable_http" = "xyes"; then
+ # without HTTP, nghttp2 is no use
+ OPT_H2="no"
+fi
+
+
# Check whether --with-nghttp2 was given.
if test "${with_nghttp2+set}" = set; then :
withval=$with_nghttp2; OPT_H2=$withval
@@ -28316,11 +28791,6 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_WINDOWS_H 1
_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define WIN32_LEAN_AND_MEAN 1
-_ACEOF
-
;;
esac
@@ -29127,11 +29597,15 @@ else
long tv_usec;
};
#endif
- extern $sel_retv SELECTCALLCONV select($sel_arg1,
- $sel_arg234,
- $sel_arg234,
- $sel_arg234,
- $sel_arg5);
+ extern $sel_retv SELECTCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
+ select($sel_arg1,
+ $sel_arg234,
+ $sel_arg234,
+ $sel_arg234,
+ $sel_arg5);
int main (void)
{
@@ -29352,6 +29826,9 @@ else
#define RECVCALLCONV
#endif
extern $recv_retv RECVCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
int main (void)
@@ -29540,6 +30017,9 @@ else
#define SENDCALLCONV
#endif
extern $send_retv SENDCALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
int main (void)
@@ -39341,24 +39821,20 @@ $as_echo "$as_me: skip check for pipe on msdosdjgpp" >&6;}
;;
esac
-for ac_func in fork \
- geteuid \
+for ac_func in geteuid \
getpass_r \
getppid \
- getprotobyname \
getpwuid \
getpwuid_r \
getrlimit \
gettimeofday \
if_nametoindex \
- inet_addr \
- perror \
pipe \
setlocale \
setmode \
setrlimit \
- uname \
- utime
+ utime \
+ utimes
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
@@ -39615,7 +40091,11 @@ else
#endif
#define GNICALLCONV
#endif
- extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
+ extern int GNICALLCONV
+#ifdef __ANDROID__
+__attribute__((overloadable))
+#endif
+ getnameinfo($gni_arg1, $gni_arg2,
char *, $gni_arg46,
char *, $gni_arg46,
$gni_arg7);
@@ -40083,8 +40563,8 @@ fi
fi
fi
#
- CPPFLAGS="$ares_CPPFLAGS $clean_CPPFLAGS"
- LDFLAGS="$ares_LDFLAGS $clean_LDFLAGS"
+ CPPFLAGS="$clean_CPPFLAGS $ares_CPPFLAGS"
+ LDFLAGS="$clean_LDFLAGS $ares_LDFLAGS"
LIBS="$ares_LIBS $clean_LIBS"
#
if test "$embedded_ares" != "yes"; then
@@ -40194,7 +40674,48 @@ if test "x$want_thres" = xyes && test "x$want_ares" = xyes; then
as_fn_error $? "Options --enable-threaded-resolver and --enable-ares are mutually exclusive" "$LINENO" 5
fi
-if test "$want_thres" = "yes" && test "$dontwant_rt" = "no"; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use POSIX threads for threaded resolver" >&5
+$as_echo_n "checking whether to use POSIX threads for threaded resolver... " >&6; }
+# Check whether --enable-pthreads was given.
+if test "${enable_pthreads+set}" = set; then :
+ enableval=$enable_pthreads; case "$enableval" in
+ no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ want_pthreads=no
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ want_pthreads=yes
+ ;;
+ esac
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: auto" >&5
+$as_echo "auto" >&6; }
+ want_pthreads=auto
+
+
+fi
+
+
+if test "$want_pthreads" != "no"; then
+ if test "$want_pthreads" = "yes" && test "$dontwant_rt" = "yes"; then
+ as_fn_error $? "options --enable-pthreads and --disable-rt are mutually exclusive" "$LINENO" 5
+ fi
+ if test "$dontwant_rt" != "no"; then
+ if test "$want_pthreads" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-pthreads Ignored since librt is disabled." >&5
+$as_echo "$as_me: WARNING: --enable-pthreads Ignored since librt is disabled." >&2;}
+ fi
+ want_pthreads=no
+ fi
+fi
+
+if test "$want_pthreads" != "no" && test "$want_thres" != "yes"; then
+ want_pthreads=no
+fi
+
+if test "$want_pthreads" != "no"; then
ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
if test "x$ac_cv_header_pthread_h" = xyes; then :
@@ -40260,11 +40781,24 @@ $as_echo "#define USE_THREADS_POSIX 1" >>confdefs.h
curl_res_msg="POSIX threaded"
fi
+fi
fi
+if test "$want_thres" = "yes" && test "x$USE_THREADS_POSIX" != "x1"; then
+ if test "$want_pthreads" = "yes"; then
+ as_fn_error $? "--enable-pthreads but pthreads was not found" "$LINENO" 5
+ fi
+ if test "$curl_cv_native_windows" = "yes"; then
+ USE_THREADS_WIN32=1
+$as_echo "#define USE_THREADS_WIN32 1" >>confdefs.h
+
+ curl_res_msg="Win32 threaded"
+ else
+ as_fn_error $? "Threaded resolver enabled but no thread library found" "$LINENO" 5
+ fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable verbose strings" >&5
@@ -40614,7 +41148,8 @@ fi
if test "x$HAVE_LIBZ" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES libz"
fi
-if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1"; then
+if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
+ -o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
fi
if test "x$IDN_ENABLED" = "x1"; then
@@ -40936,7 +41471,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/EPM/curl.list packages/EPM/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 tests/fuzz/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/EPM/curl.list packages/EPM/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -41051,6 +41586,10 @@ 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
@@ -42013,7 +42552,6 @@ for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"lib/curl_config.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/curl_config.h" ;;
- "include/curl/curlbuild.h") CONFIG_HEADERS="$CONFIG_HEADERS include/curl/curlbuild.h" ;;
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
@@ -42035,6 +42573,7 @@ do
"tests/server/Makefile") CONFIG_FILES="$CONFIG_FILES tests/server/Makefile" ;;
"tests/libtest/Makefile") CONFIG_FILES="$CONFIG_FILES tests/libtest/Makefile" ;;
"tests/unit/Makefile") CONFIG_FILES="$CONFIG_FILES tests/unit/Makefile" ;;
+ "tests/fuzz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/fuzz/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" ;;
diff --git a/configure.ac b/configure.ac
index 91028458..edcb3931 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -31,12 +31,12 @@ XC_OVR_ZZ60
CURL_OVERRIDE_AUTOCONF
dnl configure script copyright
-AC_COPYRIGHT([Copyright (c) 1998 - 2016 Daniel Stenberg, <daniel@haxx.se>
+AC_COPYRIGHT([Copyright (c) 1998 - 2017 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])
AC_CONFIG_SRCDIR([lib/urldata.h])
-AC_CONFIG_HEADERS(lib/curl_config.h include/curl/curlbuild.h)
+AC_CONFIG_HEADERS(lib/curl_config.h)
AC_CONFIG_MACRO_DIR([m4])
AM_MAINTAINER_MODE
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -51,6 +51,7 @@ CURL_CHECK_OPTION_ARES
CURL_CHECK_OPTION_RT
XC_CHECK_PATH_SEPARATOR
+AX_CODE_COVERAGE
#
# save the configure arguments
@@ -120,13 +121,8 @@ AC_SUBST([AR])
AC_SUBST(libext)
-dnl Remove non-configure distributed curlbuild.h
-if test -f ${srcdir}/include/curl/curlbuild.h; then
- rm -f ${srcdir}/include/curl/curlbuild.h
-fi
-
dnl figure out the libcurl version
-CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h`
+CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)".*/\1/p' ${srcdir}/include/curl/curlver.h`
XC_CHECK_PROG_CC
XC_AUTOMAKE
AC_MSG_CHECKING([curl version])
@@ -136,7 +132,7 @@ AC_SUBST(CURLVERSION)
dnl
dnl we extract the numerical version for curl-config only
-VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curlver.h`
+VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\([0-9A-Fa-f]*\).*/\1/p' ${srcdir}/include/curl/curlver.h`
AC_SUBST(VERSIONNUM)
dnl Solaris pkgadd support definitions
@@ -370,6 +366,7 @@ AC_HELP_STRING([--disable-http],[Disable HTTP support]),
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP])
+ disable_http="yes"
AC_MSG_WARN([disable HTTP disables FTP over proxy and RTSP])
AC_SUBST(CURL_DISABLE_HTTP, [1])
AC_DEFINE(CURL_DISABLE_RTSP, 1, [to disable RTSP])
@@ -893,17 +890,16 @@ else
OPT_ZLIB=""
fi
- CURL_CHECK_PKGCONFIG(zlib)
-
- if test "$PKGCONFIG" != "no" ; then
- LIBS="`$PKGCONFIG --libs-only-l zlib` $LIBS"
- LDFLAGS="`$PKGCONFIG --libs-only-L zlib` $LDFLAGS"
- CPPFLAGS="`$PKGCONFIG --cflags-only-I zlib` $CPPFLAGS"
- OPT_ZLIB=""
- HAVE_LIBZ="1"
- fi
-
if test -z "$OPT_ZLIB" ; then
+ CURL_CHECK_PKGCONFIG(zlib)
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIBS="`$PKGCONFIG --libs-only-l zlib` $LIBS"
+ LDFLAGS="$LDFLAGS `$PKGCONFIG --libs-only-L zlib`"
+ CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags-only-I zlib`"
+ OPT_ZLIB=""
+ HAVE_LIBZ="1"
+ fi
if test -z "$HAVE_LIBZ"; then
@@ -1518,52 +1514,50 @@ if test "$curl_ssl_msg" = "$init_ssl_msg" && test X"$OPT_SSL" != Xno; then
AC_CHECK_LIB(crypto, HMAC_Init_ex,[
HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS"], [
- LDFLAGS="$CLEANLDFLAGS"
- CPPFLAGS="$CLEANCPPFLAGS"
- LIBS="$CLEANLIBS"
- ])
- ])
+ dnl still no, but what about with -ldl?
+ AC_MSG_CHECKING([OpenSSL linking with -ldl])
+ LIBS="-ldl $LIBS"
+ AC_TRY_LINK(
+ [
+ #include <openssl/err.h>
+ ],
+ [
+ ERR_clear_error();
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ HAVECRYPTO="yes"
+ ],
+ [
+ AC_MSG_RESULT(no)
+ dnl ok, so what about bouth -ldl and -lpthread?
+
+ AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread])
+ LIBS="-lpthread $LIBS"
+ AC_TRY_LINK(
+ [
+ #include <openssl/err.h>
+ ],
+ [
+ ERR_clear_error();
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ HAVECRYPTO="yes"
+ ],
+ [
+ AC_MSG_RESULT(no)
+ LDFLAGS="$CLEANLDFLAGS"
+ CPPFLAGS="$CLEANCPPFLAGS"
+ LIBS="$CLEANLIBS"
+
+ ])
- if test X"$HAVECRYPTO" = X"yes"; then
- AC_MSG_CHECKING([OpenSSL linking without -ldl])
- saved_libs=$LIBS
- AC_TRY_LINK(
- [
- #include <openssl/evp.h>
- ],
- [
- SSLeay_add_all_algorithms();
- ],
- [
- AC_MSG_RESULT(yes)
- LIBS="$saved_libs"
- ],
- [
- AC_MSG_RESULT(no)
- AC_MSG_CHECKING([OpenSSL linking with -ldl])
- LIBS="-ldl $LIBS"
- AC_TRY_LINK(
- [
- #include <openssl/evp.h>
- ],
- [
- SSLeay_add_all_algorithms();
- ],
- [
- AC_MSG_RESULT(yes)
- LIBS="$saved_libs -ldl"
- ],
- [
- AC_MSG_RESULT(no)
- LIBS="$saved_libs"
- ]
- )
-
- ]
- )
+ ])
- fi
+ ])
+ ])
if test X"$HAVECRYPTO" = X"yes"; then
dnl This is only reasonable to do if crypto actually is there: check for
@@ -1847,7 +1841,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg"; then
AC_MSG_NOTICE([Added $gtlslib to LD_LIBRARY_PATH])
fi
fi
- AC_CHECK_FUNCS(gnutls_certificate_set_x509_key_file2)
+ AC_CHECK_FUNCS([gnutls_certificate_set_x509_key_file2 gnutls_alpn_set_protocols gnutls_ocsp_req_init])
fi
fi
@@ -2496,8 +2490,8 @@ if test X"$OPT_LIBMETALINK" != Xno; then
clean_CPPFLAGS="$CPPFLAGS"
clean_LDFLAGS="$LDFLAGS"
clean_LIBS="$LIBS"
- CPPFLAGS="$addcflags $clean_CPPFLAGS"
- LDFLAGS="$addld $clean_LDFLAGS"
+ CPPFLAGS="$clean_CPPFLAGS $addcflags"
+ LDFLAGS="$clean_LDFLAGS $addld"
LIBS="$addlib $clean_LIBS"
AC_MSG_CHECKING([if libmetalink is recent enough])
AC_LINK_IFELSE([
@@ -2581,7 +2575,7 @@ if test X"$OPT_LIBSSH2" != Xno; then
DIR_SSH2=${PREFIX_SSH2}/lib$libsuff
fi
- LDFLAGS="$LD_SSH2 $LDFLAGS"
+ LDFLAGS="$LDFLAGS $LD_SSH2"
CPPFLAGS="$CPPFLAGS $CPP_SSH2"
LIBS="$LIB_SSH2 $LIBS"
@@ -2660,6 +2654,7 @@ if test X"$OPT_LIBRTMP" != Xno; then
;;
*)
dnl use the given --with-librtmp spot
+ LIB_RTMP="-lrtmp"
PREFIX_RTMP=$OPT_LIBRTMP
;;
esac
@@ -2787,6 +2782,7 @@ if test "$want_winidn" = "yes"; then
clean_LDFLAGS="$LDFLAGS"
clean_LIBS="$LIBS"
WINIDN_LIBS="-lnormaliz"
+ WINIDN_CPPFLAGS="-DWINVER=0x0600"
#
if test "$want_winidn_path" != "default"; then
dnl path has been specified
@@ -2796,13 +2792,17 @@ if test "$want_winidn" = "yes"; then
WINIDN_DIR="$want_winidn_path/lib$libsuff"
fi
#
- CPPFLAGS="$WINIDN_CPPFLAGS $CPPFLAGS"
- LDFLAGS="$WINIDN_LDFLAGS $LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $WINIDN_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $WINIDN_LDFLAGS"
LIBS="$WINIDN_LIBS $LIBS"
#
AC_MSG_CHECKING([if IdnToUnicode can be linked])
AC_LINK_IFELSE([
- AC_LANG_FUNC_LINK_TRY([IdnToUnicode])
+ AC_LANG_PROGRAM([[
+ #include <windows.h>
+ ]],[[
+ IdnToUnicode(0, NULL, 0, NULL, 0);
+ ]])
],[
AC_MSG_RESULT([yes])
tst_links_winidn="yes"
@@ -2830,7 +2830,7 @@ dnl **********************************************************************
AC_MSG_CHECKING([whether to build with libidn2])
OPT_IDN="default"
-AC_ARG_WITH(libidn,
+AC_ARG_WITH(libidn2,
AC_HELP_STRING([--with-libidn2=PATH],[Enable libidn2 usage])
AC_HELP_STRING([--without-libidn2],[Disable libidn2 usage]),
[OPT_IDN=$withval])
@@ -2912,8 +2912,8 @@ if test "$want_idn" = "yes"; then
AC_MSG_NOTICE([IDN_DIR: "$IDN_DIR"])
fi
#
- CPPFLAGS="$IDN_CPPFLAGS $CPPFLAGS"
- LDFLAGS="$IDN_LDFLAGS $LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $IDN_CPPFLAGS"
+ LDFLAGS="$LDFLAGS $IDN_LDFLAGS"
LIBS="$IDN_LIBS $LIBS"
#
AC_MSG_CHECKING([if idn2_lookup_ul can be linked])
@@ -2959,6 +2959,12 @@ dnl Check for nghttp2
dnl **********************************************************************
OPT_H2="yes"
+
+if test "x$disable_http" = "xyes"; then
+ # without HTTP, nghttp2 is no use
+ OPT_H2="no"
+fi
+
AC_ARG_WITH(nghttp2,
AC_HELP_STRING([--with-nghttp2=PATH],[Enable nghttp2 usage])
AC_HELP_STRING([--without-nghttp2],[Disable nghttp2 usage]),
@@ -3280,24 +3286,20 @@ case $host in
;;
esac
-AC_CHECK_FUNCS([fork \
- geteuid \
+AC_CHECK_FUNCS([geteuid \
getpass_r \
getppid \
- getprotobyname \
getpwuid \
getpwuid_r \
getrlimit \
gettimeofday \
if_nametoindex \
- inet_addr \
- perror \
pipe \
setlocale \
setmode \
setrlimit \
- uname \
- utime
+ utime \
+ utimes
],[
],[
func="$ac_func"
@@ -3407,7 +3409,48 @@ if test "x$want_thres" = xyes && test "x$want_ares" = xyes; then
[Options --enable-threaded-resolver and --enable-ares are mutually exclusive])
fi
-if test "$want_thres" = "yes" && test "$dontwant_rt" = "no"; then
+dnl ************************************************************
+dnl disable POSIX threads
+dnl
+AC_MSG_CHECKING([whether to use POSIX threads for threaded resolver])
+AC_ARG_ENABLE(pthreads,
+AC_HELP_STRING([--enable-pthreads],
+ [Enable POSIX threads (default for threaded resolver)])
+AC_HELP_STRING([--disable-pthreads],[Disable POSIX threads]),
+[ case "$enableval" in
+ no) AC_MSG_RESULT(no)
+ want_pthreads=no
+ ;;
+ *) AC_MSG_RESULT(yes)
+ want_pthreads=yes
+ ;;
+ esac ], [
+ AC_MSG_RESULT(auto)
+ want_pthreads=auto
+ ]
+)
+
+dnl turn off pthreads if rt is disabled
+if test "$want_pthreads" != "no"; then
+ if test "$want_pthreads" = "yes" && test "$dontwant_rt" = "yes"; then
+ AC_MSG_ERROR([options --enable-pthreads and --disable-rt are mutually exclusive])
+ fi
+ if test "$dontwant_rt" != "no"; then
+ dnl if --enable-pthreads was explicit then warn it's being ignored
+ if test "$want_pthreads" = "yes"; then
+ AC_MSG_WARN([--enable-pthreads Ignored since librt is disabled.])
+ fi
+ want_pthreads=no
+ fi
+fi
+
+dnl turn off pthreads if no threaded resolver
+if test "$want_pthreads" != "no" && test "$want_thres" != "yes"; then
+ want_pthreads=no
+fi
+
+dnl detect pthreads
+if test "$want_pthreads" != "no"; then
AC_CHECK_HEADER(pthread.h,
[ AC_DEFINE(HAVE_PTHREAD_H, 1, [if you have <pthread.h>])
save_CFLAGS="$CFLAGS"
@@ -3429,11 +3472,24 @@ if test "$want_thres" = "yes" && test "$dontwant_rt" = "no"; then
AC_DEFINE(USE_THREADS_POSIX, 1, [if you want POSIX threaded DNS lookup])
curl_res_msg="POSIX threaded"
fi
-
-
])
fi
+dnl threaded resolver check
+if test "$want_thres" = "yes" && test "x$USE_THREADS_POSIX" != "x1"; then
+ if test "$want_pthreads" = "yes"; then
+ AC_MSG_ERROR([--enable-pthreads but pthreads was not found])
+ fi
+ dnl If native Windows fallback on Win32 threads since no POSIX threads
+ if test "$curl_cv_native_windows" = "yes"; then
+ USE_THREADS_WIN32=1
+ AC_DEFINE(USE_THREADS_WIN32, 1, [if you want Win32 threaded DNS lookup])
+ curl_res_msg="Win32 threaded"
+ else
+ AC_MSG_ERROR([Threaded resolver enabled but no thread library found])
+ fi
+fi
+
dnl ************************************************************
dnl disable verbose text strings
dnl
@@ -3661,7 +3717,8 @@ fi
if test "x$HAVE_LIBZ" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES libz"
fi
-if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1"; then
+if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
+ -o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
fi
if test "x$IDN_ENABLED" = "x1"; then
@@ -3841,6 +3898,7 @@ AC_CONFIG_FILES([Makefile \
tests/server/Makefile \
tests/libtest/Makefile \
tests/unit/Makefile \
+ tests/fuzz/Makefile \
packages/Makefile \
packages/Win32/Makefile \
packages/Win32/cygwin/Makefile \
diff --git a/depcomp b/depcomp
index fc98710e..b39f98f9 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2013-05-30.07; # UTC
+scriptversion=2016-01-11.22; # UTC
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -786,6 +786,6 @@ exit 0
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
diff --git a/docs/BINDINGS.md b/docs/BINDINGS.md
index a59a94f3..0c653480 100644
--- a/docs/BINDINGS.md
+++ b/docs/BINDINGS.md
@@ -14,16 +14,20 @@ libcurl bindings
[Basic](http://scriptbasic.com/) ScriptBasic bindings written by Peter Verhas
-[C++](http://curlpp.org/) Written by Jean-Philippe Barrette-LaPierre
+C++: [curlpp](http://curlpp.org/) Written by Jean-Philippe Barrette-LaPierre,
+[curlcpp](https://github.com/JosephP91/curlcpp) by Giuseppe Persico and [C++
+Requests](https://github.com/whoshuu/cpr) by Huu Nguyen
-[Ch](http://chcurl.sourceforge.net/) Written by Stephen Nestinger and Jonathan Rogado
+[Ch](https://chcurl.sourceforge.io/) Written by Stephen Nestinger and Jonathan Rogado
Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho
-[curlhandle](http://curlhandle.sourceforge.net/) Written by Dan Wood
+[curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood
-[D](http://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert
+[D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert
-[Dylan](http://dylanlibs.sourceforge.net/) Written by Chris Double
+[Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev
+
+[Dylan](https://dylanlibs.sourceforge.io/) Written by Chris Double
[Eiffel](https://room.eiffel.com/library/curl) Written by Eiffel Software
@@ -33,25 +37,27 @@ Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de C
[Ferite](http://www.ferite.org/) Written by Paul Querna
-[Gambas](http://gambas.sourceforge.net/)
+[Gambas](https://gambas.sourceforge.io/)
[glib/GTK+](http://atterer.net/glibcurl/) Written by Richard Atterer
+Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang
+
[Guile](http://www.lonelycactus.com/guile-curl.html) Written by Michael L. Gran
[Harbour](https://github.com/vszakats/harbour-core/tree/master/contrib/hbcurl) Written by Viktor Szakáts
-[Haskell](http://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl) Written by Galois, Inc
+[Haskell](https://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl) Written by Galois, Inc
[Java](https://github.com/pjlegato/curl-java)
[Julia](https://github.com/forio/Curl.jl) Written by Paul Howe
-[Lisp](http://common-lisp.net/project/cl-curl/) Written by Liam Healy
+[Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy
-Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](http://luaforge.net/projects/lua-curl/) by Jürgen Hötzel
+Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel
-[Mono](http://forge.novell.com/modules/xfmod/project/?libcurl-mono) Written by Jeffrey Phillips
+[Mono](https://forge.novell.com/modules/xfmod/project/?libcurl-mono) Written by Jeffrey Phillips
[.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips
@@ -59,21 +65,25 @@ Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](ht
[Object-Pascal](http://www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern.
-[O'Caml](https://sourceforge.net/projects/ocurl/) Written by Lars Nilsson
+[OCaml](https://opam.ocaml.org/packages/ocurl/) Written by Lars Nilsson and ygrek
[Pascal](http://houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer.
-[Perl](https://github.com/szbalint/WWW--Curl) Maintained by Cris Bailiff and Bálint Szilakszi
+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
[PHP](https://php.net/curl) Originally written by Sterling Hughes
[PostgreSQL](http://gborg.postgresql.org/project/pgcurl/projdisplay.php) Written by Gian Paolo Ciceri
-[Python](http://pycurl.sourceforge.net/) PycURL by Kjetil Jacobsen
+[Python](http://pycurl.io/) PycURL by Kjetil Jacobsen
-[R](http://cran.r-project.org/package=curl)
+[R](https://cran.r-project.org/package=curl)
-[Rexx](http://rexxcurl.sourceforge.net/) Written Mark Hessling
+[Rexx](https://rexxcurl.sourceforge.io/) Written Mark Hessling
+
+[Ring](https://ring-lang.sourceforge.io/doc1.3/libcurl.html) RingLibCurl by Mahmoud Fayed
RPG, support for ILE/RPG on OS/400 is included in source distribution
@@ -81,13 +91,15 @@ Ruby: [curb](http://curb.rubyforge.org/) written by Ross Bamford, [ruby-curl-mul
[Rust](https://github.com/carllerche/curl-rust) curl-rust - by Carl Lerche
-[Scheme](http://www.metapaper.net/lisovsky/web/curl/) Bigloo binding by Kirill Lisovsky
+[Scheme](https://www.metapaper.net/lisovsky/web/curl/) Bigloo binding by Kirill Lisovsky
+
+[Scilab](https://help.scilab.org/docs/current/fr_FR/getURL.html) binding by Sylvestre Ledru
[S-Lang](http://www.jedsoft.org/slang/modules/curl.html) by John E Davis
[Smalltalk](http://www.squeaksource.com/CurlPlugin/) Written by Danil Osipchuk
-[SP-Forth](http://www.forth.org.ru/~ac/lib/lin/curl/) Written by ygrek
+[SP-Forth](https://sourceforge.net/p/spf/spf/ci/master/tree/devel/~ac/lib/lin/curl/) Written by Andrey Cherezov
[SPL](http://www.clifford.at/spl/) Written by Clifford Wolf
@@ -97,9 +109,9 @@ Ruby: [curb](http://curb.rubyforge.org/) written by Ross Bamford, [ruby-curl-mul
[Visual Foxpro](http://www.ctl32.com.ar/libcurl.asp) by Carlos Alloatti
-[Q](http://q-lang.sourceforge.net/) The libcurl module is part of the default install
+[Q](https://q-lang.sourceforge.io/) The libcurl module is part of the default install
-[wxWidgets](http://wxcode.sourceforge.net/components/wxcurl/) Written by Casey O'Donnell
+[wxWidgets](https://wxcode.sourceforge.io/components/wxcurl/) Written by Casey O'Donnell
[XBLite](http://perso.wanadoo.fr/xblite/libraries.html) Written by David Szafranski
diff --git a/docs/BUGS b/docs/BUGS
index 8cabbd24..3c8fa9fc 100644
--- a/docs/BUGS
+++ b/docs/BUGS
@@ -9,11 +9,13 @@ BUGS
1. Bugs
1.1 There are still bugs
1.2 Where to report
- 1.3 What to report
- 1.4 libcurl problems
- 1.5 Who will fix the problems
- 1.6 How to get a stack trace
- 1.7 Bugs in libcurl bindings
+ 1.3 Security bugs
+ 1.4 What to report
+ 1.5 libcurl problems
+ 1.6 Who will fix the problems
+ 1.7 How to get a stack trace
+ 1.8 Bugs in libcurl bindings
+ 1.9 Bugs in old versions
2. Bug fixing procedure
2.1 What happens on first filing
@@ -29,9 +31,8 @@ BUGS
1.1 There are still bugs
- Curl and libcurl have grown substantially since the beginning. At the time
- of writing (January 2013), there are about 83,000 lines of source code, and
- by the time you read this it has probably grown even more.
+ Curl and libcurl keep being developed. Adding features and changing code
+ means that bugs will sneak in, no matter how hard we try not to.
Of course there are lots of bugs left. And lots of misfeatures.
@@ -52,7 +53,24 @@ BUGS
If you feel you need to ask around first, find a suitable mailing list and
post there. The lists are available on https://curl.haxx.se/mail/
-1.3 What to report
+1.3 Security bugs
+
+ If you find a bug or problem in curl or libcurl that you think has a
+ security impact, for example a bug that can put users in danger or make them
+ vulnerable if the bug becomes public knowledge, then please report that bug
+ 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 vulernable versions.
+
+ The curl project's process for handling security related issues is
+ documented here:
+
+ https://curl.haxx.se/dev/security.html
+
+1.4 What to report
When reporting a bug, you should include all information that will help us
understand what's wrong, what you expected to happen and how to repeat the
@@ -84,7 +102,7 @@ BUGS
The address and how to subscribe to the mailing lists are detailed in the
MANUAL file.
-1.4 libcurl problems
+1.5 libcurl problems
When you've written your own application with libcurl to perform transfers,
it is even more important to be specific and detailed when reporting bugs.
@@ -104,7 +122,7 @@ BUGS
valgrind or similar before you post memory-related or "crashing" problems to
us.
-1.5 Who will fix the problems
+1.6 Who will fix the problems
If the problems or bugs you describe are considered to be bugs, we want to
have the problems fixed.
@@ -123,7 +141,7 @@ BUGS
We get reports from many people every month and each report can take a
considerable amount of time to really go to the bottom with.
-1.6 How to get a stack trace
+1.7 How to get a stack trace
First, you must make sure that you compile all sources with -g and that you
don't 'strip' the final executable. Try to avoid optimizing the code as
@@ -143,7 +161,7 @@ BUGS
crashed. Include the stack trace with your detailed bug report. It'll help a
lot.
-1.7 Bugs in libcurl bindings
+1.8 Bugs in libcurl bindings
There will of course pop up bugs in libcurl bindings. You should then
primarily approach the team that works on that particular binding and see
@@ -153,6 +171,38 @@ BUGS
please convert your program over to plain C and follow the steps outlined
above.
+1.9 Bugs in old versions
+
+ The curl project typically releases new versions every other month, and we
+ fix several hundred bugs per year. For a huge table of releases, number of
+ bug fixes and more, see: https://curl.haxx.se/docs/releases.html
+
+ The developers in the curl project do not have bandwidth or energy enough to
+ maintain several branches or to spend much time on hunting down problems in
+ old versions when chances are we already fixed them or at least that they've
+ changed nature and appearance in later versions.
+
+ When you experience a problem and want to report it, you really SHOULD
+ include the version number of the curl you're using when you experience the
+ issue. If that version number shows us that you're using an out-of-date
+ curl, you should also try out a modern curl version to see if the problem
+ persists or how/if it has changed in apperance.
+
+ Even if you cannot immediately upgrade your application/system to run the
+ latest curl version, you can most often at least run a test version or
+ experimental build or similar, to get this confirmed or not.
+
+ At times people insist that they cannot upgrade to a modern curl version,
+ but instead they "just want the bug fixed". That's fine, just don't count on
+ us spending many cycles on trying to identify which single commit, if that's
+ even possible, that at some point in the past fixed the problem you're now
+ experiencing.
+
+ Security wise, it is almost always a bad idea to lag behind the current curl
+ versions by a lot. We keeping discovering and reporting security problems
+ over time see you can see in this table:
+ https://curl.haxx.se/docs/vulnerabilities.html
+
2. Bug fixing procedure
2.1 What happens on first filing
@@ -210,7 +260,7 @@ BUGS
This is a list of known bugs. Bugs we know exist and that have been pointed
out but that haven't yet been fixed. The reasons for why they haven't been
fixed can involve anything really, but the primary reason is that nobody has
- considered these problems to be important enough to spend the necesary time
+ considered these problems to be important enough to spend the necessary time
and effort to have them fixed.
The KNOWN_BUGS are always up for grabs and we will always love the ones who
@@ -238,7 +288,7 @@ BUGS
2.8 Closing off stalled bugs
The issue and pull request trackers on https://github.com/curl/curl will
- only hold "active" entries (using a non-precise defintion of what active
+ only hold "active" entries (using a non-precise definition of what active
actually is, but they're at least not completely dead). Those that are
abandonded or in other ways dormant will be closed and sometimes added to
TODO and KNOWN_BUGS instead.
diff --git a/docs/CIPHERS.md b/docs/CIPHERS.md
new file mode 100644
index 00000000..e09533b0
--- /dev/null
+++ b/docs/CIPHERS.md
@@ -0,0 +1,426 @@
+# Ciphers
+
+With curl's options `CURLOPT_SSL_CIPHER_LIST` and `--ciphers` users can
+control which ciphers to consider when negotiating TLS connections.
+
+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.
+
+## OpenSSL
+
+(based on [OpenSSL docs](https://www.openssl.org/docs/man1.1.0/apps/ciphers.html))
+
+### SSL3 cipher suites
+
+`NULL-MD5`
+`NULL-SHA`
+`RC4-MD5`
+`RC4-SHA`
+`IDEA-CBC-SHA`
+`DES-CBC3-SHA`
+`DH-DSS-DES-CBC3-SHA`
+`DH-RSA-DES-CBC3-SHA`
+`DHE-DSS-DES-CBC3-SHA`
+`DHE-RSA-DES-CBC3-SHA`
+`ADH-RC4-MD5`
+`ADH-DES-CBC3-SHA`
+
+### TLS v1.0 cipher suites
+
+`NULL-MD5`
+`NULL-SHA`
+`RC4-MD5`
+`RC4-SHA`
+`IDEA-CBC-SHA`
+`DES-CBC3-SHA`
+`DHE-DSS-DES-CBC3-SHA`
+`DHE-RSA-DES-CBC3-SHA`
+`ADH-RC4-MD5`
+`ADH-DES-CBC3-SHA`
+
+### AES ciphersuites from RFC3268, extending TLS v1.0
+
+`AES128-SHA`
+`AES256-SHA`
+`DH-DSS-AES128-SHA`
+`DH-DSS-AES256-SHA`
+`DH-RSA-AES128-SHA`
+`DH-RSA-AES256-SHA`
+`DHE-DSS-AES128-SHA`
+`DHE-DSS-AES256-SHA`
+`DHE-RSA-AES128-SHA`
+`DHE-RSA-AES256-SHA`
+`ADH-AES128-SHA`
+`ADH-AES256-SHA`
+
+### SEED ciphersuites from RFC4162, extending TLS v1.0
+
+`SEED-SHA`
+`DH-DSS-SEED-SHA`
+`DH-RSA-SEED-SHA`
+`DHE-DSS-SEED-SHA`
+`DHE-RSA-SEED-SHA`
+`ADH-SEED-SHA`
+
+### GOST ciphersuites, extending TLS v1.0
+
+`GOST94-GOST89-GOST89`
+`GOST2001-GOST89-GOST89`
+`GOST94-NULL-GOST94`
+`GOST2001-NULL-GOST94`
+
+### Elliptic curve cipher suites
+
+`ECDHE-RSA-NULL-SHA`
+`ECDHE-RSA-RC4-SHA`
+`ECDHE-RSA-DES-CBC3-SHA`
+`ECDHE-RSA-AES128-SHA`
+`ECDHE-RSA-AES256-SHA`
+`ECDHE-ECDSA-NULL-SHA`
+`ECDHE-ECDSA-RC4-SHA`
+`ECDHE-ECDSA-DES-CBC3-SHA`
+`ECDHE-ECDSA-AES128-SHA`
+`ECDHE-ECDSA-AES256-SHA`
+`AECDH-NULL-SHA`
+`AECDH-RC4-SHA`
+`AECDH-DES-CBC3-SHA`
+`AECDH-AES128-SHA`
+`AECDH-AES256-SHA`
+
+### TLS v1.2 cipher suites
+
+`NULL-SHA256`
+`AES128-SHA256`
+`AES256-SHA256`
+`AES128-GCM-SHA256`
+`AES256-GCM-SHA384`
+`DH-RSA-AES128-SHA256`
+`DH-RSA-AES256-SHA256`
+`DH-RSA-AES128-GCM-SHA256`
+`DH-RSA-AES256-GCM-SHA384`
+`DH-DSS-AES128-SHA256`
+`DH-DSS-AES256-SHA256`
+`DH-DSS-AES128-GCM-SHA256`
+`DH-DSS-AES256-GCM-SHA384`
+`DHE-RSA-AES128-SHA256`
+`DHE-RSA-AES256-SHA256`
+`DHE-RSA-AES128-GCM-SHA256`
+`DHE-RSA-AES256-GCM-SHA384`
+`DHE-DSS-AES128-SHA256`
+`DHE-DSS-AES256-SHA256`
+`DHE-DSS-AES128-GCM-SHA256`
+`DHE-DSS-AES256-GCM-SHA384`
+`ECDHE-RSA-AES128-SHA256`
+`ECDHE-RSA-AES256-SHA384`
+`ECDHE-RSA-AES128-GCM-SHA256`
+`ECDHE-RSA-AES256-GCM-SHA384`
+`ECDHE-ECDSA-AES128-SHA256`
+`ECDHE-ECDSA-AES256-SHA384`
+`ECDHE-ECDSA-AES128-GCM-SHA256`
+`ECDHE-ECDSA-AES256-GCM-SHA384`
+`ADH-AES128-SHA256`
+`ADH-AES256-SHA256`
+`ADH-AES128-GCM-SHA256`
+`ADH-AES256-GCM-SHA384`
+`AES128-CCM`
+`AES256-CCM`
+`DHE-RSA-AES128-CCM`
+`DHE-RSA-AES256-CCM`
+`AES128-CCM8`
+`AES256-CCM8`
+`DHE-RSA-AES128-CCM8`
+`DHE-RSA-AES256-CCM8`
+`ECDHE-ECDSA-AES128-CCM`
+`ECDHE-ECDSA-AES256-CCM`
+`ECDHE-ECDSA-AES128-CCM8`
+`ECDHE-ECDSA-AES256-CCM8`
+
+### Camellia HMAC-Based ciphersuites from RFC6367, extending TLS v1.2
+
+`ECDHE-ECDSA-CAMELLIA128-SHA256`
+`ECDHE-ECDSA-CAMELLIA256-SHA384`
+`ECDHE-RSA-CAMELLIA128-SHA256`
+`ECDHE-RSA-CAMELLIA256-SHA384`
+
+## NSS
+
+### Totally insecure
+
+`rc4`
+`rc4-md5`
+`rc4export`
+`rc2`
+`rc2export`
+`des`
+`desede3`
+
+### SSL3/TLS cipher suites
+
+`rsa_rc4_128_md5`
+`rsa_rc4_128_sha`
+`rsa_3des_sha`
+`rsa_des_sha`
+`rsa_rc4_40_md5`
+`rsa_rc2_40_md5`
+`rsa_null_md5`
+`rsa_null_sha`
+`fips_3des_sha`
+`fips_des_sha`
+`fortezza`
+`fortezza_rc4_128_sha`
+`fortezza_null`
+
+### TLS 1.0 Exportable 56-bit Cipher Suites
+
+`rsa_des_56_sha`
+`rsa_rc4_56_sha`
+
+### AES ciphers
+
+`dhe_dss_aes_128_cbc_sha`
+`dhe_dss_aes_256_cbc_sha`
+`dhe_rsa_aes_128_cbc_sha`
+`dhe_rsa_aes_256_cbc_sha`
+`rsa_aes_128_sha`
+`rsa_aes_256_sha`
+
+### ECC ciphers
+
+`ecdh_ecdsa_null_sha`
+`ecdh_ecdsa_rc4_128_sha`
+`ecdh_ecdsa_3des_sha`
+`ecdh_ecdsa_aes_128_sha`
+`ecdh_ecdsa_aes_256_sha`
+`ecdhe_ecdsa_null_sha`
+`ecdhe_ecdsa_rc4_128_sha`
+`ecdhe_ecdsa_3des_sha`
+`ecdhe_ecdsa_aes_128_sha`
+`ecdhe_ecdsa_aes_256_sha`
+`ecdh_rsa_null_sha`
+`ecdh_rsa_128_sha`
+`ecdh_rsa_3des_sha`
+`ecdh_rsa_aes_128_sha`
+`ecdh_rsa_aes_256_sha`
+`ecdhe_rsa_null`
+`ecdhe_rsa_rc4_128_sha`
+`ecdhe_rsa_3des_sha`
+`ecdhe_rsa_aes_128_sha`
+`ecdhe_rsa_aes_256_sha`
+`ecdh_anon_null_sha`
+`ecdh_anon_rc4_128sha`
+`ecdh_anon_3des_sha`
+`ecdh_anon_aes_128_sha`
+`ecdh_anon_aes_256_sha`
+
+### HMAC-SHA256 cipher suites
+
+`rsa_null_sha_256`
+`rsa_aes_128_cbc_sha_256`
+`rsa_aes_256_cbc_sha_256`
+`dhe_rsa_aes_128_cbc_sha_256`
+`dhe_rsa_aes_256_cbc_sha_256`
+`ecdhe_ecdsa_aes_128_cbc_sha_256`
+`ecdhe_rsa_aes_128_cbc_sha_256`
+
+### AES GCM cipher suites in RFC 5288 and RFC 5289
+
+`rsa_aes_128_gcm_sha_256`
+`dhe_rsa_aes_128_gcm_sha_256`
+`dhe_dss_aes_128_gcm_sha_256`
+`ecdhe_ecdsa_aes_128_gcm_sha_256`
+`ecdh_ecdsa_aes_128_gcm_sha_256`
+`ecdhe_rsa_aes_128_gcm_sha_256`
+`ecdh_rsa_aes_128_gcm_sha_256`
+
+### cipher suites using SHA384
+
+`rsa_aes_256_gcm_sha_384`
+`dhe_rsa_aes_256_gcm_sha_384`
+`dhe_dss_aes_256_gcm_sha_384`
+`ecdhe_ecdsa_aes_256_sha_384`
+`ecdhe_rsa_aes_256_sha_384`
+`ecdhe_ecdsa_aes_256_gcm_sha_384`
+`ecdhe_rsa_aes_256_gcm_sha_384`
+
+### chacha20-poly1305 cipher suites
+
+`ecdhe_rsa_chacha20_poly1305_sha_256`
+`ecdhe_ecdsa_chacha20_poly1305_sha_256`
+`dhe_rsa_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),
+but libcurl maps them to the following case-insensitive names.
+
+### SSL2 cipher suites (insecure: disabled by default)
+
+`rc2-md5`
+`rc4-md5`
+`exp-rc2-md5`
+`exp-rc4-md5`
+`des-cbc-md5`
+`des-cbc3-md5`
+
+### SSL3 cipher suites
+
+`null-md5`
+`null-sha`
+`rc4-md5`
+`rc4-sha`
+`exp-rc2-cbc-md5`
+`exp-rc4-md5`
+`exp-des-cbc-sha`
+`des-cbc3-sha`
+
+### TLS v1.0 cipher suites
+
+`null-md5`
+`null-sha`
+`rc4-md5`
+`rc4-sha`
+`exp-rc2-cbc-md5`
+`exp-rc4-md5`
+`exp-des-cbc-sha`
+`des-cbc3-sha`
+`aes128-sha`
+`aes256-sha`
+
+### TLS v1.1 cipher suites
+
+`null-md5`
+`null-sha`
+`rc4-md5`
+`rc4-sha`
+`exp-des-cbc-sha`
+`des-cbc3-sha`
+`aes128-sha`
+`aes256-sha`
+
+### TLS v1.2 cipher suites
+
+`null-md5`
+`null-sha`
+`null-sha256`
+`rc4-md5`
+`rc4-sha`
+`des-cbc3-sha`
+`aes128-sha`
+`aes256-sha`
+`aes128-sha256`
+`aes256-sha256`
+`aes128-gcm-sha256`
+`aes256-gcm-sha384`
+
+## WolfSSL
+
+`RC4-SHA`,
+`RC4-MD5`,
+`DES-CBC3-SHA`,
+`AES128-SHA`,
+`AES256-SHA`,
+`NULL-SHA`,
+`NULL-SHA256`,
+`DHE-RSA-AES128-SHA`,
+`DHE-RSA-AES256-SHA`,
+`DHE-PSK-AES256-GCM-SHA384`,
+`DHE-PSK-AES128-GCM-SHA256`,
+`PSK-AES256-GCM-SHA384`,
+`PSK-AES128-GCM-SHA256`,
+`DHE-PSK-AES256-CBC-SHA384`,
+`DHE-PSK-AES128-CBC-SHA256`,
+`PSK-AES256-CBC-SHA384`,
+`PSK-AES128-CBC-SHA256`,
+`PSK-AES128-CBC-SHA`,
+`PSK-AES256-CBC-SHA`,
+`DHE-PSK-AES128-CCM`,
+`DHE-PSK-AES256-CCM`,
+`PSK-AES128-CCM`,
+`PSK-AES256-CCM`,
+`PSK-AES128-CCM-8`,
+`PSK-AES256-CCM-8`,
+`DHE-PSK-NULL-SHA384`,
+`DHE-PSK-NULL-SHA256`,
+`PSK-NULL-SHA384`,
+`PSK-NULL-SHA256`,
+`PSK-NULL-SHA`,
+`HC128-MD5`,
+`HC128-SHA`,
+`HC128-B2B256`,
+`AES128-B2B256`,
+`AES256-B2B256`,
+`RABBIT-SHA`,
+`NTRU-RC4-SHA`,
+`NTRU-DES-CBC3-SHA`,
+`NTRU-AES128-SHA`,
+`NTRU-AES256-SHA`,
+`AES128-CCM-8`,
+`AES256-CCM-8`,
+`ECDHE-ECDSA-AES128-CCM`,
+`ECDHE-ECDSA-AES128-CCM-8`,
+`ECDHE-ECDSA-AES256-CCM-8`,
+`ECDHE-RSA-AES128-SHA`,
+`ECDHE-RSA-AES256-SHA`,
+`ECDHE-ECDSA-AES128-SHA`,
+`ECDHE-ECDSA-AES256-SHA`,
+`ECDHE-RSA-RC4-SHA`,
+`ECDHE-RSA-DES-CBC3-SHA`,
+`ECDHE-ECDSA-RC4-SHA`,
+`ECDHE-ECDSA-DES-CBC3-SHA`,
+`AES128-SHA256`,
+`AES256-SHA256`,
+`DHE-RSA-AES128-SHA256`,
+`DHE-RSA-AES256-SHA256`,
+`ECDH-RSA-AES128-SHA`,
+`ECDH-RSA-AES256-SHA`,
+`ECDH-ECDSA-AES128-SHA`,
+`ECDH-ECDSA-AES256-SHA`,
+`ECDH-RSA-RC4-SHA`,
+`ECDH-RSA-DES-CBC3-SHA`,
+`ECDH-ECDSA-RC4-SHA`,
+`ECDH-ECDSA-DES-CBC3-SHA`,
+`AES128-GCM-SHA256`,
+`AES256-GCM-SHA384`,
+`DHE-RSA-AES128-GCM-SHA256`,
+`DHE-RSA-AES256-GCM-SHA384`,
+`ECDHE-RSA-AES128-GCM-SHA256`,
+`ECDHE-RSA-AES256-GCM-SHA384`,
+`ECDHE-ECDSA-AES128-GCM-SHA256`,
+`ECDHE-ECDSA-AES256-GCM-SHA384`,
+`ECDH-RSA-AES128-GCM-SHA256`,
+`ECDH-RSA-AES256-GCM-SHA384`,
+`ECDH-ECDSA-AES128-GCM-SHA256`,
+`ECDH-ECDSA-AES256-GCM-SHA384`,
+`CAMELLIA128-SHA`,
+`DHE-RSA-CAMELLIA128-SHA`,
+`CAMELLIA256-SHA`,
+`DHE-RSA-CAMELLIA256-SHA`,
+`CAMELLIA128-SHA256`,
+`DHE-RSA-CAMELLIA128-SHA256`,
+`CAMELLIA256-SHA256`,
+`DHE-RSA-CAMELLIA256-SHA256`,
+`ECDHE-RSA-AES128-SHA256`,
+`ECDHE-ECDSA-AES128-SHA256`,
+`ECDH-RSA-AES128-SHA256`,
+`ECDH-ECDSA-AES128-SHA256`,
+`ECDHE-RSA-AES256-SHA384`,
+`ECDHE-ECDSA-AES256-SHA384`,
+`ECDH-RSA-AES256-SHA384`,
+`ECDH-ECDSA-AES256-SHA384`,
+`ECDHE-RSA-CHACHA20-POLY1305`,
+`ECDHE-ECDSA-CHACHA20-POLY1305`,
+`DHE-RSA-CHACHA20-POLY1305`,
+`ECDHE-RSA-CHACHA20-POLY1305-OLD`,
+`ECDHE-ECDSA-CHACHA20-POLY1305-OLD`,
+`DHE-RSA-CHACHA20-POLY1305-OLD`,
+`ADH-AES128-SHA`,
+`QSH`,
+`RENEGOTIATION-INFO`,
+`IDEA-CBC-SHA`,
+`ECDHE-ECDSA-NULL-SHA`,
+`ECDHE-PSK-NULL-SHA256`,
+`ECDHE-PSK-AES128-CBC-SHA256`,
+`PSK-CHACHA20-POLY1305`,
+`ECDHE-PSK-CHACHA20-POLY1305`,
+`DHE-PSK-CHACHA20-POLY1305`,
+`EDH-RSA-DES-CBC3-SHA`,
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 00000000..69486172
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,3 @@
+#add_subdirectory(examples)
+add_subdirectory(libcurl)
+add_subdirectory(cmdline-opts)
diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md
index b0b0f6cc..536a9ceb 100644
--- a/docs/CONTRIBUTE.md
+++ b/docs/CONTRIBUTE.md
@@ -83,14 +83,14 @@ It is annoying when you get a huge patch from someone that is said to fix 511
odd problems, but discussions and opinions don't agree with 510 of them - or
509 of them were already fixed in a different way. Then the person merging
this change needs to extract the single interesting patch from somewhere
-within the huge pile of source, and that gives a lot of extra work.
+within the huge pile of source, and that creates a lot of extra work.
-Preferably, each fix that correct a problem should be in its own patch/commit
+Preferably, each fix that corrects a problem should be in its own patch/commit
with its own description/commit message stating exactly what they correct so
that all changes can be selectively applied by the maintainer or other
interested parties.
-Also, separate changes enable bisecting much better when we track problems
+Also, separate changes enable bisecting much better for tracking problems
and regression in the future.
### Patch Against Recent Sources
@@ -103,9 +103,9 @@ release archive is quite OK as well!
### Documentation
Writing docs is dead boring and one of the big problems with many open source
-projects. Someone's gotta do it. It makes it a lot easier if you submit a
-small description of your fix or your new features with every contribution so
-that it can be swiftly added to the package documentation.
+projects. But someone's gotta do it! It makes things a lot easier if you
+submit a small description of your fix or your new features with every
+contribution so that it can be swiftly added to the package documentation.
The documentation is always made in man pages (nroff formatted) or plain
ASCII files. All HTML files on the web site and in the release archives are
@@ -135,8 +135,8 @@ list](https://curl.haxx.se/mail/list.cgi?list=curl-library).
Either way, your change will be reviewed and discussed there and you will be
expected to correct flaws pointed out and update accordingly, or the change
-risk stalling and eventually just get deleted without action. As a submitter
-of a change, you are the owner of that change until it has been merged.
+risks stalling and eventually just getting deleted without action. As a
+submitter of a change, you are the owner of that change until it has been merged.
Respond on the list or on github about the change and answer questions and/or
fix nits/flaws. This is very important. We will take lack of replies as a
@@ -149,20 +149,39 @@ With github it is easy to send a [pull
request](https://github.com/curl/curl/pulls) to the curl project to have
changes merged.
-We prefer pull requests to mailed patches, as it makes it a proper git commit
-that is easy to merge and they are easy to track and not that easy to loose
-in a flood of many emails, like they sometimes do on the mailing lists.
+We strongly prefer pull requests to mailed patches, as it makes it a proper
+git commit that is easy to merge and they are easy to track and not that easy
+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:
+
+ - ... it still builds, warning-free, on Linux and macOS, with both
+ clang and gcc
+ - ... it still builds fine on Windows with several MSVC versions
+ - ... it still builds with cmake on Linux, with gcc and clang
+ - ... it follows rudimentary code style rules
+ - ... the test suite still runs 100% fine
+ - ... the release tarball (the "dist") still works
+ - ... it builds fine in-tree as well as out-of-tree
+ - ... code coverage doesn't shrink drastically
+
+If the pull-request fails one of these tests, it will show up as a red X and
+you are expected to fix the problem. If you don't understand whan the issue is
+or have other problems to fix the complaint, just ask and other project
+members will likely be able to help out.
When you adjust your pull requests after review, consider squashing the
commits so that we can review the full updated version more easily.
### Making quality patches
-Make the patch against as recent sources as possible.
+Make the patch against as recent source versions as possible.
If you've followed the tips in this document and your patch still hasn't been
-incorporated or responded to after some weeks, consider resubmitting it to
-the list or better yet: change it to a pull request.
+incorporated or responded to after some weeks, consider resubmitting it to the
+list or better yet: change it to a pull request.
### Write good commit messages
@@ -175,14 +194,15 @@ A short guide to how to write commit messages in the curl project.
possible as to why this change is made, and possibly what things
it fixes and everything else that is related]
-- empty line --
+ [Closes/Fixes #1234 - if this closes or fixes a github issue]
[Bug: URL to source of the report or more related discussion]
[Reported-by: John Doe - credit the reporter]
[whatever-else-by: credit all helpers, finders, doers]
---- stop ----
-Don't forget to use commit --author="" if you commit someone else's work,
-and make sure that you have your own user and email setup correctly in git
-before you commit
+Don't forget to use commit --author="" if you commit someone else's work, and
+make sure that you have your own user and email setup correctly in git before
+you commit
### Write Access to git Repository
@@ -204,8 +224,8 @@ local repository:
git commit [file]
-As usual, group your commits so that you commit all changes that at once that
-constitutes a logical change.
+As usual, group your commits so that you commit all changes at once that
+constitute a logical change.
Once you have done all your commits and you're happy with what you see, you
can make patches out of your changes that are suitable for mailing:
@@ -243,5 +263,5 @@ For unix-like operating systems:
For Windows:
- - [http://gnuwin32.sourceforge.net/packages/patch.htm](http://gnuwin32.sourceforge.net/packages/patch.htm)
- - [http://gnuwin32.sourceforge.net/packages/diffutils.htm](http://gnuwin32.sourceforge.net/packages/diffutils.htm)
+ - [https://gnuwin32.sourceforge.io/packages/patch.htm](https://gnuwin32.sourceforge.io/packages/patch.htm)
+ - [https://gnuwin32.sourceforge.io/packages/diffutils.htm](https://gnuwin32.sourceforge.io/packages/diffutils.htm)
diff --git a/docs/FAQ b/docs/FAQ
index d663811a..5b981063 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -30,7 +30,6 @@ FAQ
2.2 Does curl work/build with other SSL libraries?
2.3 Where can I find a copy of LIBEAY32.DLL?
2.4 Does curl support SOCKS (RFC 1928) ?
- 2.5 Install libcurl for both 32bit and 64bit?
3. Usage Problems
3.1 curl: (1) SSL is disabled, https: not supported
@@ -118,6 +117,7 @@ FAQ
7.1 What is PHP/CURL?
7.2 Who wrote PHP/CURL?
7.3 Can I perform multiple requests using the same handle?
+ 7.4 Does PHP/CURL have dependencies?
==============================================================================
@@ -162,7 +162,7 @@ FAQ
We pronounce curl with an initial k sound. It rhymes with words like girl
and earl. This is a short WAV file to help you:
- http://media.merriam-webster.com/soundc11/c/curl0001.wav
+ https://media.merriam-webster.com/soundc11/c/curl0001.wav
There are numerous sub-projects and related projects that also use the word
curl in the project names in various combinations, but you should take
@@ -215,22 +215,22 @@ FAQ
another tool that uses libcurl.
We do not add things to curl that other small and available tools already do
- very fine at the side. Curl's output is fine to pipe into another program or
- redirect to another file for the next program to interpret.
+ very well at the side. Curl's output can be piped into another program or
+ redirected to another file for the next program to interpret.
We focus on protocol related issues and improvements. If you wanna do more
- magic with the supported protocols than curl currently does, chances are big
+ magic with the supported protocols than curl currently does, chances are good
we will agree. If you wanna add more protocols, we may very well agree.
- If you want someone else to make all the work while you wait for us to
+ If you want someone else to do all the work while you wait for us to
implement it for you, that is not a very friendly attitude. We spend a
considerable time already on maintaining and developing curl. In order to
get more out of us, you should consider trading in some of your time and
- efforts in return. Simply go to the GitHub repo which resides at
+ effort in return. Simply go to the GitHub repo which resides at
https://github.com/curl/curl, fork the project, and create pull requests
with your proposed changes.
- If you write the code, chances are bigger that it will get into curl faster.
+ If you write the code, chances are better that it will get into curl faster.
1.5 Who makes curl?
@@ -238,7 +238,7 @@ FAQ
project leader and main developer, but other persons' submissions are
important and crucial. Anyone can contribute and post their changes and
improvements and have them inserted in the main sources (of course on the
- condition that developers agree on that the fixes are good).
+ condition that developers agree that the fixes are good).
The full list of all contributors is found in the docs/THANKS file.
@@ -247,9 +247,9 @@ FAQ
1.6 What do you get for making curl?
Project cURL is entirely free and open. No person gets paid for developing
- curl on full time. We do this voluntarily, mostly on spare time.
+ curl full time. We do this voluntarily, mostly in our spare time.
Occasionally companies pay individual developers to work on curl, but that's
- up to each company and developer. It is not controlled by nor supervised in
+ up to each company and developer. This is not controlled by nor supervised in
any way by the project.
We still get help from companies. Haxx provides web site, bandwidth, mailing
@@ -260,11 +260,11 @@ FAQ
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 coding, documenting, testing etc.
+ or even better: by helping us with coding, documenting or testing etc.
1.7 What about CURL from curl.com?
- During the summer 2001, curl.com was busy advertising their client-side
+ During the summer of 2001, curl.com was busy advertising their client-side
programming language for the web, named CURL.
We are in no way associated with curl.com or their CURL programming
@@ -277,7 +277,7 @@ FAQ
We recognize that we will be living in parallel with curl.com and wish them
every success.
- 1.8 I have a problem who do I mail?
+ 1.8 I have a problem whom do I mail?
Please do not mail any single individual unless you really need to. Keep
curl-related questions on a suitable mailing list. All available mailing
@@ -285,8 +285,8 @@ FAQ
https://curl.haxx.se/mail/
Keeping curl-related questions and discussions on mailing lists allows
- others to join in and help, to share their ideas, contribute their
- suggestions and spread their wisdom. Keeping discussions on public mailing
+ others to join in and help, to share their ideas, to contribute their
+ suggestions and to spread their wisdom. Keeping discussions on public mailing
lists also allows for others to learn from this (both current and future
users thanks to the web based archives of the mailing lists), thus saving us
from having to repeat ourselves even more. Thanks for respecting this.
@@ -324,9 +324,9 @@ FAQ
1.11 Why don't you update ca-bundle.crt
- The ca cert bundle that used to shipped with curl was very outdated and must
- be replaced with an up-to-date version by anyone who wants to verify
- peers. It is no longer provided by curl. The last curl release ever that
+ The ca cert bundle that used to be shipped with curl was very outdated and
+ must be replaced with an up-to-date version by anyone who wants to verify
+ peers. It is no longer provided by curl. The last curl release that ever
shipped a ca cert bundle was curl 7.18.0.
In the cURL project we've decided not to attempt to keep this file updated
@@ -347,7 +347,7 @@ FAQ
1.12 I have a problem who can I chat with?
There's a bunch of friendly people hanging out in the #curl channel on the
- IRC network irc.freenode.net. If you're polite and nice, chances are big
+ IRC network irc.freenode.net. If you're polite and nice, chances are good
that you can get -- or provide -- help instantly.
1.13 curl's ECCN number?
@@ -366,8 +366,8 @@ FAQ
Comprehensible explanations of the meaning of such numbers and how to obtain
them (resp.) are here
- http://www.bis.doc.gov/licensing/exportingbasics.htm
- http://www.bis.doc.gov/licensing/do_i_needaneccn.html
+ https://www.bis.doc.gov/licensing/exportingbasics.htm
+ https://www.bis.doc.gov/licensing/do_i_needaneccn.html
An incomprehensible description of the two numbers above is here
http://www.access.gpo.gov/bis/ear/pdf/ccl5-pt2.pdf
@@ -430,7 +430,7 @@ FAQ
2.1.2 only the libssl lib is missing
If all include files and the libcrypto lib is present, with only the
- libssl being missing according to configure, this is mostly likely because
+ libssl being missing according to configure, this is most likely because
a few functions are left out from the libssl.
If the function names missing include RSA or RSAREF you can be certain
@@ -465,32 +465,6 @@ FAQ
Yes, SOCKS 4 and 5 are supported.
- 2.5 Install libcurl for both 32bit and 64bit?
-
- In curl's configure procedure one of the regular include files get created
- with platform specific information. The file 'curl/curlbuild.h' in the
- installed libcurl file tree is therefore somewhat tied to that particular
- platform.
-
- To allow applications to get built for either 32bit or 64bit you need to
- install libcurl headers for both setups and unfortunately curl doesn't do
- this automatically.
-
- A commonly used procedure is this:
-
- $ ./configure [32bit platform]
- $ mv curl/curlbuild.h curl/curlbuild-32bit.h
- $ ./configure [64bit platform]
- $ mv curl/curlbuild.h curl/curlbuild-64bit.h
-
- Then you make a toplevel curl/curlbuild.h replacement that only does this:
-
- #ifdef IS_32BIT
- #include "curlbuild-32bit.h"
- else
- #include "curlbuild-64bit.h"
- #endif
-
3. Usage problems
@@ -520,11 +494,14 @@ FAQ
3.3 Why doesn't my posting using -F work?
- You can't simply use -F or -d at your choice. The web server that will
- receive your post expects one of the formats. If the form you're trying to
- submit uses the type 'multipart/form-data', then and only then you must use
- the -F type. In all the most common cases, you should use -d which then
- causes a posting with the type 'application/x-www-form-urlencoded'.
+ You can't arbitrarily use -F or -d, the choice between -F or -d depends on the
+ HTTP operation you need curl to do and what the web server that will receive
+ your post expects.
+
+ If the form you're trying to submit uses the type 'multipart/form-data', then
+ and only then you must use the -F type. In all the most common cases, you
+ should use -d which then causes a posting with the type
+ 'application/x-www-form-urlencoded'.
This is described in some detail in the MANUAL and TheArtOfHttpScripting
documents, and if you don't understand it the first time, read it again
@@ -599,7 +576,7 @@ FAQ
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, O'Caml, Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby,
+ 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!
@@ -611,7 +588,7 @@ FAQ
XML-RPC are all such ones. You can use -X to set custom requests and -H to
set custom headers (or replace internally generated ones).
- Using libcurl is of course just as fine and you'd just use the proper
+ Using libcurl is of course just as good and you'd just use the proper
library options to do the same.
3.11 How do I POST with a different Content-Type?
@@ -631,7 +608,7 @@ FAQ
There is one exception to this rule, and that is if you can "tunnel through"
the given HTTP proxy. Proxy tunneling is enabled with a special option (-p)
and is generally not available as proxy admins usually disable tunneling to
- other ports than 443 (which is used for HTTPS access through proxies).
+ ports other than 443 (which is used for HTTPS access through proxies).
3.13 Why does my single/double quotes fail?
@@ -650,7 +627,7 @@ FAQ
Windows/DOS prompts I believe you're forced to use double (") quotes.
Please study the documentation for your particular environment. Examples in
- the curl docs will use a mix of both these ones as shown above. You must
+ the curl docs will use a mix of both of these as shown above. You must
adjust them to work in your environment.
Remember that curl works and runs on more operating systems than most single
@@ -685,7 +662,7 @@ FAQ
No. curl itself has no code that performs recursive operations, such as
those performed by wget and similar tools.
- There exist wrapper scripts with that functionality (for example the
+ There exists wrapper scripts with that functionality (for example the
curlmirror perl script), and you can write programs based on libcurl to do
it, but the command line tool curl itself cannot.
@@ -696,9 +673,9 @@ FAQ
CLIENT CERTIFICATE
- The server you communicate may require that you can provide this in order to
- prove that you actually are who you claim to be. If the server doesn't
- require this, you don't need a client certificate.
+ The server you communicate with may require that you can provide this in
+ order to prove that you actually are who you claim to be. If the server
+ doesn't require this, you don't need a client certificate.
A client certificate is always used together with a private key, and the
private key has a pass phrase that protects it.
@@ -859,14 +836,14 @@ FAQ
4.3 How can I use {, }, [ or ] to specify multiple URLs?
- Because those letters have a special meaning to the shell, and to be used in
+ Because those letters have a special meaning to the shell, to be used in
a URL specified to curl you must quote them.
- An example that downloads two URLs (sequentially) would do:
+ An example that downloads two URLs (sequentially) would be:
curl '{curl,www}.haxx.se'
- To be able to use those letters as actual parts of the URL (without using
+ To be able to use those characters as actual parts of the URL (without using
them for the curl URL "globbing" system), use the -g/--globoff option:
curl -g 'www.site.com/weirdname[].html'
@@ -1016,14 +993,16 @@ FAQ
4.13 Why is curl -R on Windows one hour off?
- During daylight savings time, when -R is used, curl will set a time that
- appears one hour off. This happens due to a flaw in how Windows stores and
- uses file modification times and it is not easily worked around. For details
- on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp
+ Since curl 7.53.0 this issue should be fixed as long as curl was built with
+ any modern compiler that allows for a 64-bit curl_off_t type. For older
+ compilers or prior curl versions it may set a time that appears one hour off.
+ This happens due to a flaw in how Windows stores and uses file modification
+ times and it is not easily worked around. For more details read this:
+ http://www.codeproject.com/datetime/dstbugs.asp
4.14 Redirects work in browser but not with curl!
- curl supports HTTP redirects fine (see item 3.8). Browsers generally support
+ curl supports HTTP redirects well (see item 3.8). Browsers generally support
at least two other ways to perform redirects that curl does not:
Meta tags. You can write a HTML tag that will cause the browser to redirect
@@ -1047,7 +1026,7 @@ FAQ
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
- mandated by RFC4217. This kind of connection then of course uses the
+ mandated by RFC4217. This kind of connection will then of course use the
standard FTP port 21 by default.
4.16 My HTTP POST or PUT requests are slow!
@@ -1055,7 +1034,7 @@ FAQ
libcurl makes all POST and PUT requests (except for POST requests with a
very tiny request body) use the "Expect: 100-continue" header. This header
allows the server to deny the operation early so that libcurl can bail out
- already before having to send any data. This is useful in authentication
+ before having to send any data. This is useful in authentication
cases and others.
However, many servers don't implement the Expect: stuff properly and if the
@@ -1146,7 +1125,7 @@ FAQ
When doing HTTP transfers, curl will perform exactly what you're asking it
to do and if successful it will not return an error. You can use curl to
test your web server's "file not found" page (that gets 404 back), you can
- use it to check your authentication protected web pages (that get a 401
+ use it to check your authentication protected web pages (that gets a 401
back) and so on.
The specific HTTP response code does not constitute a problem or error for
@@ -1161,7 +1140,7 @@ FAQ
libcurl speak).
You can also use the -w option and the variable %{response_code} to extract
- the exact response code that was return in the response.
+ the exact response code that was returned in the response.
4.21 Why is there a HTTP/1.1 in my HTTP/2 request?
@@ -1171,8 +1150,8 @@ FAQ
The reason for this is that we first generate the request to send using the
old 1.1 style and show that request in the verbose output, and then we
convert it over to the binary header-compressed HTTP/2 style. The actual
- "1.1" part from that request is then not actually used in the transfer. The
- binary HTTP/2 headers are not human readable.
+ "1.1" part from that request is then not actually used in the transfer.
+ The binary HTTP/2 headers are not human readable.
5. libcurl Issues
@@ -1254,10 +1233,10 @@ FAQ
libcurl will reuse connections for all transfers that are made using the
same libcurl handle.
- When you use the easy interface, the connection cache is kept within the
- easy handle. If you instead use the multi interface, the connection cache
- will be kept within the multi handle and will be shared among all the easy
- handles that are used within the same multi handle.
+ When you use the easy interface the connection cache is kept within the easy
+ handle. If you instead use the multi interface, the connection cache will be
+ kept within the multi handle and will be shared among all the easy handles
+ that are used within the same multi handle.
5.7 Link errors when building libcurl on Windows!
@@ -1316,8 +1295,8 @@ FAQ
you want to change name resolver function you must rebuild libcurl and tell
it to use a different function.
- - The non-IPv6 resolver that can use one out of four host name resolve calls
- (depending on what your system supports):
+ - The non-IPv6 resolver that can use one of four different host name resolve
+ calls (depending on what your system supports):
A - gethostbyname()
B - gethostbyname_r() with 3 arguments
@@ -1351,7 +1330,7 @@ FAQ
5.12 Can I make libcurl fake or hide my real IP address?
No. libcurl operates on a higher level. Besides, faking IP address would
- imply sending IP packet with a made-up source address, and then you normally
+ imply sending IP packets with a made-up source address, and then you normally
get a problem with receiving the packet sent back as they would then not be
routed to you!
@@ -1381,7 +1360,7 @@ FAQ
libcurl is a C library, it doesn't know anything about C++ member functions.
- You can overcome this "limitation" with a relative ease using a static
+ You can overcome this "limitation" with relative ease using a static
member function that is passed a pointer to the class:
// f is the pointer to your object.
diff --git a/docs/FEATURES b/docs/FEATURES
index 24fa56dd..39ac3904 100644
--- a/docs/FEATURES
+++ b/docs/FEATURES
@@ -185,7 +185,7 @@ FOOTNOTES
*1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, WinSSL (native
Windows), Secure Transport (native iOS/OS X) or GSKit (native IBM i)
- *2 = requires OpenLDAP
+ *2 = requires OpenLDAP or WinLDAP
*3 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) or
SSPI (native Windows)
*4 = requires a GSS-API implementation, however, only Windows SSPI is
diff --git a/docs/HISTORY.md b/docs/HISTORY.md
index ac93b674..551e7d25 100644
--- a/docs/HISTORY.md
+++ b/docs/HISTORY.md
@@ -4,11 +4,11 @@ How curl Became Like This
Towards the end of 1996, Daniel Stenberg was spending time writing an IRC bot
for an Amiga related channel on EFnet. He then came up with the idea to make
currency-exchange calculations available to Internet Relay Chat (IRC)
-users. All the necessary data are published on the Web; he just needed to
+users. All the necessary data were published on the Web; he just needed to
automate their retrieval.
Daniel simply adopted an existing command-line open-source tool, httpget, that
-Brazilian Rafael Sagula had written and recently release version 0.1 of. After
+Brazilian Rafael Sagula had written and recently released version 0.1 of. After
a few minor adjustments, it did just what he needed.
1997
@@ -35,14 +35,14 @@ was revealed to us much later.)
SSL support was added, powered by the SSLeay library.
-August, first announcement of curl on freshmeat.net.
+August: first announcement of curl on freshmeat.net.
-October, with the curl 4.9 release and the introduction of cookie support,
+October: with the curl 4.9 release and the introduction of cookie support,
curl was no longer released under the GPL license. Now we're at 4000 lines of
code, we switched over to the MPL license to restrict the effects of
"copyleft".
-November, configure script and reported successful compiles on several
+November: configure script and reported successful compiles on several
major operating systems. The never-quite-understood -F option was added and
curl could now simulate quite a lot of a browser. TELNET support was added.
@@ -52,30 +52,30 @@ page. People started making Linux RPM packages out of it.
1999
----
-January, DICT support added.
+January: DICT support added.
-OpenSSL took over where SSLeay was abandoned.
+OpenSSL took over and SSLeay was abandoned.
-May, first Debian package.
+May: first Debian package.
-August, LDAP:// and FILE:// support added. The curl web site gets 1300 visits
+August: LDAP:// and FILE:// support added. The curl web site gets 1300 visits
weekly. Moved site to curl.haxx.nu.
-Released curl 6.0 in September. 15000 lines of code.
+September: Released curl 6.0. 15000 lines of code.
-December 28, added the project on Sourceforge and started using its services
+December 28: added the project on Sourceforge and started using its services
for managing the project.
2000
----
-Spring 2000, major internal overhaul to provide a suitable library interface.
+Spring: major internal overhaul to provide a suitable library interface.
The first non-beta release was named 7.1 and arrived in August. This offered
the easy interface and turned out to be the beginning of actually getting
-other software and programs to get based on and powered by libcurl. Almost
+other software and programs to be based on and powered by libcurl. Almost
20000 lines of code.
-June 2000: the curl site moves to "curl.haxx.se"
+June: the curl site moves to "curl.haxx.se"
August, the curl web site gets 4000 visits weekly.
@@ -84,41 +84,40 @@ party libcurl binding showed up. CURL has been a supported module in PHP since
the release of PHP 4.0.2. This would soon get followers. More than 16
different bindings exist at the time of this writing.
-September, kerberos4 support was added.
+September: kerberos4 support was added.
-In November started the work on a test suite for curl. It was later re-written
+November: started the work on a test suite for curl. It was later re-written
from scratch again. The libcurl major SONAME number was set to 1.
2001
----
-January, Daniel released curl 7.5.2 under a new license again: MIT (or
-MPL). The MIT license is extremely liberal and can be used combined with GPL
+January: Daniel released curl 7.5.2 under a new license again: MIT (or
+MPL). The MIT license is extremely liberal and can be combined with GPL
in other projects. This would finally put an end to the "complaints" from
people involved in GPLed projects that previously were prohibited from using
libcurl while it was released under MPL only. (Due to the fact that MPL is
deemed "GPL incompatible".)
-curl supports HTTP 1.1 starting with the release of 7.7, March 22 2001. This
+March 22: curl supports HTTP 1.1 starting with the release of 7.7. This
also introduced libcurl's ability to do persistent connections. 24000 lines of
code. The libcurl major SONAME number was bumped to 2 due to this overhaul.
+The first experimental ftps:// support was added.
-The first experimental ftps:// support was added in March 2001.
-
-August. curl is bundled in Mac OS X, 10.1. It was already becoming more and
+August: curl is bundled in Mac OS X, 10.1. It was already becoming more and
more of a standard utility of Linux distributions and a regular in the BSD
ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
-never since got in touch again.
+never since got back in touch again.
-September, libcurl 7.9 introduces cookie jar and curl_formadd(). During the
+September: libcurl 7.9 introduces cookie jar and curl_formadd(). During the
forthcoming 7.9.x releases, we introduced the multi interface slowly and
-without much whistles.
+without many whistles.
2002
----
-June, the curl web site gets 13000 visits weekly. curl and libcurl is
+June: the curl web site gets 13000 visits weekly. curl and libcurl is
35000 lines of code. Reported successful compiles on more than 40 combinations
of CPUs and operating systems.
@@ -127,15 +126,15 @@ impossible. Around 5000 downloaded packages each week from the main site gives
a hint, but the packages are mirrored extensively, bundled with numerous OS
distributions and otherwise retrieved as part of other software.
-September, with the release of curl 7.10 it is released under the MIT license
+September: with the release of curl 7.10 it is released under the MIT license
only.
2003
----
-January. Started working on the distributed curl tests. The autobuilds.
+January: Started working on the distributed curl tests. The autobuilds.
-February, the curl site averages at 20000 visits weekly. At any given moment,
+February: the curl site averages at 20000 visits weekly. At any given moment,
there's an average of 3 people browsing the curl.haxx.se site.
Multiple new authentication schemes are supported: Digest (May), NTLM (June)
@@ -144,7 +143,7 @@ and Negotiate (June).
November: curl 7.10.8 is released. 45000 lines of code. ~55000 unique visitors
to the curl.haxx.se site. Five official web mirrors.
-December, full-fledged SSL for FTP is supported.
+December: full-fledged SSL for FTP is supported.
2004
----
@@ -158,18 +157,18 @@ curl_formparse() function
August: Curl and libcurl 7.12.1
- Public curl release number: 82
+ Public curl release number: 82
Releases counted from the very beginning: 109
- Available command line options: 96
+ Available command line options: 96
Available curl_easy_setopt() options: 120
- Number of public functions in libcurl: 36
- Amount of public web site mirrors: 12
- Number of known libcurl bindings: 26
+ Number of public functions in libcurl: 36
+ Amount of public web site mirrors: 12
+ Number of known libcurl bindings: 26
2005
----
-April. GnuTLS can now optionally be used for the secure layer when curl is
+April: GnuTLS can now optionally be used for the secure layer when curl is
built.
April: Added the multi_socket() API
@@ -183,8 +182,8 @@ December: security vulnerability: libcurl URL Buffer Overflow
2006
----
-January. We dropped support for Gopher. We found bugs in the implementation
-that turned out having been introduced years ago, so with the conclusion that
+January: We dropped support for Gopher. We found bugs in the implementation
+that turned out to have been introduced years ago, so with the conclusion that
nobody had found out in all this time we removed it instead of fixing it.
March: security vulnerability: libcurl TFTP Packet Buffer Overflow
@@ -208,8 +207,8 @@ November:
Command line options: 128
curl_easy_setopt() options: 158
- Public functions in libcurl: 58
- Known libcurl bindings: 37
+ Public functions in libcurl: 58
+ Known libcurl bindings: 37
Contributors: 683
145,000 unique visitors. >100 GB downloaded.
@@ -242,11 +241,11 @@ August:
Public curl releases: 117
Command line options: 138
curl_easy_setopt() options: 180
- Public functions in libcurl: 58
- Known libcurl bindings: 39
+ Public functions in libcurl: 58
+ Known libcurl bindings: 39
Contributors: 808
- Gopher support added (re-added actually)
+ Gopher support added (re-added actually, see January 2006)
2012
----
diff --git a/docs/INSTALL.cmake b/docs/INSTALL.cmake
new file mode 100644
index 00000000..abdfb46b
--- /dev/null
+++ b/docs/INSTALL.cmake
@@ -0,0 +1,91 @@
+ _ _ ____ _
+ ___| | | | _ \| |
+ / __| | | | |_) | |
+ | (__| |_| | _ <| |___
+ \___|\___/|_| \_\_____|
+
+ How To Compile with CMake
+
+Building with CMake
+==========================
+ This document describes how to compile, build and install curl and libcurl
+ from source code using the CMake build tool. To build with CMake, you will
+ of course have to first install CMake. The minimum required version of
+ CMake is specified in the file CMakeLists.txt found in the top of the curl
+ source tree. Once the correct version of CMake is installed you can follow
+ the instructions below for the platform you are building on.
+
+ CMake builds can be configured either from the command line, or from one
+ of CMake's GUI's.
+
+Current flaws in the curl CMake build
+=====================================
+
+ Missing features in the cmake build:
+
+ - Builds libcurl without large file support
+ - Does not support all SSL libraries (only OpenSSL, WinSSL, DarwinSSL, and
+ mbed TLS)
+ - Doesn't build with SCP and SFTP support (libssh2) (see issue #1155)
+ - Doesn't allow different resolver backends (no c-ares build support)
+ - No RTMP support built
+ - Doesn't allow build curl and libcurl debug enabled
+ - Doesn't allow a custom CA bundle path
+ - Doesn't allow you to disable specific protocols from the build
+ - Doesn't find or use krb4 or GSS
+ - Rebuilds test files too eagerly, but still can't run the tests
+ - Does't detect the correct strerror_r flavor when cross-compiling (issue #1123)
+
+
+Command Line CMake
+==================
+ A CMake build of curl is similar to the autotools build of curl. It
+ consists of the following steps after you have unpacked the source.
+
+ 1. Create an out of source build tree parallel to the curl source
+ tree and change into that directory
+
+ $ mkdir curl-build
+ $ cd curl-build
+
+ 2. Run CMake from the build tree, giving it the path to the top of
+ the curl source tree. CMake will pick a compiler for you. If you
+ want to specify the compile, you can set the CC environment
+ variable prior to running CMake.
+
+ $ cmake ../curl
+ $ make
+
+ 3. Install to default location:
+
+ $ make install
+
+ (The test suite does not work with the cmake build)
+
+ccmake
+=========
+ CMake comes with a curses based interface called ccmake. To run ccmake on
+ a curl use the instructions for the command line cmake, but substitute
+ ccmake ../curl for cmake ../curl. This will bring up a curses interface
+ with instructions on the bottom of the screen. You can press the "c" key
+ to configure the project, and the "g" key to generate the project. After
+ the project is generated, you can run make.
+
+cmake-gui
+=========
+ CMake also comes with a Qt based GUI called cmake-gui. To configure with
+ cmake-gui, you run cmake-gui and follow these steps:
+ 1. Fill in the "Where is the source code" combo box with the path to
+ the curl source tree.
+ 2. Fill in the "Where to build the binaries" combo box with the path
+ to the directory for your build tree, ideally this should not be the
+ same as the source tree, but a parallel directory called curl-build or
+ something similar.
+ 3. Once the source and binary directories are specified, press the
+ "Configure" button.
+ 4. Select the native build tool that you want to use.
+ 5. At this point you can change any of the options presented in the
+ GUI. Once you have selected all the options you want, click the
+ "Generate" button.
+ 6. Run the native build tool that you used CMake to generate.
+
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
index 610add65..6c2c8ce6 100644
--- a/docs/INSTALL.md
+++ b/docs/INSTALL.md
@@ -108,7 +108,7 @@ libressl.
- mbedTLS: `--without-ssl --with-mbedtls`
- axTLS: `--without-ssl --with-axtls`
- schannel: `--without-ssl --with-winssl`
- - secure transport: `--with-winssl --with-darwinssl`
+ - secure transport: `--without-ssl --with-darwinssl`
# Windows
@@ -247,7 +247,7 @@ 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 lib/Makefile.vc6
+ - 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
@@ -263,7 +263,7 @@ 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 lib/Makefile.vc6
+ - 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
@@ -278,8 +278,8 @@ before including any libcurl header. Your program does not need the
`USE_LWIPSOCK` preprocessor definition which is for libcurl internals only.
Compilation has been verified with [lwIP
-1.4.0](http://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip) and
-[contrib-1.4.0](http://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip).
+1.4.0](https://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip) and
+[contrib-1.4.0](https://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip).
This BSD-style lwIP TCP/IP stack support must be considered experimental given
that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl
diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md
index 77b993ec..2e273a9d 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -56,7 +56,7 @@ git
All changes to the sources are committed to the git repository as soon as
they're somewhat verified to work. Changes shall be committed as independently
- as possible so that individual changes can be easier spotted and tracked
+ as possible so that individual changes can be easily spotted and tracked
afterwards.
Tagging shall be used extensively, and by the time we release new archives we
@@ -88,7 +88,7 @@ Dependencies
- MIT Kerberos 1.2.4
- GSKit V5R3M0
- NSS 3.14.x
- - axTLS 1.2.7
+ - axTLS 2.1.0
- PolarSSL 1.3.0
- Heimdal ?
- nghttp2 1.0.0
@@ -98,7 +98,7 @@ Operating Systems
On systems where configure runs, we aim at working on them all - if they have
a suitable C compiler. On systems that don't run configure, we strive to keep
- curl running fine on:
+ curl running correctly on:
- Windows 98
- AS/400 V5R3M0
@@ -126,13 +126,13 @@ Build tools
Windows vs Unix
===============
- There are a few differences in how to program curl the unix way compared to
- the Windows way. The four perhaps most notable details are:
+ There are a few differences in how to program curl the Unix way compared to
+ the Windows way. Perhaps the four most notable details are:
1. Different function names for socket operations.
In curl, this is solved with defines and macros, so that the source looks
- the same at all places except for the header file that defines them. The
+ the same in all places except for the header file that defines them. The
macros in use are sclose(), sread() and swrite().
2. Windows requires a couple of init calls for the socket stuff.
@@ -142,7 +142,7 @@ Windows vs Unix
behaviour.
3. The file descriptors for network communication and file operations are
- not easily interchangeable as in unix.
+ not as easily interchangeable as in Unix.
We avoid this by not trying any funny tricks on file descriptors.
@@ -156,11 +156,11 @@ Windows vs Unix
conditionals that deal with features *should* instead be in the format
`#ifdef HAVE_THAT_WEIRD_FUNCTION`. Since Windows can't run configure scripts,
we maintain a `curl_config-win32.h` file in lib directory that is supposed to
- look exactly as a `curl_config.h` file would have looked like on a Windows
+ look exactly like a `curl_config.h` file would have looked like on a Windows
machine!
Generally speaking: always remember that this will be compiled on dozens of
- operating systems. Don't walk on the edge.
+ operating systems. Don't walk on the edge!
<a name="Library"></a>
Library
@@ -250,8 +250,8 @@ Curl_readwrite()
Called during the transfer of the actual protocol payload.
- During transfer, the progress functions in lib/progress.c are called at a
- frequent interval (or at the user's choice, a specified callback might get
+ 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
verify that the transfer is as fast as required.
@@ -272,7 +272,7 @@ Curl_disconnect()
When doing normal connections and transfers, no one ever tries to close any
connections so this is not normally called when `curl_easy_perform()` is
used. This function is only used when we are certain that no more transfers
- is going to be made on the connection. It can be also closed by force, or
+ are going to be made on the connection. It can be also closed by force, or
it can be called to make sure that libcurl doesn't keep too many
connections alive at the same time.
@@ -290,7 +290,7 @@ HTTP(S)
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 means the same procedure as HTTP, with only two
+ 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
or write from the socket is different, although the latter fact is hidden in
the source by the use of `Curl_read()` for reading and `Curl_write()` for
@@ -301,8 +301,7 @@ HTTP(S)
An interesting detail with the HTTP(S) request, is the `Curl_add_buffer()`
series of functions we use. They append data to one single buffer, and when
- the building is done the entire request is sent off in one single write. This
- is done this way to overcome problems with flawed firewalls and lame servers.
+ the building is finished the entire request is sent off in one single write. This is done this way to overcome problems with flawed firewalls and lame servers.
<a name="ftp"></a>
FTP
@@ -396,12 +395,12 @@ Persistent Connections
- When libcurl is told to perform a transfer, it first checks for an already
existing connection in the cache that we can use. Otherwise it creates a
- new one and adds that the cache. If the cache is full already when a new
- connection is added added, it will first close the oldest unused one.
+ new one and adds that to the cache. If the cache is full already when a new
+ connection is added, it will first close the oldest unused one.
- When the transfer operation is complete, the connection is left
open. Particular options may tell libcurl not to, and protocols may signal
- closure on connections and then they won't be kept open of course.
+ closure on connections and then they won't be kept open, of course.
- When `curl_easy_cleanup()` is called, we close all still opened connections,
unless of course the multi interface "owns" the connections.
@@ -414,7 +413,7 @@ multi interface/non-blocking
============================
The multi interface is a non-blocking interface to the library. To make that
- interface work as good as possible, no low-level functions within libcurl
+ interface work as well as possible, no low-level functions within libcurl
must be written to work in a blocking manner. (There are still a few spots
violating this rule.)
@@ -465,7 +464,7 @@ Return Codes and Informationals
description.
In aiding the user to understand what's happening and to debug curl usage, we
- must supply a fair amount of informational messages by using the
+ must supply a fair number of informational messages by using the
`Curl_infof()` function. Those messages are only displayed when the user
explicitly asks for them. They are best used when revealing information that
isn't otherwise obvious.
@@ -489,7 +488,7 @@ Client
functions used for the URL-"globbing" support. Globbing in the sense that the
{} and [] expansion stuff is there.
- The client mostly messes around to setup 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.
@@ -542,13 +541,13 @@ Test Suite
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.
+ 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.
The test suite automatically detects if curl was built with the memory
- debugging enabled, and if it was it will detect memory leaks, too.
+ debugging enabled, and if it was, it will detect memory leaks, too.
<a name="asyncdns"></a>
Asynchronous name resolves
@@ -633,8 +632,8 @@ Future
Several functions will be removed from the public `curl_` name space in a
future libcurl release. They will then only become available as `curlx_`
functions instead. To make the transition easier, we already today provide
- these functions with the `curlx_` prefix to allow sources to get built
- properly with the new function names. The functions this concerns are:
+ these functions with the `curlx_` prefix to allow sources to be built
+ properly with the new function names. The concerned functions are:
- `curlx_getenv`
- `curlx_strequal`
@@ -659,7 +658,7 @@ 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 of a set of
commonly available compression techniques. These schemes are 'deflate' (the
- zlib algorithm), 'gzip' and 'compress'. A client requests that the sever
+ zlib algorithm), 'gzip' 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
@@ -767,7 +766,7 @@ Track Down Memory Leaks
Rebuild libcurl with -DCURLDEBUG (usually, rerunning configure with
--enable-debug fixes this). 'make clean' first, then 'make' so that all
- files actually are rebuilt properly. It will also make sense to build
+ 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.
@@ -828,16 +827,16 @@ Track Down Memory Leaks
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 a struct to each easy handle in which we store
+ 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 time there is until the next nearest timer expires
+ 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) return the easy handle that waits for action on
+ 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).
@@ -949,8 +948,8 @@ for older and later versions as things don't change drastically that often.
until it should be checked - normally some sort of timeout. Each `Curl_easy`
has one node in the tree.
- `->sockhash` is a hash table to allow fast lookups of socket descriptor to
- which `Curl_easy` that uses that descriptor. This is necessary for the
+ `->sockhash` is a hash table to allow fast lookups of socket descriptor for
+ which `Curl_easy` uses that descriptor. This is necessary for the
`multi_socket` API.
`->conn_cache` points to the connection cache. It keeps track of all
@@ -973,8 +972,7 @@ for older and later versions as things don't change drastically that often.
to work with.
`->scheme` is the URL scheme name, usually spelled out in uppercase. That's
- "HTTP" or "FTP" etc. SSL versions of the protocol need its own `Curl_handler`
- setup so HTTPS separate from HTTP.
+ "HTTP" or "FTP" etc. SSL versions of the protocol need their own `Curl_handler` setup so HTTPS separate from HTTP.
`->setup_connection` is called to allow the protocol code to allocate
protocol specific data that then gets associated with that `Curl_easy` for
@@ -1035,11 +1033,11 @@ for older and later versions as things don't change drastically that often.
- `PROTOPT_CLOSEACTION` - this protocol has actions to do before closing the
connection. This flag is no longer used by code, yet still set for a bunch
- protocol handlers.
+ of protocol handlers.
- `PROTOPT_DIRLOCK` - "direction lock". The SSH protocols set this bit to
limit which "direction" of socket actions that the main engine will
- concern itself about.
+ concern itself with.
- `PROTOPT_NONETWORK` - a protocol that doesn't use network (read file:)
@@ -1060,7 +1058,7 @@ for older and later versions as things don't change drastically that often.
The libcurl share API allocates a `Curl_share` struct, exposed to the
external API as "CURLSH *".
- The idea is that the struct can have a set of own versions of caches and
+ 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
specific `Curl_easy`s will use the caches/pools that this share handle
holds.
@@ -1081,7 +1079,7 @@ for older and later versions as things don't change drastically that often.
[1]: https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
[2]: https://curl.haxx.se/libcurl/c/curl_easy_init.html
-[3]: http://c-ares.haxx.se/
+[3]: https://c-ares.haxx.se/
[4]: https://tools.ietf.org/html/rfc7230 "RFC 7230"
[5]: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html
[6]: https://curl.haxx.se/docs/manpage.html#--compressed
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index ff585c50..17731945 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -22,13 +22,12 @@ problems may have been fixed or changed somewhat since this was written!
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
- 1.12 HTTP/2 server push enabled when no pushes can be accepted
2. TLS
- 2.1 Hangs with PolarSSL
- 2.2 CURLINFO_SSL_VERIFYRESULT has limited support
- 2.3 DER in keychain
- 2.4 GnuTLS backend skips really long certificate fields
+ 2.1 CURLINFO_SSL_VERIFYRESULT has limited support
+ 2.2 DER in keychain
+ 2.3 GnuTLS backend skips really long certificate fields
+ 2.4 DarwinSSL won't import PKCS#12 client certificates without a password
3. Email protocols
3.1 IMAP SEARCH ALL truncated response
@@ -44,14 +43,12 @@ problems may have been fixed or changed somewhat since this was written!
5. Build and portability issues
5.1 Windows Borland compiler
5.2 curl-config --libs contains private details
- 5.3 libidn and old iconv
5.4 AIX shared build with c-ares fails
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 Fix the gcc typechecks
6. Authentication
6.1 NTLM authentication and unicode
@@ -161,7 +158,7 @@ problems may have been fixed or changed somewhat since this was written!
1.10 Strips trailing dot from host name
- When given a URL wit a trailing dot for the host name part:
+ 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.
@@ -186,7 +183,7 @@ problems may have been fixed or changed somewhat since this was written!
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 specificly configured to be a fine virtual host.
+ 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
@@ -205,41 +202,31 @@ problems may have been fixed or changed somewhat since this was written!
seem to fix the issue or even get called. See
https://github.com/curl/curl/issues/768
-1.12 HTTP/2 server push enabled when no pushes can be accepted
-
- If the easy interface is used, we can't accept any server pushes so we should
- switch off them already in the h2 settings as otherwise we risk wasting
- bandwidth when the server tries to send pushes libcurl will never accept.
-
- See https://github.com/curl/curl/issues/927
2. TLS
-2.1 Hangs with PolarSSL
-
- "curl_easy_perform hangs with imap and PolarSSL"
- https://github.com/curl/curl/issues/334
-
- Most likely, a fix similar to commit c111178bd4 (for mbedTLS) is
- necessary. Or if we just wait a little longer we'll rip out all support for
- PolarSSL instead...
-
-2.2 CURLINFO_SSL_VERIFYRESULT has limited support
+2.1 CURLINFO_SSL_VERIFYRESULT has limited support
CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS
backends, so relying on this information in a generic app is flaky.
-2.3 DER in keychain
+2.2 DER in keychain
Curl doesn't recognize certificates in DER format in keychain, but it works
with PEM. https://curl.haxx.se/bug/view.cgi?id=1065
-2.4 GnuTLS backend skips really long certificate fields
+2.3 GnuTLS backend skips really long certificate fields
libcurl calls gnutls_x509_crt_get_dn() with a fixed buffer size and if the
field is too long in the cert, it'll just return an error and the field will
be displayed blank.
+2.4 DarwinSSL won't import PKCS#12 client certificates without a password
+
+ libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that
+ function rejects certificates that do not have a password.
+ https://github.com/curl/curl/issues/1308
+
3. Email protocols
@@ -314,14 +301,6 @@ problems may have been fixed or changed somewhat since this was written!
run that might be needed only for building libcurl. Further, curl-config
--cflags suffers from the same effects with CFLAGS/CPPFLAGS.
-5.3 libidn and old iconv
-
- Test case 165 might fail on a system which has libidn present, but with an
- old iconv version (2.1.3 is a known bad version), since it doesn't recognize
- the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
- test pass, but instead makes it fail on Solaris hosts that use its native
- iconv.
-
5.4 AIX shared build with c-ares fails
curl version 7.12.2 fails on AIX if compiled with --enable-ares. The
@@ -384,14 +363,6 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/864
-5.10 Fix the gcc typechecks
-
- Issue #846 identifies a problem with the gcc-typechecks and how the types are
- documented and checked for CURLINFO_CERTINFO but our attempts to fix the
- issue were futile and needs more attention.
-
- https://github.com/curl/curl/issues/846
-
6. Authentication
6.1 NTLM authentication and unicode
@@ -409,7 +380,7 @@ problems may have been fixed or changed somewhat since this was written!
libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's
library header files exporting symbols/macros that should be kept private to
- the KfW library. See ticket #5601 at http://krbdev.mit.edu/rt/
+ the KfW library. See ticket #5601 at https://krbdev.mit.edu/rt/
6.3 NTLM in system context uses wrong name
diff --git a/docs/MAIL-ETIQUETTE b/docs/MAIL-ETIQUETTE
index 4d439aa4..897fc9f5 100644
--- a/docs/MAIL-ETIQUETTE
+++ b/docs/MAIL-ETIQUETTE
@@ -38,17 +38,17 @@ MAIL ETIQUETTE
Each mailing list is targeted to a specific set of users and subjects,
please use the one or the ones that suit you the most.
- Each mailing list have hundreds up to thousands of readers, meaning that
- each mail sent will be received and read by a very large amount of people.
+ Each mailing list has hundreds up to thousands of readers, meaning that
+ each mail sent will be received and read by a very large number of people.
People from various cultures, regions, religions and continents.
1.2 Netiquette
- Netiquette is a common name for how to behave on the internet. Of course, in
+ Netiquette is a common term for how to behave on the internet. Of course, in
each particular group and subculture there will be differences in what is
acceptable and what is considered good manners.
- This document outlines what we in the curl project considers to be good
+ This document outlines what we in the curl project consider to be good
etiquette, and primarily this focus on how to behave on and how to use our
mailing lists.
@@ -56,7 +56,7 @@ MAIL ETIQUETTE
Many people send one question to one person. One person gets many mails, and
there is only one person who can give you a reply. The question may be
- something that other people are also wanting to ask. These other people have
+ something that other people would also like to ask. These other people have
no way to read the reply, but to ask the one person the question. The one
person consequently gets overloaded with mail.
@@ -79,8 +79,8 @@ MAIL ETIQUETTE
1.5 Moderation of new posters
Several of the curl mailing lists automatically make all posts from new
- subscribers require moderation. This means that after you've subscribed and
- send your first mail to a list, that mail will not be let through to the
+ subscribers be moderated. This means that after you've subscribed and
+ sent your first mail to a list, that mail will not be let through to the
list until a mailing list administrator has verified that it is OK and
permits it to get posted.
@@ -104,9 +104,9 @@ MAIL ETIQUETTE
messages"
No matter what, we NEVER EVER respond to trolls or spammers on the list. If
- you believe the list admin should do something particular, contact him/her
- off-list. The subject will be taken care of as good as possible to prevent
- repeated offenses, but responding on the list to such messages never lead to
+ you believe the list admin should do something in particular, contact him/her
+ off-list. The subject will be taken care of as much as possible to prevent
+ repeated offenses, but responding on the list to such messages never leads to
anything good and only puts the light even more on the offender: which was
the entire purpose of it getting sent to the list in the first place.
@@ -114,16 +114,16 @@ MAIL ETIQUETTE
1.7 How to unsubscribe
- You unsubscribe the same way you subscribed in the first place. You go to
- the page for the particular mailing list you're subscribed to and you enter
+ You can unsubscribe the same way you subscribed in the first place. You go
+ to the page for the particular mailing list you're subscribed to and you enter
your email address and password and press the unsubscribe button.
- Also, this information is included in the headers of every mail that is sent
- out to all curl related mailing lists and there's a footer in each mail that
- links to the "admin" page on which you can unsubscribe and change other
- options.
+ Also, the instructions to unsubscribe are included in the headers of every
+ mail that is sent out to all curl related mailing lists and there's a footer
+ in each mail that links to the "admin" page on which you can unsubscribe and
+ change other options.
- You NEVER EVER email the mailing list requesting someone else to get you off
+ You NEVER EVER email the mailing list requesting someone else to take you off
the list.
1.8 I posted, now what?
@@ -132,35 +132,35 @@ MAIL ETIQUETTE
send the email, your post will just be silently discarded.
If you posted for the first time to the mailing list, you first need to wait
- for an administrator to allow your email to go through. This normally
+ for an administrator to allow your email to go through (moderated). This normally
happens very quickly but in case we're asleep, you may have to wait a few
hours.
Once your email goes through it is sent out to several hundred or even
- thousand recipients. Your email may cover an area that not that many people
+ thousands of recipients. Your email may cover an area that not that many people
know about or are interested in. Or possibly the person who knows about it
- is on vacation or under a very heavy work load right now. You have to wait
- for a response and you must not expect to get a response at all, but
+ is on vacation or under a very heavy work load right now. You may have to wait
+ for a response and you should not expect to get a response at all, but
hopefully you get an answer within a couple of days.
You do yourself and all of us a service when you include as many details as
possible already in your first email. Mention your operating system and
environment. Tell us which curl version you're using and tell us what you
did, what happened and what you expected would happen. Preferably, show us
- what you did in details enough to allow others to help point out the problem
- or repeat the same steps in their places.
+ what you did with details enough to allow others to help point out the problem
+ or repeat the same steps in their locations.
Failing to include details will only delay responses and make people respond
- and ask for the details and you have to send a follow-up email that includes
- them.
+ and ask for more details and you will have to send a follow-up email that
+ includes them.
- Expect the responses to primarily help YOU debug the issue, or ask you
+ Expect the responses to primarily help YOU debug the issue, or ask YOU
questions that can lead you or others towards a solution or explanation to
whatever you experience.
If you are a repeat offender to the guidelines outlined in this document,
chances are that people will ignore you at will and your chances to get
- responses will greatly diminish.
+ responses in the future will greatly diminish.
2. Sending mail
@@ -183,7 +183,7 @@ MAIL ETIQUETTE
We're actively discouraging replying back to the single person by setting
the Reply-To: field in outgoing mails back to the mailing list address,
- making it harder for people to mail the author only by mistake.
+ making it harder for people to mail the author directly, if only by mistake.
2.3 Use a Sensible Subject
@@ -198,7 +198,7 @@ MAIL ETIQUETTE
mail conversation below. It forces users to read the mail in a backwards
order to properly understand it.
- This is why top posting is so bad:
+ This is why top posting is so bad (in top posting order):
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
@@ -254,7 +254,7 @@ MAIL ETIQUETTE
If you are the one who asks, please consider responding once more in case
one of the hints was what solved your problems. The guys who write answers
feel good to know that they provided a good answer and that you fixed the
- problem. Far too often, the person who asked the question is never heard of
+ problem. Far too often, the person who asked the question is never heard from
again, and we never get to know if he/she is gone because the problem was
solved or perhaps because the problem was unsolvable!
diff --git a/docs/MANUAL b/docs/MANUAL
index 0ea3e61f..0e3db0ff 100644
--- a/docs/MANUAL
+++ b/docs/MANUAL
@@ -815,6 +815,10 @@ 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
@@ -830,6 +834,20 @@ LDAP
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:
@@ -848,8 +866,11 @@ ENVIRONMENT VARIABLES
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.
-
+ 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 uses 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.
diff --git a/docs/Makefile.am b/docs/Makefile.am
index a1e64b6a..086b8c15 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -22,33 +22,54 @@
AUTOMAKE_OPTIONS = foreign no-dependencies
-man_MANS = curl.1 curl-config.1
-noinst_man_MANS = mk-ca-bundle.1
+# EXTRA_DIST breaks with $(abs_builddir) so build it using this variable
+# but distribute it (using the relative file name) in the next variable
+man_MANS = $(abs_builddir)/curl.1
+noinst_man_MANS = curl.1 mk-ca-bundle.1
+dist_man_MANS = curl-config.1
GENHTMLPAGES = curl.html curl-config.html mk-ca-bundle.html
PDFPAGES = curl.pdf curl-config.pdf mk-ca-bundle.pdf
+MANDISTPAGES = curl.1.dist curl-config.1.dist
HTMLPAGES = $(GENHTMLPAGES) index.html
-SUBDIRS = examples libcurl cmdline-opts
+# Build targets in this file (.) before cmdline-opts to ensure that
+# the curl.1 rule below runs first
+SUBDIRS = . cmdline-opts
+DIST_SUBDIRS = $(SUBDIRS) examples libcurl
-CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
+CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) $(MANDISTPAGES) curl.1
-EXTRA_DIST = MANUAL BUGS CONTRIBUTE.md FAQ FEATURES INTERNALS.md SSLCERTS.md \
- README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS KNOWN_BUGS \
- BINDINGS.md $(man_MANS) HISTORY.md INSTALL INSTALL.md LICENSE-MIXING.md \
- README.netware MAIL-ETIQUETTE HTTP-COOKIES.md SECURITY.md RELEASE-PROCEDURE \
- SSL-PROBLEMS.md HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md \
- CHECKSRC.md
+EXTRA_DIST = MANUAL BUGS CONTRIBUTE.md FAQ FEATURES INTERNALS.md SSLCERTS.md \
+ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS KNOWN_BUGS \
+ BINDINGS.md HISTORY.md INSTALL INSTALL.md LICENSE-MIXING.md \
+ README.netware MAIL-ETIQUETTE HTTP-COOKIES.md SECURITY.md RELEASE-PROCEDURE \
+ SSL-PROBLEMS.md HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md \
+ CHECKSRC.md CMakeLists.txt README.md CIPHERS.md INSTALL.cmake README.cmake \
+ $(noinst_man_MANS)
MAN2HTML= roffit $< >$@
SUFFIXES = .1 .html .pdf
+# $(abs_builddir) is to disable VPATH when searching for this file, which
+# would otherwise find the copy in $(srcdir) which breaks the $(HUGE)
+# rule in src/Makefile.am in out-of-tree builds that references the file in the
+# build directory.
+#
+# First, seed the used copy of curl.1 with the prebuilt copy (in an out-of-tree
+# build), then run make recursively to rebuild it only if its dependencies
+# 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
+ cd cmdline-opts && $(MAKE)
+
html: $(HTMLPAGES)
- cd libcurl && make html
+ cd libcurl && $(MAKE) html
pdf: $(PDFPAGES)
- cd libcurl && make pdf
+ cd libcurl && $(MAKE) pdf
.1.html:
$(MAN2HTML)
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 8111f2c6..0c1ef3f8 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -111,7 +111,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = docs
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -132,8 +133,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -194,7 +194,7 @@ am__uninstall_files_from_dir = { \
}
man1dir = $(mandir)/man1
am__installdirs = "$(DESTDIR)$(man1dir)"
-MANS = $(man_MANS)
+MANS = $(dist_man_MANS) $(man_MANS)
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
am__recursive_targets = \
@@ -222,8 +222,8 @@ am__define_uniq_tagged_files = \
done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in INSTALL THANKS TODO
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in INSTALL \
+ THANKS TODO
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -264,6 +264,12 @@ 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@
@@ -303,6 +309,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -315,6 +323,7 @@ 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@
@@ -441,19 +450,29 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies
-man_MANS = curl.1 curl-config.1
-noinst_man_MANS = mk-ca-bundle.1
+
+# EXTRA_DIST breaks with $(abs_builddir) so build it using this variable
+# but distribute it (using the relative file name) in the next variable
+man_MANS = $(abs_builddir)/curl.1
+noinst_man_MANS = curl.1 mk-ca-bundle.1
+dist_man_MANS = curl-config.1
GENHTMLPAGES = curl.html curl-config.html mk-ca-bundle.html
PDFPAGES = curl.pdf curl-config.pdf mk-ca-bundle.pdf
+MANDISTPAGES = curl.1.dist curl-config.1.dist
HTMLPAGES = $(GENHTMLPAGES) index.html
-SUBDIRS = examples libcurl cmdline-opts
-CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
-EXTRA_DIST = MANUAL BUGS CONTRIBUTE.md FAQ FEATURES INTERNALS.md SSLCERTS.md \
- README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS KNOWN_BUGS \
- BINDINGS.md $(man_MANS) HISTORY.md INSTALL INSTALL.md LICENSE-MIXING.md \
- README.netware MAIL-ETIQUETTE HTTP-COOKIES.md SECURITY.md RELEASE-PROCEDURE \
- SSL-PROBLEMS.md HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md \
- CHECKSRC.md
+
+# Build targets in this file (.) before cmdline-opts to ensure that
+# the curl.1 rule below runs first
+SUBDIRS = . cmdline-opts
+DIST_SUBDIRS = $(SUBDIRS) examples libcurl
+CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) $(MANDISTPAGES) curl.1
+EXTRA_DIST = MANUAL BUGS CONTRIBUTE.md FAQ FEATURES INTERNALS.md SSLCERTS.md \
+ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS KNOWN_BUGS \
+ BINDINGS.md HISTORY.md INSTALL INSTALL.md LICENSE-MIXING.md \
+ README.netware MAIL-ETIQUETTE HTTP-COOKIES.md SECURITY.md RELEASE-PROCEDURE \
+ SSL-PROBLEMS.md HTTP2.md ROADMAP.md CODE_OF_CONDUCT.md CODE_STYLE.md \
+ CHECKSRC.md CMakeLists.txt README.md CIPHERS.md INSTALL.cmake README.cmake \
+ $(noinst_man_MANS)
MAN2HTML = roffit $< >$@
SUFFIXES = .1 .html .pdf
@@ -496,10 +515,10 @@ mostlyclean-libtool:
clean-libtool:
-rm -rf .libs _libs
-install-man1: $(man_MANS)
+install-man1: $(dist_man_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
@list1=''; \
- list2='$(man_MANS)'; \
+ list2='$(dist_man_MANS) $(man_MANS)'; \
test -n "$(man1dir)" \
&& test -n "`echo $$list1$$list2`" \
|| exit 0; \
@@ -534,7 +553,7 @@ uninstall-man1:
@$(NORMAL_UNINSTALL)
@list=''; test -n "$(man1dir)" || exit 0; \
files=`{ for i in $$list; do echo "$$i"; done; \
- l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
sed -n '/\.1[a-z]*$$/p'; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
@@ -816,11 +835,24 @@ uninstall-man: uninstall-man1
.PRECIOUS: Makefile
+# $(abs_builddir) is to disable VPATH when searching for this file, which
+# would otherwise find the copy in $(srcdir) which breaks the $(HUGE)
+# rule in src/Makefile.am in out-of-tree builds that references the file in the
+# build directory.
+#
+# First, seed the used copy of curl.1 with the prebuilt copy (in an out-of-tree
+# build), then run make recursively to rebuild it only if its dependencies
+# 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
+ cd cmdline-opts && $(MAKE)
+
html: $(HTMLPAGES)
- cd libcurl && make html
+ cd libcurl && $(MAKE) html
pdf: $(PDFPAGES)
- cd libcurl && make pdf
+ cd libcurl && $(MAKE) pdf
.1.html:
$(MAN2HTML)
diff --git a/docs/README.cmake b/docs/README.cmake
new file mode 100644
index 00000000..084c1de6
--- /dev/null
+++ b/docs/README.cmake
@@ -0,0 +1,16 @@
+ _ _ ____ _
+ ___| | | | _ \| |
+ / __| | | | |_) | |
+ | (__| |_| | _ <| |___
+ \___|\___/|_| \_\_____|
+
+README.cmake
+ Read the README file first.
+
+ Curl contains CMake build files that provide a way to build Curl with the
+ CMake build tool (www.cmake.org). CMake is a cross platform meta build tool
+ that generates native makefiles and IDE project files. The CMake build
+ system can be used to build Curl on any of its supported platforms.
+
+ Read the INSTALL.cmake file for instructions on how to compile curl with
+ CMake.
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 00000000..56691fc4
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,12 @@
+![curl logo](https://cdn.rawgit.com/curl/curl-www/master/logo/curl-logo.svg)
+
+# Documentation
+
+You'll find a mix of various documentation in this directory and
+subdirectories, using several different formats. Some of them are not ideal
+for reading directly in your browser.
+
+If you'd rather see the rendered version of the documentation, check out the
+curl web site's [documentation section](https://curl.haxx.se/docs/) for
+general curl stuff or the [libcurl section](https://curl.haxx.se/libcurl/) for
+libcurl related documentation.
diff --git a/docs/README.netware b/docs/README.netware
index 12065f30..9028963f 100644
--- a/docs/README.netware
+++ b/docs/README.netware
@@ -11,17 +11,16 @@ README.netware
Curl has been successfully compiled with gcc / nlmconv on different flavours
of Linux as well as with the official Metrowerks CodeWarrior compiler.
While not being the main development target, a continuously growing share of
- curl users are NetWare-based, specially also consuming the lib from PHP.
+ curl users are NetWare-based, especially also consuming the lib from PHP.
- The unix-style man pages are tricky to read on windows, so therefore are all
- those pages converted to HTML as well as pdf, and included in the release
- archives.
+ The unix-style man pages are tricky to read on windows, so therefore all
+ those pages are also provided as web pages on the curl web site.
The main curl.1 man page is also "built-in" in the command line tool. Use a
command line similar to this in order to extract a separate text file:
curl -M >manual.txt
- Read the INSTALL file for instructions how to compile curl self.
+ Read the INSTALL file for instructions on how to compile curl self.
diff --git a/docs/README.win32 b/docs/README.win32
index cfd45dd2..00ca197f 100644
--- a/docs/README.win32
+++ b/docs/README.win32
@@ -12,15 +12,14 @@ README.win32
systems. While not being the main develop target, a fair share of curl users
are win32-based.
- The unix-style man pages are tricky to read on windows, so therefore are all
- those pages converted to HTML as well as pdf, and included in the release
- archives.
+ The unix-style man pages are tricky to read on windows, so therefore all
+ those pages are also provided as web pages on the curl web site.
The main curl.1 man page is also "built-in" in the command line tool. Use a
command line similar to this in order to extract a separate text file:
curl -M >manual.txt
- Read the INSTALL file for instructions how to compile curl self.
+ Read the INSTALL file for instructions on how to compile curl self.
diff --git a/docs/RELEASE-PROCEDURE b/docs/RELEASE-PROCEDURE
index 1b574526..5137f55d 100644
--- a/docs/RELEASE-PROCEDURE
+++ b/docs/RELEASE-PROCEDURE
@@ -83,10 +83,10 @@ Coming dates
Based on the description above, here are some planned release dates (at the
time of this writing):
-- September 7, 2016 (version 7.50.2)
-- November 2, 2016
-- December 28, 2016
-- February 22, 2017
-- April 19, 2017
-- June 14, 2017
+- June 14, 2017 (version 7.54.1)
- August 9, 2017
+- October 4, 2017
+- November 29, 2017
+- January 24, 2018
+- March 21, 2018
+- May 16, 2018
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 367130d3..1007ccb0 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -5,15 +5,6 @@ Roadmap of things Daniel Stenberg and Steve Holme want to work on next. It is
intended to serve as a guideline for others for information, feedback and
possible participation.
-HTTP/2
-------
-
-Improve performance. Measurements and tests have shown that in several cases
-doing transfers over HTTP/2 can be notably slower than the same transfer done
-over HTTP/1. Some of that difference can be attributed the inefficient window
-size handling currently in use but there are probably more to be learned and
-worked on to optimize this.
-
QUIC
----
@@ -25,15 +16,6 @@ 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.
-TLS 1.3
--------
-
-The new version of the TLS protocol is in the pipeline and will soon start to
-get used out in the wild. It offers some new interesting features and will
-need the TLS libraries to adapt and quite likely provide additional or
-modified APIs. libcurl needs to adapt accordingly.
-
-
HTTP cookies
------------
@@ -52,19 +34,17 @@ SRV records
How to find services for specific domains/hosts.
-HTTPS to proxy
---------------
-
-To avoid network traffic to/from the proxy getting snooped on. There's a git
-branch in the public git repository for this that we need to make sure works
-for all TLS backends and then merge!
-
curl_formadd()
--------------
make sure there's an easy handle passed in to `curl_formadd()`,
`curl_formget()` and `curl_formfree()` by adding replacement functions and
-deprecating the old ones to allow custom mallocs and more
+deprecating the old ones to allow custom mallocs and more.
+
+Or perhaps even better: revamp the formpost API completely while we're at it
+and making something that is easier to use and understand:
+
+ https://github.com/curl/curl/wiki/formpost-API-redesigned
Third-party SASL
----------------
@@ -120,18 +100,14 @@ Improve
2. curl -h output (considered overwhelming to users)
-3. we have > 170 command line options, is there a way to redo things to
+3. 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
-4. docs (considered "bad" by users but how do we make it better?)
-
- - split up curl.1
-
-5. authentication framework (consider merging HTTP and SASL authentication to
+4. authentication framework (consider merging HTTP and SASL authentication to
give one API for protocols to call)
-6. Perform some of the clean up from the TODO document, removing old
+5. 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
diff --git a/docs/SSLCERTS.md b/docs/SSLCERTS.md
index 7755609c..3fcd345b 100644
--- a/docs/SSLCERTS.md
+++ b/docs/SSLCERTS.md
@@ -161,3 +161,13 @@ disabled. Secure Transport on iOS will run OCSP checks on certificates unless
peer verification is disabled. Secure Transport on OS X will run either OCSP
or CRL checks on certificates if those features are enabled, and this behavior
can be adjusted in the preferences of Keychain Access.
+
+HTTPS proxy
+-----------
+
+Since version 7.52.0, curl can do HTTPS to the proxy separately from the
+connection to the server. This TLS connection is handled separately from the
+server connection so instead of `--insecure` and `--cacert` to control the
+certificate verification, you use `--proxy-insecure` and `--proxy-cacert`.
+With these options, you make sure that the TLS connection and the trust of the
+proxy can be kept totally separate from the TLS connection to the server.
diff --git a/docs/THANKS b/docs/THANKS
index 85374092..e3a2f8b4 100644
--- a/docs/THANKS
+++ b/docs/THANKS
@@ -19,10 +19,12 @@ Adam Tkac
Adrian Schuur
Adriano Meirelles
Ajit Dhumale
+Akhil Kedia
Aki Koskinen
Akos Pasztory
Akshay Vernekar
Alain Danteny
+Alan Jenkins
Alan Pinstein
Albert Chin-A-Young
Albert Choy
@@ -30,6 +32,7 @@ Ale Vesely
Alejandro Alvarez Ayllon
Aleksandar Milivojevic
Aleksey Tulinov
+Ales Mlakar
Ales Novak
Alessandro Ghedini
Alessandro Vesely
@@ -71,6 +74,7 @@ Anatoli Tubman
Anders Bakken
Anders Gustafsson
Anders Havn
+Anders Roxell
Andi Jahja
Andre Guibert de Bruet
Andre Heinecke
@@ -81,6 +85,7 @@ Andreas Malzahn
Andreas Ntaflos
Andreas Olsson
Andreas Rieke
+Andreas Roth
Andreas Schuldei
Andreas Streichardt
Andreas Wurf
@@ -94,6 +99,7 @@ Andrew Biggs
Andrew Bushnell
Andrew Francis
Andrew Fuller
+Andrew Krieger
Andrew Kurushin
Andrew Moise
Andrew Robbins
@@ -110,12 +116,15 @@ Anthon Pang
Anthony Avina
Anthony Bryan
Anthony G. Basile
+Antoine Aubert
Antoine Calando
Anton Bychkov
Anton Kalmykov
Anton Malov
Anton Yabchinskiy
Antonio Larrosa
+Antony74 on github
+Antti Hätälä
Arkadiusz Miskiewicz
Armel Asselin
Arnaud Compan
@@ -152,6 +161,7 @@ Benoit Neil
Benoit Sigoure
Bernard Leak
Bernard Spil
+Bernhard M. Wiedemann
Bernhard Reutner-Fischer
Bert Huijben
Bertrand Demiddelaer
@@ -182,6 +192,8 @@ Brandon Wang
Brendan Jurd
Brent Beardsley
Brian Akins
+Brian Carpenter
+Brian Childs
Brian Chrisman
Brian Dessent
Brian J. Murrell
@@ -198,8 +210,11 @@ Bryan Henderson
Bryan Kemp
Byrial Jensen
Cameron Kaiser
+Cameron MacMinn
Camille Moncelier
Caolan McNamara
+Carlo Cannas
+Carlo Teubner
Carlo Wood
Carsten Lange
Casey O'Donnell
@@ -212,9 +227,11 @@ Chen Prog
Chih-Chung Chang
Chris "Bob Bob"
Chris Araman
+Chris Carlmar
Chris Combes
Chris Conlon
Chris Deidun
+Chris Faherty
Chris Flerackers
Chris Gaukroger
Chris Maltby
@@ -238,6 +255,7 @@ Christopher Conroy
Christopher Palow
Christopher R. Palmer
Christopher Stone
+Chungtsun Li
Ciprian Badescu
Claes Jakobsson
Clarence Gardner
@@ -276,6 +294,7 @@ Dan C
Dan Cristian
Dan Donahue
Dan Fandrich
+Dan Jacobson
Dan Locks
Dan McNulty
Dan Nelson
@@ -292,6 +311,7 @@ Daniel Kahn Gillmor
Daniel Lee Hwang
Daniel Melani
Daniel Mentz
+Daniel Romero
Daniel Schauenberg
Daniel Seither
Daniel Shahaf
@@ -299,6 +319,7 @@ Daniel Steinberg
Daniel Stenberg
Daniel Theron
Daniel at touchtunes
+Daphne Luong
Darryl House
Darshan Mody
Darío Hereñú
@@ -316,6 +337,7 @@ David Binderman
David Blaikie
David Byron
David Cohen
+David E. Narváez
David Eriksson
David Houlder
David Hull
@@ -345,6 +367,7 @@ Dengminwen
Denis Feklushkin
Dennis Clarke
Derek Higgins
+Desmond O. Chang
Detlef Schmier
Didier Brisebourg
Diego Bes
@@ -364,6 +387,7 @@ Dmitriy Sergeyev
Dmitry Bartsevich
Dmitry Eremin-Solenikov
Dmitry Falko
+Dmitry Kostjuchenko
Dmitry Kurochkin
Dmitry Popov
Dmitry Rechkin
@@ -371,6 +395,7 @@ Dmitry S. Baikov
Dolbneff A.V
Domenico Andreoli
Dominick Meglio
+Dominik Hölzl
Dominique Leuenberger
Doug Kaufman
Doug Porter
@@ -385,15 +410,19 @@ Duane Cathey
Duncan Mac-Vicar Prett
Dustin Boswell
Dusty Mabe
+Dwarakanath Yadavalli
Dylan Ellicott
Dylan Salisbury
+Dániel Bakai
Early Ehlinger
Ebenezer Ikonne
Ed Morley
Edin Kadribasic
Eduard Bloch
+Edward Kimmel
Edward Rudd
Edward Sheldrake
+Edward Thomson
Eelco Dolstra
Eetu Ojanen
Egon Eckert
@@ -404,8 +433,10 @@ Emanuele Bovisio
Emil Lerner
Emil Romanus
Emiliano Ida
+Emmanuel Tychon
Enrico Scholz
Enrik Berkhan
+Eramoto Masaya
Eric Cooper
Eric Hu
Eric Landes
@@ -430,6 +461,8 @@ Erwin Authried
Ethan Glasser Camp
Eugene Kotlyarov
Evan Jordan
+Even Rouault
+Evert Pot
Evgeny Grin
Evgeny Turnaev
Eygene Ryabinkin
@@ -438,6 +471,7 @@ Fabian Hiernaux
Fabian Keil
Fabian Ruff
Fabrizio Ammollo
+Fahim Chandurwala
Fedor Karpelevitch
Feist Josselin
Felix Yan
@@ -449,6 +483,7 @@ Florian Schoppmann
Florian Weimer
Forrest Cahoon
Francisco Moraes
+Francois Petitjean
Frank Gevaerts
Frank Hempel
Frank Keeney
@@ -463,6 +498,7 @@ Fred New
Fred Noz
Fred Stluka
Frederic Lepied
+Frederik B
Fredrik Thulin
Gabriel Kuri
Gabriel Sjoberg
@@ -493,6 +529,7 @@ Gilles Blanc
Gisle Vanem
Giuseppe Attardi
Giuseppe D'Ambrosio
+Giuseppe Persico
Glen A Johnson Jr.
Glen Nakamura
Glen Scott
@@ -507,6 +544,7 @@ Greg Hewgill
Greg Morse
Greg Onufer
Greg Pratt
+Greg Rowe
Greg Zavertnik
Gregory Szorc
Grigory Entin
@@ -517,12 +555,14 @@ Guillaume Arluison
Gunter Knauf
Gustaf Hui
Gustavo Grieco
+GwanYeong Kim
Gwenole Beauchesne
Gökhan Şengün
Götz Babin-Ebell
Hamish Mackenzie
Hang Kin Lau
Hang Su
+Hannes Magnusson
Hanno Böck
Hanno Kranzhoff
Hans Steegers
@@ -536,6 +576,7 @@ He Qin
Heikki Korpela
Heinrich Ko
Heinrich Schaefer
+Helmut K. C. Tessarek
Helwing Lutz
Hendrik Visage
Henrik Gaßmann
@@ -579,7 +620,9 @@ Jacob Moshenko
Jactry Zeng
Jad Chamcham
Jaime Fullaondo
+Jakub Wilk
Jakub Zakrzewski
+James Atwill
James Bursa
James Cheng
James Clancy
@@ -596,6 +639,7 @@ Jan Ehrhardt
Jan Koen Annot
Jan Kunder
Jan Schaumann
+Jan Schmidt
Jan Van Boghout
Jared Jennings
Jared Lundell
@@ -610,6 +654,7 @@ Javier G. Sogo
Jay Austin
Jayesh A Shah
Jaz Fresh
+Jean Gressmann
Jean Jacques Drouin
Jean-Claude Chauve
Jean-Francois Bertrand
@@ -632,6 +677,7 @@ Jeremy Friesner
Jeremy Huddleston
Jeremy Lin
Jeremy Pearson
+Jeremy Tan
Jeroen Koekkoek
Jeroen Ooms
Jerome Muffat-Meridol
@@ -641,6 +687,7 @@ Jerry Krinock
Jerry Wu
Jes Badwal
Jesper Jensen
+Jesse Chisholm
Jesse Noller
Jesse Tan
Jie He
@@ -651,7 +698,7 @@ Jim Meyering
Jiri Dvorak
Jiri Hruska
Jiri Jaburek
-Jiri Malak
+Jiří Malák
Jocelyn Jaubert
Joe Halpin
Joe Malicki
@@ -714,6 +761,7 @@ Josef Wolf
Josh Kapell
Joshua Kwan
Josue Andrade Gomes
+Jozef Kralik
Juan Barreto
Juan F. Codagnone
Juan Ignacio Hervás
@@ -729,6 +777,7 @@ Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino
Jurij Smakov
+Justin Clift
Justin Ehlert
Justin Fletcher
Justin Karneges
@@ -761,9 +810,11 @@ Kent Boortz
Keshav Krity
Kevin Baughman
Kevin Fisk
+Kevin Ji
Kevin Lussier
Kevin Reed
Kevin Roth
+Kim Minjoong
Kim Rinnewitz
Kim Vandry
Kimmo Kinnunen
@@ -780,10 +831,12 @@ Kurt Fankhauser
Kyle J. McKay
Kyle L. Huff
Kyle Sallee
+Kyselgov E.N
Lachlan O'Dea
Larry Campbell
Larry Fahnoe
Larry Lin
+Larry Stefani
Larry Stone
Lars Buitinck
Lars Gustafsson
@@ -814,6 +867,7 @@ Lior Kaplan
Lisa Xu
Liviu Chircu
Liza Alenchery
+Lloyd Fournier
Lluís Batlle i Rossell
Loic Dachary
Loren Kirkby
@@ -836,6 +890,7 @@ Lyndon Hill
Maciej Karpiuk
Maciej Puzio
Maciej W. Rozycki
+Mahmoud Samir Fayed
Maks Naumov
Maksim Kuzevanov
Maksim Stsepanenka
@@ -850,6 +905,7 @@ Marc Hesse
Marc Hörsken
Marc Kleine-Budde
Marc Renault
+Marc-Antoine Perennou
Marcel Raad
Marcel Roelofs
Marcelo Echeverria
@@ -860,6 +916,7 @@ Marcin Konicki
Marco Deckel
Marco G. Salvagno
Marco Maggi
+Marcus Hoffmann
Marcus Sundberg
Marcus Webster
Mario Schroeder
@@ -880,6 +937,7 @@ Markus Elfring
Markus Koetter
Markus Moeller
Markus Oberhumer
+Markus Westerlind
Marquis de Muesli
Martijn Koster
Martin C. Martin
@@ -888,6 +946,7 @@ Martin Frodl
Martin Hager
Martin Hedenfalk
Martin Jansen
+Martin Kepplinger
Martin Lemke
Martin Skinner
Martin Storsjö
@@ -905,6 +964,7 @@ Matt Kraai
Matt Veenstra
Matt Witherspoon
Matt Wixson
+Matteo B.
Matteo Rocco
Matthew Blain
Matthew Clarke
@@ -913,7 +973,9 @@ Matthias Bolte
Maurice Barnum
Mauro Iorio
Mauro Rappa
+Max Dymond
Max Katsev
+Max Khon
Maxim Ivanov
Maxim Perenesenko
Maxim Prohorov
@@ -933,6 +995,7 @@ Michael Jerris
Michael Kalinin
Michael Kaufmann
Michael König
+Michael Maltese
Michael Mealling
Michael Mueller
Michael Osipov
@@ -966,6 +1029,7 @@ Mike Protts
Mike Revi
Miklos Nemeth
Miloš Ljumović
+Mingliang Zhu
Miroslav Franc
Miroslav Spousta
Mitz Wark
@@ -984,13 +1048,17 @@ Nathaniel Waisbrot
Naveen Chandran
Naveen Noel
Neal Poole
+Nehal J Wani
Neil Bowers
Neil Dunbar
+Neil Kolban
Neil Spring
Nic Roets
Nicholas Maniscalco
+Nick Draffen
Nick Gimbrone
Nick Humfrey
+Nick Miyake
Nick Zitzmann
Nico Baggus
Nicolas Berloquin
@@ -1031,8 +1099,10 @@ Ori Avtalion
Oscar Koeroo
Oscar Norlander
P R Schaffner
+Palo Markovic
Paolo Piacentini
Paras Sethia
+Pascal Gaudette
Pascal Terjan
Pasha Kuznetsov
Pasi Karkkainen
@@ -1050,6 +1120,7 @@ Patrik Thunstrom
Pau Garcia i Quiles
Paul Donohue
Paul Harrington
+Paul Harris
Paul Howarth
Paul Joyce
Paul Marks
@@ -1062,6 +1133,7 @@ Paul Saab
Pavel Cenek
Pavel Orehov
Pavel Raiskup
+Pavel Rochnyak
Pawel A. Gajda
Pawel Kierski
Pedro Larroy
@@ -1091,6 +1163,7 @@ Petr Bahula
Petr Novak
Petr Pisar
Phil Blundell
+Phil Crump
Phil Karn
Phil Lisiecki
Phil Pellouchoud
@@ -1105,14 +1178,17 @@ Pierre Brico
Pierre Chapuis
Pierre Joye
Pierre Ynard
+Piotr Dobrogost
Pooyan McSporran
Pramod Sharma
Prash Dush
+Praveen Pvs
Priyanka Shah
Puneet Pawaia
Quagmire
Quanah Gibson-Mount
Quinn Slack
+R. Dennis Steed
Radu Simionescu
Rafa Muyo
Rafael Antonio
@@ -1161,11 +1237,13 @@ Richard Cooper
Richard Gorton
Richard Gray
Richard Hosking
+Richard Hsu
Richard Michael
Richard Moore
Richard Prescott
Richard Silverman
Richard van den Berg
+Richy Kim
Rick Jones
Rick Richardson
Ricki Hirner
@@ -1173,6 +1251,7 @@ Rider Linden
Rob Crittenden
Rob Davies
Rob Jones
+Rob Sanders
Rob Stanzel
Rob Ward
Robert A. Monat
@@ -1201,6 +1280,7 @@ Romain Coltel
Roman Koifman
Roman Mamedov
Romulo A. Ceccon
+Ron Eldor
Ron Parker
Ron Zapp
Ronnie Mose
@@ -1214,6 +1294,8 @@ Ryan Chan
Ryan Nelson
Ryan Schmidt
Ryan Scott
+Ryan Winograd
+Ryuichi KAWAMATA
Rémy Léone
S. Moonesamy
Salvador Dávila
@@ -1241,6 +1323,7 @@ Scott Cantor
Scott Davis
Scott McCreary
Sean Boudreau
+Sean Burford
Sebastian Mundry
Sebastian Pohlschmidt
Sebastian Rasmussen
@@ -1248,11 +1331,13 @@ Senthil Raja Velu
Sergei Kuzmin
Sergei Nikulov
Sergey Tatarincev
+Sergii Pylypenko
Sergio Ballestrero
Serj Kalichev
Seshubabu Pasam
Seth Mos
Sh Diao
+Shachaf Ben-Kiki
Shao Shuchao
Sharad Gupta
Shard
@@ -1291,7 +1376,9 @@ Stephen Brokenshire
Stephen Collyer
Stephen Kick
Stephen More
+Stephen Toub
Sterling Hughes
+Steve Brokenshire
Steve Green
Steve H Truong
Steve Havelka
@@ -1307,11 +1394,13 @@ Steven Gu
Steven M. Schweda
Steven Parkes
Stoned Elipot
+Stuart Henderson
Sune Ahlgren
Sven Anders
Sven Neuhaus
Sven Wegener
Svyatoslav Mishyn
+Sylvestre Ledru
Symeon Paraschoudis
Sébastien Willemijns
T. Bharath
@@ -1323,6 +1412,7 @@ Tanguy Fautre
Tatsuhiro Tsujikawa
Temprimus
Terri Oda
+TheAssassin at github
Theodore Dubois
Thomas Braun
Thomas Glanzmann
@@ -1350,6 +1440,7 @@ Tim Stack
Tim Starling
Timo Sirainen
Timotej Lazar
+Timothe Litt
Timothy Polich
Tinus van den Berg
Tobias Markus
@@ -1392,6 +1483,7 @@ Toshio Kuratomi
Toshiyuki Maezawa
Traian Nicolescu
Travis Burtrum
+Travis Obenhaus
Troels Walsted Hansen
Troy Engel
Tupone Alfredo
@@ -1405,12 +1497,14 @@ Ulrich Zadow
Valentin David
Vasy Okhin
Venkat Akella
+Venkataramana Mokkapati
Victor Snezhko
Vijay Panghal
Vikram Saxena
Viktor Szakáts
Ville Skyttä
Vilmos Nebehaj
+Vincas Razma
Vincent Bronner
Vincent Le Normand
Vincent Penquerc'h
@@ -1435,6 +1529,7 @@ Werner Koch
Wesley Laxton
Wesley Miaw
Wez Furlong
+Wham Bang
Wilfredo Sanchez
Will Dietz
Willem Sparreboom
@@ -1468,19 +1563,36 @@ afrind on github
asavah on github
baumanj on github
bsammon on github
+canavan at github
+destman at github
dkjjr89 on github
eXeC64 on github
+jonrumsey at github
+jonrumsey on github
jveazey on github
+ka7 on github
kreshano on github
+lijian996 on github
lukaszgn on github
+madblobfish on github
marc-groundctl on github
+mccormickt12 on github
+mkzero on github
neex on github
+neheb on github
nk
nopjmp on github
+olesteban at github
+ovidiu-benea on github
silveja1 on github
+stootill at github
swalkaus at yahoo.com
+tarek112 on github
tommink[at]post.pl
vanillajonathan on github
wmsch on github
+wyattoday at github
+zelinchen on github
+İsmail Dönmez
Štefan Kremeň
Ðикита Дорохин
diff --git a/docs/TODO b/docs/TODO
index 27dc8adc..dde2994b 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -23,8 +23,10 @@
1.5 get rid of PATH_MAX
1.6 Modified buffer size approach
1.7 Detect when called from within callbacks
+ 1.8 CURLOPT_RESOLVE for any port number
1.9 Cache negative name resolves
- 1.11 minimize dependencies with dynamicly loaded modules
+ 1.10 auto-detect proxy
+ 1.11 minimize dependencies with dynamically loaded modules
1.12 have form functions use CURL handle argument
1.14 Typesafe curl_easy_setopt()
1.15 Monitor connections in the connection pool
@@ -36,7 +38,6 @@
1.21 API for URL parsing/splitting
1.23 Offer API to flush the connection pool
1.24 TCP Fast Open for windows
- 1.25 Remove the generated include file
2. libcurl - multi interface
2.1 More non-blocking
@@ -46,7 +47,6 @@
2.5 Edge-triggered sockets should work
3. Documentation
- 3.1 Update date and version in man pages
3.2 Provide cmake config-file
4. FTP
@@ -62,18 +62,19 @@
5.1 Better persistency for HTTP 1.0
5.2 support FF3 sqlite cookie files
5.3 Rearrange request header order
+ 5.4 HTTP Digest using SHA-256
5.5 auth= in URLs
5.6 Refuse "downgrade" redirects
5.7 Brotli compression
5.8 QUIC
- 5.9 Add easy argument to formpost functions
+ 5.9 Improve formpost API
5.10 Leave secure cookies alone
+ 5.11 Chunked transfer multipart formpost
6. TELNET
6.1 ditch stdin
6.2 ditch telnet-specific select
6.3 feature negotiation debug data
- 6.4 send data in chunks
7. SMTP
7.1 Pipelining
@@ -103,12 +104,11 @@
13.1 Disable specific versions
13.2 Provide mutex locking API
13.3 Evaluate SSL patches
- 13.4 Cache OpenSSL contexts
+ 13.4 Cache/share OpenSSL contexts
13.5 Export session ids
13.6 Provide callback for cert verification
13.7 improve configure --with-ssl
13.8 Support DANE
- 13.9 Support TLS v1.3
13.10 Support SSLKEYLOGFILE
13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
13.12 Support HSTS
@@ -132,6 +132,7 @@
17.1 Multiplexing
17.2 SFTP performance
17.3 Support better than MD5 hostkey hash
+ 17.4 Support CURLOPT_PREQUOTE
18. Command line tool
18.1 sync
@@ -140,7 +141,6 @@
18.4 simultaneous parallel transfers
18.5 provide formpost headers
18.6 warning when setting an option
- 18.7 warning when sending binary output to terminal
18.8 offer color-coded HTTP header output
18.9 Choose the name of file in braces for complex URLs
18.10 improve how curl works in a windows console window
@@ -148,8 +148,9 @@
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 Introduce --fail-fast to exit on first transfer fail
- 18.16 --retry should resume
+ 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
@@ -242,12 +243,32 @@
subsequently can add code within libcurl that returns error if called within
callbacks for when that's not supported.
+1.8 CURLOPT_RESOLVE for any port number
+
+ This option allows applications to set a replacement IP address for a given
+ host + port pair. Consider making support for providing a replacement address
+ for the host name on all port numbers.
+
+ See https://github.com/curl/curl/issues/1264
+
1.9 Cache negative name resolves
A name resolve that has failed is likely to fail when made again within a
short period of time. Currently we only cache positive responses.
-1.11 minimize dependencies with dynamicly loaded modules
+1.10 auto-detect proxy
+
+ libcurl could be made to detect the system proxy setup automatically and use
+ that. On Windows, macOS and Linux desktops for example.
+
+ The pull-request to use libproxy for this was deferred due to doubts on the
+ reliability of the dependency and how to use it:
+ https://github.com/curl/curl/pull/977
+
+ libdetectproxy is a (C++) library for detecting the proxy on Windows
+ https://github.com/paulharris/libdetectproxy
+
+1.11 minimize dependencies with dynamically loaded modules
We can create a system with loadable modules/plug-ins, where these modules
would be the ones that link to 3rd party libs. That would allow us to avoid
@@ -359,33 +380,6 @@
Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
and we should add support for it.
-1.25 Remove the generated include file
-
- When curl and libcurl are built, one of the public include files are
- generated and is populated with a set of defines that are derevid from sizes
- and constants for the particular target architecture that build is made. For
- platforms that can select between 32 bit and 64 bit at build time, this
- approach makes the libcurl build only create a set of public headers suitable
- for one of the architectures and not both. If you build libcurl for such a
- platform and you want to allow applications to get built using either 32/64
- version, you must generate the libcurl headers once for each setup and you
- must then add a replacement curl header that would itself select the correct
- 32 or 64 bit specific header as necessary.
-
- Your curl/curl.h alternative could then look like (replace with suitable CPP
- variable to check):
-
- #ifdef ARCH_32bit
- #include <curl32/curl.h>
- #else /* ARCH_64bit */
- #include <curl64/curl.h>
- #endif
-
- A fix would either (A) fix the 32/64 setup automatically or even better (B)
- work away the architecture specific defines from the headers so that they can
- be used for all architectures independently of what libcurl was built for.
-
-
2. libcurl - multi interface
2.1 More non-blocking
@@ -393,9 +387,7 @@
Make sure we don't ever loop because of non-blocking sockets returning
EWOULDBLOCK or similar. Blocking cases include:
- - Name resolves on non-windows unless c-ares is used
- - NSS SSL connections
- - HTTP proxy CONNECT operations
+ - Name resolves on non-windows unless c-ares or the threaded resolver is used
- SOCKS proxy handshakes
- file:// transfers
- TELNET transfers
@@ -433,12 +425,6 @@
3. Documentation
-3.1 Update date and version in man pages
-
- 'maketgz' or another suitable script could update the .TH sections of the man
- pages at release time to use the current date and curl/libcurl version
- number.
-
3.2 Provide cmake config-file
A config-file package is a set of files provided by us to allow applications
@@ -516,6 +502,15 @@ This is not detailed in any FTP specification.
headers use a default value so only headers that need to be moved have to be
specified.
+5.4 HTTP Digest using SHA-256
+
+ RFC 7616 introduces an update to the HTTP Digest authentication
+ specification, which amongst other thing defines how new digest algorithms
+ can be used instead of MD5 which is considered old and not recommended.
+
+ See https://tools.ietf.org/html/rfc7616 and
+ https://github.com/curl/curl/issues/1018
+
5.5 auth= in URLs
Add the ability to specify the preferred authentication mechanism to use by
@@ -537,11 +532,9 @@ This is not detailed in any FTP specification.
5.7 Brotli compression
- Compression algorithms that perform better than gzip are being considered for
- use and inclusion in existing browsers. For example 'brotli'. If servers
- follow along it is a good reason for us to also allow users to take advantage
- of this. The algorithm: https://github.com/google/brotli The Firefox bug:
- https://bugzilla.mozilla.org/show_bug.cgi?id=366559
+ Brotli compression performs better than gzip and is being implemented by
+ browsers and servers widely. The algorithm: https://github.com/google/brotli
+ The Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=366559
5.8 QUIC
@@ -553,12 +546,12 @@ This is not detailed in any FTP specification.
implemented. This, to allow other projects to benefit from the work and to
thus broaden the interest and chance of others to participate.
-5.9 Add easy argument to formpost functions
+5.9 Improve formpost API
- Make sure there's an easy handle passed in to `curl_formadd()`,
- `curl_formget()` and `curl_formfree()` by adding replacement functions and
- deprecating the old ones. Allows better error messages and is generally good
- API hygiene.
+ Revamp the formpost API and making something that is easier to use and
+ understand:
+
+ https://github.com/curl/curl/wiki/formpost-API-redesigned
5.10 Leave secure cookies alone
@@ -567,6 +560,15 @@ This is not detailed in any FTP specification.
https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01
+5.11 Chunked transfer multipart formpost
+
+ For a case where the file is being made during the upload is progressing
+ (like passed on stdin to the curl tool), we cannot know the size before-hand
+ and we rather not read the entire thing into memory before it can start the
+ upload.
+
+ https://github.com/curl/curl/issues/1139
+
6. TELNET
@@ -586,11 +588,6 @@ to provide the data to send.
Add telnet feature negotiation data to the debug callback as header data.
-6.4 send data in chunks
-
- Currently, telnet sends data one byte at a time. This is fine for interactive
- use, but inefficient for any other. Sent data should be sent in larger
- chunks.
7. SMTP
@@ -687,7 +684,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Evaluate/apply Gertjan van Wingerde's SSL patches:
https://curl.haxx.se/mail/lib-2004-03/0087.html
-13.4 Cache OpenSSL contexts
+13.4 Cache/share OpenSSL contexts
"Look at SSL cafile - quick traces look to me like these are done on every
request as well, when they should only be necessary once per SSL context (or
@@ -697,6 +694,12 @@ that doesn't exist on the server, just like --ftp-create-dirs.
style connections are re-used. It will make us use slightly more memory but
it will libcurl do less creations and deletions of SSL contexts.
+ Technically, the "caching" is probably best implemented by getting added to
+ the share interface so that easy handles who want to and can reuse the
+ context specify that by sharing with the right properties set.
+
+ https://github.com/curl/curl/issues/1110
+
13.5 Export session ids
Add an interface to libcurl that enables "session IDs" to get
@@ -731,14 +734,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 Support TLS v1.3
-
- TLS version 1.3 is about to ship and is getting implemented by TLS libraries
- as we speak. We should start to support the symbol and make sure all backends
- handle it accordingly, then gradually add support as the TLS libraries add
- the corresponding support. There may be a need to add some additional options
- to allow libcurl to take advantage of the new features in 1.3.
-
13.10 Support SSLKEYLOGFILE
When used, Firefox and Chrome dumps their master TLS keys to the file name
@@ -877,6 +872,10 @@ that doesn't exist on the server, just like --ftp-create-dirs.
SHA-1 is also being deprecated these days so we should consider workign with
libssh2 to instead offer support for SHA-256 or similar.
+17.4 Support CURLOPT_PREQUOTE
+
+ The two other QUOTE options are supported for SFTP, but this was left out for
+ unknown reasons!
18. Command line tool
@@ -932,11 +931,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
This can be useful to tell when support for a particular feature hasn't been
compiled into the library.
-18.7 warning when sending binary output to terminal
-
- Provide a way that prompts the user for confirmation before binary data is
- sent to the terminal, much in the style 'less' does it.
-
18.8 offer color-coded HTTP header output
By offering different color output on the header name and the header
@@ -1001,23 +995,42 @@ that doesn't exist on the server, just like --ftp-create-dirs.
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 Introduce --fail-fast to exit on first transfer fail
-
- curl will transfer all URLs given on the command line one by one but only
- returns the error code for the last transfer. Transfer failures on the first
- ones will not be returned as error code etc to the shell. A --fail-fast
- option would make curl exit and return an error for the first transfer that
- fails.
-
-18.16 --retry should resume
+18.15 --retry should resume
When --retry is used and curl actually retries transfer, it should use the
- already transfered data and do a resumed transfer for the rest (when
+ already transferred data and do a resumed transfer for the rest (when
possible) so that it doesn't have to transfer the same data again that was
- already tranfered before the retry.
+ already transferred before the retry.
See https://github.com/curl/curl/issues/1084
+18.16 send only part of --data
+
+ When the user only wants to send a small piece of the data provided with
+ --data or --data-binary, like when that data is a huge file, consider a way
+ to specify that curl should only send a piece of that. One suggested syntax
+ would be: "--data-binary @largefile.zip!1073741823-2147483647".
+
+ See https://github.com/curl/curl/issues/1200
+
+18.17 consider file name from the redirected URL with -O ?
+
+ When a user gives a URL and uses -O, and curl follows a redirect to a new
+ URL, the file name is not extracted and used from the newly redirected-to URL
+ even if the new URL may have a much more sensible file name.
+
+ This is clearly documented and helps for security since there's no surprise
+ to users which file name that might get overwritten. But maybe a new option
+ could allow for this or maybe -J should imply such a treatment as well as -J
+ already allows for the server to decide what file name to use so it already
+ provides the "may overwrite any file" risk.
+
+ This is extra tricky if the original URL has no file name part at all since
+ then the current code path will error out with an error message, and we can't
+ *know* already at that point if curl will be redirected to a URL that has a
+ file name...
+
+ See https://github.com/curl/curl/issues/1241
19. Build
diff --git a/docs/TheArtOfHttpScripting b/docs/TheArtOfHttpScripting
index 0e81d1a3..b2bd9db7 100644
--- a/docs/TheArtOfHttpScripting
+++ b/docs/TheArtOfHttpScripting
@@ -145,7 +145,7 @@ The Art Of Scripting HTTP Requests Using Curl
address and that's what curl will communicate with. Alternatively you specify
the IP address directly in the URL instead of a name.
- For development and other trying out situation, you can point out a different
+ For development and other trying out situations, you can point to a different
IP address for a host name than what would otherwise be used, by using curl's
--resolve option:
@@ -153,7 +153,7 @@ The Art Of Scripting HTTP Requests Using Curl
2.3 Port number
- Each protocol curl supports operate on a default port number, be it over TCP
+ Each protocol curl supports operates on a default port number, be it over TCP
or in some cases UDP. Normally you don't have to take that into
consideration, but at times you run test servers on other ports or
similar. Then you can specify the port number in the URL with a colon and a
@@ -164,7 +164,7 @@ The Art Of Scripting HTTP Requests Using Curl
The port number you specify in the URL is the number that the server uses to
offer its services. Sometimes you may use a local proxy, and then you may
- need to specify that proxy's port number separate on what curl needs to
+ need to specify that proxy's port number separately for what curl needs to
connect to locally. Like when using a HTTP proxy on port 4321:
curl --proxy http://proxy.example.org:4321 http://remote.example.org/
@@ -172,7 +172,7 @@ The Art Of Scripting HTTP Requests Using Curl
2.4 User name and password
Some services are setup to require HTTP authentication and then you need to
- provide name and password which then is transferred to the remote site in
+ provide name and password which is then transferred to the remote site in
various ways depending on the exact authentication protocol used.
You can opt to either insert the user and password in the URL or you can
@@ -198,7 +198,7 @@ The Art Of Scripting HTTP Requests Using Curl
3.1 GET
- The simplest and most common request/operation made using HTTP is to get a
+ The simplest and most common request/operation made using HTTP is to GET a
URL. The URL could itself refer to a web page, an image or a file. The client
issues a GET request to the server and receives the document it asked for.
If you issue the command line
@@ -269,14 +269,14 @@ The Art Of Scripting HTTP Requests Using Curl
4.1 Forms explained
Forms are the general way a web site can present a HTML page with fields for
- the user to enter data in, and then press some kind of 'OK' or 'submit'
+ the user to enter data in, and then press some kind of 'OK' or 'Submit'
button to get that data sent to the server. The server then typically uses
the posted data to decide how to act. Like using the entered words to search
- in a database, or to add the info in a bug track system, display the entered
+ in a database, or to add the info in a bug tracking system, display the entered
address on a map or using the info as a login-prompt verifying that the user
is allowed to see what it is about to see.
- Of course there has to be some kind of program in the server end to receive
+ Of course there has to be some kind of program on the server end to receive
the data you send. You cannot just invent something out of the air.
4.2 GET
@@ -369,7 +369,7 @@ The Art Of Scripting HTTP Requests Using Curl
4.5 Hidden Fields
- A very common way for HTML based application to pass state information
+ A very common way for HTML based applications to pass state information
between pages is to add hidden fields to the forms. Hidden fields are
already filled in, they aren't displayed to the user and they get passed
along just as all the other fields.
@@ -383,7 +383,7 @@ The Art Of Scripting HTTP Requests Using Curl
<input type=submit name="press" value="OK">
</form>
- To post this with curl, you won't have to think about if the fields are
+ To POST this with curl, you won't have to think about if the fields are
hidden or not. To curl they're all the same:
curl --data "birthyear=1905&press=OK&person=daniel" [URL]
@@ -405,7 +405,7 @@ The Art Of Scripting HTTP Requests Using Curl
5.1 PUT
- The perhaps best way to upload data to a HTTP server is to use PUT. Then
+ Perhaps the best way to upload data to a HTTP server is to use PUT. Then
again, this of course requires that someone put a program or script on the
server end that knows how to receive a HTTP PUT stream.
@@ -446,7 +446,7 @@ The Art Of Scripting HTTP Requests Using Curl
If your proxy requires the authentication to be done using the NTLM method,
use --proxy-ntlm, if it requires Digest use --proxy-digest.
- If you use any one these user+password options but leave out the password
+ If you use any one of these user+password options but leave out the password
part, curl will prompt for the password interactively.
6.4 Hiding credentials
@@ -508,7 +508,7 @@ The Art Of Scripting HTTP Requests Using Curl
to redirect is Location:.
Curl does not follow Location: headers by default, but will simply display
- such pages in the same manner it display all HTTP replies. It does however
+ such pages in the same manner it displays all HTTP replies. It does however
feature an option that will make it attempt to follow the Location: pointers.
To tell curl to follow a Location:
@@ -562,7 +562,7 @@ The Art Of Scripting HTTP Requests Using Curl
(Take note that the --cookie-jar option described below is a better way to
store cookies.)
- Curl has a full blown cookie parsing engine built-in that comes to use if you
+ Curl has a full blown cookie parsing engine built-in that comes in use if you
want to reconnect to a server and use cookies that were stored from a
previous connection (or hand-crafted manually to fool the server into
believing you had a previous connection). To use previously stored cookies,
@@ -592,7 +592,7 @@ The Art Of Scripting HTTP Requests Using Curl
10.1 HTTPS is HTTP secure
- There are a few ways to do secure HTTP transfers. The by far most common
+ There are a few ways to do secure HTTP transfers. By far the most common
protocol for doing this is what is generally known as HTTPS, HTTP over
SSL. SSL encrypts all the data that is sent and received over the network and
thus makes it harder for attackers to spy on sensitive information.
@@ -680,7 +680,7 @@ The Art Of Scripting HTTP Requests Using Curl
12.1 Some login tricks
- While not strictly just HTTP related, it still cause a lot of people problems
+ While not strictly just HTTP related, it still causes a lot of people problems
so here's the executive run-down of how the vast majority of all login forms
work and how to login to them using curl.
@@ -693,7 +693,7 @@ The Art Of Scripting HTTP Requests Using Curl
make sure you got there through their login page) so you should make a habit
of first getting the login-form page to capture the cookies set there.
- Some web-based login systems features various amounts of javascript, and
+ Some web-based login systems feature various amounts of javascript, and
sometimes they use such code to set or modify cookie contents. Possibly they
do that to prevent programmed logins, like this manual describes how to...
Anyway, if reading the code isn't enough to let you repeat the behavior
diff --git a/docs/cmdline-opts/CMakeLists.txt b/docs/cmdline-opts/CMakeLists.txt
new file mode 100644
index 00000000..5aa20dfd
--- /dev/null
+++ b/docs/cmdline-opts/CMakeLists.txt
@@ -0,0 +1,12 @@
+set(MANPAGE "${CMAKE_BINARY_DIR}/docs/curl.1")
+
+# Load DPAGES and OTHERPAGES from shared file
+transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+
+add_custom_command(OUTPUT "${MANPAGE}"
+ COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/gen.pl" mainpage "${CMAKE_CURRENT_SOURCE_DIR}" > "${MANPAGE}"
+ DEPENDS ${DPAGES} ${OTHERPAGES}
+ VERBATIM
+)
+add_custom_target(generate-curl.1 DEPENDS "${MANPAGE}")
diff --git a/docs/cmdline-opts/MANPAGE.md b/docs/cmdline-opts/MANPAGE.md
index 1ba00c83..3a8270b0 100644
--- a/docs/cmdline-opts/MANPAGE.md
+++ b/docs/cmdline-opts/MANPAGE.md
@@ -23,9 +23,9 @@ Each file has a set of meta-data and a body of text.
Tags: (space separated list)
Protocols: (space separated list for which protocols this option works)
Added: (version number in which this was added)
- Mutexed: (space separated list of options this overrides)
- Requires: (space separated list of features this option requires)
- See-also: (space separated list of related options)
+ Mutexed: (space separated list of options this overrides, no dashes)
+ Requires: (space separated list of features this requires, no dashes)
+ See-also: (space separated list of related options, no dashes)
Help: (short text for the --help output for this option)
--- (end of meta-data)
diff --git a/docs/cmdline-opts/Makefile.am b/docs/cmdline-opts/Makefile.am
index 925f07fc..e6ecf7a6 100644
--- a/docs/cmdline-opts/Makefile.am
+++ b/docs/cmdline-opts/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -22,46 +22,13 @@
AUTOMAKE_OPTIONS = foreign no-dependencies
-DPAGES = anyauth.d append.d basic.d cacert.d capath.d cert.d \
- cert-status.d cert-type.d ciphers.d compressed.d config.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 \
- environment.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 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-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 tcp-fastopen.d tcp-nodelay.d \
- telnet-option.d tftp-blksize.d tftp-no-options.d time-cond.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
+MANPAGE = $(top_builddir)/docs/curl.1
-EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl page-footer page-header
+include Makefile.inc
+
+EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl $(OTHERPAGES) CMakeLists.txt
+
+all: $(MANPAGE)
+
+$(MANPAGE): $(DPAGES) $(OTHERPAGES) Makefile.inc
+ @PERL@ $(srcdir)/gen.pl mainpage $(srcdir) > $(MANPAGE)
diff --git a/docs/cmdline-opts/Makefile.in b/docs/cmdline-opts/Makefile.in
index 1cb4923a..1f02aa02 100644
--- a/docs/cmdline-opts/Makefile.in
+++ b/docs/cmdline-opts/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -35,6 +35,8 @@
# KIND, either express or implied.
#
###########################################################################
+
+# Shared between Makefile.am and CMakeLists.txt
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -111,7 +113,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = docs/cmdline-opts
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -132,8 +135,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -158,7 +160,7 @@ am__can_run_installinfo = \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -174,6 +176,12 @@ 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@
@@ -213,6 +221,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -225,6 +235,7 @@ 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@
@@ -351,53 +362,58 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies
-DPAGES = anyauth.d append.d basic.d cacert.d capath.d cert.d \
- cert-status.d cert-type.d ciphers.d compressed.d config.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 \
- environment.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 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-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 tcp-fastopen.d tcp-nodelay.d \
- telnet-option.d tftp-blksize.d tftp-no-options.d time-cond.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
-
-EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl page-footer page-header
+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 config.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 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 \
+ 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
+
+OTHERPAGES = page-footer page-header
+EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl $(OTHERPAGES) CMakeLists.txt
all: all-am
.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -417,6 +433,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
+$(srcdir)/Makefile.inc $(am__empty):
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -586,6 +603,11 @@ uninstall-am:
.PRECIOUS: Makefile
+all: $(MANPAGE)
+
+$(MANPAGE): $(DPAGES) $(OTHERPAGES) Makefile.inc
+ @PERL@ $(srcdir)/gen.pl mainpage $(srcdir) > $(MANPAGE)
+
# 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/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
new file mode 100644
index 00000000..7eea5c6c
--- /dev/null
+++ b/docs/cmdline-opts/Makefile.inc
@@ -0,0 +1,48 @@
+# 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 config.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 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 \
+ 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
+
+OTHERPAGES = page-footer page-header
diff --git a/docs/cmdline-opts/abstract-unix-socket.d b/docs/cmdline-opts/abstract-unix-socket.d
new file mode 100644
index 00000000..1fda4e5d
--- /dev/null
+++ b/docs/cmdline-opts/abstract-unix-socket.d
@@ -0,0 +1,9 @@
+Long: abstract-unix-socket
+Arg: <path>
+Help: Connect via abstract Unix domain socket
+Added: 7.53.0
+Protocols: HTTP
+---
+Connect through an abstract Unix domain socket, instead of using the network.
+Note: netstat shows the path of an abstract socket prefixed with '@', however
+the <path> argument should not have this leading character.
diff --git a/docs/cmdline-opts/ciphers.d b/docs/cmdline-opts/ciphers.d
index b1e5ac9a..d3bac602 100644
--- a/docs/cmdline-opts/ciphers.d
+++ b/docs/cmdline-opts/ciphers.d
@@ -6,11 +6,6 @@ Protocols: TLS
Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
- https://www.openssl.org/docs/apps/ciphers.html
-
-NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS
-ciphers is in the NSSCipherSuite entry at this URL:
-
- https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives
+ https://curl.haxx.se/docs/ssl-ciphers.html
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d
index 4a325127..105d6282 100644
--- a/docs/cmdline-opts/config.d
+++ b/docs/cmdline-opts/config.d
@@ -3,11 +3,12 @@ Arg: <file>
Help: Read config from a file
Short: K
---
-Specify which config file to read curl arguments from. The config file is a
-text file in which command line arguments can be written which then will be
-used as if they were written on the actual command line.
-Options and their parameters must be specified on the same config file line,
+Specify a text file to read curl arguments from. The command line arguments
+found in the text file will be used as if they were provided on the command
+line.
+
+Options and their parameters must be specified on the same line in the file,
separated by whitespace, colon, or the equals sign. Long option names can
optionally be given in the config file without the initial double dashes and
if so, the colon or equals characters can be used as separators. If the option
@@ -29,9 +30,9 @@ line. So, it could look similar to this:
url = "https://curl.haxx.se/docs/"
-When curl is invoked, it always (unless --disable is used) checks for a
-default config file and uses it if found. The default config file is checked
-for in the following places in this order:
+When curl is invoked, it (unless --disable is used) checks for a default
+config file and uses it if found. The default config file is checked for in
+the following places in this order:
1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
diff --git a/docs/cmdline-opts/environment.d b/docs/cmdline-opts/environment.d
deleted file mode 100644
index 6289e53d..00000000
--- a/docs/cmdline-opts/environment.d
+++ /dev/null
@@ -1,7 +0,0 @@
-Long: environment
-Help: Write results to environment variables
-Requires: RISC OS
----
-Sets a range of environment variables, using the names the --write-out option
-supports, to allow easier extraction of useful information after having run
-curl.
diff --git a/docs/cmdline-opts/fail-early.d b/docs/cmdline-opts/fail-early.d
index 4489b4fc..375d4c91 100644
--- a/docs/cmdline-opts/fail-early.d
+++ b/docs/cmdline-opts/fail-early.d
@@ -2,7 +2,7 @@ Long: fail-early
Help: Fail on first transfer error, do not continue
Added: 7.52.0
---
-Fail and exit on first detected error.
+Fail and exit on the first detected transfer error.
When curl is used to do multiple transfers on the command line, it will
attempt to operate on each given URL, one by one. By default, it will ignore
@@ -10,9 +10,12 @@ errors if there are more URLs given and the last URL's success will determine
the error code curl returns. So early failures will be "hidden" by subsequent
successful transfers.
-Using this option, curl will instead return an error on the first transfers
-that fails, independent on the amount of more URLs that are given on the
-command line. This way, no transfer failures go undetected by scripts and
-similar.
+Using this option, curl will instead return an error on the first transfer
+that fails, independent of the amount of URLs that are given on the command
+line. This way, no transfer failures go undetected by scripts and similar.
-This option will apply for all given URLs even if you use --next.
+This option is global and does not need to be specified for each use of --next.
+
+This option does not imply --fail, which causes transfers to fail due to the
+server's HTTP status code. You can combine the two options, however note --fail
+is not global and is therefore contained by --next.
diff --git a/docs/cmdline-opts/gen.pl b/docs/cmdline-opts/gen.pl
index c8b12936..73ea6d47 100755
--- a/docs/cmdline-opts/gen.pl
+++ b/docs/cmdline-opts/gen.pl
@@ -1,6 +1,22 @@
#!/usr/bin/perl
-my $some_dir=".";
+=begin comment
+
+This script generates the manpage.
+
+Example: gen.pl mainpage > curl.1
+
+Dev notes:
+
+We open *input* files in :crlf translation (a no-op on many platforms) in
+case we have CRLF line endings in Windows but a perl that defaults to LF.
+Unfortunately it seems some perls like msysgit can't handle a global input-only
+:crlf so it has to be specified on each file open for text input.
+
+=end comment
+=cut
+
+my $some_dir=$ARGV[1] || ".";
opendir(my $dh, $some_dir) || die "Can't opendir $some_dir: $!";
my @s = grep { /\.d$/ && -f "$some_dir/$_" } readdir($dh);
@@ -85,7 +101,7 @@ sub added {
sub single {
my ($f, $standalone)=@_;
- open(F, "<$f") ||
+ open(F, "<:crlf", "$some_dir/$f") ||
return 1;
my $short;
my $long;
@@ -219,7 +235,7 @@ sub single {
sub getshortlong {
my ($f)=@_;
- open(F, "<$f");
+ open(F, "<:crlf", "$some_dir/$f");
my $short;
my $long;
my $help;
@@ -265,7 +281,7 @@ sub indexoptions {
sub header {
my ($f)=@_;
- open(F, "<$f");
+ open(F, "<:crlf", "$some_dir/$f");
my @d;
while(<F>) {
push @d, $_;
@@ -291,10 +307,12 @@ sub listhelp {
if($arg) {
$opt .= " $arg";
}
+ my $desc = $helplong{$f};
+ $desc =~ s/\"/\\\"/g; # escape double quotes
- my $line = sprintf " %-19s %s\n", $opt, $helplong{$f};
+ my $line = sprintf " {\"%s\",\n \"%s\"},\n", $opt, $desc;
- if(length($line) > 79) {
+ if(length($opt) + length($desc) > 78) {
print STDERR "WARN: the --$long line is too long\n";
}
print $line;
@@ -355,7 +373,7 @@ sub getargs {
}
} while($f);
- print "Usage: gen.pl <mainpage/listhelp/single FILE/protos>\n";
+ print "Usage: gen.pl <mainpage/listhelp/single FILE/protos> [srcdir]\n";
}
#------------------------------------------------------------------------
diff --git a/docs/cmdline-opts/header.d b/docs/cmdline-opts/header.d
index 90af7359..d8292ed7 100644
--- a/docs/cmdline-opts/header.d
+++ b/docs/cmdline-opts/header.d
@@ -1,10 +1,9 @@
Long: header
Short: H
-Arg: <header>
-Help: Pass custom header LINE to server
+Arg: <header/@file>
+Help: Pass custom header(s) to server
Protocols: HTTP
---
-
Extra header to include in the request when sending HTTP to a server. You may
specify any number of extra headers. Note that if you should add a custom
header that has the same name as one of the internal ones curl would use, your
@@ -21,6 +20,10 @@ end-of-line marker, you should thus \fBnot\fP add that as a part of the header
content: do not add newlines or carriage returns, they will only mess things up
for you.
+Starting in 7.55.0, this option can take an argument in @filename style, which
+then adds a header for each line in the input file. Using @- will make curl
+read the header file from stdin.
+
See also the --user-agent and --referer options.
Starting in 7.37.0, you need --proxy-header to send custom headers intended
diff --git a/docs/cmdline-opts/include.d b/docs/cmdline-opts/include.d
index e55d5163..9d282dd1 100644
--- a/docs/cmdline-opts/include.d
+++ b/docs/cmdline-opts/include.d
@@ -1,7 +1,10 @@
Long: include
Short: i
-Help: Include protocol headers in the output
+Help: Include protocol response headers in the output
See-also: verbose
---
-Include the HTTP-header in the output. The HTTP-header includes things like
-server-name, date of the document, HTTP-version and more...
+Include the HTTP response headers in the output. The HTTP response headers can
+include things like server name, cookies, date of the document, HTTP version
+and more...
+
+To view the request headers, consider the --verbose option.
diff --git a/docs/cmdline-opts/insecure.d b/docs/cmdline-opts/insecure.d
index 1dd0fa8c..49b0a432 100644
--- a/docs/cmdline-opts/insecure.d
+++ b/docs/cmdline-opts/insecure.d
@@ -1,12 +1,16 @@
Long: insecure
Short: k
-Help: Allow insecure connections when using SSL
+Help: Allow insecure server connections when using SSL
Protocols: TLS
+See-also: proxy-insecure cacert
---
-This option explicitly allows curl to perform "insecure" SSL connections and
-transfers. All SSL connections are attempted to be made secure by using the CA
-certificate bundle installed by default. This makes all connections considered
-\&"insecure" fail unless --insecure is used.
+
+By default, every SSL connection curl makes is verified to be secure. This
+option allows curl to proceed and operate even for server connections
+otherwise considered insecure.
+
+The server connection is verified by making sure the server's certificate
+contains the right name and verifies successfully using the cert store.
See this online resource for further details:
https://curl.haxx.se/docs/sslcerts.html
diff --git a/docs/cmdline-opts/netrc-file.d b/docs/cmdline-opts/netrc-file.d
index 4118b4db..0b5d2400 100644
--- a/docs/cmdline-opts/netrc-file.d
+++ b/docs/cmdline-opts/netrc-file.d
@@ -1,6 +1,6 @@
Long: netrc-file
Help: Specify FILE for netrc
-Arg: <filemame>
+Arg: <filename>
Added: 7.21.5
Mutexed: netrc
---
diff --git a/docs/cmdline-opts/next.d b/docs/cmdline-opts/next.d
index f368c1b7..1d1e70a3 100644
--- a/docs/cmdline-opts/next.d
+++ b/docs/cmdline-opts/next.d
@@ -13,7 +13,7 @@ for each.
--next will reset all local options and only global ones will have their
values survive over to the operation following the --next instruction. Global
-options include --verbose and --fail-early.
+options include --verbose, --trace, --trace-ascii and --fail-early.
For example, you can do both a GET and a POST in a single command line:
diff --git a/docs/cmdline-opts/no-keepalive.d b/docs/cmdline-opts/no-keepalive.d
index 7eb3d639..8fb28a03 100644
--- a/docs/cmdline-opts/no-keepalive.d
+++ b/docs/cmdline-opts/no-keepalive.d
@@ -1,7 +1,7 @@
Long: no-keepalive
Help: Disable TCP keepalive on the connection
---
-Disables the use of keepalive messages on the TCP connection. curl otherwis
+Disables the use of keepalive messages on the TCP connection. curl otherwise
enables them by default.
Note that this is the negated option name documented. You can thus use
diff --git a/docs/cmdline-opts/noproxy.d b/docs/cmdline-opts/noproxy.d
index 4f06d9f5..a216e75f 100644
--- a/docs/cmdline-opts/noproxy.d
+++ b/docs/cmdline-opts/noproxy.d
@@ -9,3 +9,7 @@ effectively disables the proxy. Each name in this list is matched as either
a domain which contains the hostname, or the hostname itself. For example,
local.com would match local.com, local.com:80, and www.local.com, but not
www.notlocal.com.
+
+Since 7.53.0, This option overrides the environment variables that disable the
+proxy. If there's an environment variable disabling a proxy, you can set
+noproxy list to \&"" to override it.
diff --git a/docs/cmdline-opts/oauth2-bearer.d b/docs/cmdline-opts/oauth2-bearer.d
index adad532c..78071674 100644
--- a/docs/cmdline-opts/oauth2-bearer.d
+++ b/docs/cmdline-opts/oauth2-bearer.d
@@ -1,5 +1,6 @@
Long: oauth2-bearer
Help: OAuth 2 Bearer Token
+Arg: <token>
Protocols: IMAP POP3 SMTP
---
Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
diff --git a/docs/cmdline-opts/page-footer b/docs/cmdline-opts/page-footer
index e4754aa3..55aefb23 100644
--- a/docs/cmdline-opts/page-footer
+++ b/docs/cmdline-opts/page-footer
@@ -23,6 +23,16 @@ Sets the proxy server to use if no protocol-specific proxy is set.
.IP "NO_PROXY <comma-separated list of hosts>"
list of host names that shouldn't go through any proxy. If set to a asterisk
\&'*' only, it matches all hosts.
+
+Since 7.53.0, this environment variable disable the proxy even if specify
+--proxy option. That is
+.B NO_PROXY=direct.example.com curl -x http://proxy.example.com
+.B http://direct.example.com
+accesses the target URL directly, and
+.B NO_PROXY=direct.example.com curl -x http://proxy.example.com
+.B http://somewhere.example.com
+accesses the target URL through proxy.
+
.SH "PROXY PROTOCOL PREFIXES"
Since curl version 7.21.7, the proxy string may be specified with a
protocol:// prefix to specify alternative proxy protocols.
@@ -65,14 +75,25 @@ Weird server reply. The server sent data curl couldn't parse.
FTP access denied. The server denied login or denied access to the particular
resource or directory you wanted to reach. Most often you tried to change to a
directory that doesn't exist on the server.
+.IP 10
+FTP accept failed. While waiting for the server to connect back when an active
+FTP session is used, an error code was sent over the control connection or
+similar.
.IP 11
FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
+.IP 12
+During an active FTP session while waiting for the server to connect back to
+curl, the timeout expired.
.IP 13
FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
.IP 14
FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
.IP 15
FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
+.IP 16
+HTTP/2 error. A problem was detected in the HTTP2 framing layer. This is
+somewhat generic and can be one out of several problems, see the error message
+for details.
.IP 17
FTP couldn't set binary. Couldn't change transfer method to binary.
.IP 18
@@ -111,7 +132,7 @@ HTTP post error. Internal post-request generation error.
.IP 35
SSL connect error. The SSL handshaking failed.
.IP 36
-FTP bad download resume. Couldn't continue an earlier aborted download.
+Bad download resume. Couldn't continue an earlier aborted download.
.IP 37
FILE couldn't read file. Failed to open the file. Permissions?
.IP 38
@@ -218,8 +239,6 @@ Daniel Stenberg is the main author, but the whole list of contributors is
found in the separate THANKS file.
.SH WWW
https://curl.haxx.se
-.SH FTP
-ftp://ftp.sunet.se/pub/www/utilities/curl/
.SH "SEE ALSO"
.BR ftp (1),
.BR wget (1)
diff --git a/docs/cmdline-opts/page-header b/docs/cmdline-opts/page-header
index 770af8da..ee5af147 100644
--- a/docs/cmdline-opts/page-header
+++ b/docs/cmdline-opts/page-header
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -111,14 +111,15 @@ do an operation and it is about to write data to the terminal, it
mixing progress meter and response data.
If you want a progress meter for HTTP POST or PUT requests, you need to
-redirect the response output to a file, using shell redirect (>), -o [file] or
+redirect the response output to a file, using shell redirect (>), --output or
similar.
It is not the same case for FTP upload as that operation does not spit out
any response data to the terminal.
If you prefer a progress "bar" instead of the regular meter, --progress-bar is
-your friend.
+your friend. You can also disable the progress meter completely with the
+--silent option.
.SH OPTIONS
Options start with one or two dashes. Many of the options require an
additional value next to them.
diff --git a/docs/cmdline-opts/preproxy.d b/docs/cmdline-opts/preproxy.d
index ebef4ab0..b8eb77fa 100644
--- a/docs/cmdline-opts/preproxy.d
+++ b/docs/cmdline-opts/preproxy.d
@@ -3,8 +3,9 @@ Arg: [protocol://]host[:port]
Help: Use this proxy first
Added: 7.52.0
---
-Use the specified proxy before connecting to the ordinary proxy. Hence pre
-proxy. A pre proxy must be a SOCKS speaking proxy.
+Use the specified SOCKS proxy before connecting to an HTTP or HTTPS --proxy. In
+such a case curl first connects to the SOCKS proxy and then connects (through
+SOCKS) to the HTTP or HTTPS proxy. Hence pre proxy.
The pre proxy string should be specified with a protocol:// prefix to specify
alternative proxy protocols. Use socks4://, socks4a://, socks5:// or
diff --git a/docs/cmdline-opts/proxy-header.d b/docs/cmdline-opts/proxy-header.d
index 1ef696bc..c1b0bb7c 100644
--- a/docs/cmdline-opts/proxy-header.d
+++ b/docs/cmdline-opts/proxy-header.d
@@ -1,6 +1,6 @@
Long: proxy-header
-Arg: <header>
-Help: Pass custom header LINE to proxy
+Arg: <header/@file>
+Help: Pass custom header(s) to proxy
Protocols: HTTP
Added: 7.37.0
---
@@ -17,4 +17,8 @@ up for you.
Headers specified with this option will not be included in requests that curl
knows will not be sent to a proxy.
+Starting in 7.55.0, this option can take an argument in @filename style, which
+then adds a header for each line in the input file. Using @- will make curl
+read the header file from stdin.
+
This option can be used multiple times to add/replace/remove multiple headers.
diff --git a/docs/cmdline-opts/proxy.d b/docs/cmdline-opts/proxy.d
index 377a51aa..6506692b 100644
--- a/docs/cmdline-opts/proxy.d
+++ b/docs/cmdline-opts/proxy.d
@@ -5,11 +5,16 @@ Help: Use this proxy
---
Use the specified proxy.
-The proxy string can be specified with a protocol:// prefix to specify
-alternative proxy protocols. Use socks4://, socks4a://, socks5:// or
-socks5h:// to request the specific SOCKS version to be used. No protocol
-specified, http:// and all others will be treated as HTTP proxies. (The
-protocol support was added in curl 7.21.7)
+The proxy string can be specified with a protocol:// prefix. No protocol
+specified or http:// will be treated as HTTP proxy. Use socks4://, socks4a://,
+socks5:// or socks5h:// to request a specific SOCKS version to be used.
+(The protocol support was added in curl 7.21.7)
+
+HTTPS proxy support via https:// protocol prefix was added in 7.52.0 for
+OpenSSL, GnuTLS and NSS.
+
+Unrecognized and unsupported proxy protocols cause an error since 7.52.0.
+Prior versions may ignore the protocol and use http:// instead.
If the port number is not specified in the proxy string, it is assumed to be
1080.
diff --git a/docs/cmdline-opts/proxytunnel.d b/docs/cmdline-opts/proxytunnel.d
index 09855ed3..f2e8b802 100644
--- a/docs/cmdline-opts/proxytunnel.d
+++ b/docs/cmdline-opts/proxytunnel.d
@@ -8,3 +8,6 @@ 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.
+
+To suppress proxy CONNECT response headers when curl is set to output headers
+use --suppress-connect-headers.
diff --git a/docs/cmdline-opts/referer.d b/docs/cmdline-opts/referer.d
index 1d452114..cd84e9d5 100644
--- a/docs/cmdline-opts/referer.d
+++ b/docs/cmdline-opts/referer.d
@@ -2,7 +2,7 @@ Long: referer
Short: e
Arg: <URL>
Protocols: HTTP
-Help: Referer URL
+Help: Referrer URL
See-also: user-agent header
---
Sends the "Referrer Page" information to the HTTP server. This can also be set
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
new file mode 100644
index 00000000..630f8b3b
--- /dev/null
+++ b/docs/cmdline-opts/request-target.d
@@ -0,0 +1,8 @@
+Long: request-target
+Help: Specify the target for this request
+Protocols: HTTP
+---
+Tells curl to use an alternative "target" (path) instead of using the path as
+provided in the URL. Particularly useful when wanting to issue HTTP requests
+without leading slash or other data that doesn't follow the regular URL
+pattern, like "OPTIONS *".
diff --git a/docs/cmdline-opts/silent.d b/docs/cmdline-opts/silent.d
index 32127912..7603b763 100644
--- a/docs/cmdline-opts/silent.d
+++ b/docs/cmdline-opts/silent.d
@@ -6,3 +6,6 @@ See-also: verbose stderr
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
terminal/stdout unless you redirect it.
+
+Use --show-error in addition to this option to disable progress meter but
+still show error messages.
diff --git a/docs/cmdline-opts/socks4.d b/docs/cmdline-opts/socks4.d
index ab4536af..11f6ae03 100644
--- a/docs/cmdline-opts/socks4.d
+++ b/docs/cmdline-opts/socks4.d
@@ -12,4 +12,8 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks4 proxy
with --proxy using a socks4:// protocol prefix.
+Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time
+--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/socks4a.d b/docs/cmdline-opts/socks4a.d
index a1db1f56..ae254ae0 100644
--- a/docs/cmdline-opts/socks4a.d
+++ b/docs/cmdline-opts/socks4a.d
@@ -12,4 +12,8 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks4a proxy
with --proxy using a socks4a:// protocol prefix.
+Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time
+--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/socks5-basic.d b/docs/cmdline-opts/socks5-basic.d
new file mode 100644
index 00000000..67d16b3a
--- /dev/null
+++ b/docs/cmdline-opts/socks5-basic.d
@@ -0,0 +1,7 @@
+Long: socks5-basic
+Help: Enable username/password auth for SOCKS5 proxies
+Added: 7.55.0
+---
+Tells curl to use username/password authentication when connecting to a SOCKS5
+proxy. The username/password authentication is enabled by default. Use
+--socks5-gssapi to force GSS-API authentication to SOCKS5 proxies.
diff --git a/docs/cmdline-opts/socks5-gssapi.d b/docs/cmdline-opts/socks5-gssapi.d
new file mode 100644
index 00000000..0070f37e
--- /dev/null
+++ b/docs/cmdline-opts/socks5-gssapi.d
@@ -0,0 +1,8 @@
+Long: socks5-gssapi
+Help: Enable GSS-API auth for SOCKS5 proxies
+Added: 7.55.0
+---
+Tells curl to use GSS-API authentication when connecting to a SOCKS5 proxy.
+The GSS-API authentication is enabled by default (if curl is compiled with
+GSS-API support). Use --socks5-basic to force username/password authentication
+to SOCKS5 proxies.
diff --git a/docs/cmdline-opts/socks5-hostname.d b/docs/cmdline-opts/socks5-hostname.d
index d971766a..9d9d946e 100644
--- a/docs/cmdline-opts/socks5-hostname.d
+++ b/docs/cmdline-opts/socks5-hostname.d
@@ -12,4 +12,8 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks5
hostname proxy with --proxy using a socks5h:// protocol prefix.
+Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time
+--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/socks5.d b/docs/cmdline-opts/socks5.d
index 34f0311e..22fae762 100644
--- a/docs/cmdline-opts/socks5.d
+++ b/docs/cmdline-opts/socks5.d
@@ -12,6 +12,10 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks5 proxy
with --proxy using a socks5:// protocol prefix.
+Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at the same time
+--proxy is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
This option (as well as --socks4) does not work with IPV6, FTPS or LDAP.
diff --git a/docs/cmdline-opts/suppress-connect-headers.d b/docs/cmdline-opts/suppress-connect-headers.d
new file mode 100644
index 00000000..d208b891
--- /dev/null
+++ b/docs/cmdline-opts/suppress-connect-headers.d
@@ -0,0 +1,8 @@
+Long: suppress-connect-headers
+Help: Suppress proxy CONNECT response headers
+See-also: dump-header include proxytunnel
+---
+When --proxytunnel is used and a CONNECT request is made don't output proxy
+CONNECT response headers. This option is meant to be used with --dump-header or
+--include which are used to show protocol headers in the output. It has no
+effect on debug options such as --verbose or --trace, or any statistics.
diff --git a/docs/cmdline-opts/tcp-nodelay.d b/docs/cmdline-opts/tcp-nodelay.d
index 0c0ddd06..f047a7c6 100644
--- a/docs/cmdline-opts/tcp-nodelay.d
+++ b/docs/cmdline-opts/tcp-nodelay.d
@@ -5,5 +5,5 @@ Added: 7.11.2
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
details about this option.
-Since 7.50.2, curl sets this option by default and you need to explictitly
+Since 7.50.2, curl sets this option by default and you need to explicitly
switch it off if you don't want it on.
diff --git a/docs/cmdline-opts/tls-max.d b/docs/cmdline-opts/tls-max.d
new file mode 100644
index 00000000..7ae86225
--- /dev/null
+++ b/docs/cmdline-opts/tls-max.d
@@ -0,0 +1,24 @@
+Long: tls-max
+Arg: <VERSION>
+Tags: Versions
+Protocols: SSL
+Added: 7.54.0
+Requires: TLS
+See-also: tlsv1.0 tlsv1.1 tlsv1.2
+Help: Use TLSv1.0 or greater
+---
+VERSION defines maximum supported TLS version. A minimum is defined
+by arguments tlsv1.0 or tlsv1.1 or tlsv1.2.
+
+.RS
+.IP "default"
+Use up to recommended TLS version.
+.IP "1.0"
+Use up to TLSv1.0.
+.IP "1.1"
+Use up to TLSv1.1.
+.IP "1.2"
+Use up to TLSv1.2.
+.IP "1.3"
+Use up to TLSv1.3.
+.RE
diff --git a/docs/cmdline-opts/use-ascii.d b/docs/cmdline-opts/use-ascii.d
index da307dc4..d59fad92 100644
--- a/docs/cmdline-opts/use-ascii.d
+++ b/docs/cmdline-opts/use-ascii.d
@@ -3,6 +3,6 @@ Long: use-ascii
Help: Use ASCII/text transfer
Protocols: FTP LDAP
---
-Enable ASCII transfer. For FTP, this can also be enforced by using an URL that
+Enable ASCII transfer. For FTP, this can also be enforced by using a URL that
ends with ";type=A". This option causes data sent to stdout to be in text mode
for win32 systems.
diff --git a/docs/cmdline-opts/write-out.d b/docs/cmdline-opts/write-out.d
index 9262ad37..3747845c 100644
--- a/docs/cmdline-opts/write-out.d
+++ b/docs/cmdline-opts/write-out.d
@@ -60,9 +60,14 @@ Number of new connects made in the recent transfer. (Added in 7.12.3)
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
+.B proxy_ssl_verify_result
+The result of the HTTPS proxy's SSL peer certificate verification that was
+requested. 0 means the verification was successful. (Added in 7.52.0)
+.TP
.B redirect_url
-When an HTTP request was made without -L to follow redirects, this variable
-will show the actual URL a redirect \fIwould\fP take you to. (Added in 7.18.2)
+When an HTTP request was made without --location to follow redirects (or when
+--max-redir is met), this variable will show the actual URL a redirect
+\fIwould\fP have gone to. (Added in 7.18.2)
.TP
.B remote_ip
The remote IP address of the most recently done connection - can be either
@@ -116,7 +121,7 @@ about to begin. This includes all pre-transfer commands and negotiations that
are specific to the particular protocol(s) involved.
.TP
.B time_redirect
-The time, in seconds, it took for all redirection steps include name lookup,
+The time, in seconds, it took for all redirection steps including name lookup,
connect, pretransfer and transfer before the final transaction was
started. time_redirect shows the complete execution time for multiple
redirections. (Added in 7.12.3)
@@ -127,8 +132,7 @@ about to be transferred. This includes time_pretransfer and also the time the
server needed to calculate the result.
.TP
.B time_total
-The total time, in seconds, that the full operation lasted. The time will be
-displayed with millisecond resolution.
+The total time, in seconds, that the full operation lasted.
.TP
.B url_effective
The URL that was fetched last. This is most meaningful if you've told curl
diff --git a/docs/curl-config.1 b/docs/curl-config.1
index 4c1e323c..ed1b1598 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl-config 1 "25 Oct 2007" "Curl 7.17.1" "curl-config manual"
+.TH curl-config 1 "February 03, 2016" "Curl 7.55.0" "curl-config manual"
+
.SH NAME
curl-config \- Get information about a libcurl installation
.SH SYNOPSIS
diff --git a/docs/curl.1 b/docs/curl.1
index 5866ba90..ebafb9c3 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -22,7 +22,8 @@
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
-.TH curl 1 "16 Dec 2016" "Curl 7.52.0" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.55.0" "Curl Manual"
+
.SH NAME
curl \- transfer a URL
.SH SYNOPSIS
@@ -111,14 +112,15 @@ do an operation and it is about to write data to the terminal, it
mixing progress meter and response data.
If you want a progress meter for HTTP POST or PUT requests, you need to
-redirect the response output to a file, using shell redirect (>), -o [file] or
+redirect the response output to a file, using shell redirect (>), \fI-o, --output\fP or
similar.
It is not the same case for FTP upload as that operation does not spit out
any response data to the terminal.
If you prefer a progress "bar" instead of the regular meter, \fI-#, --progress-bar\fP is
-your friend.
+your friend. You can also disable the progress meter completely with the
+\fI-s, --silent\fP option.
.SH OPTIONS
Options start with one or two dashes. Many of the options require an
additional value next to them.
@@ -138,6 +140,12 @@ but prefix it with "no-". However, in this list we mostly only list and show
the --option version of them. (This concept with --no options was added in
7.19.0. Previously most options were toggled on/off on repeated use of the
same command line option.)
+.IP "--abstract-unix-socket <path>"
+(HTTP) Connect through an abstract Unix domain socket, instead of using the network.
+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 "--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
@@ -251,12 +259,7 @@ See also \fI--cert-type\fP and \fI--key\fP and \fI--key-type\fP.
(TLS) Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
- https://www.openssl.org/docs/apps/ciphers.html
-
-NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of NSS
-ciphers is in the NSSCipherSuite entry at this URL:
-
- https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives
+ https://curl.haxx.se/docs/ssl-ciphers.html
If this option is used several times, the last one will be used.
.IP "--compressed"
@@ -264,11 +267,12 @@ If this option is used several times, the last one will be used.
save the uncompressed document. If this option is used and the server sends
an unsupported encoding, curl will report an error.
.IP "-K, --config <file>"
-Specify which config file to read curl arguments from. The config file is a
-text file in which command line arguments can be written which then will be
-used as if they were written on the actual command line.
-Options and their parameters must be specified on the same config file line,
+Specify a text file to read curl arguments from. The command line arguments
+found in the text file will be used as if they were provided on the command
+line.
+
+Options and their parameters must be specified on the same line in the file,
separated by whitespace, colon, or the equals sign. Long option names can
optionally be given in the config file without the initial double dashes and
if so, the colon or equals characters can be used as separators. If the option
@@ -290,9 +294,9 @@ line. So, it could look similar to this:
url = "https://curl.haxx.se/docs/"
-When curl is invoked, it always (unless \fI-q, --disable\fP is used) checks for a
-default config file and uses it if found. The default config file is checked
-for in the following places in this order:
+When curl is invoked, it (unless \fI-q, --disable\fP is used) checks for a default
+config file and uses it if found. The default config file is checked for in
+the following places in this order:
1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
@@ -594,12 +598,6 @@ 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 "--environment"
-Sets a range of environment variables, using the names the \fI-w, --write-out\fP option
-supports, to allow easier extraction of useful information after having run
-curl.
-
-\fI--environment\fP requires that the underlying libcurl was built to support RISC OS.
.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
@@ -608,7 +606,7 @@ curl stops waiting, it will continue as if the response has been received.
See also \fI--connect-timeout\fP. Added in 7.47.0.
.IP "--fail-early"
-Fail and exit on first detected error.
+Fail and exit on the first detected transfer error.
When curl is used to do multiple transfers on the command line, it will
attempt to operate on each given URL, one by one. By default, it will ignore
@@ -616,12 +614,15 @@ errors if there are more URLs given and the last URL's success will determine
the error code curl returns. So early failures will be "hidden" by subsequent
successful transfers.
-Using this option, curl will instead return an error on the first transfers
-that fails, independent on the amount of more URLs that are given on the
-command line. This way, no transfer failures go undetected by scripts and
-similar.
+Using this option, curl will instead return an error on the first transfer
+that fails, independent of the amount of URLs that are given on the command
+line. This way, no transfer failures go undetected by scripts and similar.
-This option will apply for all given URLs even if you use \fI-:, --next\fP.
+This option is global and does not need to be specified for each use of \fI-:, --next\fP.
+
+This option does not imply \fI-f, --fail\fP, which causes transfers to fail due to the
+server's HTTP status code. You can combine the two options, however note \fI-f, --fail\fP
+is not global and is therefore contained by \fI-:, --next\fP.
Added in 7.52.0.
.IP "-f, --fail"
@@ -837,9 +838,8 @@ contents but they should be encoded according to the URI standard.
(HTTP FTP FILE) Fetch the headers only! HTTP-servers feature the command HEAD which this uses
to get nothing but the header of a document. When used on an FTP or FILE file,
curl displays the file size and last modification time only.
-.IP "-H, --header <header>"
-(HTTP)
-Extra header to include in the request when sending HTTP to a server. You may
+.IP "-H, --header <header/@file>"
+(HTTP) Extra header to include in the request when sending HTTP to a server. You may
specify any number of extra headers. Note that if you should add a custom
header that has the same name as one of the internal ones curl would use, your
externally set header will be used instead of the internal one. This allows
@@ -855,6 +855,10 @@ end-of-line marker, you should thus \fBnot\fP add that as a part of the header
content: do not add newlines or carriage returns, they will only mess things up
for you.
+Starting in 7.55.0, this option can take an argument in @filename style, which
+then adds a header for each line in the input file. Using @- will make curl
+read the header file from stdin.
+
See also the \fI-A, --user-agent\fP and \fI-e, --referer\fP options.
Starting in 7.37.0, you need \fI--proxy-header\fP to send custom headers intended
@@ -907,18 +911,26 @@ files larger than 2 gigabytes.
For FTP (since 7.46.0), skip the RETR command to figure out the size before
downloading a file.
.IP "-i, --include"
-Include the HTTP-header in the output. The HTTP-header includes things like
-server-name, date of the document, HTTP-version and more...
+Include the HTTP response headers in the output. The HTTP response headers can
+include things like server name, cookies, date of the document, HTTP version
+and more...
+
+To view the request headers, consider the \fI-v, --verbose\fP option.
See also \fI-v, --verbose\fP.
.IP "-k, --insecure"
-(TLS) This option explicitly allows curl to perform "insecure" SSL connections and
-transfers. All SSL connections are attempted to be made secure by using the CA
-certificate bundle installed by default. This makes all connections considered
-\&"insecure" fail unless \fI-k, --insecure\fP is used.
+(TLS)
+By default, every SSL connection curl makes is verified to be secure. This
+option allows curl to proceed and operate even for server connections
+otherwise considered insecure.
+
+The server connection is verified by making sure the server's certificate
+contains the right name and verifies successfully using the cert store.
See this online resource for further details:
https://curl.haxx.se/docs/sslcerts.html
+
+See also \fI--proxy-insecure\fP and \fI--cacert\fP.
.IP "--interface <name>"
Perform an operation using a specified interface. You can enter interface
@@ -1158,7 +1170,7 @@ and password from the \fI-u, --user\fP option aren't actually used.
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 <filemame>"
+.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
netrc file per invocation. If several \fI--netrc-file\fP options are provided,
@@ -1194,7 +1206,7 @@ for each.
\fI-:, --next\fP will reset all local options and only global ones will have their
values survive over to the operation following the \fI-:, --next\fP instruction. Global
-options include \fI-v, --verbose\fP and \fI--fail-early\fP.
+options include \fI-v, --verbose\fP, \fI--trace\fP, \fI--trace-ascii\fP and \fI--fail-early\fP.
For example, you can do both a GET and a POST in a single command line:
@@ -1216,7 +1228,7 @@ Using this option will disable that buffering.
Note that this is the negated option name documented. You can thus use
--buffer to enforce the buffering.
.IP "--no-keepalive"
-Disables the use of keepalive messages on the TCP connection. curl otherwis
+Disables the use of keepalive messages on the TCP connection. curl otherwise
enables them by default.
Note that this is the negated option name documented. You can thus use
@@ -1246,6 +1258,10 @@ a domain which contains the hostname, or the hostname itself. For example,
local.com would match local.com, local.com:80, and www.local.com, but not
www.notlocal.com.
+Since 7.53.0, This option overrides the environment variables that disable the
+proxy. If there's an environment variable disabling a proxy, you can set
+noproxy list to \&"" to override it.
+
Added in 7.19.4.
.IP "--ntlm-wb"
(HTTP) Enables NTLM much in the style \fI--ntlm\fP does, but hand over the authentication
@@ -1266,7 +1282,7 @@ If you want to enable NTLM for your proxy authentication, then use
If this option is used several times, only the first one is used.
See also \fI--proxy-ntlm\fP. \fI--ntlm\fP requires that the underlying libcurl was built to support TLS. This option overrides \fI--basic\fP and \fI--negotiated\fP and \fI--digest\fP and \fI--anyauth\fP.
-.IP "--oauth2-bearer"
+.IP "--oauth2-bearer <token>"
(IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
is used in conjunction with the user name which can be specified as part of
the \fI--url\fP or \fI-u, --user\fP options.
@@ -1361,8 +1377,9 @@ a redirection. This option is meaningful only when using \fI-L, --location\fP.
See also \fI--post302\fP and \fI--post301\fP and \fI-L, --location\fP. Added in 7.26.0.
.IP "--preproxy [protocol://]host[:port]"
-Use the specified proxy before connecting to the ordinary proxy. Hence pre
-proxy. A pre proxy must be a SOCKS speaking proxy.
+Use the specified SOCKS proxy before connecting to an HTTP or HTTPS \fI-x, --proxy\fP. In
+such a case curl first connects to the SOCKS proxy and then connects (through
+SOCKS) to the HTTP or HTTPS proxy. Hence pre proxy.
The pre proxy string should be specified with a protocol:// prefix to specify
alternative proxy protocols. Use socks4://, socks4a://, socks5:// or
@@ -1498,7 +1515,7 @@ Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host.
See also \fI-x, --proxy\fP and \fI--proxy-anyauth\fP and \fI--proxy-basic\fP.
-.IP "--proxy-header <header>"
+.IP "--proxy-header <header/@file>"
(HTTP) Extra header to include in the request when sending HTTP to a proxy. You may
specify any number of extra headers. This is the equivalent option to \fI-H, --header\fP
but is for proxy communication only like in CONNECT requests when you want a
@@ -1512,6 +1529,10 @@ up for you.
Headers specified with this option will not be included in requests that curl
knows will not be sent to a proxy.
+Starting in 7.55.0, this option can take an argument in @filename style, which
+then adds a header for each line in the input file. Using @- will make curl
+read the header file from stdin.
+
This option can be used multiple times to add/replace/remove multiple headers.
Added in 7.37.0.
@@ -1575,11 +1596,16 @@ If this option is used several times, the last one will be used.
.IP "-x, --proxy [protocol://]host[:port]"
Use the specified proxy.
-The proxy string can be specified with a protocol:// prefix to specify
-alternative proxy protocols. Use socks4://, socks4a://, socks5:// or
-socks5h:// to request the specific SOCKS version to be used. No protocol
-specified, http:// and all others will be treated as HTTP proxies. (The
-protocol support was added in curl 7.21.7)
+The proxy string can be specified with a protocol:// prefix. No protocol
+specified or http:// will be treated as HTTP proxy. Use socks4://, socks4a://,
+socks5:// or socks5h:// to request a specific SOCKS version to be used.
+(The protocol support was added in curl 7.21.7)
+
+HTTPS proxy support via https:// protocol prefix was added in 7.52.0 for
+OpenSSL, GnuTLS and NSS.
+
+Unrecognized and unsupported proxy protocols cause an error since 7.52.0.
+Prior versions may ignore the protocol and use http:// instead.
If the port number is not specified in the proxy string, it is assumed to be
1080.
@@ -1616,6 +1642,9 @@ 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.
+To suppress proxy CONNECT response headers when curl is set to output headers
+use \fI--suppress-connect-headers\fP.
+
See also \fI-x, --proxy\fP.
.IP "--pubkey <key>"
(SFTP SCP) Public key file name. Allows you to provide your public key in this separate
@@ -1783,6 +1812,11 @@ You may use this option as many times as the number of URLs you have.
When used, this will make curl attempt to figure out the timestamp of the
remote file, and if that is available make the local file get that same
timestamp.
+.IP "--request-target"
+(HTTP) Tells curl to use an alternative "target" (path) instead of using the path as
+provided in the URL. Particularly useful when wanting to issue HTTP requests
+without leading slash or other data that doesn't follow the regular URL
+pattern, like "OPTIONS *".
.IP "-X, --request <command>"
(HTTP) Specifies a custom request method to use when communicating with the
HTTP server. The specified request method will be used instead of the method
@@ -1890,6 +1924,9 @@ Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
terminal/stdout unless you redirect it.
+Use \fI-S, --show-error\fP in addition to this option to disable progress meter but
+still show error messages.
+
See also \fI-v, --verbose\fP and \fI--stderr\fP.
.IP "--socks4 <host[:port]>"
Use the specified SOCKS4 proxy. If the port number is not specified, it is
@@ -1901,6 +1938,10 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks4 proxy
with \fI-x, --proxy\fP using a socks4:// protocol prefix.
+Since 7.52.0, \fI--preproxy\fP can be used to specify a SOCKS proxy at the same time
+\fI-x, --proxy\fP is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
Added in 7.15.2.
@@ -1914,9 +1955,19 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks4a proxy
with \fI-x, --proxy\fP using a socks4a:// protocol prefix.
+Since 7.52.0, \fI--preproxy\fP can be used to specify a SOCKS proxy at the same time
+\fI-x, --proxy\fP is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
Added in 7.18.0.
+.IP "--socks5-basic"
+Tells curl to use username/password authentication when connecting to a SOCKS5
+proxy. The username/password authentication is enabled by default. Use
+\fI--socks5-gssapi\fP to force GSS-API authentication to SOCKS5 proxies.
+
+Added in 7.55.0.
.IP "--socks5-gssapi-nec"
As part of the GSS-API negotiation a protection mode is negotiated. RFC 1961
says in section 4.3/4.4 it should be protected, but the NEC reference
@@ -1934,6 +1985,13 @@ would use sockd/real-name for cases where the proxy-name does not match the
principal name.
Added in 7.19.4.
+.IP "--socks5-gssapi"
+Tells curl to use GSS-API authentication when connecting to a SOCKS5 proxy.
+The GSS-API authentication is enabled by default (if curl is compiled with
+GSS-API support). Use \fI--socks5-basic\fP to force username/password authentication
+to SOCKS5 proxies.
+
+Added in 7.55.0.
.IP "--socks5-hostname <host[:port]>"
Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If
the port number is not specified, it is assumed at port 1080.
@@ -1944,6 +2002,10 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks5
hostname proxy with \fI-x, --proxy\fP using a socks5h:// protocol prefix.
+Since 7.52.0, \fI--preproxy\fP can be used to specify a SOCKS proxy at the same time
+\fI-x, --proxy\fP is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
Added in 7.18.0.
@@ -1957,6 +2019,10 @@ exclusive.
Since 7.21.7, this option is superfluous since you can specify a socks5 proxy
with \fI-x, --proxy\fP using a socks5:// protocol prefix.
+Since 7.52.0, \fI--preproxy\fP can be used to specify a SOCKS proxy at the same time
+\fI-x, --proxy\fP is used with an HTTP/HTTPS proxy. In such a case curl first connects to
+the SOCKS proxy and then connects (through SOCKS) to the HTTP or HTTPS proxy.
+
If this option is used several times, the last one will be used.
This option (as well as \fI--socks4\fP) does not work with IPV6, FTPS or LDAP.
@@ -2027,6 +2093,13 @@ is a plain '-', it is instead written to stdout.
If this option is used several times, the last one will be used.
See also \fI-v, --verbose\fP and \fI-s, --silent\fP.
+.IP "--suppress-connect-headers"
+When \fI-p, --proxytunnel\fP is used and a CONNECT request is made don't output proxy
+CONNECT response headers. This option is meant to be used with \fI-D, --dump-header\fP or
+\fI-i, --include\fP which are used to show protocol headers in the output. It has no
+effect on debug options such as \fI-v, --verbose\fP or \fI--trace\fP, or any statistics.
+
+See also \fI-D, --dump-header\fP and \fI-i, --include\fP and \fI-p, --proxytunnel\fP.
.IP "--tcp-fastopen"
Enable use of TCP Fast Open (RFC7413).
@@ -2035,7 +2108,7 @@ Added in 7.49.0.
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
details about this option.
-Since 7.50.2, curl sets this option by default and you need to explictitly
+Since 7.50.2, curl sets this option by default and you need to explicitly
switch it off if you don't want it on.
Added in 7.11.2.
@@ -2075,6 +2148,24 @@ that is older than the given date/time, default is a document that is newer
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.
+
+.RS
+.IP "default"
+Use up to recommended TLS version.
+.IP "1.0"
+Use up to TLSv1.0.
+.IP "1.1"
+Use up to TLSv1.1.
+.IP "1.2"
+Use up to TLSv1.2.
+.IP "1.3"
+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.
.IP "--tlsauthtype <type>"
Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are specified but
@@ -2191,7 +2282,7 @@ setting a default protocol, see \fI--proto-default\fP for details.
This option may be used any number of times. To control where this URL is
written, use the \fI-o, --output\fP or the \fI-O, --remote-name\fP options.
.IP "-B, --use-ascii"
-(FTP LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using an URL that
+(FTP LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using a URL that
ends with ";type=A". This option causes data sent to stdout to be in text mode
for win32 systems.
.IP "-A, --user-agent <name>"
@@ -2359,9 +2450,14 @@ Number of new connects made in the recent transfer. (Added in 7.12.3)
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
+.B proxy_ssl_verify_result
+The result of the HTTPS proxy's SSL peer certificate verification that was
+requested. 0 means the verification was successful. (Added in 7.52.0)
+.TP
.B redirect_url
-When an HTTP request was made without -L to follow redirects, this variable
-will show the actual URL a redirect \fIwould\fP take you to. (Added in 7.18.2)
+When an HTTP request was made without \fI-L, --location\fP to follow redirects (or when
+--max-redir is met), this variable will show the actual URL a redirect
+\fIwould\fP have gone to. (Added in 7.18.2)
.TP
.B remote_ip
The remote IP address of the most recently done connection - can be either
@@ -2415,7 +2511,7 @@ about to begin. This includes all pre-transfer commands and negotiations that
are specific to the particular protocol(s) involved.
.TP
.B time_redirect
-The time, in seconds, it took for all redirection steps include name lookup,
+The time, in seconds, it took for all redirection steps including name lookup,
connect, pretransfer and transfer before the final transaction was
started. time_redirect shows the complete execution time for multiple
redirections. (Added in 7.12.3)
@@ -2426,8 +2522,7 @@ about to be transferred. This includes time_pretransfer and also the time the
server needed to calculate the result.
.TP
.B time_total
-The total time, in seconds, that the full operation lasted. The time will be
-displayed with millisecond resolution.
+The total time, in seconds, that the full operation lasted.
.TP
.B url_effective
The URL that was fetched last. This is most meaningful if you've told curl
@@ -2466,6 +2561,16 @@ Sets the proxy server to use if no protocol-specific proxy is set.
.IP "NO_PROXY <comma-separated list of hosts>"
list of host names that shouldn't go through any proxy. If set to a asterisk
\&'*' only, it matches all hosts.
+
+Since 7.53.0, this environment variable disable the proxy even if specify
+\fI-x, --proxy\fP option. That is
+.B NO_PROXY=direct.example.com curl -x http://proxy.example.com
+.B http://direct.example.com
+accesses the target URL directly, and
+.B NO_PROXY=direct.example.com curl -x http://proxy.example.com
+.B http://somewhere.example.com
+accesses the target URL through proxy.
+
.SH "PROXY PROTOCOL PREFIXES"
Since curl version 7.21.7, the proxy string may be specified with a
protocol:// prefix to specify alternative proxy protocols.
@@ -2508,14 +2613,25 @@ Weird server reply. The server sent data curl couldn't parse.
FTP access denied. The server denied login or denied access to the particular
resource or directory you wanted to reach. Most often you tried to change to a
directory that doesn't exist on the server.
+.IP 10
+FTP accept failed. While waiting for the server to connect back when an active
+FTP session is used, an error code was sent over the control connection or
+similar.
.IP 11
FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
+.IP 12
+During an active FTP session while waiting for the server to connect back to
+curl, the timeout expired.
.IP 13
FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
.IP 14
FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
.IP 15
FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
+.IP 16
+HTTP/2 error. A problem was detected in the HTTP2 framing layer. This is
+somewhat generic and can be one out of several problems, see the error message
+for details.
.IP 17
FTP couldn't set binary. Couldn't change transfer method to binary.
.IP 18
@@ -2554,7 +2670,7 @@ HTTP post error. Internal post-request generation error.
.IP 35
SSL connect error. The SSL handshaking failed.
.IP 36
-FTP bad download resume. Couldn't continue an earlier aborted download.
+Bad download resume. Couldn't continue an earlier aborted download.
.IP 37
FILE couldn't read file. Failed to open the file. Permissions?
.IP 38
@@ -2661,8 +2777,6 @@ Daniel Stenberg is the main author, but the whole list of contributors is
found in the separate THANKS file.
.SH WWW
https://curl.haxx.se
-.SH FTP
-ftp://ftp.sunet.se/pub/www/utilities/curl/
.SH "SEE ALSO"
.BR ftp (1),
.BR wget (1)
diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am
index 7a56f345..afd35c20 100644
--- a/docs/examples/Makefile.am
+++ b/docs/examples/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -30,13 +30,9 @@ EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include
+AM_CPPFLAGS = -I$(top_srcdir)/include
LIBDIR = $(top_builddir)/lib
diff --git a/docs/examples/Makefile.in b/docs/examples/Makefile.in
index 91189d74..74247860 100644
--- a/docs/examples/Makefile.in
+++ b/docs/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -43,7 +43,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -158,10 +158,12 @@ check_PROGRAMS = 10-at-a-time$(EXEEXT) anyauthput$(EXEEXT) \
imap-tls$(EXEEXT) imap-multi$(EXEEXT) url2file$(EXEEXT) \
sftpget$(EXEEXT) ftpsget$(EXEEXT) postinmemory$(EXEEXT) \
http2-download$(EXEEXT) http2-upload$(EXEEXT) \
- http2-serverpush$(EXEEXT) getredirect$(EXEEXT)
+ http2-serverpush$(EXEEXT) getredirect$(EXEEXT) \
+ ftpuploadfrommem$(EXEEXT)
subdir = docs/examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -182,8 +184,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
10_at_a_time_SOURCES = 10-at-a-time.c
@@ -293,6 +294,13 @@ ftpupload_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@ftpupload_DEPENDENCIES = \
@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la
+ftpuploadfrommem_SOURCES = ftpuploadfrommem.c
+ftpuploadfrommem_OBJECTS = ftpuploadfrommem.$(OBJEXT)
+ftpuploadfrommem_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@ftpuploadfrommem_DEPENDENCIES = \
+@USE_EXPLICIT_LIB_DEPS_FALSE@ $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@ftpuploadfrommem_DEPENDENCIES = \
+@USE_EXPLICIT_LIB_DEPS_TRUE@ $(LIBDIR)/libcurl.la
getinfo_SOURCES = getinfo.c
getinfo_OBJECTS = getinfo.$(OBJEXT)
getinfo_LDADD = $(LDADD)
@@ -740,16 +748,16 @@ am__v_CCLD_1 =
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 getinfo.c getinmemory.c getredirect.c \
- http-post.c http2-download.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-post.c \
- multi-single.c persistant.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 \
+ ftpsget.c ftpupload.c ftpuploadfrommem.c getinfo.c \
+ getinmemory.c getredirect.c http-post.c http2-download.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-post.c multi-single.c persistant.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 progressfunc.c resolve.c rtsp.c \
sendrecv.c sepheaders.c sftpget.c simple.c simplepost.c \
simplessl.c smtp-expn.c smtp-mail.c smtp-multi.c smtp-ssl.c \
@@ -757,16 +765,16 @@ SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.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 getinfo.c getinmemory.c getredirect.c \
- http-post.c http2-download.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-post.c \
- multi-single.c persistant.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 \
+ ftpsget.c ftpupload.c ftpuploadfrommem.c getinfo.c \
+ getinmemory.c getredirect.c http-post.c http2-download.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-post.c multi-single.c persistant.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 progressfunc.c resolve.c rtsp.c \
sendrecv.c sepheaders.c sftpget.c simple.c simplepost.c \
simplessl.c smtp-expn.c smtp-mail.c smtp-multi.c smtp-ssl.c \
@@ -812,6 +820,12 @@ 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@
@@ -851,6 +865,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -863,6 +879,7 @@ 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@
@@ -1000,13 +1017,10 @@ EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# Avoid libcurl obsolete stuff
-AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \
- -I$(top_srcdir)/include -DCURL_NO_OLDIES $(am__append_1)
+AM_CPPFLAGS = -I$(top_srcdir)/include -DCURL_NO_OLDIES $(am__append_1)
LIBDIR = $(top_builddir)/lib
@USE_EXPLICIT_LIB_DEPS_FALSE@LDADD = $(LIBDIR)/libcurl.la
@@ -1125,6 +1139,10 @@ ftpupload$(EXEEXT): $(ftpupload_OBJECTS) $(ftpupload_DEPENDENCIES) $(EXTRA_ftpup
@rm -f ftpupload$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ftpupload_OBJECTS) $(ftpupload_LDADD) $(LIBS)
+ftpuploadfrommem$(EXEEXT): $(ftpuploadfrommem_OBJECTS) $(ftpuploadfrommem_DEPENDENCIES) $(EXTRA_ftpuploadfrommem_DEPENDENCIES)
+ @rm -f ftpuploadfrommem$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ftpuploadfrommem_OBJECTS) $(ftpuploadfrommem_LDADD) $(LIBS)
+
getinfo$(EXEEXT): $(getinfo_OBJECTS) $(getinfo_DEPENDENCIES) $(EXTRA_getinfo_DEPENDENCIES)
@rm -f getinfo$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(getinfo_OBJECTS) $(getinfo_LDADD) $(LIBS)
@@ -1382,6 +1400,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpgetresp.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpsget.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpupload.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpuploadfrommem.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getinfo.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getinmemory.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getredirect.Po@am__quote@
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc
index 8ce6f57f..b92ad6bd 100644
--- a/docs/examples/Makefile.inc
+++ b/docs/examples/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -32,7 +32,7 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
imap-list imap-lsub imap-fetch imap-store imap-append imap-examine \
imap-search imap-create imap-delete imap-copy imap-noop imap-ssl \
imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
- http2-upload http2-serverpush getredirect
+ http2-upload http2-serverpush getredirect ftpuploadfrommem
# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
diff --git a/docs/examples/Makefile.m32 b/docs/examples/Makefile.m32
index e75b6d13..5fbc5d66 100644
--- a/docs/examples/Makefile.m32
+++ b/docs/examples/Makefile.m32
@@ -84,7 +84,7 @@ endif
endif
CC = $(CROSSPREFIX)gcc
-CFLAGS = -g -O2 -Wall
+CFLAGS = -g -O2 -Wall -W
CFLAGS += -fno-strict-aliasing
ifeq ($(ARCH),w64)
CFLAGS += -m64 -D_AMD64_
diff --git a/docs/examples/Makefile.netware b/docs/examples/Makefile.netware
index 9fe9db45..e75d143d 100644
--- a/docs/examples/Makefile.netware
+++ b/docs/examples/Makefile.netware
@@ -64,7 +64,7 @@ DESCR = curl ($(LIBARCH))
MTSAFE = YES
STACK = 8192
SCREEN = Example Program
-# Comment the line below if you dont want to load protected automatically.
+# Comment the line below if you don't want to load protected automatically.
# LDRING = 3
# Uncomment the next line to enable linking with POSIX semantics.
@@ -136,7 +136,7 @@ endif
CFLAGS += -align 4
else
# PRELUDE = $(NDK_CLIB)/imports/clibpre.o
- # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
+ # to avoid the __init_* / __deinit_* whoes don't use prelude from NDK
PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
# CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
CFLAGS += -align 1
@@ -159,7 +159,7 @@ else
endif
else
# PRELUDE = $(NDK_CLIB)/imports/clibpre.gcc.o
- # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
+ # to avoid the __init_* / __deinit_* whoes don't use prelude from NDK
# http://www.gknw.net/development/mk_nlm/gcc_pre.zip
PRELUDE = $(NDK_ROOT)/pre/prelude.o
CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
diff --git a/docs/examples/anyauthput.c b/docs/examples/anyauthput.c
index 1c9f965d..243a367a 100644
--- a/docs/examples/anyauthput.c
+++ b/docs/examples/anyauthput.c
@@ -29,41 +29,17 @@
#ifdef WIN32
# include <io.h>
#else
-# ifdef __VMS
- typedef int intptr_t;
-# endif
-# if !defined(_AIX) && !defined(__sgi) && !defined(__osf__)
-# include <stdint.h>
-# endif
# include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
-#ifdef _MSC_VER
-# ifdef _WIN64
- typedef __int64 intptr_t;
-# else
- typedef int intptr_t;
-# endif
-#endif
-
#include <curl/curl.h>
#if LIBCURL_VERSION_NUM < 0x070c03
#error "upgrade your libcurl to no less than 7.12.3"
#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#if defined(_AIX) || defined(__sgi) || defined(__osf__)
-#ifndef intptr_t
-#define intptr_t long
-#endif
-#endif
-
/*
* This example shows a HTTP PUT operation with authentiction using "any"
* type. It PUTs a file given as a command line argument to the URL also given
diff --git a/docs/examples/asiohiper.cpp b/docs/examples/asiohiper.cpp
index d6065e55..9e0554f5 100644
--- a/docs/examples/asiohiper.cpp
+++ b/docs/examples/asiohiper.cpp
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -40,8 +40,8 @@
* Note:
* For the sake of simplicity, URL is hard coded to "www.google.com"
*
- * This is purely a demo app, all retrieved data is simply discarded by the write
- * callback.
+ * This is purely a demo app, all retrieved data is simply discarded by the
+ * write callback.
*/
@@ -85,14 +85,12 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
/* cancel running timer */
timer.cancel();
- if(timeout_ms > 0)
- {
+ if(timeout_ms > 0) {
/* update timer */
timer.expires_from_now(boost::posix_time::millisec(timeout_ms));
timer.async_wait(boost::bind(&timer_cb, _1, g));
}
- else
- {
+ else if(timeout_ms == 0) {
/* call timeout function immediately */
boost::system::error_code error; /*success*/
timer_cb(error, g);
@@ -104,11 +102,9 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
/* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code)
{
- if(CURLM_OK != code)
- {
+ if(CURLM_OK != code) {
const char *s;
- switch(code)
- {
+ switch(code) {
case CURLM_CALL_MULTI_PERFORM:
s = "CURLM_CALL_MULTI_PERFORM";
break;
@@ -158,10 +154,8 @@ static void check_multi_info(GlobalInfo *g)
fprintf(MSG_OUT, "\nREMAINING: %d", g->still_running);
- while((msg = curl_multi_info_read(g->multi, &msgs_left)))
- {
- if(msg->msg == CURLMSG_DONE)
- {
+ while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+ if(msg->msg == CURLMSG_DONE) {
easy = msg->easy_handle;
res = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
@@ -176,34 +170,62 @@ static void check_multi_info(GlobalInfo *g)
}
/* Called by asio when there is an action on a socket */
-static void event_cb(GlobalInfo *g, boost::asio::ip::tcp::socket *tcp_socket,
- int action)
+static void event_cb(GlobalInfo *g, curl_socket_t s,
+ int action, const boost::system::error_code & error,
+ int *fdp)
{
fprintf(MSG_OUT, "\nevent_cb: action=%d", action);
- CURLMcode rc;
- rc = curl_multi_socket_action(g->multi, tcp_socket->native_handle(), action,
- &g->still_running);
+ if(socket_map.find(s) == socket_map.end()) {
+ fprintf(MSG_OUT, "\nevent_cb: socket already closed");
+ return;
+ }
+
+ /* make sure the event matches what are wanted */
+ if(*fdp == action || *fdp == CURL_POLL_INOUT) {
+ CURLMcode rc;
+ if(error)
+ action = CURL_CSELECT_ERR;
+ rc = curl_multi_socket_action(g->multi, s, action, &g->still_running);
- mcode_or_die("event_cb: curl_multi_socket_action", rc);
- check_multi_info(g);
+ mcode_or_die("event_cb: curl_multi_socket_action", rc);
+ check_multi_info(g);
+
+ if(g->still_running <= 0) {
+ fprintf(MSG_OUT, "\nlast transfer done, kill timeout");
+ timer.cancel();
+ }
- if(g->still_running <= 0)
- {
- fprintf(MSG_OUT, "\nlast transfer done, kill timeout");
- timer.cancel();
+ /* keep on watching.
+ * the socket may have been closed and/or fdp may have been changed
+ * in curl_multi_socket_action(), so check them both */
+ if(!error && socket_map.find(s) != socket_map.end() &&
+ (*fdp == action || *fdp == CURL_POLL_INOUT)) {
+ boost::asio::ip::tcp::socket *tcp_socket = socket_map.find(s)->second;
+
+ if(action == CURL_POLL_IN) {
+ tcp_socket->async_read_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ action, _1, fdp));
+ }
+ if(action == CURL_POLL_OUT) {
+ tcp_socket->async_write_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ action, _1, fdp));
+ }
+ }
}
}
/* Called by asio when our timeout expires */
static void timer_cb(const boost::system::error_code & error, GlobalInfo *g)
{
- if(!error)
- {
+ if(!error) {
fprintf(MSG_OUT, "\ntimer_cb: ");
CURLMcode rc;
- rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
+ rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0,
+ &g->still_running);
mcode_or_die("timer_cb: curl_multi_socket_action", rc);
check_multi_info(g);
@@ -215,22 +237,21 @@ static void remsock(int *f, GlobalInfo *g)
{
fprintf(MSG_OUT, "\nremsock: ");
- if(f)
- {
+ if(f) {
free(f);
}
}
-static void setsock(int *fdp, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
+static void setsock(int *fdp, curl_socket_t s, CURL *e, int act, int oldact,
+ GlobalInfo *g)
{
fprintf(MSG_OUT, "\nsetsock: socket=%d, act=%d, fdp=%p", s, act, fdp);
- std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(s);
+ std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
+ socket_map.find(s);
- if(it == socket_map.end())
- {
+ if(it == socket_map.end()) {
fprintf(MSG_OUT, "\nsocket %d is a c-ares socket, ignoring", s);
-
return;
}
@@ -238,29 +259,34 @@ static void setsock(int *fdp, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
*fdp = act;
- if(act == CURL_POLL_IN)
- {
+ if(act == CURL_POLL_IN) {
fprintf(MSG_OUT, "\nwatching for socket to become readable");
-
- tcp_socket->async_read_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, tcp_socket, act));
+ if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
+ tcp_socket->async_read_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ CURL_POLL_IN, _1, fdp));
+ }
}
- else if (act == CURL_POLL_OUT)
- {
+ else if(act == CURL_POLL_OUT) {
fprintf(MSG_OUT, "\nwatching for socket to become writable");
-
- tcp_socket->async_write_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, tcp_socket, act));
+ if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
+ tcp_socket->async_write_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ CURL_POLL_OUT, _1, fdp));
+ }
}
- else if(act == CURL_POLL_INOUT)
- {
+ else if(act == CURL_POLL_INOUT) {
fprintf(MSG_OUT, "\nwatching for socket to become readable & writable");
-
- tcp_socket->async_read_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, tcp_socket, act));
-
- tcp_socket->async_write_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, tcp_socket, act));
+ if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
+ tcp_socket->async_read_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ CURL_POLL_IN, _1, fdp));
+ }
+ if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
+ tcp_socket->async_write_some(boost::asio::null_buffers(),
+ boost::bind(&event_cb, g, s,
+ CURL_POLL_OUT, _1, fdp));
+ }
}
}
@@ -269,7 +295,7 @@ static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
/* fdp is used to store current action */
int *fdp = (int *) calloc(sizeof(int), 1);
- setsock(fdp, s, easy, action, g);
+ setsock(fdp, s, easy, action, 0, g);
curl_multi_assign(g->multi, s, fdp);
}
@@ -285,24 +311,20 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
fprintf(MSG_OUT,
"\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
- if(what == CURL_POLL_REMOVE)
- {
+ if(what == CURL_POLL_REMOVE) {
fprintf(MSG_OUT, "\n");
remsock(actionp, g);
}
- else
- {
- if(!actionp)
- {
+ else {
+ if(!actionp) {
fprintf(MSG_OUT, "\nAdding data: %s", whatstr[what]);
addsock(s, e, what, g);
}
- else
- {
+ else {
fprintf(MSG_OUT,
"\nChanging action from %s to %s",
whatstr[*actionp], whatstr[what]);
- setsock(actionp, s, e, what, g);
+ setsock(actionp, s, e, what, *actionp, g);
}
}
@@ -312,9 +334,8 @@ 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, size_t size, size_t nmemb, void *data)
{
-
size_t written = size * nmemb;
- char* pBuffer = (char *) malloc(written + 1);
+ char *pBuffer = (char *)malloc(written + 1);
strncpy(pBuffer, (const char *)ptr, written);
pBuffer[written] = '\0';
@@ -350,28 +371,28 @@ static curl_socket_t opensocket(void *clientp, curlsocktype purpose,
curl_socket_t sockfd = CURL_SOCKET_BAD;
/* restrict to IPv4 */
- if(purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET)
- {
+ if(purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET) {
/* create a tcp socket object */
- boost::asio::ip::tcp::socket *tcp_socket = new boost::asio::ip::tcp::socket(io_service);
+ boost::asio::ip::tcp::socket *tcp_socket =
+ new boost::asio::ip::tcp::socket(io_service);
/* open it and get the native handle*/
boost::system::error_code ec;
tcp_socket->open(boost::asio::ip::tcp::v4(), ec);
- if(ec)
- {
+ if(ec) {
/* An error occurred */
- std::cout << std::endl << "Couldn't open socket [" << ec << "][" << ec.message() << "]";
+ std::cout << std::endl << "Couldn't open socket [" << ec << "][" <<
+ ec.message() << "]";
fprintf(MSG_OUT, "\nERROR: Returning CURL_SOCKET_BAD to signal error");
}
- else
- {
+ else {
sockfd = tcp_socket->native_handle();
fprintf(MSG_OUT, "\nOpened socket %d", sockfd);
/* save it for monitoring */
- socket_map.insert(std::pair<curl_socket_t, boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
+ socket_map.insert(std::pair<curl_socket_t,
+ boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
}
}
@@ -383,10 +404,10 @@ static int close_socket(void *clientp, curl_socket_t item)
{
fprintf(MSG_OUT, "\nclose_socket : %d", item);
- std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it = socket_map.find(item);
+ std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
+ socket_map.find(item);
- if(it != socket_map.end())
- {
+ if(it != socket_map.end()) {
delete it->second;
socket_map.erase(it);
}
@@ -403,10 +424,8 @@ static void new_conn(char *url, GlobalInfo *g)
conn = (ConnInfo *) calloc(1, sizeof(ConnInfo));
conn->easy = curl_easy_init();
- if(!conn->easy)
- {
+ if(!conn->easy) {
fprintf(MSG_OUT, "\ncurl_easy_init() failed, exiting!");
-
exit(2);
}
diff --git a/docs/examples/cacertinmem.c b/docs/examples/cacertinmem.c
index ace58e48..e3c49e02 100644
--- a/docs/examples/cacertinmem.c
+++ b/docs/examples/cacertinmem.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -133,7 +133,7 @@ int main(void)
printf("*** transfer failed ***\n");
/* second try: retrieve page using cacerts' certificate -> will succeed
- * load the certificate by installing a function doing the nescessary
+ * 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);
diff --git a/docs/examples/certinfo.c b/docs/examples/certinfo.c
index de2e3108..1aee614c 100644
--- a/docs/examples/certinfo.c
+++ b/docs/examples/certinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -56,24 +56,19 @@ int main(void)
res = curl_easy_perform(curl);
if(!res) {
- union {
- struct curl_slist *to_info;
- struct curl_certinfo *to_certinfo;
- } ptr;
+ struct curl_certinfo *certinfo;
- ptr.to_info = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &certinfo);
- res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ptr.to_info);
-
- if(!res && ptr.to_info) {
+ if(!res && certinfo) {
int i;
- printf("%d certs!\n", ptr.to_certinfo->num_of_certs);
+ printf("%d certs!\n", certinfo->num_of_certs);
- for(i = 0; i < ptr.to_certinfo->num_of_certs; i++) {
+ for(i = 0; i < certinfo->num_of_certs; i++) {
struct curl_slist *slist;
- for(slist = ptr.to_certinfo->certinfo[i]; slist; slist = slist->next)
+ for(slist = certinfo->certinfo[i]; slist; slist = slist->next)
printf("%s\n", slist->data);
}
diff --git a/docs/examples/cookie_interface.c b/docs/examples/cookie_interface.c
index 064c7b32..2af0619b 100644
--- a/docs/examples/cookie_interface.c
+++ b/docs/examples/cookie_interface.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -47,7 +47,8 @@ print_cookies(CURL *curl)
curl_easy_strerror(res));
exit(1);
}
- nc = cookies, i = 1;
+ nc = cookies;
+ i = 1;
while(nc) {
printf("[%d]: %s\n", i, nc->data);
nc = nc->next;
@@ -93,9 +94,9 @@ main(void)
#endif
/* Netscape format cookie */
snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
- ".google.com", "TRUE", "/", "FALSE",
+ ".example.com", "TRUE", "/", "FALSE",
(unsigned long)time(NULL) + 31337UL,
- "PREF", "hello google, i like you very much!");
+ "PREF", "hello example, i like you very much!");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if(res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n",
@@ -111,7 +112,7 @@ main(void)
*/
snprintf(nline, sizeof(nline),
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
- "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
+ "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.example.com");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if(res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n",
diff --git a/docs/examples/curlx.c b/docs/examples/curlx.c
index cd1677af..db0ed24d 100644
--- a/docs/examples/curlx.c
+++ b/docs/examples/curlx.c
@@ -101,7 +101,7 @@
static const char *curlx_usage[]={
"usage: curlx args\n",
" -p12 arg - tia file ",
- " -envpass arg - environement variable which content the tia private"
+ " -envpass arg - environment variable which content the tia private"
" key password",
" -out arg - output file (response)- default stdout",
" -in arg - input file (request)- default stdin",
diff --git a/docs/examples/debug.c b/docs/examples/debug.c
index cbf1c110..e8a87ea4 100644
--- a/docs/examples/debug.c
+++ b/docs/examples/debug.c
@@ -91,6 +91,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
diff --git a/docs/examples/evhiperfifo.c b/docs/examples/evhiperfifo.c
index efe42475..9cb8eae4 100644
--- a/docs/examples/evhiperfifo.c
+++ b/docs/examples/evhiperfifo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -124,7 +124,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
ev_timer_init(&g->timer_event, timer_cb, t, 0.);
ev_timer_start(g->loop, &g->timer_event);
}
- else
+ else if(timeout_ms == 0)
timer_cb(g->loop, &g->timer_event, 0);
return 0;
}
diff --git a/docs/examples/externalsocket.c b/docs/examples/externalsocket.c
index 918f0821..0ac113db 100644
--- a/docs/examples/externalsocket.c
+++ b/docs/examples/externalsocket.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -38,7 +38,7 @@
#include <sys/types.h> /* socket types */
#include <sys/socket.h> /* socket definitions */
#include <netinet/in.h>
-#include <arpa/inet.h> /* inet (3) funtions */
+#include <arpa/inet.h> /* inet (3) functions */
#include <unistd.h> /* misc. Unix functions */
#endif
@@ -58,6 +58,13 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
return written;
}
+static int closecb(void *clientp, curl_socket_t item)
+{
+ (void)clientp;
+ printf("libcurl wants to close %d now\n", (int)item);
+ return 0;
+}
+
static curl_socket_t opensocket(void *clientp,
curlsocktype purpose,
struct curl_sockaddr *address)
@@ -137,6 +144,10 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+ /* call this function to close sockets */
+ curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closecb);
+ curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+
/* call this function to set options for the socket */
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c
index 7435264a..1e0a09a0 100644
--- a/docs/examples/fopen.c
+++ b/docs/examples/fopen.c
@@ -10,8 +10,8 @@
* instead of (only) local files. Local files (ie those that can be directly
* fopened) will drop back to using the underlying clib implementations
*
- * See the main() function at the bottom that shows an app that retrives from a
- * specified url using fgets() and fread() and saves as two output files.
+ * 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 Simtec Electronics
*
@@ -88,7 +88,7 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file);
void url_rewind(URL_FILE *file);
/* we use a global one for convenience */
-CURLM *multi_handle;
+static CURLM *multi_handle;
/* curl calls this routine to get more data */
static size_t write_callback(char *buffer,
@@ -345,7 +345,7 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
fill_buffer(file, want);
- /* check if theres data in the buffer - if not fill_buffer()
+ /* check if there's data in the buffer - if not fill_buffer()
* either errored or EOF */
if(!file->buffer_pos)
return 0;
@@ -384,7 +384,7 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
case CFTYPE_CURL:
fill_buffer(file, want);
- /* check if theres data in the buffer - if not fill either errored or
+ /* check if there's data in the buffer - if not fill either errored or
* EOF */
if(!file->buffer_pos)
return NULL;
@@ -404,7 +404,7 @@ char *url_fgets(char *ptr, size_t size, URL_FILE *file)
/* xfer data to caller */
memcpy(ptr, file->buffer, want);
- ptr[want]=0;/* allways null terminate */
+ ptr[want]=0;/* always null terminate */
use_buffer(file, want);
@@ -450,7 +450,7 @@ void url_rewind(URL_FILE *file)
#define FREADFILE "fread.test"
#define REWINDFILE "rewind.test"
-/* Small main program to retrive from a url using fgets and fread saving the
+/* Small main program to retrieve from a url using fgets and fread saving the
* output to two test files (note the fgets method will corrupt binary files if
* they contain 0 chars */
int main(int argc, char *argv[])
diff --git a/docs/examples/ftpuploadfrommem.c b/docs/examples/ftpuploadfrommem.c
new file mode 100644
index 00000000..134cda36
--- /dev/null
+++ b/docs/examples/ftpuploadfrommem.c
@@ -0,0 +1,124 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * FTP upload a file from memory
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+static const char data[]=
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+ "Nam rhoncus odio id venenatis volutpat. Vestibulum dapibus "
+ "bibendum ullamcorper. Maecenas finibus elit augue, vel "
+ "condimentum odio maximus nec. In hac habitasse platea dictumst. "
+ "Vestibulum vel dolor et turpis rutrum finibus ac at nulla. "
+ "Vivamus nec neque ac elit blandit pretium vitae maximus ipsum. "
+ "Quisque sodales magna vel erat auctor, sed pellentesque nisi "
+ "rhoncus. Donec vehicula maximus pretium. Aliquam eu tincidunt "
+ "lorem.";
+
+struct WriteThis {
+ const char *readptr;
+ size_t sizeleft;
+};
+
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+ struct WriteThis *upload = (struct WriteThis *)userp;
+ size_t max = size*nmemb;
+
+ if(max < 1)
+ return 0;
+
+ if(upload->sizeleft) {
+ size_t copylen = max;
+ if(copylen > upload->sizeleft)
+ copylen = upload->sizeleft;
+ memcpy(ptr, upload->readptr, copylen);
+ upload->readptr += copylen;
+ upload->sizeleft -= copylen;
+ return copylen;
+ }
+
+ return 0; /* no more data left to deliver */
+}
+
+int main(void)
+{
+ CURL *curl;
+ CURLcode res;
+
+ struct WriteThis upload;
+
+ upload.readptr = data;
+ upload.sizeleft = strlen(data);
+
+ /* In windows, this will init the winsock stuff */
+ res = curl_global_init(CURL_GLOBAL_DEFAULT);
+ /* Check for errors */
+ if(res != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed: %s\n",
+ curl_easy_strerror(res));
+ return 1;
+ }
+
+ /* get a curl handle */
+ curl = curl_easy_init();
+ if(curl) {
+ /* First set the URL, the target file */
+ curl_easy_setopt(curl, CURLOPT_URL,
+ "ftp://example.com/path/to/upload/file");
+
+ /* User and password for the FTP login */
+ curl_easy_setopt(curl, CURLOPT_USERPWD, "login:secret");
+
+ /* Now specify we want to UPLOAD data */
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ /* we want to use our own read function */
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+ /* pointer to pass to our read function */
+ curl_easy_setopt(curl, CURLOPT_READDATA, &upload);
+
+ /* get verbose debug output please */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* Set the expected upload size. */
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+ (curl_off_t)upload.sizeleft);
+
+ /* 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);
+ }
+ curl_global_cleanup();
+ return 0;
+}
diff --git a/docs/examples/ghiper.c b/docs/examples/ghiper.c
index a1af4c5a..505e90ab 100644
--- a/docs/examples/ghiper.c
+++ b/docs/examples/ghiper.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -163,6 +163,15 @@ 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
+ */
g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
return 0;
}
diff --git a/docs/examples/hiperfifo.c b/docs/examples/hiperfifo.c
index f08fcda9..45b69b0d 100644
--- a/docs/examples/hiperfifo.c
+++ b/docs/examples/hiperfifo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -108,8 +108,6 @@ typedef struct _SockInfo
GlobalInfo *global;
} SockInfo;
-
-
/* Update the event timer after curl_multi library calls */
static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
{
@@ -119,6 +117,16 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
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
+ */
evtimer_add(g->timer_event, &timeout);
return 0;
}
diff --git a/docs/examples/htmltitle.cpp b/docs/examples/htmltitle.cpp
index 5e6b4a00..8148888a 100644
--- a/docs/examples/htmltitle.cpp
+++ b/docs/examples/htmltitle.cpp
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,14 +22,14 @@
/* <DESC>
* Get a web page, extract the title with libxml.
* </DESC>
- */
-// Written by Lars Nilsson
-//
-// GNU C++ compile command line suggestion (edit paths accordingly):
-//
-// g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cpp \
-// -o htmltitle -L/opt/curl/lib -L/opt/libxml/lib -lcurl -lxml2
+ Written by Lars Nilsson
+
+ GNU C++ compile command line suggestion (edit paths accordingly):
+
+ g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cpp \
+ -o htmltitle -L/opt/curl/lib -L/opt/libxml/lib -lcurl -lxml2
+*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -72,7 +72,7 @@ static std::string buffer;
static int writer(char *data, size_t size, size_t nmemb,
std::string *writerData)
{
- if (writerData == NULL)
+ if(writerData == NULL)
return 0;
writerData->append(data, size*nmemb);
@@ -90,50 +90,38 @@ static bool init(CURL *&conn, char *url)
conn = curl_easy_init();
- if (conn == NULL)
- {
+ if(conn == NULL) {
fprintf(stderr, "Failed to create CURL connection\n");
-
exit(EXIT_FAILURE);
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to set error buffer [%d]\n", code);
-
return false;
}
code = curl_easy_setopt(conn, CURLOPT_URL, url);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
-
return false;
}
code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1L);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to set redirect option [%s]\n", errorBuffer);
-
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to set writer [%s]\n", errorBuffer);
-
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, &buffer);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to set write data [%s]\n", errorBuffer);
-
return false;
}
@@ -150,8 +138,7 @@ static void StartElement(void *voidContext,
{
Context *context = (Context *)voidContext;
- if (COMPARE((char *)name, "TITLE"))
- {
+ if(COMPARE((char *)name, "TITLE")) {
context->title = "";
context->addTitle = true;
}
@@ -167,7 +154,7 @@ static void EndElement(void *voidContext,
{
Context *context = (Context *)voidContext;
- if (COMPARE((char *)name, "TITLE"))
+ if(COMPARE((char *)name, "TITLE"))
context->addTitle = false;
}
@@ -179,7 +166,7 @@ static void handleCharacters(Context *context,
const xmlChar *chars,
int length)
{
- if (context->addTitle)
+ if(context->addTitle)
context->title.append((char *)chars, length);
}
@@ -273,10 +260,8 @@ int main(int argc, char *argv[])
// Ensure one argument is given
- if (argc != 2)
- {
+ if(argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]);
-
exit(EXIT_FAILURE);
}
@@ -284,10 +269,8 @@ int main(int argc, char *argv[])
// Initialize CURL connection
- if (!init(conn, argv[1]))
- {
+ if(!init(conn, argv[1])) {
fprintf(stderr, "Connection initializion failed\n");
-
exit(EXIT_FAILURE);
}
@@ -296,19 +279,15 @@ int main(int argc, char *argv[])
code = curl_easy_perform(conn);
curl_easy_cleanup(conn);
- if (code != CURLE_OK)
- {
+ if(code != CURLE_OK) {
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
-
exit(EXIT_FAILURE);
}
// Parse the (assumed) HTML code
-
parseHtml(buffer, title);
// Display the extracted title
-
printf("Title: %s\n", title.c_str());
return EXIT_SUCCESS;
diff --git a/docs/examples/http2-download.c b/docs/examples/http2-download.c
index c82fed28..8e28eaa7 100644
--- a/docs/examples/http2-download.c
+++ b/docs/examples/http2-download.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -43,8 +43,8 @@
#define NUM_HANDLES 1000
-void *curl_hnd[NUM_HANDLES];
-int num_transfers;
+static void *curl_hnd[NUM_HANDLES];
+static int num_transfers;
/* a handle to number lookup, highly ineffective when we do many
transfers... */
@@ -117,6 +117,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "== %d Info: %s", num, data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
@@ -159,7 +160,7 @@ static void setup(CURL *hnd, int num)
/* set the same URL */
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
- /* send it verbose for max debuggaility */
+ /* please be verbose */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
diff --git a/docs/examples/http2-serverpush.c b/docs/examples/http2-serverpush.c
index ecd9cc5d..b497e76a 100644
--- a/docs/examples/http2-serverpush.c
+++ b/docs/examples/http2-serverpush.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -96,6 +96,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
@@ -135,7 +136,7 @@ static void setup(CURL *hnd)
/* set the same URL */
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
- /* send it verbose for max debuggaility */
+ /* please be verbose */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
diff --git a/docs/examples/http2-upload.c b/docs/examples/http2-upload.c
index 67e17f34..43809ab6 100644
--- a/docs/examples/http2-upload.c
+++ b/docs/examples/http2-upload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -45,8 +45,8 @@
#define NUM_HANDLES 1000
-void *curl_hnd[NUM_HANDLES];
-int num_transfers;
+static void *curl_hnd[NUM_HANDLES];
+static int num_transfers;
/* a handle to number lookup, highly ineffective when we do many
transfers... */
@@ -136,6 +136,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "%s [%d] Info: %s", timebuf, num, data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
@@ -177,7 +178,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
return retcode;
}
-struct input indata[NUM_HANDLES];
+static struct input indata[NUM_HANDLES];
static void setup(CURL *hnd, int num, const char *upload)
{
@@ -215,7 +216,7 @@ static void setup(CURL *hnd, int num, const char *upload)
/* upload please */
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
- /* send it verbose for max debuggaility */
+ /* please be verbose */
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
diff --git a/docs/examples/imap-copy.c b/docs/examples/imap-copy.c
index 4c3b640b..1ef43f89 100644
--- a/docs/examples/imap-copy.c
+++ b/docs/examples/imap-copy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,7 +48,7 @@ int main(void)
/* This is source mailbox folder to select */
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX");
- /* Set the COPY command specifing the message ID and destination folder */
+ /* Set the COPY command specifying the message ID and destination folder */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "COPY 1 FOLDER");
/* Note that to perform a move operation you will need to perform the copy,
diff --git a/docs/examples/imap-create.c b/docs/examples/imap-create.c
index 8f72cb8f..6f04453b 100644
--- a/docs/examples/imap-create.c
+++ b/docs/examples/imap-create.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,7 +48,7 @@ int main(void)
/* This is just the server URL */
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
- /* Set the CREATE command specifing the new folder name */
+ /* Set the CREATE command specifying the new folder name */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CREATE FOLDER");
/* Perform the custom request */
diff --git a/docs/examples/imap-delete.c b/docs/examples/imap-delete.c
index bd9d1a49..cf1ae0bb 100644
--- a/docs/examples/imap-delete.c
+++ b/docs/examples/imap-delete.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,7 +48,7 @@ int main(void)
/* This is just the server URL */
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
- /* Set the DELETE command specifing the existing folder */
+ /* Set the DELETE command specifying the existing folder */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE FOLDER");
/* Perform the custom request */
diff --git a/docs/examples/imap-examine.c b/docs/examples/imap-examine.c
index 4287f8a1..b89e9dc6 100644
--- a/docs/examples/imap-examine.c
+++ b/docs/examples/imap-examine.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,7 +48,7 @@ int main(void)
/* This is just the server URL */
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
- /* Set the EXAMINE command specifing the mailbox folder */
+ /* Set the EXAMINE command specifying the mailbox folder */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXAMINE OUTBOX");
/* Perform the custom request */
diff --git a/docs/examples/imap-search.c b/docs/examples/imap-search.c
index f1261e1e..427dcc90 100644
--- a/docs/examples/imap-search.c
+++ b/docs/examples/imap-search.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,7 +48,7 @@ int main(void)
/* This is mailbox folder to select */
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX");
- /* Set the SEARCH command specifing what we want to search for. Note that
+ /* Set the SEARCH command specifying what we want to search for. Note that
* this can contain a message sequence set and a number of search criteria
* keywords including flags such as ANSWERED, DELETED, DRAFT, FLAGGED, NEW,
* RECENT and SEEN. For more information about the search criteria please
diff --git a/docs/examples/multi-debugcallback.c b/docs/examples/multi-debugcallback.c
index be241fc7..07f044b4 100644
--- a/docs/examples/multi-debugcallback.c
+++ b/docs/examples/multi-debugcallback.c
@@ -99,6 +99,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
diff --git a/docs/examples/multi-uv.c b/docs/examples/multi-uv.c
index c0228945..ceddad04 100644
--- a/docs/examples/multi-uv.c
+++ b/docs/examples/multi-uv.c
@@ -46,7 +46,7 @@ typedef struct curl_context_s {
curl_socket_t sockfd;
} curl_context_t;
-curl_context_t* create_curl_context(curl_socket_t sockfd)
+static curl_context_t* create_curl_context(curl_socket_t sockfd)
{
curl_context_t *context;
@@ -60,18 +60,18 @@ curl_context_t* create_curl_context(curl_socket_t sockfd)
return context;
}
-void curl_close_cb(uv_handle_t *handle)
+static void curl_close_cb(uv_handle_t *handle)
{
curl_context_t *context = (curl_context_t *) handle->data;
free(context);
}
-void destroy_curl_context(curl_context_t *context)
+static void destroy_curl_context(curl_context_t *context)
{
uv_close((uv_handle_t *) &context->poll_handle, curl_close_cb);
}
-void add_download(const char *url, int num)
+static void add_download(const char *url, int num)
{
char filename[50];
FILE *file;
@@ -129,14 +129,12 @@ static void check_multi_info(void)
}
}
-void curl_perform(uv_poll_t *req, int status, int events)
+static void curl_perform(uv_poll_t *req, int status, int events)
{
int running_handles;
int flags = 0;
curl_context_t *context;
- uv_timer_stop(&timeout);
-
if(events & UV_READABLE)
flags |= CURL_CSELECT_IN;
if(events & UV_WRITABLE)
@@ -150,7 +148,7 @@ void curl_perform(uv_poll_t *req, int status, int events)
check_multi_info();
}
-void on_timeout(uv_timer_t *req, int status)
+static void on_timeout(uv_timer_t *req)
{
int running_handles;
curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
@@ -158,15 +156,21 @@ void on_timeout(uv_timer_t *req, int status)
check_multi_info();
}
-void start_timeout(CURLM *multi, long timeout_ms, void *userp)
+static int start_timeout(CURLM *multi, long timeout_ms, void *userp)
{
- if(timeout_ms <= 0)
- timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in
- a bit */
- uv_timer_start(&timeout, on_timeout, timeout_ms, 0);
+ if(timeout_ms < 0) {
+ uv_timer_stop(&timeout);
+ }
+ else {
+ if(timeout_ms == 0)
+ timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it
+ in a bit */
+ uv_timer_start(&timeout, on_timeout, timeout_ms, 0);
+ }
+ return 0;
}
-int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
+static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
void *socketp)
{
curl_context_t *curl_context;
diff --git a/docs/examples/multithread.c b/docs/examples/multithread.c
index 475e8fcf..26c40f5a 100644
--- a/docs/examples/multithread.c
+++ b/docs/examples/multithread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,10 +33,10 @@
/*
List of URLs to fetch.
- If you intend to use a SSL-based protocol here you MUST setup the OpenSSL
- callback functions as described here:
+ If you intend to use a SSL-based protocol here you might need to setup TLS
+ library mutex callbacks as described here:
- https://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
+ https://curl.haxx.se/libcurl/c/threadsafe.html
*/
const char * const urls[NUMT]= {
diff --git a/docs/examples/pop3-top.c b/docs/examples/pop3-top.c
index f452b412..4f5937fd 100644
--- a/docs/examples/pop3-top.c
+++ b/docs/examples/pop3-top.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -21,7 +21,7 @@
***************************************************************************/
/* <DESC>
- * POP3 example showing how to retreive only the headers of an e-mail
+ * POP3 example showing how to retrieve only the headers of an e-mail
* </DESC>
*/
diff --git a/docs/examples/post-callback.c b/docs/examples/post-callback.c
index f4cd50c0..dbf24914 100644
--- a/docs/examples/post-callback.c
+++ b/docs/examples/post-callback.c
@@ -28,7 +28,7 @@
#include <string.h>
#include <curl/curl.h>
-const char data[]="this is what we post to the silly web server";
+static const char data[]="this is what we post to the silly web server";
struct WriteThis {
const char *readptr;
diff --git a/docs/examples/sampleconv.c b/docs/examples/sampleconv.c
index eece6aae..96eff466 100644
--- a/docs/examples/sampleconv.c
+++ b/docs/examples/sampleconv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -42,49 +42,49 @@
#include <stdio.h>
#include <curl/curl.h>
-CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
+static CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
{
- char *tempptrin, *tempptrout;
- size_t bytes = length;
- int rc;
- tempptrin = tempptrout = buffer;
- rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
- if(rc == PLATFORM_CONV_OK) {
- return CURLE_OK;
- }
- else {
- return CURLE_CONV_FAILED;
- }
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
}
-CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
+static CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
{
- char *tempptrin, *tempptrout;
- size_t bytes = length;
- int rc;
- tempptrin = tempptrout = buffer;
- rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
- if(rc == PLATFORM_CONV_OK) {
- return CURLE_OK;
- }
- else {
- return CURLE_CONV_FAILED;
- }
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
}
-CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
+static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
{
- char *tempptrin, *tempptrout;
- size_t bytes = length;
- int rc;
- tempptrin = tempptrout = buffer;
- rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
- if(rc == PLATFORM_CONV_OK) {
- return CURLE_OK;
- }
- else {
- return CURLE_CONV_FAILED;
- }
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
}
int main(void)
diff --git a/docs/examples/sendrecv.c b/docs/examples/sendrecv.c
index 66232348..2b9dc9b1 100644
--- a/docs/examples/sendrecv.c
+++ b/docs/examples/sendrecv.c
@@ -52,7 +52,7 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
}
/* select() returns the number of signalled sockets or -1 */
- res = select(sockfd + 1, &infd, &outfd, &errfd, &tv);
+ res = select((int)sockfd + 1, &infd, &outfd, &errfd, &tv);
return res;
}
diff --git a/docs/examples/usercertinmem.c b/docs/examples/usercertinmem.c
index 47573ebb..77fde911 100644
--- a/docs/examples/usercertinmem.c
+++ b/docs/examples/usercertinmem.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 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
@@ -20,8 +20,7 @@
*
***************************************************************************/
/* <DESC>
-/* Example using an in memory PEM user certificate and RSA key to retrieve an
- * https page.
+ * Use an in-memory user certificate and RSA key and retrieve an https page.
* </DESC>
*/
/* Written by Ishan SinghLevett, based on Theo Borm's cacertinmem.c.
diff --git a/docs/libcurl/CMakeLists.txt b/docs/libcurl/CMakeLists.txt
new file mode 100644
index 00000000..0b32c505
--- /dev/null
+++ b/docs/libcurl/CMakeLists.txt
@@ -0,0 +1,55 @@
+# Load man_MANS from shared file
+transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+
+function(add_manual_pages _listname)
+ foreach(_file IN LISTS ${_listname})
+ if(_file STREQUAL "libcurl-symbols.3")
+ # Special case, an auto-generated file.
+ set(_srcfile "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
+ else()
+ set(_srcfile "${CMAKE_CURRENT_SOURCE_DIR}/${_file}")
+ endif()
+
+ string(REPLACE ".3" ".html" _htmlfile "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
+ add_custom_command(OUTPUT "${_htmlfile}"
+ COMMAND roffit "--mandir=${CMAKE_CURRENT_SOURCE_DIR}" "${_srcfile}" > "${_htmlfile}"
+ DEPENDS "${_srcfile}"
+ VERBATIM
+ )
+
+ string(REPLACE ".3" ".pdf" _pdffile "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
+ string(REPLACE ".3" ".ps" _psfile "${CMAKE_CURRENT_BINARY_DIR}/${_file}")
+ # XXX any reason why groff -Tpdf (for gropdf) is not used?
+ add_custom_command(OUTPUT "${_pdffile}"
+ COMMAND groff -Tps -man "${_srcfile}" > "${_psfile}"
+ COMMAND ps2pdf "${_psfile}" "${_pdffile}"
+ COMMAND "${CMAKE_COMMAND}" -E remove "${_psfile}"
+ DEPENDS "${_srcfile}"
+ #BYPRODUCTS "${_psfile}"
+ VERBATIM
+ )
+ # "BYPRODUCTS" for add_custom_command requires CMake 3.2. For now hope that
+ # the temporary files are removed (i.e. the command is not interrupted).
+ endforeach()
+endfunction()
+
+add_custom_command(OUTPUT libcurl-symbols.3
+ COMMAND
+ "${PERL_EXECUTABLE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/mksymbolsmanpage.pl" <
+ "${CMAKE_CURRENT_SOURCE_DIR}/symbols-in-versions" > libcurl-symbols.3
+ DEPENDS
+ "${CMAKE_CURRENT_SOURCE_DIR}/symbols-in-versions"
+ "${CMAKE_CURRENT_SOURCE_DIR}/mksymbolsmanpage.pl"
+ VERBATIM
+)
+
+add_manual_pages(man_MANS)
+
+string(REPLACE ".3" ".html" HTMLPAGES "${man_MANS}")
+string(REPLACE ".3" ".pdf" PDFPAGES "${man_MANS}")
+add_custom_target(html DEPENDS ${HTMLPAGES})
+add_custom_target(pdf DEPENDS ${PDFPAGES})
+
+add_subdirectory(opts)
diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am
index 2d51b460..8a232e83 100644
--- a/docs/libcurl/Makefile.am
+++ b/docs/libcurl/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -24,74 +24,22 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
SUBDIRS = opts
-man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
- curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \
- curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \
- curl_slist_append.3 curl_slist_free_all.3 curl_version.3 \
- curl_version_info.3 curl_escape.3 curl_unescape.3 curl_free.3 \
- curl_strequal.3 curl_mprintf.3 curl_global_init.3 \
- curl_global_cleanup.3 curl_multi_add_handle.3 curl_multi_cleanup.3 \
- curl_multi_fdset.3 curl_multi_info_read.3 curl_multi_init.3 \
- curl_multi_perform.3 curl_multi_remove_handle.3 curl_share_cleanup.3 \
- curl_share_init.3 curl_share_setopt.3 libcurl.3 libcurl-easy.3 \
- libcurl-multi.3 libcurl-share.3 libcurl-errors.3 curl_easy_strerror.3 \
- curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
- libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
- curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
- curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
- curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
- curl_multi_socket_action.3 curl_multi_wait.3 libcurl-symbols.3 \
- libcurl-thread.3 curl_multi_socket_all.3
-
-HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
- curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \
- curl_easy_duphandle.html curl_formadd.html curl_formfree.html \
- curl_getdate.html curl_getenv.html curl_slist_append.html \
- curl_slist_free_all.html curl_version.html curl_version_info.html \
- curl_escape.html curl_unescape.html curl_free.html curl_strequal.html \
- curl_mprintf.html curl_global_init.html curl_global_cleanup.html \
- curl_multi_add_handle.html curl_multi_cleanup.html \
- curl_multi_fdset.html curl_multi_info_read.html curl_multi_init.html \
- curl_multi_perform.html curl_multi_remove_handle.html \
- curl_share_cleanup.html curl_share_init.html curl_share_setopt.html \
- libcurl.html libcurl-multi.html libcurl-easy.html libcurl-share.html \
- libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html \
- curl_share_strerror.html curl_global_init_mem.html \
- libcurl-tutorial.html curl_easy_reset.html curl_easy_escape.html \
- curl_easy_unescape.html curl_multi_setopt.html curl_multi_socket.html \
- curl_multi_timeout.html curl_formget.html curl_multi_assign.html \
- curl_easy_pause.html curl_easy_recv.html curl_easy_send.html \
- curl_multi_socket_action.html curl_multi_wait.html \
- libcurl-symbols.html libcurl-thread.html curl_multi_socket_all.html
-
-PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
- curl_easy_init.pdf curl_easy_perform.pdf curl_easy_setopt.pdf \
- curl_easy_duphandle.pdf curl_formadd.pdf curl_formfree.pdf \
- curl_getdate.pdf curl_getenv.pdf curl_slist_append.pdf \
- curl_slist_free_all.pdf curl_version.pdf curl_version_info.pdf \
- curl_escape.pdf curl_unescape.pdf curl_free.pdf curl_strequal.pdf \
- curl_mprintf.pdf curl_global_init.pdf curl_global_cleanup.pdf \
- curl_multi_add_handle.pdf curl_multi_cleanup.pdf curl_multi_fdset.pdf \
- curl_multi_info_read.pdf curl_multi_init.pdf curl_multi_perform.pdf \
- curl_multi_remove_handle.pdf curl_share_cleanup.pdf \
- curl_share_init.pdf curl_share_setopt.pdf libcurl.pdf \
- libcurl-multi.pdf libcurl-easy.pdf libcurl-share.pdf \
- libcurl-errors.pdf curl_easy_strerror.pdf curl_multi_strerror.pdf \
- curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.pdf \
- curl_easy_reset.pdf curl_easy_escape.pdf curl_easy_unescape.pdf \
- curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf \
- curl_formget.pdf curl_multi_assign.pdf curl_easy_pause.pdf \
- curl_easy_recv.pdf curl_easy_send.pdf curl_multi_socket_action.pdf \
- curl_multi_wait.pdf libcurl-symbols.pdf libcurl-thread.pdf \
- curl_multi_socket_all.pdf
+include Makefile.inc
+
+man_DISTMANS = $(man_MANS:.3=.3.dist)
+
+HTMLPAGES = $(man_MANS:.3=.html)
+
+PDFPAGES = $(man_MANS:.3=.pdf)
m4macrodir = $(datadir)/aclocal
dist_m4macro_DATA = libcurl.m4
-CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) libcurl-symbols.3
+CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) $(man_DISTMANS) \
+ libcurl-symbols.3
EXTRA_DIST = $(man_MANS) index.html ABI symbols-in-versions symbols.pl \
- mksymbolsmanpage.pl
+ mksymbolsmanpage.pl CMakeLists.txt
MAN2HTML= roffit --mandir=. $< >$@
SUFFIXES = .3 .html
@@ -100,13 +48,13 @@ libcurl-symbols.3: $(srcdir)/symbols-in-versions $(srcdir)/mksymbolsmanpage.pl
perl $(srcdir)/mksymbolsmanpage.pl < $(srcdir)/symbols-in-versions > $@
html: $(HTMLPAGES)
- cd opts && make html
+ cd opts && $(MAKE) html
.3.html:
$(MAN2HTML)
pdf: $(PDFPAGES)
- cd opts && make pdf
+ cd opts && $(MAKE) pdf
.3.pdf:
@(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \
diff --git a/docs/libcurl/Makefile.in b/docs/libcurl/Makefile.in
index 782272dd..ae72f971 100644
--- a/docs/libcurl/Makefile.in
+++ b/docs/libcurl/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -36,6 +36,8 @@
#
###########################################################################
+# Shared between Makefile.am and CMakeLists.txt
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -112,7 +114,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = docs/libcurl
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -134,8 +137,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
DIST_COMMON = $(srcdir)/Makefile.am $(dist_m4macro_DATA) \
$(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -402,7 +404,8 @@ TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
$(TEST_LOG_FLAGS)
DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/test-driver
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \
+ $(top_srcdir)/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -443,6 +446,12 @@ 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@
@@ -482,6 +491,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -494,6 +505,7 @@ 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@
@@ -621,72 +633,35 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies
SUBDIRS = opts
-man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
- curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \
- curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \
- curl_slist_append.3 curl_slist_free_all.3 curl_version.3 \
- curl_version_info.3 curl_escape.3 curl_unescape.3 curl_free.3 \
- curl_strequal.3 curl_mprintf.3 curl_global_init.3 \
- curl_global_cleanup.3 curl_multi_add_handle.3 curl_multi_cleanup.3 \
- curl_multi_fdset.3 curl_multi_info_read.3 curl_multi_init.3 \
- curl_multi_perform.3 curl_multi_remove_handle.3 curl_share_cleanup.3 \
- curl_share_init.3 curl_share_setopt.3 libcurl.3 libcurl-easy.3 \
- libcurl-multi.3 libcurl-share.3 libcurl-errors.3 curl_easy_strerror.3 \
- curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
- libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
- curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
- curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
- curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
- curl_multi_socket_action.3 curl_multi_wait.3 libcurl-symbols.3 \
- libcurl-thread.3 curl_multi_socket_all.3
-
-HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
- curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \
- curl_easy_duphandle.html curl_formadd.html curl_formfree.html \
- curl_getdate.html curl_getenv.html curl_slist_append.html \
- curl_slist_free_all.html curl_version.html curl_version_info.html \
- curl_escape.html curl_unescape.html curl_free.html curl_strequal.html \
- curl_mprintf.html curl_global_init.html curl_global_cleanup.html \
- curl_multi_add_handle.html curl_multi_cleanup.html \
- curl_multi_fdset.html curl_multi_info_read.html curl_multi_init.html \
- curl_multi_perform.html curl_multi_remove_handle.html \
- curl_share_cleanup.html curl_share_init.html curl_share_setopt.html \
- libcurl.html libcurl-multi.html libcurl-easy.html libcurl-share.html \
- libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html \
- curl_share_strerror.html curl_global_init_mem.html \
- libcurl-tutorial.html curl_easy_reset.html curl_easy_escape.html \
- curl_easy_unescape.html curl_multi_setopt.html curl_multi_socket.html \
- curl_multi_timeout.html curl_formget.html curl_multi_assign.html \
- curl_easy_pause.html curl_easy_recv.html curl_easy_send.html \
- curl_multi_socket_action.html curl_multi_wait.html \
- libcurl-symbols.html libcurl-thread.html curl_multi_socket_all.html
-
-PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
- curl_easy_init.pdf curl_easy_perform.pdf curl_easy_setopt.pdf \
- curl_easy_duphandle.pdf curl_formadd.pdf curl_formfree.pdf \
- curl_getdate.pdf curl_getenv.pdf curl_slist_append.pdf \
- curl_slist_free_all.pdf curl_version.pdf curl_version_info.pdf \
- curl_escape.pdf curl_unescape.pdf curl_free.pdf curl_strequal.pdf \
- curl_mprintf.pdf curl_global_init.pdf curl_global_cleanup.pdf \
- curl_multi_add_handle.pdf curl_multi_cleanup.pdf curl_multi_fdset.pdf \
- curl_multi_info_read.pdf curl_multi_init.pdf curl_multi_perform.pdf \
- curl_multi_remove_handle.pdf curl_share_cleanup.pdf \
- curl_share_init.pdf curl_share_setopt.pdf libcurl.pdf \
- libcurl-multi.pdf libcurl-easy.pdf libcurl-share.pdf \
- libcurl-errors.pdf curl_easy_strerror.pdf curl_multi_strerror.pdf \
- curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.pdf \
- curl_easy_reset.pdf curl_easy_escape.pdf curl_easy_unescape.pdf \
- curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf \
- curl_formget.pdf curl_multi_assign.pdf curl_easy_pause.pdf \
- curl_easy_recv.pdf curl_easy_send.pdf curl_multi_socket_action.pdf \
- curl_multi_wait.pdf libcurl-symbols.pdf libcurl-thread.pdf \
- curl_multi_socket_all.pdf
-
+man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
+ curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \
+ curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \
+ curl_slist_append.3 curl_slist_free_all.3 curl_version.3 \
+ curl_version_info.3 curl_escape.3 curl_unescape.3 curl_free.3 \
+ curl_strequal.3 curl_mprintf.3 curl_global_init.3 \
+ curl_global_cleanup.3 curl_multi_add_handle.3 curl_multi_cleanup.3 \
+ curl_multi_fdset.3 curl_multi_info_read.3 curl_multi_init.3 \
+ curl_multi_perform.3 curl_multi_remove_handle.3 curl_share_cleanup.3 \
+ curl_share_init.3 curl_share_setopt.3 libcurl.3 libcurl-easy.3 \
+ libcurl-multi.3 libcurl-share.3 libcurl-errors.3 curl_easy_strerror.3 \
+ curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
+ libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
+ curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
+ curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
+ curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
+ curl_multi_socket_action.3 curl_multi_wait.3 libcurl-symbols.3 \
+ libcurl-thread.3 curl_multi_socket_all.3
+
+man_DISTMANS = $(man_MANS:.3=.3.dist)
+HTMLPAGES = $(man_MANS:.3=.html)
+PDFPAGES = $(man_MANS:.3=.pdf)
m4macrodir = $(datadir)/aclocal
dist_m4macro_DATA = libcurl.m4
-CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) libcurl-symbols.3
+CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) $(man_DISTMANS) \
+ libcurl-symbols.3
+
EXTRA_DIST = $(man_MANS) index.html ABI symbols-in-versions symbols.pl \
- mksymbolsmanpage.pl
+ mksymbolsmanpage.pl CMakeLists.txt
MAN2HTML = roffit --mandir=. $< >$@
SUFFIXES = .3 .html
@@ -700,7 +675,7 @@ all: all-recursive
.SUFFIXES:
.SUFFIXES: .3 .html .log .pdf .test .test$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -720,6 +695,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
+$(srcdir)/Makefile.inc $(am__empty):
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1256,13 +1232,13 @@ libcurl-symbols.3: $(srcdir)/symbols-in-versions $(srcdir)/mksymbolsmanpage.pl
perl $(srcdir)/mksymbolsmanpage.pl < $(srcdir)/symbols-in-versions > $@
html: $(HTMLPAGES)
- cd opts && make html
+ cd opts && $(MAKE) html
.3.html:
$(MAN2HTML)
pdf: $(PDFPAGES)
- cd opts && make pdf
+ cd opts && $(MAKE) pdf
.3.pdf:
@(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \
diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
new file mode 100644
index 00000000..7463eb37
--- /dev/null
+++ b/docs/libcurl/Makefile.inc
@@ -0,0 +1,20 @@
+# Shared between Makefile.am and CMakeLists.txt
+
+man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
+ curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \
+ curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \
+ curl_slist_append.3 curl_slist_free_all.3 curl_version.3 \
+ curl_version_info.3 curl_escape.3 curl_unescape.3 curl_free.3 \
+ curl_strequal.3 curl_mprintf.3 curl_global_init.3 \
+ curl_global_cleanup.3 curl_multi_add_handle.3 curl_multi_cleanup.3 \
+ curl_multi_fdset.3 curl_multi_info_read.3 curl_multi_init.3 \
+ curl_multi_perform.3 curl_multi_remove_handle.3 curl_share_cleanup.3 \
+ curl_share_init.3 curl_share_setopt.3 libcurl.3 libcurl-easy.3 \
+ libcurl-multi.3 libcurl-share.3 libcurl-errors.3 curl_easy_strerror.3 \
+ curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
+ libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
+ curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
+ curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
+ curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
+ curl_multi_socket_action.3 curl_multi_wait.3 libcurl-symbols.3 \
+ libcurl-thread.3 curl_multi_socket_all.3
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
index cc5990e2..7e96f18b 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_cleanup 3 "22 aug 2007" "libcurl 7.17.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_cleanup - End a libcurl easy handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index 262cebd3..d482df54 100644
--- a/docs/libcurl/curl_easy_duphandle.3
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_duphandle 3 "19 Sep 2014" "libcurl" "libcurl Manual"
+.TH curl_easy_duphandle 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
index d2b6cd28..63725dac 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_escape 3 "7 April 2006" "libcurl 7.15.4" "libcurl Manual"
+.TH curl_easy_escape 3 "July 07, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_escape - URL encodes the given string
.SH SYNOPSIS
@@ -39,6 +40,15 @@ If \fIlength\fP is set to 0 (zero), \fIcurl_easy_escape(3)\fP uses strlen() on
the input \fIstring\fP to find out the size.
You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH ENCODING
+libcurl is typically not aware of, nor does it care about, character
+encodings. \fIcurl_easy_escape(3)\fP encodes the data byte-by-byte into the
+URL encoded version without knowledge or care for what particular character
+encoding the application or the receiving server may assume that the data
+uses.
+
+The caller of \fIcurl_easy_escape(3)\fP must make sure that the data passed in
+to the funtion is encoded correctly.
.SH AVAILABILITY
Added in 7.15.4 and replaces the old \fIcurl_escape(3)\fP function.
.SH RETURN VALUE
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index fabc7e92..c0d714ee 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_getinfo 3 "11 Feb 2009" "libcurl 7.19.4" "libcurl Manual"
+.TH curl_easy_getinfo 3 "June 15, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_getinfo - extract information from a curl handle
.SH SYNOPSIS
@@ -84,17 +85,29 @@ See \fICURLINFO_REDIRECT_COUNT(3)\fP
URL a redirect would take you to, had you enabled redirects.
See \fICURLINFO_REDIRECT_URL(3)\fP
.IP CURLINFO_SIZE_UPLOAD
-Number of bytes uploaded.
+(Deprecated) Number of bytes uploaded.
See \fICURLINFO_SIZE_UPLOAD(3)\fP
+.IP CURLINFO_SIZE_UPLOAD_T
+Number of bytes uploaded.
+See \fICURLINFO_SIZE_UPLOAD_T(3)\fP
.IP CURLINFO_SIZE_DOWNLOAD
-Number of bytes downloaded.
+(Deprecated) Number of bytes downloaded.
See \fICURLINFO_SIZE_DOWNLOAD(3)\fP
+.IP CURLINFO_SIZE_DOWNLOAD_T
+Number of bytes downloaded.
+See \fICURLINFO_SIZE_DOWNLOAD_T(3)\fP
.IP CURLINFO_SPEED_DOWNLOAD
-Average download speed.
+(Deprecated) Average download speed.
See \fICURLINFO_SPEED_DOWNLOAD(3)\fP
+.IP CURLINFO_SPEED_DOWNLOAD_T
+Average download speed.
+See \fICURLINFO_SPEED_DOWNLOAD_T(3)\fP
.IP CURLINFO_SPEED_UPLOAD
-Average upload speed.
+(Deprecated) Average upload speed.
See \fICURLINFO_SPEED_UPLOAD(3)\fP
+.IP CURLINFO_SPEED_UPLOAD_T
+Average upload speed.
+See \fICURLINFO_SPEED_UPLOAD_T(3)\fP
.IP CURLINFO_HEADER_SIZE
Number of bytes of all headers received.
See \fICURLINFO_HEADER_SIZE(3)\fP
@@ -111,11 +124,15 @@ See \fICURLINFO_PROXY_SSL_VERIFYRESULT(3)\fP
A list of OpenSSL crypto engines.
See \fICURLINFO_SSL_ENGINES(3)\fP
.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
-Content length from the Content-Length header.
+(Deprecated) Content length from the Content-Length header.
See \fICURLINFO_CONTENT_LENGTH_DOWNLOAD(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+Content length from the Content-Length header.
+See \fICURLINFO_CONTENT_LENGTH_DOWNLOAD_T(3)\fP
.IP CURLINFO_CONTENT_LENGTH_UPLOAD
-Upload size.
-See \fICURLINFO_CONTENT_LENGTH_UPLOAD(3)\fP
+(Deprecated) Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_UPLOAD_T
+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
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 371a3b81..b6abfcf2 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_init 3 "4 March 2002" "libcurl 7.8.1" "libcurl Manual"
+.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_init - Start a libcurl easy session
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index 131fa774..826eb3a9 100644
--- a/docs/libcurl/curl_easy_pause.3
+++ b/docs/libcurl/curl_easy_pause.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_pause 3 "17 Dec 2007" "libcurl 7.18.0" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_pause - pause and unpause a connection
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
index 48c1f311..d0b5b262 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libcurl Manual"
+.TH curl_easy_perform 3 "May 02, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_perform - perform a blocking file transfer
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index 7a812dd0..61fe1c40 100644
--- a/docs/libcurl/curl_easy_recv.3
+++ b/docs/libcurl/curl_easy_recv.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_recv 3 "29 April 2008" "libcurl 7.18.2" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
index 0bafb64a..837a4857 100644
--- a/docs/libcurl/curl_easy_reset.3
+++ b/docs/libcurl/curl_easy_reset.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_reset 3 "31 July 2004" "libcurl 7.12.1" "libcurl Manual"
+.TH curl_easy_reset 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
index 47976f39..f759b3dc 100644
--- a/docs/libcurl/curl_easy_send.3
+++ b/docs/libcurl/curl_easy_send.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_send 3 "29 April 2008" "libcurl 7.18.2" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_send - sends raw data over an "easy" connection
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index a130a8a0..e97ea8b7 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_setopt 3 "25 Jun 2014" "libcurl 7.38.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "April 27, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_setopt \- set options for a curl easy handle
.SH SYNOPSIS
@@ -137,6 +138,8 @@ Data pointer to pass to the chunk callbacks. See \fICURLOPT_CHUNK_DATA(3)\fP
Callback for wildcard matching. See \fICURLOPT_FNMATCH_FUNCTION(3)\fP
.IP CURLOPT_FNMATCH_DATA
Data pointer to pass to the wildcard matching callback. See \fICURLOPT_FNMATCH_DATA(3)\fP
+.IP CURLOPT_SUPPRESS_CONNECT_HEADERS
+Suppress proxy CONNECT response headers from user callbacks. See \fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP
.SH ERROR OPTIONS
.IP CURLOPT_ERRORBUFFER
Error message buffer. See \fICURLOPT_ERRORBUFFER(3)\fP
@@ -171,6 +174,8 @@ Filter out hosts from proxy use. \fICURLOPT_NOPROXY(3)\fP
Tunnel through the HTTP proxy. \fICURLOPT_HTTPPROXYTUNNEL(3)\fP
.IP CURLOPT_CONNECT_TO
Connect to a specific host and port. See \fICURLOPT_CONNECT_TO(3)\fP
+.IP CURLOPT_SOCKS5_AUTH
+Socks5 authentication methods. See \fICURLOPT_SOCKS5_AUTH(3)\fP
.IP CURLOPT_SOCKS5_GSSAPI_SERVICE
Socks5 GSSAPI service name. \fICURLOPT_SOCKS5_GSSAPI_SERVICE(3)\fP
.IP CURLOPT_SOCKS5_GSSAPI_NEC
@@ -190,7 +195,7 @@ Timeout for DNS cache. See \fICURLOPT_DNS_CACHE_TIMEOUT(3)\fP
.IP CURLOPT_DNS_USE_GLOBAL_CACHE
OBSOLETE Enable global DNS cache. See \fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP
.IP CURLOPT_BUFFERSIZE
-Ask for smaller buffer size. See \fICURLOPT_BUFFERSIZE(3)\fP
+Ask for alternate buffer size. See \fICURLOPT_BUFFERSIZE(3)\fP
.IP CURLOPT_PORT
Port number to connect to. See \fICURLOPT_PORT(3)\fP
.IP CURLOPT_TCP_FASTOPEN
@@ -207,6 +212,8 @@ Idle time before sending keep-alive. See \fICURLOPT_TCP_KEEPIDLE(3)\fP
Interval between keep-alive probes. See \fICURLOPT_TCP_KEEPINTVL(3)\fP
.IP CURLOPT_UNIX_SOCKET_PATH
Path to a Unix domain socket. See \fICURLOPT_UNIX_SOCKET_PATH(3)\fP
+.IP CURLOPT_ABSTRACT_UNIX_SOCKET
+Path to an abstract Unix domain socket. See \fICURLOPT_ABSTRACT_UNIX_SOCKET(3)\fP
.SH NAMES and PASSWORDS OPTIONS (Authentication)
.IP CURLOPT_NETRC
Enable .netrc parsing. See \fICURLOPT_NETRC(3)\fP
@@ -299,6 +306,8 @@ Start a new cookie session. See \fICURLOPT_COOKIESESSION(3)\fP
Add or control cookies. See \fICURLOPT_COOKIELIST(3)\fP
.IP CURLOPT_HTTPGET
Do a 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_IGNORE_CONTENT_LENGTH
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index ac941220..09452635 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_strerror - return string describing error code
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index 50ce97db..efbc662a 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_unescape 3 "7 April 2006" "libcurl 7.15.4" "libcurl Manual"
+.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_easy_unescape - URL decodes the given string
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index 03f02d32..39dbb2b5 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_escape 3 "6 March 2002" "libcurl 7.9" "libcurl Manual"
+.TH curl_escape 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_escape - URL encodes the given string
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index bf1b11e1..30d0c8d9 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formadd 3 "24 June 2002" "libcurl 7.9.8" "libcurl Manual"
+.TH curl_formadd 3 "December 28, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
.SH SYNOPSIS
@@ -148,8 +149,8 @@ data. The parameter you pass to \fICURLFORM_STREAM\fP is the pointer passed on
to the read callback's fourth argument. If you want the part to look like a
file upload one, set the \fICURLFORM_FILENAME\fP parameter as well. Note that
when using \fICURLFORM_STREAM\fP, \fICURLFORM_CONTENTSLENGTH\fP must also be
-set with the total expected length of the part. (Option added in libcurl
-7.18.2)
+set with the total expected length of the part unless the formpost is sent
+chunked encoded. (Option added in libcurl 7.18.2)
.IP CURLFORM_ARRAY
Another possibility to send options to curl_formadd() is the
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
index a2536cd9..320e3ceb 100644
--- a/docs/libcurl/curl_formfree.3
+++ b/docs/libcurl/curl_formfree.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formfree 3 "6 April 2001" "libcurl 7.7.1" "libcurl Manual"
+.TH curl_formfree 3 "May 02, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
index 635c487f..31e46003 100644
--- a/docs/libcurl/curl_formget.3
+++ b/docs/libcurl/curl_formget.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formget 3 "20 June 2006" "libcurl 7.15.5" "libcurl Manual"
+.TH curl_formget 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
index 5bbf7453..a4535ca8 100644
--- a/docs/libcurl/curl_free.3
+++ b/docs/libcurl/curl_free.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_free 3 "12 Aug 2003" "libcurl 7.10" "libcurl Manual"
+.TH curl_free 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
index d09980d0..f2181663 100644
--- a/docs/libcurl/curl_getdate.3
+++ b/docs/libcurl/curl_getdate.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual"
+.TH curl_getdate 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_getdate - Convert a date string to number of seconds
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
index c6bee98d..dd5d02b9 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getenv 3 "30 April 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_getenv 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_getenv - return value for environment name
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
index 04ab0437..b0d81e13 100644
--- a/docs/libcurl/curl_global_cleanup.3
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_cleanup 3 "17 Feb 2006" "libcurl 7.8" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_global_cleanup - global libcurl cleanup
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
index d2bd79ef..67a90722 100644
--- a/docs/libcurl/curl_global_init.3
+++ b/docs/libcurl/curl_global_init.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init 3 "11 May 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_global_init 3 "June 29, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_global_init - Global libcurl initialisation
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
index 7252cf9f..33a90578 100644
--- a/docs/libcurl/curl_global_init_mem.3
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init_mem 3 "10 May 2004" "libcurl 7.12.0" "libcurl Manual"
+.TH curl_global_init_mem 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index e861ed9c..06696b06 100644
--- a/docs/libcurl/curl_mprintf.3
+++ b/docs/libcurl/curl_mprintf.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_printf 3 "30 April 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
curl_mvaprintf, curl_mvfprintf, curl_mvprintf, curl_mvsnprintf,
diff --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
index 4c294f5a..2122f974 100644
--- a/docs/libcurl/curl_multi_add_handle.3
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_add_handle 3 "4 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.TH curl_multi_add_handle 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
index 75cb86b4..a3a1fefe 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_assign 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_assign \- set data to associate with an internal socket
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
index 07d92160..2584b218 100644
--- a/docs/libcurl/curl_multi_cleanup.3
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_cleanup 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.TH curl_multi_cleanup 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_cleanup - close down a multi session
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
index beef4deb..06925bd5 100644
--- a/docs/libcurl/curl_multi_fdset.3
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_fdset 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
+.TH curl_multi_fdset 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
index 736183df..036c31ae 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_info_read 3 "18 Dec 2004" "libcurl 7.10.3" "libcurl Manual"
+.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
index e84eb768..9a4f4e93 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_init 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.TH curl_multi_init 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_init - create a multi handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
index d2ae541c..7c97cf79 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
index b9daae9b..e7a3741c 100644
--- a/docs/libcurl/curl_multi_remove_handle.3
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
index d27c5244..6b12ce7e 100644
--- a/docs/libcurl/curl_multi_setopt.3
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_setopt 3 "4 Nov 2014" "libcurl 7.39.0" "libcurl Manual"
+.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_setopt \- set options for a curl multi handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
index ea29e711..8a38ccf3 100644
--- a/docs/libcurl/curl_multi_socket.3
+++ b/docs/libcurl/curl_multi_socket.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.TH curl_multi_socket 3 "December 15, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_socket \- reads/writes available data
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
index 2b841923..0b468975 100644
--- a/docs/libcurl/curl_multi_socket_action.3
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket_action 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 07, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
index b5aa7afb..36be329d 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_strerror - return string describing error code
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index 71b2b320..5a6c9c9b 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_timeout 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
+.TH curl_multi_timeout 3 "May 02, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
index 9f15c5f8..f1f82e70 100644
--- a/docs/libcurl/curl_multi_wait.3
+++ b/docs/libcurl/curl_multi_wait.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wait 3 "12 Jul 2012" "libcurl 7.28.0" "libcurl Manual"
+.TH curl_multi_wait 3 "March 09, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
index 0b265e86..55ed9d25 100644
--- a/docs/libcurl/curl_share_cleanup.3
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_cleanup 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.TH curl_share_cleanup 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_share_cleanup - Clean up a shared object
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
index 545ba038..317a5397 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_init 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.TH curl_share_init 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_share_init - Create a shared object
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
index 55e06f12..1c03ae7e 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_setopt 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.TH curl_share_setopt 3 "May 29, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_share_setopt - Set options for a shared object
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index faa5299d..626f523e 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_share_strerror - return string describing error code
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index fed80292..7b0b65a2 100644
--- a/docs/libcurl/curl_slist_append.3
+++ b/docs/libcurl/curl_slist_append.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_append 3 "19 Jun 2003" "libcurl 7.10.4" "libcurl Manual"
+.TH curl_slist_append 3 "May 05, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_slist_append - add a string to an slist
.SH SYNOPSIS
@@ -29,11 +30,11 @@ curl_slist_append - add a string to an slist
.BI "const char * "string ");"
.ad
.SH DESCRIPTION
-curl_slist_append() appends a specified string to a linked list of
-strings. The existing \fIlist\fP should be passed as the first argument while
-the new list is returned from this function. The specified \fIstring\fP has
-been appended when this function returns. curl_slist_append() copies the
-string.
+\fIcurl_slist_append(3)\fP appends a string to a linked list of strings. The
+existing \fBlist\fP should be passed as the first argument and the new list is
+returned from this function. Pass in NULL in the \fBlist\fP argument to create
+a new list. The specified \fBstring\fP has been appended when this function
+returns. \fIcurl_slist_append(3)\fP copies the string.
The list should be freed again (after usage) with
\fIcurl_slist_free_all(3)\fP.
@@ -42,19 +43,19 @@ A null pointer is returned if anything went wrong, otherwise the new list
pointer is returned.
.SH EXAMPLE
.nf
- CURL handle;
- struct curl_slist *slist=NULL;
+CURL *handle;
+struct curl_slist *slist=NULL;
- slist = curl_slist_append(slist, "pragma:");
+slist = curl_slist_append(slist, "pragma:");
- if (slist == NULL)
- return -1;
+if (slist == NULL)
+ return -1;
- curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
+curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
- curl_easy_perform(handle);
+curl_easy_perform(handle);
- curl_slist_free_all(slist); /* free the list again */
+curl_slist_free_all(slist); /* free the list again */
.fi
.SH "SEE ALSO"
.BR curl_slist_free_all "(3), "
diff --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
index 31d81da9..9bcc23e8 100644
--- a/docs/libcurl/curl_slist_free_all.3
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_free_all 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
+.TH curl_slist_free_all 3 "May 05, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_slist_free_all - free an entire curl_slist list
.SH SYNOPSIS
@@ -32,6 +33,22 @@ curl_slist_free_all() removes all traces of a previously built curl_slist
linked list.
.SH RETURN VALUE
Nothing.
+.SH EXAMPLE
+.nf
+CURL *handle;
+struct curl_slist *slist=NULL;
+
+slist = curl_slist_append(slist, "X-libcurl: coolness");
+
+if (slist == NULL)
+ return -1;
+
+curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
+
+curl_easy_perform(handle);
+
+curl_slist_free_all(slist); /* free the list again */
+.fi
.SH "SEE ALSO"
.BR curl_slist_append "(3), "
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
index a745f7eb..d7fa7174 100644
--- a/docs/libcurl/curl_strequal.3
+++ b/docs/libcurl/curl_strequal.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_strequal 3 "30 April 2004" "libcurl 7.12" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
.SH SYNOPSIS
@@ -27,7 +28,7 @@ curl_strequal, curl_strnequal - case insensitive string comparisons
.sp
.BI "int curl_strequal(char *" str1 ", char *" str2 ");"
.sp
-.BI "int curl_strenqual(char *" str1 ", char *" str2 ", size_t " len ");"
+.BI "int curl_strnequal(char *" str1 ", char *" str2 ", size_t " len ");"
.SH DESCRIPTION
The
.B curl_strequal()
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
index 061fbbf5..04800700 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_unescape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual"
+.TH curl_unescape 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_unescape - URL decodes the given string
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
index 4acd73aa..fdb93dbb 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_version 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
+.TH curl_version 3 "February 03, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_version - returns the libcurl version string
.SH SYNOPSIS
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index ebb11c33..bd2bc629 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_version_info 3 "2 Nov 2014" "libcurl 7.40.0" "libcurl Manual"
+.TH curl_version_info 3 "November 25, 2016" "libcurl 7.55.0" "libcurl Manual"
+
.SH NAME
curl_version_info - returns run-time libcurl version info
.SH SYNOPSIS
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index d112632f..4c155bd5 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "19 Sep 2014" "libcurl" "libcurl easy interface"
+.TH libcurl 3 "February 03, 2016" "libcurl 7.55.0" "libcurl easy interface"
+
.SH NAME
libcurl-easy \- easy interface overview
.SH DESCRIPTION
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index 1b6e34f5..ec05ae7d 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-errors 3 "1 Jan 2010" "libcurl 7.20.0" "libcurl errors"
+.TH libcurl-errors 3 "August 22, 2016" "libcurl 7.55.0" "libcurl errors"
+
.SH NAME
libcurl-errors \- error codes in libcurl
.SH DESCRIPTION
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
index 0717be77..b61a8512 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-multi 3 "19 Sep 2014" "libcurl" "libcurl multi interface"
+.TH libcurl-multi 3 "June 07, 2017" "libcurl 7.55.0" "libcurl multi interface"
+
.SH NAME
libcurl-multi \- how to use the multi interface
.SH DESCRIPTION
@@ -173,8 +174,6 @@ the future, you should be aware of the following current restrictions:
.nf
- Name resolves unless the c-ares or threaded-resolver backends are used
- - NSS SSL connections
- - HTTP proxy CONNECT operations
- SOCKS proxy handshakes
- file:// transfers
- TELNET transfers
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index c7cd6554..7608db4e 100644
--- a/docs/libcurl/libcurl-share.3
+++ b/docs/libcurl/libcurl-share.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-share 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl share interface"
+.TH libcurl-share 3 "February 03, 2016" "libcurl 7.55.0" "libcurl share interface"
+
.SH NAME
libcurl-share \- how to use the share interface
.SH DESCRIPTION
diff --git a/docs/libcurl/libcurl-symbols.3 b/docs/libcurl/libcurl-symbols.3
index 091032fd..50344d8f 100644
--- a/docs/libcurl/libcurl-symbols.3
+++ b/docs/libcurl/libcurl-symbols.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-symbols 3 "dec 23, 2016" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "aug 9, 2017" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
@@ -45,6 +45,8 @@ Introduced in 7.10.6
Introduced in 7.10.6
.IP CURLAUTH_DIGEST_IE
Introduced in 7.19.3
+.IP CURLAUTH_GSSAPI
+Introduced in 7.55.0
.IP CURLAUTH_GSSNEGOTIATE
Introduced in 7.10.6
Deprecated since 7.38.0
@@ -459,8 +461,12 @@ Introduced in 7.19.4
Introduced in 7.4.1
.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
Introduced in 7.6.1
+.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_CONTENT_LENGTH_UPLOAD
Introduced in 7.6.1
+.IP CURLINFO_CONTENT_LENGTH_UPLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_CONTENT_TYPE
Introduced in 7.9.4
.IP CURLINFO_COOKIELIST
@@ -512,6 +518,8 @@ Introduced in 7.4.1
Introduced in 7.4.1
.IP CURLINFO_NUM_CONNECTS
Introduced in 7.12.3
+.IP CURLINFO_OFF_T
+Introduced in 7.55.0
.IP CURLINFO_OS_ERRNO
Introduced in 7.12.2
.IP CURLINFO_PRETRANSFER_TIME
@@ -528,6 +536,8 @@ Introduced in 7.52.0
Introduced in 7.10.8
.IP CURLINFO_PROXY_SSL_VERIFYRESULT
Introduced in 7.52.0
+.IP CURLINFO_PTR
+Introduced in 7.54.1
.IP CURLINFO_REDIRECT_COUNT
Introduced in 7.9.7
.IP CURLINFO_REDIRECT_TIME
@@ -550,16 +560,24 @@ Introduced in 7.20.0
Introduced in 7.52.0
.IP CURLINFO_SIZE_DOWNLOAD
Introduced in 7.4.1
+.IP CURLINFO_SIZE_DOWNLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_SIZE_UPLOAD
Introduced in 7.4.1
+.IP CURLINFO_SIZE_UPLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_SLIST
Introduced in 7.12.3
.IP CURLINFO_SOCKET
Introduced in 7.45.0
.IP CURLINFO_SPEED_DOWNLOAD
Introduced in 7.4.1
+.IP CURLINFO_SPEED_DOWNLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_SPEED_UPLOAD
Introduced in 7.4.1
+.IP CURLINFO_SPEED_UPLOAD_T
+Introduced in 7.55.0
.IP CURLINFO_SSL_DATA_IN
Introduced in 7.12.1
.IP CURLINFO_SSL_DATA_OUT
@@ -679,6 +697,8 @@ Introduced in 7.1
Introduced in 7.11.0
.IP CURLOPTTYPE_STRINGPOINT
Introduced in 7.46.0
+.IP CURLOPT_ABSTRACT_UNIX_SOCKET
+Introduced in 7.53.0
.IP CURLOPT_ACCEPTTIMEOUT_MS
Introduced in 7.24.0
.IP CURLOPT_ACCEPT_ENCODING
@@ -882,10 +902,10 @@ Introduced in 7.12.3
Introduced in 7.10.8
.IP CURLOPT_ISSUERCERT
Introduced in 7.19.0
-.IP CURLOPT_KEYPASSWD
-Introduced in 7.17.0
.IP CURLOPT_KEEP_SENDING_ON_ERROR
Introduced in 7.51.0
+.IP CURLOPT_KEYPASSWD
+Introduced in 7.17.0
.IP CURLOPT_KRB4LEVEL
Introduced in 7.3
Deprecated since 7.17.0
@@ -1067,6 +1087,8 @@ Introduced in 7.1
Introduced in 7.19.4
.IP CURLOPT_REFERER
Introduced in 7.1
+.IP CURLOPT_REQUEST_TARGET
+Introduced in 7.55.0
.IP CURLOPT_RESOLVE
Introduced in 7.21.3
.IP CURLOPT_RESUME_FROM
@@ -1103,6 +1125,8 @@ Introduced in 7.10
Introduced in 7.16.0
.IP CURLOPT_SOCKOPTFUNCTION
Introduced in 7.16.0
+.IP CURLOPT_SOCKS5_AUTH
+Introduced in 7.55.0
.IP CURLOPT_SOCKS5_GSSAPI_NEC
Introduced in 7.19.4
.IP CURLOPT_SOCKS5_GSSAPI_SERVICE
@@ -1188,6 +1212,10 @@ Introduced in 7.46.0
Introduced in 7.46.0
.IP CURLOPT_STREAM_WEIGHT
Introduced in 7.46.0
+.IP CURLOPT_SUPPRESS_CONNECT_HEADERS
+Introduced in 7.54.0
+.IP CURLOPT_TCP_FASTOPEN
+Introduced in 7.49.0
.IP CURLOPT_TCP_KEEPALIVE
Introduced in 7.25.0
.IP CURLOPT_TCP_KEEPIDLE
@@ -1196,8 +1224,6 @@ Introduced in 7.25.0
Introduced in 7.25.0
.IP CURLOPT_TCP_NODELAY
Introduced in 7.11.2
-.IP CURLOPT_TCP_FASTOPEN
-Introduced in 7.49.0
.IP CURLOPT_TELNETOPTIONS
Introduced in 7.7
.IP CURLOPT_TFTP_BLKSIZE
@@ -1334,10 +1360,10 @@ Introduced in 7.19.4
Introduced in 7.19.4
.IP CURLPROXY_HTTP
Introduced in 7.10
-.IP CURLPROXY_HTTP_1_0
-Introduced in 7.19.4
.IP CURLPROXY_HTTPS
Introduced in 7.52.0
+.IP CURLPROXY_HTTP_1_0
+Introduced in 7.19.4
.IP CURLPROXY_SOCKS4
Introduced in 7.10
.IP CURLPROXY_SOCKS4A
@@ -1522,10 +1548,10 @@ Introduced in 7.9.1
Introduced in 7.9.1
.IP CURL_HTTP_VERSION_2
Introduced in 7.43.0
-.IP CURL_HTTP_VERSION_2_0
-Introduced in 7.33.0
.IP CURL_HTTP_VERSION_2TLS
Introduced in 7.47.0
+.IP CURL_HTTP_VERSION_2_0
+Introduced in 7.33.0
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Introduced in 7.49.0
.IP CURL_HTTP_VERSION_NONE
@@ -1566,6 +1592,8 @@ Introduced in 7.10
Introduced in 7.10
.IP CURL_MAX_HTTP_HEADER
Introduced in 7.19.7
+.IP CURL_MAX_READ_SIZE
+Introduced in 7.53.0
.IP CURL_MAX_WRITE_SIZE
Introduced in 7.9.7
.IP CURL_NETRC_IGNORED
@@ -1646,10 +1674,20 @@ Introduced in 7.21.5
Introduced in 7.21.5
.IP CURL_SOCKOPT_OK
Introduced in 7.21.5
-.IP CURL_STRICTER
-Introduced in 7.50.2
.IP CURL_SSLVERSION_DEFAULT
Introduced in 7.9.2
+.IP CURL_SSLVERSION_MAX_DEFAULT
+Introduced in 7.54.0
+.IP CURL_SSLVERSION_MAX_NONE
+Introduced in 7.54.0
+.IP CURL_SSLVERSION_MAX_TLS
+Introduced in
+.IP CURL_SSLVERSION_MAX_TLS
+Introduced in
+.IP CURL_SSLVERSION_MAX_TLS
+Introduced in
+.IP CURL_SSLVERSION_MAX_TLS
+Introduced in
.IP CURL_SSLVERSION_SSL
Introduced in
.IP CURL_SSLVERSION_SSL
@@ -1664,6 +1702,8 @@ Introduced in
Introduced in
.IP CURL_SSLVERSION_TLS
Introduced in
+.IP CURL_STRICTER
+Introduced in 7.50.2
.IP CURL_TIMECOND_IFMODSINCE
Introduced in 7.9.7
.IP CURL_TIMECOND_IFUNMODSINCE
diff --git a/docs/libcurl/libcurl-thread.3 b/docs/libcurl/libcurl-thread.3
index 379ca8ff..d373d312 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2015 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2015 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-thread 3 "13 Jul 2015" "libcurl" "libcurl thread safety"
+.TH libcurl-thread 3 "August 08, 2017" "libcurl 7.55.0" "libcurl thread safety"
+
.SH NAME
libcurl-thread \- libcurl thread safety
.SH "Multi-threading with libcurl"
@@ -53,7 +54,7 @@ https://www.openssl.org/docs/man1.0.2/crypto/threads.html#DESCRIPTION
https://curl.haxx.se/libcurl/c/opensslthreadlock.html
.IP GnuTLS
-http://gnutls.org/manual/html_node/Thread-safety.html
+https://gnutls.org/manual/html_node/Thread-safety.html
.IP NSS
thread-safe already without anything required.
.IP PolarSSL
@@ -77,9 +78,10 @@ without using either the c-ares or threaded resolver backends. When using
multiple threads you should set the \fICURLOPT_NOSIGNAL(3)\fP option to 1L for
all handles. Everything will or might work fine except that timeouts are not
honored during the DNS lookup - which you can work around by building libcurl
-with c-ares support. c-ares is a library that provides asynchronous name
-resolves. On some platforms, libcurl simply will not function properly
-multi-threaded unless this option is set.
+with c-ares or threaded-resolver support. c-ares is a library that provides
+asynchronous name resolves. On some platforms, libcurl simply will not
+function properly multi-threaded unless the \fICURLOPT_NOSIGNAL(3)\fP option is
+set.
.IP "Name resolving"
\fBgethostby* functions and other system calls.\fP These functions, provided
by your operating system, must be thread safe. It is very important that
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index 3144da3c..e945bd35 100644
--- a/docs/libcurl/libcurl-tutorial.3
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-tutorial 3 "19 Sep 2014" "libcurl" "libcurl programming"
+.TH libcurl-tutorial 3 "March 04, 2017" "libcurl 7.55.0" "libcurl programming"
+
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
.SH "Objective"
@@ -1147,7 +1148,7 @@ behind a firewall. Apps can mitigate against this by using the
.IP "IPv6 Addresses"
libcurl will normally handle IPv6 addresses transparently and just as easily
as IPv4 addresses. That means that a sanitizing function that filters out
-addressses like 127.0.0.1 isn't sufficient--the equivalent IPv6 addresses ::1,
+addresses like 127.0.0.1 isn't sufficient--the equivalent IPv6 addresses ::1,
::, 0:00::0:1, ::127.0.0.1 and ::ffff:7f00:1 supplied somehow by an attacker
would all bypass a naive filter and could allow access to undesired local
resources. IPv6 also has special address blocks like link-local and site-local
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index 6618734b..f291a702 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -19,7 +19,8 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "19 March 2002" "libcurl 7.9.6" "libcurl overview"
+.TH libcurl 3 "February 03, 2016" "libcurl 7.55.0" "libcurl overview"
+
.SH NAME
libcurl \- client-side URL transfers
.SH DESCRIPTION
diff --git a/docs/libcurl/opts/CMakeLists.txt b/docs/libcurl/opts/CMakeLists.txt
new file mode 100644
index 00000000..709d3e4b
--- /dev/null
+++ b/docs/libcurl/opts/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Load man_MANS from shared file
+transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
+
+add_manual_pages(man_MANS)
+
+string(REPLACE ".3" ".html" HTMLPAGES "${man_MANS}")
+string(REPLACE ".3" ".pdf" PDFPAGES "${man_MANS}")
+add_custom_target(opts-html DEPENDS ${HTMLPAGES})
+add_custom_target(opts-pdf DEPENDS ${PDFPAGES})
+add_dependencies(html opts-html)
+add_dependencies(pdf opts-pdf)
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index 0896d150..b356a5bc 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_ACTIVESOCKET 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
.SH SYNOPSIS
@@ -41,7 +42,25 @@ that one isn't working on all platforms.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_socket_t sockfd;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Do not do the transfer - only connect to host */
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ res = curl_easy_perform(curl);
+
+ /* Extract the socket from the curl handle */
+ res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
+
+ if(res != CURLE_OK) {
+ printf("Error: %s\\n", curl_easy_strerror(res));
+ return 1;
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.45.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index dceb98b0..1a9ad63f 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
.SH SYNOPSIS
@@ -38,7 +39,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", connect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_CERTINFO.3 b/docs/libcurl/opts/CURLINFO_CERTINFO.3
index cb0bd8aa..d9d2545d 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CERTINFO 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
.SH SYNOPSIS
@@ -39,7 +40,37 @@ for the specific named data. See also the certinfo.c example.
.SH PROTOCOLS
All TLS-based
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+ /* connect to any HTTPS site, trusted or not */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+ curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
+
+ res = curl_easy_perform(curl);
+
+ if (!res) {
+ struct curl_certinfo *ci;
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ci);
+
+ if (!res) {
+ printf("%d certs!\\n", ci->num_of_certs);
+
+ for(i = 0; i < ci->num_of_certs; i++) {
+ struct curl_slist *slist;
+
+ for(slist = ci->certinfo[i]; slist; slist = slist->next)
+ printf("%s\\n", slist->data);
+ }
+ }
+ }
+ curl_easy_cleanup(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
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index 452c261f..1a079642 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONDITION_UNMET 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
.SH SYNOPSIS
@@ -36,7 +37,30 @@ get a zero stored if the condition instead was met.
.SH PROTOCOLS
HTTP and some
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* January 1, 2020 is 1577833200 */
+ curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
+
+ /* If-Modified-Since the above time stamp */
+ curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the time condition */
+ long unmet;
+ res = curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &unmet);
+ if(!res) {
+ printf("The time condition was %sfulfilled\\n", unmet?"NOT":"");
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.19.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index 1b63e238..ed1fa3f2 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
.SH SYNOPSIS
@@ -35,7 +36,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", connect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index 311f313a..cd59a9c4 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
.SH SYNOPSIS
@@ -32,10 +33,30 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
Pass a pointer to a double to receive the content-length of the download. This
is the value read from the Content-Length: field. Since 7.19.4, this returns
-1 if the size isn't known.
+
+\fICURLINFO_CONTENT_LENGTH_DOWNLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &cl);
+ if(!res) {
+ printf("Size: %.0f\\n", cl);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.6.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
new file mode 100644
index 00000000..64d5e851
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -0,0 +1,63 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
+ curl_off_t *content_length);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the content-length of the
+download. This is the value read from the Content-Length: field. Stores -1 if
+the size isn't known.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &cl);
+ if(!res) {
+ printf("Size: " CURL_FORMAT_CURL_OFF_T "\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index e40d5ea9..72a74706 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
.SH SYNOPSIS
@@ -31,13 +32,34 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD,
.SH DESCRIPTION
Pass a pointer to a double to receive the specified size of the upload. Since
7.19.4, this returns -1 if the size isn't known.
+
+\fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP is a newer replacement that returns a
+more sensible variable type.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the upload */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &cl);
+ if(!res) {
+ printf("Size: %.0f\\n", cl);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.6.1
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_DOWNLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
new file mode 100644
index 00000000..ebe51714
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -0,0 +1,62 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD_T,
+ curl_off_t *content_length);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the specified size of the
+upload. Stores -1 if the size isn't known.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the upload */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD_T, &cl);
+ if(!res) {
+ printf("Size: " CURL_FORMAT_CURL_OFF_T "\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_DOWNLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 7536000c..ad96d7c1 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_TYPE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
.SH SYNOPSIS
@@ -39,7 +40,24 @@ corresponding CURL handle.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the content-type */
+ char *ct = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ if(!res && ct) {
+ printf("Content-Type: %s\\n", ct);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.9.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index b9f75f4d..a4789e9d 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_COOKIELIST 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
.SH SYNOPSIS
@@ -40,7 +41,33 @@ domain name are not exported by this option.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* enable the cookie engine with a non-existing file */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "-");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract all known cookies */
+ struct curl_slist *cookies = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
+ if(!res && cookies) {
+ /* a linked list of cookies in cookie file format */
+ while(cookies) {
+ printf("%s", cookies->data);
+ cookies = cookies->next;
+ }
+ /* we must free these cookies when we're done */
+ curl_slist_free_all(cookies);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.14.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index 342fd5dc..6b5dd79d 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_URL 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
.SH SYNOPSIS
@@ -39,7 +40,22 @@ corresponding CURL handle.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
+ if(url)
+ printf("Redirect to: %s\\n", url);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 84093eb2..0c9839d6 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "April 03, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
.SH SYNOPSIS
@@ -40,7 +41,24 @@ transfer is made, by using the \fICURLOPT_FILETIME(3)\fP option to
.SH PROTOCOLS
HTTP(S), FTP(S), SFTP
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* Ask for filetime */
+ curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if((CURLE_OK == res) && (filetime >= 0)) {
+ time_t file_time = (time_t)filetime;
+ printf("filetime %s: %s", filename, ctime(&file_time));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
index e7d7fcff..eb18cc2d 100644
--- a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
.SH SYNOPSIS
@@ -39,7 +40,24 @@ corresponding CURL handle.
.SH PROTOCOLS
FTP(S) and SFTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the entry path */
+ char *ep = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &ep);
+ if(!res && ep) {
+ printf("Entry path was: %s\\n", ep);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.4. Works for SFTP since 7.21.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
index b4b9b578..e02a8b0f 100644
--- a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HEADER_SIZE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
.SH SYNOPSIS
@@ -30,10 +31,27 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HEADER_SIZE, long *sizep);
.SH DESCRIPTION
Pass a pointer to a long to receive the total size of all the headers
received. Measured in number of bytes.
+
+The total includes the size of any received headers suppressed by
+\fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.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) {
+ long size;
+ res = curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &size);
+ if(!res)
+ printf("Header size: %ld bytes\\n", size);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index a5d0e725..a0e2b870 100644
--- a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
.SH SYNOPSIS
@@ -35,7 +36,32 @@ bits is explained in the \fICURLOPT_HTTPAUTH(3)\fP option for
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the available authentication types */
+ long auth;
+ res = curl_easy_getinfo(curl, CURLINFO_HTTPAUTH_AVAIL, &auth);
+ if(!res) {
+ if(!auth)
+ printf("No auth available, perhaps no 401?\\n");
+ else {
+ printf("%s%s%s%s\\n",
+ auth & CURLAUTH_BASIC ? "Basic ":"",
+ auth & CURLAUTH_DIGEST ? "Digest ":"",
+ auth & CURLAUTH_NEGOTIATE ? "Negotiate ":"",
+ auth % CURLAUTH_NTLM ? "NTLM ":"");
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.8
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index acfef77f..3213e072 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
.SH SYNOPSIS
@@ -34,7 +35,24 @@ was available.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* typically CONNECT is used to do HTTPS over HTTP proxies */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long code;
+ res = curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE, &code);
+ if(!res && code)
+ printf("The CONNECT response code: %03ld\\n", code);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
index b0f43e54..09191b62 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_VERSION 3 "11 May 2016" "libcurl 7.50.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index 8e734531..5c649573 100644
--- a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LASTSOCKET 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
.SH SYNOPSIS
@@ -43,7 +44,25 @@ type is 64 bits large while its 'long' is 32 bits. Use the
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ long sockfd; /* doesn't work on win64! */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Do not do the transfer - only connect to host */
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ res = curl_easy_perform(curl);
+
+ /* Extract the socket from the curl handle */
+ res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd);
+
+ if(res != CURLE_OK) {
+ printf("Error: %s\\n", curl_easy_strerror(res));
+ return 1;
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.15.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index b2228e22..0cad79ec 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_IP 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
.SH SYNOPSIS
@@ -41,7 +42,24 @@ corresponding CURL handle.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+{
+ char *ip;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if((res == CURLE_OK) &&
+ !curl_easy_getinfo(curl, CURLINFO_LOCAL_IP, &ip) && ip) {
+ printf("Local IP: %s\\n", ip);
+ }
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index aa7f418e..2d0829dc 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_PORT 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
.SH SYNOPSIS
@@ -33,7 +34,29 @@ connection done with this \fBcurl\fP handle.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+{
+ CURL *curl;
+ CURLcode res;
+
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ res = curl_easy_perform(curl);
+
+ if(CURLE_OK == res) {
+ long port;
+ res = curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, &port);
+
+ if(CURLE_OK == res) {
+ printf("We used local port: %ld\\n", port);
+ }
+ }
+ curl_easy_cleanup(curl);
+ }
+ return 0;
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index 68059ec6..a78c194c 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
.SH SYNOPSIS
@@ -35,7 +36,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double namelookup;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &namelookup);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", namelookup);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
index eccff500..cb31b382 100644
--- a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NUM_CONNECTS 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
.SH SYNOPSIS
@@ -37,7 +38,22 @@ to make persistent connections to save time.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long connects;
+ res = curl_easy_getinfo(curl, CURLINFO_NUM_CONNECTS, &connects);
+ if(res)
+ printf("It needed %d connects\\n", connects);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index b56d40ea..23993192 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_OS_ERRNO 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
.SH SYNOPSIS
@@ -34,7 +35,22 @@ operation. The number is OS and system specific.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.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) {
+ long error;
+ res = curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &error);
+ if(res && error) {
+ printf("Errno: %ld\n", error);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index c445ea09..1658f402 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
.SH SYNOPSIS
@@ -38,7 +39,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double pretransfer;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &pretransfer);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", pretransfer);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
index 9d276ead..24a58ade 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_IP 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
.SH SYNOPSIS
@@ -38,8 +39,26 @@ The \fBip\fP pointer will be NULL or pointing to private memory you MUST NOT
free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
corresponding CURL handle.
.SH PROTOCOLS
+All network based ones
.SH EXAMPLE
-TODO
+.nf
+{
+ char *ip;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if((res == CURLE_OK) &&
+ !curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ip) && ip) {
+ printf("IP: %s\\n", ip);
+ }
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 45ed6a68..2771af02 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_PORT 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
.SH SYNOPSIS
@@ -33,7 +34,21 @@ connection done with this \fBcurl\fP handle.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.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) {
+ long port;
+ res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, &port);
+ if(!res)
+ printf("Connected to remote port: %ld\\n", port);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index a7fe9d53..56abaa30 100644
--- a/docs/libcurl/opts/CURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/CURLINFO_PRIVATE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIVATE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PRIVATE \- get the private pointer
.SH SYNOPSIS
@@ -35,7 +36,22 @@ pointer, although effectively being a 'void *'.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ void *pointer = 0x2345454;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* set the private pointer */
+ curl_easy_setopt(curl, CURLOPT_PRIVATE, pointer);
+ ret = curl_easy_perform(curl);
+
+ /* extract the private pointer again */
+ ret = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &pointer);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index b8211187..f530498b 100644
--- a/docs/libcurl/opts/CURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROTOCOL 3 "23 November 2016" "libcurl 7.52.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "November 23, 2016" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index d07c5b95..f765169f 100644
--- a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
.SH SYNOPSIS
@@ -35,7 +36,33 @@ bits is explained in the \fICURLOPT_PROXYAUTH(3)\fP option for
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the available proxy authentication types */
+ long auth;
+ res = curl_easy_getinfo(curl, CURLINFO_PROXYAUTH_AVAIL, &auth);
+ if(!res) {
+ if(!auth)
+ printf("No proxy auth available, perhaps no 407?\\n");
+ else {
+ printf("%s%s%s%s\\n",
+ auth & CURLAUTH_BASIC ? "Basic ":"",
+ auth & CURLAUTH_DIGEST ? "Digest ":"",
+ auth & CURLAUTH_NEGOTIATE ? "Negotiate ":"",
+ auth % CURLAUTH_NTLM ? "NTLM ":"");
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.8
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index 3a80f978..806c7706 100644
--- a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
.SH SYNOPSIS
@@ -29,11 +30,25 @@ CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verif
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_SSL_VERIFYRESULT, long *result);
.SH DESCRIPTION
Pass a pointer to a long to receive the result of the certificate verification
-that was requested (using the \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option.
+that was requested (using the \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP
+option. This is only used for HTTPS proxies.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ long verifyresult;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_PROXY_SSL_VERIFYRESULT, &verifyresult);
+ printf("The peer verification said %s\\n", verifyresult?
+ "fine":"BAAAD");
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
index ee1ebbb6..1744e471 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_COUNT 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
.SH SYNOPSIS
@@ -33,7 +34,20 @@ actually followed.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long redirects;
+ curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &redirects);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.9.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 1a9e6dfb..7b9c997a 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
.SH SYNOPSIS
@@ -37,7 +38,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double redirect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, &redirect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", redirect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.9.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
index a7bf7261..23d7e763 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_URL 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
.SH SYNOPSIS
@@ -33,10 +34,27 @@ take you to if you would enable \fICURLOPT_FOLLOWLOCATION(3)\fP. This can come
very handy if you think using the built-in libcurl redirect logic isn't good
enough for you but you would still prefer to avoid implementing all the magic
of figuring out the new URL.
+
+This URL is also set if the \fICURLOPT_MAXREDIRS(3)\fP limit prevented a
+redirect to happen (since 7.54.1).
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.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) {
+ char *url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &url);
+ if(url)
+ printf("Redirect to: %s\\n", url);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.18.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index 6f857353..9359b3bb 100644
--- a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REQUEST_SIZE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
.SH SYNOPSIS
@@ -34,7 +35,21 @@ than one request if \fICURLOPT_FOLLOWLOCATION(3)\fP is enabled.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.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) {
+ long req;
+ res = curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &req);
+ if(!res)
+ printf("Request size: %ld bytes\\n", req);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index b1f48473..5141551a 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RESPONSE_CODE 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index 822fde83..7a76a315 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
.SH SYNOPSIS
@@ -33,7 +34,19 @@ application.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_CLIENT_CSEQ, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
index 13d13191..d2ef4116 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
.SH SYNOPSIS
@@ -35,7 +36,19 @@ value.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_CSEQ_RECV, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
index 571a915c..85ee5b6e 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
.SH SYNOPSIS
@@ -38,7 +39,19 @@ retrieve this info before closing the active connection.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_SERVER_CSEQ, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
index 4d4d3f1d..2b44f5bb 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
.SH SYNOPSIS
@@ -40,7 +41,19 @@ corresponding CURL handle.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *id;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_SESSION_ID, &id);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.3 b/docs/libcurl/opts/CURLINFO_SCHEME.3
index 78c3d688..b030eba5 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -20,20 +20,22 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SCHEME 3 "23 November 2016" "libcurl 7.52.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
.SH SYNOPSIS
#include <curl/curl.h>
-CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, long *p);
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, char **scheme);
.SH DESCRIPTION
Pass a pointer to a char pointer to receive the pointer to a zero-terminated
-string holding the URL scheme used for the most recent connection done with this
-\fBcurl\fP handle.
+string holding the URL scheme used for the most recent connection done with
+this CURL \fBhandle\fP.
-The \fBid\fP pointer will be NULL or pointing to private read-only memory you
-MUST NOT free or modify.
+The \fBscheme\fP pointer will be NULL or pointing to private memory you MUST
+NOT free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
.SH PROTOCOLS
All
.SH EXAMPLE
@@ -44,8 +46,10 @@ if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
- char * scheme;
+ char *scheme = NULL;
curl_easy_getinfo(curl, CURLINFO_SCHEME, &scheme);
+ if(scheme)
+ printf("scheme: %s\\n", scheme); /* scheme: HTTP */
}
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index 85039ffe..6cac82fe 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
.SH SYNOPSIS
@@ -33,13 +34,35 @@ downloaded. The amount is only for the latest transfer and will be reset
again for each new transfer. This counts actual payload data, what's also
commonly called body. All meta and header data are excluded and will not be
counted in this number.
+
+\fICURLINFO_SIZE_DOWNLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double dl;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dl);
+ if(!res) {
+ printf("Downloaded %.0f bytes\\n", cl);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
new file mode 100644
index 00000000..bbe78b66
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -0,0 +1,65 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD_T, curl_off_t *dlp);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the total amount of bytes that
+were downloaded. The amount is only for the latest transfer and will be reset
+again for each new transfer. This counts actual payload data, what's also
+commonly called body. All meta and header data are excluded and will not be
+counted in this number.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t dl;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &dl);
+ if(!res) {
+ printf("Downloaded " CURL_FORMAT_CURL_OFF_T " bytes\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 034c6df4..53564d41 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
.SH SYNOPSIS
@@ -30,13 +31,33 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD, double *uploadp);
.SH DESCRIPTION
Pass a pointer to a double to receive the total amount of bytes that were
uploaded.
+
+\fICURLINFO_SIZE_UPLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double ul;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &ul);
+ if(!res) {
+ printf("Uploaded %.0f bytes\\n", ul);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), " CURLINFO_SIZE_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
new file mode 100644
index 00000000..5aced4f7
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -0,0 +1,60 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD_T, curl_off_t *uploadp);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the total amount of bytes that
+were uploaded.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t ul;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD_T, &ul);
+ if(!res) {
+ printf("Uploaded " CURL_FORMAT_CURL_OFF_T " bytes\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), " CURLINFO_SIZE_UPLOAD "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index ef1c739e..68142061 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
.SH SYNOPSIS
@@ -30,9 +31,28 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD, double *speed)
.SH DESCRIPTION
Pass a pointer to a double to receive the average download speed that curl
measured for the complete download. Measured in bytes/second.
+
+\fICURLINFO_SPEED_DOWNLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
.SH PROTOCOLS
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &speed);
+ if(!res) {
+ printf("Download speed %.0f bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
@@ -40,3 +60,4 @@ Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
.BR CURLINFO_SPEED_UPLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
new file mode 100644
index 00000000..b37efc26
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -0,0 +1,60 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_SPEED_DOWNLOAD_T \- get download speed
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD_T, curl_off_t *speed);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the average download speed
+that curl measured for the complete download. Measured in bytes/second.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T, &speed);
+ if(!res) {
+ printf("Download speed " CURL_FORMAT_CURL_OFF_T " bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_UPLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index f79ea1f1..2bdcba46 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
.SH SYNOPSIS
@@ -30,9 +31,28 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD, double *speed);
.SH DESCRIPTION
Pass a pointer to a double to receive the average upload speed that curl
measured for the complete upload. Measured in bytes/second.
+
+\fICURLINFO_SPEED_UPLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
.SH PROTOCOLS
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed);
+ if(!res) {
+ printf("Upload speed %.0f bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
.SH AVAILABILITY
Added in
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
new file mode 100644
index 00000000..0b2b2d70
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -0,0 +1,59 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "June 15, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_SPEED_UPLOAD_T \- get upload speed
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD_T, curl_off_t *speed);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the average upload speed that
+curl measured for the complete upload. Measured in bytes/second.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD_T, &speed);
+ if(!res) {
+ printf("Upload speed " CURL_FORMAT_CURL_OFF_T " bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_DOWNLOAD_T "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index c1ebfc9a..16c8fe4f 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_ENGINES 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
.SH SYNOPSIS
@@ -38,7 +39,20 @@ data for you.
.SH PROTOCOLS
All TLS based ones.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ struct curl_slist *engines;
+ res = curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines);
+ if((res == CURLE_OK) && engines) {
+ /* we have a list, free it when done using it */
+ curl_slist_free_all(engines);
+ }
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.3. Available in OpenSSL builds with "engine" support.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
index 1651a9bd..0772f40c 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
.SH SYNOPSIS
@@ -34,7 +35,19 @@ option.
.SH PROTOCOLS
All using TLS
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ long verifyresult;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT, &verifyresult);
+ printf("The peer verification said %s\\n", verifyresult?
+ "fine":"BAAAD");
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index 54643648..58f2cf74 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
.SH SYNOPSIS
@@ -37,7 +38,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double start;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &start);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", start);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.9.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3 b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
index 3cc3b655..d8d91df7 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SESSION 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
.SH SYNOPSIS
@@ -49,7 +50,17 @@ information.
.SH PROTOCOLS
All TLS-based
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ struct curl_tlssessioninfo *tls;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &tls);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.34.0, and supported OpenSSL, GnuTLS, NSS and gskit only up until
7.48.0 was released.
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
index decf0fca..9eca0640 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SSL_PTR 3 "23 Feb 2016" "libcurl 7.48.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
.SH SYNOPSIS
@@ -128,7 +129,17 @@ https://github.com/curl/curl/issues/685
.SH PROTOCOLS
All TLS-based
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ struct curl_tlssessioninfo *tls;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_TLS_SSL_PTR, &tls);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.48.0.
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index b068a8b8..b1f47336 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_getinfo options"
+
.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
.SH SYNOPSIS
@@ -36,7 +37,22 @@ See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double total;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", total);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.4.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index ab2d2f63..90058092 100644
--- a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
.SH SYNOPSIS
@@ -38,7 +39,11 @@ The default value is 0, which means that the penalization is inactive.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+long maxchunk = 10000;
+curl_multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, maxchunk);
+.fi
.SH AVAILABILITY
Added in 7.30.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 3b4e81d6..d596c0f7 100644
--- a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
.SH SYNOPSIS
@@ -38,7 +39,11 @@ The default value is 0, which means that the size penalization is inactive.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+long maxlength = 10000;
+curl_multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, maxlength);
+.fi
.SH AVAILABILITY
Added in 7.30.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
index ee9bdca7..24995ccb 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
.SH SYNOPSIS
@@ -51,7 +52,11 @@ See DESCRIPTION
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+/* only keep 10 connections in the cache */
+curl_multi_setopt(m, CURLMOPT_MAXCONNECTS, 10L);
+.fi
.SH AVAILABILITY
Added in 7.16.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
index 2e0352f9..5dc87f18 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
.SH SYNOPSIS
@@ -49,7 +50,11 @@ considered to be the host for which this limit counts.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+/* do no more than 2 connections per host */
+curl_multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
+.fi
.SH AVAILABILITY
Added in 7.30.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
index 1204a0f9..46ca775e 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
.SH SYNOPSIS
@@ -42,7 +43,11 @@ total number of requests in-flight is \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP *
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+/* set a more conservative pipe length */
+curl_multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
+.fi
.SH AVAILABILITY
Added in 7.30.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
index ea53bfff..047b4a18 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
.SH SYNOPSIS
@@ -41,7 +42,11 @@ controlled by the number of easy handles added.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+/* never do more than 15 connections */
+curl_multi_setopt(m, CURLMOPT_MAX_TOTAL_CONNECTIONS, 15L);
+.fi
.SH AVAILABILITY
Added in 7.30.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
index 1a404765..06a2611c 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
.SH SYNOPSIS
@@ -65,7 +66,12 @@ existing connection if possible. This requires HTTP/2.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+CURLM *m = curl_multi_init();
+/* try HTTP/1 pipelining and HTTP/2 multiplexing */
+curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_HTTP1 |
+ CURLPIPE_MULTIPLEX);
+.fi
.SH AVAILABILITY
Added in 7.16.0. Multiplex support bit added in 7.43.0.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
index 660afecd..02b2096c 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "February 03, 2016" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index 8c5f5d41..ffea54cf 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "4 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "February 03, 2016" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index ca9fe8a8..8afd7670 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHDATA 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
.SH SYNOPSIS
@@ -38,7 +39,37 @@ NULL
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
-TODO
+.nf
+/* only allow pushes for file names starting with "push-" */
+int push_callback(CURL *parent,
+ CURL *easy,
+ size_t num_headers,
+ struct curl_pushheaders *headers,
+ void *userp)
+{
+ char *headp;
+ int *transfers = (int *)userp;
+ FILE *out;
+ headp = curl_pushheader_byname(headers, ":path");
+ if(headp && !strncmp(headp, "/push-", 6)) {
+ fprintf(stderr, "The PATH is %s\\n", headp);
+
+ /* save the push here */
+ out = fopen("pushed-stream", "wb");
+
+ /* write to this file */
+ curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
+
+ (*transfers)++; /* one more */
+
+ return CURL_PUSH_OK;
+ }
+ return CURL_PUSH_DENY;
+}
+
+curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, push_callback);
+curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &counter);
+.fi
.SH AVAILABILITY
Added in 7.44.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
index 9fe02f8d..3951d4b2 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHFUNCTION 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index b9cdc834..027f74e1 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETDATA 3 "3 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
.SH SYNOPSIS
@@ -39,7 +40,34 @@ NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+ GlobalInfo *g = (GlobalInfo*) cbp;
+ SockInfo *fdp = (SockInfo*) sockp;
+
+ if(what == CURL_POLL_REMOVE) {
+ remsock(fdp);
+ }
+ else {
+ if(!fdp) {
+ addsock(s, e, what, g);
+ }
+ else {
+ setsock(fdp, s, e, what, g);
+ }
+ }
+ return 0;
+}
+
+main()
+{
+ GlobalInfo setup;
+ /* ... use socket callback and custom pointer */
+ curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+ curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, &setup);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
index 51961972..58e2fcfd 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "3 Nov 2016" "libcurl 7.39.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
.SH SYNOPSIS
@@ -63,7 +64,34 @@ NULL (no callback)
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+ GlobalInfo *g = (GlobalInfo*) cbp;
+ SockInfo *fdp = (SockInfo*) sockp;
+
+ if(what == CURL_POLL_REMOVE) {
+ remsock(fdp);
+ }
+ else {
+ if(!fdp) {
+ addsock(s, e, what, g);
+ }
+ else {
+ setsock(fdp, s, e, what, g);
+ }
+ }
+ return 0;
+}
+
+main()
+{
+ GlobalInfo setup;
+ /* ... use socket callback and custom pointer */
+ curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+ curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, &setup);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
index 9d2b66f9..3d027203 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
.SH SYNOPSIS
@@ -39,7 +40,41 @@ NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+static gboolean timeout_cb(gpointer user_data)
+{
+ int running;
+ if(user_data) {
+ g_free(user_data);
+ curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL);
+ }
+ curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
+ return G_SOURCE_REMOVE;
+}
+
+static int timerfunc(CURLM *multi, long timeout_ms, void *userp)
+{
+ guint *id = userp;
+
+ if(id)
+ g_source_remove(*id);
+
+ /* -1 means we should just delete our timer. */
+ if(timeout_ms == -1) {
+ g_free(id);
+ id = NULL;
+ }
+ else {
+ if(!id)
+ id = g_new(guint, 1);
+ *id = g_timeout_add(timeout_ms, timeout_cb, id);
+ }
+ curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id);
+ return 0;
+}
+
+curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timerfunc);
+.fi
.SH AVAILABILITY
Added in 7.16.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
index 7fcb7a51..064e7ec4 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "May 27, 2017" "libcurl 7.55.0" "curl_multi_setopt options"
+
.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
.SH SYNOPSIS
@@ -62,33 +63,36 @@ NULL
All
.SH EXAMPLE
.nf
-static gboolean timeout_cb(gpointer user_data) {
- if (user_data) {
- g_free(user_data);
- curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL);
- }
- int running;
- curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
- return G_SOURCE_REMOVE;
+static gboolean timeout_cb(gpointer user_data)
+{
+ int running;
+ if(user_data) {
+ g_free(user_data);
+ curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL);
+ }
+ curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
+ return G_SOURCE_REMOVE;
}
-static int timerfunc(CURLM *multi, long timeout_ms, void *userp) {
- guint *id = userp;
+static int timerfunc(CURLM *multi, long timeout_ms, void *userp)
+{
+ guint *id = userp;
- if (id)
- g_source_remove(*id);
+ if(id)
+ g_source_remove(*id);
- // -1 means we should just delete our timer.
- if (timeout_ms == -1) {
- g_free(id);
- id = NULL;
- } else {
- if (!id)
- id = g_new(guint, 1);
- *id = g_timeout_add(timeout_ms, timeout_cb, id);
- }
- curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id);
- return 0;
+ /* -1 means we should just delete our timer. */
+ if(timeout_ms == -1) {
+ g_free(id);
+ id = NULL;
+ }
+ else {
+ if(!id)
+ id = g_new(guint, 1);
+ *id = g_timeout_add(timeout_ms, timeout_cb, id);
+ }
+ curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id);
+ return 0;
}
curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timerfunc);
diff --git a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
new file mode 100644
index 00000000..a7e660cb
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
@@ -0,0 +1,59 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ABSTRACT_UNIX_SOCKET, char *path);
+.SH DESCRIPTION
+Enables the use of an abstract Unix domain socket instead of establishing a TCP
+connection to a host. The parameter should be a char * to a zero terminated string
+holding the path of the socket. The path will be set to \fIpath\fP prefixed by a
+NULL byte (this is the convention for abstract sockets, however it should be stressed
+that the path passed to this function should not contain a leading NULL).
+
+On non-supporting platforms, the abstract address will be interpreted as an empty
+string and fail gracefully, generating a run-time error.
+
+This option shares the same semantics as
+.BR CURLOPT_UNIX_SOCKET_PATH "(3)
+in which documentation more details can be found. Internally, these two options share
+the same storage and therefore only one of them can be set per handle.
+
+.SH DEFAULT
+Default is NULL.
+.SH EXAMPLE
+.nf
+ curl_easy_setopt(curl_handle, CURLOPT_ABSTRACT_UNIX_SOCKET, "/tmp/foo.sock");
+ curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost/");
+.fi
+
+.SH AVAILABILITY
+Since 7.53.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_UNIX_SOCKET_PATH "(3), " unix "(7), "
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 70325fd9..18ce1144 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
index c3126313..635098bf 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
.SH SYNOPSIS
@@ -58,6 +59,9 @@ The Content-Length: servers send for a compressed response is supposed to
indicate the length of the compressed content so when auto decoding is enabled
it may not match the sum of bytes reported by the write callbacks (although,
sending the length of the non-compressed content is a common server mistake).
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index f323279b..c2574a7f 100644
--- a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope for local IPv6 addresses
.SH SYNOPSIS
@@ -35,7 +36,20 @@ link-local or site-local addresses.
.SH PROTOCOLS
All, when using IPv6
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ 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);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3
index c22acf79..e4719dd9 100644
--- a/docs/libcurl/opts/CURLOPT_APPEND.3
+++ b/docs/libcurl/opts/CURLOPT_APPEND.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_APPEND 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
index e6a3a085..21cb831f 100644
--- a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_AUTOREFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
.SH SYNOPSIS
@@ -36,7 +37,22 @@ a Location: redirect.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* follow redirects */
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+ /* set Referer: automatically when following redirects */
+ curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index 113118e7..f53a5f23 100644
--- a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_BUFFERSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
.SH SYNOPSIS
@@ -30,20 +31,35 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size);
.SH DESCRIPTION
Pass a long specifying your preferred \fIsize\fP (in bytes) for the receive
buffer in libcurl. The main point of this would be that the write callback
-gets called more often and with smaller chunks. This is just treated as a
-request, not an order. You cannot be guaranteed to actually get the given
-size.
+gets called more often and with smaller chunks. Secondly, for some protocols,
+there's a benefit of having a larger buffer for performance.
+
+This is just treated as a request, not an order. You cannot be guaranteed to
+actually get the given size.
-This size is by default set as big as possible (\fICURL_MAX_WRITE_SIZE\fP), so
-it only makes sense to use this option if you want it smaller.
+This buffer size is by default \fICURL_MAX_WRITE_SIZE\fP (16kB). The maximum
+buffer size allowed to be set is \fICURL_MAX_READ_SIZE\fP (512kB). The minimum
+buffer size allowed to be set is 1024.
.SH DEFAULT
-CURL_MAX_WRITE_SIZE
+CURL_MAX_WRITE_SIZE (16kB)
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/foo.bin");
+
+ /* ask libcurl to allocate a larger receive buffer */
+ curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 120000L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
-Added in 7.10
+Added in 7.10. Growing the buffer was added in 7.53.0.
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.3 b/docs/libcurl/opts/CURLOPT_CAINFO.3
index 7db50a8f..fbedfa85 100644
--- a/docs/libcurl/opts/CURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CAINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAINFO 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "May 27, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
.SH SYNOPSIS
@@ -40,18 +41,34 @@ is assumed to be stored, as established at build time.
If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module
(libnsspem.so) needs to be available for this option to work properly.
+Starting with curl-7.55.0, if both \fICURLOPT_CAINFO(3)\fP and
+\fICURLOPT_CAPATH(3)\fP are unset, NSS-linked libcurl tries to load
+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.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
Built-in system specific
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/certs/cabundle.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(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
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index 0369f891..e60bbcf4 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAPATH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "May 27, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
.SH SYNOPSIS
@@ -36,18 +37,34 @@ This makes sense only when used in combination with the
The \fICURLOPT_CAPATH(3)\fP function apparently does not work in Windows due
to some limitation in openssl.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CAPATH, "/etc/cert-dir");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS
backend provides the option only for backward compatibility.
.SH RETURN VALUE
-Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or
-CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+
+CURLE_OUT_OF_MEMORY
.SH "SEE ALSO"
.BR CURLOPT_CAINFO "(3), "
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index e836e407..05c3a199 100644
--- a/docs/libcurl/opts/CURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CERTINFO 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "May 27, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
.SH SYNOPSIS
@@ -38,7 +39,37 @@ its option \fICURLINFO_CERTINFO(3)\fP.
.SH PROTOCOLS
All TLS-based
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+ /* connect to any HTTPS site, trusted or not */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+ curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
+
+ res = curl_easy_perform(curl);
+
+ if (!res) {
+ struct curl_certinfo *ci;
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ci);
+
+ if (!res) {
+ printf("%d certs!\\n", ci->num_of_certs);
+
+ for(i = 0; i < ci->num_of_certs; i++) {
+ struct curl_slist *slist;
+
+ for(slist = ci->certinfo[i]; slist; slist = slist->next)
+ printf("%s\\n", slist->data);
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option is supported by the OpenSSL, GnuTLS, NSS and GSKit backends.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
index d31412d2..4327fe1f 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
.SH SYNOPSIS
@@ -60,7 +61,52 @@ NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+static long file_is_coming(struct curl_fileinfo *finfo,
+ struct callback_data *data,
+ int remains)
+{
+ printf("%3d %40s %10luB ", remains, finfo->filename,
+ (unsigned long)finfo->size);
+
+ switch(finfo->filetype) {
+ case CURLFILETYPE_DIRECTORY:
+ printf(" DIR\n");
+ break;
+ case CURLFILETYPE_FILE:
+ printf("FILE ");
+ break;
+ default:
+ printf("OTHER\n");
+ break;
+ }
+
+ if(finfo->filetype == CURLFILETYPE_FILE) {
+ /* do not transfer files >= 50B */
+ if(finfo->size > 50) {
+ printf("SKIPPED\n");
+ return CURL_CHUNK_BGN_FUNC_SKIP;
+ }
+
+ data->output = fopen(finfo->filename, "wb");
+ if(!data->output) {
+ return CURL_CHUNK_BGN_FUNC_FAIL;
+ }
+ }
+
+ return CURL_CHUNK_BGN_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+
+ /* callback is called before download of concrete file started */
+ curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
.SH AVAILABILITY
This was added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
index 1ceb2cea..73d11dae 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
.SH SYNOPSIS
@@ -36,7 +37,52 @@ NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+static long file_is_coming(struct curl_fileinfo *finfo,
+ struct callback_data *data,
+ int remains)
+{
+ printf("%3d %40s %10luB ", remains, finfo->filename,
+ (unsigned long)finfo->size);
+
+ switch(finfo->filetype) {
+ case CURLFILETYPE_DIRECTORY:
+ printf(" DIR\n");
+ break;
+ case CURLFILETYPE_FILE:
+ printf("FILE ");
+ break;
+ default:
+ printf("OTHER\n");
+ break;
+ }
+
+ if(finfo->filetype == CURLFILETYPE_FILE) {
+ /* do not transfer files >= 50B */
+ if(finfo->size > 50) {
+ printf("SKIPPED\n");
+ return CURL_CHUNK_BGN_FUNC_SKIP;
+ }
+
+ data->output = fopen(finfo->filename, "wb");
+ if(!data->output) {
+ return CURL_CHUNK_BGN_FUNC_FAIL;
+ }
+ }
+
+ return CURL_CHUNK_BGN_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+
+ /* callback is called before download of concrete file started */
+ curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
index d2b6c55a..d0d3917f 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
.SH SYNOPSIS
@@ -45,7 +46,24 @@ NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+static long file_is_downloaded(struct callback_data *data)
+{
+ if(data->output) {
+ fclose(data->output);
+ data->output = 0x0;
+ }
+ return CURL_CHUNK_END_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+ curl_easy_setopt(curl, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
index 1d6ca06c..c649f97e 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
.SH SYNOPSIS
@@ -36,7 +37,17 @@ The default value of this parameter is NULL.
.SH PROTOCOLS
All except file:
.SH EXAMPLE
-TODO
+.nf
+static int closesocket(void *clientp, curl_socket_t item)
+{
+ printf("libcurl wants to close %d now\n", (int)item);
+ return 0;
+}
+
+/* call this function to close sockets */
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+.fi
.SH AVAILABILITY
Added in 7.21.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
index f4e8bd99..a86429e1 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
.SH SYNOPSIS
@@ -47,7 +48,17 @@ By default libcurl uses the standard socket close function.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+static int closesocket(void *clientp, curl_socket_t item)
+{
+ printf("libcurl wants to close %d now\n", (int)item);
+ return 0;
+}
+
+/* call this function to close sockets */
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+.fi
.SH AVAILABILITY
Added in 7.21.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
index f1869486..5661f2d6 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index 7a24a8b9..25f75443 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "February 14, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index 973c2aed..2d10a579 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_ONLY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
.SH SYNOPSIS
@@ -42,7 +43,18 @@ transfers.
.SH PROTOCOLS
HTTP, SMTP, POP3 and IMAP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_OK) {
+ /* only connected! */
+ }
+}
+.fi
.SH AVAILABILITY
Added in 7.15.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3 b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
index 30250214..56a6386a 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_TO 3 "10 April 2016" "libcurl 7.49.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "May 20, 2016" "libcurl 7.55.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
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index 1ff300e2..d82e9798 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
.SH SYNOPSIS
@@ -73,7 +74,26 @@ NULL
.SH PROTOCOLS
FTP, SMTP, IMAP, POP3
.SH EXAMPLE
-TODO
+.nf
+static CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+/* use platform-specific functions for codeset conversions */
+curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ my_conv_from_ascii_to_ebcdic);
+.fi
.SH AVAILABILITY
Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
index 487492ce..49c899cb 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
.SH SYNOPSIS
@@ -72,7 +73,25 @@ NULL
.SH PROTOCOLS
TLS-based protocols.
.SH EXAMPLE
-TODO
+.nf
+static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ my_conv_from_utf8_to_ebcdic);
+.fi
.SH AVAILABILITY
Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
index a1d6a1aa..b97cc10c 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
.SH SYNOPSIS
@@ -73,7 +74,25 @@ NULL
.SH PROTOCOLS
FTP, SMTP, IMAP, POP3
.SH EXAMPLE
-TODO
+.nf
+static CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ my_conv_from_ebcdic_to_ascii);
+.fi
.SH AVAILABILITY
Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3
index 32c2fc29..7dce4146 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
.SH SYNOPSIS
@@ -55,6 +56,9 @@ previous ones.
This option will not enable the cookie engine. Use \fICURLOPT_COOKIEFILE(3)\fP
or \fICURLOPT_COOKIEJAR(3)\fP to enable parsing and sending cookies
automatically.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, no cookies
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index 00816b15..749c0fba 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEFILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
.SH SYNOPSIS
@@ -53,12 +54,27 @@ sub-domains) or use the Netscape format.
If you use this option multiple times, you just add more files to read.
Subsequent files will add more cookies.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* get cookies from an existing file */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
As long as HTTP is supported
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3 b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
index 79a37230..e86a82bc 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEJAR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
.SH SYNOPSIS
@@ -46,12 +47,28 @@ only visible feedback you get about this possibly lethal situation.
Since 7.43.0 cookies that were imported in the Set-Cookie format without a
domain name are not exported by this option.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* export cookies to this file when closing the handle */
+ curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ /* close the handle, write the cookies! */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 7de4da88..e6de2002 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIELIST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3 b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
index ecc3757e..420a3413 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIESESSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
.SH SYNOPSIS
@@ -42,7 +43,22 @@ browser up, more or less.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* new "session", don't load session cookies */
+ curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1L);
+
+ /* get the (non session) cookies from this file */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 001d6fe4..b72a062f 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index b13a06e6..0aad5dca 100644
--- a/docs/libcurl/opts/CURLOPT_CRLF.3
+++ b/docs/libcurl/opts/CURLOPT_CRLF.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLF 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
.SH SYNOPSIS
@@ -38,7 +39,16 @@ This is a legacy option of questionable use.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CRLF, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
SMTP since 7.40.0, other protocols since they were introduced
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3
index 6bb035e7..e6a1333f 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
.SH SYNOPSIS
@@ -45,12 +46,23 @@ A specific error code (\fICURLE_SSL_CRL_BADFILE\fP) is defined with the
option. It is returned when the SSL exchange fails because the CRL file cannot
be loaded. A failure in certificate verification due to a revocation
information found in the CRL does not trigger this specific error.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CRLFILE, "/etc/certs/crl.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.0
.SH RETURN VALUE
@@ -58,3 +70,4 @@ Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
.SH "SEE ALSO"
.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_PROXY_CRLFILE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 553d4085..9134a7cb 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CUSTOMREQUEST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "June 21, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
.SH SYNOPSIS
@@ -80,12 +81,27 @@ Normally a multiline response is returned which can be used, in conjunction
with \fICURLOPT_MAIL_RCPT(3)\fP, to specify an EXPN request. If the
\fICURLOPT_NOBODY(3)\fP option is specified then the request can be used to
issue NOOP and RSET commands.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
HTTP, FTP, IMAP, POP3 and SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* DELETE the given path */
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
IMAP is supported since 7.30.0, POP3 since 7.26.0 and SMTP since 7.34.0.
.SH RETURN VALUE
@@ -93,3 +109,4 @@ Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
.SH "SEE ALSO"
.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_NOBODY "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index 27b9cbb3..cc464a3b 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
index 535c5302..07747153 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index f7f890ca..cf18ff8c 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "18 Aug 2015" "libcurl 7.45.0" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
scheme name
@@ -49,6 +50,9 @@ This option does not change the default proxy protocol (http).
Without this option libcurl would make a guess based on the host, see
\fICURLOPT_URL(3)\fP for details.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL (make a guess based on the host)
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
index 07b8ac38..15108b99 100644
--- a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DIRLISTONLY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
.SH SYNOPSIS
@@ -51,7 +52,19 @@ will effectively break that feature then.
.SH PROTOCOLS
FTP, SFTP and POP3
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/");
+
+ /* list only */
+ curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option was known as CURLOPT_FTPLISTONLY up to 7.16.4. POP3 is supported
since 7.21.5.
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index 06074101..6d0d68b3 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
.SH SYNOPSIS
@@ -47,7 +48,23 @@ address for a certain small amount of time into the future.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* only reuse addresses for a very short time */
+ curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 2L);
+
+ ret = curl_easy_perform(curl);
+
+ /* in this second request, the cache will not be used if more than
+ two seconds have passed since the previous name resolve */
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index f7643980..be3e28af 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_INTERFACE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
.SH SYNOPSIS
@@ -32,11 +33,22 @@ Pass a char * as parameter. Set the name of the network interface that the DNS
resolver should bind to. This must be an interface name (not an address). Set
this option to NULL to use the default setting (don't bind to a specific
interface).
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, "eth0");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.33.0. This option also requires that libcurl was built with a
resolver backend that supports this operation. The c-ares backend is the only
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index ef9f1e26..bbc9e6eb 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
.SH SYNOPSIS
@@ -32,12 +33,23 @@ Set the local IPv4 \fIaddress\fP that the resolver should bind to. The
argument should be of type char * and contain a single numerical IPv4 address
as a string. Set this option to NULL to use the default setting (don't bind
to a specific IP address).
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, "192.168.0.14");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option requires that libcurl was built with a resolver backend that
supports this operation. The c-ares backend is the only such one.
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index 7d82bdf8..4135440b 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
.SH SYNOPSIS
@@ -32,12 +33,23 @@ Set the local IPv6 \fIaddress\fP that the resolver should bind to. The
argument should be of type char * and contain a single IPv6 address as a
string. Set this option to NULL to use the default setting (don't bind to a
specific IP address).
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, "fe80::a9ff:fe46:b619");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option requires that libcurl was built with a resolver backend that
supports this operation. The c-ares backend is the only such one.
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index 14c9f9bd..574e7ea8 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SERVERS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
.SH SYNOPSIS
@@ -36,12 +37,23 @@ host[:port][,host[:port]]...
For example:
192.168.1.100,192.168.1.101,3.4.5.6
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL - use system default
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "192.168.1.100:53,192.168.1.101");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option requires that libcurl was built with a resolver backend that
supports this operation. The c-ares backend is the only such one.
diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
index 87f686a2..4dc7e880 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
.SH SYNOPSIS
@@ -41,7 +42,17 @@ to using the share interface instead! See \fICURLOPT_SHARE(3)\fP and
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* switch off the use of a global, thread unsafe, cache */
+ curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Subject for removal in the future. Do not use!
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index ad91c3f0..b16c9377 100644
--- a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EGDSOCKET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
.SH SYNOPSIS
@@ -30,12 +31,23 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);
.SH DESCRIPTION
Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
socket. It will be used to seed the random engine for SSL.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_EGDSOCKET, "/var/egd.socket");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled. Only the OpenSSL and GnuTLS backends will use this.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index b64a2a39..ab5f7bb4 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ERRORBUFFER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index 10f3c062..226d0a41 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
.SH SYNOPSIS
@@ -40,7 +41,17 @@ sent anyway.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ /* wait 3 seconds for 100-continue */
+ curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 3000L);
+
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.36.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index 93d8ba6e..c2ea356c 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FAILONERROR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
.SH SYNOPSIS
@@ -41,15 +42,26 @@ detected, like when a "100-continue" is received as a response to a POST/PUT
and a 401 or 407 is received immediately afterwards.
When this option is used and an error is detected, it will cause the
-connection to get closed.
+connection to get closed and \fICURLE_HTTP_RETURNED_ERROR\fP is returned.
.SH DEFAULT
0, do not fail on error
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_HTTP_RETURNED_ERROR) {
+ /* a HTTP response error problem */
+ }
+}
+.fi
.SH AVAILABILITY
-Along with HTTP
+Along with HTTP.
.SH RETURN VALUE
Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3
index 99ba7f7e..7589642a 100644
--- a/docs/libcurl/opts/CURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/CURLOPT_FILETIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FILETIME 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
.SH SYNOPSIS
@@ -38,7 +39,24 @@ argument can be used after a transfer to extract the received time (if any).
.SH PROTOCOLS
HTTP, FTP, SFTP, FILE
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* Ask for filetime */
+ curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if((CURLE_OK == res) && (filetime >= 0)) {
+ time_t file_time = (time_t)filetime;
+ printf("filetime %s: %s", filename, ctime(&file_time));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always, for SFTP since 7.49.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
index 236c19df..b98daac1 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
.SH SYNOPSIS
@@ -37,7 +38,25 @@ NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+static int my_fnmatch(void *clientp,
+ const char *pattern, const char *string)
+{
+ struct local_stuff *data = (struct local_stuff *)clientp;
+ if(string_match(pattern, string))
+ return CURL_FNMATCHFUNC_MATCH;
+ else
+ return CURL_FNMATCHFUNC_NOMATCH;
+}
+
+{
+ struct local_stuff local_data;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/file*");
+ curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 1L);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION, my_fnmatch);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, &local_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
index 04967b89..6e28fbbc 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
.SH SYNOPSIS
@@ -47,7 +48,25 @@ NULL == an internal function for wildcard matching.
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+static int my_fnmatch(void *clientp,
+ const char *pattern, const char *string)
+{
+ struct local_stuff *data = (struct local_stuff *)clientp;
+ if(string_match(pattern, string))
+ return CURL_FNMATCHFUNC_MATCH;
+ else
+ return CURL_FNMATCHFUNC_NOMATCH;
+}
+
+{
+ struct local_stuff local_data;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/file*");
+ curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 1L);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION, my_fnmatch);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, &local_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
index 094ee05d..3f26ae6b 100644
--- a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FOLLOWLOCATION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index b8464dfc..8e119ac5 100644
--- a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FORBID_REUSE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
.SH SYNOPSIS
@@ -41,7 +42,16 @@ Set to 0 to have libcurl keep the connection open for possible later re-use
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L);
+ curl_easy_perform(curl);
+
+ /* this second transfer may not reuse the same connection */
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
index ce6e6fe7..10305d5c 100644
--- a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FRESH_CONNECT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
.SH SYNOPSIS
@@ -43,7 +44,14 @@ Set \fIfresh\fP to 0 to have libcurl attempt re-using an existing connection
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1L);
+ /* this transfer must use a new connection, not reuse an existing */
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.3 b/docs/libcurl/opts/CURLOPT_FTPPORT.3
index 8e300bc2..375fd4fa 100644
--- a/docs/libcurl/opts/CURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/CURLOPT_FTPPORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
.SH SYNOPSIS
@@ -57,12 +58,23 @@ Examples with specified ports:
You disable PORT again and go back to using the passive version by setting
this option to NULL.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/old-server/file.txt");
+ curl_easy_setopt(curl, CURLOPT_FTPPORT, "-");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Port range support was added in 7.19.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index 5437b0c7..a1507d39 100644
--- a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPSSLAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
.SH SYNOPSIS
@@ -44,7 +45,17 @@ CURLFTPAUTH_DEFAULT
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_TRY);
+ /* funny server, ask for SSL before TLS */
+ curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
index 0d768d77..2d857420 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ACCOUNT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
.SH SYNOPSIS
@@ -31,12 +32,26 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);
Pass a pointer to a zero terminated string (or NULL to disable). When an FTP
server asks for "account data" after user name and password has been provided,
this data is sent off using the ACCT command.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, "human-resources");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.13.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 57581090..b93c76dd 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
.SH SYNOPSIS
@@ -35,12 +36,26 @@ authenticate if the usual FTP "USER user" and "PASS password" negotiation
fails. This is currently only known to be required when connecting to
Tumbleweed's Secure Transport FTPS server using client certificates for
authentication.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, "two users");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
index d28a646e..b2d0eead 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
.SH SYNOPSIS
@@ -59,7 +60,18 @@ CURLFTP_CREATE_DIR_NONE (0)
.SH PROTOCOLS
FTP and SFTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/non-existing/new.txt");
+ curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS,
+ CURLFTP_CREATE_DIR_RETRY);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.7. SFTP support added in 7.16.3. The retry option was added in
7.19.4.
diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
index 280e8f1d..8b34296e 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
.SH SYNOPSIS
@@ -53,7 +54,18 @@ CURLFTPMETHOD_MULTICWD
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/1/2/3/4/new.txt");
+ curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD,
+ CURLFTPMETHOD_SINGLECWD);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
index 45ec304c..55aeb4f4 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
.SH SYNOPSIS
@@ -40,7 +41,17 @@ None
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/slow.txt");
+ /* wait no more than 23 seconds */
+ curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, 23L);
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.8
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
index b60c3b10..1cd3116c 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
.SH SYNOPSIS
@@ -43,7 +44,18 @@ This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+
+ /* please ignore the IP in the PASV response */
+ curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, 1L);
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.14.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
index 47371147..a830b372 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SSL_CCC 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
.SH SYNOPSIS
@@ -45,7 +46,17 @@ CURLFTPSSL_CCC_NONE
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_CONTROL);
+ /* go back to clear-text FTP after authenticating */
+ curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, CURLFTPSSL_CCC_ACTIVE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
index 181f5a1c..9c1f5805 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPRT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
index af7a45e9..dbcb7a76 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPSV 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
.SH SYNOPSIS
@@ -39,7 +40,19 @@ If the server is an IPv6 host, this option will have no effect as of 7.12.3.
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/old-server/file.txt");
+
+ /* let's shut off this modern feature */
+ curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with FTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
index 10f713bb..9f2e9421 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_PRET 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
.SH SYNOPSIS
@@ -37,7 +38,19 @@ no effect when using the active FTP transfers mode.
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/old-server/file.txt");
+
+ /* a drftpd server, do it! */
+ curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
index 65ea6ec4..715a07b7 100644
--- a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
.SH SYNOPSIS
@@ -28,18 +29,30 @@ CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long level);
.SH DESCRIPTION
-Set the long parameter \fIlevel\fP to CURLGSSAPI_DELEGATION_FLAG to allow
-unconditional GSSAPI credential delegation. The delegation is disabled by
-default since 7.21.7. Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG
-to delegate only if the OK-AS-DELEGATE flag is set in the service ticket in
-case this feature is supported by the GSS-API implementation and the definition
-of GSS_C_DELEG_POLICY_FLAG was available at compile-time.
+Set the long parameter \fIlevel\fP to \fBCURLGSSAPI_DELEGATION_FLAG\fP to
+allow unconditional GSSAPI credential delegation. The delegation is disabled
+by default since 7.21.7. Set the parameter to
+\fBCURLGSSAPI_DELEGATION_POLICY_FLAG\fP to delegate only if the OK-AS-DELEGATE
+flag is set in the service ticket in case this feature is supported by the
+GSS-API implementation and the definition of GSS_C_DELEG_POLICY_FLAG was
+available at compile-time.
.SH DEFAULT
CURLGSSAPI_DELEGATION_NONE
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* delegate if okayed by policy */
+ curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION,
+ CURLGSSAPI_DELEGATION_POLICY_FLAG);
+ ret = curl_easy_perform(curl);
+}
+.fi
+
.SH AVAILABILITY
Added in 7.22.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3
index b650163d..900ee466 100644
--- a/docs/libcurl/opts/CURLOPT_HEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HEADER.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADER 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index c865c860..77e7bf16 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
.SH SYNOPSIS
@@ -41,7 +42,35 @@ NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+struct my_info {
+ int shoesize;
+ char *secret;
+};
+
+static size_t header_callback(char *buffer, size_t size,
+ size_t nitems, void *userdata)
+{
+ struct my_info *i = (struct my_info *)userdata;
+
+ /* now this callback can access the my_info struct */
+
+ return nitems * size;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct my_info my = { 10, "the cookies are in the cupboard" };
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
+
+ /* pass in custom data to the callback */
+ curl_easy_setopt(curl, CURLOPT_HEADERDATA, &my);
+
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index b8596d8f..3396dbb0 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index 7053a3af..5dfdfb1e 100644
--- a/docs/libcurl/opts/CURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADEROPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
.SH SYNOPSIS
@@ -48,7 +49,24 @@ CURLHEADER_SEPARATE (changed in 7.42.1, ased CURLHEADER_UNIFIED before then)
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ struct curl_slist *list;
+ list = curl_slist_append(NULL, "Shoesize: 10");
+ list = curl_slist_append(list, "Accept:");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+
+ /* 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_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.37.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
index 17f1dd32..a338fe5f 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP200ALIASES 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
.SH SYNOPSIS
@@ -49,7 +50,20 @@ NULL
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+ list = curl_slist_append(NULL, "ICY 200 OK");
+ list = curl_slist_append(list, "WEIRDO 99 FINE");
+
+ curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, list);
+ curl_easy_perform(curl);
+ curl_slist_free_all(list); /* free the list again */
+}
+.fi
.SH AVAILABILITY
Added in 7.10.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index fc7a3a41..53dc1e8b 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPAUTH 3 "2 Aug 2014" "libcurl 7.38.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
.SH SYNOPSIS
@@ -99,7 +100,17 @@ CURLAUTH_BASIC
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* allow whatever auth the server speaks */
+ curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+ curl_easy_setopt(curl, CURLOPT_USERPWD, "james:bond");
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Option Added in 7.10.6.
diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3
index 01de1f3c..2bdc38d1 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPGET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTPGET \- ask for a HTTP GET request
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index c5ccb1a5..b7912ef4 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPHEADER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index 974f9f37..7ba806f3 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPOST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "May 17, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
index 6b48a052..c860510a 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
.SH SYNOPSIS
@@ -28,24 +29,38 @@ CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel);
.SH DESCRIPTION
-Set the parameter to 1 to make libcurl tunnel all operations through the HTTP
-proxy. There is a big difference between using a proxy and to tunnel through
-it. If you don't know what this means, you probably don't want this tunneling
-option.
+Set the \fBtunnel\fP parameter to 1L to make libcurl tunnel all operations
+through the HTTP proxy (set with \fICURLOPT_PROXY(3)\fP). There is a big
+difference between using a proxy and to tunnel through it.
-Tunneling essentially means that a CONNECT is sent to the proxy, asking it to
-connect to a remote host on a specific port number and then the traffic is
-just passed through the proxy. Proxies tend to whitelist specific port numbers
+Tunneling means that a HTTP CONNECT request is sent to the proxy, asking it
+to connect to a remote host on a specific port number and then the traffic is
+just passed through the proxy. Proxies tend to white-list specific port numbers
it allows CONNECT requests to and often only port 80 and 443 are allowed.
-When using this, it only makes sense to use \fICURLOPT_PROXYTYPE(3)\fP set to
-a HTTP proxy.
+To suppress proxy CONNECT response headers from user callbacks use
+\fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP.
+
+HTTP proxies can generally only speak HTTP (for obvious reasons), which makes
+libcurl convert non-HTTP requests to HTTP when using an HTTP proxy without
+this tunnel option set. For example, asking for an FTP URL and specifying an
+HTTP proxy will make libcurl send an FTP URL in a HTTP GET request to the
+proxy. By instead tunneling through the proxy, you avoid that conversion (that
+rarely works through the proxy anyway).
.SH DEFAULT
0
.SH PROTOCOLS
All network protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
+ curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
index 9338b249..9ef8c1d6 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
.SH SYNOPSIS
@@ -39,7 +40,15 @@ default content decoding but requires you to use
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 0L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
index ddd59d29..ad64aa23 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
.SH SYNOPSIS
@@ -39,7 +40,15 @@ option is set to zero.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
index 96dd4b67..70c95e09 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_VERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
.SH SYNOPSIS
@@ -64,7 +65,18 @@ CURL_HTTP_VERSION_NONE
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_HTTP_RETURNED_ERROR) {
+ /* a HTTP response error problem */
+ }
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index 413ee579..d99e9ba2 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index 088f45d0..a447108f 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
index f866cd43..65f194ae 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_INTERFACE.3
index 77db3723..652ca9ab 100644
--- a/docs/libcurl/opts/CURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_INTERFACE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERFACE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
.SH SYNOPSIS
@@ -40,12 +41,26 @@ synchronously. Using the if! format is highly recommended when using the
multi interfaces to avoid allowing the code to block. If "if!" is specified
but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED
is returned from the libcurl function used to perform the transfer.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, use whatever the TCP stack finds suitable
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_INTERFACE, "eth0");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
The "if!" and "host!" syntax was added in 7.24.0.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index b47d21d9..1429698b 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEDATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer to RTSP interleave callback
.SH SYNOPSIS
@@ -36,7 +37,19 @@ NULL
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *user)
+{
+ struct local *l = (struct local *)user;
+ /* take care of the packet in 'ptr', then return... */
+ return size * nmemb;
+}
+{
+ struct local rtp_data;
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION, rtp_write);
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, &rtp_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
index 95e6fe52..3213a3e4 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
.SH SYNOPSIS
@@ -59,7 +60,19 @@ NULL
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *user)
+{
+ struct local *l = (struct local *)user;
+ /* take care of the packet in 'ptr', then return... */
+ return size * nmemb;
+}
+{
+ struct local rtp_data;
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION, rtp_write);
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, &rtp_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3 b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
index 0ef96e2b..bdc21c0a 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
.SH SYNOPSIS
@@ -35,7 +36,23 @@ By default, the value of this parameter is NULL.
.SH PROTOCOLS
Used with HTTP
.SH EXAMPLE
-TODO
+.nf
+static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
+{
+ struct data *io = (struct data *)clientp;
+ if(cmd == CURLIOCMD_RESTARTREAD) {
+ lseek(fd, 0, SEEK_SET);
+ current_offset = 0;
+ return CURLIOE_OK;
+ }
+ return CURLIOE_UNKNOWNCMD;
+}
+{
+ struct data ioctl_data;
+ curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
+ curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &ioctl_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
index f2dd42eb..9123a3e3 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
.SH SYNOPSIS
@@ -67,7 +68,23 @@ By default, this parameter is set to NULL. Not used.
.SH PROTOCOLS
Used with HTTP
.SH EXAMPLE
-TODO
+.nf
+static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
+{
+ struct data *io = (struct data *)clientp;
+ if(cmd == CURLIOCMD_RESTARTREAD) {
+ lseek(fd, 0, SEEK_SET);
+ current_offset = 0;
+ return CURLIOE_OK;
+ }
+ return CURLIOE_UNKNOWNCMD;
+}
+{
+ struct data ioctl_data;
+ curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
+ curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &ioctl_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.12.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
index 817f34d5..dce07da8 100644
--- a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IPRESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
.SH SYNOPSIS
@@ -42,7 +43,20 @@ CURL_IPRESOLVE_WHATEVER
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ /* resolve host name using IPv6-names only */
+ curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 61198eac..a2c1ee02 100644
--- a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ISSUERCERT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
.SH SYNOPSIS
@@ -43,12 +44,23 @@ A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
which is returned if the setup of the SSL/TLS session has failed due to a
mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER(3)\fP
has to be set too for the check to fail). (Added in 7.19.0)
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_ISSUERCERT, "/etc/certs/cacert.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index 277125b6..ff6ed841 100644
--- a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "22 Sep 2016" "libcurl 7.51.0" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
.SH SYNOPSIS
@@ -43,7 +44,16 @@ Most applications do not need this option.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "sending data");
+ curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, 1L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP. Added in 7.51.0.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
index 9b85b824..779d19c1 100644
--- a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEYPASSWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
.SH SYNOPSIS
@@ -32,12 +33,25 @@ Pass a pointer to a zero terminated string as parameter. It will be used as
the password required to use the \fICURLOPT_SSLKEY(3)\fP or
\fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP private key. You never needed a pass
phrase to load a certificate but you need one to load your private key.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and
CURLOPT_SSLCERTPASSWD up to 7.9.2.
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index 6ebd2f27..a7920489 100644
--- a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KRBLEVEL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
.SH SYNOPSIS
@@ -33,12 +34,23 @@ enables kerberos awareness. This is a string that should match one of the
following: \&'clear', \&'safe', \&'confidential' or \&'private'. If the
string is set but doesn't match one of these, 'private' will be used. Set the
string to NULL to disable kerberos support for FTP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_KRBLEVEL, "private");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
This option was known as CURLOPT_KRB4LEVEL up to 7.16.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
index e56f0129..b9f4296d 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
.SH SYNOPSIS
@@ -37,7 +38,17 @@ this option is set. Valid port numbers are 1 - 65535.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+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);
+ /* and try 20 more ports following that */
+ curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index e54a1c87..be2f2002 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORTRANGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
.SH SYNOPSIS
@@ -41,7 +42,17 @@ setup failures.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+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);
+ /* and try 20 more ports following that */
+ curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.2
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index a9ca1928..0da1c4e2 100644
--- a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
.SH SYNOPSIS
@@ -38,12 +39,23 @@ IETF draft draft-earhart-url-smtp-00.txt
options, such as the preferred authentication mechanism via "AUTH=NTLM" or
"AUTH=*", and should be used in conjunction with the \fICURLOPT_USERNAME(3)\fP
option.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Only IMAP, POP3 and SMTP support login options.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=*");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.34.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 890ea720..5c1aa3f0 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
.SH SYNOPSIS
@@ -37,7 +38,21 @@ slow and abort.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* abort if slower than 30 bytes/sec during 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60L);
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 30L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OPERATION_TIMEDOUT == res) {
+ printf("Timeout!\\n");
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
index ed3b8296..6f527914 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
.SH SYNOPSIS
@@ -36,7 +37,21 @@ library to consider it too slow and abort.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* abort if slower than 30 bytes/sec during 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60L);
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 30L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OPERATION_TIMEDOUT == res) {
+ printf("Timeout!\\n");
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
index bd581f0d..9ff299c1 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_AUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
.SH SYNOPSIS
@@ -43,12 +44,23 @@ Unlike \fICURLOPT_MAIL_FROM(3)\fP and \fICURLOPT_MAIL_RCPT(3)\fP, the address
should not be specified within a pair of angled brackets (<>). However, if an
empty string is used then a pair of brackets will be sent by libcurl as
required by RFC2554.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_AUTH, "<secret@cave>");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.25.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index 0420d493..cbfbbbb2 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_FROM 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
.SH SYNOPSIS
@@ -36,12 +37,23 @@ around it, which if not specified will be added automatically.
If this parameter is not specified then an empty address will be sent to the
mail server which may cause the email to be rejected.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "president@example.com");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index 01fa62ab..41bcaf13 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
.SH SYNOPSIS
@@ -51,7 +52,19 @@ NULL
.SH PROTOCOLS
SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
+ list = curl_slist_append(NULL, "root@localhost");
+ list = curl_slist_append(list, "person@example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, list);
+ ret = curl_easy_perform(curl);
+ curl_slist_free_all(list);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0. The VRFY and EXPN logic was added in 7.34.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 8e90a9d2..aef2938c 100644
--- a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
.SH SYNOPSIS
@@ -50,7 +51,16 @@ acknowledged, and you must instead use \fIcurl_multi_setopt(3)\fP and the
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* limit the connection cache for this handle to no more than 3 */
+ curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, 3L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
index 5f5959a1..fff6980c 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
.SH SYNOPSIS
@@ -43,7 +44,16 @@ None
.SH PROTOCOLS
FTP and HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* refuse to download if larger than 1000 bytes! */
+ curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, 1000L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
index 630c0b5a..cac55a2d 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
.SH SYNOPSIS
@@ -43,7 +44,17 @@ None
.SH PROTOCOLS
FTP and HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_off_t ridiculous = 1 << 48;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* refuse to download if larger than ridiculous */
+ curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, ridiculous);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.11.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
index ce625536..e485c27c 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXREDIRS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index c99ff61e..1a03abe0 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
.SH SYNOPSIS
@@ -40,6 +41,16 @@ This option doesn't affect transfer speeds done with FILE:// URLs.
.SH PROTOCOLS
All but file://
.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* cap the download speed to 31415 bytes/sec */
+ curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)31415);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index 7f3efe57..0cec68f1 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
.SH SYNOPSIS
@@ -41,7 +42,17 @@ This option doesn't affect transfer speeds done with FILE:// URLs.
.SH PROTOCOLS
All except file://
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* cap the upload speed to 1000 bytes/sec */
+ curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t)1000);
+ /* (set some upload options as well!) */
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.15.5
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3
index c453dd38..ca85625f 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "August 02, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NETRC \- request that .netrc is used
.SH SYNOPSIS
@@ -30,7 +31,9 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level);
.SH DESCRIPTION
This parameter controls the preference \fIlevel\fP of libcurl between using
user names and passwords from your \fI~/.netrc\fP file, relative to user names
-and passwords in the URL supplied with \fICURLOPT_URL(3)\fP.
+and passwords in the URL supplied with \fICURLOPT_URL(3)\fP. On Windows,
+libcurl will use the file as \fI%HOME%/_netrc\fP, but you can also tell
+libcurl a different file name to use with \fICURLOPT_NETRC_FILE(3)\fP.
libcurl uses a user name (and supplied or prompted password) supplied with
\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP in preference to any of
@@ -64,10 +67,18 @@ CURL_NETRC_IGNORED
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
Returns CURLE_OK
.SH "SEE ALSO"
-.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), "
+.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), ", CURLOPT_NETRC_FILE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3 b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
index d3ecc957..d2b24e95 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC_FILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
.SH SYNOPSIS
@@ -33,12 +34,24 @@ the full path name to the \fIfile\fP you want libcurl to use as .netrc
file. If this option is omitted, and \fICURLOPT_NETRC(3)\fP is set, libcurl
will attempt to find a .netrc file in the current user's home
directory.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
+ curl_easy_setopt(curl, CURLOPT_NETRC_FILE, "/tmp/magic-netrc");
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.9
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index f195fabf..995312b2 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
.SH SYNOPSIS
@@ -39,7 +40,16 @@ this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP.
.SH PROTOCOLS
SFTP, SCP and FILE
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://upload.example.com/newdir/file.zip");
+ curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
+ curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, 0644L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
index 2a41aba4..529c1026 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
.SH SYNOPSIS
@@ -39,7 +40,15 @@ this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP.
.SH PROTOCOLS
SFTP, SCP and FILE
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://upload.example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, 0664L);
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index 340b9f45..013ff7a5 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOBODY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
.SH SYNOPSIS
@@ -44,10 +45,10 @@ curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
- /* get us the resource without a body! */
+ /* get us the resource without a body! */
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
- /* Perform the request */
+ /* Perform the request */
curl_easy_perform(curl);
}
.fi
@@ -57,3 +58,4 @@ Always
Returns CURLE_OK
.SH "SEE ALSO"
.BR CURLOPT_HTTPGET "(3), " CURLOPT_POST "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index 8194a5e0..0f667f40 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROGRESS 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "March 06, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index 2998a30a..b1772669 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROXY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
.SH SYNOPSIS
@@ -36,12 +37,30 @@ list is matched as either a domain which contains the hostname, or the
hostname itself. For example, example.com would match example.com,
example.com:80, and www.example.com, but not www.notanexample.com or
example.com.othertld.
+
+If the name in the noproxy list has a leading period, it is a domain match
+against the provided host name. This way ".example.com" will switch off proxy
+use for both "www.example.com" as well as for "foo.example.com".
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* accept various URLs */
+ curl_easy_setopt(curl, CURLOPT_URL, input);
+ /* use this proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ /* ... but make sure this host name is not proxied */
+ curl_easy_setopt(curl, CURLOPT_NOPROXY, "www.example.com");
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index dac0710f..245e701f 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOSIGNAL 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
index 869b7f6c..0bc5bbef 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
.SH SYNOPSIS
@@ -35,7 +36,44 @@ The default value of this parameter is NULL.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.17.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
index 314e0c4a..cc4672cb 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
.SH SYNOPSIS
@@ -81,6 +82,44 @@ The default behavior is the equivalent of this:
.SH PROTOCOLS
All
.SH EXAMPLE
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.17.1.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 06ed9e19..0a7f0fad 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
.SH SYNOPSIS
@@ -33,12 +34,26 @@ password to use for the transfer.
The \fICURLOPT_PASSWORD(3)\fP option should be used in conjunction with the
\fICURLOPT_USERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_PASSWORD, "qwerty");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index 9b0d3d55..12f0ce46 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PATH_AS_IS 3 "17 Jun 2014" "libcurl 7.42.0" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "February 14, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index 33d201d9..69e5cbd4 100644
--- a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "27 Aug 2014" "libcurl 7.38.0" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "April 17, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
.SH SYNOPSIS
@@ -39,6 +40,9 @@ if it does not exactly match the public key provided to this option, curl will
abort the connection before sending or receiving any data.
On mismatch, \fICURLE_SSL_PINNEDPUBKEYNOTMATCH\fP is returned.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
@@ -100,6 +104,8 @@ PEM/DER support:
7.49.0: PolarSSL
+ 7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
+
sha256 support:
7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL
@@ -108,6 +114,8 @@ sha256 support:
7.49.0: PolarSSL
+ 7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
+
Other SSL backends not supported.
.SH RETURN VALUE
Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index 6d0f14e7..c2bd7b97 100644
--- a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PIPEWAIT 3 "12 May 2015" "libcurl 7.43.0" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3
index f47b243a..9b371758 100644
--- a/docs/libcurl/opts/CURLOPT_PORT.3
+++ b/docs/libcurl/opts/CURLOPT_PORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PORT \- set remote port number to work with
.SH SYNOPSIS
@@ -42,7 +43,15 @@ By default this is 0 which makes it not used.
.SH PROTOCOLS
Used for all protocols that speak to a port number.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PORT, 8080L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index 7754c7dc..290fd55c 100644
--- a/docs/libcurl/opts/CURLOPT_POST.3
+++ b/docs/libcurl/opts/CURLOPT_POST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POST \- request a HTTP POST
.SH SYNOPSIS
@@ -68,7 +69,19 @@ re-used handle, you must explicitly set the new request type using
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_POST, 1L);
+
+ /* set up the read callback with CURLOPT_READFUNCTION */
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index 17ec2d76..0b9bd7df 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "July 07, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
.SH SYNOPSIS
@@ -52,8 +53,10 @@ the POST data from the read callback. If you want to send a zero-byte POST set
\fICURLOPT_POSTFIELDS(3)\fP to an empty string, or set \fICURLOPT_POST(3)\fP to
1 and \fICURLOPT_POSTFIELDSIZE(3)\fP to 0.
-Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
-You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header,
+and libcurl will add that header automatically if the POST is either known to
+be larger than 1024 bytes or if the expected size is unknown. You can disable
+this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
To make multipart/formdata posts (aka RFC2388-posts), check out the
\fICURLOPT_HTTPPOST(3)\fP option combined with \fIcurl_formadd(3)\fP.
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index 8db05c68..48277bfd 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index 9d0c4017..6a92e39e 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index 3283a1a4..4e8db1db 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
.SH SYNOPSIS
@@ -39,7 +40,23 @@ NULL
.SH PROTOCOLS
SFTP and FTP
.SH EXAMPLE
-TODO
+.nf
+struct curl_slist *h = NULL;
+h = curl_slist_append(h, "RNFR source-name");
+h = curl_slist_append(h, "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);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If support for the protocols are built-in.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
index 07aea6e6..b1970f8a 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTREDIR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_POSTREDIR \- how to act on a HTTP POST redirect
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index 6b95265e..41ffbb85 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,25 +20,45 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PREQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
-CURLOPT_PREQUOTE \- commands to run before FTP or SFTP transfer
+CURLOPT_PREQUOTE \- commands to run before an FTP transfer
.SH SYNOPSIS
#include <curl/curl.h>
-CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE, char *cmds);
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE,
+ struct curl_slist *cmds);
.SH DESCRIPTION
-Pass a pointer to a linked list of FTP or SFTP commands to pass to the server
-after the transfer type is set. The linked list should be a fully valid list
-of struct curl_slist structs properly filled in as described for
+Pass a pointer to a linked list of FTP commands to pass to the server after
+the transfer type is set. The linked list should be a fully valid list of
+struct curl_slist structs properly filled in as described for
\fICURLOPT_QUOTE(3)\fP. Disable this operation again by setting a NULL to this
option.
+
+While \fICURLOPT_QUOTE(3)\fP and \fICURLOPT_POSTQUOTE(3)\fP work for SFTP,
+this option does not.
.SH DEFAULT
NULL
.SH PROTOCOLS
-FTP and SFTP
+FTP
.SH EXAMPLE
-TODO
+.nf
+struct curl_slist *h = NULL;
+h = curl_slist_append(h, "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);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with the protocol support
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3 b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
index 035dd3ac..00a4b88b 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRE_PROXY 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
.SH SYNOPSIS
@@ -50,6 +51,9 @@ be used. Otherwise SOCKS4 is used as default.
Setting the pre proxy string to "" (an empty string) will explicitly disable
the use of a pre proxy.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
Default is NULL, meaning no pre proxy is used.
@@ -58,7 +62,15 @@ single port number used widely for proxies. Specify it!
.SH PROTOCOLS
All except file://. Note that some protocols don't do very well over proxy.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PREPROXY, "socks4://socks-proxy:1080");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 80f2c6b0..d0a775a4 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRIVATE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PRIVATE \- store a private pointer
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 7dc70f12..4f2d9887 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
index b077e3b6..0e61d0f6 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
index 4fecb81d..e74ea5ef 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY.3 b/docs/libcurl/opts/CURLOPT_PROXY.3
index 64b74fae..7f17f96d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY \- set proxy to use
.SH SYNOPSIS
@@ -38,10 +39,22 @@ option \fICURLOPT_PROXYPORT(3)\fP. If not specified, libcurl will default to
using port 1080 for proxies.
The proxy string may be prefixed with [scheme]:// to specify which kind of
-proxy is used. Use socks4://, socks4a://, socks5:// or socks5h:// (the last
-one to enable socks5 and asking the proxy to do the resolving, also known as
-\fICURLPROXY_SOCKS5_HOSTNAME\fP type) to request the specific SOCKS version to
-be used. No scheme specified or http://, will be treated as HTTP proxies.
+proxy is used.
+
+.RS
+.IP http://
+HTTP Proxy. Default when no scheme or proxy type is specified.
+.IP https://
+HTTPS Proxy. (Added in 7.52.0 for OpenSSL, GnuTLS and NSS)
+.IP socks4://
+SOCKS4 Proxy.
+.IP socks4a://
+SOCKS4a Proxy. Proxy resolves URL hostname.
+.IP socks5://
+SOCKS5 Proxy.
+.IP socks5h://
+SOCKS5 Proxy. Proxy resolves URL hostname.
+.RE
Without a scheme prefix, \fICURLOPT_PROXYTYPE(3)\fP can be used to specify
which kind of proxy the string identifies.
@@ -53,15 +66,26 @@ an impact on what other features of the library you can use, such as
tunnel through the HTTP proxy. Such tunneling is activated with
\fICURLOPT_HTTPPROXYTUNNEL(3)\fP.
-libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP,
-\fBall_proxy\fP etc, if any of those are set. The \fICURLOPT_PROXY(3)\fP
-option does however override any possibly set environment variables.
-
Setting the proxy string to "" (an empty string) will explicitly disable the
use of a proxy, even if there is an environment variable set for it.
A proxy host string can also include protocol scheme (http://) and embedded
user + password.
+
+The application does not have to keep the string around after setting this
+option.
+.SH "Environment variables"
+libcurl respects the proxy environment variables named \fBhttp_proxy\fP,
+\fBftp_proxy\fP, \fBsftp_proxy\fP etc. If set, libcurl will use the specified
+proxy for that URL scheme. So for a "FTP://" URL, the \fBftp_proxy\fP is
+considered. \fBall_proxy\fP is used if no protocol specific proxy was set.
+
+If \fBno_proxy\fP (or \fBNO_PROXY\fP) is set, it can specify a list of host
+names to not use a proxy for (even if one of the previous mention variables
+are set). That is the exact equivalent of setting the \fICURLOPT_NOPROXY(3)\fP
+option.
+
+The \fICURLOPT_PROXY(3)\fP option overrides environment variables.
.SH DEFAULT
Default is NULL, meaning no proxy is used.
@@ -70,7 +94,14 @@ single port number used widely for proxies. Specify it!
.SH PROTOCOLS
All except file://. Note that some protocols don't do very well over proxy.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Since 7.14.1 the proxy environment variable names can include the protocol
scheme.
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index 24dbca5a..f7d94ce5 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
.SH SYNOPSIS
@@ -43,7 +44,21 @@ CURLAUTH_BASIC
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* use this proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://local.example.com:1080");
+ /* allow whatever auth the proxy speaks */
+ curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
+ /* set the proxy credentials */
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "james:007");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.10.7
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3 b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
index bfec6293..3d06fe6f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYHEADER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
.SH SYNOPSIS
@@ -48,7 +49,25 @@ NULL
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+
+struct curl_slist *list;
+
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy.example.com:80");
+
+ list = curl_slist_append(NULL, "Shoesize: 10");
+ list = curl_slist_append(list, "Accept:");
+
+ curl_easy_setopt(curl, CURLOPT_PROXYHEADER, list);
+
+ curl_easy_perform(curl);
+
+ curl_slist_free_all(list); /* free the list again */
+}
+.fi
.SH AVAILABILITY
Added in 7.37.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
index 18272c34..bd4b65d8 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
.SH SYNOPSIS
@@ -33,12 +34,25 @@ password to use for authentication with the proxy.
The \fICURLOPT_PROXYPASSWORD(3)\fP option should be used in conjunction with
the \fICURLOPT_PROXYUSERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
+ curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 0e222896..b0831149 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
.SH SYNOPSIS
@@ -39,7 +40,16 @@ than 65535.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "localhost");
+ curl_easy_setopt(curl, CURLOPT_PROXYPORT, 8080L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index d2d92425..ba0f8ccc 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
.SH SYNOPSIS
@@ -28,15 +29,26 @@ CURLOPT_PROXYTYPE \- proxy protocol type
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type);
.SH DESCRIPTION
-Pass a long with this option to set type of the proxy. Available options for
-this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_HTTP_1_0\fP
-\fICURLPROXY_SOCKS4\fP, \fICURLPROXY_SOCKS5\fP, \fICURLPROXY_SOCKS4A\fP and
-\fICURLPROXY_SOCKS5_HOSTNAME\fP. The HTTP type is default.
+Pass one of the values below to set the type of the proxy.
-If you set \fICURLOPT_PROXYTYPE(3)\fP to \fICURLPROXY_HTTP_1_0\fP, it will
-only affect how libcurl speaks to a proxy when CONNECT is used. The HTTP
-version used for "regular" HTTP requests is instead controlled with
-\fICURLOPT_HTTP_VERSION(3)\fP.
+.RS
+.IP CURLPROXY_HTTP
+HTTP Proxy. Default.
+.IP CURLPROXY_HTTPS
+HTTPS Proxy. (Added in 7.52.0 for OpenSSL, GnuTLS and NSS)
+.IP CURLPROXY_HTTP_1_0
+HTTP 1.0 Proxy. This is very similar to CURLPROXY_HTTP except it uses HTTP/1.0
+for any CONNECT tunnelling. It does not change the HTTP version of the actual
+HTTP requests, controlled by \fICURLOPT_HTTP_VERSION(3)\fP.
+.IP CURLPROXY_SOCKS4
+SOCKS4 Proxy.
+.IP CURLPROXY_SOCKS4A
+SOCKS4a Proxy. Proxy resolves URL hostname.
+.IP CURLPROXY_SOCKS5
+SOCKS5 Proxy.
+.IP CURLPROXY_SOCKS5_HOSTNAME
+SOCKS5 Proxy. Proxy resolves URL hostname.
+.RE
Often it is more convenient to specify the proxy type with the scheme part of
the \fICURLOPT_PROXY(3)\fP string.
@@ -45,7 +57,18 @@ CURLPROXY_HTTP
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "local.example.com:1080");
+ /* set the proxy type */
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
index 0d7a241f..62cb9b0b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
.SH SYNOPSIS
@@ -37,12 +38,25 @@ user name to use for the transfer.
authentication with the proxy.
To specify the proxy password use the \fICURLOPT_PROXYPASSWORD(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
+ curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index 1b47b892..a16aa5a9 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
.SH SYNOPSIS
@@ -35,12 +36,24 @@ should encode it as %3A. (This is different to how \fICURLOPT_USERPWD(3)\fP is
used - beware.)
Use \fICURLOPT_PROXYAUTH(3)\fP to specify the authentication method.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
This is NULL by default.
.SH PROTOCOLS
Used with all protocols that can use a proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index dfc025f0..a325f589 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAINFO 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
.SH SYNOPSIS
@@ -48,12 +49,25 @@ 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.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
Built-in system specific
.SH PROTOCOLS
Used with HTTPS proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using a HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CAINFO, "/etc/certs/cabundle.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index 871d8c9b..ebefe86d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAPATH 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "May 30, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
.SH SYNOPSIS
@@ -31,22 +32,41 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAPATH, char *capath);
Pass a char * to a zero terminated string naming a directory holding multiple
CA certificates to verify the HTTPS proxy with. If libcurl is built against
OpenSSL, the certificate directory must be prepared using the openssl c_rehash
-utility. This makes sense only when \fICURLOPT_SSL_VERIFYPEER(3)\fP is enabled
-(which it is by default).
+utility. This makes sense only when \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is
+enabled (which it is by default).
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Everything used over an HTTPS proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using a HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CAPATH, "/etc/cert-dir");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS
backend provides the option only for backward compatibility.
.SH RETURN VALUE
-Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or
-CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+
+CURLE_OUT_OF_MEMORY
.SH "SEE ALSO"
-.BR CURLOPT_CAINFO "(3), "
+.BR CURLOPT_PROXY_CAINFO "(3), "
+.Br CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index f9d44576..90437f0a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CRLFILE 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
.SH SYNOPSIS
@@ -47,12 +48,24 @@ A specific error code (\fICURLE_SSL_CRL_BADFILE\fP) is defined with the
option. It is returned when the SSL exchange fails because the CRL file cannot
be loaded. A failure in certificate verification due to a revocation
information found in the CRL does not trigger this specific error.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Used with HTTPS proxy.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:80");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CRLFILE, "/etc/certs/crl.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index bddecd12..ae17eade 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
.SH SYNOPSIS
@@ -34,12 +35,24 @@ Pass a pointer to a zero terminated string as parameter. It will be used as
the password required to use the \fICURLOPT_PROXY_SSLKEY(3)\fP private key.
You never needed a pass phrase to load a certificate but you need one to load
your private key.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Used with HTTPS proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index db2cd70e..15e23a00 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "24 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
.SH SYNOPSIS
@@ -39,13 +40,25 @@ if it does not exactly match the public key provided to this option, curl will
abort the connection before sending or receiving any data.
On mismatch, \fICURLE_SSL_PINNEDPUBKEYNOTMATCH\fP is returned.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
.nf
-TODO
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_PINNEDPUBLICKEY,
+ "sha256//YhKJKSzoTt2b5FP18fvpHo7fJYqQCjAa3HWY3tvRMwE=;sha256//t62CeU2tQiqkexU74Gxa2eg7fRbEgoChTociMee9wno=");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
.fi
.SH PUBLIC KEY EXTRACTION
If you do not have the https proxy server's public key file you can extract it
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index a010382f..238c6e29 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "17 Jun 2015" "libcurl 7.43.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
.SH SYNOPSIS
@@ -31,12 +32,23 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SERVICE_NAME, char *name);
Pass a char * as parameter to a string holding the \fIname\fP of the
service. The default service name is "HTTP" for HTTP based proxies and "rcmd"
for SOCKS5. This option allows you to change it.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
See above
.SH PROTOCOLS
All network protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SERVICE_NAME, "custom");
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.43.0 for HTTP proxies, 7.49.0 for SOCKS5 proxies.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
index 9d3c029a..834cd10b 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERT 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
.SH SYNOPSIS
@@ -42,12 +43,26 @@ prefix, in order to avoid confusion with a nickname.
When using a client certificate, you most likely also need to provide a
private key with \fICURLOPT_PROXY_SSLKEY(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Used with HTTPS proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 72c7bf49..40188cd9 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
.SH SYNOPSIS
@@ -34,12 +35,27 @@ the format of your client certificate used when connecting to a HTTPS proxy.
Supported formats are "PEM" and "DER", except with Secure Transport. OpenSSL
(versions 0.9.3 and later) and Secure Transport (on iOS 5 or later, or OS X
10.7 or later) also support "P12" for PKCS#12-encoded files.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
"PEM"
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 12c3e685..f75063d3 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEY 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
.SH SYNOPSIS
@@ -36,12 +37,26 @@ default format is "PEM" and can be changed with
(iOS and Mac OS X only) This option is ignored if curl was built against
Secure Transport. Secure Transport expects the private key to be already
present in the keychain or PKCS#12 file containing the certificate.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index c167b6d5..105b384a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
.SH SYNOPSIS
@@ -32,10 +33,25 @@ This option is for connecting to a HTTPS proxy, not a HTTPS server.
Pass a pointer to a zero terminated string as parameter. The string should be
the format of your private key. Supported formats are "PEM", "DER" and "ENG".
+
+The application does not have to keep the string around after setting this
+option.
.SH PROTOCOLS
Used with HTTPS proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEYTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index f96a9e6c..41153e9e 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "December 13, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
.SH SYNOPSIS
@@ -46,6 +47,23 @@ TLSv1.1
TLSv1.2
.IP CURL_SSLVERSION_TLSv1_3
TLSv1.3
+.IP CURL_SSLVERSION_MAX_DEFAULT
+The flag defines maximum supported TLS version as TLSv1.2 or default
+value from SSL library. Only library NSS currently allows to get
+maximum supported TLS version.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_0
+The flag defines maximum supported TLS version as TLSv1.0.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_1
+The flag defines maximum supported TLS version as TLSv1.1.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_2
+The flag defines maximum supported TLS version as TLSv1.2.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_3
+The flag defines maximum supported TLS version as TLSv1.3.
+(Added in 7.54.0)
.RE
.SH DEFAULT
CURL_SSLVERSION_DEFAULT
@@ -58,7 +76,8 @@ if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* ask libcurl to use TLS version 1.0 or later */
- curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, CURL_SSLVERSION_TLSv1);
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, CURL_SSLVERSION_TLSv1_1 |
+ CURL_SSLVERSION_MAX_DEFAULT);
/* Perform the request */
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
index 54b3646d..f4d2a8e6 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
.SH SYNOPSIS
@@ -50,12 +51,24 @@ enabled.
You'll find more details about the NSS cipher lists on this URL:
http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, use internal default
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_CIPHER_LIST, "TLSv1");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index bed10dab..2336e52c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
.SH SYNOPSIS
@@ -53,7 +54,18 @@ All
.SH AVAILABLE
Added in 7.52.0
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ /* weaken TLS only for use with silly proxies */
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST |
+ CURLSSLOPT_NO_REVOKE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
index de4b15b3..b891e3c5 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "December 16, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
index 9473495c..6f0678d3 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 809ffb27..e3039ab2 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
.SH SYNOPSIS
@@ -32,12 +33,26 @@ Pass a char * as parameter, which should point to the zero terminated password
to use for the TLS authentication method specified with the
\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index dbf00b67..8a58acf8 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
.SH SYNOPSIS
@@ -38,12 +39,26 @@ defined in RFC5054 and provides mutual authentication if both sides have a
shared secret. To use TLS-SRP, you must also set the
\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP and
\fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP options.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index 2a2c8669..0ba64b3c 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
.SH SYNOPSIS
@@ -32,12 +33,26 @@ Pass a char * as parameter, which should point to the zero terminated username
to use for the HTTPS proxy TLS authentication method specified with the
\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 2e5c33a4..24d838c2 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
.SH SYNOPSIS
@@ -38,7 +39,17 @@ doing FTP via a proxy. Beware that not all proxies support this feature.
.SH PROTOCOLS
FTP over proxy
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/old-server/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:80");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, 1L);
+ curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.18.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_PUT.3 b/docs/libcurl/opts/CURLOPT_PUT.3
index 87c6e063..44f551ea 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_PUT \- make a HTTP PUT request
.SH SYNOPSIS
@@ -38,8 +39,6 @@ This option is \fBdeprecated\fP since version 7.12.1. Use
0, disabled
.SH PROTOCOLS
HTTP
-.SH EXAMPLE
-TODO
.SH AVAILABILITY
Deprecated since 7.12.1. Do not use.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3
index 4dce76df..58c5fe59 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_QUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
.SH SYNOPSIS
@@ -80,7 +81,23 @@ NULL
.SH PROTOCOLS
SFTP and FTP
.SH EXAMPLE
-TODO
+.nf
+struct curl_slist *h = NULL;
+h = curl_slist_append(h, "RNFR source-name");
+h = curl_slist_append(h, "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);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
SFTP support added in 7.16.3. *-prefix for SFTP added in 7.24.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
index c8223250..9efd8eab 100644
--- a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANDOM_FILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
.SH SYNOPSIS
@@ -28,14 +29,25 @@ CURLOPT_RANDOM_FILE \- specify a source for random data
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);
.SH DESCRIPTION
-Pass a char * to a zero terminated file name. The file will be used to read
+Pass a char * to a zero terminated file name. The file might be used to read
from to seed the random engine for SSL and more.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, not used
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, "junk.txt");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index 375a944c..5d7c0df4 100644
--- a/docs/libcurl/opts/CURLOPT_RANGE.3
+++ b/docs/libcurl/opts/CURLOPT_RANGE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RANGE \- set byte range to request
.SH SYNOPSIS
@@ -44,6 +45,9 @@ RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges should be given in
npt, utc, or smpte formats.
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
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index ef51264c..0ef1e1b9 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "May 01, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index a43e68b9..16dd0c4d 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
index 3a5c3fcd..be209034 100644
--- a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "September 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3
index 71aae83f..94dd9676 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
.SH SYNOPSIS
@@ -32,6 +33,9 @@ Pass a pointer to a zero terminated string as parameter. It will be used to
set the Referer: header in the http request sent to the remote server. This
can be used to fool servers or scripts. You can also set any custom header
with \fICURLOPT_HTTPHEADER(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
new file mode 100644
index 00000000..2137b379
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -0,0 +1,57 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REQUEST_TARGET, string);
+.SH DESCRIPTION
+Pass a char * to string which libcurl uses in the upcoming request instead of
+the path as extracted from the URL.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/*");
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
+
+ /* issue an OPTIONS * request (no leading slash) */
+ curl_easy_setopt(curl, CURLOPT_REQUEST_TARGET, "*");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CUSTOMREQUEST "(3), " CURLOPT_HTTPGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index 21027d4c..80797a18 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "May 17, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index ac6986fd..1201b12f 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
index 4905f390..c44f84bc 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
index 92536b95..4e688e55 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
.SH SYNOPSIS
@@ -36,7 +37,15 @@ connection. The CSEQ will increment from this new number henceforth.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, 1234L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
index 60d1d8b3..6d126cab 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_REQUEST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
.SH SYNOPSIS
@@ -91,8 +92,18 @@ data. It will return after processing one read buffer of data in order to give
the application a chance to run.
.SH DEFAULT
.SH PROTOCOLS
+RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ /* ask for options! */
+ curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_OPTIONS);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
index 70c50550..2a90cd71 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
.SH SYNOPSIS
@@ -36,7 +37,15 @@ unimplemented.
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, 1234L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
index cd318993..4d4ea6d0 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
.SH SYNOPSIS
@@ -34,12 +35,24 @@ set to any non-NULL value, libcurl will return \fICURLE_RTSP_SESSION_ERROR\fP
if ID received from the server does not match. If unset (or set to NULL),
libcurl will automatically set the ID the first time the server sets it in a
response.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char *prev_id; /* saved from before somehow */
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_SESSION_ID, prev_id);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
index 1abb61f6..bc40377b 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
.SH SYNOPSIS
@@ -38,12 +39,25 @@ with RTSP, the \fICURLOPT_RTSP_STREAM_URI(3)\fP indicates what URL to send to
the server in the request header while the \fICURLOPT_URL(3)\fP indicates
where to make the connection to. (e.g. the \fICURLOPT_URL(3)\fP for the above
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
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char *prev_id; /* saved from before somehow */
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI,
+ "rtsp://foo.example.com/twister/video");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
index 367236b6..f114ce7d 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
.SH SYNOPSIS
@@ -34,12 +35,25 @@ Pass a char * to tell libcurl what to pass for the Transport: header for this
RTSP session. This is mainly a convenience method to avoid needing to set a
custom Transport: header for every SETUP request. The application must set a
Transport: header before issuing a SETUP request.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
RTSP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_SETUP);
+ curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT,
+ "RTP/AVP;unicast;client_port=4588-4589");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.20.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index 8fe4ee6c..d70530d1 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_IR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_IR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
.SH SYNOPSIS
@@ -47,7 +48,15 @@ SASL-IR CAPABILITY.
.SH PROTOCOLS
IMAP, POP3 and SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SASL_IR, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.31.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.3 b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
index d4339ec6..8fa2de4d 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
.SH SYNOPSIS
@@ -36,6 +37,20 @@ If you don't set this, NULL is passed to the callback.
.SH PROTOCOLS
HTTP, FTP, SFTP
.SH EXAMPLE
+.nf
+static int seek_cb(void *userp, curl_off_t offset, int origin)
+{
+ struct data *d = (stuct data *)userp;
+ lseek(our_fd, offset, origin);
+ return CURL_SEEKFUNC_OK;
+}
+
+{
+ struct data seek_data;
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_cb);
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, &seek_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.18.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
index 179f0d2b..7b0def99 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
.SH SYNOPSIS
@@ -67,7 +68,20 @@ By default, this is NULL and unused.
.SH PROTOCOLS
HTTP, FTP, SFTP
.SH EXAMPLE
-TODO
+.nf
+static int seek_cb(void *userp, curl_off_t offset, int origin)
+{
+ struct data *d = (stuct data *)userp;
+ lseek(our_fd, offset, origin);
+ return CURL_SEEKFUNC_OK;
+}
+
+{
+ struct data seek_data;
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_cb);
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, &seek_data);
+}
+.fi
.SH AVAILABILITY
Added in 7.18.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
index b9f491b0..76d59fa7 100644
--- a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SERVICE_NAME 3 "17 Jun 2015" "libcurl 7.43.0" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
.SH SYNOPSIS
@@ -32,12 +33,23 @@ Pass a char * as parameter to a string holding the \fIname\fP of the service
for DIGEST-MD5, SPNEGO and Kerberos 5 authentication mechanisms. The default
service names are "ftp", "HTTP", "imap", "pop" and "smtp". This option allows
you to change them.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
See above
.SH PROTOCOLS
HTTP, FTP, IMAP, POP and SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SERVICE_NAME, "custom");
+ ret = curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.43.0 for HTTP, 7.49.0 for FTP, IMAP, POP3 and SMTP.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3
index 6a0c7b81..bd263c3b 100644
--- a/docs/libcurl/opts/CURLOPT_SHARE.3
+++ b/docs/libcurl/opts/CURLOPT_SHARE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SHARE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SHARE \- specify share handle to use
.SH SYNOPSIS
@@ -50,7 +51,29 @@ NULL
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ CURLSH *shobject = curl_share_init();
+ curl_share_setopt(shobject, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
+ curl_easy_setopt(curl, CURLOPT_SHARE, shobject);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+
+ /* the second handle shares cookies from the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/second");
+ curl_easy_setopt(curl2, CURLOPT_COOKIEFILE, "");
+ curl_easy_setopt(curl2, CURLOPT_SHARE, shobject);
+ ret = curl_easy_perform(curl2);
+ curl_easy_cleanup(curl2);
+
+ curl_share_cleanup(shobject);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
index 00dd3166..1d319129 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
.SH SYNOPSIS
@@ -35,7 +36,30 @@ The default value of this parameter is NULL.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ int val = *(int *)clientp;
+ setsockopt(curldfd, SOL_SOCKET, SO_RCVBUF, (const char *)&val, sizeof(val));
+ return CURL_SOCKOPT_OK;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ int recvbuffersize = 256 * 1024;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &recvbuffersize);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index 6262dc59..00eb624e 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
.SH SYNOPSIS
@@ -78,7 +79,43 @@ By default, this callback is NULL and unused.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+.fi
.SH AVAILABILITY
Added in 7.16.0. The \fICURL_SOCKOPT_ALREADY_CONNECTED\fP return code was
added in 7.21.5.
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
new file mode 100644
index 00000000..46db69b1
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_AUTH, long bitmask);
+.SH DESCRIPTION
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+authentication method(s) are allowed for SOCKS5 proxy authentication. The only
+supported flags are \fICURLAUTH_BASIC\fP, which allows username/password
+authentication, \fICURLAUTH_GSSAPI\fP, which allows GSS-API authentication, and
+\fICURLAUTH_NONE\fP, which allows no authentication. Set the actual user name
+and password with the \fICURLOPT_PROXYUSERPWD(3)\fP option.
+.SH DEFAULT
+CURLAUTH_BASIC|CURLAUTH_GSSAPI
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* request to use a SOCKS5 proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://user:pass@myproxy.com");
+
+ /* enable username/password authentication only */
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, CURLAUTH_BASIC);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_NOT_BUILT_IN if the bitmask contains unsupported flags.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3)"
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
index ad0863b7..4a55f349 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
.SH SYNOPSIS
@@ -38,7 +39,16 @@ negotiation.
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://proxy");
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
index 440f0894..3c7fdd33 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
.SH SYNOPSIS
@@ -33,12 +34,24 @@ Deprecated since 7.49.0. Use \fICURLOPT_PROXY_SERVICE_NAME(3)\fP instead.
Pass a char * as parameter to a string holding the \fIname\fP of the service.
The default service name for a SOCKS5 server is "rcmd". This option allows you
to change it.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
See above
.SH PROTOCOLS
All network protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://proxy");
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, "rcmd-special");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.4, deprecated in 7.49.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
index 2ecca125..868331b7 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
.SH SYNOPSIS
@@ -41,7 +42,16 @@ None
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES,
+ CURLSSH_AUTH_PUBLICKEY | CURLSSH_AUTH_KEYBOARD);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
CURLSSH_AUTH_HOST was added in 7.16.1, CURLSSH_AUTH_AGENT was added in 7.28.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index 2ea23602..b4999f6f 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
.SH SYNOPSIS
@@ -33,12 +34,24 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
Pass a char * pointing to a string containing 32 hexadecimal digits. The
string should be the 128 bit MD5 checksum of the remote host's public key, and
libcurl will reject the connection to the host unless the md5sums match.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
SCP and SFTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+ "afe17cd62a0f3b61f1ab9cb22ba269a7");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.17.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
index 67c36738..a5261e70 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYDATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
.SH SYNOPSIS
@@ -35,7 +36,26 @@ NULL
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+static int keycb(CURL *easy,
+ const struct curl_khkey *knownkey,
+ const struct curl_khkey *foundkey,
+ enum curl_khmatch,
+ void *clientp)
+{
+ /* 'clientp' points to the callback_data struct */
+ /* investigate the situation and return the correct value */
+ return CURLKHSTAT_FINE_ADD_TO_FILE;
+}
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/thisfile.txt");
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION, keycb);
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, &callback_data);
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/home/user/known_hosts");
+
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.6
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
index 21bc0e58..5b2f0726 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
.SH SYNOPSIS
@@ -96,7 +97,26 @@ NULL
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+static int keycb(CURL *easy,
+ const struct curl_khkey *knownkey,
+ const struct curl_khkey *foundkey,
+ enum curl_khmatch,
+ void *clientp)
+{
+ /* 'clientp' points to the callback_data struct */
+ /* investigate the situation and return the correct value */
+ return CURLKHSTAT_FINE_ADD_TO_FILE;
+}
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/thisfile.txt");
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION, keycb);
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, &callback_data);
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/home/user/known_hosts");
+
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.6
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 9ea0c864..07db0155 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
.SH SYNOPSIS
@@ -34,12 +35,24 @@ format as supported by libssh2. If this file is specified, libcurl will only
accept connections with hosts that are known and present in that file, with a
matching public key. Use \fICURLOPT_SSH_KEYFUNCTION(3)\fP to alter the default
behavior on host and key (mis)matching.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS,
+ "/home/clarkkent/.ssh/known_hosts");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.6
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index 0c35ed55..5142785b 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2014, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
.SH SYNOPSIS
@@ -36,12 +37,25 @@ is set, and just "id_dsa" in the current directory if HOME is not set.
If the file is password-protected, set the password with
\fICURLOPT_KEYPASSWD(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
As explained above
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE,
+ "/home/clarkkent/.ssh/id_rsa");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "password");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
index f9aaeaef..f5442958 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
.SH SYNOPSIS
@@ -38,12 +39,24 @@ set.
If NULL (or an empty string) is passed, libcurl will pass no public key to
libssh2, which then tries to compute it from the private key. This is known
to work with libssh2 1.4.0+ linked against OpenSSL.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
SFTP and SCP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE,
+ "/home/clarkkent/.ssh/id_rsa.pub");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
The "" trick was added in 7.26.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3
index b5d68cf7..3477d671 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
.SH SYNOPSIS
@@ -40,12 +41,25 @@ prefix, in order to avoid confusion with a nickname.
When using a client certificate, you most likely also need to provide a
private key with \fICURLOPT_SSLKEY(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index 98df39d7..02c45e6c 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2015, 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERTTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
.SH SYNOPSIS
@@ -33,12 +34,26 @@ the format of your certificate. Supported formats are "PEM" and "DER", except
with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport
(on iOS 5 or later, or OS X 10.7 or later) also support "P12" for
PKCS#12-encoded files.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
"PEM"
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled. Added in 7.9.3
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index d0c48a4b..f3958737 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
.SH SYNOPSIS
@@ -30,12 +31,23 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);
.SH DESCRIPTION
Pass a pointer to a zero terminated string as parameter. It will be used as
the identifier for the crypto engine you want to use for your private key.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE, "dynamic");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Only if the SSL backend is OpenSSL built with engine support.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index 0cd8d225..c24c394e 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
.SH SYNOPSIS
@@ -37,7 +38,16 @@ None
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE, "dynamic");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Only if the SSL backend is OpenSSL built with engine support.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_SSLKEY.3
index 8bc82058..6c703a0e 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
.SH SYNOPSIS
@@ -35,12 +36,25 @@ changed with \fICURLOPT_SSLKEYTYPE(3)\fP.
(iOS and Mac OS X only) This option is ignored if curl was built against
Secure Transport. Secure Transport expects the private key to be already
present in the keychain or PKCS#12 file containing the certificate.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index 7616a3f4..f242675c 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
.SH SYNOPSIS
@@ -35,12 +36,26 @@ The format "ENG" enables you to load the private key from a crypto engine. In
this case \fICURLOPT_SSLKEY(3)\fP is used as an identifier passed to the
engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE(3)\fP.
\&"DER" format key file currently does not work because of a bug in OpenSSL.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
"PEM"
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index 77dfcd49..61e1f611 100644
--- a/docs/libcurl/opts/CURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLVERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "May 25, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
.SH SYNOPSIS
@@ -50,6 +51,23 @@ TLSv1.1 (Added in 7.34.0)
TLSv1.2 (Added in 7.34.0)
.IP CURL_SSLVERSION_TLSv1_3
TLSv1.3 (Added in 7.52.0)
+.IP CURL_SSLVERSION_MAX_DEFAULT
+The flag defines maximum supported TLS version as TLSv1.2 or default
+value from SSL library. Only library NSS currently allows to get
+maximum supported TLS version.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_0
+The flag defines maximum supported TLS version as TLSv1.0.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_1
+The flag defines maximum supported TLS version as TLSv1.1.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_2
+The flag defines maximum supported TLS version as TLSv1.2.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_3
+The flag defines maximum supported TLS version as TLSv1.3.
+(Added in 7.54.0)
.RE
.SH DEFAULT
CURL_SSLVERSION_DEFAULT
@@ -61,8 +79,9 @@ CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
- /* ask libcurl to use TLS version 1.0 or later */
- curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
+ /* ask libcurl to use TLS version 1.1 or later */
+ curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1 |
+ CURL_SSLVERSION_MAX_DEFAULT);
/* Perform the request */
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
index 71833b55..05de70f2 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
.SH SYNOPSIS
@@ -40,22 +41,32 @@ compile OpenSSL.
You'll find more details about cipher lists on this URL:
- https://www.openssl.org/docs/apps/ciphers.html
+ https://curl.haxx.se/docs/ssl-ciphers.html
For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5',
\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses
this option then all known ciphers are disabled and only those passed in are
enabled.
-You'll find more details about the NSS cipher lists on this URL:
+For WolfSSL, valid examples of cipher lists include
+\'ECDHE-RSA-RC4-SHA\', 'AES256-SHA:AES256-SHA256', etc.
- http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, use internal default
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, "TLSv1");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
If built TLS enabled.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index be2cf348..b2f31412 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
.SH SYNOPSIS
@@ -36,11 +37,89 @@ NULL
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+/* OpenSSL specific */
+
+#include <openssl/ssl.h>
+#include <curl/curl.h>
+#include <stdio.h>
+
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+ X509_STORE *store;
+ X509 *cert=NULL;
+ BIO *bio;
+ char *mypem = (char *)parm;
+ /* get a BIO */
+ bio=BIO_new_mem_buf(mypem, -1);
+ /* use it to read the PEM formatted certificate from memory into an
+ * X509 structure that SSL can use
+ */
+ PEM_read_bio_X509(bio, &cert, 0, NULL);
+ if(cert == NULL)
+ printf("PEM_read_bio_X509 failed...\\n");
+
+ /* get a pointer to the X509 certificate store (which may be empty) */
+ store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+
+ /* add our certificate to this store */
+ if(X509_STORE_add_cert(store, cert)==0)
+ printf("error adding certificate\\n");
+
+ /* decrease reference counts */
+ X509_free(cert);
+ BIO_free(bio);
+
+ /* all set to go */
+ return CURLE_OK;
+}
+
+int main(void)
+{
+ CURL * ch;
+ CURLcode rv;
+ char *mypem = /* example CA cert PEM - shortened */
+ "-----BEGIN CERTIFICATE-----\\n"
+ "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\\n"
+ "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\\n"
+ "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\\n"
+ "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\\n"
+ "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\\n"
+ "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\\n"
+ "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\\n"
+ "-----END CERTIFICATE-----\\n";
+
+ rv=curl_global_init(CURL_GLOBAL_ALL);
+ ch=curl_easy_init();
+ 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/");
+
+ /* 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);
+ rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_DATA, mypem);
+ rv=curl_easy_perform(ch);
+ if(rv==CURLE_OK)
+ printf("*** transfer succeeded ***\\n");
+ else
+ printf("*** transfer failed ***\\n");
+
+ curl_easy_cleanup(ch);
+ curl_global_cleanup();
+ return rv;
+}
+.fi
.SH AVAILABILITY
Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Other SSL
backends not supported.
.SH RETURN VALUE
-Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
.SH "SEE ALSO"
.BR CURLOPT_SSL_CTX_FUNCTION "(3), " CURLOPT_SSLVERSION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
index 177947bb..da92f1d2 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,9 +20,10 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "March 26, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
-CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL or wolfSSL/CyaSSL
+CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL/CyaSSL or mbedTLS
.SH SYNOPSIS
.nf
#include <curl/curl.h>
@@ -32,8 +33,9 @@ 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 or wolfSSL/CyaSSL. If
-libcurl was built against another SSL library this functionality is absent.
+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.
Pass a pointer to your callback function, which should match the prototype
shown above.
@@ -42,13 +44,15 @@ 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 behaviour of the SSL
initialization. The \fIssl_ctx\fP parameter is actually a pointer to the SSL
-library's \fISSL_CTX\fP. 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
+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.
This function will get called on all new connections made to a server, during
-the SSL negotiation. The SSL_CTX pointer will be a new one every time.
+the SSL negotiation. The \fIssl_ctx\fP will point to a newly initialized object
+each time, but note the pointer may be the same as from a prior call.
To use this properly, a non-trivial amount of knowledge of your SSL library is
necessary. For example, you can use this function to call library-specific
@@ -72,30 +76,30 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
X509 *cert=NULL;
BIO *bio;
char *mypem = /* example CA cert PEM - shortened */
- "-----BEGIN CERTIFICATE-----\n"
- "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"
- "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"
- "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"
- "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"
- "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"
- "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"
- "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
- "-----END CERTIFICATE-----\n";
+ "-----BEGIN CERTIFICATE-----\\n"
+ "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\\n"
+ "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\\n"
+ "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\\n"
+ "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\\n"
+ "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\\n"
+ "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\\n"
+ "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\\n"
+ "-----END CERTIFICATE-----\\n";
/* get a BIO */
bio=BIO_new_mem_buf(mypem, -1);
- /* use it to read the PEM formatted certificate from memory into an X509
- * structure that SSL can use
+ /* use it to read the PEM formatted certificate from memory into an
+ * X509 structure that SSL can use
*/
PEM_read_bio_X509(bio, &cert, 0, NULL);
if(cert == NULL)
- printf("PEM_read_bio_X509 failed...\n");
+ printf("PEM_read_bio_X509 failed...\\n");
- /* get a pointer to the X509 certificate store (which may be empty!) */
+ /* get a pointer to the X509 certificate store (which may be empty) */
store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
/* add our certificate to this store */
if(X509_STORE_add_cert(store, cert)==0)
- printf("error adding certificate\n");
+ printf("error adding certificate\\n");
/* decrease reference counts */
X509_free(cert);
@@ -117,15 +121,15 @@ int main(void)
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
/* Retrieve page using cacerts' certificate -> will succeed
- * load the certificate by installing a function doing the nescessary
+ * 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);
rv=curl_easy_perform(ch);
if(rv==CURLE_OK)
- printf("*** transfer succeeded ***\n");
+ printf("*** transfer succeeded ***\\n");
else
- printf("*** transfer failed ***\n");
+ printf("*** transfer failed ***\\n");
curl_easy_cleanup(ch);
curl_global_cleanup();
@@ -133,9 +137,13 @@ 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. Added in 7.42.0 for wolfSSL/CyaSSL. Added in
+7.54.0 for mbedTLS. Other SSL backends not supported.
.SH RETURN VALUE
-Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
.SH "SEE ALSO"
.BR CURLOPT_SSL_CTX_DATA "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index 61863c8c..f3db2c8b 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
.SH SYNOPSIS
@@ -36,7 +37,15 @@ is built to use supports it), which can be used to negotiate http2.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.36.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
index 67f0ebec..cc062be1 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
.SH SYNOPSIS
@@ -36,7 +37,15 @@ is built to use supports it), which can be used to negotiate http2.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.36.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
index 3073dadb..c0f92795 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_FALSESTART 3 "14 Feb 2015" "libcurl 7.41.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
.SH SYNOPSIS
@@ -28,7 +29,7 @@ CURLOPT_SSL_FALSESTART \- enable TLS false start
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_FALSESTART, long enable);
.SH DESCRIPTION
-Pass a long as parameter set to 1 to enable or 0 to disable.
+Pass a long as parameter set to 1L to enable or 0 to disable.
This option determines whether libcurl should use false start during the TLS
handshake. False start is a mode where a TLS client will start sending
@@ -39,7 +40,14 @@ round trip when performing a full handshake.
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, 1L);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.42.0. This option is currently only supported by the NSS and
Secure Transport (on iOS 7.0 or later, or OS X 10.9 or later) TLS backends.
diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
index 4943233d..5c7b0775 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
.SH SYNOPSIS
@@ -47,14 +48,22 @@ 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
-
-
.SH DEFAULT
0
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* weaken TLS only for use with silly servers */
+ curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST |
+ CURLSSLOPT_NO_REVOKE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.25.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
index c939465f..9a7e550b 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
.SH SYNOPSIS
@@ -40,7 +41,16 @@ wild that may require you to disable this in order for you to succeed.
.SH PROTOCOLS
All TLS-based
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* switch off session-id use! */
+ curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.16.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
index 15914732..186a4a11 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
.SH SYNOPSIS
@@ -58,9 +59,16 @@ The default value for this option is 2.
This option controls checking the server's certificate's claimed identity.
The server could be lying. To control lying, see
-\fICURLOPT_SSL_VERIFYPEER(3)\fP. If libcurl is built against NSS and
-\fICURLOPT_SSL_VERIFYPEER(3)\fP is zero, \fICURLOPT_SSL_VERIFYHOST(3)\fP is
-also set to zero and cannot be overridden.
+\fICURLOPT_SSL_VERIFYPEER(3)\fP.
+.SH LIMITATIONS
+DarwinSSL: If \fIverify\fP value is 0, then SNI is also disabled. SNI is a TLS
+extension that sends the hostname to the server. The server may use that
+information to do such things as sending back a specific certificate for the
+hostname, or forwarding the request to a specific origin server. Some hostnames
+may be inaccessible if SNI is not sent.
+
+NSS: If \fICURLOPT_SSL_VERIFYPEER(3)\fP is zero,
+\fICURLOPT_SSL_VERIFYHOST(3)\fP is also set to zero and cannot be overridden.
.SH DEFAULT
2
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index 5a63481a..7bb04834 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "February 09, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
.SH SYNOPSIS
@@ -79,3 +80,5 @@ If built TLS enabled.
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
index 30212259..fa6fdc3c 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "04 Dec 2014" "libcurl 7.40.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
.SH SYNOPSIS
@@ -40,7 +41,16 @@ extension, the verification will fail.
.SH PROTOCOLS
All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* ask for OSCP stapling! */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.41.0. This option is currently only supported by the OpenSSL, GnuTLS
and NSS TLS backends.
diff --git a/docs/libcurl/opts/CURLOPT_STDERR.3 b/docs/libcurl/opts/CURLOPT_STDERR.3
index 7dfe371f..cad25e27 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STDERR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 831d2111..2376ba3e 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS 3 "13 Sep 2015" "libcurl 7.46.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
.SH SYNOPSIS
@@ -30,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS, CURL *dephandle)
.SH DESCRIPTION
Pass a CURL * pointer in \fIdephandle\fP to identify the stream within the
same connection that this stream is depending upon. This option clears the
-exclusive it and is mutually exclusive to the
+exclusive bit and is mutually exclusive to the
\fICURLOPT_STREAM_DEPENDS_E(3)\fP option.
The spec says "Including a dependency expresses a preference to allocate
@@ -47,7 +48,19 @@ NULL
.SH PROTOCOLS
HTTP/2
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+
+ /* the second depends on the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_DEPENDS, curl);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
.SH AVAILABILITY
Added in 7.46.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
index c1d9fd06..4649befb 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "13 Sep 2015" "libcurl 7.46.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on execlusively
.SH SYNOPSIS
@@ -50,7 +51,19 @@ NULL
.SH PROTOCOLS
HTTP/2
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+
+ /* the second depends on the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_DEPENDS_E, curl);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
.SH AVAILABILITY
Added in 7.46.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
index a2b2472a..fb4f8481 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_WEIGHT 3 "13 Sep 2015" "libcurl 7.46.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
.SH SYNOPSIS
@@ -53,7 +54,20 @@ is 16.
.SH PROTOCOLS
HTTP/2
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+ curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, 10L);
+
+ /* the second has twice the weight */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_WEIGHT, 20L);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
.SH AVAILABILITY
Added in 7.46.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3 b/docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3
new file mode 100644
index 00000000..6242c7bf
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_STRIP_PATH_SLASH.3
@@ -0,0 +1,57 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_STRIP_PATH_SLASH 3 "June 19, 2017" "libcurl 1.2.3" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_STRIP_PATH_SLASH \- strip the leading slash from the path
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STRIP_PATH_SLASH, value);
+.SH DESCRIPTION
+Pass a long set to 1 to tell libcurl to strip out the leading slash from the
+path when used on the server.
+.SH DEFAULT
+0 - use the leading slash.
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/*");
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
+
+ /* issue an OPTIONS * request (no leading slash) */
+ curl_easy_setopt(curl, CURLOPT_STRIP_PATH_SLASH, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CUSTOMREQUEST "(3), " CURLOPT_HTTPGET "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
new file mode 100644
index 00000000..50f3cf4d
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@ -0,0 +1,96 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 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.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SUPPRESS_CONNECT_HEADERS, long onoff);
+.fi
+.SH DESCRIPTION
+When \fICURLOPT_HTTPPROXYTUNNEL(3)\fP is used and a CONNECT request is made,
+suppress proxy CONNECT response headers from the user callback functions
+\fICURLOPT_HEADERFUNCTION(3)\fP and \fICURLOPT_WRITEFUNCTION(3)\fP.
+
+Proxy CONNECT response headers can complicate header processing since it's
+essentially a separate set of headers. You can enable this option to suppress
+those headers.
+
+For example let's assume an HTTPS URL is to be retrieved via CONNECT. On
+success there would normally be two sets of headers, and each header line sent
+to the header function and/or the write function. The data given to the
+callbacks would look like this:
+
+.nf
+HTTP/1.1 200 Connection established
+{headers}...
+
+HTTP/1.1 200 OK
+Content-Type: application/json
+{headers}...
+
+{body}...
+.fi
+
+However by enabling this option the CONNECT response headers are suppressed, so
+the data given to the callbacks would look like this:
+
+.nf
+HTTP/1.1 200 OK
+Content-Type: application/json
+{headers}...
+
+{body}...
+.fi
+
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://foo:3128");
+ curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
+ curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, 1L);
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.54.0
+.SH RETURN VALUE
+CURLE_OK or an error such as CURLE_UNKNOWN_OPTION.
+.SH "SEE ALSO"
+.BR CURLOPT_HEADER "(3), " CURLOPT_PROXY "(3), "
+.BR CURLOPT_HTTPPROXYTUNNEL "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
index f8f93438..a494694b 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_FASTOPEN 3 "16 Feb 2016" "libcurl 7.49.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
.SH SYNOPSIS
@@ -28,7 +29,7 @@ CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_FASTOPEN, long enable);
.SH DESCRIPTION
-Pass a long as parameter set to 1 to enable or 0 to disable.
+Pass a long as parameter set to 1L to enable or 0 to disable.
TCP Fast Open (RFC7413) is a mechanism that allows data to be carried in the
SYN and SYN-ACK packets and consumed by the receiving end during the initial
@@ -38,7 +39,14 @@ connection handshake, saving up to one full round-trip time (RTT).
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.49.0. This option is currently only supported on Linux and OS X
El Capitan.
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index cc3642fe..87b6b73d 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index f5f57628..dec87931 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
.SH SYNOPSIS
@@ -32,7 +33,7 @@ Pass a long. Sets the \fIdelay\fP, in seconds, that the operating system will
wait while the connection is idle before sending keepalive probes. Not all
operating systems support this option.
.SH DEFAULT
-?
+60
.SH PROTOCOLS
All
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index f332a8f4..2da4a8b4 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
.SH SYNOPSIS
@@ -32,7 +33,9 @@ Pass a long. Sets the interval, in seconds, that the operating system will
wait between sending keepalive probes. Not all operating systems support this
option. (Added in 7.25.0)
.SH DEFAULT
+60
.SH PROTOCOLS
+All
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
@@ -42,7 +45,7 @@ if(curl) {
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
- /* keep-alive idle time to 120 seconds */
+ /* set keep-alive idle time to 120 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* interval time between keep-alive probes: 60 seconds */
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index bd19fbaf..41b2ea1d 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_NODELAY 3 "30 Jun 2016" "libcurl 7.50.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
.SH SYNOPSIS
@@ -29,13 +30,13 @@ CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay);
.SH DESCRIPTION
Pass a long specifying whether the TCP_NODELAY option is to be set or cleared
-(1 = set, 0 = clear). The option is set by default. This will have no effect
+(1L = set, 0 = clear). The option is set by default. This will have no effect
after the connection has been established.
-Setting this option will disable TCP's Nagle algorithm. The purpose of this
-algorithm is to try to minimize the number of small packets on the network
-(where "small packets" means TCP segments less than the Maximum Segment Size
-(MSS) for the network).
+Setting this option to 1L will disable TCP's Nagle algorithm on this
+connection. The purpose of this algorithm is to try to minimize the number of
+small packets on the network (where "small packets" means TCP segments less
+than the Maximum Segment Size (MSS) for the network).
Maximizing the amount of data sent per TCP segment is good because it
amortizes the overhead of the send. However, in some cases small segments may
@@ -47,7 +48,15 @@ overdone.
.SH PROTOCOLS
All
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ /* disable Nagle */
+ curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 0);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Always. The default was changed to 1 from 0 in 7.50.2.
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index 7a181ede..0860e349 100644
--- a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TELNETOPTIONS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
.SH SYNOPSIS
@@ -38,7 +39,19 @@ NULL
.SH PROTOCOLS
TELNET
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *options;
+ options = curl_slist_append(NULL, "TTTYPE=vt100");
+ options = curl_slist_append(options, "USER=foobar");
+ curl_easy_setopt(curl, CURLOPT_URL, "telnet://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TELNETOPTIONS, options);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ curl_slist_free_all(options);
+}
+.fi
.SH AVAILABILITY
Along with TELNET
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
index 6aafbd14..f4f1ccc0 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
.SH SYNOPSIS
@@ -39,7 +40,16 @@ will be used.
.SH PROTOCOLS
TFTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "tftp://example.com/bootimage");
+ /* try using larger blocks */
+ curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, 2048L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index 97940fbb..00f20d3d 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "23 Feb 2016" "libcurl 7.48.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3 b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
index a8fcea7b..0984788c 100644
--- a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMECONDITION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 45e69b4d..d31ff272 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index 2a7afb10..eb90d8ff 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index cd745ffa..fd306ab7 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "April 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 78fad0ef..198d3c07 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
.SH SYNOPSIS
@@ -32,12 +33,25 @@ Pass a char * as parameter, which should point to the zero terminated password
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_TLSAUTH_USERNAME(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
index 5655e7d7..bc38751b 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
.SH SYNOPSIS
@@ -37,12 +38,25 @@ defined in RFC5054 and provides mutual authentication if both sides have a
shared secret. To use TLS-SRP, you must also set the
\fICURLOPT_TLSAUTH_USERNAME(3)\fP and \fICURLOPT_TLSAUTH_PASSWORD(3)\fP
options.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this
to work. Added in 7.21.4
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
index 5022e4e0..88b47277 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
.SH SYNOPSIS
@@ -32,12 +33,25 @@ Pass a char * as parameter, which should point to the zero terminated username
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_TLSAUTH_PASSWORD(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
All TLS-based protocols
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.4
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index aa1759c2..3664d4e4 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFERTEXT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
.SH SYNOPSIS
@@ -42,7 +43,15 @@ simply sets the mode to ASCII and performs a standard transfer.
.SH PROTOCOLS
FTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/textfile");
+ curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Along with FTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
index 242da13f..53180ce5 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
.SH SYNOPSIS
@@ -28,7 +29,7 @@ CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long enable);
.SH DESCRIPTION
-Pass a long set to 1 to \fIenable\fP or 0 to disable.
+Pass a long set to 1L to \fIenable\fP or 0 to disable.
Adds a request for compressed Transfer Encoding in the outgoing HTTP
request. If the server supports this and so desires, it can respond with the
@@ -45,7 +46,14 @@ by both HTTP clients and HTTP servers.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.21.6
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index ed2b91b5..fbc2d716 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "09 Oct 2014" "libcurl 7.40.0" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
.SH SYNOPSIS
@@ -46,6 +47,9 @@ are not supported. Proxy options such as
.BR CURLOPT_PROXY "(3)
have no effect either as these are TCP-oriented, and asking a proxy server to
connect to a certain Unix domain socket is not possible.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
Default is NULL, meaning that no Unix domain sockets are used.
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
index 9e4cf269..037a2415 100644
--- a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
.SH SYNOPSIS
@@ -30,16 +31,28 @@ CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNRESTRICTED_AUTH,
long goahead);
.SH DESCRIPTION
-A long parameter set to 1 tells libcurl it can continue to send authentication
-(user+password) credentials when following locations, even when hostname
-changed. This option is meaningful only when setting
+Set the long \fIgohead\fP parameter to 1L to make libcurl continue to send
+authentication (user+password) credentials when following locations, even when
+hostname changed. This option is meaningful only when setting
\fICURLOPT_FOLLOWLOCATION(3)\fP.
+
+By default, libcurl will only send given credentials to the initial host name
+as given in the original URL, to avoid leaking username + password to other
+sites.
.SH DEFAULT
0
.SH PROTOCOLS
HTTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L);
+ curl_easy_perform(curl);
+}
+.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index 0ad201a1..8e041dd9 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_UPLOAD \- enable data upload
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3
index a7d81df2..296fc680 100644
--- a/docs/libcurl/opts/CURLOPT_URL.3
+++ b/docs/libcurl/opts/CURLOPT_URL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_URL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_URL \- provide the URL to use in the request
.SH SYNOPSIS
@@ -283,6 +284,9 @@ user wants to pass in a '#' (hash) character it will be treated as a fragment
and get cut off by libcurl if provided literally. You will instead have to
escape it by providing it as backslash and its ASCII value in hexadecimal:
"\\23".
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
There is no default URL. If this option isn't set, no transfer can be
performed.
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index c769e955..1a3612a2 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERAGENT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
.SH SYNOPSIS
@@ -32,6 +33,9 @@ Pass a pointer to a zero terminated string as parameter. It will be used to
set the User-Agent: header in the HTTP request sent to the remote server. This
can be used to fool servers or scripts. You can also set any custom header
with \fICURLOPT_HTTPHEADER(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL, no User-Agent: header is used by default.
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index ec600107..f776c6fc 100644
--- a/docs/libcurl/opts/CURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_USERNAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
.SH SYNOPSIS
@@ -55,12 +56,26 @@ authentication as well.
To specify the password and login options, along with the user name, use the
\fICURLOPT_PASSWORD(3)\fP and \fICURLOPT_LOGIN_OPTIONS(3)\fP options.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
blank
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_USERNAME, "clark");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.19.1
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 19404f6b..dc51cd29 100644
--- a/docs/libcurl/opts/CURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_USERPWD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "May 05, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
.SH SYNOPSIS
@@ -61,12 +62,26 @@ SMTP options.
The user and password strings are not URL decoded, so there's no way to send
in a user name containing a colon using this option. Use
\fICURLOPT_USERNAME(3)\fP for that, or include it in the URL.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
Most
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_USERPWD, "clark:kent");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Always
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index 37a224d4..3bd876c7 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USE_SSL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3
index e6a6fd19..99324afb 100644
--- a/docs/libcurl/opts/CURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_VERBOSE 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
index 1ca1bedd..6aaeacd5 100644
--- a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WILDCARDMATCH 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
index fdb58863..a0ba5bae 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
index 2c77a4c1..eeb27552 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index fc1de8c9..d4b9a586 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFODATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
index 9bd89db7..fad34963 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
.SH SYNOPSIS
diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
index b6c1feef..3b294434 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "May 31, 2017" "libcurl 7.55.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
.SH SYNOPSIS
@@ -34,12 +35,23 @@ the OAuth 2.0 Authorization Framework.
Note: The user name used to generate the Bearer Token should be supplied via
the \fICURLOPT_USERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
.SH DEFAULT
NULL
.SH PROTOCOLS
IMAP, POP3 and SMTP
.SH EXAMPLE
-TODO
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "pop3://example.com/");
+ curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "1ab9cb22ba269a7");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.33.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/Makefile.am b/docs/libcurl/opts/Makefile.am
index eb7ca1bb..3765ea7b 100644
--- a/docs/libcurl/opts/Makefile.am
+++ b/docs/libcurl/opts/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -22,939 +22,17 @@
AUTOMAKE_OPTIONS = foreign no-dependencies
-man_MANS = \
- CURLINFO_ACTIVESOCKET.3 \
- CURLINFO_APPCONNECT_TIME.3 \
- CURLINFO_CERTINFO.3 \
- CURLINFO_CONDITION_UNMET.3 \
- CURLINFO_CONNECT_TIME.3 \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 \
- CURLINFO_CONTENT_LENGTH_UPLOAD.3 \
- CURLINFO_CONTENT_TYPE.3 \
- CURLINFO_COOKIELIST.3 \
- CURLINFO_EFFECTIVE_URL.3 \
- CURLINFO_FILETIME.3 \
- CURLINFO_FTP_ENTRY_PATH.3 \
- CURLINFO_HEADER_SIZE.3 \
- CURLINFO_HTTPAUTH_AVAIL.3 \
- CURLINFO_HTTP_CONNECTCODE.3 \
- CURLINFO_HTTP_VERSION.3 \
- CURLINFO_LASTSOCKET.3 \
- CURLINFO_LOCAL_IP.3 \
- CURLINFO_LOCAL_PORT.3 \
- CURLINFO_NAMELOOKUP_TIME.3 \
- CURLINFO_NUM_CONNECTS.3 \
- CURLINFO_OS_ERRNO.3 \
- CURLINFO_PRETRANSFER_TIME.3 \
- CURLINFO_PRIMARY_IP.3 \
- CURLINFO_PRIMARY_PORT.3 \
- CURLINFO_PRIVATE.3 \
- CURLINFO_PROTOCOL.3 \
- CURLINFO_PROXYAUTH_AVAIL.3 \
- CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
- CURLINFO_REDIRECT_COUNT.3 \
- CURLINFO_REDIRECT_TIME.3 \
- CURLINFO_REDIRECT_URL.3 \
- CURLINFO_REQUEST_SIZE.3 \
- CURLINFO_RESPONSE_CODE.3 \
- CURLINFO_RTSP_CLIENT_CSEQ.3 \
- CURLINFO_RTSP_CSEQ_RECV.3 \
- CURLINFO_RTSP_SERVER_CSEQ.3 \
- CURLINFO_RTSP_SESSION_ID.3 \
- CURLINFO_SCHEME.3 \
- CURLINFO_SIZE_DOWNLOAD.3 \
- CURLINFO_SIZE_UPLOAD.3 \
- CURLINFO_SPEED_DOWNLOAD.3 \
- CURLINFO_SPEED_UPLOAD.3 \
- CURLINFO_SSL_ENGINES.3 \
- CURLINFO_SSL_VERIFYRESULT.3 \
- CURLINFO_STARTTRANSFER_TIME.3 \
- CURLINFO_TLS_SESSION.3 \
- CURLINFO_TLS_SSL_PTR.3 \
- CURLINFO_TOTAL_TIME.3 \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
- CURLMOPT_MAXCONNECTS.3 \
- CURLMOPT_MAX_HOST_CONNECTIONS.3 \
- CURLMOPT_MAX_PIPELINE_LENGTH.3 \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \
- CURLMOPT_PIPELINING.3 \
- CURLMOPT_PIPELINING_SERVER_BL.3 \
- CURLMOPT_PIPELINING_SITE_BL.3 \
- CURLMOPT_PUSHDATA.3 \
- CURLMOPT_PUSHFUNCTION.3 \
- CURLMOPT_SOCKETDATA.3 \
- CURLMOPT_SOCKETFUNCTION.3 \
- CURLMOPT_TIMERDATA.3 \
- CURLMOPT_TIMERFUNCTION.3 \
- CURLOPT_ACCEPTTIMEOUT_MS.3 \
- CURLOPT_ACCEPT_ENCODING.3 \
- CURLOPT_ADDRESS_SCOPE.3 \
- CURLOPT_APPEND.3 \
- CURLOPT_AUTOREFERER.3 \
- CURLOPT_BUFFERSIZE.3 \
- CURLOPT_CAINFO.3 \
- CURLOPT_CAPATH.3 \
- CURLOPT_CERTINFO.3 \
- CURLOPT_CHUNK_BGN_FUNCTION.3 \
- CURLOPT_CHUNK_DATA.3 \
- CURLOPT_CHUNK_END_FUNCTION.3 \
- CURLOPT_CLOSESOCKETDATA.3 \
- CURLOPT_CLOSESOCKETFUNCTION.3 \
- CURLOPT_CONNECTTIMEOUT.3 \
- CURLOPT_CONNECTTIMEOUT_MS.3 \
- CURLOPT_CONNECT_ONLY.3 \
- CURLOPT_CONNECT_TO.3 \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.3 \
- CURLOPT_COOKIE.3 \
- CURLOPT_COOKIEFILE.3 \
- CURLOPT_COOKIEJAR.3 \
- CURLOPT_COOKIELIST.3 \
- CURLOPT_COOKIESESSION.3 \
- CURLOPT_COPYPOSTFIELDS.3 \
- CURLOPT_CRLF.3 \
- CURLOPT_CRLFILE.3 \
- CURLOPT_CUSTOMREQUEST.3 \
- CURLOPT_DEBUGDATA.3 \
- CURLOPT_DEBUGFUNCTION.3 \
- CURLOPT_DEFAULT_PROTOCOL.3 \
- CURLOPT_DIRLISTONLY.3 \
- CURLOPT_DNS_CACHE_TIMEOUT.3 \
- CURLOPT_DNS_INTERFACE.3 \
- CURLOPT_DNS_LOCAL_IP4.3 \
- CURLOPT_DNS_LOCAL_IP6.3 \
- CURLOPT_DNS_SERVERS.3 \
- CURLOPT_DNS_USE_GLOBAL_CACHE.3 \
- CURLOPT_EGDSOCKET.3 \
- CURLOPT_ERRORBUFFER.3 \
- CURLOPT_EXPECT_100_TIMEOUT_MS.3 \
- CURLOPT_FAILONERROR.3 \
- CURLOPT_FILETIME.3 \
- CURLOPT_FNMATCH_DATA.3 \
- CURLOPT_FNMATCH_FUNCTION.3 \
- CURLOPT_FOLLOWLOCATION.3 \
- CURLOPT_FORBID_REUSE.3 \
- CURLOPT_FRESH_CONNECT.3 \
- CURLOPT_FTPPORT.3 \
- CURLOPT_FTPSSLAUTH.3 \
- CURLOPT_FTP_ACCOUNT.3 \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.3 \
- CURLOPT_FTP_CREATE_MISSING_DIRS.3 \
- CURLOPT_FTP_FILEMETHOD.3 \
- CURLOPT_FTP_RESPONSE_TIMEOUT.3 \
- CURLOPT_FTP_SKIP_PASV_IP.3 \
- CURLOPT_FTP_SSL_CCC.3 \
- CURLOPT_FTP_USE_EPRT.3 \
- CURLOPT_FTP_USE_EPSV.3 \
- CURLOPT_FTP_USE_PRET.3 \
- CURLOPT_GSSAPI_DELEGATION.3 \
- CURLOPT_HEADER.3 \
- CURLOPT_HEADERDATA.3 \
- CURLOPT_HEADERFUNCTION.3 \
- CURLOPT_HEADEROPT.3 \
- CURLOPT_HTTP200ALIASES.3 \
- CURLOPT_HTTPAUTH.3 \
- CURLOPT_HTTPGET.3 \
- CURLOPT_HTTPHEADER.3 \
- CURLOPT_HTTPPOST.3 \
- CURLOPT_HTTPPROXYTUNNEL.3 \
- CURLOPT_HTTP_CONTENT_DECODING.3 \
- CURLOPT_HTTP_TRANSFER_DECODING.3 \
- CURLOPT_HTTP_VERSION.3 \
- CURLOPT_IGNORE_CONTENT_LENGTH.3 \
- CURLOPT_INFILESIZE.3 \
- CURLOPT_INFILESIZE_LARGE.3 \
- CURLOPT_INTERFACE.3 \
- CURLOPT_INTERLEAVEDATA.3 \
- CURLOPT_INTERLEAVEFUNCTION.3 \
- CURLOPT_IOCTLDATA.3 \
- CURLOPT_IOCTLFUNCTION.3 \
- CURLOPT_IPRESOLVE.3 \
- CURLOPT_ISSUERCERT.3 \
- CURLOPT_KEEP_SENDING_ON_ERROR.3 \
- CURLOPT_KEYPASSWD.3 \
- CURLOPT_KRBLEVEL.3 \
- CURLOPT_LOCALPORT.3 \
- CURLOPT_LOCALPORTRANGE.3 \
- CURLOPT_LOGIN_OPTIONS.3 \
- CURLOPT_LOW_SPEED_LIMIT.3 \
- CURLOPT_LOW_SPEED_TIME.3 \
- CURLOPT_MAIL_AUTH.3 \
- CURLOPT_MAIL_FROM.3 \
- CURLOPT_MAIL_RCPT.3 \
- CURLOPT_MAXCONNECTS.3 \
- CURLOPT_MAXFILESIZE.3 \
- CURLOPT_MAXFILESIZE_LARGE.3 \
- CURLOPT_MAXREDIRS.3 \
- CURLOPT_MAX_RECV_SPEED_LARGE.3 \
- CURLOPT_MAX_SEND_SPEED_LARGE.3 \
- CURLOPT_NETRC.3 \
- CURLOPT_NETRC_FILE.3 \
- CURLOPT_NEW_DIRECTORY_PERMS.3 \
- CURLOPT_NEW_FILE_PERMS.3 \
- CURLOPT_NOBODY.3 \
- CURLOPT_NOPROGRESS.3 \
- CURLOPT_NOPROXY.3 \
- CURLOPT_NOSIGNAL.3 \
- CURLOPT_OPENSOCKETDATA.3 \
- CURLOPT_OPENSOCKETFUNCTION.3 \
- CURLOPT_PASSWORD.3 \
- CURLOPT_PATH_AS_IS.3 \
- CURLOPT_PINNEDPUBLICKEY.3 \
- CURLOPT_PIPEWAIT.3 \
- CURLOPT_PORT.3 \
- CURLOPT_POST.3 \
- CURLOPT_POSTFIELDS.3 \
- CURLOPT_POSTFIELDSIZE.3 \
- CURLOPT_POSTFIELDSIZE_LARGE.3 \
- CURLOPT_POSTQUOTE.3 \
- CURLOPT_POSTREDIR.3 \
- CURLOPT_PREQUOTE.3 \
- CURLOPT_PRE_PROXY.3 \
- CURLOPT_PRIVATE.3 \
- CURLOPT_PROGRESSDATA.3 \
- CURLOPT_PROGRESSFUNCTION.3 \
- CURLOPT_PROTOCOLS.3 \
- CURLOPT_PROXY.3 \
- CURLOPT_PROXYAUTH.3 \
- CURLOPT_PROXYHEADER.3 \
- CURLOPT_PROXYPASSWORD.3 \
- CURLOPT_PROXYPORT.3 \
- CURLOPT_PROXYTYPE.3 \
- CURLOPT_PROXYUSERNAME.3 \
- CURLOPT_PROXYUSERPWD.3 \
- CURLOPT_PROXY_CAINFO.3 \
- CURLOPT_PROXY_CAPATH.3 \
- CURLOPT_PROXY_CRLFILE.3 \
- CURLOPT_PROXY_KEYPASSWD.3 \
- CURLOPT_PROXY_PINNEDPUBLICKEY.3 \
- CURLOPT_PROXY_SERVICE_NAME.3 \
- CURLOPT_PROXY_SSLCERT.3 \
- CURLOPT_PROXY_SSLCERTTYPE.3 \
- CURLOPT_PROXY_SSLKEY.3 \
- CURLOPT_PROXY_SSLKEYTYPE.3 \
- CURLOPT_PROXY_SSLVERSION.3 \
- CURLOPT_PROXY_SSL_CIPHER_LIST.3 \
- CURLOPT_PROXY_SSL_OPTIONS.3 \
- CURLOPT_PROXY_SSL_VERIFYHOST.3 \
- CURLOPT_PROXY_SSL_VERIFYPEER.3 \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.3 \
- CURLOPT_PROXY_TLSAUTH_TYPE.3 \
- CURLOPT_PROXY_TLSAUTH_USERNAME.3 \
- CURLOPT_PROXY_TRANSFER_MODE.3 \
- CURLOPT_PUT.3 \
- CURLOPT_QUOTE.3 \
- CURLOPT_RANDOM_FILE.3 \
- CURLOPT_RANGE.3 \
- CURLOPT_READDATA.3 \
- CURLOPT_READFUNCTION.3 \
- CURLOPT_REDIR_PROTOCOLS.3 \
- CURLOPT_REFERER.3 \
- CURLOPT_RESOLVE.3 \
- CURLOPT_RESUME_FROM.3 \
- CURLOPT_RESUME_FROM_LARGE.3 \
- CURLOPT_RTSP_CLIENT_CSEQ.3 \
- CURLOPT_RTSP_REQUEST.3 \
- CURLOPT_RTSP_SERVER_CSEQ.3 \
- CURLOPT_RTSP_SESSION_ID.3 \
- CURLOPT_RTSP_STREAM_URI.3 \
- CURLOPT_RTSP_TRANSPORT.3 \
- CURLOPT_SASL_IR.3 \
- CURLOPT_SEEKDATA.3 \
- CURLOPT_SEEKFUNCTION.3 \
- CURLOPT_SERVICE_NAME.3 \
- CURLOPT_SHARE.3 \
- CURLOPT_SOCKOPTDATA.3 \
- CURLOPT_SOCKOPTFUNCTION.3 \
- CURLOPT_SOCKS5_GSSAPI_NEC.3 \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.3 \
- CURLOPT_SSH_AUTH_TYPES.3 \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 \
- CURLOPT_SSH_KEYDATA.3 \
- CURLOPT_SSH_KEYFUNCTION.3 \
- CURLOPT_SSH_KNOWNHOSTS.3 \
- CURLOPT_SSH_PRIVATE_KEYFILE.3 \
- CURLOPT_SSH_PUBLIC_KEYFILE.3 \
- CURLOPT_SSLCERT.3 \
- CURLOPT_SSLCERTTYPE.3 \
- CURLOPT_SSLENGINE.3 \
- CURLOPT_SSLENGINE_DEFAULT.3 \
- CURLOPT_SSLKEY.3 \
- CURLOPT_SSLKEYTYPE.3 \
- CURLOPT_SSLVERSION.3 \
- CURLOPT_SSL_CIPHER_LIST.3 \
- CURLOPT_SSL_CTX_DATA.3 \
- CURLOPT_SSL_CTX_FUNCTION.3 \
- CURLOPT_SSL_ENABLE_ALPN.3 \
- CURLOPT_SSL_ENABLE_NPN.3 \
- CURLOPT_SSL_FALSESTART.3 \
- CURLOPT_SSL_OPTIONS.3 \
- CURLOPT_SSL_SESSIONID_CACHE.3 \
- CURLOPT_SSL_VERIFYHOST.3 \
- CURLOPT_SSL_VERIFYPEER.3 \
- CURLOPT_SSL_VERIFYSTATUS.3 \
- CURLOPT_STDERR.3 \
- CURLOPT_STREAM_DEPENDS.3 \
- CURLOPT_STREAM_DEPENDS_E.3 \
- CURLOPT_STREAM_WEIGHT.3 \
- CURLOPT_TCP_FASTOPEN.3 \
- CURLOPT_TCP_KEEPALIVE.3 \
- CURLOPT_TCP_KEEPIDLE.3 \
- CURLOPT_TCP_KEEPINTVL.3 \
- CURLOPT_TCP_NODELAY.3 \
- CURLOPT_TELNETOPTIONS.3 \
- CURLOPT_TFTP_BLKSIZE.3 \
- CURLOPT_TFTP_NO_OPTIONS.3 \
- CURLOPT_TIMECONDITION.3 \
- CURLOPT_TIMEOUT.3 \
- CURLOPT_TIMEOUT_MS.3 \
- CURLOPT_TIMEVALUE.3 \
- CURLOPT_TLSAUTH_PASSWORD.3 \
- CURLOPT_TLSAUTH_TYPE.3 \
- CURLOPT_TLSAUTH_USERNAME.3 \
- CURLOPT_TRANSFERTEXT.3 \
- CURLOPT_TRANSFER_ENCODING.3 \
- CURLOPT_UNIX_SOCKET_PATH.3 \
- CURLOPT_UNRESTRICTED_AUTH.3 \
- CURLOPT_UPLOAD.3 \
- CURLOPT_URL.3 \
- CURLOPT_USERAGENT.3 \
- CURLOPT_USERNAME.3 \
- CURLOPT_USERPWD.3 \
- CURLOPT_USE_SSL.3 \
- CURLOPT_VERBOSE.3 \
- CURLOPT_WILDCARDMATCH.3 \
- CURLOPT_WRITEDATA.3 \
- CURLOPT_WRITEFUNCTION.3 \
- CURLOPT_XFERINFODATA.3 \
- CURLOPT_XFERINFOFUNCTION.3 \
- CURLOPT_XOAUTH2_BEARER.3
+include Makefile.inc
-HTMLPAGES = \
- CURLINFO_ACTIVESOCKET.html \
- CURLINFO_APPCONNECT_TIME.html \
- CURLINFO_CERTINFO.html \
- CURLINFO_CONDITION_UNMET.html \
- CURLINFO_CONNECT_TIME.html \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.html \
- CURLINFO_CONTENT_LENGTH_UPLOAD.html \
- CURLINFO_CONTENT_TYPE.html \
- CURLINFO_COOKIELIST.html \
- CURLINFO_EFFECTIVE_URL.html \
- CURLINFO_FILETIME.html \
- CURLINFO_FTP_ENTRY_PATH.html \
- CURLINFO_HEADER_SIZE.html \
- CURLINFO_HTTPAUTH_AVAIL.html \
- CURLINFO_HTTP_CONNECTCODE.html \
- CURLINFO_HTTP_VERSION.html \
- CURLINFO_LASTSOCKET.html \
- CURLINFO_LOCAL_IP.html \
- CURLINFO_LOCAL_PORT.html \
- CURLINFO_NAMELOOKUP_TIME.html \
- CURLINFO_NUM_CONNECTS.html \
- CURLINFO_OS_ERRNO.html \
- CURLINFO_PRETRANSFER_TIME.html \
- CURLINFO_PRIMARY_IP.html \
- CURLINFO_PRIMARY_PORT.html \
- CURLINFO_PRIVATE.html \
- CURLINFO_PROTOCOL.html \
- CURLINFO_PROXYAUTH_AVAIL.html \
- CURLINFO_PROXY_SSL_VERIFYRESULT.html \
- CURLINFO_REDIRECT_COUNT.html \
- CURLINFO_REDIRECT_TIME.html \
- CURLINFO_REDIRECT_URL.html \
- CURLINFO_REQUEST_SIZE.html \
- CURLINFO_RESPONSE_CODE.html \
- CURLINFO_RTSP_CLIENT_CSEQ.html \
- CURLINFO_RTSP_CSEQ_RECV.html \
- CURLINFO_RTSP_SERVER_CSEQ.html \
- CURLINFO_RTSP_SESSION_ID.html \
- CURLINFO_SCHEME.html \
- CURLINFO_SIZE_DOWNLOAD.html \
- CURLINFO_SIZE_UPLOAD.html \
- CURLINFO_SPEED_DOWNLOAD.html \
- CURLINFO_SPEED_UPLOAD.html \
- CURLINFO_SSL_ENGINES.html \
- CURLINFO_SSL_VERIFYRESULT.html \
- CURLINFO_STARTTRANSFER_TIME.html \
- CURLINFO_TLS_SESSION.html \
- CURLINFO_TLS_SSL_PTR.html \
- CURLINFO_TOTAL_TIME.html \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html \
- CURLMOPT_MAXCONNECTS.html \
- CURLMOPT_MAX_HOST_CONNECTIONS.html \
- CURLMOPT_MAX_PIPELINE_LENGTH.html \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.html \
- CURLMOPT_PIPELINING.html \
- CURLMOPT_PIPELINING_SERVER_BL.html \
- CURLMOPT_PIPELINING_SITE_BL.html \
- CURLMOPT_PUSHDATA.html \
- CURLMOPT_PUSHFUNCTION.html \
- CURLMOPT_SOCKETDATA.html \
- CURLMOPT_SOCKETFUNCTION.html \
- CURLMOPT_TIMERDATA.html \
- CURLMOPT_TIMERFUNCTION.html \
- CURLOPT_ACCEPTTIMEOUT_MS.html \
- CURLOPT_ACCEPT_ENCODING.html \
- CURLOPT_ADDRESS_SCOPE.html \
- CURLOPT_APPEND.html \
- CURLOPT_AUTOREFERER.html \
- CURLOPT_BUFFERSIZE.html \
- CURLOPT_CAINFO.html \
- CURLOPT_CAPATH.html \
- CURLOPT_CERTINFO.html \
- CURLOPT_CHUNK_BGN_FUNCTION.html \
- CURLOPT_CHUNK_DATA.html \
- CURLOPT_CHUNK_END_FUNCTION.html \
- CURLOPT_CLOSESOCKETDATA.html \
- CURLOPT_CLOSESOCKETFUNCTION.html \
- CURLOPT_CONNECTTIMEOUT.html \
- CURLOPT_CONNECTTIMEOUT_MS.html \
- CURLOPT_CONNECT_ONLY.html \
- CURLOPT_CONNECT_TO.html \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.html \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.html \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.html \
- CURLOPT_COOKIE.html \
- CURLOPT_COOKIEFILE.html \
- CURLOPT_COOKIEJAR.html \
- CURLOPT_COOKIELIST.html \
- CURLOPT_COOKIESESSION.html \
- CURLOPT_COPYPOSTFIELDS.html \
- CURLOPT_CRLF.html \
- CURLOPT_CRLFILE.html \
- CURLOPT_CUSTOMREQUEST.html \
- CURLOPT_DEBUGDATA.html \
- CURLOPT_DEBUGFUNCTION.html \
- CURLOPT_DEFAULT_PROTOCOL.html \
- CURLOPT_DIRLISTONLY.html \
- CURLOPT_DNS_CACHE_TIMEOUT.html \
- CURLOPT_DNS_INTERFACE.html \
- CURLOPT_DNS_LOCAL_IP4.html \
- CURLOPT_DNS_LOCAL_IP6.html \
- CURLOPT_DNS_SERVERS.html \
- CURLOPT_DNS_USE_GLOBAL_CACHE.html \
- CURLOPT_EGDSOCKET.html \
- CURLOPT_ERRORBUFFER.html \
- CURLOPT_EXPECT_100_TIMEOUT_MS.html \
- CURLOPT_FAILONERROR.html \
- CURLOPT_FILETIME.html \
- CURLOPT_FNMATCH_DATA.html \
- CURLOPT_FNMATCH_FUNCTION.html \
- CURLOPT_FOLLOWLOCATION.html \
- CURLOPT_FORBID_REUSE.html \
- CURLOPT_FRESH_CONNECT.html \
- CURLOPT_FTPPORT.html \
- CURLOPT_FTPSSLAUTH.html \
- CURLOPT_FTP_ACCOUNT.html \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.html \
- CURLOPT_FTP_CREATE_MISSING_DIRS.html \
- CURLOPT_FTP_FILEMETHOD.html \
- CURLOPT_FTP_RESPONSE_TIMEOUT.html \
- CURLOPT_FTP_SKIP_PASV_IP.html \
- CURLOPT_FTP_SSL_CCC.html \
- CURLOPT_FTP_USE_EPRT.html \
- CURLOPT_FTP_USE_EPSV.html \
- CURLOPT_FTP_USE_PRET.html \
- CURLOPT_GSSAPI_DELEGATION.html \
- CURLOPT_HEADER.html \
- CURLOPT_HEADERDATA.html \
- CURLOPT_HEADERFUNCTION.html \
- CURLOPT_HEADEROPT.html \
- CURLOPT_HTTP200ALIASES.html \
- CURLOPT_HTTPAUTH.html \
- CURLOPT_HTTPGET.html \
- CURLOPT_HTTPHEADER.html \
- CURLOPT_HTTPPOST.html \
- CURLOPT_HTTPPROXYTUNNEL.html \
- CURLOPT_HTTP_CONTENT_DECODING.html \
- CURLOPT_HTTP_TRANSFER_DECODING.html \
- CURLOPT_HTTP_VERSION.html \
- CURLOPT_IGNORE_CONTENT_LENGTH.html \
- CURLOPT_INFILESIZE.html \
- CURLOPT_INFILESIZE_LARGE.html \
- CURLOPT_INTERFACE.html \
- CURLOPT_INTERLEAVEDATA.html \
- CURLOPT_INTERLEAVEFUNCTION.html \
- CURLOPT_IOCTLDATA.html \
- CURLOPT_IOCTLFUNCTION.html \
- CURLOPT_IPRESOLVE.html \
- CURLOPT_ISSUERCERT.html \
- CURLOPT_KEEP_SENDING_ON_ERROR.html \
- CURLOPT_KEYPASSWD.html \
- CURLOPT_KRBLEVEL.html \
- CURLOPT_LOCALPORT.html \
- CURLOPT_LOCALPORTRANGE.html \
- CURLOPT_LOGIN_OPTIONS.html \
- CURLOPT_LOW_SPEED_LIMIT.html \
- CURLOPT_LOW_SPEED_TIME.html \
- CURLOPT_MAIL_AUTH.html \
- CURLOPT_MAIL_FROM.html \
- CURLOPT_MAIL_RCPT.html \
- CURLOPT_MAXCONNECTS.html \
- CURLOPT_MAXFILESIZE.html \
- CURLOPT_MAXFILESIZE_LARGE.html \
- CURLOPT_MAXREDIRS.html \
- CURLOPT_MAX_RECV_SPEED_LARGE.html \
- CURLOPT_MAX_SEND_SPEED_LARGE.html \
- CURLOPT_NETRC.html \
- CURLOPT_NETRC_FILE.html \
- CURLOPT_NEW_DIRECTORY_PERMS.html \
- CURLOPT_NEW_FILE_PERMS.html \
- CURLOPT_NOBODY.html \
- CURLOPT_NOPROGRESS.html \
- CURLOPT_NOPROXY.html \
- CURLOPT_NOSIGNAL.html \
- CURLOPT_OPENSOCKETDATA.html \
- CURLOPT_OPENSOCKETFUNCTION.html \
- CURLOPT_PASSWORD.html \
- CURLOPT_PATH_AS_IS.html \
- CURLOPT_PINNEDPUBLICKEY.html \
- CURLOPT_PIPEWAIT.html \
- CURLOPT_PORT.html \
- CURLOPT_POST.html \
- CURLOPT_POSTFIELDS.html \
- CURLOPT_POSTFIELDSIZE.html \
- CURLOPT_POSTFIELDSIZE_LARGE.html \
- CURLOPT_POSTQUOTE.html \
- CURLOPT_POSTREDIR.html \
- CURLOPT_PREQUOTE.html \
- CURLOPT_PRE_PROXY.html \
- CURLOPT_PRIVATE.html \
- CURLOPT_PROGRESSDATA.html \
- CURLOPT_PROGRESSFUNCTION.html \
- CURLOPT_PROTOCOLS.html \
- CURLOPT_PROXY.html \
- CURLOPT_PROXYAUTH.html \
- CURLOPT_PROXYHEADER.html \
- CURLOPT_PROXYPASSWORD.html \
- CURLOPT_PROXYPORT.html \
- CURLOPT_PROXYTYPE.html \
- CURLOPT_PROXYUSERNAME.html \
- CURLOPT_PROXYUSERPWD.html \
- CURLOPT_PROXY_CAINFO.html \
- CURLOPT_PROXY_CAPATH.html \
- CURLOPT_PROXY_CRLFILE.html \
- CURLOPT_PROXY_KEYPASSWD.html \
- CURLOPT_PROXY_PINNEDPUBLICKEY.html \
- CURLOPT_PROXY_SERVICE_NAME.html \
- CURLOPT_PROXY_SSLCERT.html \
- CURLOPT_PROXY_SSLCERTTYPE.html \
- CURLOPT_PROXY_SSLKEY.html \
- CURLOPT_PROXY_SSLKEYTYPE.html \
- CURLOPT_PROXY_SSLVERSION.html \
- CURLOPT_PROXY_SSL_CIPHER_LIST.html \
- CURLOPT_PROXY_SSL_OPTIONS.html \
- CURLOPT_PROXY_SSL_VERIFYHOST.html \
- CURLOPT_PROXY_SSL_VERIFYPEER.html \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.html \
- CURLOPT_PROXY_TLSAUTH_TYPE.html \
- CURLOPT_PROXY_TLSAUTH_USERNAME.html \
- CURLOPT_PROXY_TRANSFER_MODE.html \
- CURLOPT_PUT.html \
- CURLOPT_QUOTE.html \
- CURLOPT_RANDOM_FILE.html \
- CURLOPT_RANGE.html \
- CURLOPT_READDATA.html \
- CURLOPT_READFUNCTION.html \
- CURLOPT_REDIR_PROTOCOLS.html \
- CURLOPT_REFERER.html \
- CURLOPT_RESOLVE.html \
- CURLOPT_RESUME_FROM.html \
- CURLOPT_RESUME_FROM_LARGE.html \
- CURLOPT_RTSP_CLIENT_CSEQ.html \
- CURLOPT_RTSP_REQUEST.html \
- CURLOPT_RTSP_SERVER_CSEQ.html \
- CURLOPT_RTSP_SESSION_ID.html \
- CURLOPT_RTSP_STREAM_URI.html \
- CURLOPT_RTSP_TRANSPORT.html \
- CURLOPT_SASL_IR.html \
- CURLOPT_SEEKDATA.html \
- CURLOPT_SEEKFUNCTION.html \
- CURLOPT_SERVICE_NAME.html \
- CURLOPT_SHARE.html \
- CURLOPT_SOCKOPTDATA.html \
- CURLOPT_SOCKOPTFUNCTION.html \
- CURLOPT_SOCKS5_GSSAPI_NEC.html \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.html \
- CURLOPT_SSH_AUTH_TYPES.html \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html \
- CURLOPT_SSH_KEYDATA.html \
- CURLOPT_SSH_KEYFUNCTION.html \
- CURLOPT_SSH_KNOWNHOSTS.html \
- CURLOPT_SSH_PRIVATE_KEYFILE.html \
- CURLOPT_SSH_PUBLIC_KEYFILE.html \
- CURLOPT_SSLCERT.html \
- CURLOPT_SSLCERTTYPE.html \
- CURLOPT_SSLENGINE.html \
- CURLOPT_SSLENGINE_DEFAULT.html \
- CURLOPT_SSLKEY.html \
- CURLOPT_SSLKEYTYPE.html \
- CURLOPT_SSLVERSION.html \
- CURLOPT_SSL_CIPHER_LIST.html \
- CURLOPT_SSL_CTX_DATA.html \
- CURLOPT_SSL_CTX_FUNCTION.html \
- CURLOPT_SSL_ENABLE_ALPN.html \
- CURLOPT_SSL_ENABLE_NPN.html \
- CURLOPT_SSL_FALSESTART.html \
- CURLOPT_SSL_OPTIONS.html \
- CURLOPT_SSL_SESSIONID_CACHE.html \
- CURLOPT_SSL_VERIFYHOST.html \
- CURLOPT_SSL_VERIFYPEER.html \
- CURLOPT_SSL_VERIFYSTATUS.html \
- CURLOPT_STDERR.html \
- CURLOPT_STREAM_DEPENDS.html \
- CURLOPT_STREAM_DEPENDS_E.html \
- CURLOPT_STREAM_WEIGHT.html \
- CURLOPT_TCP_FASTOPEN.html \
- CURLOPT_TCP_KEEPALIVE.html \
- CURLOPT_TCP_KEEPIDLE.html \
- CURLOPT_TCP_KEEPINTVL.html \
- CURLOPT_TCP_NODELAY.html \
- CURLOPT_TELNETOPTIONS.html \
- CURLOPT_TFTP_BLKSIZE.html \
- CURLOPT_TFTP_NO_OPTIONS.html \
- CURLOPT_TIMECONDITION.html \
- CURLOPT_TIMEOUT.html \
- CURLOPT_TIMEOUT_MS.html \
- CURLOPT_TIMEVALUE.html \
- CURLOPT_TLSAUTH_PASSWORD.html \
- CURLOPT_TLSAUTH_TYPE.html \
- CURLOPT_TLSAUTH_USERNAME.html \
- CURLOPT_TRANSFERTEXT.html \
- CURLOPT_TRANSFER_ENCODING.html \
- CURLOPT_UNIX_SOCKET_PATH.html \
- CURLOPT_UNRESTRICTED_AUTH.html \
- CURLOPT_UPLOAD.html \
- CURLOPT_URL.html \
- CURLOPT_USERAGENT.html \
- CURLOPT_USERNAME.html \
- CURLOPT_USERPWD.html \
- CURLOPT_USE_SSL.html \
- CURLOPT_VERBOSE.html \
- CURLOPT_WILDCARDMATCH.html \
- CURLOPT_WRITEDATA.html \
- CURLOPT_WRITEFUNCTION.html \
- CURLOPT_XFERINFODATA.html \
- CURLOPT_XFERINFOFUNCTION.html \
- CURLOPT_XOAUTH2_BEARER.html
+man_DISTMANS = $(man_MANS:.3=.3.dist)
-PDFPAGES = \
- CURLINFO_ACTIVESOCKET.pdf \
- CURLINFO_APPCONNECT_TIME.pdf \
- CURLINFO_CERTINFO.pdf \
- CURLINFO_CONDITION_UNMET.pdf \
- CURLINFO_CONNECT_TIME.pdf \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.pdf \
- CURLINFO_CONTENT_LENGTH_UPLOAD.pdf \
- CURLINFO_CONTENT_TYPE.pdf \
- CURLINFO_COOKIELIST.pdf \
- CURLINFO_EFFECTIVE_URL.pdf \
- CURLINFO_FILETIME.pdf \
- CURLINFO_FTP_ENTRY_PATH.pdf \
- CURLINFO_HEADER_SIZE.pdf \
- CURLINFO_HTTPAUTH_AVAIL.pdf \
- CURLINFO_HTTP_CONNECTCODE.pdf \
- CURLINFO_HTTP_VERSION.pdf \
- CURLINFO_LASTSOCKET.pdf \
- CURLINFO_LOCAL_IP.pdf \
- CURLINFO_LOCAL_PORT.pdf \
- CURLINFO_NAMELOOKUP_TIME.pdf \
- CURLINFO_NUM_CONNECTS.pdf \
- CURLINFO_OS_ERRNO.pdf \
- CURLINFO_PRETRANSFER_TIME.pdf \
- CURLINFO_PRIMARY_IP.pdf \
- CURLINFO_PRIMARY_PORT.pdf \
- CURLINFO_PRIVATE.pdf \
- CURLINFO_PROTOCOL.pdf \
- CURLINFO_PROXYAUTH_AVAIL.pdf \
- CURLINFO_PROXY_SSL_VERIFYRESULT.pdf \
- CURLINFO_REDIRECT_COUNT.pdf \
- CURLINFO_REDIRECT_TIME.pdf \
- CURLINFO_REDIRECT_URL.pdf \
- CURLINFO_REQUEST_SIZE.pdf \
- CURLINFO_RESPONSE_CODE.pdf \
- CURLINFO_RTSP_CLIENT_CSEQ.pdf \
- CURLINFO_RTSP_CSEQ_RECV.pdf \
- CURLINFO_RTSP_SERVER_CSEQ.pdf \
- CURLINFO_RTSP_SESSION_ID.pdf \
- CURLINFO_SCHEME.pdf \
- CURLINFO_SIZE_DOWNLOAD.pdf \
- CURLINFO_SIZE_UPLOAD.pdf \
- CURLINFO_SPEED_DOWNLOAD.pdf \
- CURLINFO_SPEED_UPLOAD.pdf \
- CURLINFO_SSL_ENGINES.pdf \
- CURLINFO_SSL_VERIFYRESULT.pdf \
- CURLINFO_STARTTRANSFER_TIME.pdf \
- CURLINFO_TLS_SESSION.pdf \
- CURLINFO_TLS_SSL_PTR.pdf \
- CURLINFO_TOTAL_TIME.pdf \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf \
- CURLMOPT_MAXCONNECTS.pdf \
- CURLMOPT_MAX_HOST_CONNECTIONS.pdf \
- CURLMOPT_MAX_PIPELINE_LENGTH.pdf \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf \
- CURLMOPT_PIPELINING.pdf \
- CURLMOPT_PIPELINING_SERVER_BL.pdf \
- CURLMOPT_PIPELINING_SITE_BL.pdf \
- CURLMOPT_PUSHDATA.pdf \
- CURLMOPT_PUSHFUNCTION.pdf \
- CURLMOPT_SOCKETDATA.pdf \
- CURLMOPT_SOCKETFUNCTION.pdf \
- CURLMOPT_TIMERDATA.pdf \
- CURLMOPT_TIMERFUNCTION.pdf \
- CURLOPT_ACCEPTTIMEOUT_MS.pdf \
- CURLOPT_ACCEPT_ENCODING.pdf \
- CURLOPT_ADDRESS_SCOPE.pdf \
- CURLOPT_APPEND.pdf \
- CURLOPT_AUTOREFERER.pdf \
- CURLOPT_BUFFERSIZE.pdf \
- CURLOPT_CAINFO.pdf \
- CURLOPT_CAPATH.pdf \
- CURLOPT_CERTINFO.pdf \
- CURLOPT_CHUNK_BGN_FUNCTION.pdf \
- CURLOPT_CHUNK_DATA.pdf \
- CURLOPT_CHUNK_END_FUNCTION.pdf \
- CURLOPT_CLOSESOCKETDATA.pdf \
- CURLOPT_CLOSESOCKETFUNCTION.pdf \
- CURLOPT_CONNECTTIMEOUT.pdf \
- CURLOPT_CONNECTTIMEOUT_MS.pdf \
- CURLOPT_CONNECT_ONLY.pdf \
- CURLOPT_CONNECT_TO.pdf \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf \
- CURLOPT_COOKIE.pdf \
- CURLOPT_COOKIEFILE.pdf \
- CURLOPT_COOKIEJAR.pdf \
- CURLOPT_COOKIELIST.pdf \
- CURLOPT_COOKIESESSION.pdf \
- CURLOPT_COPYPOSTFIELDS.pdf \
- CURLOPT_CRLF.pdf \
- CURLOPT_CRLFILE.pdf \
- CURLOPT_CUSTOMREQUEST.pdf \
- CURLOPT_DEBUGDATA.pdf \
- CURLOPT_DEBUGFUNCTION.pdf \
- CURLOPT_DEFAULT_PROTOCOL.pdf \
- CURLOPT_DIRLISTONLY.pdf \
- CURLOPT_DNS_CACHE_TIMEOUT.pdf \
- CURLOPT_DNS_INTERFACE.pdf \
- CURLOPT_DNS_LOCAL_IP4.pdf \
- CURLOPT_DNS_LOCAL_IP6.pdf \
- CURLOPT_DNS_SERVERS.pdf \
- CURLOPT_DNS_USE_GLOBAL_CACHE.pdf \
- CURLOPT_EGDSOCKET.pdf \
- CURLOPT_ERRORBUFFER.pdf \
- CURLOPT_EXPECT_100_TIMEOUT_MS.pdf \
- CURLOPT_FAILONERROR.pdf \
- CURLOPT_FILETIME.pdf \
- CURLOPT_FNMATCH_DATA.pdf \
- CURLOPT_FNMATCH_FUNCTION.pdf \
- CURLOPT_FOLLOWLOCATION.pdf \
- CURLOPT_FORBID_REUSE.pdf \
- CURLOPT_FRESH_CONNECT.pdf \
- CURLOPT_FTPPORT.pdf \
- CURLOPT_FTPSSLAUTH.pdf \
- CURLOPT_FTP_ACCOUNT.pdf \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf \
- CURLOPT_FTP_CREATE_MISSING_DIRS.pdf \
- CURLOPT_FTP_FILEMETHOD.pdf \
- CURLOPT_FTP_RESPONSE_TIMEOUT.pdf \
- CURLOPT_FTP_SKIP_PASV_IP.pdf \
- CURLOPT_FTP_SSL_CCC.pdf \
- CURLOPT_FTP_USE_EPRT.pdf \
- CURLOPT_FTP_USE_EPSV.pdf \
- CURLOPT_FTP_USE_PRET.pdf \
- CURLOPT_GSSAPI_DELEGATION.pdf \
- CURLOPT_HEADER.pdf \
- CURLOPT_HEADERDATA.pdf \
- CURLOPT_HEADERFUNCTION.pdf \
- CURLOPT_HEADEROPT.pdf \
- CURLOPT_HTTP200ALIASES.pdf \
- CURLOPT_HTTPAUTH.pdf \
- CURLOPT_HTTPGET.pdf \
- CURLOPT_HTTPHEADER.pdf \
- CURLOPT_HTTPPOST.pdf \
- CURLOPT_HTTPPROXYTUNNEL.pdf \
- CURLOPT_HTTP_CONTENT_DECODING.pdf \
- CURLOPT_HTTP_TRANSFER_DECODING.pdf \
- CURLOPT_HTTP_VERSION.pdf \
- CURLOPT_IGNORE_CONTENT_LENGTH.pdf \
- CURLOPT_INFILESIZE.pdf \
- CURLOPT_INFILESIZE_LARGE.pdf \
- CURLOPT_INTERFACE.pdf \
- CURLOPT_INTERLEAVEDATA.pdf \
- CURLOPT_INTERLEAVEFUNCTION.pdf \
- CURLOPT_IOCTLDATA.pdf \
- CURLOPT_IOCTLFUNCTION.pdf \
- CURLOPT_IPRESOLVE.pdf \
- CURLOPT_ISSUERCERT.pdf \
- CURLOPT_KEEP_SENDING_ON_ERROR.pdf \
- CURLOPT_KEYPASSWD.pdf \
- CURLOPT_KRBLEVEL.pdf \
- CURLOPT_LOCALPORT.pdf \
- CURLOPT_LOCALPORTRANGE.pdf \
- CURLOPT_LOGIN_OPTIONS.pdf \
- CURLOPT_LOW_SPEED_LIMIT.pdf \
- CURLOPT_LOW_SPEED_TIME.pdf \
- CURLOPT_MAIL_AUTH.pdf \
- CURLOPT_MAIL_FROM.pdf \
- CURLOPT_MAIL_RCPT.pdf \
- CURLOPT_MAXCONNECTS.pdf \
- CURLOPT_MAXFILESIZE.pdf \
- CURLOPT_MAXFILESIZE_LARGE.pdf \
- CURLOPT_MAXREDIRS.pdf \
- CURLOPT_MAX_RECV_SPEED_LARGE.pdf \
- CURLOPT_MAX_SEND_SPEED_LARGE.pdf \
- CURLOPT_NETRC.pdf \
- CURLOPT_NETRC_FILE.pdf \
- CURLOPT_NEW_DIRECTORY_PERMS.pdf \
- CURLOPT_NEW_FILE_PERMS.pdf \
- CURLOPT_NOBODY.pdf \
- CURLOPT_NOPROGRESS.pdf \
- CURLOPT_NOPROXY.pdf \
- CURLOPT_NOSIGNAL.pdf \
- CURLOPT_OPENSOCKETDATA.pdf \
- CURLOPT_OPENSOCKETFUNCTION.pdf \
- CURLOPT_PASSWORD.pdf \
- CURLOPT_PATH_AS_IS.pdf \
- CURLOPT_PINNEDPUBLICKEY.pdf \
- CURLOPT_PIPEWAIT.pdf \
- CURLOPT_PORT.pdf \
- CURLOPT_POST.pdf \
- CURLOPT_POSTFIELDS.pdf \
- CURLOPT_POSTFIELDSIZE.pdf \
- CURLOPT_POSTFIELDSIZE_LARGE.pdf \
- CURLOPT_POSTQUOTE.pdf \
- CURLOPT_POSTREDIR.pdf \
- CURLOPT_PREQUOTE.pdf \
- CURLOPT_PRE_PROXY.pdf \
- CURLOPT_PRIVATE.pdf \
- CURLOPT_PROGRESSDATA.pdf \
- CURLOPT_PROGRESSFUNCTION.pdf \
- CURLOPT_PROTOCOLS.pdf \
- CURLOPT_PROXY.pdf \
- CURLOPT_PROXYAUTH.pdf \
- CURLOPT_PROXYHEADER.pdf \
- CURLOPT_PROXYPASSWORD.pdf \
- CURLOPT_PROXYPORT.pdf \
- CURLOPT_PROXYTYPE.pdf \
- CURLOPT_PROXYUSERNAME.pdf \
- CURLOPT_PROXYUSERPWD.pdf \
- CURLOPT_PROXY_CAINFO.pdf \
- CURLOPT_PROXY_CAPATH.pdf \
- CURLOPT_PROXY_CRLFILE.pdf \
- CURLOPT_PROXY_KEYPASSWD.pdf \
- CURLOPT_PROXY_PINNEDPUBLICKEY.pdf \
- CURLOPT_PROXY_SERVICE_NAME.pdf \
- CURLOPT_PROXY_SSLCERT.pdf \
- CURLOPT_PROXY_SSLCERTTYPE.pdf \
- CURLOPT_PROXY_SSLKEY.pdf \
- CURLOPT_PROXY_SSLKEYTYPE.pdf \
- CURLOPT_PROXY_SSLVERSION.pdf \
- CURLOPT_PROXY_SSL_CIPHER_LIST.pdf \
- CURLOPT_PROXY_SSL_OPTIONS.pdf \
- CURLOPT_PROXY_SSL_VERIFYHOST.pdf \
- CURLOPT_PROXY_SSL_VERIFYPEER.pdf \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.pdf \
- CURLOPT_PROXY_TLSAUTH_TYPE.pdf \
- CURLOPT_PROXY_TLSAUTH_USERNAME.pdf \
- CURLOPT_PROXY_TRANSFER_MODE.pdf \
- CURLOPT_PUT.pdf \
- CURLOPT_QUOTE.pdf \
- CURLOPT_RANDOM_FILE.pdf \
- CURLOPT_RANGE.pdf \
- CURLOPT_READDATA.pdf \
- CURLOPT_READFUNCTION.pdf \
- CURLOPT_REDIR_PROTOCOLS.pdf \
- CURLOPT_REFERER.pdf \
- CURLOPT_RESOLVE.pdf \
- CURLOPT_RESUME_FROM.pdf \
- CURLOPT_RESUME_FROM_LARGE.pdf \
- CURLOPT_RTSP_CLIENT_CSEQ.pdf \
- CURLOPT_RTSP_REQUEST.pdf \
- CURLOPT_RTSP_SERVER_CSEQ.pdf \
- CURLOPT_RTSP_SESSION_ID.pdf \
- CURLOPT_RTSP_STREAM_URI.pdf \
- CURLOPT_RTSP_TRANSPORT.pdf \
- CURLOPT_SASL_IR.pdf \
- CURLOPT_SEEKDATA.pdf \
- CURLOPT_SEEKFUNCTION.pdf \
- CURLOPT_SERVICE_NAME.pdf \
- CURLOPT_SHARE.pdf \
- CURLOPT_SOCKOPTDATA.pdf \
- CURLOPT_SOCKOPTFUNCTION.pdf \
- CURLOPT_SOCKS5_GSSAPI_NEC.pdf \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf \
- CURLOPT_SSH_AUTH_TYPES.pdf \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf \
- CURLOPT_SSH_KEYDATA.pdf \
- CURLOPT_SSH_KEYFUNCTION.pdf \
- CURLOPT_SSH_KNOWNHOSTS.pdf \
- CURLOPT_SSH_PRIVATE_KEYFILE.pdf \
- CURLOPT_SSH_PUBLIC_KEYFILE.pdf \
- CURLOPT_SSLCERT.pdf \
- CURLOPT_SSLCERTTYPE.pdf \
- CURLOPT_SSLENGINE.pdf \
- CURLOPT_SSLENGINE_DEFAULT.pdf \
- CURLOPT_SSLKEY.pdf \
- CURLOPT_SSLKEYTYPE.pdf \
- CURLOPT_SSLVERSION.pdf \
- CURLOPT_SSL_CIPHER_LIST.pdf \
- CURLOPT_SSL_CTX_DATA.pdf \
- CURLOPT_SSL_CTX_FUNCTION.pdf \
- CURLOPT_SSL_ENABLE_ALPN.pdf \
- CURLOPT_SSL_ENABLE_NPN.pdf \
- CURLOPT_SSL_FALSESTART.pdf \
- CURLOPT_SSL_OPTIONS.pdf \
- CURLOPT_SSL_SESSIONID_CACHE.pdf \
- CURLOPT_SSL_VERIFYHOST.pdf \
- CURLOPT_SSL_VERIFYPEER.pdf \
- CURLOPT_SSL_VERIFYSTATUS.pdf \
- CURLOPT_STDERR.pdf \
- CURLOPT_STREAM_DEPENDS.pdf \
- CURLOPT_STREAM_DEPENDS_E.pdf \
- CURLOPT_STREAM_WEIGHT.pdf \
- CURLOPT_TCP_FASTOPEN.pdf \
- CURLOPT_TCP_KEEPALIVE.pdf \
- CURLOPT_TCP_KEEPIDLE.pdf \
- CURLOPT_TCP_KEEPINTVL.pdf \
- CURLOPT_TCP_NODELAY.pdf \
- CURLOPT_TELNETOPTIONS.pdf \
- CURLOPT_TFTP_BLKSIZE.pdf \
- CURLOPT_TFTP_NO_OPTIONS.pdf \
- CURLOPT_TIMECONDITION.pdf \
- CURLOPT_TIMEOUT.pdf \
- CURLOPT_TIMEOUT_MS.pdf \
- CURLOPT_TIMEVALUE.pdf \
- CURLOPT_TLSAUTH_PASSWORD.pdf \
- CURLOPT_TLSAUTH_TYPE.pdf \
- CURLOPT_TLSAUTH_USERNAME.pdf \
- CURLOPT_TRANSFERTEXT.pdf \
- CURLOPT_TRANSFER_ENCODING.pdf \
- CURLOPT_UNIX_SOCKET_PATH.pdf \
- CURLOPT_UNRESTRICTED_AUTH.pdf \
- CURLOPT_UPLOAD.pdf \
- CURLOPT_URL.pdf \
- CURLOPT_USERAGENT.pdf \
- CURLOPT_USERNAME.pdf \
- CURLOPT_USERPWD.pdf \
- CURLOPT_USE_SSL.pdf \
- CURLOPT_VERBOSE.pdf \
- CURLOPT_WILDCARDMATCH.pdf \
- CURLOPT_WRITEDATA.pdf \
- CURLOPT_WRITEFUNCTION.pdf \
- CURLOPT_XFERINFODATA.pdf \
- CURLOPT_XFERINFOFUNCTION.pdf \
- CURLOPT_XOAUTH2_BEARER.pdf
+HTMLPAGES = $(man_MANS:.3=.html)
-CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
+PDFPAGES = $(man_MANS:.3=.pdf)
-EXTRA_DIST = $(man_MANS)
+CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(man_DISTMANS)
+
+EXTRA_DIST = $(man_MANS) CMakeLists.txt
MAN2HTML= roffit --mandir=. $< >$@
SUFFIXES = .3 .html
diff --git a/docs/libcurl/opts/Makefile.in b/docs/libcurl/opts/Makefile.in
index 0296eb37..d0b8ec87 100644
--- a/docs/libcurl/opts/Makefile.in
+++ b/docs/libcurl/opts/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -35,6 +35,8 @@
# KIND, either express or implied.
#
###########################################################################
+
+# Shared between Makefile.am and CMakeLists.txt
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -111,7 +113,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = docs/libcurl/opts
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -132,8 +135,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -188,7 +190,7 @@ man3dir = $(mandir)/man3
am__installdirs = "$(DESTDIR)$(man3dir)"
MANS = $(man_MANS)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -204,6 +206,12 @@ 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@
@@ -243,6 +251,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -255,6 +265,7 @@ 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@
@@ -382,944 +393,330 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies
man_MANS = \
- CURLINFO_ACTIVESOCKET.3 \
- CURLINFO_APPCONNECT_TIME.3 \
- CURLINFO_CERTINFO.3 \
- CURLINFO_CONDITION_UNMET.3 \
- CURLINFO_CONNECT_TIME.3 \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 \
- CURLINFO_CONTENT_LENGTH_UPLOAD.3 \
- CURLINFO_CONTENT_TYPE.3 \
- CURLINFO_COOKIELIST.3 \
- CURLINFO_EFFECTIVE_URL.3 \
- CURLINFO_FILETIME.3 \
- CURLINFO_FTP_ENTRY_PATH.3 \
- CURLINFO_HEADER_SIZE.3 \
- CURLINFO_HTTPAUTH_AVAIL.3 \
- CURLINFO_HTTP_CONNECTCODE.3 \
- CURLINFO_HTTP_VERSION.3 \
- CURLINFO_LASTSOCKET.3 \
- CURLINFO_LOCAL_IP.3 \
- CURLINFO_LOCAL_PORT.3 \
- CURLINFO_NAMELOOKUP_TIME.3 \
- CURLINFO_NUM_CONNECTS.3 \
- CURLINFO_OS_ERRNO.3 \
- CURLINFO_PRETRANSFER_TIME.3 \
- CURLINFO_PRIMARY_IP.3 \
- CURLINFO_PRIMARY_PORT.3 \
- CURLINFO_PRIVATE.3 \
- CURLINFO_PROTOCOL.3 \
- CURLINFO_PROXYAUTH_AVAIL.3 \
- CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
- CURLINFO_REDIRECT_COUNT.3 \
- CURLINFO_REDIRECT_TIME.3 \
- CURLINFO_REDIRECT_URL.3 \
- CURLINFO_REQUEST_SIZE.3 \
- CURLINFO_RESPONSE_CODE.3 \
- CURLINFO_RTSP_CLIENT_CSEQ.3 \
- CURLINFO_RTSP_CSEQ_RECV.3 \
- CURLINFO_RTSP_SERVER_CSEQ.3 \
- CURLINFO_RTSP_SESSION_ID.3 \
- CURLINFO_SCHEME.3 \
- CURLINFO_SIZE_DOWNLOAD.3 \
- CURLINFO_SIZE_UPLOAD.3 \
- CURLINFO_SPEED_DOWNLOAD.3 \
- CURLINFO_SPEED_UPLOAD.3 \
- CURLINFO_SSL_ENGINES.3 \
- CURLINFO_SSL_VERIFYRESULT.3 \
- CURLINFO_STARTTRANSFER_TIME.3 \
- CURLINFO_TLS_SESSION.3 \
- CURLINFO_TLS_SSL_PTR.3 \
- CURLINFO_TOTAL_TIME.3 \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
- CURLMOPT_MAXCONNECTS.3 \
- CURLMOPT_MAX_HOST_CONNECTIONS.3 \
- CURLMOPT_MAX_PIPELINE_LENGTH.3 \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \
- CURLMOPT_PIPELINING.3 \
- CURLMOPT_PIPELINING_SERVER_BL.3 \
- CURLMOPT_PIPELINING_SITE_BL.3 \
- CURLMOPT_PUSHDATA.3 \
- CURLMOPT_PUSHFUNCTION.3 \
- CURLMOPT_SOCKETDATA.3 \
- CURLMOPT_SOCKETFUNCTION.3 \
- CURLMOPT_TIMERDATA.3 \
- CURLMOPT_TIMERFUNCTION.3 \
- CURLOPT_ACCEPTTIMEOUT_MS.3 \
- CURLOPT_ACCEPT_ENCODING.3 \
- CURLOPT_ADDRESS_SCOPE.3 \
- CURLOPT_APPEND.3 \
- CURLOPT_AUTOREFERER.3 \
- CURLOPT_BUFFERSIZE.3 \
- CURLOPT_CAINFO.3 \
- CURLOPT_CAPATH.3 \
- CURLOPT_CERTINFO.3 \
- CURLOPT_CHUNK_BGN_FUNCTION.3 \
- CURLOPT_CHUNK_DATA.3 \
- CURLOPT_CHUNK_END_FUNCTION.3 \
- CURLOPT_CLOSESOCKETDATA.3 \
- CURLOPT_CLOSESOCKETFUNCTION.3 \
- CURLOPT_CONNECTTIMEOUT.3 \
- CURLOPT_CONNECTTIMEOUT_MS.3 \
- CURLOPT_CONNECT_ONLY.3 \
- CURLOPT_CONNECT_TO.3 \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.3 \
- CURLOPT_COOKIE.3 \
- CURLOPT_COOKIEFILE.3 \
- CURLOPT_COOKIEJAR.3 \
- CURLOPT_COOKIELIST.3 \
- CURLOPT_COOKIESESSION.3 \
- CURLOPT_COPYPOSTFIELDS.3 \
- CURLOPT_CRLF.3 \
- CURLOPT_CRLFILE.3 \
- CURLOPT_CUSTOMREQUEST.3 \
- CURLOPT_DEBUGDATA.3 \
- CURLOPT_DEBUGFUNCTION.3 \
- CURLOPT_DEFAULT_PROTOCOL.3 \
- CURLOPT_DIRLISTONLY.3 \
- CURLOPT_DNS_CACHE_TIMEOUT.3 \
- CURLOPT_DNS_INTERFACE.3 \
- CURLOPT_DNS_LOCAL_IP4.3 \
- CURLOPT_DNS_LOCAL_IP6.3 \
- CURLOPT_DNS_SERVERS.3 \
- CURLOPT_DNS_USE_GLOBAL_CACHE.3 \
- CURLOPT_EGDSOCKET.3 \
- CURLOPT_ERRORBUFFER.3 \
- CURLOPT_EXPECT_100_TIMEOUT_MS.3 \
- CURLOPT_FAILONERROR.3 \
- CURLOPT_FILETIME.3 \
- CURLOPT_FNMATCH_DATA.3 \
- CURLOPT_FNMATCH_FUNCTION.3 \
- CURLOPT_FOLLOWLOCATION.3 \
- CURLOPT_FORBID_REUSE.3 \
- CURLOPT_FRESH_CONNECT.3 \
- CURLOPT_FTPPORT.3 \
- CURLOPT_FTPSSLAUTH.3 \
- CURLOPT_FTP_ACCOUNT.3 \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.3 \
- CURLOPT_FTP_CREATE_MISSING_DIRS.3 \
- CURLOPT_FTP_FILEMETHOD.3 \
- CURLOPT_FTP_RESPONSE_TIMEOUT.3 \
- CURLOPT_FTP_SKIP_PASV_IP.3 \
- CURLOPT_FTP_SSL_CCC.3 \
- CURLOPT_FTP_USE_EPRT.3 \
- CURLOPT_FTP_USE_EPSV.3 \
- CURLOPT_FTP_USE_PRET.3 \
- CURLOPT_GSSAPI_DELEGATION.3 \
- CURLOPT_HEADER.3 \
- CURLOPT_HEADERDATA.3 \
- CURLOPT_HEADERFUNCTION.3 \
- CURLOPT_HEADEROPT.3 \
- CURLOPT_HTTP200ALIASES.3 \
- CURLOPT_HTTPAUTH.3 \
- CURLOPT_HTTPGET.3 \
- CURLOPT_HTTPHEADER.3 \
- CURLOPT_HTTPPOST.3 \
- CURLOPT_HTTPPROXYTUNNEL.3 \
- CURLOPT_HTTP_CONTENT_DECODING.3 \
- CURLOPT_HTTP_TRANSFER_DECODING.3 \
- CURLOPT_HTTP_VERSION.3 \
- CURLOPT_IGNORE_CONTENT_LENGTH.3 \
- CURLOPT_INFILESIZE.3 \
- CURLOPT_INFILESIZE_LARGE.3 \
- CURLOPT_INTERFACE.3 \
- CURLOPT_INTERLEAVEDATA.3 \
- CURLOPT_INTERLEAVEFUNCTION.3 \
- CURLOPT_IOCTLDATA.3 \
- CURLOPT_IOCTLFUNCTION.3 \
- CURLOPT_IPRESOLVE.3 \
- CURLOPT_ISSUERCERT.3 \
- CURLOPT_KEEP_SENDING_ON_ERROR.3 \
- CURLOPT_KEYPASSWD.3 \
- CURLOPT_KRBLEVEL.3 \
- CURLOPT_LOCALPORT.3 \
- CURLOPT_LOCALPORTRANGE.3 \
- CURLOPT_LOGIN_OPTIONS.3 \
- CURLOPT_LOW_SPEED_LIMIT.3 \
- CURLOPT_LOW_SPEED_TIME.3 \
- CURLOPT_MAIL_AUTH.3 \
- CURLOPT_MAIL_FROM.3 \
- CURLOPT_MAIL_RCPT.3 \
- CURLOPT_MAXCONNECTS.3 \
- CURLOPT_MAXFILESIZE.3 \
- CURLOPT_MAXFILESIZE_LARGE.3 \
- CURLOPT_MAXREDIRS.3 \
- CURLOPT_MAX_RECV_SPEED_LARGE.3 \
- CURLOPT_MAX_SEND_SPEED_LARGE.3 \
- CURLOPT_NETRC.3 \
- CURLOPT_NETRC_FILE.3 \
- CURLOPT_NEW_DIRECTORY_PERMS.3 \
- CURLOPT_NEW_FILE_PERMS.3 \
- CURLOPT_NOBODY.3 \
- CURLOPT_NOPROGRESS.3 \
- CURLOPT_NOPROXY.3 \
- CURLOPT_NOSIGNAL.3 \
- CURLOPT_OPENSOCKETDATA.3 \
- CURLOPT_OPENSOCKETFUNCTION.3 \
- CURLOPT_PASSWORD.3 \
- CURLOPT_PATH_AS_IS.3 \
- CURLOPT_PINNEDPUBLICKEY.3 \
- CURLOPT_PIPEWAIT.3 \
- CURLOPT_PORT.3 \
- CURLOPT_POST.3 \
- CURLOPT_POSTFIELDS.3 \
- CURLOPT_POSTFIELDSIZE.3 \
- CURLOPT_POSTFIELDSIZE_LARGE.3 \
- CURLOPT_POSTQUOTE.3 \
- CURLOPT_POSTREDIR.3 \
- CURLOPT_PREQUOTE.3 \
- CURLOPT_PRE_PROXY.3 \
- CURLOPT_PRIVATE.3 \
- CURLOPT_PROGRESSDATA.3 \
- CURLOPT_PROGRESSFUNCTION.3 \
- CURLOPT_PROTOCOLS.3 \
- CURLOPT_PROXY.3 \
- CURLOPT_PROXYAUTH.3 \
- CURLOPT_PROXYHEADER.3 \
- CURLOPT_PROXYPASSWORD.3 \
- CURLOPT_PROXYPORT.3 \
- CURLOPT_PROXYTYPE.3 \
- CURLOPT_PROXYUSERNAME.3 \
- CURLOPT_PROXYUSERPWD.3 \
- CURLOPT_PROXY_CAINFO.3 \
- CURLOPT_PROXY_CAPATH.3 \
- CURLOPT_PROXY_CRLFILE.3 \
- CURLOPT_PROXY_KEYPASSWD.3 \
- CURLOPT_PROXY_PINNEDPUBLICKEY.3 \
- CURLOPT_PROXY_SERVICE_NAME.3 \
- CURLOPT_PROXY_SSLCERT.3 \
- CURLOPT_PROXY_SSLCERTTYPE.3 \
- CURLOPT_PROXY_SSLKEY.3 \
- CURLOPT_PROXY_SSLKEYTYPE.3 \
- CURLOPT_PROXY_SSLVERSION.3 \
- CURLOPT_PROXY_SSL_CIPHER_LIST.3 \
- CURLOPT_PROXY_SSL_OPTIONS.3 \
- CURLOPT_PROXY_SSL_VERIFYHOST.3 \
- CURLOPT_PROXY_SSL_VERIFYPEER.3 \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.3 \
- CURLOPT_PROXY_TLSAUTH_TYPE.3 \
- CURLOPT_PROXY_TLSAUTH_USERNAME.3 \
- CURLOPT_PROXY_TRANSFER_MODE.3 \
- CURLOPT_PUT.3 \
- CURLOPT_QUOTE.3 \
- CURLOPT_RANDOM_FILE.3 \
- CURLOPT_RANGE.3 \
- CURLOPT_READDATA.3 \
- CURLOPT_READFUNCTION.3 \
- CURLOPT_REDIR_PROTOCOLS.3 \
- CURLOPT_REFERER.3 \
- CURLOPT_RESOLVE.3 \
- CURLOPT_RESUME_FROM.3 \
- CURLOPT_RESUME_FROM_LARGE.3 \
- CURLOPT_RTSP_CLIENT_CSEQ.3 \
- CURLOPT_RTSP_REQUEST.3 \
- CURLOPT_RTSP_SERVER_CSEQ.3 \
- CURLOPT_RTSP_SESSION_ID.3 \
- CURLOPT_RTSP_STREAM_URI.3 \
- CURLOPT_RTSP_TRANSPORT.3 \
- CURLOPT_SASL_IR.3 \
- CURLOPT_SEEKDATA.3 \
- CURLOPT_SEEKFUNCTION.3 \
- CURLOPT_SERVICE_NAME.3 \
- CURLOPT_SHARE.3 \
- CURLOPT_SOCKOPTDATA.3 \
- CURLOPT_SOCKOPTFUNCTION.3 \
- CURLOPT_SOCKS5_GSSAPI_NEC.3 \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.3 \
- CURLOPT_SSH_AUTH_TYPES.3 \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 \
- CURLOPT_SSH_KEYDATA.3 \
- CURLOPT_SSH_KEYFUNCTION.3 \
- CURLOPT_SSH_KNOWNHOSTS.3 \
- CURLOPT_SSH_PRIVATE_KEYFILE.3 \
- CURLOPT_SSH_PUBLIC_KEYFILE.3 \
- CURLOPT_SSLCERT.3 \
- CURLOPT_SSLCERTTYPE.3 \
- CURLOPT_SSLENGINE.3 \
- CURLOPT_SSLENGINE_DEFAULT.3 \
- CURLOPT_SSLKEY.3 \
- CURLOPT_SSLKEYTYPE.3 \
- CURLOPT_SSLVERSION.3 \
- CURLOPT_SSL_CIPHER_LIST.3 \
- CURLOPT_SSL_CTX_DATA.3 \
- CURLOPT_SSL_CTX_FUNCTION.3 \
- CURLOPT_SSL_ENABLE_ALPN.3 \
- CURLOPT_SSL_ENABLE_NPN.3 \
- CURLOPT_SSL_FALSESTART.3 \
- CURLOPT_SSL_OPTIONS.3 \
- CURLOPT_SSL_SESSIONID_CACHE.3 \
- CURLOPT_SSL_VERIFYHOST.3 \
- CURLOPT_SSL_VERIFYPEER.3 \
- CURLOPT_SSL_VERIFYSTATUS.3 \
- CURLOPT_STDERR.3 \
- CURLOPT_STREAM_DEPENDS.3 \
- CURLOPT_STREAM_DEPENDS_E.3 \
- CURLOPT_STREAM_WEIGHT.3 \
- CURLOPT_TCP_FASTOPEN.3 \
- CURLOPT_TCP_KEEPALIVE.3 \
- CURLOPT_TCP_KEEPIDLE.3 \
- CURLOPT_TCP_KEEPINTVL.3 \
- CURLOPT_TCP_NODELAY.3 \
- CURLOPT_TELNETOPTIONS.3 \
- CURLOPT_TFTP_BLKSIZE.3 \
- CURLOPT_TFTP_NO_OPTIONS.3 \
- CURLOPT_TIMECONDITION.3 \
- CURLOPT_TIMEOUT.3 \
- CURLOPT_TIMEOUT_MS.3 \
- CURLOPT_TIMEVALUE.3 \
- CURLOPT_TLSAUTH_PASSWORD.3 \
- CURLOPT_TLSAUTH_TYPE.3 \
- CURLOPT_TLSAUTH_USERNAME.3 \
- CURLOPT_TRANSFERTEXT.3 \
- CURLOPT_TRANSFER_ENCODING.3 \
- CURLOPT_UNIX_SOCKET_PATH.3 \
- CURLOPT_UNRESTRICTED_AUTH.3 \
- CURLOPT_UPLOAD.3 \
- CURLOPT_URL.3 \
- CURLOPT_USERAGENT.3 \
- CURLOPT_USERNAME.3 \
- CURLOPT_USERPWD.3 \
- CURLOPT_USE_SSL.3 \
- CURLOPT_VERBOSE.3 \
- CURLOPT_WILDCARDMATCH.3 \
- CURLOPT_WRITEDATA.3 \
- CURLOPT_WRITEFUNCTION.3 \
- CURLOPT_XFERINFODATA.3 \
- CURLOPT_XFERINFOFUNCTION.3 \
- CURLOPT_XOAUTH2_BEARER.3
-
-HTMLPAGES = \
- CURLINFO_ACTIVESOCKET.html \
- CURLINFO_APPCONNECT_TIME.html \
- CURLINFO_CERTINFO.html \
- CURLINFO_CONDITION_UNMET.html \
- CURLINFO_CONNECT_TIME.html \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.html \
- CURLINFO_CONTENT_LENGTH_UPLOAD.html \
- CURLINFO_CONTENT_TYPE.html \
- CURLINFO_COOKIELIST.html \
- CURLINFO_EFFECTIVE_URL.html \
- CURLINFO_FILETIME.html \
- CURLINFO_FTP_ENTRY_PATH.html \
- CURLINFO_HEADER_SIZE.html \
- CURLINFO_HTTPAUTH_AVAIL.html \
- CURLINFO_HTTP_CONNECTCODE.html \
- CURLINFO_HTTP_VERSION.html \
- CURLINFO_LASTSOCKET.html \
- CURLINFO_LOCAL_IP.html \
- CURLINFO_LOCAL_PORT.html \
- CURLINFO_NAMELOOKUP_TIME.html \
- CURLINFO_NUM_CONNECTS.html \
- CURLINFO_OS_ERRNO.html \
- CURLINFO_PRETRANSFER_TIME.html \
- CURLINFO_PRIMARY_IP.html \
- CURLINFO_PRIMARY_PORT.html \
- CURLINFO_PRIVATE.html \
- CURLINFO_PROTOCOL.html \
- CURLINFO_PROXYAUTH_AVAIL.html \
- CURLINFO_PROXY_SSL_VERIFYRESULT.html \
- CURLINFO_REDIRECT_COUNT.html \
- CURLINFO_REDIRECT_TIME.html \
- CURLINFO_REDIRECT_URL.html \
- CURLINFO_REQUEST_SIZE.html \
- CURLINFO_RESPONSE_CODE.html \
- CURLINFO_RTSP_CLIENT_CSEQ.html \
- CURLINFO_RTSP_CSEQ_RECV.html \
- CURLINFO_RTSP_SERVER_CSEQ.html \
- CURLINFO_RTSP_SESSION_ID.html \
- CURLINFO_SCHEME.html \
- CURLINFO_SIZE_DOWNLOAD.html \
- CURLINFO_SIZE_UPLOAD.html \
- CURLINFO_SPEED_DOWNLOAD.html \
- CURLINFO_SPEED_UPLOAD.html \
- CURLINFO_SSL_ENGINES.html \
- CURLINFO_SSL_VERIFYRESULT.html \
- CURLINFO_STARTTRANSFER_TIME.html \
- CURLINFO_TLS_SESSION.html \
- CURLINFO_TLS_SSL_PTR.html \
- CURLINFO_TOTAL_TIME.html \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html \
- CURLMOPT_MAXCONNECTS.html \
- CURLMOPT_MAX_HOST_CONNECTIONS.html \
- CURLMOPT_MAX_PIPELINE_LENGTH.html \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.html \
- CURLMOPT_PIPELINING.html \
- CURLMOPT_PIPELINING_SERVER_BL.html \
- CURLMOPT_PIPELINING_SITE_BL.html \
- CURLMOPT_PUSHDATA.html \
- CURLMOPT_PUSHFUNCTION.html \
- CURLMOPT_SOCKETDATA.html \
- CURLMOPT_SOCKETFUNCTION.html \
- CURLMOPT_TIMERDATA.html \
- CURLMOPT_TIMERFUNCTION.html \
- CURLOPT_ACCEPTTIMEOUT_MS.html \
- CURLOPT_ACCEPT_ENCODING.html \
- CURLOPT_ADDRESS_SCOPE.html \
- CURLOPT_APPEND.html \
- CURLOPT_AUTOREFERER.html \
- CURLOPT_BUFFERSIZE.html \
- CURLOPT_CAINFO.html \
- CURLOPT_CAPATH.html \
- CURLOPT_CERTINFO.html \
- CURLOPT_CHUNK_BGN_FUNCTION.html \
- CURLOPT_CHUNK_DATA.html \
- CURLOPT_CHUNK_END_FUNCTION.html \
- CURLOPT_CLOSESOCKETDATA.html \
- CURLOPT_CLOSESOCKETFUNCTION.html \
- CURLOPT_CONNECTTIMEOUT.html \
- CURLOPT_CONNECTTIMEOUT_MS.html \
- CURLOPT_CONNECT_ONLY.html \
- CURLOPT_CONNECT_TO.html \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.html \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.html \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.html \
- CURLOPT_COOKIE.html \
- CURLOPT_COOKIEFILE.html \
- CURLOPT_COOKIEJAR.html \
- CURLOPT_COOKIELIST.html \
- CURLOPT_COOKIESESSION.html \
- CURLOPT_COPYPOSTFIELDS.html \
- CURLOPT_CRLF.html \
- CURLOPT_CRLFILE.html \
- CURLOPT_CUSTOMREQUEST.html \
- CURLOPT_DEBUGDATA.html \
- CURLOPT_DEBUGFUNCTION.html \
- CURLOPT_DEFAULT_PROTOCOL.html \
- CURLOPT_DIRLISTONLY.html \
- CURLOPT_DNS_CACHE_TIMEOUT.html \
- CURLOPT_DNS_INTERFACE.html \
- CURLOPT_DNS_LOCAL_IP4.html \
- CURLOPT_DNS_LOCAL_IP6.html \
- CURLOPT_DNS_SERVERS.html \
- CURLOPT_DNS_USE_GLOBAL_CACHE.html \
- CURLOPT_EGDSOCKET.html \
- CURLOPT_ERRORBUFFER.html \
- CURLOPT_EXPECT_100_TIMEOUT_MS.html \
- CURLOPT_FAILONERROR.html \
- CURLOPT_FILETIME.html \
- CURLOPT_FNMATCH_DATA.html \
- CURLOPT_FNMATCH_FUNCTION.html \
- CURLOPT_FOLLOWLOCATION.html \
- CURLOPT_FORBID_REUSE.html \
- CURLOPT_FRESH_CONNECT.html \
- CURLOPT_FTPPORT.html \
- CURLOPT_FTPSSLAUTH.html \
- CURLOPT_FTP_ACCOUNT.html \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.html \
- CURLOPT_FTP_CREATE_MISSING_DIRS.html \
- CURLOPT_FTP_FILEMETHOD.html \
- CURLOPT_FTP_RESPONSE_TIMEOUT.html \
- CURLOPT_FTP_SKIP_PASV_IP.html \
- CURLOPT_FTP_SSL_CCC.html \
- CURLOPT_FTP_USE_EPRT.html \
- CURLOPT_FTP_USE_EPSV.html \
- CURLOPT_FTP_USE_PRET.html \
- CURLOPT_GSSAPI_DELEGATION.html \
- CURLOPT_HEADER.html \
- CURLOPT_HEADERDATA.html \
- CURLOPT_HEADERFUNCTION.html \
- CURLOPT_HEADEROPT.html \
- CURLOPT_HTTP200ALIASES.html \
- CURLOPT_HTTPAUTH.html \
- CURLOPT_HTTPGET.html \
- CURLOPT_HTTPHEADER.html \
- CURLOPT_HTTPPOST.html \
- CURLOPT_HTTPPROXYTUNNEL.html \
- CURLOPT_HTTP_CONTENT_DECODING.html \
- CURLOPT_HTTP_TRANSFER_DECODING.html \
- CURLOPT_HTTP_VERSION.html \
- CURLOPT_IGNORE_CONTENT_LENGTH.html \
- CURLOPT_INFILESIZE.html \
- CURLOPT_INFILESIZE_LARGE.html \
- CURLOPT_INTERFACE.html \
- CURLOPT_INTERLEAVEDATA.html \
- CURLOPT_INTERLEAVEFUNCTION.html \
- CURLOPT_IOCTLDATA.html \
- CURLOPT_IOCTLFUNCTION.html \
- CURLOPT_IPRESOLVE.html \
- CURLOPT_ISSUERCERT.html \
- CURLOPT_KEEP_SENDING_ON_ERROR.html \
- CURLOPT_KEYPASSWD.html \
- CURLOPT_KRBLEVEL.html \
- CURLOPT_LOCALPORT.html \
- CURLOPT_LOCALPORTRANGE.html \
- CURLOPT_LOGIN_OPTIONS.html \
- CURLOPT_LOW_SPEED_LIMIT.html \
- CURLOPT_LOW_SPEED_TIME.html \
- CURLOPT_MAIL_AUTH.html \
- CURLOPT_MAIL_FROM.html \
- CURLOPT_MAIL_RCPT.html \
- CURLOPT_MAXCONNECTS.html \
- CURLOPT_MAXFILESIZE.html \
- CURLOPT_MAXFILESIZE_LARGE.html \
- CURLOPT_MAXREDIRS.html \
- CURLOPT_MAX_RECV_SPEED_LARGE.html \
- CURLOPT_MAX_SEND_SPEED_LARGE.html \
- CURLOPT_NETRC.html \
- CURLOPT_NETRC_FILE.html \
- CURLOPT_NEW_DIRECTORY_PERMS.html \
- CURLOPT_NEW_FILE_PERMS.html \
- CURLOPT_NOBODY.html \
- CURLOPT_NOPROGRESS.html \
- CURLOPT_NOPROXY.html \
- CURLOPT_NOSIGNAL.html \
- CURLOPT_OPENSOCKETDATA.html \
- CURLOPT_OPENSOCKETFUNCTION.html \
- CURLOPT_PASSWORD.html \
- CURLOPT_PATH_AS_IS.html \
- CURLOPT_PINNEDPUBLICKEY.html \
- CURLOPT_PIPEWAIT.html \
- CURLOPT_PORT.html \
- CURLOPT_POST.html \
- CURLOPT_POSTFIELDS.html \
- CURLOPT_POSTFIELDSIZE.html \
- CURLOPT_POSTFIELDSIZE_LARGE.html \
- CURLOPT_POSTQUOTE.html \
- CURLOPT_POSTREDIR.html \
- CURLOPT_PREQUOTE.html \
- CURLOPT_PRE_PROXY.html \
- CURLOPT_PRIVATE.html \
- CURLOPT_PROGRESSDATA.html \
- CURLOPT_PROGRESSFUNCTION.html \
- CURLOPT_PROTOCOLS.html \
- CURLOPT_PROXY.html \
- CURLOPT_PROXYAUTH.html \
- CURLOPT_PROXYHEADER.html \
- CURLOPT_PROXYPASSWORD.html \
- CURLOPT_PROXYPORT.html \
- CURLOPT_PROXYTYPE.html \
- CURLOPT_PROXYUSERNAME.html \
- CURLOPT_PROXYUSERPWD.html \
- CURLOPT_PROXY_CAINFO.html \
- CURLOPT_PROXY_CAPATH.html \
- CURLOPT_PROXY_CRLFILE.html \
- CURLOPT_PROXY_KEYPASSWD.html \
- CURLOPT_PROXY_PINNEDPUBLICKEY.html \
- CURLOPT_PROXY_SERVICE_NAME.html \
- CURLOPT_PROXY_SSLCERT.html \
- CURLOPT_PROXY_SSLCERTTYPE.html \
- CURLOPT_PROXY_SSLKEY.html \
- CURLOPT_PROXY_SSLKEYTYPE.html \
- CURLOPT_PROXY_SSLVERSION.html \
- CURLOPT_PROXY_SSL_CIPHER_LIST.html \
- CURLOPT_PROXY_SSL_OPTIONS.html \
- CURLOPT_PROXY_SSL_VERIFYHOST.html \
- CURLOPT_PROXY_SSL_VERIFYPEER.html \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.html \
- CURLOPT_PROXY_TLSAUTH_TYPE.html \
- CURLOPT_PROXY_TLSAUTH_USERNAME.html \
- CURLOPT_PROXY_TRANSFER_MODE.html \
- CURLOPT_PUT.html \
- CURLOPT_QUOTE.html \
- CURLOPT_RANDOM_FILE.html \
- CURLOPT_RANGE.html \
- CURLOPT_READDATA.html \
- CURLOPT_READFUNCTION.html \
- CURLOPT_REDIR_PROTOCOLS.html \
- CURLOPT_REFERER.html \
- CURLOPT_RESOLVE.html \
- CURLOPT_RESUME_FROM.html \
- CURLOPT_RESUME_FROM_LARGE.html \
- CURLOPT_RTSP_CLIENT_CSEQ.html \
- CURLOPT_RTSP_REQUEST.html \
- CURLOPT_RTSP_SERVER_CSEQ.html \
- CURLOPT_RTSP_SESSION_ID.html \
- CURLOPT_RTSP_STREAM_URI.html \
- CURLOPT_RTSP_TRANSPORT.html \
- CURLOPT_SASL_IR.html \
- CURLOPT_SEEKDATA.html \
- CURLOPT_SEEKFUNCTION.html \
- CURLOPT_SERVICE_NAME.html \
- CURLOPT_SHARE.html \
- CURLOPT_SOCKOPTDATA.html \
- CURLOPT_SOCKOPTFUNCTION.html \
- CURLOPT_SOCKS5_GSSAPI_NEC.html \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.html \
- CURLOPT_SSH_AUTH_TYPES.html \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html \
- CURLOPT_SSH_KEYDATA.html \
- CURLOPT_SSH_KEYFUNCTION.html \
- CURLOPT_SSH_KNOWNHOSTS.html \
- CURLOPT_SSH_PRIVATE_KEYFILE.html \
- CURLOPT_SSH_PUBLIC_KEYFILE.html \
- CURLOPT_SSLCERT.html \
- CURLOPT_SSLCERTTYPE.html \
- CURLOPT_SSLENGINE.html \
- CURLOPT_SSLENGINE_DEFAULT.html \
- CURLOPT_SSLKEY.html \
- CURLOPT_SSLKEYTYPE.html \
- CURLOPT_SSLVERSION.html \
- CURLOPT_SSL_CIPHER_LIST.html \
- CURLOPT_SSL_CTX_DATA.html \
- CURLOPT_SSL_CTX_FUNCTION.html \
- CURLOPT_SSL_ENABLE_ALPN.html \
- CURLOPT_SSL_ENABLE_NPN.html \
- CURLOPT_SSL_FALSESTART.html \
- CURLOPT_SSL_OPTIONS.html \
- CURLOPT_SSL_SESSIONID_CACHE.html \
- CURLOPT_SSL_VERIFYHOST.html \
- CURLOPT_SSL_VERIFYPEER.html \
- CURLOPT_SSL_VERIFYSTATUS.html \
- CURLOPT_STDERR.html \
- CURLOPT_STREAM_DEPENDS.html \
- CURLOPT_STREAM_DEPENDS_E.html \
- CURLOPT_STREAM_WEIGHT.html \
- CURLOPT_TCP_FASTOPEN.html \
- CURLOPT_TCP_KEEPALIVE.html \
- CURLOPT_TCP_KEEPIDLE.html \
- CURLOPT_TCP_KEEPINTVL.html \
- CURLOPT_TCP_NODELAY.html \
- CURLOPT_TELNETOPTIONS.html \
- CURLOPT_TFTP_BLKSIZE.html \
- CURLOPT_TFTP_NO_OPTIONS.html \
- CURLOPT_TIMECONDITION.html \
- CURLOPT_TIMEOUT.html \
- CURLOPT_TIMEOUT_MS.html \
- CURLOPT_TIMEVALUE.html \
- CURLOPT_TLSAUTH_PASSWORD.html \
- CURLOPT_TLSAUTH_TYPE.html \
- CURLOPT_TLSAUTH_USERNAME.html \
- CURLOPT_TRANSFERTEXT.html \
- CURLOPT_TRANSFER_ENCODING.html \
- CURLOPT_UNIX_SOCKET_PATH.html \
- CURLOPT_UNRESTRICTED_AUTH.html \
- CURLOPT_UPLOAD.html \
- CURLOPT_URL.html \
- CURLOPT_USERAGENT.html \
- CURLOPT_USERNAME.html \
- CURLOPT_USERPWD.html \
- CURLOPT_USE_SSL.html \
- CURLOPT_VERBOSE.html \
- CURLOPT_WILDCARDMATCH.html \
- CURLOPT_WRITEDATA.html \
- CURLOPT_WRITEFUNCTION.html \
- CURLOPT_XFERINFODATA.html \
- CURLOPT_XFERINFOFUNCTION.html \
- CURLOPT_XOAUTH2_BEARER.html
-
-PDFPAGES = \
- CURLINFO_ACTIVESOCKET.pdf \
- CURLINFO_APPCONNECT_TIME.pdf \
- CURLINFO_CERTINFO.pdf \
- CURLINFO_CONDITION_UNMET.pdf \
- CURLINFO_CONNECT_TIME.pdf \
- CURLINFO_CONTENT_LENGTH_DOWNLOAD.pdf \
- CURLINFO_CONTENT_LENGTH_UPLOAD.pdf \
- CURLINFO_CONTENT_TYPE.pdf \
- CURLINFO_COOKIELIST.pdf \
- CURLINFO_EFFECTIVE_URL.pdf \
- CURLINFO_FILETIME.pdf \
- CURLINFO_FTP_ENTRY_PATH.pdf \
- CURLINFO_HEADER_SIZE.pdf \
- CURLINFO_HTTPAUTH_AVAIL.pdf \
- CURLINFO_HTTP_CONNECTCODE.pdf \
- CURLINFO_HTTP_VERSION.pdf \
- CURLINFO_LASTSOCKET.pdf \
- CURLINFO_LOCAL_IP.pdf \
- CURLINFO_LOCAL_PORT.pdf \
- CURLINFO_NAMELOOKUP_TIME.pdf \
- CURLINFO_NUM_CONNECTS.pdf \
- CURLINFO_OS_ERRNO.pdf \
- CURLINFO_PRETRANSFER_TIME.pdf \
- CURLINFO_PRIMARY_IP.pdf \
- CURLINFO_PRIMARY_PORT.pdf \
- CURLINFO_PRIVATE.pdf \
- CURLINFO_PROTOCOL.pdf \
- CURLINFO_PROXYAUTH_AVAIL.pdf \
- CURLINFO_PROXY_SSL_VERIFYRESULT.pdf \
- CURLINFO_REDIRECT_COUNT.pdf \
- CURLINFO_REDIRECT_TIME.pdf \
- CURLINFO_REDIRECT_URL.pdf \
- CURLINFO_REQUEST_SIZE.pdf \
- CURLINFO_RESPONSE_CODE.pdf \
- CURLINFO_RTSP_CLIENT_CSEQ.pdf \
- CURLINFO_RTSP_CSEQ_RECV.pdf \
- CURLINFO_RTSP_SERVER_CSEQ.pdf \
- CURLINFO_RTSP_SESSION_ID.pdf \
- CURLINFO_SCHEME.pdf \
- CURLINFO_SIZE_DOWNLOAD.pdf \
- CURLINFO_SIZE_UPLOAD.pdf \
- CURLINFO_SPEED_DOWNLOAD.pdf \
- CURLINFO_SPEED_UPLOAD.pdf \
- CURLINFO_SSL_ENGINES.pdf \
- CURLINFO_SSL_VERIFYRESULT.pdf \
- CURLINFO_STARTTRANSFER_TIME.pdf \
- CURLINFO_TLS_SESSION.pdf \
- CURLINFO_TLS_SSL_PTR.pdf \
- CURLINFO_TOTAL_TIME.pdf \
- CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.pdf \
- CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.pdf \
- CURLMOPT_MAXCONNECTS.pdf \
- CURLMOPT_MAX_HOST_CONNECTIONS.pdf \
- CURLMOPT_MAX_PIPELINE_LENGTH.pdf \
- CURLMOPT_MAX_TOTAL_CONNECTIONS.pdf \
- CURLMOPT_PIPELINING.pdf \
- CURLMOPT_PIPELINING_SERVER_BL.pdf \
- CURLMOPT_PIPELINING_SITE_BL.pdf \
- CURLMOPT_PUSHDATA.pdf \
- CURLMOPT_PUSHFUNCTION.pdf \
- CURLMOPT_SOCKETDATA.pdf \
- CURLMOPT_SOCKETFUNCTION.pdf \
- CURLMOPT_TIMERDATA.pdf \
- CURLMOPT_TIMERFUNCTION.pdf \
- CURLOPT_ACCEPTTIMEOUT_MS.pdf \
- CURLOPT_ACCEPT_ENCODING.pdf \
- CURLOPT_ADDRESS_SCOPE.pdf \
- CURLOPT_APPEND.pdf \
- CURLOPT_AUTOREFERER.pdf \
- CURLOPT_BUFFERSIZE.pdf \
- CURLOPT_CAINFO.pdf \
- CURLOPT_CAPATH.pdf \
- CURLOPT_CERTINFO.pdf \
- CURLOPT_CHUNK_BGN_FUNCTION.pdf \
- CURLOPT_CHUNK_DATA.pdf \
- CURLOPT_CHUNK_END_FUNCTION.pdf \
- CURLOPT_CLOSESOCKETDATA.pdf \
- CURLOPT_CLOSESOCKETFUNCTION.pdf \
- CURLOPT_CONNECTTIMEOUT.pdf \
- CURLOPT_CONNECTTIMEOUT_MS.pdf \
- CURLOPT_CONNECT_ONLY.pdf \
- CURLOPT_CONNECT_TO.pdf \
- CURLOPT_CONV_FROM_NETWORK_FUNCTION.pdf \
- CURLOPT_CONV_FROM_UTF8_FUNCTION.pdf \
- CURLOPT_CONV_TO_NETWORK_FUNCTION.pdf \
- CURLOPT_COOKIE.pdf \
- CURLOPT_COOKIEFILE.pdf \
- CURLOPT_COOKIEJAR.pdf \
- CURLOPT_COOKIELIST.pdf \
- CURLOPT_COOKIESESSION.pdf \
- CURLOPT_COPYPOSTFIELDS.pdf \
- CURLOPT_CRLF.pdf \
- CURLOPT_CRLFILE.pdf \
- CURLOPT_CUSTOMREQUEST.pdf \
- CURLOPT_DEBUGDATA.pdf \
- CURLOPT_DEBUGFUNCTION.pdf \
- CURLOPT_DEFAULT_PROTOCOL.pdf \
- CURLOPT_DIRLISTONLY.pdf \
- CURLOPT_DNS_CACHE_TIMEOUT.pdf \
- CURLOPT_DNS_INTERFACE.pdf \
- CURLOPT_DNS_LOCAL_IP4.pdf \
- CURLOPT_DNS_LOCAL_IP6.pdf \
- CURLOPT_DNS_SERVERS.pdf \
- CURLOPT_DNS_USE_GLOBAL_CACHE.pdf \
- CURLOPT_EGDSOCKET.pdf \
- CURLOPT_ERRORBUFFER.pdf \
- CURLOPT_EXPECT_100_TIMEOUT_MS.pdf \
- CURLOPT_FAILONERROR.pdf \
- CURLOPT_FILETIME.pdf \
- CURLOPT_FNMATCH_DATA.pdf \
- CURLOPT_FNMATCH_FUNCTION.pdf \
- CURLOPT_FOLLOWLOCATION.pdf \
- CURLOPT_FORBID_REUSE.pdf \
- CURLOPT_FRESH_CONNECT.pdf \
- CURLOPT_FTPPORT.pdf \
- CURLOPT_FTPSSLAUTH.pdf \
- CURLOPT_FTP_ACCOUNT.pdf \
- CURLOPT_FTP_ALTERNATIVE_TO_USER.pdf \
- CURLOPT_FTP_CREATE_MISSING_DIRS.pdf \
- CURLOPT_FTP_FILEMETHOD.pdf \
- CURLOPT_FTP_RESPONSE_TIMEOUT.pdf \
- CURLOPT_FTP_SKIP_PASV_IP.pdf \
- CURLOPT_FTP_SSL_CCC.pdf \
- CURLOPT_FTP_USE_EPRT.pdf \
- CURLOPT_FTP_USE_EPSV.pdf \
- CURLOPT_FTP_USE_PRET.pdf \
- CURLOPT_GSSAPI_DELEGATION.pdf \
- CURLOPT_HEADER.pdf \
- CURLOPT_HEADERDATA.pdf \
- CURLOPT_HEADERFUNCTION.pdf \
- CURLOPT_HEADEROPT.pdf \
- CURLOPT_HTTP200ALIASES.pdf \
- CURLOPT_HTTPAUTH.pdf \
- CURLOPT_HTTPGET.pdf \
- CURLOPT_HTTPHEADER.pdf \
- CURLOPT_HTTPPOST.pdf \
- CURLOPT_HTTPPROXYTUNNEL.pdf \
- CURLOPT_HTTP_CONTENT_DECODING.pdf \
- CURLOPT_HTTP_TRANSFER_DECODING.pdf \
- CURLOPT_HTTP_VERSION.pdf \
- CURLOPT_IGNORE_CONTENT_LENGTH.pdf \
- CURLOPT_INFILESIZE.pdf \
- CURLOPT_INFILESIZE_LARGE.pdf \
- CURLOPT_INTERFACE.pdf \
- CURLOPT_INTERLEAVEDATA.pdf \
- CURLOPT_INTERLEAVEFUNCTION.pdf \
- CURLOPT_IOCTLDATA.pdf \
- CURLOPT_IOCTLFUNCTION.pdf \
- CURLOPT_IPRESOLVE.pdf \
- CURLOPT_ISSUERCERT.pdf \
- CURLOPT_KEEP_SENDING_ON_ERROR.pdf \
- CURLOPT_KEYPASSWD.pdf \
- CURLOPT_KRBLEVEL.pdf \
- CURLOPT_LOCALPORT.pdf \
- CURLOPT_LOCALPORTRANGE.pdf \
- CURLOPT_LOGIN_OPTIONS.pdf \
- CURLOPT_LOW_SPEED_LIMIT.pdf \
- CURLOPT_LOW_SPEED_TIME.pdf \
- CURLOPT_MAIL_AUTH.pdf \
- CURLOPT_MAIL_FROM.pdf \
- CURLOPT_MAIL_RCPT.pdf \
- CURLOPT_MAXCONNECTS.pdf \
- CURLOPT_MAXFILESIZE.pdf \
- CURLOPT_MAXFILESIZE_LARGE.pdf \
- CURLOPT_MAXREDIRS.pdf \
- CURLOPT_MAX_RECV_SPEED_LARGE.pdf \
- CURLOPT_MAX_SEND_SPEED_LARGE.pdf \
- CURLOPT_NETRC.pdf \
- CURLOPT_NETRC_FILE.pdf \
- CURLOPT_NEW_DIRECTORY_PERMS.pdf \
- CURLOPT_NEW_FILE_PERMS.pdf \
- CURLOPT_NOBODY.pdf \
- CURLOPT_NOPROGRESS.pdf \
- CURLOPT_NOPROXY.pdf \
- CURLOPT_NOSIGNAL.pdf \
- CURLOPT_OPENSOCKETDATA.pdf \
- CURLOPT_OPENSOCKETFUNCTION.pdf \
- CURLOPT_PASSWORD.pdf \
- CURLOPT_PATH_AS_IS.pdf \
- CURLOPT_PINNEDPUBLICKEY.pdf \
- CURLOPT_PIPEWAIT.pdf \
- CURLOPT_PORT.pdf \
- CURLOPT_POST.pdf \
- CURLOPT_POSTFIELDS.pdf \
- CURLOPT_POSTFIELDSIZE.pdf \
- CURLOPT_POSTFIELDSIZE_LARGE.pdf \
- CURLOPT_POSTQUOTE.pdf \
- CURLOPT_POSTREDIR.pdf \
- CURLOPT_PREQUOTE.pdf \
- CURLOPT_PRE_PROXY.pdf \
- CURLOPT_PRIVATE.pdf \
- CURLOPT_PROGRESSDATA.pdf \
- CURLOPT_PROGRESSFUNCTION.pdf \
- CURLOPT_PROTOCOLS.pdf \
- CURLOPT_PROXY.pdf \
- CURLOPT_PROXYAUTH.pdf \
- CURLOPT_PROXYHEADER.pdf \
- CURLOPT_PROXYPASSWORD.pdf \
- CURLOPT_PROXYPORT.pdf \
- CURLOPT_PROXYTYPE.pdf \
- CURLOPT_PROXYUSERNAME.pdf \
- CURLOPT_PROXYUSERPWD.pdf \
- CURLOPT_PROXY_CAINFO.pdf \
- CURLOPT_PROXY_CAPATH.pdf \
- CURLOPT_PROXY_CRLFILE.pdf \
- CURLOPT_PROXY_KEYPASSWD.pdf \
- CURLOPT_PROXY_PINNEDPUBLICKEY.pdf \
- CURLOPT_PROXY_SERVICE_NAME.pdf \
- CURLOPT_PROXY_SSLCERT.pdf \
- CURLOPT_PROXY_SSLCERTTYPE.pdf \
- CURLOPT_PROXY_SSLKEY.pdf \
- CURLOPT_PROXY_SSLKEYTYPE.pdf \
- CURLOPT_PROXY_SSLVERSION.pdf \
- CURLOPT_PROXY_SSL_CIPHER_LIST.pdf \
- CURLOPT_PROXY_SSL_OPTIONS.pdf \
- CURLOPT_PROXY_SSL_VERIFYHOST.pdf \
- CURLOPT_PROXY_SSL_VERIFYPEER.pdf \
- CURLOPT_PROXY_TLSAUTH_PASSWORD.pdf \
- CURLOPT_PROXY_TLSAUTH_TYPE.pdf \
- CURLOPT_PROXY_TLSAUTH_USERNAME.pdf \
- CURLOPT_PROXY_TRANSFER_MODE.pdf \
- CURLOPT_PUT.pdf \
- CURLOPT_QUOTE.pdf \
- CURLOPT_RANDOM_FILE.pdf \
- CURLOPT_RANGE.pdf \
- CURLOPT_READDATA.pdf \
- CURLOPT_READFUNCTION.pdf \
- CURLOPT_REDIR_PROTOCOLS.pdf \
- CURLOPT_REFERER.pdf \
- CURLOPT_RESOLVE.pdf \
- CURLOPT_RESUME_FROM.pdf \
- CURLOPT_RESUME_FROM_LARGE.pdf \
- CURLOPT_RTSP_CLIENT_CSEQ.pdf \
- CURLOPT_RTSP_REQUEST.pdf \
- CURLOPT_RTSP_SERVER_CSEQ.pdf \
- CURLOPT_RTSP_SESSION_ID.pdf \
- CURLOPT_RTSP_STREAM_URI.pdf \
- CURLOPT_RTSP_TRANSPORT.pdf \
- CURLOPT_SASL_IR.pdf \
- CURLOPT_SEEKDATA.pdf \
- CURLOPT_SEEKFUNCTION.pdf \
- CURLOPT_SERVICE_NAME.pdf \
- CURLOPT_SHARE.pdf \
- CURLOPT_SOCKOPTDATA.pdf \
- CURLOPT_SOCKOPTFUNCTION.pdf \
- CURLOPT_SOCKS5_GSSAPI_NEC.pdf \
- CURLOPT_SOCKS5_GSSAPI_SERVICE.pdf \
- CURLOPT_SSH_AUTH_TYPES.pdf \
- CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.pdf \
- CURLOPT_SSH_KEYDATA.pdf \
- CURLOPT_SSH_KEYFUNCTION.pdf \
- CURLOPT_SSH_KNOWNHOSTS.pdf \
- CURLOPT_SSH_PRIVATE_KEYFILE.pdf \
- CURLOPT_SSH_PUBLIC_KEYFILE.pdf \
- CURLOPT_SSLCERT.pdf \
- CURLOPT_SSLCERTTYPE.pdf \
- CURLOPT_SSLENGINE.pdf \
- CURLOPT_SSLENGINE_DEFAULT.pdf \
- CURLOPT_SSLKEY.pdf \
- CURLOPT_SSLKEYTYPE.pdf \
- CURLOPT_SSLVERSION.pdf \
- CURLOPT_SSL_CIPHER_LIST.pdf \
- CURLOPT_SSL_CTX_DATA.pdf \
- CURLOPT_SSL_CTX_FUNCTION.pdf \
- CURLOPT_SSL_ENABLE_ALPN.pdf \
- CURLOPT_SSL_ENABLE_NPN.pdf \
- CURLOPT_SSL_FALSESTART.pdf \
- CURLOPT_SSL_OPTIONS.pdf \
- CURLOPT_SSL_SESSIONID_CACHE.pdf \
- CURLOPT_SSL_VERIFYHOST.pdf \
- CURLOPT_SSL_VERIFYPEER.pdf \
- CURLOPT_SSL_VERIFYSTATUS.pdf \
- CURLOPT_STDERR.pdf \
- CURLOPT_STREAM_DEPENDS.pdf \
- CURLOPT_STREAM_DEPENDS_E.pdf \
- CURLOPT_STREAM_WEIGHT.pdf \
- CURLOPT_TCP_FASTOPEN.pdf \
- CURLOPT_TCP_KEEPALIVE.pdf \
- CURLOPT_TCP_KEEPIDLE.pdf \
- CURLOPT_TCP_KEEPINTVL.pdf \
- CURLOPT_TCP_NODELAY.pdf \
- CURLOPT_TELNETOPTIONS.pdf \
- CURLOPT_TFTP_BLKSIZE.pdf \
- CURLOPT_TFTP_NO_OPTIONS.pdf \
- CURLOPT_TIMECONDITION.pdf \
- CURLOPT_TIMEOUT.pdf \
- CURLOPT_TIMEOUT_MS.pdf \
- CURLOPT_TIMEVALUE.pdf \
- CURLOPT_TLSAUTH_PASSWORD.pdf \
- CURLOPT_TLSAUTH_TYPE.pdf \
- CURLOPT_TLSAUTH_USERNAME.pdf \
- CURLOPT_TRANSFERTEXT.pdf \
- CURLOPT_TRANSFER_ENCODING.pdf \
- CURLOPT_UNIX_SOCKET_PATH.pdf \
- CURLOPT_UNRESTRICTED_AUTH.pdf \
- CURLOPT_UPLOAD.pdf \
- CURLOPT_URL.pdf \
- CURLOPT_USERAGENT.pdf \
- CURLOPT_USERNAME.pdf \
- CURLOPT_USERPWD.pdf \
- CURLOPT_USE_SSL.pdf \
- CURLOPT_VERBOSE.pdf \
- CURLOPT_WILDCARDMATCH.pdf \
- CURLOPT_WRITEDATA.pdf \
- CURLOPT_WRITEFUNCTION.pdf \
- CURLOPT_XFERINFODATA.pdf \
- CURLOPT_XFERINFOFUNCTION.pdf \
- CURLOPT_XOAUTH2_BEARER.pdf
-
-CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
-EXTRA_DIST = $(man_MANS)
+ CURLINFO_ACTIVESOCKET.3 \
+ CURLINFO_APPCONNECT_TIME.3 \
+ CURLINFO_CERTINFO.3 \
+ CURLINFO_CONDITION_UNMET.3 \
+ CURLINFO_CONNECT_TIME.3 \
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 \
+ CURLINFO_CONTENT_LENGTH_UPLOAD.3 \
+ CURLINFO_CONTENT_TYPE.3 \
+ CURLINFO_COOKIELIST.3 \
+ CURLINFO_EFFECTIVE_URL.3 \
+ CURLINFO_FILETIME.3 \
+ CURLINFO_FTP_ENTRY_PATH.3 \
+ CURLINFO_HEADER_SIZE.3 \
+ CURLINFO_HTTPAUTH_AVAIL.3 \
+ CURLINFO_HTTP_CONNECTCODE.3 \
+ CURLINFO_HTTP_VERSION.3 \
+ CURLINFO_LASTSOCKET.3 \
+ CURLINFO_LOCAL_IP.3 \
+ CURLINFO_LOCAL_PORT.3 \
+ CURLINFO_NAMELOOKUP_TIME.3 \
+ CURLINFO_NUM_CONNECTS.3 \
+ CURLINFO_OS_ERRNO.3 \
+ CURLINFO_PRETRANSFER_TIME.3 \
+ CURLINFO_PRIMARY_IP.3 \
+ CURLINFO_PRIMARY_PORT.3 \
+ CURLINFO_PRIVATE.3 \
+ CURLINFO_PROTOCOL.3 \
+ CURLINFO_PROXYAUTH_AVAIL.3 \
+ CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
+ CURLINFO_REDIRECT_COUNT.3 \
+ CURLINFO_REDIRECT_TIME.3 \
+ CURLINFO_REDIRECT_URL.3 \
+ CURLINFO_REQUEST_SIZE.3 \
+ CURLINFO_RESPONSE_CODE.3 \
+ CURLINFO_RTSP_CLIENT_CSEQ.3 \
+ CURLINFO_RTSP_CSEQ_RECV.3 \
+ CURLINFO_RTSP_SERVER_CSEQ.3 \
+ CURLINFO_RTSP_SESSION_ID.3 \
+ CURLINFO_SCHEME.3 \
+ CURLINFO_SIZE_DOWNLOAD.3 \
+ CURLINFO_SIZE_UPLOAD.3 \
+ CURLINFO_SPEED_DOWNLOAD.3 \
+ CURLINFO_SPEED_UPLOAD.3 \
+ CURLINFO_SSL_ENGINES.3 \
+ CURLINFO_SSL_VERIFYRESULT.3 \
+ CURLINFO_STARTTRANSFER_TIME.3 \
+ CURLINFO_TLS_SESSION.3 \
+ CURLINFO_TLS_SSL_PTR.3 \
+ CURLINFO_TOTAL_TIME.3 \
+ CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
+ CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
+ CURLMOPT_MAXCONNECTS.3 \
+ CURLMOPT_MAX_HOST_CONNECTIONS.3 \
+ CURLMOPT_MAX_PIPELINE_LENGTH.3 \
+ CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \
+ CURLMOPT_PIPELINING.3 \
+ CURLMOPT_PIPELINING_SERVER_BL.3 \
+ CURLMOPT_PIPELINING_SITE_BL.3 \
+ CURLMOPT_PUSHDATA.3 \
+ CURLMOPT_PUSHFUNCTION.3 \
+ CURLMOPT_SOCKETDATA.3 \
+ CURLMOPT_SOCKETFUNCTION.3 \
+ CURLMOPT_TIMERDATA.3 \
+ CURLMOPT_TIMERFUNCTION.3 \
+ CURLOPT_ABSTRACT_UNIX_SOCKET.3 \
+ CURLOPT_ACCEPTTIMEOUT_MS.3 \
+ CURLOPT_ACCEPT_ENCODING.3 \
+ CURLOPT_ADDRESS_SCOPE.3 \
+ CURLOPT_APPEND.3 \
+ CURLOPT_AUTOREFERER.3 \
+ CURLOPT_BUFFERSIZE.3 \
+ CURLOPT_CAINFO.3 \
+ CURLOPT_CAPATH.3 \
+ CURLOPT_CERTINFO.3 \
+ CURLOPT_CHUNK_BGN_FUNCTION.3 \
+ CURLOPT_CHUNK_DATA.3 \
+ CURLOPT_CHUNK_END_FUNCTION.3 \
+ CURLOPT_CLOSESOCKETDATA.3 \
+ CURLOPT_CLOSESOCKETFUNCTION.3 \
+ CURLOPT_CONNECTTIMEOUT.3 \
+ CURLOPT_CONNECTTIMEOUT_MS.3 \
+ CURLOPT_CONNECT_ONLY.3 \
+ CURLOPT_CONNECT_TO.3 \
+ CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 \
+ CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \
+ CURLOPT_CONV_TO_NETWORK_FUNCTION.3 \
+ CURLOPT_COOKIE.3 \
+ CURLOPT_COOKIEFILE.3 \
+ CURLOPT_COOKIEJAR.3 \
+ CURLOPT_COOKIELIST.3 \
+ CURLOPT_COOKIESESSION.3 \
+ CURLOPT_COPYPOSTFIELDS.3 \
+ CURLOPT_CRLF.3 \
+ CURLOPT_CRLFILE.3 \
+ CURLOPT_CUSTOMREQUEST.3 \
+ CURLOPT_DEBUGDATA.3 \
+ CURLOPT_DEBUGFUNCTION.3 \
+ CURLOPT_DEFAULT_PROTOCOL.3 \
+ CURLOPT_DIRLISTONLY.3 \
+ CURLOPT_DNS_CACHE_TIMEOUT.3 \
+ CURLOPT_DNS_INTERFACE.3 \
+ CURLOPT_DNS_LOCAL_IP4.3 \
+ CURLOPT_DNS_LOCAL_IP6.3 \
+ CURLOPT_DNS_SERVERS.3 \
+ CURLOPT_DNS_USE_GLOBAL_CACHE.3 \
+ CURLOPT_EGDSOCKET.3 \
+ CURLOPT_ERRORBUFFER.3 \
+ CURLOPT_EXPECT_100_TIMEOUT_MS.3 \
+ CURLOPT_FAILONERROR.3 \
+ CURLOPT_FILETIME.3 \
+ CURLOPT_FNMATCH_DATA.3 \
+ CURLOPT_FNMATCH_FUNCTION.3 \
+ CURLOPT_FOLLOWLOCATION.3 \
+ CURLOPT_FORBID_REUSE.3 \
+ CURLOPT_FRESH_CONNECT.3 \
+ CURLOPT_FTPPORT.3 \
+ CURLOPT_FTPSSLAUTH.3 \
+ CURLOPT_FTP_ACCOUNT.3 \
+ CURLOPT_FTP_ALTERNATIVE_TO_USER.3 \
+ CURLOPT_FTP_CREATE_MISSING_DIRS.3 \
+ CURLOPT_FTP_FILEMETHOD.3 \
+ CURLOPT_FTP_RESPONSE_TIMEOUT.3 \
+ CURLOPT_FTP_SKIP_PASV_IP.3 \
+ CURLOPT_FTP_SSL_CCC.3 \
+ CURLOPT_FTP_USE_EPRT.3 \
+ CURLOPT_FTP_USE_EPSV.3 \
+ CURLOPT_FTP_USE_PRET.3 \
+ CURLOPT_GSSAPI_DELEGATION.3 \
+ CURLOPT_HEADER.3 \
+ CURLOPT_HEADERDATA.3 \
+ CURLOPT_HEADERFUNCTION.3 \
+ CURLOPT_HEADEROPT.3 \
+ CURLOPT_HTTP200ALIASES.3 \
+ CURLOPT_HTTPAUTH.3 \
+ CURLOPT_HTTPGET.3 \
+ CURLOPT_HTTPHEADER.3 \
+ CURLOPT_HTTPPOST.3 \
+ CURLOPT_HTTPPROXYTUNNEL.3 \
+ CURLOPT_HTTP_CONTENT_DECODING.3 \
+ CURLOPT_HTTP_TRANSFER_DECODING.3 \
+ CURLOPT_HTTP_VERSION.3 \
+ CURLOPT_IGNORE_CONTENT_LENGTH.3 \
+ CURLOPT_INFILESIZE.3 \
+ CURLOPT_INFILESIZE_LARGE.3 \
+ CURLOPT_INTERFACE.3 \
+ CURLOPT_INTERLEAVEDATA.3 \
+ CURLOPT_INTERLEAVEFUNCTION.3 \
+ CURLOPT_IOCTLDATA.3 \
+ CURLOPT_IOCTLFUNCTION.3 \
+ CURLOPT_IPRESOLVE.3 \
+ CURLOPT_ISSUERCERT.3 \
+ CURLOPT_KEEP_SENDING_ON_ERROR.3 \
+ CURLOPT_KEYPASSWD.3 \
+ CURLOPT_KRBLEVEL.3 \
+ CURLOPT_LOCALPORT.3 \
+ CURLOPT_LOCALPORTRANGE.3 \
+ CURLOPT_LOGIN_OPTIONS.3 \
+ CURLOPT_LOW_SPEED_LIMIT.3 \
+ CURLOPT_LOW_SPEED_TIME.3 \
+ CURLOPT_MAIL_AUTH.3 \
+ CURLOPT_MAIL_FROM.3 \
+ CURLOPT_MAIL_RCPT.3 \
+ CURLOPT_MAXCONNECTS.3 \
+ CURLOPT_MAXFILESIZE.3 \
+ CURLOPT_MAXFILESIZE_LARGE.3 \
+ CURLOPT_MAXREDIRS.3 \
+ CURLOPT_MAX_RECV_SPEED_LARGE.3 \
+ CURLOPT_MAX_SEND_SPEED_LARGE.3 \
+ CURLOPT_NETRC.3 \
+ CURLOPT_NETRC_FILE.3 \
+ CURLOPT_NEW_DIRECTORY_PERMS.3 \
+ CURLOPT_NEW_FILE_PERMS.3 \
+ CURLOPT_NOBODY.3 \
+ CURLOPT_NOPROGRESS.3 \
+ CURLOPT_NOPROXY.3 \
+ CURLOPT_NOSIGNAL.3 \
+ CURLOPT_OPENSOCKETDATA.3 \
+ CURLOPT_OPENSOCKETFUNCTION.3 \
+ CURLOPT_PASSWORD.3 \
+ CURLOPT_PATH_AS_IS.3 \
+ CURLOPT_PINNEDPUBLICKEY.3 \
+ CURLOPT_PIPEWAIT.3 \
+ CURLOPT_PORT.3 \
+ CURLOPT_POST.3 \
+ CURLOPT_POSTFIELDS.3 \
+ CURLOPT_POSTFIELDSIZE.3 \
+ CURLOPT_POSTFIELDSIZE_LARGE.3 \
+ CURLOPT_POSTQUOTE.3 \
+ CURLOPT_POSTREDIR.3 \
+ CURLOPT_PREQUOTE.3 \
+ CURLOPT_PRE_PROXY.3 \
+ CURLOPT_PRIVATE.3 \
+ CURLOPT_PROGRESSDATA.3 \
+ CURLOPT_PROGRESSFUNCTION.3 \
+ CURLOPT_PROTOCOLS.3 \
+ CURLOPT_PROXY.3 \
+ CURLOPT_PROXYAUTH.3 \
+ CURLOPT_PROXYHEADER.3 \
+ CURLOPT_PROXYPASSWORD.3 \
+ CURLOPT_PROXYPORT.3 \
+ CURLOPT_PROXYTYPE.3 \
+ CURLOPT_PROXYUSERNAME.3 \
+ CURLOPT_PROXYUSERPWD.3 \
+ CURLOPT_PROXY_CAINFO.3 \
+ CURLOPT_PROXY_CAPATH.3 \
+ CURLOPT_PROXY_CRLFILE.3 \
+ CURLOPT_PROXY_KEYPASSWD.3 \
+ CURLOPT_PROXY_PINNEDPUBLICKEY.3 \
+ CURLOPT_PROXY_SERVICE_NAME.3 \
+ CURLOPT_PROXY_SSLCERT.3 \
+ CURLOPT_PROXY_SSLCERTTYPE.3 \
+ CURLOPT_PROXY_SSLKEY.3 \
+ CURLOPT_PROXY_SSLKEYTYPE.3 \
+ CURLOPT_PROXY_SSLVERSION.3 \
+ CURLOPT_PROXY_SSL_CIPHER_LIST.3 \
+ CURLOPT_PROXY_SSL_OPTIONS.3 \
+ CURLOPT_PROXY_SSL_VERIFYHOST.3 \
+ CURLOPT_PROXY_SSL_VERIFYPEER.3 \
+ CURLOPT_PROXY_TLSAUTH_PASSWORD.3 \
+ CURLOPT_PROXY_TLSAUTH_TYPE.3 \
+ CURLOPT_PROXY_TLSAUTH_USERNAME.3 \
+ CURLOPT_PROXY_TRANSFER_MODE.3 \
+ CURLOPT_PUT.3 \
+ CURLOPT_QUOTE.3 \
+ CURLOPT_RANDOM_FILE.3 \
+ CURLOPT_RANGE.3 \
+ CURLOPT_READDATA.3 \
+ CURLOPT_READFUNCTION.3 \
+ CURLOPT_REDIR_PROTOCOLS.3 \
+ CURLOPT_REFERER.3 \
+ CURLOPT_REQUEST_TARGET.3 \
+ CURLOPT_RESOLVE.3 \
+ CURLOPT_RESUME_FROM.3 \
+ CURLOPT_RESUME_FROM_LARGE.3 \
+ CURLOPT_RTSP_CLIENT_CSEQ.3 \
+ CURLOPT_RTSP_REQUEST.3 \
+ CURLOPT_RTSP_SERVER_CSEQ.3 \
+ CURLOPT_RTSP_SESSION_ID.3 \
+ CURLOPT_RTSP_STREAM_URI.3 \
+ CURLOPT_RTSP_TRANSPORT.3 \
+ CURLOPT_SASL_IR.3 \
+ CURLOPT_SEEKDATA.3 \
+ CURLOPT_SEEKFUNCTION.3 \
+ CURLOPT_SERVICE_NAME.3 \
+ CURLOPT_SHARE.3 \
+ CURLOPT_SOCKOPTDATA.3 \
+ CURLOPT_SOCKOPTFUNCTION.3 \
+ CURLOPT_SOCKS5_GSSAPI_NEC.3 \
+ CURLOPT_SOCKS5_GSSAPI_SERVICE.3 \
+ CURLOPT_SSH_AUTH_TYPES.3 \
+ CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 \
+ CURLOPT_SSH_KEYDATA.3 \
+ CURLOPT_SSH_KEYFUNCTION.3 \
+ CURLOPT_SSH_KNOWNHOSTS.3 \
+ CURLOPT_SSH_PRIVATE_KEYFILE.3 \
+ CURLOPT_SSH_PUBLIC_KEYFILE.3 \
+ CURLOPT_SSLCERT.3 \
+ CURLOPT_SSLCERTTYPE.3 \
+ CURLOPT_SSLENGINE.3 \
+ CURLOPT_SSLENGINE_DEFAULT.3 \
+ CURLOPT_SSLKEY.3 \
+ CURLOPT_SSLKEYTYPE.3 \
+ CURLOPT_SSLVERSION.3 \
+ CURLOPT_SSL_CIPHER_LIST.3 \
+ CURLOPT_SSL_CTX_DATA.3 \
+ CURLOPT_SSL_CTX_FUNCTION.3 \
+ CURLOPT_SSL_ENABLE_ALPN.3 \
+ CURLOPT_SSL_ENABLE_NPN.3 \
+ CURLOPT_SSL_FALSESTART.3 \
+ CURLOPT_SSL_OPTIONS.3 \
+ CURLOPT_SSL_SESSIONID_CACHE.3 \
+ CURLOPT_SSL_VERIFYHOST.3 \
+ CURLOPT_SSL_VERIFYPEER.3 \
+ CURLOPT_SSL_VERIFYSTATUS.3 \
+ CURLOPT_STDERR.3 \
+ CURLOPT_STREAM_DEPENDS.3 \
+ CURLOPT_STREAM_DEPENDS_E.3 \
+ CURLOPT_STREAM_WEIGHT.3 \
+ CURLOPT_SUPPRESS_CONNECT_HEADERS.3 \
+ CURLOPT_TCP_FASTOPEN.3 \
+ CURLOPT_TCP_KEEPALIVE.3 \
+ CURLOPT_TCP_KEEPIDLE.3 \
+ CURLOPT_TCP_KEEPINTVL.3 \
+ CURLOPT_TCP_NODELAY.3 \
+ CURLOPT_TELNETOPTIONS.3 \
+ CURLOPT_TFTP_BLKSIZE.3 \
+ CURLOPT_TFTP_NO_OPTIONS.3 \
+ CURLOPT_TIMECONDITION.3 \
+ CURLOPT_TIMEOUT.3 \
+ CURLOPT_TIMEOUT_MS.3 \
+ CURLOPT_TIMEVALUE.3 \
+ CURLOPT_TLSAUTH_PASSWORD.3 \
+ CURLOPT_TLSAUTH_TYPE.3 \
+ CURLOPT_TLSAUTH_USERNAME.3 \
+ CURLOPT_TRANSFERTEXT.3 \
+ CURLOPT_TRANSFER_ENCODING.3 \
+ CURLOPT_UNIX_SOCKET_PATH.3 \
+ CURLOPT_UNRESTRICTED_AUTH.3 \
+ CURLOPT_UPLOAD.3 \
+ CURLOPT_URL.3 \
+ CURLOPT_USERAGENT.3 \
+ CURLOPT_USERNAME.3 \
+ CURLOPT_USERPWD.3 \
+ CURLOPT_USE_SSL.3 \
+ CURLOPT_VERBOSE.3 \
+ CURLOPT_WILDCARDMATCH.3 \
+ CURLOPT_WRITEDATA.3 \
+ CURLOPT_WRITEFUNCTION.3 \
+ CURLOPT_XFERINFODATA.3 \
+ CURLOPT_XFERINFOFUNCTION.3 \
+ CURLOPT_XOAUTH2_BEARER.3
+
+man_DISTMANS = $(man_MANS:.3=.3.dist)
+HTMLPAGES = $(man_MANS:.3=.html)
+PDFPAGES = $(man_MANS:.3=.pdf)
+CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(man_DISTMANS)
+EXTRA_DIST = $(man_MANS) CMakeLists.txt
MAN2HTML = roffit --mandir=. $< >$@
SUFFIXES = .3 .html
all: all-am
.SUFFIXES:
.SUFFIXES: .3 .html .pdf
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -1339,6 +736,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
+$(srcdir)/Makefile.inc $(am__empty):
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
new file mode 100644
index 00000000..c094604d
--- /dev/null
+++ b/docs/libcurl/opts/Makefile.inc
@@ -0,0 +1,314 @@
+# Shared between Makefile.am and CMakeLists.txt
+
+man_MANS = \
+ CURLINFO_ACTIVESOCKET.3 \
+ CURLINFO_APPCONNECT_TIME.3 \
+ CURLINFO_CERTINFO.3 \
+ CURLINFO_CONDITION_UNMET.3 \
+ CURLINFO_CONNECT_TIME.3 \
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 \
+ CURLINFO_CONTENT_LENGTH_UPLOAD.3 \
+ CURLINFO_CONTENT_TYPE.3 \
+ CURLINFO_COOKIELIST.3 \
+ CURLINFO_EFFECTIVE_URL.3 \
+ CURLINFO_FILETIME.3 \
+ CURLINFO_FTP_ENTRY_PATH.3 \
+ CURLINFO_HEADER_SIZE.3 \
+ CURLINFO_HTTPAUTH_AVAIL.3 \
+ CURLINFO_HTTP_CONNECTCODE.3 \
+ CURLINFO_HTTP_VERSION.3 \
+ CURLINFO_LASTSOCKET.3 \
+ CURLINFO_LOCAL_IP.3 \
+ CURLINFO_LOCAL_PORT.3 \
+ CURLINFO_NAMELOOKUP_TIME.3 \
+ CURLINFO_NUM_CONNECTS.3 \
+ CURLINFO_OS_ERRNO.3 \
+ CURLINFO_PRETRANSFER_TIME.3 \
+ CURLINFO_PRIMARY_IP.3 \
+ CURLINFO_PRIMARY_PORT.3 \
+ CURLINFO_PRIVATE.3 \
+ CURLINFO_PROTOCOL.3 \
+ CURLINFO_PROXYAUTH_AVAIL.3 \
+ CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
+ CURLINFO_REDIRECT_COUNT.3 \
+ CURLINFO_REDIRECT_TIME.3 \
+ CURLINFO_REDIRECT_URL.3 \
+ CURLINFO_REQUEST_SIZE.3 \
+ CURLINFO_RESPONSE_CODE.3 \
+ CURLINFO_RTSP_CLIENT_CSEQ.3 \
+ CURLINFO_RTSP_CSEQ_RECV.3 \
+ CURLINFO_RTSP_SERVER_CSEQ.3 \
+ CURLINFO_RTSP_SESSION_ID.3 \
+ CURLINFO_SCHEME.3 \
+ CURLINFO_SIZE_DOWNLOAD.3 \
+ CURLINFO_SIZE_UPLOAD.3 \
+ CURLINFO_SPEED_DOWNLOAD.3 \
+ CURLINFO_SPEED_UPLOAD.3 \
+ CURLINFO_SSL_ENGINES.3 \
+ CURLINFO_SSL_VERIFYRESULT.3 \
+ CURLINFO_STARTTRANSFER_TIME.3 \
+ CURLINFO_TLS_SESSION.3 \
+ CURLINFO_TLS_SSL_PTR.3 \
+ CURLINFO_TOTAL_TIME.3 \
+ CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
+ CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
+ CURLMOPT_MAXCONNECTS.3 \
+ CURLMOPT_MAX_HOST_CONNECTIONS.3 \
+ CURLMOPT_MAX_PIPELINE_LENGTH.3 \
+ CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \
+ CURLMOPT_PIPELINING.3 \
+ CURLMOPT_PIPELINING_SERVER_BL.3 \
+ CURLMOPT_PIPELINING_SITE_BL.3 \
+ CURLMOPT_PUSHDATA.3 \
+ CURLMOPT_PUSHFUNCTION.3 \
+ CURLMOPT_SOCKETDATA.3 \
+ CURLMOPT_SOCKETFUNCTION.3 \
+ CURLMOPT_TIMERDATA.3 \
+ CURLMOPT_TIMERFUNCTION.3 \
+ CURLOPT_ABSTRACT_UNIX_SOCKET.3 \
+ CURLOPT_ACCEPTTIMEOUT_MS.3 \
+ CURLOPT_ACCEPT_ENCODING.3 \
+ CURLOPT_ADDRESS_SCOPE.3 \
+ CURLOPT_APPEND.3 \
+ CURLOPT_AUTOREFERER.3 \
+ CURLOPT_BUFFERSIZE.3 \
+ CURLOPT_CAINFO.3 \
+ CURLOPT_CAPATH.3 \
+ CURLOPT_CERTINFO.3 \
+ CURLOPT_CHUNK_BGN_FUNCTION.3 \
+ CURLOPT_CHUNK_DATA.3 \
+ CURLOPT_CHUNK_END_FUNCTION.3 \
+ CURLOPT_CLOSESOCKETDATA.3 \
+ CURLOPT_CLOSESOCKETFUNCTION.3 \
+ CURLOPT_CONNECTTIMEOUT.3 \
+ CURLOPT_CONNECTTIMEOUT_MS.3 \
+ CURLOPT_CONNECT_ONLY.3 \
+ CURLOPT_CONNECT_TO.3 \
+ CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 \
+ CURLOPT_CONV_FROM_UTF8_FUNCTION.3 \
+ CURLOPT_CONV_TO_NETWORK_FUNCTION.3 \
+ CURLOPT_COOKIE.3 \
+ CURLOPT_COOKIEFILE.3 \
+ CURLOPT_COOKIEJAR.3 \
+ CURLOPT_COOKIELIST.3 \
+ CURLOPT_COOKIESESSION.3 \
+ CURLOPT_COPYPOSTFIELDS.3 \
+ CURLOPT_CRLF.3 \
+ CURLOPT_CRLFILE.3 \
+ CURLOPT_CUSTOMREQUEST.3 \
+ CURLOPT_DEBUGDATA.3 \
+ CURLOPT_DEBUGFUNCTION.3 \
+ CURLOPT_DEFAULT_PROTOCOL.3 \
+ CURLOPT_DIRLISTONLY.3 \
+ CURLOPT_DNS_CACHE_TIMEOUT.3 \
+ CURLOPT_DNS_INTERFACE.3 \
+ CURLOPT_DNS_LOCAL_IP4.3 \
+ CURLOPT_DNS_LOCAL_IP6.3 \
+ CURLOPT_DNS_SERVERS.3 \
+ CURLOPT_DNS_USE_GLOBAL_CACHE.3 \
+ CURLOPT_EGDSOCKET.3 \
+ CURLOPT_ERRORBUFFER.3 \
+ CURLOPT_EXPECT_100_TIMEOUT_MS.3 \
+ CURLOPT_FAILONERROR.3 \
+ CURLOPT_FILETIME.3 \
+ CURLOPT_FNMATCH_DATA.3 \
+ CURLOPT_FNMATCH_FUNCTION.3 \
+ CURLOPT_FOLLOWLOCATION.3 \
+ CURLOPT_FORBID_REUSE.3 \
+ CURLOPT_FRESH_CONNECT.3 \
+ CURLOPT_FTPPORT.3 \
+ CURLOPT_FTPSSLAUTH.3 \
+ CURLOPT_FTP_ACCOUNT.3 \
+ CURLOPT_FTP_ALTERNATIVE_TO_USER.3 \
+ CURLOPT_FTP_CREATE_MISSING_DIRS.3 \
+ CURLOPT_FTP_FILEMETHOD.3 \
+ CURLOPT_FTP_RESPONSE_TIMEOUT.3 \
+ CURLOPT_FTP_SKIP_PASV_IP.3 \
+ CURLOPT_FTP_SSL_CCC.3 \
+ CURLOPT_FTP_USE_EPRT.3 \
+ CURLOPT_FTP_USE_EPSV.3 \
+ CURLOPT_FTP_USE_PRET.3 \
+ CURLOPT_GSSAPI_DELEGATION.3 \
+ CURLOPT_HEADER.3 \
+ CURLOPT_HEADERDATA.3 \
+ CURLOPT_HEADERFUNCTION.3 \
+ CURLOPT_HEADEROPT.3 \
+ CURLOPT_HTTP200ALIASES.3 \
+ CURLOPT_HTTPAUTH.3 \
+ CURLOPT_HTTPGET.3 \
+ CURLOPT_HTTPHEADER.3 \
+ CURLOPT_HTTPPOST.3 \
+ CURLOPT_HTTPPROXYTUNNEL.3 \
+ CURLOPT_HTTP_CONTENT_DECODING.3 \
+ CURLOPT_HTTP_TRANSFER_DECODING.3 \
+ CURLOPT_HTTP_VERSION.3 \
+ CURLOPT_IGNORE_CONTENT_LENGTH.3 \
+ CURLOPT_INFILESIZE.3 \
+ CURLOPT_INFILESIZE_LARGE.3 \
+ CURLOPT_INTERFACE.3 \
+ CURLOPT_INTERLEAVEDATA.3 \
+ CURLOPT_INTERLEAVEFUNCTION.3 \
+ CURLOPT_IOCTLDATA.3 \
+ CURLOPT_IOCTLFUNCTION.3 \
+ CURLOPT_IPRESOLVE.3 \
+ CURLOPT_ISSUERCERT.3 \
+ CURLOPT_KEEP_SENDING_ON_ERROR.3 \
+ CURLOPT_KEYPASSWD.3 \
+ CURLOPT_KRBLEVEL.3 \
+ CURLOPT_LOCALPORT.3 \
+ CURLOPT_LOCALPORTRANGE.3 \
+ CURLOPT_LOGIN_OPTIONS.3 \
+ CURLOPT_LOW_SPEED_LIMIT.3 \
+ CURLOPT_LOW_SPEED_TIME.3 \
+ CURLOPT_MAIL_AUTH.3 \
+ CURLOPT_MAIL_FROM.3 \
+ CURLOPT_MAIL_RCPT.3 \
+ CURLOPT_MAXCONNECTS.3 \
+ CURLOPT_MAXFILESIZE.3 \
+ CURLOPT_MAXFILESIZE_LARGE.3 \
+ CURLOPT_MAXREDIRS.3 \
+ CURLOPT_MAX_RECV_SPEED_LARGE.3 \
+ CURLOPT_MAX_SEND_SPEED_LARGE.3 \
+ CURLOPT_NETRC.3 \
+ CURLOPT_NETRC_FILE.3 \
+ CURLOPT_NEW_DIRECTORY_PERMS.3 \
+ CURLOPT_NEW_FILE_PERMS.3 \
+ CURLOPT_NOBODY.3 \
+ CURLOPT_NOPROGRESS.3 \
+ CURLOPT_NOPROXY.3 \
+ CURLOPT_NOSIGNAL.3 \
+ CURLOPT_OPENSOCKETDATA.3 \
+ CURLOPT_OPENSOCKETFUNCTION.3 \
+ CURLOPT_PASSWORD.3 \
+ CURLOPT_PATH_AS_IS.3 \
+ CURLOPT_PINNEDPUBLICKEY.3 \
+ CURLOPT_PIPEWAIT.3 \
+ CURLOPT_PORT.3 \
+ CURLOPT_POST.3 \
+ CURLOPT_POSTFIELDS.3 \
+ CURLOPT_POSTFIELDSIZE.3 \
+ CURLOPT_POSTFIELDSIZE_LARGE.3 \
+ CURLOPT_POSTQUOTE.3 \
+ CURLOPT_POSTREDIR.3 \
+ CURLOPT_PREQUOTE.3 \
+ CURLOPT_PRE_PROXY.3 \
+ CURLOPT_PRIVATE.3 \
+ CURLOPT_PROGRESSDATA.3 \
+ CURLOPT_PROGRESSFUNCTION.3 \
+ CURLOPT_PROTOCOLS.3 \
+ CURLOPT_PROXY.3 \
+ CURLOPT_PROXYAUTH.3 \
+ CURLOPT_PROXYHEADER.3 \
+ CURLOPT_PROXYPASSWORD.3 \
+ CURLOPT_PROXYPORT.3 \
+ CURLOPT_PROXYTYPE.3 \
+ CURLOPT_PROXYUSERNAME.3 \
+ CURLOPT_PROXYUSERPWD.3 \
+ CURLOPT_PROXY_CAINFO.3 \
+ CURLOPT_PROXY_CAPATH.3 \
+ CURLOPT_PROXY_CRLFILE.3 \
+ CURLOPT_PROXY_KEYPASSWD.3 \
+ CURLOPT_PROXY_PINNEDPUBLICKEY.3 \
+ CURLOPT_PROXY_SERVICE_NAME.3 \
+ CURLOPT_PROXY_SSLCERT.3 \
+ CURLOPT_PROXY_SSLCERTTYPE.3 \
+ CURLOPT_PROXY_SSLKEY.3 \
+ CURLOPT_PROXY_SSLKEYTYPE.3 \
+ CURLOPT_PROXY_SSLVERSION.3 \
+ CURLOPT_PROXY_SSL_CIPHER_LIST.3 \
+ CURLOPT_PROXY_SSL_OPTIONS.3 \
+ CURLOPT_PROXY_SSL_VERIFYHOST.3 \
+ CURLOPT_PROXY_SSL_VERIFYPEER.3 \
+ CURLOPT_PROXY_TLSAUTH_PASSWORD.3 \
+ CURLOPT_PROXY_TLSAUTH_TYPE.3 \
+ CURLOPT_PROXY_TLSAUTH_USERNAME.3 \
+ CURLOPT_PROXY_TRANSFER_MODE.3 \
+ CURLOPT_PUT.3 \
+ CURLOPT_QUOTE.3 \
+ CURLOPT_RANDOM_FILE.3 \
+ CURLOPT_RANGE.3 \
+ CURLOPT_READDATA.3 \
+ CURLOPT_READFUNCTION.3 \
+ CURLOPT_REDIR_PROTOCOLS.3 \
+ CURLOPT_REFERER.3 \
+ CURLOPT_REQUEST_TARGET.3 \
+ CURLOPT_RESOLVE.3 \
+ CURLOPT_RESUME_FROM.3 \
+ CURLOPT_RESUME_FROM_LARGE.3 \
+ CURLOPT_RTSP_CLIENT_CSEQ.3 \
+ CURLOPT_RTSP_REQUEST.3 \
+ CURLOPT_RTSP_SERVER_CSEQ.3 \
+ CURLOPT_RTSP_SESSION_ID.3 \
+ CURLOPT_RTSP_STREAM_URI.3 \
+ CURLOPT_RTSP_TRANSPORT.3 \
+ CURLOPT_SASL_IR.3 \
+ CURLOPT_SEEKDATA.3 \
+ CURLOPT_SEEKFUNCTION.3 \
+ CURLOPT_SERVICE_NAME.3 \
+ CURLOPT_SHARE.3 \
+ CURLOPT_SOCKOPTDATA.3 \
+ CURLOPT_SOCKOPTFUNCTION.3 \
+ CURLOPT_SOCKS5_GSSAPI_NEC.3 \
+ CURLOPT_SOCKS5_GSSAPI_SERVICE.3 \
+ CURLOPT_SSH_AUTH_TYPES.3 \
+ CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 \
+ CURLOPT_SSH_KEYDATA.3 \
+ CURLOPT_SSH_KEYFUNCTION.3 \
+ CURLOPT_SSH_KNOWNHOSTS.3 \
+ CURLOPT_SSH_PRIVATE_KEYFILE.3 \
+ CURLOPT_SSH_PUBLIC_KEYFILE.3 \
+ CURLOPT_SSLCERT.3 \
+ CURLOPT_SSLCERTTYPE.3 \
+ CURLOPT_SSLENGINE.3 \
+ CURLOPT_SSLENGINE_DEFAULT.3 \
+ CURLOPT_SSLKEY.3 \
+ CURLOPT_SSLKEYTYPE.3 \
+ CURLOPT_SSLVERSION.3 \
+ CURLOPT_SSL_CIPHER_LIST.3 \
+ CURLOPT_SSL_CTX_DATA.3 \
+ CURLOPT_SSL_CTX_FUNCTION.3 \
+ CURLOPT_SSL_ENABLE_ALPN.3 \
+ CURLOPT_SSL_ENABLE_NPN.3 \
+ CURLOPT_SSL_FALSESTART.3 \
+ CURLOPT_SSL_OPTIONS.3 \
+ CURLOPT_SSL_SESSIONID_CACHE.3 \
+ CURLOPT_SSL_VERIFYHOST.3 \
+ CURLOPT_SSL_VERIFYPEER.3 \
+ CURLOPT_SSL_VERIFYSTATUS.3 \
+ CURLOPT_STDERR.3 \
+ CURLOPT_STREAM_DEPENDS.3 \
+ CURLOPT_STREAM_DEPENDS_E.3 \
+ CURLOPT_STREAM_WEIGHT.3 \
+ CURLOPT_SUPPRESS_CONNECT_HEADERS.3 \
+ CURLOPT_TCP_FASTOPEN.3 \
+ CURLOPT_TCP_KEEPALIVE.3 \
+ CURLOPT_TCP_KEEPIDLE.3 \
+ CURLOPT_TCP_KEEPINTVL.3 \
+ CURLOPT_TCP_NODELAY.3 \
+ CURLOPT_TELNETOPTIONS.3 \
+ CURLOPT_TFTP_BLKSIZE.3 \
+ CURLOPT_TFTP_NO_OPTIONS.3 \
+ CURLOPT_TIMECONDITION.3 \
+ CURLOPT_TIMEOUT.3 \
+ CURLOPT_TIMEOUT_MS.3 \
+ CURLOPT_TIMEVALUE.3 \
+ CURLOPT_TLSAUTH_PASSWORD.3 \
+ CURLOPT_TLSAUTH_TYPE.3 \
+ CURLOPT_TLSAUTH_USERNAME.3 \
+ CURLOPT_TRANSFERTEXT.3 \
+ CURLOPT_TRANSFER_ENCODING.3 \
+ CURLOPT_UNIX_SOCKET_PATH.3 \
+ CURLOPT_UNRESTRICTED_AUTH.3 \
+ CURLOPT_UPLOAD.3 \
+ CURLOPT_URL.3 \
+ CURLOPT_USERAGENT.3 \
+ CURLOPT_USERNAME.3 \
+ CURLOPT_USERPWD.3 \
+ CURLOPT_USE_SSL.3 \
+ CURLOPT_VERBOSE.3 \
+ CURLOPT_WILDCARDMATCH.3 \
+ CURLOPT_WRITEDATA.3 \
+ CURLOPT_WRITEFUNCTION.3 \
+ CURLOPT_XFERINFODATA.3 \
+ CURLOPT_XFERINFOFUNCTION.3 \
+ CURLOPT_XOAUTH2_BEARER.3
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index bd5960c2..e141b6a5 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -17,6 +17,7 @@ CURLAUTH_ANYSAFE 7.10.6
CURLAUTH_BASIC 7.10.6
CURLAUTH_DIGEST 7.10.6
CURLAUTH_DIGEST_IE 7.19.3
+CURLAUTH_GSSAPI 7.55.0
CURLAUTH_GSSNEGOTIATE 7.10.6 7.38.0
CURLAUTH_NEGOTIATE 7.38.0
CURLAUTH_NONE 7.10.6
@@ -208,7 +209,9 @@ CURLINFO_CERTINFO 7.19.1
CURLINFO_CONDITION_UNMET 7.19.4
CURLINFO_CONNECT_TIME 7.4.1
CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1
+CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 7.55.0
CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1
+CURLINFO_CONTENT_LENGTH_UPLOAD_T 7.55.0
CURLINFO_CONTENT_TYPE 7.9.4
CURLINFO_COOKIELIST 7.14.1
CURLINFO_DATA_IN 7.9.6
@@ -234,6 +237,7 @@ CURLINFO_MASK 7.4.1
CURLINFO_NAMELOOKUP_TIME 7.4.1
CURLINFO_NONE 7.4.1
CURLINFO_NUM_CONNECTS 7.12.3
+CURLINFO_OFF_T 7.55.0
CURLINFO_OS_ERRNO 7.12.2
CURLINFO_PRETRANSFER_TIME 7.4.1
CURLINFO_PRIMARY_IP 7.19.0
@@ -242,6 +246,7 @@ CURLINFO_PRIVATE 7.10.3
CURLINFO_PROTOCOL 7.52.0
CURLINFO_PROXYAUTH_AVAIL 7.10.8
CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0
+CURLINFO_PTR 7.54.1
CURLINFO_REDIRECT_COUNT 7.9.7
CURLINFO_REDIRECT_TIME 7.9.7
CURLINFO_REDIRECT_URL 7.18.2
@@ -253,11 +258,15 @@ CURLINFO_RTSP_SERVER_CSEQ 7.20.0
CURLINFO_RTSP_SESSION_ID 7.20.0
CURLINFO_SCHEME 7.52.0
CURLINFO_SIZE_DOWNLOAD 7.4.1
+CURLINFO_SIZE_DOWNLOAD_T 7.55.0
CURLINFO_SIZE_UPLOAD 7.4.1
+CURLINFO_SIZE_UPLOAD_T 7.55.0
CURLINFO_SLIST 7.12.3
CURLINFO_SOCKET 7.45.0
CURLINFO_SPEED_DOWNLOAD 7.4.1
+CURLINFO_SPEED_DOWNLOAD_T 7.55.0
CURLINFO_SPEED_UPLOAD 7.4.1
+CURLINFO_SPEED_UPLOAD_T 7.55.0
CURLINFO_SSL_DATA_IN 7.12.1
CURLINFO_SSL_DATA_OUT 7.12.1
CURLINFO_SSL_ENGINES 7.12.3
@@ -317,6 +326,7 @@ CURLOPTTYPE_LONG 7.1
CURLOPTTYPE_OBJECTPOINT 7.1
CURLOPTTYPE_OFF_T 7.11.0
CURLOPTTYPE_STRINGPOINT 7.46.0
+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
@@ -413,8 +423,8 @@ CURLOPT_IOCTLDATA 7.12.3
CURLOPT_IOCTLFUNCTION 7.12.3
CURLOPT_IPRESOLVE 7.10.8
CURLOPT_ISSUERCERT 7.19.0
-CURLOPT_KEYPASSWD 7.17.0
CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0
+CURLOPT_KEYPASSWD 7.17.0
CURLOPT_KRB4LEVEL 7.3 7.17.0
CURLOPT_KRBLEVEL 7.16.4
CURLOPT_LOCALPORT 7.15.2
@@ -499,6 +509,7 @@ CURLOPT_READDATA 7.9.7
CURLOPT_READFUNCTION 7.1
CURLOPT_REDIR_PROTOCOLS 7.19.4
CURLOPT_REFERER 7.1
+CURLOPT_REQUEST_TARGET 7.55.0
CURLOPT_RESOLVE 7.21.3
CURLOPT_RESUME_FROM 7.1
CURLOPT_RESUME_FROM_LARGE 7.11.0
@@ -517,6 +528,7 @@ CURLOPT_SERVICE_NAME 7.43.0
CURLOPT_SHARE 7.10
CURLOPT_SOCKOPTDATA 7.16.0
CURLOPT_SOCKOPTFUNCTION 7.16.0
+CURLOPT_SOCKS5_AUTH 7.55.0
CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4
CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4 7.49.0
CURLOPT_SOURCE_HOST 7.12.1 - 7.15.5
@@ -558,11 +570,12 @@ CURLOPT_STDERR 7.1
CURLOPT_STREAM_DEPENDS 7.46.0
CURLOPT_STREAM_DEPENDS_E 7.46.0
CURLOPT_STREAM_WEIGHT 7.46.0
+CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0
+CURLOPT_TCP_FASTOPEN 7.49.0
CURLOPT_TCP_KEEPALIVE 7.25.0
CURLOPT_TCP_KEEPIDLE 7.25.0
CURLOPT_TCP_KEEPINTVL 7.25.0
CURLOPT_TCP_NODELAY 7.11.2
-CURLOPT_TCP_FASTOPEN 7.49.0
CURLOPT_TELNETOPTIONS 7.7
CURLOPT_TFTP_BLKSIZE 7.19.4
CURLOPT_TFTP_NO_OPTIONS 7.48.0
@@ -631,8 +644,8 @@ CURLPROTO_SMTPS 7.20.0
CURLPROTO_TELNET 7.19.4
CURLPROTO_TFTP 7.19.4
CURLPROXY_HTTP 7.10
-CURLPROXY_HTTP_1_0 7.19.4
CURLPROXY_HTTPS 7.52.0
+CURLPROXY_HTTP_1_0 7.19.4
CURLPROXY_SOCKS4 7.10
CURLPROXY_SOCKS4A 7.18.0
CURLPROXY_SOCKS5 7.10
@@ -725,8 +738,8 @@ CURL_HTTPPOST_READFILE 7.46.0
CURL_HTTP_VERSION_1_0 7.9.1
CURL_HTTP_VERSION_1_1 7.9.1
CURL_HTTP_VERSION_2 7.43.0
-CURL_HTTP_VERSION_2_0 7.33.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_NONE 7.9.1
CURL_IPRESOLVE_V4 7.10.8
@@ -747,6 +760,7 @@ CURL_LOCK_TYPE_DNS 7.10 - 7.10.2
CURL_LOCK_TYPE_NONE 7.10 - 7.10.2
CURL_LOCK_TYPE_SSL_SESSION 7.10 - 7.10.2
CURL_MAX_HTTP_HEADER 7.19.7
+CURL_MAX_READ_SIZE 7.53.0
CURL_MAX_WRITE_SIZE 7.9.7
CURL_NETRC_IGNORED 7.9.8
CURL_NETRC_OPTIONAL 7.9.8
@@ -787,8 +801,13 @@ CURL_SOCKET_TIMEOUT 7.14.0
CURL_SOCKOPT_ALREADY_CONNECTED 7.21.5
CURL_SOCKOPT_ERROR 7.21.5
CURL_SOCKOPT_OK 7.21.5
-CURL_STRICTER 7.50.2
CURL_SSLVERSION_DEFAULT 7.9.2
+CURL_SSLVERSION_MAX_DEFAULT 7.54.0
+CURL_SSLVERSION_MAX_NONE 7.54.0
+CURL_SSLVERSION_MAX_TLSv1_0 7.54.0
+CURL_SSLVERSION_MAX_TLSv1_1 7.54.0
+CURL_SSLVERSION_MAX_TLSv1_2 7.54.0
+CURL_SSLVERSION_MAX_TLSv1_3 7.54.0
CURL_SSLVERSION_SSLv2 7.9.2
CURL_SSLVERSION_SSLv3 7.9.2
CURL_SSLVERSION_TLSv1 7.9.2
@@ -796,6 +815,7 @@ CURL_SSLVERSION_TLSv1_0 7.34.0
CURL_SSLVERSION_TLSv1_1 7.34.0
CURL_SSLVERSION_TLSv1_2 7.34.0
CURL_SSLVERSION_TLSv1_3 7.52.0
+CURL_STRICTER 7.50.2
CURL_TIMECOND_IFMODSINCE 7.9.7
CURL_TIMECOND_IFUNMODSINCE 7.9.7
CURL_TIMECOND_LASTMOD 7.9.7
diff --git a/docs/mk-ca-bundle.1 b/docs/mk-ca-bundle.1
new file mode 100644
index 00000000..f754e74c
--- /dev/null
+++ b/docs/mk-ca-bundle.1
@@ -0,0 +1,119 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2008 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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 mk-ca-bundle 1 "24 Oct 2016" "version 1.27" "mk-ca-bundle manual"
+.SH NAME
+mk-ca-bundle \- convert mozilla's certdata.txt to PEM format
+.SH SYNOPSIS
+mk-ca-bundle [options]
+.I [outputfile]
+.SH DESCRIPTION
+The mk-ca-bundle tool downloads the certdata.txt file from Mozilla's source
+tree over HTTPS, then parses certdata.txt and extracts certificates into PEM
+format. By default, only CA root certificates trusted to issue SSL server
+authentication certificates are extracted. These are then processed with the
+OpenSSL commandline tool to produce the final ca-bundle file.
+
+The default \fIoutputfile\fP name is \fBca-bundle.crt\fP. By setting it to '-'
+(a single dash) you will get the output sent to STDOUT instead of a file.
+
+The PEM format this scripts uses for output makes the result readily available
+for use by just about all OpenSSL or GnuTLS powered applications, such as
+curl, wget and more.
+.SH OPTIONS
+The following options are supported:
+.IP -b
+backup an existing version of \fIoutputfilename\fP
+.IP "-d [name]"
+specify which Mozilla tree to pull certdata.txt from (or a custom URL). Valid
+names are: aurora, beta, central, mozilla, nss, release (default). They are
+shortcuts for which source tree to get the cert data from.
+.IP -f
+force rebuild even if certdata.txt is current (Added in version 1.17)
+.IP -i
+print version info about used modules
+.IP -k
+Allow insecure data transfer. By default (since 1.27) this command will fail
+if the HTTPS transfer fails. This overrides that decision (and opens for
+man-in-the-middle attacks).
+.IP -l
+print license info about certdata.txt
+.IP -m
+(Added in 1.26) Include meta data comments in the output. The meta data is
+specific information about each certificate that is stored in the original
+file as comments and using this option will make those comments get passed on
+to the output file. The meta data is not parsed in any way by mk-ca-bundle.
+.IP -n
+no download of certdata.txt (to use existing)
+.IP "-p [purposes]:[levels]"
+list of Mozilla trust purposes and levels for certificates to include in output.
+Takes the form of a comma separated list of purposes, a colon, and a comma
+separated list of levels. The default is to include all certificates trusted
+to issue SSL Server certificates (SERVER_AUTH:TRUSTED_DELEGATOR).
+
+(Added in version 1.21, Perl only)
+
+Valid purposes are:
+.RS
+ALL, DIGITAL_SIGNATURE, NON_REPUDIATION, KEY_ENCIPHERMENT,
+DATA_ENCIPHERMENT, KEY_AGREEMENT, KEY_CERT_SIGN, CRL_SIGN,
+SERVER_AUTH (default), CLIENT_AUTH, CODE_SIGNING, EMAIL_PROTECTION,
+IPSEC_END_SYSTEM, IPSEC_TUNNEL, IPSEC_USER, TIME_STAMPING, STEP_UP_APPROVED
+.RE
+.IP
+Valid trust levels are:
+.RS
+ALL, TRUSTED_DELEGATOR (default), NOT_TRUSTED, MUST_VERIFY_TRUST, TRUSTED
+.RE
+.IP -q
+be really quiet (no progress output at all)
+.IP -t
+include plain text listing of certificates
+.IP "-s [algorithms]"
+comma separated list of signature algorithms with which to hash/fingerprint
+each certificate and output when run in plain text mode.
+
+(Added in version 1.21, Perl only)
+
+Valid algorithms are:
+.RS
+ALL, NONE, MD5 (default), SHA1, SHA256, SHA384, SHA512
+.RE
+.IP -u
+unlink (remove) certdata.txt after processing
+.IP -v
+be verbose and print out processed CAs
+.SH EXIT STATUS
+Returns 0 on success. Returns 1 if it fails to download data.
+.SH CERTDATA FORMAT
+The file format used by Mozilla for this trust information seems to be documented here:
+.nf
+https://p11-glue.freedesktop.org/doc/storing-trust-policy/storing-trust-existing.html
+.fi
+.SH SEE ALSO
+.BR curl (1)
+.SH HISTORY
+\fBmk-ca-bundle\fP is a command line tool that is shipped as part of every
+curl and libcurl release (see https://curl.haxx.se/). It was originally based
+on the parse-certs script written by Roland Krikava and was later much
+improved by Guenter Knauf. This manual page was initially written by Jan
+Schaumann \&<jschauma@netmeister.org>.
diff --git a/include/Makefile.in b/include/Makefile.in
index b1a2980e..53f11101 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = include
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -212,6 +212,12 @@ 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@
@@ -251,6 +257,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -263,6 +271,7 @@ 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@
diff --git a/include/README b/include/README
index 6eb73b2b..9e865aa1 100644
--- a/include/README
+++ b/include/README
@@ -16,31 +16,9 @@ curl subdirectory. It makes it more likely to survive future modifications.
NOTE FOR LIBCURL HACKERS
-The following notes apply to libcurl version 7.19.0 and later.
-
-* The distributed curl/curlbuild.h file is only intended to be used on systems
- which can not run the also distributed configure script.
-
-* The distributed curlbuild.h file is generated as a copy of curlbuild.h.dist
- when the libcurl source code distribution archive file is originally created.
-
* If you check out from git on a non-configure platform, you must run the
- appropriate buildconf* script to set up curlbuild.h and other local files
- before being able of compiling the library.
-
-* On systems capable of running the configure script, the configure process
- will overwrite the distributed include/curl/curlbuild.h file with one that
- is suitable and specific to the library being configured and built, which
- is generated from the include/curl/curlbuild.h.in template file.
-
-* If you intend to distribute an already compiled libcurl library you _MUST_
- also distribute along with it the generated curl/curlbuild.h which has been
- used to compile it. Otherwise the library will be of no use for the users of
- the library that you have built. It is _your_ responsibility to provide this
- file. No one at the curl project can know how you have built the library.
-
-* File curl/curlbuild.h includes platform and configuration dependent info,
- and must not be modified by anyone. Configure script generates it for you.
+ appropriate buildconf* script to set up files before being able of compiling
+ the library.
* We cannot assume anything else but very basic compiler features being
present. While libcurl requires an ANSI C compiler to build, some of the
diff --git a/include/curl/Makefile.am b/include/curl/Makefile.am
index 7c924fcb..989d4a21 100644
--- a/include/curl/Makefile.am
+++ b/include/curl/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -21,31 +21,12 @@
###########################################################################
pkginclude_HEADERS = \
curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h curlbuild.h curlrules.h
+ typecheck-gcc.h system.h
pkgincludedir= $(includedir)/curl
-# curlbuild.h does not exist in the git tree. When the original libcurl
-# source code distribution archive file is created, curlbuild.h.dist is
-# renamed to curlbuild.h and included in the tarball so that it can be
-# used directly on non-configure systems.
-#
-# The distributed curlbuild.h will be overwritten on configure systems
-# when the configure script runs, with one that is suitable and specific
-# to the library being configured and built.
-#
-# curlbuild.h.in is the distributed template file from which the configure
-# script creates curlbuild.h at library configuration time, overwiting the
-# one included in the distribution archive.
-#
-# curlbuild.h.dist is not included in the source code distribution archive.
-
-EXTRA_DIST = curlbuild.h.in
-
-DISTCLEANFILES = curlbuild.h
-
checksrc:
- @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST)
+ @@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
diff --git a/include/curl/Makefile.in b/include/curl/Makefile.in
index dc790db5..a8baec76 100644
--- a/include/curl/Makefile.in
+++ b/include/curl/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = include/curl
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -111,7 +112,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \
$(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -162,8 +163,7 @@ am__uninstall_files_from_dir = { \
}
am__installdirs = "$(DESTDIR)$(pkgincludedir)"
HEADERS = $(pkginclude_HEADERS)
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
- $(LISP)curlbuild.h.in
+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.
@@ -182,7 +182,7 @@ am__define_uniq_tagged_files = \
done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/curlbuild.h.in
+am__DIST_COMMON = $(srcdir)/Makefile.in
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
pkgincludedir = $(includedir)/curl
ACLOCAL = @ACLOCAL@
@@ -199,6 +199,12 @@ 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@
@@ -238,6 +244,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -250,6 +258,7 @@ 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@
@@ -383,7 +392,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -399,27 +408,9 @@ top_srcdir = @top_srcdir@
###########################################################################
pkginclude_HEADERS = \
curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h curlbuild.h curlrules.h
+ typecheck-gcc.h system.h
-
-# curlbuild.h does not exist in the git tree. When the original libcurl
-# source code distribution archive file is created, curlbuild.h.dist is
-# renamed to curlbuild.h and included in the tarball so that it can be
-# used directly on non-configure systems.
-#
-# The distributed curlbuild.h will be overwritten on configure systems
-# when the configure script runs, with one that is suitable and specific
-# to the library being configured and built.
-#
-# curlbuild.h.in is the distributed template file from which the configure
-# script creates curlbuild.h at library configuration time, overwiting the
-# one included in the distribution archive.
-#
-# curlbuild.h.dist is not included in the source code distribution archive.
-EXTRA_DIST = curlbuild.h.in
-DISTCLEANFILES = curlbuild.h
-all: curlbuild.h
- $(MAKE) $(AM_MAKEFLAGS) all-am
+all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@@ -431,9 +422,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/curl/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/curl/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu include/curl/Makefile
+ $(AUTOMAKE) --foreign include/curl/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -452,17 +443,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-curlbuild.h: stamp-h2
- @test -f $@ || rm -f stamp-h2
- @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2
-
-stamp-h2: $(srcdir)/curlbuild.h.in $(top_builddir)/config.status
- @rm -f stamp-h2
- cd $(top_builddir) && $(SHELL) ./config.status include/curl/curlbuild.h
-
-distclean-hdr:
- -rm -f curlbuild.h stamp-h2
-
mostlyclean-libtool:
-rm -f *.lo
@@ -575,7 +555,7 @@ distdir: $(DISTFILES)
check-am: all-am
check: check-am
@CURLDEBUG_FALSE@all-local:
-all-am: Makefile $(HEADERS) curlbuild.h all-local
+all-am: Makefile $(HEADERS) all-local
installdirs:
for dir in "$(DESTDIR)$(pkgincludedir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
@@ -606,7 +586,6 @@ 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)
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@@ -617,7 +596,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-am
@@ -677,13 +656,13 @@ ps-am:
uninstall-am: uninstall-pkgincludeHEADERS
-.MAKE: all install-am install-strip
+.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
clean-generic clean-libtool cscopelist-am ctags ctags-am \
- distclean distclean-generic distclean-hdr distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
+ 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-pkgincludeHEADERS \
@@ -697,7 +676,7 @@ uninstall-am: uninstall-pkgincludeHEADERS
checksrc:
- @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST)
+ @@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
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 5b4ae469..82fb8aeb 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -35,8 +35,7 @@
#endif
#include "curlver.h" /* libcurl version defines */
-#include "curlbuild.h" /* libcurl build definitions */
-#include "curlrules.h" /* libcurl rules enforcement */
+#include "system.h" /* determine things run-time */
/*
* Define WIN32 when build target is Win32 API
@@ -193,6 +192,11 @@ typedef int (*curl_xferinfo_callback)(void *clientp,
curl_off_t ultotal,
curl_off_t ulnow);
+#ifndef CURL_MAX_READ_SIZE
+ /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */
+#define CURL_MAX_READ_SIZE 524288
+#endif
+
#ifndef CURL_MAX_WRITE_SIZE
/* Tests have proven that 20K is a very bad buffer size for uploads on
Windows, while 16K for some odd reason performed a lot better.
@@ -479,7 +483,7 @@ typedef enum {
CURLE_LDAP_CANNOT_BIND, /* 38 */
CURLE_LDAP_SEARCH_FAILED, /* 39 */
CURLE_OBSOLETE40, /* 40 - NOT USED */
- CURLE_FUNCTION_NOT_FOUND, /* 41 */
+ CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */
CURLE_ABORTED_BY_CALLBACK, /* 42 */
CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */
CURLE_OBSOLETE44, /* 44 - NOT USED */
@@ -673,6 +677,8 @@ typedef enum {
#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2)
/* Deprecated since the advent of CURLAUTH_NEGOTIATE */
#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE
+/* Used for CURLOPT_SOCKS5_AUTH to stay terminologically correct */
+#define CURLAUTH_GSSAPI CURLAUTH_NEGOTIATE
#define CURLAUTH_NTLM (((unsigned long)1)<<3)
#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4)
#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5)
@@ -1595,7 +1601,7 @@ typedef enum {
CINIT(DNS_SERVERS, STRINGPOINT, 211),
/* Time-out accept operations (currently for FTP only) after this amount
- of miliseconds. */
+ of milliseconds. */
CINIT(ACCEPTTIMEOUT_MS, LONG, 212),
/* Set TCP keepalive */
@@ -1770,6 +1776,18 @@ typedef enum {
this option is used only if PROXY_SSL_VERIFYPEER is true */
CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263),
+ /* Path to an abstract Unix domain socket */
+ CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264),
+
+ /* Suppress proxy CONNECT response headers from user callbacks */
+ CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265),
+
+ /* The request target, instead of extracted from the URL */
+ CINIT(REQUEST_TARGET, STRINGPOINT, 266),
+
+ /* bitmask of allowed auth methods for connections to SOCKS5 proxies */
+ CINIT(SOCKS5_AUTH, LONG, 267),
+
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -1876,6 +1894,18 @@ enum {
CURL_SSLVERSION_LAST /* never use, keep last */
};
+enum {
+ CURL_SSLVERSION_MAX_NONE = 0,
+ CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16),
+ CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16),
+ CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16),
+ CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16),
+ CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16),
+
+ /* never use, keep last */
+ CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16)
+};
+
enum CURL_TLSAUTH {
CURL_TLSAUTH_NONE,
CURL_TLSAUTH_SRP,
@@ -2227,7 +2257,9 @@ struct curl_tlssessioninfo {
#define CURLINFO_LONG 0x200000
#define CURLINFO_DOUBLE 0x300000
#define CURLINFO_SLIST 0x400000
+#define CURLINFO_PTR 0x400000 /* same as SLIST */
#define CURLINFO_SOCKET 0x500000
+#define CURLINFO_OFF_T 0x600000
#define CURLINFO_MASK 0x0fffff
#define CURLINFO_TYPEMASK 0xf00000
@@ -2240,15 +2272,21 @@ typedef enum {
CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5,
CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6,
CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7,
+ CURLINFO_SIZE_UPLOAD_T = CURLINFO_OFF_T + 7,
CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8,
+ CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 8,
CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9,
+ CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T + 9,
CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10,
+ CURLINFO_SPEED_UPLOAD_T = CURLINFO_OFF_T + 10,
CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11,
CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12,
CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13,
CURLINFO_FILETIME = CURLINFO_LONG + 14,
CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15,
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T + 15,
CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16,
+ CURLINFO_CONTENT_LENGTH_UPLOAD_T = CURLINFO_OFF_T + 16,
CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18,
CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19,
@@ -2266,7 +2304,7 @@ typedef enum {
CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31,
CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32,
CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33,
- CURLINFO_CERTINFO = CURLINFO_SLIST + 34,
+ CURLINFO_CERTINFO = CURLINFO_PTR + 34,
CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35,
CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36,
CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37,
@@ -2275,9 +2313,9 @@ typedef enum {
CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40,
CURLINFO_LOCAL_IP = CURLINFO_STRING + 41,
CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42,
- CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43,
+ CURLINFO_TLS_SESSION = CURLINFO_PTR + 43,
CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44,
- CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45,
+ CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45,
CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46,
CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47,
CURLINFO_PROTOCOL = CURLINFO_LONG + 48,
@@ -2438,7 +2476,7 @@ typedef struct {
#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */
#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */
#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper
- is suported */
+ is supported */
#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */
#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */
#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */
diff --git a/include/curl/curlbuild.h.cmake b/include/curl/curlbuild.h.cmake
deleted file mode 100644
index bbb31a94..00000000
--- a/include/curl/curlbuild.h.cmake
+++ /dev/null
@@ -1,197 +0,0 @@
-#ifndef __CURL_CURLBUILD_H
-#define __CURL_CURLBUILD_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, 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.
- *
- ***************************************************************************/
-
-/* ================================================================ */
-/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */
-/* ================================================================ */
-
-/*
- * NOTE 1:
- * -------
- *
- * Nothing in this file is intended to be modified or adjusted by the
- * curl library user nor by the curl library builder.
- *
- * If you think that something actually needs to be changed, adjusted
- * or fixed in this file, then, report it on the libcurl development
- * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/
- *
- * This header file shall only export symbols which are 'curl' or 'CURL'
- * prefixed, otherwise public name space would be polluted.
- *
- * NOTE 2:
- * -------
- *
- * Right now you might be staring at file include/curl/curlbuild.h.in or
- * at file include/curl/curlbuild.h, this is due to the following reason:
- *
- * On systems capable of running the configure script, the configure process
- * will overwrite the distributed include/curl/curlbuild.h file with one that
- * is suitable and specific to the library being configured and built, which
- * is generated from the include/curl/curlbuild.h.in template file.
- *
- */
-
-/* ================================================================ */
-/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */
-/* ================================================================ */
-
-#ifdef CURL_SIZEOF_LONG
-#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
-#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_SOCKLEN_T
-#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_OFF_T
-#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_T
-#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_TU
-#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined
-#endif
-
-#ifdef CURL_FORMAT_OFF_T
-#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_OFF_T
-#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_T
-#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_TU
-#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined
-#endif
-
-/* ================================================================ */
-/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */
-/* ================================================================ */
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file ws2tcpip.h must be included by the external interface. */
-#cmakedefine CURL_PULL_WS2TCPIP_H
-#ifdef CURL_PULL_WS2TCPIP_H
-# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-# endif
-# include <windows.h>
-# include <winsock2.h>
-# include <ws2tcpip.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/types.h must be included by the external interface. */
-#cmakedefine CURL_PULL_SYS_TYPES_H
-#ifdef CURL_PULL_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file stdint.h must be included by the external interface. */
-#cmakedefine CURL_PULL_STDINT_H
-#ifdef CURL_PULL_STDINT_H
-# include <stdint.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file inttypes.h must be included by the external interface. */
-#cmakedefine CURL_PULL_INTTYPES_H
-#ifdef CURL_PULL_INTTYPES_H
-# include <inttypes.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/socket.h must be included by the external interface. */
-#cmakedefine CURL_PULL_SYS_SOCKET_H
-#ifdef CURL_PULL_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/poll.h must be included by the external interface. */
-#cmakedefine CURL_PULL_SYS_POLL_H
-#ifdef CURL_PULL_SYS_POLL_H
-# include <sys/poll.h>
-#endif
-
-/* The size of `long', as computed by sizeof. */
-#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG}
-
-/* Integral data type used for curl_socklen_t. */
-#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T}
-
-/* The size of `curl_socklen_t', as computed by sizeof. */
-#define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T}
-
-/* Data type definition of curl_socklen_t. */
-typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
-
-/* Signed integral data type used for curl_off_t. */
-#define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T}
-
-/* Data type definition of curl_off_t. */
-typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
-
-/* curl_off_t formatting string directive without "%" conversion specifier. */
-#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}"
-
-/* unsigned curl_off_t formatting string without "%" conversion specifier. */
-#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}"
-
-/* curl_off_t formatting string directive with "%" conversion specifier. */
-#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}"
-
-/* The size of `curl_off_t', as computed by sizeof. */
-#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T}
-
-/* curl_off_t constant suffix. */
-#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T}
-
-/* unsigned curl_off_t constant suffix. */
-#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU}
-
-#endif /* __CURL_CURLBUILD_H */
diff --git a/include/curl/curlbuild.h.in b/include/curl/curlbuild.h.in
deleted file mode 100644
index ffab3567..00000000
--- a/include/curl/curlbuild.h.in
+++ /dev/null
@@ -1,197 +0,0 @@
-#ifndef __CURL_CURLBUILD_H
-#define __CURL_CURLBUILD_H
-/***************************************************************************
- * _ _ ____ _
- * 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.
- *
- ***************************************************************************/
-
-/* ================================================================ */
-/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */
-/* ================================================================ */
-
-/*
- * NOTE 1:
- * -------
- *
- * Nothing in this file is intended to be modified or adjusted by the
- * curl library user nor by the curl library builder.
- *
- * If you think that something actually needs to be changed, adjusted
- * or fixed in this file, then, report it on the libcurl development
- * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/
- *
- * This header file shall only export symbols which are 'curl' or 'CURL'
- * prefixed, otherwise public name space would be polluted.
- *
- * NOTE 2:
- * -------
- *
- * Right now you might be staring at file include/curl/curlbuild.h.in or
- * at file include/curl/curlbuild.h, this is due to the following reason:
- *
- * On systems capable of running the configure script, the configure process
- * will overwrite the distributed include/curl/curlbuild.h file with one that
- * is suitable and specific to the library being configured and built, which
- * is generated from the include/curl/curlbuild.h.in template file.
- *
- */
-
-/* ================================================================ */
-/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */
-/* ================================================================ */
-
-#ifdef CURL_SIZEOF_LONG
-#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
-#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_SOCKLEN_T
-#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_OFF_T
-#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_T
-#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_TU
-#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined
-#endif
-
-#ifdef CURL_FORMAT_OFF_T
-#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_OFF_T
-#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_T
-#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_TU
-#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined
-#endif
-
-/* ================================================================ */
-/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */
-/* ================================================================ */
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file ws2tcpip.h must be included by the external interface. */
-#undef CURL_PULL_WS2TCPIP_H
-#ifdef CURL_PULL_WS2TCPIP_H
-# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-# endif
-# include <windows.h>
-# include <winsock2.h>
-# include <ws2tcpip.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/types.h must be included by the external interface. */
-#undef CURL_PULL_SYS_TYPES_H
-#ifdef CURL_PULL_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file stdint.h must be included by the external interface. */
-#undef CURL_PULL_STDINT_H
-#ifdef CURL_PULL_STDINT_H
-# include <stdint.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file inttypes.h must be included by the external interface. */
-#undef CURL_PULL_INTTYPES_H
-#ifdef CURL_PULL_INTTYPES_H
-# include <inttypes.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/socket.h must be included by the external interface. */
-#undef CURL_PULL_SYS_SOCKET_H
-#ifdef CURL_PULL_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-
-/* Configure process defines this to 1 when it finds out that system */
-/* header file sys/poll.h must be included by the external interface. */
-#undef CURL_PULL_SYS_POLL_H
-#ifdef CURL_PULL_SYS_POLL_H
-# include <sys/poll.h>
-#endif
-
-/* The size of `long', as computed by sizeof. */
-#undef CURL_SIZEOF_LONG
-
-/* Integral data type used for curl_socklen_t. */
-#undef CURL_TYPEOF_CURL_SOCKLEN_T
-
-/* The size of `curl_socklen_t', as computed by sizeof. */
-#undef CURL_SIZEOF_CURL_SOCKLEN_T
-
-/* Data type definition of curl_socklen_t. */
-typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
-
-/* Signed integral data type used for curl_off_t. */
-#undef CURL_TYPEOF_CURL_OFF_T
-
-/* Data type definition of curl_off_t. */
-typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
-
-/* curl_off_t formatting string directive without "%" conversion specifier. */
-#undef CURL_FORMAT_CURL_OFF_T
-
-/* unsigned curl_off_t formatting string without "%" conversion specifier. */
-#undef CURL_FORMAT_CURL_OFF_TU
-
-/* curl_off_t formatting string directive with "%" conversion specifier. */
-#undef CURL_FORMAT_OFF_T
-
-/* The size of `curl_off_t', as computed by sizeof. */
-#undef CURL_SIZEOF_CURL_OFF_T
-
-/* curl_off_t constant suffix. */
-#undef CURL_SUFFIX_CURL_OFF_T
-
-/* unsigned curl_off_t constant suffix. */
-#undef CURL_SUFFIX_CURL_OFF_TU
-
-#endif /* __CURL_CURLBUILD_H */
diff --git a/include/curl/curlrules.h b/include/curl/curlrules.h
deleted file mode 100644
index 55d21f68..00000000
--- a/include/curl/curlrules.h
+++ /dev/null
@@ -1,262 +0,0 @@
-#ifndef __CURL_CURLRULES_H
-#define __CURL_CURLRULES_H
-/***************************************************************************
- * _ _ ____ _
- * 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.
- *
- ***************************************************************************/
-
-/* ================================================================ */
-/* COMPILE TIME SANITY CHECKS */
-/* ================================================================ */
-
-/*
- * NOTE 1:
- * -------
- *
- * All checks done in this file are intentionally placed in a public
- * header file which is pulled by curl/curl.h when an application is
- * being built using an already built libcurl library. Additionally
- * this file is also included and used when building the library.
- *
- * If compilation fails on this file it is certainly sure that the
- * problem is elsewhere. It could be a problem in the curlbuild.h
- * header file, or simply that you are using different compilation
- * settings than those used to build the library.
- *
- * Nothing in this file is intended to be modified or adjusted by the
- * curl library user nor by the curl library builder.
- *
- * Do not deactivate any check, these are done to make sure that the
- * library is properly built and used.
- *
- * You can find further help on the libcurl development mailing list:
- * https://cool.haxx.se/mailman/listinfo/curl-library/
- *
- * NOTE 2
- * ------
- *
- * Some of the following compile time checks are based on the fact
- * that the dimension of a constant array can not be a negative one.
- * In this way if the compile time verification fails, the compilation
- * will fail issuing an error. The error description wording is compiler
- * dependent but it will be quite similar to one of the following:
- *
- * "negative subscript or subscript is too large"
- * "array must have at least one element"
- * "-1 is an illegal array size"
- * "size of array is negative"
- *
- * If you are building an application which tries to use an already
- * built libcurl library and you are getting this kind of errors on
- * this file, it is a clear indication that there is a mismatch between
- * how the library was built and how you are trying to use it for your
- * application. Your already compiled or binary library provider is the
- * only one who can give you the details you need to properly use it.
- */
-
-/*
- * Verify that some macros are actually defined.
- */
-
-#ifndef CURL_SIZEOF_LONG
-# error "CURL_SIZEOF_LONG definition is missing!"
- Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing
-#endif
-
-#ifndef CURL_TYPEOF_CURL_SOCKLEN_T
-# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!"
- Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing
-#endif
-
-#ifndef CURL_SIZEOF_CURL_SOCKLEN_T
-# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!"
- Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing
-#endif
-
-#ifndef CURL_TYPEOF_CURL_OFF_T
-# error "CURL_TYPEOF_CURL_OFF_T definition is missing!"
- Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing
-#endif
-
-#ifndef CURL_FORMAT_CURL_OFF_T
-# error "CURL_FORMAT_CURL_OFF_T definition is missing!"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing
-#endif
-
-#ifndef CURL_FORMAT_CURL_OFF_TU
-# error "CURL_FORMAT_CURL_OFF_TU definition is missing!"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing
-#endif
-
-#ifndef CURL_FORMAT_OFF_T
-# error "CURL_FORMAT_OFF_T definition is missing!"
- Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing
-#endif
-
-#ifndef CURL_SIZEOF_CURL_OFF_T
-# error "CURL_SIZEOF_CURL_OFF_T definition is missing!"
- Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing
-#endif
-
-#ifndef CURL_SUFFIX_CURL_OFF_T
-# error "CURL_SUFFIX_CURL_OFF_T definition is missing!"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing
-#endif
-
-#ifndef CURL_SUFFIX_CURL_OFF_TU
-# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing
-#endif
-
-/*
- * Macros private to this header file.
- */
-
-#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1
-
-#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1
-
-/*
- * Verify that the size previously defined and expected for long
- * is the same as the one reported by sizeof() at compile time.
- */
-
-typedef char
- __curl_rule_01__
- [CurlchkszEQ(long, CURL_SIZEOF_LONG)];
-
-/*
- * Verify that the size previously defined and expected for
- * curl_off_t is actually the the same as the one reported
- * by sizeof() at compile time.
- */
-
-typedef char
- __curl_rule_02__
- [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)];
-
-/*
- * Verify at compile time that the size of curl_off_t as reported
- * by sizeof() is greater or equal than the one reported for long
- * for the current compilation.
- */
-
-typedef char
- __curl_rule_03__
- [CurlchkszGE(curl_off_t, long)];
-
-/*
- * Verify that the size previously defined and expected for
- * curl_socklen_t is actually the the same as the one reported
- * by sizeof() at compile time.
- */
-
-typedef char
- __curl_rule_04__
- [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)];
-
-/*
- * Verify at compile time that the size of curl_socklen_t as reported
- * by sizeof() is greater or equal than the one reported for int for
- * the current compilation.
- */
-
-typedef char
- __curl_rule_05__
- [CurlchkszGE(curl_socklen_t, int)];
-
-/* ================================================================ */
-/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */
-/* ================================================================ */
-
-/*
- * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
- * these to be visible and exported by the external libcurl interface API,
- * while also making them visible to the library internals, simply including
- * curl_setup.h, without actually needing to include curl.h internally.
- * If some day this section would grow big enough, all this should be moved
- * to its own header file.
- */
-
-/*
- * Figure out if we can use the ## preprocessor operator, which is supported
- * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
- * or __cplusplus so we need to carefully check for them too.
- */
-
-#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
- defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
- defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
- defined(__ILEC400__)
- /* This compiler is believed to have an ISO compatible preprocessor */
-#define CURL_ISOCPP
-#else
- /* This compiler is believed NOT to have an ISO compatible preprocessor */
-#undef CURL_ISOCPP
-#endif
-
-/*
- * Macros for minimum-width signed and unsigned curl_off_t integer constants.
- */
-
-#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)
-#else
-# ifdef CURL_ISOCPP
-# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
-# else
-# define __CURL_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)
-#endif
-
-/*
- * Get rid of macros private to this header file.
- */
-
-#undef CurlchkszEQ
-#undef CurlchkszGE
-
-/*
- * Get rid of macros not intended to exist beyond this point.
- */
-
-#undef CURL_PULL_WS2TCPIP_H
-#undef CURL_PULL_SYS_TYPES_H
-#undef CURL_PULL_SYS_SOCKET_H
-#undef CURL_PULL_SYS_POLL_H
-#undef CURL_PULL_STDINT_H
-#undef CURL_PULL_INTTYPES_H
-
-#undef CURL_TYPEOF_CURL_SOCKLEN_T
-#undef CURL_TYPEOF_CURL_OFF_T
-
-#ifdef CURL_NO_OLDIES
-#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */
-#endif
-
-#endif /* __CURL_CURLRULES_H */
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index ae91b0d2..a03e313d 100644
--- a/include/curl/curlver.h
+++ b/include/curl/curlver.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -26,17 +26,17 @@
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 - 2016 Daniel Stenberg, <daniel@haxx.se>."
+#define LIBCURL_COPYRIGHT "1996 - 2017 Daniel Stenberg, <daniel@haxx.se>."
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.52.1"
+#define LIBCURL_VERSION "7.55.0"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 52
-#define LIBCURL_VERSION_PATCH 1
+#define LIBCURL_VERSION_MINOR 55
+#define LIBCURL_VERSION_PATCH 0
/* This is the numeric version of the libcurl version number, meant for easier
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
@@ -57,18 +57,18 @@
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 0x073401
+#define LIBCURL_VERSION_NUM 0x073700
/*
* This is the date and time when the full source package was created. The
* timestamp is not stored in git, as the timestamp is properly set in the
* tarballs by the maketgz script.
*
- * The format of the date should follow this template:
+ * The format of the date follows this template:
*
- * "Mon Feb 12 11:35:33 UTC 2007"
+ * "2007-11-23"
*/
-#define LIBCURL_TIMESTAMP "Fri Dec 23 07:22:31 UTC 2016"
+#define LIBCURL_TIMESTAMP "2017-08-09"
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
#define CURL_AT_LEAST_VERSION(x,y,z) \
diff --git a/include/curl/multi.h b/include/curl/multi.h
index d1e00cc5..f93e511b 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
@@ -218,7 +218,7 @@ CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
* curl_multi_cleanup().
*
* The 'CURLMsg' struct is meant to be very simple and only contain
- * very basic informations. If more involved information is wanted,
+ * very basic information. If more involved information is wanted,
* we will provide the particular "transfer handle" in that struct
* and that should/could/would be used in subsequent
* curl_easy_getinfo() calls (or similar). The point being that we
diff --git a/include/curl/curlbuild.h b/include/curl/system.h
index ae95095f..79abf8fc 100644
--- a/include/curl/curlbuild.h
+++ b/include/curl/system.h
@@ -1,5 +1,5 @@
-#ifndef __CURL_CURLBUILD_H
-#define __CURL_CURLBUILD_H
+#ifndef __CURL_SYSTEM_H
+#define __CURL_SYSTEM_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,153 +22,40 @@
*
***************************************************************************/
-/* ================================================================ */
-/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */
-/* ================================================================ */
-
-/*
- * NOTE 1:
- * -------
- *
- * See file include/curl/curlbuild.h.in, run configure, and forget
- * that this file exists it is only used for non-configure systems.
- * But you can keep reading if you want ;-)
- *
- */
-
-/* ================================================================ */
-/* NOTES FOR NON-CONFIGURE SYSTEMS */
-/* ================================================================ */
-
/*
- * NOTE 1:
- * -------
- *
- * Nothing in this file is intended to be modified or adjusted by the
- * curl library user nor by the curl library builder.
- *
- * If you think that something actually needs to be changed, adjusted
- * or fixed in this file, then, report it on the libcurl development
- * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/
- *
- * Try to keep one section per platform, compiler and architecture,
- * otherwise, if an existing section is reused for a different one and
- * later on the original is adjusted, probably the piggybacking one can
- * be adversely changed.
+ * Try to keep one section per platform, compiler and architecture, otherwise,
+ * if an existing section is reused for a different one and later on the
+ * original is adjusted, probably the piggybacking one can be adversely
+ * changed.
*
- * In order to differentiate between platforms/compilers/architectures
- * use only compiler built in predefined preprocessor symbols.
+ * In order to differentiate between platforms/compilers/architectures use
+ * only compiler built in predefined preprocessor symbols.
*
- * This header file shall only export symbols which are 'curl' or 'CURL'
- * prefixed, otherwise public name space would be polluted.
+ * curl_off_t
+ * ----------
*
- * NOTE 2:
- * -------
+ * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
+ * wide signed integral data type. The width of this data type must remain
+ * constant and independent of any possible large file support settings.
*
- * For any given platform/compiler curl_off_t must be typedef'ed to a
- * 64-bit wide signed integral data type. The width of this data type
- * must remain constant and independent of any possible large file
- * support settings.
+ * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit
+ * wide signed integral data type if there is no 64-bit type.
*
- * As an exception to the above, curl_off_t shall be typedef'ed to a
- * 32-bit wide signed integral data type if there is no 64-bit type.
- *
- * As a general rule, curl_off_t shall not be mapped to off_t. This
- * rule shall only be violated if off_t is the only 64-bit data type
- * available and the size of off_t is independent of large file support
- * settings. Keep your build on the safe side avoiding an off_t gating.
- * If you have a 64-bit off_t then take for sure that another 64-bit
- * data type exists, dig deeper and you will find it.
- *
- * NOTE 3:
- * -------
- *
- * Right now you might be staring at file include/curl/curlbuild.h.dist or
- * at file include/curl/curlbuild.h, this is due to the following reason:
- * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h
- * when the libcurl source code distribution archive file is created.
- *
- * File include/curl/curlbuild.h.dist is not included in the distribution
- * archive. File include/curl/curlbuild.h is not present in the git tree.
- *
- * The distributed include/curl/curlbuild.h file is only intended to be used
- * on systems which can not run the also distributed configure script.
- *
- * On systems capable of running the configure script, the configure process
- * will overwrite the distributed include/curl/curlbuild.h file with one that
- * is suitable and specific to the library being configured and built, which
- * is generated from the include/curl/curlbuild.h.in template file.
- *
- * If you check out from git on a non-configure platform, you must run the
- * appropriate buildconf* script to set up curlbuild.h and other local files.
+ * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
+ * only be violated if off_t is the only 64-bit data type available and the
+ * size of off_t is independent of large file support settings. Keep your
+ * build on the safe side avoiding an off_t gating. If you have a 64-bit
+ * off_t then take for sure that another 64-bit data type exists, dig deeper
+ * and you will find it.
*
*/
-/* ================================================================ */
-/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */
-/* ================================================================ */
-
-#ifdef CURL_SIZEOF_LONG
-# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
-# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_SOCKLEN_T
-# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined
-#endif
-
-#ifdef CURL_TYPEOF_CURL_OFF_T
-# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_T
-# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_FORMAT_CURL_OFF_TU
-# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined
-#endif
-
-#ifdef CURL_FORMAT_OFF_T
-# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SIZEOF_CURL_OFF_T
-# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_T
-# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined
-#endif
-
-#ifdef CURL_SUFFIX_CURL_OFF_TU
-# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h"
- Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined
-#endif
-
-/* ================================================================ */
-/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */
-/* ================================================================ */
-
#if defined(__DJGPP__) || defined(__GO32__)
# if defined(__DJGPP__) && (__DJGPP__ > 1)
# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -177,7 +64,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -190,7 +76,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -203,7 +88,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -212,7 +96,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
@@ -225,7 +108,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -238,7 +120,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
@@ -247,7 +128,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -261,7 +141,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -270,7 +149,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
@@ -279,7 +157,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -292,7 +169,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -305,7 +181,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -315,7 +190,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -324,7 +198,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -337,7 +210,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -349,7 +221,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
@@ -361,12 +232,13 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
-# define CURL_TYPEOF_CURL_SOCKLEN_T int
+# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
# define CURL_SIZEOF_CURL_SOCKLEN_T 4
+# define CURL_PULL_SYS_TYPES_H 1
+# define CURL_PULL_WS2TCPIP_H 1
#elif defined(__VMS)
# if defined(__VAX)
@@ -374,7 +246,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -383,7 +254,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -397,7 +267,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -418,7 +287,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -426,7 +294,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -434,7 +301,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -456,7 +322,6 @@
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -464,7 +329,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -472,7 +336,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -488,13 +351,25 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
# define CURL_TYPEOF_CURL_SOCKLEN_T int
# define CURL_SIZEOF_CURL_SOCKLEN_T 4
+#elif defined(__TINYC__) /* also known as tcc */
+
+# define CURL_SIZEOF_LONG 4
+# define CURL_TYPEOF_CURL_OFF_T long long
+# define CURL_FORMAT_CURL_OFF_T "lld"
+# define CURL_FORMAT_CURL_OFF_TU "llu"
+# define CURL_SIZEOF_CURL_OFF_T 8
+# define CURL_SUFFIX_CURL_OFF_T LL
+# define CURL_SUFFIX_CURL_OFF_TU ULL
+# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+# define CURL_PULL_SYS_TYPES_H 1
+# define CURL_PULL_SYS_SOCKET_H 1
+
/* ===================================== */
/* KEEP MSVC THE PENULTIMATE ENTRY */
/* ===================================== */
@@ -505,7 +380,6 @@
# define CURL_TYPEOF_CURL_OFF_T __int64
# define CURL_FORMAT_CURL_OFF_T "I64d"
# define CURL_FORMAT_CURL_OFF_TU "I64u"
-# define CURL_FORMAT_OFF_T "%I64d"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T i64
# define CURL_SUFFIX_CURL_OFF_TU ui64
@@ -514,7 +388,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 4
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -529,12 +402,12 @@
#elif defined(__GNUC__)
# if !defined(__LP64__) && (defined(__ILP32__) || \
defined(__i386__) || defined(__ppc__) || defined(__arm__) || \
- defined(__sparc__) || defined(__mips__) || defined(__sh__))
+ defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
+ defined(__XTENSA__))
# define CURL_SIZEOF_LONG 4
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
-# define CURL_FORMAT_OFF_T "%lld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T LL
# define CURL_SUFFIX_CURL_OFF_TU ULL
@@ -544,7 +417,6 @@
# define CURL_TYPEOF_CURL_OFF_T long
# define CURL_FORMAT_CURL_OFF_T "ld"
# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_FORMAT_OFF_T "%ld"
# define CURL_SIZEOF_CURL_OFF_T 8
# define CURL_SUFFIX_CURL_OFF_T L
# define CURL_SUFFIX_CURL_OFF_TU UL
@@ -555,8 +427,24 @@
# define CURL_PULL_SYS_SOCKET_H 1
#else
-# error "Unknown non-configure build target!"
- Error Compilation_aborted_Unknown_non_configure_build_target
+/* generic "safe guess" on old 32 bit style */
+# define CURL_SIZEOF_LONG 4
+# define CURL_SIZEOF_CURL_SOCKLEN_T 4
+# define CURL_SIZEOF_CURL_OFF_T 4
+# 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
+
+/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
+/* ws2tcpip.h is required here to properly make type definitions below. */
+#ifdef CURL_PULL_WS2TCPIP_H
+# include <winsock2.h>
+# include <windows.h>
+# include <ws2tcpip.h>
#endif
/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
@@ -572,7 +460,6 @@
#endif
/* Data type definition of curl_socklen_t. */
-
#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
#endif
@@ -583,4 +470,53 @@
typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
#endif
-#endif /* __CURL_CURLBUILD_H */
+/*
+ * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
+ * these to be visible and exported by the external libcurl interface API,
+ * while also making them visible to the library internals, simply including
+ * curl_setup.h, without actually needing to include curl.h internally.
+ * If some day this section would grow big enough, all this should be moved
+ * to its own header file.
+ */
+
+/*
+ * Figure out if we can use the ## preprocessor operator, which is supported
+ * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
+ * or __cplusplus so we need to carefully check for them too.
+ */
+
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
+ defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
+ defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
+ defined(__ILEC400__)
+ /* This compiler is believed to have an ISO compatible preprocessor */
+#define CURL_ISOCPP
+#else
+ /* This compiler is believed NOT to have an ISO compatible preprocessor */
+#undef CURL_ISOCPP
+#endif
+
+/*
+ * Macros for minimum-width signed and unsigned curl_off_t integer constants.
+ */
+
+#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)
+#else
+# ifdef CURL_ISOCPP
+# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
+# else
+# define __CURL_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)
+#endif
+
+#endif /* __CURL_SYSTEM_H */
+
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index 4eb896ea..74548241 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -110,7 +110,7 @@ __extension__ ({ \
/* FIXME: don't allow const pointers */
#define curl_easy_getinfo(handle, info, arg) \
__extension__ ({ \
- __typeof__(info) _curl_info = info; \
+ __typeof__(info) _curl_info = info; \
if(__builtin_constant_p(_curl_info)) { \
if(_curl_is_string_info(_curl_info)) \
if(!_curl_is_arr((arg), char *)) \
@@ -124,6 +124,18 @@ __extension__ ({ \
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); \
})
@@ -201,6 +213,16 @@ _CURL_WARNING(_curl_easy_getinfo_err_double,
"curl_easy_getinfo expects a pointer to double for this info")
_CURL_WARNING(_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,
+ "curl_easy_getinfo expects a pointer to "
+ "'struct curl_tlssessioninfo *' for this info")
+_CURL_WARNING(_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,
+ "curl_easy_getinfo expects a pointer to curl_socket_t for this info")
+_CURL_WARNING(_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 */
@@ -219,7 +241,8 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
/* evaluates to true if option takes a char* argument */
#define _curl_is_string_option(option) \
- ((option) == CURLOPT_ACCEPT_ENCODING || \
+ ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \
+ (option) == CURLOPT_ACCEPT_ENCODING || \
(option) == CURLOPT_CAINFO || \
(option) == CURLOPT_CAPATH || \
(option) == CURLOPT_COOKIE || \
@@ -248,11 +271,25 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
(option) == CURLOPT_NOPROXY || \
(option) == CURLOPT_PASSWORD || \
(option) == CURLOPT_PINNEDPUBLICKEY || \
+ (option) == CURLOPT_PRE_PROXY || \
(option) == CURLOPT_PROXY || \
(option) == CURLOPT_PROXYPASSWORD || \
(option) == CURLOPT_PROXYUSERNAME || \
(option) == CURLOPT_PROXYUSERPWD || \
+ (option) == CURLOPT_PROXY_CAINFO || \
+ (option) == CURLOPT_PROXY_CAPATH || \
+ (option) == CURLOPT_PROXY_CRLFILE || \
+ (option) == CURLOPT_PROXY_KEYPASSWD || \
+ (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \
(option) == CURLOPT_PROXY_SERVICE_NAME || \
+ (option) == CURLOPT_PROXY_SSLCERT || \
+ (option) == CURLOPT_PROXY_SSLCERTTYPE || \
+ (option) == CURLOPT_PROXY_SSLKEY || \
+ (option) == CURLOPT_PROXY_SSLKEYTYPE || \
+ (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \
+ (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \
+ (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
+ (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
(option) == CURLOPT_RANDOM_FILE || \
(option) == CURLOPT_RANGE || \
(option) == CURLOPT_REFERER || \
@@ -347,8 +384,23 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
(CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
/* true if info expects a pointer to struct curl_slist * argument */
-#define _curl_is_slist_info(info) \
- (CURLINFO_SLIST < (info))
+#define _curl_is_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) \
+ (((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)
+
+/* true if info expects a pointer to struct curl_socket_t argument */
+#define _curl_is_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) \
+ (CURLINFO_OFF_T < (info))
/* typecheck helpers -- check whether given expression has requested type*/
@@ -427,8 +479,9 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
#endif
/* evaluates to true if expr is of type FILE* */
-#define _curl_is_FILE(expr) \
- (__builtin_types_compatible_p(__typeof__(expr), FILE *))
+#define _curl_is_FILE(expr) \
+ (_curl_is_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) \
@@ -443,102 +496,102 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
* function pointers, hide it */
#define _curl_callback_compatible(func, type) \
(__builtin_types_compatible_p(__typeof__(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_read_callback or "similar" */
#define _curl_is_read_cb(expr) \
(_curl_is_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \
+ _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))
-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 *);
-typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void *);
-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 *);
+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 *);
+typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \
+ _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))
-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,
+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 *);
-typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE *);
-typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void *);
-typedef size_t (_curl_write_callback5)(const void *, size_t, size_t,
+typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
+typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
+typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
const void *);
-typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE *);
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \
+ _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))
-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 *);
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \
+ _curl_callback_compatible((expr), curl_sockopt_callback) || \
_curl_callback_compatible((expr), _curl_sockopt_callback1) || \
_curl_callback_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,
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\
+ _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))
-typedef curl_socket_t (_curl_opensocket_callback1)
+typedef curl_socket_t (*_curl_opensocket_callback1)
(void *, curlsocktype, struct curl_sockaddr *);
-typedef curl_socket_t (_curl_opensocket_callback2)
+typedef curl_socket_t (*_curl_opensocket_callback2)
(void *, curlsocktype, const struct curl_sockaddr *);
-typedef curl_socket_t (_curl_opensocket_callback3)
+typedef curl_socket_t (*_curl_opensocket_callback3)
(const void *, curlsocktype, struct curl_sockaddr *);
-typedef curl_socket_t (_curl_opensocket_callback4)
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \
+ _curl_callback_compatible((expr), curl_progress_callback) || \
_curl_callback_compatible((expr), _curl_progress_callback1) || \
_curl_callback_compatible((expr), _curl_progress_callback2))
-typedef int (_curl_progress_callback1)(void *,
+typedef int (*_curl_progress_callback1)(void *,
double, double, double, double);
-typedef int (_curl_progress_callback2)(const void *,
+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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \
+ _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) || \
@@ -547,28 +600,28 @@ typedef int (_curl_progress_callback2)(const void *,
_curl_callback_compatible((expr), _curl_debug_callback6) || \
_curl_callback_compatible((expr), _curl_debug_callback7) || \
_curl_callback_compatible((expr), _curl_debug_callback8))
-typedef int (_curl_debug_callback1) (CURL *,
+typedef int (*_curl_debug_callback1) (CURL *,
curl_infotype, char *, size_t, void *);
-typedef int (_curl_debug_callback2) (CURL *,
+typedef int (*_curl_debug_callback2) (CURL *,
curl_infotype, char *, size_t, const void *);
-typedef int (_curl_debug_callback3) (CURL *,
+typedef int (*_curl_debug_callback3) (CURL *,
curl_infotype, const char *, size_t, void *);
-typedef int (_curl_debug_callback4) (CURL *,
+typedef int (*_curl_debug_callback4) (CURL *,
curl_infotype, const char *, size_t, const void *);
-typedef int (_curl_debug_callback5) (CURL *,
+typedef int (*_curl_debug_callback5) (CURL *,
curl_infotype, unsigned char *, size_t, void *);
-typedef int (_curl_debug_callback6) (CURL *,
+typedef int (*_curl_debug_callback6) (CURL *,
curl_infotype, unsigned char *, size_t, const void *);
-typedef int (_curl_debug_callback7) (CURL *,
+typedef int (*_curl_debug_callback7) (CURL *,
curl_infotype, const unsigned char *, size_t, void *);
-typedef int (_curl_debug_callback8) (CURL *,
+typedef int (*_curl_debug_callback8) (CURL *,
curl_infotype, const unsigned char *, size_t, const void *);
/* 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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \
+ _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) || \
@@ -577,18 +630,19 @@ typedef int (_curl_debug_callback8) (CURL *,
_curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \
_curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \
_curl_callback_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 *);
-typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *);
+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 *);
+typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
+ const void *);
#ifdef HEADER_SSL_H
/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX
* this will of course break if we're included before OpenSSL headers...
*/
-typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);
-typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);
-typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);
-typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX,
+typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);
+typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX,
const void *);
#else
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
@@ -600,7 +654,7 @@ typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
/* evaluates to true if expr is of type curl_conv_callback or "similar" */
#define _curl_is_conv_cb(expr) \
(_curl_is_NULL(expr) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \
+ _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) || \
@@ -613,7 +667,7 @@ 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) || \
- __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \
+ _curl_callback_compatible((expr), curl_seek_callback) || \
_curl_callback_compatible((expr), _curl_seek_callback1) || \
_curl_callback_compatible((expr), _curl_seek_callback2))
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index eb2de6d8..d6c99618 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -1,7 +1,5 @@
set(LIB_NAME libcurl)
-configure_file(${CURL_SOURCE_DIR}/include/curl/curlbuild.h.cmake
- ${CURL_BINARY_DIR}/include/curl/curlbuild.h)
configure_file(curl_config.h.cmake
${CMAKE_CURRENT_BINARY_DIR}/curl_config.h)
@@ -10,11 +8,11 @@ include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake)
list(APPEND HHEADERS
${CMAKE_CURRENT_BINARY_DIR}/curl_config.h
- ${CURL_BINARY_DIR}/include/curl/curlbuild.h
)
if(MSVC)
list(APPEND CSOURCES libcurl.rc)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
endif()
# SET(CSOURCES
@@ -100,6 +98,13 @@ if(WIN32)
if(NOT CURL_STATICLIB)
# Add "_imp" as a suffix before the extension to avoid conflicting with the statically linked "libcurl.lib"
set_target_properties(${LIB_NAME} PROPERTIES IMPORT_SUFFIX "_imp.lib")
+
+ set_target_properties (${LIB_NAME} PROPERTIES
+ DEBUG_POSTFIX "-d"
+ # Note: no postfix for release variants, let user choose what style of release he wants
+ # MINSIZEREL_POSTFIX "-z"
+ # RELWITHDEBINFO_POSTFIX "-g"
+ )
endif()
endif()
diff --git a/lib/Makefile.Watcom b/lib/Makefile.Watcom
index cbc54cfc..77e5a6e0 100644
--- a/lib/Makefile.Watcom
+++ b/lib/Makefile.Watcom
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2005 - 2009, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2005 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2005 - 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
@@ -81,7 +81,7 @@ RD = rmdir /q /s 2>NUL
SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"
CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm &
- -wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV &
+ -wcd=201 -bt=nt -d+ -dWIN32 &
-dBUILDING_LIBCURL -I. -I"../include" $(SYS_INCL)
!ifdef %debug
@@ -192,14 +192,13 @@ OBJS4 = $(OBJS3: = ./)
OBJS_STAT = $(OBJS4:./=$(OBJ_STAT)/)
OBJS_DYN = $(OBJS4:./=$(OBJ_DYN)/)
-CURLBUILDH = ../include/curl/curlbuild.h
RESOURCE = $(OBJ_DYN)/libcurl.res
DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn
.c : vauth vtls
-all: $(CURLBUILDH) $(DIRS) $(TARGETS) .SYMBOLIC
+all: $(DIRS) $(TARGETS) .SYMBOLIC
@echo Welcome to libcurl
clean: .SYMBOLIC
@@ -216,9 +215,6 @@ vclean distclean: clean .SYMBOLIC
$(DIRS):
-$(MD) $^@
-$(CURLBUILDH): .EXISTSONLY
- $(CP) $^@.dist $^@
-
$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__)
%create $(LINK_ARG)
@%append $(LINK_ARG) system nt dll
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 12aaf614..176bf334 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -23,7 +23,7 @@ AUTOMAKE_OPTIONS = foreign nostdinc
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
-EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 config-win32.h \
+EXTRA_DIST = Makefile.b32 Makefile.m32 config-win32.h \
config-win32ce.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 \
@@ -48,17 +48,13 @@ CFLAGS += @CURL_CFLAG_EXTRAS@
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "private" files
# $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file
# $(top_srcdir)/ares is for in-tree c-ares's external include files
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib
@@ -106,6 +102,10 @@ 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
diff --git a/lib/Makefile.b32 b/lib/Makefile.b32
index 48138615..5b5b5fa9 100644
--- a/lib/Makefile.b32
+++ b/lib/Makefile.b32
@@ -109,7 +109,7 @@ LINKLIB = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\l
!include Makefile.inc
# Borland's command line librarian program TLIB version 4.5 is not capable
-# of building a library when any of its objects contains an hypen in its
+# of building a library when any of its objects contains an hyphen in its
# name, due to a command line parsing bug. In order to workaround this, we
# build source files with hyphens in their name as objects with underscores
# using explicit compilation build rules instead of implicit ones.
diff --git a/lib/Makefile.in b/lib/Makefile.in
index 10d6f4af..7228ed6f 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -122,7 +122,8 @@ host_triplet = @host@
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_8 = $(CFLAG_CURL_SYMBOL_HIDING)
subdir = lib
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -143,7 +144,7 @@ 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 = curl_config.h $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = curl_config.h
CONFIG_CLEAN_FILES = libcurl.vers
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -403,6 +404,12 @@ 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@
@@ -442,6 +449,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -454,6 +463,7 @@ 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@
@@ -589,7 +599,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -605,7 +615,7 @@ top_srcdir = @top_srcdir@
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
-EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 config-win32.h \
+EXTRA_DIST = Makefile.b32 Makefile.m32 config-win32.h \
config-win32ce.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 \
@@ -623,8 +633,6 @@ lib_LTLIBRARIES = libcurl.la
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "private" files
@@ -643,8 +651,7 @@ lib_LTLIBRARIES = libcurl.la
# 3. if interfaces were removed, then use C+1:0:0
#
# For the full guide on libcurl ABI rules, see docs/libcurl/ABI
-AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \
- -I$(top_srcdir)/include -I$(top_builddir)/lib \
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \
-I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL
@SONAME_BUMP_FALSE@VERSIONINFO = -version-info 8:0:4
@@ -661,9 +668,9 @@ AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \
AM_LDFLAGS =
AM_CFLAGS =
libcurl_la_CPPFLAGS_EXTRA = $(am__append_6) $(am__append_7)
-libcurl_la_LDFLAGS_EXTRA = $(am__append_2) $(am__append_3) \
- $(am__append_4) $(am__append_5)
-libcurl_la_CFLAGS_EXTRA = $(am__append_8)
+libcurl_la_LDFLAGS_EXTRA = $(CODE_COVERAGE_LDFLAGS) $(am__append_2) \
+ $(am__append_3) $(am__append_4) $(am__append_5)
+libcurl_la_CFLAGS_EXTRA = $(CODE_COVERAGE_CFLAGS) $(am__append_8)
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)
@@ -3201,6 +3208,8 @@ 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]
diff --git a/lib/Makefile.m32 b/lib/Makefile.m32
index 522dbd1d..8e4c7033 100644
--- a/lib/Makefile.m32
+++ b/lib/Makefile.m32
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 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
@@ -77,7 +77,7 @@ LIBCARES_PATH = $(PROOT)/ares
endif
CC = $(CROSSPREFIX)gcc
-CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall
+CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall -W
CFLAGS += -fno-strict-aliasing
# comment LDFLAGS below to keep debug info
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_DLL) -s
@@ -250,8 +250,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 \
- -DCURL_WANTS_CA_BUNDLE_ENV
+ -DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5
DLL_LIBS += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
ifdef SRP
ifeq "$(wildcard $(OPENSSL_INCLUDE)/openssl/srp.h)" "$(OPENSSL_INCLUDE)/openssl/srp.h"
@@ -340,24 +339,17 @@ $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE) $(libcurl_dll_DEPENDENC
-Wl,--output-def,$(@:.dll=.def),--out-implib,$(libcurl_dll_a_LIBRARY) \
$(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS)
-%.o: %.c $(PROOT)/include/curl/curlbuild.h
+%.o: %.c
$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@
%.res: %.rc
$(RC) $(RCFLAGS) -i $< -o $@
clean:
-ifeq "$(wildcard $(PROOT)/include/curl/curlbuild.h.dist)" "$(PROOT)/include/curl/curlbuild.h.dist"
- @$(call DEL, $(PROOT)/include/curl/curlbuild.h)
-endif
@$(call DEL, $(libcurl_a_OBJECTS) $(RESOURCE))
distclean vclean: clean
@$(call DEL, $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY) $(libcurl_dll_LIBRARY:.dll=.def) $(libcurl_dll_a_LIBRARY))
-$(PROOT)/include/curl/curlbuild.h:
- @echo Creating $@
- @$(call COPY, $@.dist, $@)
-
$(LIBCARES_PATH)/libcares.a:
$(MAKE) -C $(LIBCARES_PATH) -f Makefile.m32
diff --git a/lib/Makefile.netware b/lib/Makefile.netware
index f689a36f..a4ec4c8f 100644
--- a/lib/Makefile.netware
+++ b/lib/Makefile.netware
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2004 - 2015, Guenter Knauf, <http://www.gknw.net/phpbb>.
-# Copyright (C) 2001 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2001 - 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
@@ -166,7 +166,7 @@ endif
CFLAGS += -align 4
else
# PRELUDE = $(NDK_CLIB)/imports/clibpre.o
- # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
+ # to avoid the __init_* / __deinit_* whoes don't use prelude from NDK
PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
# CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
CFLAGS += -align 1
@@ -192,7 +192,7 @@ else
endif
else
PRELUDE = $(NDK_CLIB)/imports/clibpre.gcc.o
- # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
+ # to avoid the __init_* / __deinit_* whoes don't use prelude from NDK
# http://www.gknw.net/development/mk_nlm/gcc_pre.zip
# PRELUDE = $(NDK_ROOT)/pre/prelude.o
CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
@@ -359,7 +359,7 @@ nlm: prebuild $(TARGET).nlm
lib: prebuild $(TARGET).$(LIBEXT)
-prebuild: $(OBJDIR) $(CURL_INC)/curl/curlbuild.h $(OBJDIR)/version.inc curl_config.h
+prebuild: $(OBJDIR) $(OBJDIR)/version.inc curl_config.h
$(OBJDIR)/%.o: %.c
# @echo Compiling $<
@@ -752,44 +752,6 @@ else
@echo IPv6 support: no
endif
-$(CURL_INC)/curl/curlbuild.h: Makefile.netware FORCE
- @echo Creating $@
- @echo $(DL)/* $@ intended for NetWare target.$(DL) > $@
- @echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
- @echo $(DL)** All your changes will be lost!!$(DL) >> $@
- @echo $(DL)*/$(DL) >> $@
- @echo $(DL)#ifndef NETWARE$(DL) >> $@
- @echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@
- @echo $(DL)#endif$(DL) >> $@
- @echo $(DL)#ifndef __CURL_CURLBUILD_H$(DL) >> $@
- @echo $(DL)#define __CURL_CURLBUILD_H$(DL) >> $@
-ifeq ($(LIBARCH),LIBC)
- @echo $(DL)#define CURL_SIZEOF_LONG 4$(DL) >> $@
- @echo $(DL)#define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int$(DL) >> $@
- @echo $(DL)#define CURL_SIZEOF_CURL_SOCKLEN_T 4$(DL) >> $@
- @echo $(DL)#define CURL_TYPEOF_CURL_OFF_T long long$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_CURL_OFF_T "lld"$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_CURL_OFF_TU "llu"$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_OFF_T "$(PCT)lld"$(DL) >> $@
- @echo $(DL)#define CURL_SIZEOF_CURL_OFF_T 8$(DL) >> $@
- @echo $(DL)#define CURL_SUFFIX_CURL_OFF_T LL$(DL) >> $@
- @echo $(DL)#define CURL_SUFFIX_CURL_OFF_TU ULL$(DL) >> $@
-else
- @echo $(DL)#define CURL_SIZEOF_LONG 4$(DL) >> $@
- @echo $(DL)#define CURL_TYPEOF_CURL_SOCKLEN_T int$(DL) >> $@
- @echo $(DL)#define CURL_SIZEOF_CURL_SOCKLEN_T 4$(DL) >> $@
- @echo $(DL)#define CURL_TYPEOF_CURL_OFF_T long$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_CURL_OFF_T "ld"$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_CURL_OFF_TU "lu"$(DL) >> $@
- @echo $(DL)#define CURL_FORMAT_OFF_T "$(PCT)ld"$(DL) >> $@
- @echo $(DL)#define CURL_SIZEOF_CURL_OFF_T 4$(DL) >> $@
- @echo $(DL)#define CURL_SUFFIX_CURL_OFF_T L$(DL) >> $@
- @echo $(DL)#define CURL_SUFFIX_CURL_OFF_TU UL$(DL) >> $@
-endif
- @echo $(DL)typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;$(DL) >> $@
- @echo $(DL)typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;$(DL) >> $@
- @echo $(DL)#endif /* __CURL_CURLBUILD_H */$(DL) >> $@
-
$(LIBCARES_PATH)/libcares.$(LIBEXT):
$(MAKE) -C $(LIBCARES_PATH) -f Makefile.netware lib
diff --git a/lib/Makefile.vc10 b/lib/Makefile.vc10
deleted file mode 100644
index d542462d..00000000
--- a/lib/Makefile.vc10
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC10
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC10 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc10 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc11 b/lib/Makefile.vc11
deleted file mode 100644
index 574d39be..00000000
--- a/lib/Makefile.vc11
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC11
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC11 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc11 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc12 b/lib/Makefile.vc12
deleted file mode 100644
index d6937c8f..00000000
--- a/lib/Makefile.vc12
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC12
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC12 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc12 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc14 b/lib/Makefile.vc14
deleted file mode 100644
index 8d51139d..00000000
--- a/lib/Makefile.vc14
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC14
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC14 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc14 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc6 b/lib/Makefile.vc6
deleted file mode 100644
index d028428a..00000000
--- a/lib/Makefile.vc6
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC6
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC6 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /GZ
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc6 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc7 b/lib/Makefile.vc7
deleted file mode 100644
index 1b2d5ba8..00000000
--- a/lib/Makefile.vc7
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC7
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC7 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /GZ
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc6 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc8 b/lib/Makefile.vc8
deleted file mode 100644
index 067b0498..00000000
--- a/lib/Makefile.vc8
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC8
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC8 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib bufferoverflowu.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc6 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/Makefile.vc9 b/lib/Makefile.vc9
deleted file mode 100644
index c2106495..00000000
--- a/lib/Makefile.vc9
+++ /dev/null
@@ -1,691 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-library.
-
-###########################################################################
-#
-# Makefile for building libcurl with MSVC9
-#
-# Usage: see usage message below
-# Should be invoked from \lib directory
-# Edit the paths and desired library name
-# SSL path is only required if you intend compiling
-# with SSL.
-#
-# This make file leaves the result either a .lib or .dll file
-# in the \lib directory. It should be called from the \lib
-# directory.
-#
-# An option would have been to allow the source directory to
-# be specified, but I saw no requirement.
-#
-# Another option would have been to leave the .lib and .dll
-# files in the "cfg" directory, but then the make file
-# in \src would need to be changed.
-#
-##############################################################
-
-# ----------------------------------------------
-# Verify that current subdir is libcurl's 'lib'
-# ----------------------------------------------
-
-!IF ! EXIST(.\curl_addrinfo.c)
-! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
-! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF LIBSSH2_PATH
-LIBSSH2_PATH = ../../libssh2-1.5.0
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC9 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-#############################################################
-## Nothing more to do below this line!
-
-CCNODBG = cl.exe /O2 /DNDEBUG
-CCDEBUG = cl.exe /Od /Gm /Zi /D_DEBUG /RTC1
-CFLAGSSSL = /DUSE_OPENSSL /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
-CFLAGSWINSSL = /DUSE_SCHANNEL
-CFLAGSSSH2 = /DUSE_LIBSSH2 /DCURL_DISABLE_LDAP /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /I "$(LIBSSH2_PATH)/include"
-CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-CFLAGS = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-CFLAGSLIB = /DCURL_STATICLIB
-LNKDLL = link.exe /DLL
-LNKLIB = link.exe /lib
-LFLAGS = /nologo /machine:$(MACHINE)
-SSLLIBS = libeay32.lib ssleay32.lib
-WINSSLLIBS = crypt32.lib
-ZLIBLIBSDLL = zdll.lib
-ZLIBLIBS = zlib.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-CFLAGS = $(CFLAGS)
-
-CFGSET = FALSE
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-!IFDEF USE_IPV6
-CFLAGS = $(CFLAGS) /DUSE_IPV6
-!ENDIF
-
-!IFDEF USE_IDN
-CFLAGS = $(CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
-!ENDIF
-
-##############################################################
-# Runtime library configuration
-
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-
-######################
-# release
-
-!IF "$(CFG)" == "release"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl
-
-!IF "$(CFG)" == "release-ssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl
-
-!IF "$(CFG)" == "release-winssl"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib
-
-!IF "$(CFG)" == "release-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-winssl-zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSZLIB) $(WINSSLLIBS) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSWINSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "release-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll
-
-!IF "$(CFG)" == "release-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-zlib-dll
-
-!IF "$(CFG)" == "release-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# release-dll
-
-!IF "$(CFG)" == "release-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# release-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_REL)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
-CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug
-
-!IF "$(CFG)" == "debug"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl
-
-!IF "$(CFG)" == "debug-ssl"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib
-
-!IF "$(CFG)" == "debug-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-zlib
-
-!IF "$(CFG)" == "debug-ssl-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-ssh2-zlib
-
-!IF "$(CFG)" == "debug-ssl-ssh2-zlib"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSH2 = "/LIBPATH:$(LIBSSH2_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
-LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSSSH2) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSSSH2) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll
-
-!IF "$(CFG)" == "debug-ssl-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-zlib-dll
-
-!IF "$(CFG)" == "debug-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_STA_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
-CFGSET = TRUE
-!ENDIF
-
-######################
-# debug-dll
-
-!IF "$(CFG)" == "debug-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-######################
-# debug-dll-ssl-dll-zlib-dll
-
-!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
-TARGET = $(LIBCURL_DYN_LIB_DBG)
-DIROBJ = $(CFG)
-LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
-LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
-LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
-CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
-CFGSET = TRUE
-RESOURCE = $(DIROBJ)\libcurl.res
-!ENDIF
-
-#######################
-# Usage
-#
-!IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
-!MESSAGE Usage: nmake /f makefile.vc9 CFG=<config> <target>
-!MESSAGE where <config> is one of:
-!MESSAGE release - release static library
-!MESSAGE release-ssl - release static library with ssl
-!MESSAGE release-zlib - release static library with zlib
-!MESSAGE release-ssl-zlib - release static library with ssl and zlib
-!MESSAGE release-ssl-ssh2-zlib - release static library with ssl, ssh2 and zlib
-!MESSAGE release-ssl-dll - release static library with dynamic ssl
-!MESSAGE release-zlib-dll - release static library with dynamic zlib
-!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
-!MESSAGE release-dll - release dynamic library
-!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
-!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
-!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE debug - debug static library
-!MESSAGE debug-ssl - debug static library with ssl
-!MESSAGE debug-zlib - debug static library with zlib
-!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
-!MESSAGE debug-ssl-ssh2-zlib - debug static library with ssl, ssh2 and zlib
-!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
-!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
-!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
-!MESSAGE debug-dll - debug dynamic library
-!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
-!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
-!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
-!MESSAGE <target> can be left blank in which case all is assumed
-!ERROR please choose a valid configuration "$(CFG)"
-!ENDIF
-
-#######################
-# Only the clean target can be used if a config was not provided.
-#
-!IF "$(CFGSET)" == "FALSE"
-clean:
- @-erase /s *.dll 2> NUL
- @-erase /s *.exp 2> NUL
- @-erase /s *.idb 2> NUL
- @-erase /s *.lib 2> NUL
- @-erase /s *.obj 2> NUL
- @-erase /s *.pch 2> NUL
- @-erase /s *.pdb 2> NUL
- @-erase /s *.res 2> NUL
-!ELSE
-# A config was provided, so the library can be built.
-#
-X_OBJS= \
- $(DIROBJ)\amigaos.obj \
- $(DIROBJ)\asyn-ares.obj \
- $(DIROBJ)\asyn-thread.obj \
- $(DIROBJ)\axtls.obj \
- $(DIROBJ)\base64.obj \
- $(DIROBJ)\conncache.obj \
- $(DIROBJ)\connect.obj \
- $(DIROBJ)\content_encoding.obj \
- $(DIROBJ)\cookie.obj \
- $(DIROBJ)\curl_addrinfo.obj \
- $(DIROBJ)\curl_des.obj \
- $(DIROBJ)\curl_endian.obj \
- $(DIROBJ)\curl_fnmatch.obj \
- $(DIROBJ)\curl_gethostname.obj \
- $(DIROBJ)\curl_gssapi.obj \
- $(DIROBJ)\curl_memrchr.obj \
- $(DIROBJ)\curl_multibyte.obj \
- $(DIROBJ)\curl_ntlm_core.obj \
- $(DIROBJ)\curl_ntlm_wb.obj \
- $(DIROBJ)\curl_rtmp.obj \
- $(DIROBJ)\curl_sasl.obj \
- $(DIROBJ)\curl_sspi.obj \
- $(DIROBJ)\curl_threads.obj \
- $(DIROBJ)\cyassl.obj \
- $(DIROBJ)\darwinssl.obj \
- $(DIROBJ)\dict.obj \
- $(DIROBJ)\dotdot.obj \
- $(DIROBJ)\easy.obj \
- $(DIROBJ)\escape.obj \
- $(DIROBJ)\file.obj \
- $(DIROBJ)\fileinfo.obj \
- $(DIROBJ)\formdata.obj \
- $(DIROBJ)\ftp.obj \
- $(DIROBJ)\ftplistparser.obj \
- $(DIROBJ)\getenv.obj \
- $(DIROBJ)\getinfo.obj \
- $(DIROBJ)\gopher.obj \
- $(DIROBJ)\gtls.obj \
- $(DIROBJ)\hash.obj \
- $(DIROBJ)\hmac.obj \
- $(DIROBJ)\hostasyn.obj \
- $(DIROBJ)\hostcheck.obj \
- $(DIROBJ)\hostip.obj \
- $(DIROBJ)\hostip4.obj \
- $(DIROBJ)\hostip6.obj \
- $(DIROBJ)\hostsyn.obj \
- $(DIROBJ)\http.obj \
- $(DIROBJ)\http_chunks.obj \
- $(DIROBJ)\http_digest.obj \
- $(DIROBJ)\http_negotiate.obj \
- $(DIROBJ)\http_ntlm.obj \
- $(DIROBJ)\http_proxy.obj \
- $(DIROBJ)\idn_win32.obj \
- $(DIROBJ)\if2ip.obj \
- $(DIROBJ)\imap.obj \
- $(DIROBJ)\inet_ntop.obj \
- $(DIROBJ)\inet_pton.obj \
- $(DIROBJ)\krb5.obj \
- $(DIROBJ)\ldap.obj \
- $(DIROBJ)\llist.obj \
- $(DIROBJ)\md4.obj \
- $(DIROBJ)\md5.obj \
- $(DIROBJ)\memdebug.obj \
- $(DIROBJ)\mprintf.obj \
- $(DIROBJ)\multi.obj \
- $(DIROBJ)\netrc.obj \
- $(DIROBJ)\non-ascii.obj \
- $(DIROBJ)\nonblock.obj \
- $(DIROBJ)\nss.obj \
- $(DIROBJ)\openldap.obj \
- $(DIROBJ)\parsedate.obj \
- $(DIROBJ)\pingpong.obj \
- $(DIROBJ)\pipeline.obj \
- $(DIROBJ)\polarssl.obj \
- $(DIROBJ)\polarssl_threadlock.obj \
- $(DIROBJ)\pop3.obj \
- $(DIROBJ)\progress.obj \
- $(DIROBJ)\strcase.obj \
- $(DIROBJ)\rand.obj \
- $(DIROBJ)\rtsp.obj \
- $(DIROBJ)\schannel.obj \
- $(DIROBJ)\security.obj \
- $(DIROBJ)\select.obj \
- $(DIROBJ)\sendf.obj \
- $(DIROBJ)\share.obj \
- $(DIROBJ)\slist.obj \
- $(DIROBJ)\smb.obj \
- $(DIROBJ)\smtp.obj \
- $(DIROBJ)\socks.obj \
- $(DIROBJ)\socks_gssapi.obj \
- $(DIROBJ)\socks_sspi.obj \
- $(DIROBJ)\speedcheck.obj \
- $(DIROBJ)\splay.obj \
- $(DIROBJ)\ssh.obj \
- $(DIROBJ)\system_win32.obj \
- $(DIROBJ)\vauth.obj \
- $(DIROBJ)\cleartext.obj \
- $(DIROBJ)\cram.obj \
- $(DIROBJ)\digest.obj \
- $(DIROBJ)\digest_sspi.obj \
- $(DIROBJ)\krb5_gssapi.obj \
- $(DIROBJ)\krb5_sspi.obj \
- $(DIROBJ)\ntlm.obj \
- $(DIROBJ)\ntlm_sspi.obj \
- $(DIROBJ)\oauth2.obj \
- $(DIROBJ)\spnego_gssapi.obj \
- $(DIROBJ)\spnego_sspi.obj \
- $(DIROBJ)\vtls.obj \
- $(DIROBJ)\openssl.obj \
- $(DIROBJ)\strdup.obj \
- $(DIROBJ)\strerror.obj \
- $(DIROBJ)\strtok.obj \
- $(DIROBJ)\strtoofft.obj \
- $(DIROBJ)\telnet.obj \
- $(DIROBJ)\tftp.obj \
- $(DIROBJ)\timeval.obj \
- $(DIROBJ)\transfer.obj \
- $(DIROBJ)\url.obj \
- $(DIROBJ)\version.obj \
- $(DIROBJ)\warnless.obj \
- $(DIROBJ)\wildcard.obj \
- $(DIROBJ)\x509asn1.obj \
- $(RESOURCE)
-
-all : $(TARGET)
-
-$(TARGET): $(X_OBJS)
- $(LNK) $(LFLAGS) $(X_OBJS)
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
- -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
- -xcopy $(DIROBJ)\*.exp . /y
- -xcopy $(DIROBJ)\*.pdb . /y
-
-$(X_OBJS): $(DIROBJ)
-
-$(DIROBJ):
- @if not exist "$(DIROBJ)" mkdir $(DIROBJ)
-
-.SUFFIXES: .c .obj .res
-
-{.\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vauth\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-{.\vtls\}.c{$(DIROBJ)\}.obj:
- $(CC) $(CFLAGS) /Fo"$@" $<
-
-debug-dll\libcurl.res \
-debug-dll-ssl-dll\libcurl.res \
-debug-dll-zlib-dll\libcurl.res \
-debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=1 /Fo $@ libcurl.rc
-
-release-dll\libcurl.res \
-release-dll-ssl-dll\libcurl.res \
-release-dll-zlib-dll\libcurl.res \
-release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
- rc /dDEBUGBUILD=0 /Fo $@ libcurl.rc
-!ENDIF # End of case where a config was provided.
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index c038c2a3..9b6515cd 100644
--- a/lib/asyn-ares.c
+++ b/lib/asyn-ares.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -232,7 +232,7 @@ int Curl_resolver_getsock(struct connectdata *conn,
milli = (timeout->tv_sec * 1000) + (timeout->tv_usec/1000);
if(milli == 0)
milli += 10;
- Curl_expire_latest(conn->data, milli);
+ Curl_expire(conn->data, milli, EXPIRE_ASYNC_NAME);
return max;
}
@@ -355,17 +355,24 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
long timeout;
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
struct Curl_dns_entry *temp_entry;
+ if(entry)
+ *entry = NULL; /* clear on entry */
+
timeout = Curl_timeleft(data, &now, TRUE);
+ if(timeout < 0) {
+ /* already expired! */
+ connclose(conn, "Timed out before name resolve started");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
if(!timeout)
timeout = CURL_TIMEOUT_RESOLVE * 1000; /* default name resolve timeout */
/* Wait for the name resolve query to complete. */
- for(;;) {
+ while(!result) {
struct timeval *tvp, tv, store;
- long timediff;
int itimeout;
int timeout_ms;
@@ -385,28 +392,30 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
timeout_ms = 1000;
waitperform(conn, timeout_ms);
- Curl_resolver_is_resolved(conn, &temp_entry);
+ result = Curl_resolver_is_resolved(conn, &temp_entry);
- if(conn->async.done)
+ if(result || conn->async.done)
break;
- if(Curl_pgrsUpdate(conn)) {
+ if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
- timeout = -1; /* trigger the cancel below */
- }
else {
- struct timeval now2 = Curl_tvnow();
- timediff = Curl_tvdiff(now2, now); /* spent time */
- timeout -= timediff?timediff:1; /* always deduct at least 1 */
+ struct curltime now2 = Curl_tvnow();
+ time_t timediff = Curl_tvdiff(now2, now); /* spent time */
+ if(timediff <= 0)
+ timeout -= 1; /* always deduct at least 1 */
+ else if(timediff > timeout)
+ timeout = -1;
+ else
+ timeout -= (long)timediff;
now = now2; /* for next loop */
}
-
- if(timeout < 0) {
- /* our timeout, so we cancel the ares operation */
- ares_cancel((ares_channel)data->state.resolver);
- break;
- }
+ if(timeout < 0)
+ result = CURLE_OPERATION_TIMEDOUT;
}
+ if(result)
+ /* failure, so we cancel the ares operation */
+ ares_cancel((ares_channel)data->state.resolver);
/* Operation complete, if the lookup was successful we now have the entry
in the cache. */
diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index 26a15b11..8936b603 100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,6 +22,11 @@
#include "curl_setup.h"
+/***********************************************************************
+ * Only for threaded name resolves builds
+ **********************************************************************/
+#ifdef CURLRES_THREADED
+
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -74,11 +79,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-/***********************************************************************
- * Only for threaded name resolves builds
- **********************************************************************/
-#ifdef CURLRES_THREADED
-
/*
* Curl_resolver_global_init()
* Called from curl_global_init() to initialize global resolver environment.
@@ -407,9 +407,7 @@ static bool init_resolve_thread(struct connectdata *conn,
#endif
if(!td->thread_hnd) {
-#ifndef _WIN32_WCE
err = errno;
-#endif
goto err_exit;
}
@@ -418,8 +416,7 @@ static bool init_resolve_thread(struct connectdata *conn,
err_exit:
destroy_async_data(&conn->async);
- SET_ERRNO(err);
-
+ errno = err;
return FALSE;
}
@@ -540,7 +537,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
td->poll_interval = 250;
td->interval_end = elapsed + td->poll_interval;
- Curl_expire(conn->data, td->poll_interval);
+ Curl_expire(conn->data, td->poll_interval, EXPIRE_ASYNC_NAME);
}
return CURLE_OK;
@@ -594,28 +591,29 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
int *waitp)
{
struct addrinfo hints;
- struct in_addr in;
Curl_addrinfo *res;
int error;
char sbuf[12];
int pf = PF_INET;
-#ifdef CURLRES_IPV6
- struct in6_addr in6;
-#endif /* CURLRES_IPV6 */
*waitp = 0; /* default to synchronous response */
#ifndef USE_RESOLVE_ON_IPS
- /* First check if this is an IPv4 address string */
- 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);
-
+ {
+ struct in_addr in;
+ /* First check if this is an IPv4 address string */
+ 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);
+ }
#ifdef CURLRES_IPV6
- /* 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);
+ {
+ 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 /* CURLRES_IPV6 */
#endif /* !USE_RESOLVE_ON_IPS */
@@ -654,7 +652,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
/* fall-back to blocking version */
infof(conn->data, "init_resolve_thread() failed for %s; %s\n",
- hostname, Curl_strerror(conn, ERRNO));
+ hostname, Curl_strerror(conn, errno));
error = Curl_getaddrinfo_ex(hostname, sbuf, &hints, &res);
if(error) {
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index 7857bbfc..2eff3e0c 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2011 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 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
@@ -513,7 +513,7 @@ sub scanfile {
# check for 'void func() {', but avoid false positives by requiring
# both an open and closed parentheses before the open brace
- if($l =~ /^((\w).*){\z/) {
+ if($l =~ /^((\w).*)\{\z/) {
my $k = $1;
$k =~ s/const *//;
$k =~ s/static *//;
diff --git a/lib/config-win32.h b/lib/config-win32.h
index af7bb1fb..4cac859c 100644
--- a/lib/config-win32.h
+++ b/lib/config-win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -493,7 +493,7 @@
#define _CRT_NONSTDC_NO_DEPRECATE 1
#endif
-/* VS2005 and later dafault size for time_t is 64-bit, unless
+/* VS2005 and later default size for time_t is 64-bit, unless
_USE_32BIT_TIME_T has been defined to get a 32-bit time_t. */
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
# ifndef _USE_32BIT_TIME_T
@@ -514,7 +514,7 @@
# define VS2008_MIN_TARGET 0x0500
/* The minimum build target for VS2012 is Vista unless Update 1 is installed
- and the v110_xp toolset is choosen. */
+ and the v110_xp toolset is chosen. */
# if defined(_USING_V110_SDK71_)
# define VS2012_MIN_TARGET 0x0501
# else
@@ -526,7 +526,7 @@
# define VS2008_DEF_TARGET 0x0501
/* VS2012 default build target is Windows Vista unless Update 1 is installed
- and the v110_xp toolset is choosen. */
+ and the v110_xp toolset is chosen. */
# if defined(_USING_V110_SDK71_)
# define VS2012_DEF_TARGET 0x0501
# else
diff --git a/lib/config-win32ce.h b/lib/config-win32ce.h
index 38394857..eb444c58 100644
--- a/lib/config-win32ce.h
+++ b/lib/config-win32ce.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -379,7 +379,7 @@
#define _CRT_NONSTDC_NO_DEPRECATE 1
#endif
-/* VS2005 and later dafault size for time_t is 64-bit, unless */
+/* VS2005 and later default size for time_t is 64-bit, unless */
/* _USE_32BIT_TIME_T has been defined to get a 32-bit time_t. */
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
# ifndef _USE_32BIT_TIME_T
diff --git a/lib/conncache.c b/lib/conncache.c
index d8ef9a54..c79d2276 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -5,8 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012, 2016, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2016, Linus Nielsen Feltzing, <linus@haxx.se>
+ * Copyright (C) 2012 - 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
@@ -56,11 +56,7 @@ static CURLcode bundle_create(struct Curl_easy *data,
(*cb_ptr)->num_connections = 0;
(*cb_ptr)->multiuse = BUNDLE_UNKNOWN;
- (*cb_ptr)->conn_list = Curl_llist_alloc((curl_llist_dtor) conn_llist_dtor);
- if(!(*cb_ptr)->conn_list) {
- Curl_safefree(*cb_ptr);
- return CURLE_OUT_OF_MEMORY;
- }
+ Curl_llist_init(&(*cb_ptr)->conn_list, (curl_llist_dtor) conn_llist_dtor);
return CURLE_OK;
}
@@ -69,22 +65,18 @@ static void bundle_destroy(struct connectbundle *cb_ptr)
if(!cb_ptr)
return;
- if(cb_ptr->conn_list) {
- Curl_llist_destroy(cb_ptr->conn_list, NULL);
- cb_ptr->conn_list = NULL;
- }
+ Curl_llist_destroy(&cb_ptr->conn_list, NULL);
+
free(cb_ptr);
}
/* Add a connection to a bundle */
static CURLcode bundle_add_conn(struct connectbundle *cb_ptr,
- struct connectdata *conn)
+ struct connectdata *conn)
{
- if(!Curl_llist_insert_next(cb_ptr->conn_list, cb_ptr->conn_list->tail, conn))
- return CURLE_OUT_OF_MEMORY;
-
+ Curl_llist_insert_next(&cb_ptr->conn_list, cb_ptr->conn_list.tail, conn,
+ &conn->bundle_node);
conn->bundle = cb_ptr;
-
cb_ptr->num_connections++;
return CURLE_OK;
}
@@ -95,10 +87,10 @@ static int bundle_remove_conn(struct connectbundle *cb_ptr,
{
struct curl_llist_element *curr;
- curr = cb_ptr->conn_list->head;
+ curr = cb_ptr->conn_list.head;
while(curr) {
if(curr->ptr == conn) {
- Curl_llist_remove(cb_ptr->conn_list, curr, NULL);
+ Curl_llist_remove(&cb_ptr->conn_list, curr, NULL);
cb_ptr->num_connections--;
conn->bundle = NULL;
return 1; /* we removed a handle */
@@ -127,8 +119,9 @@ void Curl_conncache_destroy(struct conncache *connc)
Curl_hash_destroy(&connc->hash);
}
-/* returns an allocated key to find a bundle for this connection */
-static char *hashkey(struct connectdata *conn)
+/* 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 */
{
const char *hostname;
@@ -141,7 +134,10 @@ static char *hashkey(struct connectdata *conn)
else
hostname = conn->host.name;
- return aprintf("%s:%d", hostname, conn->port);
+ DEBUGASSERT(len > 32);
+
+ /* put the number first so that the hostname gets cut off if too long */
+ snprintf(buf, len, "%ld%s", conn->port, hostname);
}
/* Look up the bundle with all the connections to the same host this
@@ -151,11 +147,9 @@ struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
{
struct connectbundle *bundle = NULL;
if(connc) {
- char *key = hashkey(conn);
- if(key) {
- bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
- free(key);
- }
+ char key[128];
+ hashkey(conn, key, sizeof(key));
+ bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
}
return bundle;
@@ -204,21 +198,16 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache);
if(!bundle) {
- char *key;
int rc;
+ char key[128];
result = bundle_create(data, &new_bundle);
if(result)
return result;
- key = hashkey(conn);
- if(!key) {
- bundle_destroy(new_bundle);
- return CURLE_OUT_OF_MEMORY;
- }
-
+ hashkey(conn, key, sizeof(key));
rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
- free(key);
+
if(!rc) {
bundle_destroy(new_bundle);
return CURLE_OUT_OF_MEMORY;
@@ -292,7 +281,7 @@ void Curl_conncache_foreach(struct conncache *connc,
bundle = he->ptr;
he = Curl_hash_next_element(&iter);
- curr = bundle->conn_list->head;
+ curr = bundle->conn_list.head;
while(curr) {
/* Yes, we need to update curr before calling func(), because func()
might decide to remove the connection */
@@ -321,7 +310,7 @@ Curl_conncache_find_first_connection(struct conncache *connc)
struct curl_llist_element *curr;
bundle = he->ptr;
- curr = bundle->conn_list->head;
+ curr = bundle->conn_list.head;
if(curr) {
return curr->ptr;
}
diff --git a/lib/conncache.h b/lib/conncache.h
index b1dadf99..14be4e8e 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2017, 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
@@ -27,7 +27,7 @@ struct conncache {
struct curl_hash hash;
size_t num_connections;
long next_connection_id;
- struct timeval last_cleanup;
+ struct curltime last_cleanup;
};
#define BUNDLE_NO_MULTIUSE -1
@@ -38,7 +38,7 @@ struct conncache {
struct connectbundle {
int multiuse; /* supports multi-use */
size_t num_connections; /* Number of connections in the bundle */
- struct curl_llist *conn_list; /* The connectdata members of the bundle */
+ struct curl_llist conn_list; /* The connectdata members of the bundle */
};
int Curl_conncache_init(struct conncache *, int size);
diff --git a/lib/connect.c b/lib/connect.c
index 524d885e..8d5d32ba 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -180,12 +180,12 @@ singleipconnect(struct connectdata *conn,
* @unittest: 1303
*/
time_t Curl_timeleft(struct Curl_easy *data,
- struct timeval *nowp,
+ struct curltime *nowp,
bool duringconnect)
{
int timeout_set = 0;
time_t timeout_ms = duringconnect?DEFAULT_CONNECT_TIMEOUT:0;
- struct timeval now;
+ struct curltime now;
/* if a timeout is set, use the most restrictive one */
@@ -607,7 +607,8 @@ void Curl_persistconninfo(struct connectdata *conn)
conn->data->info.conn_local_port = conn->local_port;
}
-/* retrieves ip address and port from a sockaddr structure */
+/* retrieves ip address and port from a sockaddr structure.
+ note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
static bool getaddressinfo(struct sockaddr *sa, char *addr,
long *port)
{
@@ -654,7 +655,7 @@ static bool getaddressinfo(struct sockaddr *sa, char *addr,
addr[0] = '\0';
*port = 0;
-
+ errno = EAFNOSUPPORT;
return FALSE;
}
@@ -672,11 +673,9 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
return;
if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
- int error;
-
len = sizeof(struct Curl_sockaddr_storage);
if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
- error = SOCKERRNO;
+ int error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
@@ -685,7 +684,7 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
len = sizeof(struct Curl_sockaddr_storage);
memset(&ssloc, 0, sizeof(ssloc));
if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
- error = SOCKERRNO;
+ int error = SOCKERRNO;
failf(data, "getsockname() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
@@ -693,18 +692,16 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
if(!getaddressinfo((struct sockaddr*)&ssrem,
conn->primary_ip, &conn->primary_port)) {
- error = ERRNO;
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
return;
}
memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
if(!getaddressinfo((struct sockaddr*)&ssloc,
conn->local_ip, &conn->local_port)) {
- error = ERRNO;
failf(data, "ssloc inet_ntop() failed with errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
return;
}
@@ -726,7 +723,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
CURLcode result = CURLE_OK;
time_t allow;
int error = 0;
- struct timeval now;
+ struct curltime now;
int rc;
int i;
@@ -810,8 +807,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OK;
}
- else
- infof(data, "Connection failed\n");
+ infof(data, "Connection failed\n");
}
else if(rc & CURL_CSELECT_ERR)
(void)verifyconnect(conn->tempsock[i], &error);
@@ -880,19 +876,6 @@ void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
curl_socklen_t onoff = (curl_socklen_t) 1;
int level = IPPROTO_TCP;
-#if 0
- /* The use of getprotobyname() is disabled since it isn't thread-safe on
- numerous systems. On these getprotobyname_r() should be used instead, but
- that exists in at least one 4 arg version and one 5 arg version, and
- since the proto number rarely changes anyway we now just use the hard
- coded number. The "proper" fix would need a configure check for the
- correct function much in the same style the gethostbyname_r versions are
- detected. */
- struct protoent *pe = getprotobyname("tcp");
- if(pe)
- level = pe->p_proto;
-#endif
-
#if defined(CURL_DISABLE_VERBOSE_STRINGS)
(void) conn;
#endif
@@ -1009,9 +992,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
ipaddress, &port)) {
/* malformed address or bug in inet_ntop, try next address */
- error = ERRNO;
failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
Curl_closesocket(conn, sockfd);
return CURLE_OK;
}
@@ -1071,7 +1053,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
conn->connecttime = Curl_tvnow();
if(conn->num_addr > 1)
- Curl_expire_latest(data, conn->timeoutms_per_addr);
+ Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
/* Connect TCP sockets, bind UDP */
if(!isconnected && (conn->socktype == SOCK_STREAM)) {
@@ -1154,7 +1136,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
const struct Curl_dns_entry *remotehost)
{
struct Curl_easy *data = conn->data;
- struct timeval before = Curl_tvnow();
+ struct curltime before = Curl_tvnow();
CURLcode result = CURLE_COULDNT_CONNECT;
time_t timeout_ms = Curl_timeleft(data, &before, TRUE);
@@ -1170,7 +1152,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
conn->tempaddr[1] = NULL;
conn->tempsock[0] = CURL_SOCKET_BAD;
conn->tempsock[1] = CURL_SOCKET_BAD;
- Curl_expire(conn->data, HAPPY_EYEBALLS_TIMEOUT);
+ Curl_expire(conn->data, HAPPY_EYEBALLS_TIMEOUT, EXPIRE_HAPPY_EYEBALLS);
/* Max time for the next connection attempt */
conn->timeoutms_per_addr =
@@ -1386,7 +1368,7 @@ CURLcode Curl_socket(struct connectdata *conn,
*/
void Curl_conncontrol(struct connectdata *conn,
int ctrl /* see defines in header */
-#ifdef DEBUGBUILD
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
, const char *reason
#endif
)
diff --git a/lib/connect.h b/lib/connect.h
index 5653cb4e..3f05c397 100644
--- a/lib/connect.h
+++ b/lib/connect.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -36,7 +36,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,
/* generic function that returns how much time there's left to run, according
to the timeouts set */
time_t Curl_timeleft(struct Curl_easy *data,
- struct timeval *nowp,
+ struct curltime *nowp,
bool duringconnect);
#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
@@ -127,16 +127,16 @@ void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd);
void Curl_conncontrol(struct connectdata *conn,
int closeit
-#ifdef DEBUGBUILD
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
, const char *reason
#endif
);
-#ifdef DEBUGBUILD
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
#define streamclose(x,y) Curl_conncontrol(x, CONNCTRL_STREAM, y)
#define connclose(x,y) Curl_conncontrol(x, CONNCTRL_CONNECTION, y)
#define connkeep(x,y) Curl_conncontrol(x, CONNCTRL_KEEP, y)
-#else /* if !CURLDEBUG */
+#else /* if !DEBUGBUILD || CURL_DISABLE_VERBOSE_STRINGS */
#define streamclose(x,y) Curl_conncontrol(x, CONNCTRL_STREAM)
#define connclose(x,y) Curl_conncontrol(x, CONNCTRL_CONNECTION)
#define connkeep(x,y) Curl_conncontrol(x, CONNCTRL_KEEP)
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
index 5385058e..652ed976 100644
--- a/lib/content_encoding.c
+++ b/lib/content_encoding.c
@@ -130,8 +130,7 @@ inflate_stream(struct connectdata *conn,
free(decomp);
if(inflateEnd(z) == Z_OK)
return exit_zlib(z, &k->zlib_init, result);
- else
- return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
+ return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
}
/* Done with these bytes, exit */
@@ -314,7 +313,7 @@ Curl_unencode_gzip_write(struct connectdata *conn,
#ifndef OLD_ZLIB_SUPPORT
/* Support for old zlib versions is compiled away and we are running with
an old version, so return an error. */
- return exit_zlib(z, &k->zlib_init, CURLE_FUNCTION_NOT_FOUND);
+ return exit_zlib(z, &k->zlib_init, CURLE_WRITE_ERROR);
#else
/* This next mess is to get around the potential case where there isn't
diff --git a/lib/cookie.c b/lib/cookie.c
index 092a226f..6b678aeb 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -492,7 +492,6 @@ Curl_cookie_add(struct Curl_easy *data,
}
else if(strcasecompare("domain", name)) {
bool is_ip;
- const char *dotp;
/* Now, we make sure that our host is within the given domain,
or the given domain is not valid and thus cannot be set. */
@@ -500,12 +499,22 @@ Curl_cookie_add(struct Curl_easy *data,
if('.' == whatptr[0])
whatptr++; /* ignore preceding dot */
- is_ip = isip(domain ? domain : whatptr);
+#ifndef USE_LIBPSL
+ /*
+ * Without PSL we don't know when the incoming cookie is set on a
+ * TLD or otherwise "protected" suffix. To reduce risk, we require a
+ * dot OR the exact host name being "localhost".
+ */
+ {
+ const char *dotp;
+ /* check for more dots */
+ dotp = strchr(whatptr, '.');
+ if(!dotp && !strcasecompare("localhost", whatptr))
+ domain=":";
+ }
+#endif
- /* check for more dots */
- dotp = strchr(whatptr, '.');
- if(!dotp)
- domain=":";
+ is_ip = isip(domain ? domain : whatptr);
if(!domain
|| (is_ip && !strcmp(whatptr, domain))
@@ -920,9 +929,8 @@ static char *get_line(char *buf, int len, FILE *input)
}
return b;
}
- else
- /* read a partial, discard the next piece that ends with newline */
- partial = TRUE;
+ /* read a partial, discard the next piece that ends with newline */
+ partial = TRUE;
}
else
break;
@@ -1055,16 +1063,16 @@ static int cookie_sort(const void *p1, const void *p2)
#define CLONE(field) \
do { \
if(src->field) { \
- dup->field = strdup(src->field); \
- if(!dup->field) \
+ d->field = strdup(src->field); \
+ if(!d->field) \
goto fail; \
} \
} while(0)
static struct Cookie *dup_cookie(struct Cookie *src)
{
- struct Cookie *dup = calloc(sizeof(struct Cookie), 1);
- if(dup) {
+ struct Cookie *d = calloc(sizeof(struct Cookie), 1);
+ if(d) {
CLONE(expirestr);
CLONE(domain);
CLONE(path);
@@ -1073,16 +1081,16 @@ static struct Cookie *dup_cookie(struct Cookie *src)
CLONE(value);
CLONE(maxage);
CLONE(version);
- dup->expires = src->expires;
- dup->tailmatch = src->tailmatch;
- dup->secure = src->secure;
- dup->livecookie = src->livecookie;
- dup->httponly = src->httponly;
+ d->expires = src->expires;
+ d->tailmatch = src->tailmatch;
+ d->secure = src->secure;
+ d->livecookie = src->livecookie;
+ d->httponly = src->httponly;
}
- return dup;
+ return d;
fail:
- freecookie(dup);
+ freecookie(d);
return NULL;
}
diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c
index 61cdaddc..1adf3198 100644
--- a/lib/curl_addrinfo.c
+++ b/lib/curl_addrinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -47,6 +47,8 @@
# define in_addr_t unsigned long
#endif
+#include <stddef.h>
+
#include "curl_addrinfo.h"
#include "inet_pton.h"
#include "warnless.h"
@@ -467,7 +469,7 @@ Curl_addrinfo *Curl_str2addr(char *address, int port)
/* This is a dotted IP address 123.123.123.123-style */
return Curl_ip2addr(AF_INET, &in, address, port);
#ifdef ENABLE_IPV6
- else {
+ {
struct in6_addr in6;
if(Curl_inet_pton(AF_INET6, address, &in6) > 0)
/* This is a dotted IPv6 address ::1-style */
@@ -483,24 +485,29 @@ Curl_addrinfo *Curl_str2addr(char *address, int port)
* struct initialized with this path.
* Set '*longpath' to TRUE if the error is a too long path.
*/
-Curl_addrinfo *Curl_unix2addr(const char *path, int *longpath)
+Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract)
{
Curl_addrinfo *ai;
struct sockaddr_un *sa_un;
size_t path_len;
+ *longpath = FALSE;
+
ai = calloc(1, sizeof(Curl_addrinfo));
if(!ai)
return NULL;
ai->ai_addr = calloc(1, sizeof(struct sockaddr_un));
if(!ai->ai_addr) {
free(ai);
- *longpath = FALSE;
return NULL;
}
+
+ sa_un = (void *) ai->ai_addr;
+ sa_un->sun_family = AF_UNIX;
+
/* sun_path must be able to store the NUL-terminated path */
- path_len = strlen(path);
- if(path_len >= sizeof(sa_un->sun_path)) {
+ path_len = strlen(path) + 1;
+ if(path_len > sizeof(sa_un->sun_path)) {
free(ai->ai_addr);
free(ai);
*longpath = TRUE;
@@ -509,10 +516,15 @@ Curl_addrinfo *Curl_unix2addr(const char *path, int *longpath)
ai->ai_family = AF_UNIX;
ai->ai_socktype = SOCK_STREAM; /* assume reliable transport for HTTP */
- ai->ai_addrlen = (curl_socklen_t) sizeof(struct sockaddr_un);
- sa_un = (void *) ai->ai_addr;
- sa_un->sun_family = AF_UNIX;
- memcpy(sa_un->sun_path, path, path_len + 1); /* copy NUL byte */
+ ai->ai_addrlen = (curl_socklen_t)
+ ((offsetof(struct sockaddr_un, sun_path) + path_len) & 0x7FFFFFFF);
+
+ /* Abstract Unix domain socket have NULL prefix instead of suffix */
+ if(abstract)
+ memcpy(sa_un->sun_path + 1, path, path_len - 1);
+ else
+ memcpy(sa_un->sun_path, path, path_len); /* copy NUL byte */
+
return ai;
}
#endif
diff --git a/lib/curl_addrinfo.h b/lib/curl_addrinfo.h
index 4f24730a..8f6f3d10 100644
--- a/lib/curl_addrinfo.h
+++ b/lib/curl_addrinfo.h
@@ -80,7 +80,7 @@ Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port);
Curl_addrinfo *Curl_str2addr(char *dotted, int port);
#ifdef USE_UNIX_SOCKETS
-Curl_addrinfo *Curl_unix2addr(const char *path, int *longpath);
+Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract);
#endif
#if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) && \
diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake
index 33c15cb6..c1452b3e 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -4,10 +4,13 @@
#cmakedefine BUILDING_LIBCURL 1
/* Location of default ca bundle */
-#cmakedefine CURL_CA_BUNDLE ${CURL_CA_BUNDLE}
+#cmakedefine CURL_CA_BUNDLE "${CURL_CA_BUNDLE}"
+
+/* define "1" to use built-in ca store of TLS backend */
+#cmakedefine CURL_CA_FALLBACK 1
/* Location of default ca path */
-#cmakedefine CURL_CA_PATH ${CURL_CA_PATH}
+#cmakedefine CURL_CA_PATH "${CURL_CA_PATH}"
/* to disable cookies support */
#cmakedefine CURL_DISABLE_COOKIES 1
@@ -518,6 +521,15 @@
/* Define to 1 if you have the send function. */
#cmakedefine HAVE_SEND 1
+/* Define to 1 if you have the 'fsetxattr' function. */
+#cmakedefine HAVE_FSETXATTR 1
+
+/* fsetxattr() takes 5 args */
+#cmakedefine HAVE_FSETXATTR_5 1
+
+/* fsetxattr() takes 6 args */
+#cmakedefine HAVE_FSETXATTR_6 1
+
/* Define to 1 if you have the <setjmp.h> header file. */
#cmakedefine HAVE_SETJMP_H 1
@@ -918,6 +930,9 @@
/* if PolarSSL is enabled */
#cmakedefine USE_POLARSSL 1
+/* if DarwinSSL is enabled */
+#cmakedefine USE_DARWINSSL 1
+
/* if mbedTLS is enabled */
#cmakedefine USE_MBEDTLS 1
@@ -957,9 +972,6 @@
/* Version number of package */
#cmakedefine VERSION ${VERSION}
-/* Define to avoid automatic inclusion of winsock.h */
-#cmakedefine WIN32_LEAN_AND_MEAN 1
-
/* Define to 1 if OS is AIX. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index 281a5dc6..a8edda5f 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -180,9 +180,6 @@
/* Define to 1 if you have the fdopen function. */
#undef HAVE_FDOPEN
-/* Define to 1 if you have the `fork' function. */
-#undef HAVE_FORK
-
/* Define to 1 if you have the freeaddrinfo function. */
#undef HAVE_FREEADDRINFO
@@ -258,9 +255,6 @@
/* Define to 1 if you have the `getppid' function. */
#undef HAVE_GETPPID
-/* Define to 1 if you have the `getprotobyname' function. */
-#undef HAVE_GETPROTOBYNAME
-
/* Define to 1 if you have the `getpwuid' function. */
#undef HAVE_GETPWUID
@@ -282,10 +276,16 @@
/* Define to 1 if you have a working gmtime_r function. */
#undef HAVE_GMTIME_R
+/* Define to 1 if you have the `gnutls_alpn_set_protocols' function. */
+#undef HAVE_GNUTLS_ALPN_SET_PROTOCOLS
+
/* Define to 1 if you have the `gnutls_certificate_set_x509_key_file2'
function. */
#undef HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2
+/* Define to 1 if you have the `gnutls_ocsp_req_init' function. */
+#undef HAVE_GNUTLS_OCSP_REQ_INIT
+
/* if you have the function gnutls_srp_verifier */
#undef HAVE_GNUTLS_SRP
@@ -319,9 +319,6 @@
/* Define to 1 if you have the `if_nametoindex' function. */
#undef HAVE_IF_NAMETOINDEX
-/* Define to 1 if you have the `inet_addr' function. */
-#undef HAVE_INET_ADDR
-
/* Define to 1 if you have the inet_ntoa_r function. */
#undef HAVE_INET_NTOA_R
@@ -489,9 +486,6 @@
/* Define to 1 if you have the <pem.h> header file. */
#undef HAVE_PEM_H
-/* Define to 1 if you have the `perror' function. */
-#undef HAVE_PERROR
-
/* Define to 1 if you have the `pipe' function. */
#undef HAVE_PIPE
@@ -708,15 +702,15 @@
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
-/* Define to 1 if you have the `uname' function. */
-#undef HAVE_UNAME
-
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `utime' function. */
#undef HAVE_UTIME
+/* Define to 1 if you have the `utimes' function. */
+#undef HAVE_UTIMES
+
/* Define to 1 if you have the <utime.h> header file. */
#undef HAVE_UTIME_H
@@ -960,6 +954,9 @@
/* if you want POSIX threaded DNS lookup */
#undef USE_THREADS_POSIX
+/* if you want Win32 threaded DNS lookup */
+#undef USE_THREADS_WIN32
+
/* Use TLS-SRP authentication */
#undef USE_TLS_SRP
@@ -989,9 +986,6 @@
/* Define to 1 to provide own prototypes. */
#undef WANT_IDN_PROTOTYPES
-/* Define to avoid automatic inclusion of winsock.h */
-#undef WIN32_LEAN_AND_MEAN
-
/* Define to 1 if OS is AIX. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
diff --git a/lib/curl_des.c b/lib/curl_des.c
index 421c9f76..b123a00f 100644
--- a/lib/curl_des.c
+++ b/lib/curl_des.c
@@ -34,7 +34,7 @@
*
* The function is a port of the Java based oddParity() function over at:
*
- * http://davenport.sourceforge.net/ntlm.html
+ * https://davenport.sourceforge.io/ntlm.html
*
* Parameters:
*
diff --git a/lib/curl_endian.c b/lib/curl_endian.c
index c2d21de5..c25db495 100644
--- a/lib/curl_endian.c
+++ b/lib/curl_endian.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -62,44 +62,6 @@ unsigned int Curl_read32_le(const unsigned char *buf)
((unsigned int)buf[2] << 16) | ((unsigned int)buf[3] << 24);
}
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
-/*
- * Curl_read64_le()
- *
- * This function converts a 64-bit integer from the little endian format, as
- * used in the incoming package to whatever endian format we're using
- * natively.
- *
- * Parameters:
- *
- * buf [in] - A pointer to a 8 byte buffer.
- *
- * Returns the integer.
- */
-#if defined(HAVE_LONGLONG)
-unsigned long long Curl_read64_le(const unsigned char *buf)
-{
- return ((unsigned long long)buf[0]) |
- ((unsigned long long)buf[1] << 8) |
- ((unsigned long long)buf[2] << 16) |
- ((unsigned long long)buf[3] << 24) |
- ((unsigned long long)buf[4] << 32) |
- ((unsigned long long)buf[5] << 40) |
- ((unsigned long long)buf[6] << 48) |
- ((unsigned long long)buf[7] << 56);
-}
-#else
-unsigned __int64 Curl_read64_le(const unsigned char *buf)
-{
- return ((unsigned __int64)buf[0]) | ((unsigned __int64)buf[1] << 8) |
- ((unsigned __int64)buf[2] << 16) | ((unsigned __int64)buf[3] << 24) |
- ((unsigned __int64)buf[4] << 32) | ((unsigned __int64)buf[5] << 40) |
- ((unsigned __int64)buf[6] << 48) | ((unsigned __int64)buf[7] << 56);
-}
-#endif
-
-#endif /* CURL_SIZEOF_CURL_OFF_T > 4 */
-
/*
* Curl_read16_be()
*
@@ -120,80 +82,6 @@ unsigned short Curl_read16_be(const unsigned char *buf)
}
/*
- * Curl_read32_be()
- *
- * This function converts a 32-bit integer from the big endian format, as
- * used in the incoming package to whatever endian format we're using
- * natively.
- *
- * Parameters:
- *
- * buf [in] - A pointer to a 4 byte buffer.
- *
- * Returns the integer.
- */
-unsigned int Curl_read32_be(const unsigned char *buf)
-{
- return ((unsigned int)buf[0] << 24) | ((unsigned int)buf[1] << 16) |
- ((unsigned int)buf[2] << 8) | ((unsigned int)buf[3]);
-}
-
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
-/*
- * Curl_read64_be()
- *
- * This function converts a 64-bit integer from the big endian format, as
- * used in the incoming package to whatever endian format we're using
- * natively.
- *
- * Parameters:
- *
- * buf [in] - A pointer to a 8 byte buffer.
- *
- * Returns the integer.
- */
-#if defined(HAVE_LONGLONG)
-unsigned long long Curl_read64_be(const unsigned char *buf)
-{
- return ((unsigned long long)buf[0] << 56) |
- ((unsigned long long)buf[1] << 48) |
- ((unsigned long long)buf[2] << 40) |
- ((unsigned long long)buf[3] << 32) |
- ((unsigned long long)buf[4] << 24) |
- ((unsigned long long)buf[5] << 16) |
- ((unsigned long long)buf[6] << 8) |
- ((unsigned long long)buf[7]);
-}
-#else
-unsigned __int64 Curl_read64_be(const unsigned char *buf)
-{
- return ((unsigned __int64)buf[0] << 56) | ((unsigned __int64)buf[1] << 48) |
- ((unsigned __int64)buf[2] << 40) | ((unsigned __int64)buf[3] << 32) |
- ((unsigned __int64)buf[4] << 24) | ((unsigned __int64)buf[5] << 16) |
- ((unsigned __int64)buf[6] << 8) | ((unsigned __int64)buf[7]);
-}
-#endif
-
-#endif /* CURL_SIZEOF_CURL_OFF_T > 4 */
-
-/*
- * Curl_write16_le()
- *
- * This function converts a 16-bit integer from the native endian format,
- * to little endian format ready for sending down the wire.
- *
- * Parameters:
- *
- * value [in] - The 16-bit integer value.
- * buffer [in] - A pointer to the output buffer.
- */
-void Curl_write16_le(const short value, unsigned char *buffer)
-{
- buffer[0] = (char)(value & 0x00FF);
- buffer[1] = (char)((value & 0xFF00) >> 8);
-}
-
-/*
* Curl_write32_le()
*
* This function converts a 32-bit integer from the native endian format,
diff --git a/lib/curl_endian.h b/lib/curl_endian.h
index 8a2b07ad..4f345a6a 100644
--- a/lib/curl_endian.h
+++ b/lib/curl_endian.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -28,33 +28,9 @@ unsigned short Curl_read16_le(const unsigned char *buf);
/* Converts a 32-bit integer from little endian */
unsigned int Curl_read32_le(const unsigned char *buf);
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
-/* Converts a 64-bit integer from little endian */
-#if defined(HAVE_LONGLONG)
-unsigned long long Curl_read64_le(const unsigned char *buf);
-#else
-unsigned __int64 Curl_read64_le(const unsigned char *buf);
-#endif
-#endif
-
/* Converts a 16-bit integer from big endian */
unsigned short Curl_read16_be(const unsigned char *buf);
-/* Converts a 32-bit integer from big endian */
-unsigned int Curl_read32_be(const unsigned char *buf);
-
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
-/* Converts a 64-bit integer from big endian */
-#if defined(HAVE_LONGLONG)
-unsigned long long Curl_read64_be(const unsigned char *buf);
-#else
-unsigned __int64 Curl_read64_be(const unsigned char *buf);
-#endif
-#endif
-
-/* Converts a 16-bit integer to little endian */
-void Curl_write16_le(const short value, unsigned char *buffer);
-
/* Converts a 32-bit integer to little endian */
void Curl_write32_le(const int value, unsigned char *buffer);
diff --git a/lib/curl_fnmatch.c b/lib/curl_fnmatch.c
index e8108bb1..46d3ada1 100644
--- a/lib/curl_fnmatch.c
+++ b/lib/curl_fnmatch.c
@@ -145,8 +145,7 @@ static int setcharset(unsigned char **p, unsigned char *charset)
else if(c == ']') {
if(something_found)
return SETCHARSET_OK;
- else
- something_found = TRUE;
+ something_found = TRUE;
state = CURLFNM_SCHS_RIGHTBR;
charset[c] = 1;
(*p)++;
@@ -244,7 +243,7 @@ static int setcharset(unsigned char **p, unsigned char *charset)
if(c == ']') {
return SETCHARSET_OK;
}
- else if(c == '\\') {
+ if(c == '\\') {
c = *(++(*p));
if(ISPRINT(c)) {
charset[c] = 1;
@@ -345,8 +344,7 @@ static int loop(const unsigned char *pattern, const unsigned char *string)
else if(*p == '\0') {
if(*s == '\0')
return CURL_FNMATCH_MATCH;
- else
- return CURL_FNMATCH_NOMATCH;
+ return CURL_FNMATCH_NOMATCH;
}
else if(*p == '\\') {
state = CURLFNM_LOOP_BACKSLASH;
diff --git a/lib/curl_md4.h b/lib/curl_md4.h
index 8c26d122..e0690416 100644
--- a/lib/curl_md4.h
+++ b/lib/curl_md4.h
@@ -24,12 +24,12 @@
#include "curl_setup.h"
-/* NSS and OS/400 crypto library do not provide the MD4 hash algorithm, so
- * that we have a local implementation of it */
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO)
+#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);
-#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) */
+#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
#endif /* HEADER_CURL_MD4_H */
diff --git a/lib/curl_memory.h b/lib/curl_memory.h
index 6f792fff..fccf4687 100644
--- a/lib/curl_memory.h
+++ b/lib/curl_memory.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -70,7 +70,7 @@
*
* Programs and libraries in 'tests' subdirectories have specific
* purposes and needs, and as such each one will use whatever fits
- * best, depending additionally wether it links with libcurl or not.
+ * best, depending additionally whether it links with libcurl or not.
*
* Caveat emptor. Proper curlx_* separation is a work in progress
* the same as CURLX_NO_MEMORY_CALLBACKS usage, some adjustments may
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index 73d983cf..aea54529 100644
--- a/lib/curl_ntlm_core.c
+++ b/lib/curl_ntlm_core.c
@@ -27,7 +27,7 @@
/*
* NTLM details:
*
- * http://davenport.sourceforge.net/ntlm.html
+ * https://davenport.sourceforge.io/ntlm.html
* https://www.innovation.ch/java/ntlm.html
*/
@@ -80,6 +80,9 @@
# include <mbedtls/des.h>
# include <mbedtls/md4.h>
+# if !defined(MBEDTLS_MD4_C)
+# include "curl_md4.h"
+# endif
#elif defined(USE_NSS)
@@ -501,7 +504,7 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
return CURLE_OK;
}
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
static void ascii_to_unicode_le(unsigned char *dest, const char *src,
size_t srclen)
{
@@ -512,14 +515,14 @@ static void ascii_to_unicode_le(unsigned char *dest, const char *src,
}
}
-#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI)
+#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
static void ascii_uppercase_to_unicode_le(unsigned char *dest,
const char *src, size_t srclen)
{
size_t i;
for(i = 0; i < srclen; i++) {
- dest[2 * i] = (unsigned char)(toupper(src[i]));
+ dest[2 * i] = (unsigned char)(Curl_raw_toupper(src[i]));
dest[2 * i + 1] = '\0';
}
}
@@ -568,10 +571,11 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
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) || defined(USE_OS400CRYPTO) || \
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
+ Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_MBEDTLS)
mbedtls_md4(pw, 2 * len, ntbuffer);
-#elif defined(USE_NSS) || defined(USE_OS400CRYPTO)
- Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_DARWINSSL)
(void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
#elif defined(USE_WIN32_CRYPTO)
@@ -597,7 +601,7 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
return CURLE_OK;
}
-#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI)
+#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,
@@ -715,8 +719,10 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
/* Create the BLOB structure */
snprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN,
- NTLMv2_BLOB_SIGNATURE
+ "%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);
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index c5f90e77..4a83d40b 100644
--- a/lib/curl_ntlm_core.h
+++ b/lib/curl_ntlm_core.h
@@ -33,31 +33,26 @@
!defined(HEADER_SSL_H) && !defined(HEADER_MD5_H)
# error "curl_ntlm_core.h shall not be included before OpenSSL headers."
# endif
-# ifdef OPENSSL_NO_MD4
-# define USE_NTRESPONSES 0
-# define USE_NTLM2SESSION 0
-# define USE_NTLM_V2 0
-# endif
#endif
-/* Define USE_NTRESPONSES to 1 in order to make the type-3 message include
+/* Define USE_NTRESPONSES in order to make the type-3 message include
* the NT response message. */
-#ifndef USE_NTRESPONSES
-#define USE_NTRESPONSES 1
+#if !defined(USE_OPENSSL) || !defined(OPENSSL_NO_MD4)
+#define USE_NTRESPONSES
#endif
-/* Define USE_NTLM2SESSION to 1 in order to make the type-3 message include the
+/* 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_NTLM2SESSION) && USE_NTRESPONSES && !defined(USE_WIN32_CRYPTO)
-#define USE_NTLM2SESSION 1
+#if defined(USE_NTRESPONSES) && !defined(USE_WIN32_CRYPTO)
+#define USE_NTLM2SESSION
#endif
-/* Define USE_NTLM_V2 to 1 in order to allow the type-3 message to include the
+/* Define USE_NTLM_V2 in order to allow the type-3 message to include the
LMv2 and NTLMv2 response messages, requires USE_NTRESPONSES defined to 1
and support for 64-bit integers. */
-#if !defined(USE_NTLM_V2) && USE_NTRESPONSES && (CURL_SIZEOF_CURL_OFF_T > 4)
-#define USE_NTLM_V2 1
+#if defined(USE_NTRESPONSES) && (CURL_SIZEOF_CURL_OFF_T > 4)
+#define USE_NTLM_V2
#endif
void Curl_ntlm_core_lm_resp(const unsigned char *keys,
@@ -68,12 +63,12 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
const char *password,
unsigned char *lmbuffer /* 21 bytes */);
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
const char *password,
unsigned char *ntbuffer /* 21 bytes */);
-#if USE_NTLM_V2 && !defined(USE_WINDOWS_SSPI)
+#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen,
const unsigned char *data, unsigned int datalen,
diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c
index 6a90e623..9e9586cc 100644
--- a/lib/curl_ntlm_wb.c
+++ b/lib/curl_ntlm_wb.c
@@ -28,7 +28,7 @@
/*
* NTLM details:
*
- * http://davenport.sourceforge.net/ntlm.html
+ * https://davenport.sourceforge.io/ntlm.html
* https://www.innovation.ch/java/ntlm.html
*/
@@ -123,7 +123,6 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
struct passwd pw, *pw_res;
char pwbuf[1024];
#endif
- int error;
/* Return if communication with ntlm_auth already set up */
if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
@@ -178,26 +177,23 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
ntlm_auth = NTLM_WB_FILE;
if(access(ntlm_auth, X_OK) != 0) {
- error = ERRNO;
failf(conn->data, "Could not access ntlm_auth: %s errno %d: %s",
- ntlm_auth, error, Curl_strerror(conn, error));
+ ntlm_auth, errno, Curl_strerror(conn, errno));
goto done;
}
if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
- error = ERRNO;
failf(conn->data, "Could not open socket pair. errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
goto done;
}
child_pid = fork();
if(child_pid == -1) {
- error = ERRNO;
sclose(sockfds[0]);
sclose(sockfds[1]);
failf(conn->data, "Could not fork. errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
goto done;
}
else if(!child_pid) {
@@ -208,16 +204,14 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
/* Don't use sclose in the child since it fools the socket leak detector */
sclose_nolog(sockfds[0]);
if(dup2(sockfds[1], STDIN_FILENO) == -1) {
- error = ERRNO;
failf(conn->data, "Could not redirect child stdin. errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
exit(1);
}
if(dup2(sockfds[1], STDOUT_FILENO) == -1) {
- error = ERRNO;
failf(conn->data, "Could not redirect child stdout. errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
exit(1);
}
@@ -235,10 +229,9 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
"--username", username,
NULL);
- error = ERRNO;
sclose_nolog(sockfds[1]);
failf(conn->data, "Could not execl(). errno %d: %s",
- error, Curl_strerror(conn, error));
+ errno, Curl_strerror(conn, errno));
exit(1);
}
diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
index 06dd047a..97430647 100644
--- a/lib/curl_rtmp.c
+++ b/lib/curl_rtmp.c
@@ -25,6 +25,7 @@
#ifdef USE_LIBRTMP
+#include "curl_rtmp.h"
#include "urldata.h"
#include "nonblock.h" /* for curlx_nonblock */
#include "progress.h" /* for Curl_pgrsSetUploadSize */
@@ -73,6 +74,7 @@ const struct Curl_handler Curl_handler_rtmp = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMP, /* protocol */
PROTOPT_NONE /* flags*/
@@ -93,6 +95,7 @@ const struct Curl_handler Curl_handler_rtmpt = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPT, /* protocol */
PROTOPT_NONE /* flags*/
@@ -113,6 +116,7 @@ const struct Curl_handler Curl_handler_rtmpe = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMPE, /* protocol */
PROTOPT_NONE /* flags*/
@@ -133,6 +137,7 @@ const struct Curl_handler Curl_handler_rtmpte = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPTE, /* protocol */
PROTOPT_NONE /* flags*/
@@ -153,6 +158,7 @@ const struct Curl_handler Curl_handler_rtmps = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPS, /* protocol */
PROTOPT_NONE /* flags*/
@@ -173,6 +179,7 @@ const struct Curl_handler Curl_handler_rtmpts = {
ZERO_NULL, /* perform_getsock */
rtmp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPTS, /* protocol */
PROTOPT_NONE /* flags*/
@@ -199,7 +206,7 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
RTMP *r = conn->proto.generic;
SET_RCVTIMEO(tv, 10);
- r->m_sb.sb_socket = conn->sock[FIRSTSOCKET];
+ r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];
/* We have to know if it's a write before we send the
* connect request packet
diff --git a/lib/curl_sasl.c b/lib/curl_sasl.c
index 807f5de7..bd574b5e 100644
--- a/lib/curl_sasl.c
+++ b/lib/curl_sasl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -50,7 +50,7 @@
#include "memdebug.h"
/* Supported mechanisms */
-const struct {
+static const struct {
const char *name; /* Name */
size_t len; /* Name length */
unsigned int bit; /* Flag bit */
@@ -415,7 +415,6 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
#if !defined(CURL_DISABLE_CRYPTO_AUTH)
- char *serverdata;
char *chlg = NULL;
size_t chlglen = 0;
#endif
@@ -424,6 +423,10 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
data->set.str[STRING_SERVICE_NAME] :
sasl->params->service;
#endif
+#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
+ defined(USE_NTLM)
+ char *serverdata;
+#endif
size_t len = 0;
*progress = SASL_INPROGRESS;
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 0fe3633e..4a3b85c4 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,6 +22,10 @@
*
***************************************************************************/
+#if defined(BUILDING_LIBCURL) && !defined(CURL_NO_OLDIES)
+#define CURL_NO_OLDIES
+#endif
+
/*
* Define WIN32 when build target is Win32 API
*/
@@ -31,6 +35,17 @@
#define WIN32
#endif
+#ifdef WIN32
+/*
+ * Don't include unneeded stuff in Windows headers to avoid compiler
+ * warnings and macro clashes.
+ * Make sure to define this macro before including any Windows headers.
+ */
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+#endif
+
/*
* Include configuration script results or hand-crafted
* configuration file for platforms which lack config tool.
@@ -124,18 +139,7 @@
/* please, do it beyond the point further indicated in this file. */
/* ================================================================ */
-/*
- * libcurl's external interface definitions are also used internally,
- * and might also include required system header files to define them.
- */
-
-#include <curl/curlbuild.h>
-
-/*
- * Compile time sanity checks must also be done when building the library.
- */
-
-#include <curl/curlrules.h>
+#include <curl/curl.h>
/*
* Ensure that no one is using the old SIZEOF_CURL_OFF_T macro
@@ -202,7 +206,7 @@
/* ================================================================ */
/* No system header file shall be included in this file before this */
-/* point. The only allowed ones are those included from curlbuild.h */
+/* point. The only allowed ones are those included from curl/system.h */
/* ================================================================ */
/*
@@ -248,9 +252,6 @@
# if defined(_UNICODE) && !defined(UNICODE)
# define UNICODE
# endif
-# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-# endif
# include <windows.h>
# ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
@@ -599,11 +600,15 @@ int netware_init(void);
#endif
#endif
-#if defined(HAVE_LIBIDN2) && defined(HAVE_IDN2_H)
+#if defined(HAVE_LIBIDN2) && defined(HAVE_IDN2_H) && !defined(USE_WIN32_IDN)
/* The lib and header are present */
#define USE_LIBIDN2
#endif
+#if defined(USE_LIBIDN2) && defined(USE_WIN32_IDN)
+#error "Both libidn2 and WinIDN are enabled, choose one."
+#endif
+
#ifndef SIZEOF_TIME_T
/* assume default size of time_t to be 32 bit */
#define SIZEOF_TIME_T 4
@@ -634,22 +639,21 @@ int netware_init(void);
#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_OS400CRYPTO) || defined(USE_WIN32_CRYPTO)
+ defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
+ defined(USE_MBEDTLS)
#define USE_NTLM
-#elif defined(USE_MBEDTLS)
+# if defined(USE_MBEDTLS)
+/* Get definition of MBEDTLS_MD4_C */
# include <mbedtls/md4.h>
-# if defined(MBEDTLS_MD4_C)
-#define USE_NTLM
# endif
#endif
#endif
-/* non-configure builds may define CURL_WANTS_CA_BUNDLE_ENV */
-#if defined(CURL_WANTS_CA_BUNDLE_ENV) && !defined(CURL_CA_BUNDLE)
-#define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE")
+#ifdef CURL_WANTS_CA_BUNDLE_ENV
+#error "No longer supported. Set CURLOPT_CAINFO at runtime instead."
#endif
/*
diff --git a/lib/curl_setup_once.h b/lib/curl_setup_once.h
index 4da83499..a5b542c6 100644
--- a/lib/curl_setup_once.h
+++ b/lib/curl_setup_once.h
@@ -196,7 +196,7 @@ struct timeval {
/* */
#else
#define swrite(x,y,z) (ssize_t)send((SEND_TYPE_ARG1)(x), \
- (SEND_TYPE_ARG2)(y), \
+ (SEND_QUAL_ARG2 SEND_TYPE_ARG2)(y), \
(SEND_TYPE_ARG3)(z), \
(SEND_TYPE_ARG4)(SEND_4TH_ARG))
#endif
@@ -436,20 +436,6 @@ typedef int sig_atomic_t;
/*
- * Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno
- * (or equivalent) on this platform to hide platform details to code using it.
- */
-
-#if defined(WIN32) && !defined(USE_LWIPSOCK)
-#define ERRNO ((int)GetLastError())
-#define SET_ERRNO(x) (SetLastError((DWORD)(x)))
-#else
-#define ERRNO (errno)
-#define SET_ERRNO(x) (errno = (x))
-#endif
-
-
-/*
* Portable error number symbolic names defined to Winsock error codes.
*/
diff --git a/lib/curl_threads.c b/lib/curl_threads.c
index a78eff5c..c1624a91 100644
--- a/lib/curl_threads.c
+++ b/lib/curl_threads.c
@@ -104,15 +104,22 @@ int Curl_thread_join(curl_thread_t *hnd)
curl_thread_t Curl_thread_create(unsigned int (CURL_STDCALL *func) (void *),
void *arg)
{
+ curl_thread_t t;
#ifdef _WIN32_WCE
- return CreateThread(NULL, 0, func, arg, 0, NULL);
+ t = CreateThread(NULL, 0, func, arg, 0, NULL);
#else
- curl_thread_t t;
t = (curl_thread_t)_beginthreadex(NULL, 0, func, arg, 0, NULL);
- if((t == 0) || (t == (curl_thread_t)-1L))
+#endif
+ if((t == 0) || (t == LongToHandle(-1L))) {
+#ifdef _WIN32_WCE
+ DWORD gle = GetLastError();
+ errno = ((gle == ERROR_ACCESS_DENIED ||
+ gle == ERROR_NOT_ENOUGH_MEMORY) ?
+ EACCES : EINVAL);
+#endif
return curl_thread_t_null;
+ }
return t;
-#endif
}
void Curl_thread_destroy(curl_thread_t hnd)
diff --git a/lib/dict.c b/lib/dict.c
index 69defc4c..81d89fc4 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -85,6 +85,7 @@ const struct Curl_handler Curl_handler_dict = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_DICT, /* defport */
CURLPROTO_DICT, /* protocol */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
@@ -92,7 +93,7 @@ const struct Curl_handler Curl_handler_dict = {
static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
{
- char *newp;
+ char *newp = NULL;
char *dictp;
char *ptr;
size_t len;
diff --git a/lib/dotdot.c b/lib/dotdot.c
index ea7c8a04..20603bca 100644
--- a/lib/dotdot.c
+++ b/lib/dotdot.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -147,6 +147,7 @@ char *Curl_dedotdotify(const char *input)
else if(!strcmp(".", clone) || !strcmp("..", clone)) {
*clone=0;
+ *out=0;
}
else {
diff --git a/lib/easy.c b/lib/easy.c
index 1242369d..66ec38a5 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -179,7 +179,7 @@ curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
#endif
#else
/*
- * Symbian OS doesn't support initialization to code in writeable static data.
+ * Symbian OS doesn't support initialization to code in writable static data.
* Initialization will occur in the curl_global_init() call.
*/
curl_malloc_callback Curl_cmalloc;
@@ -561,7 +561,7 @@ static void events_setup(struct Curl_multi *multi, struct events *ev)
static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
{
bool done = FALSE;
- CURLMcode mcode;
+ CURLMcode mcode = CURLM_OK;
CURLcode result = CURLE_OK;
while(!done) {
@@ -572,8 +572,8 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
int numfds=0;
int pollrc;
int i;
- struct timeval before;
- struct timeval after;
+ struct curltime before;
+ struct curltime after;
/* populate the fds[] array */
for(m = ev->list, f=&fds[0]; m; m = m->next) {
@@ -615,12 +615,18 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
}
}
- if(!ev->msbump)
+ if(!ev->msbump) {
/* If nothing updated the timeout, we decrease it by the spent time.
* If it was updated, it has the new timeout time stored already.
*/
- ev->ms += curlx_tvdiff(after, before);
-
+ time_t timediff = curlx_tvdiff(after, before);
+ if(timediff > 0) {
+ if(timediff > ev->ms)
+ ev->ms = 0;
+ else
+ ev->ms -= (long)timediff;
+ }
+ }
}
else
return CURLE_RECV_ERROR;
@@ -647,7 +653,9 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
*/
static CURLcode easy_events(struct Curl_multi *multi)
{
- struct events evs= {2, FALSE, 0, NULL, 0};
+ /* this struct is made static to allow it to be used after this function
+ returns and curl_multi_remove_handle() is called */
+ static struct events evs= {2, FALSE, 0, NULL, 0};
/* if running event-based, do some further multi inits */
events_setup(multi, &evs);
@@ -664,7 +672,7 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
bool done = FALSE;
CURLMcode mcode = CURLM_OK;
CURLcode result = CURLE_OK;
- struct timeval before;
+ struct curltime before;
int without_fds = 0; /* count number of consecutive returns from
curl_multi_wait() without any filedescriptors */
@@ -677,7 +685,7 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
if(!mcode) {
if(!rc) {
- struct timeval after = curlx_tvnow();
+ struct curltime after = curlx_tvnow();
/* If it returns without any filedescriptor instantly, we need to
avoid busy-looping during periods where it has nothing particular
@@ -773,8 +781,7 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events)
curl_multi_cleanup(multi);
if(mcode == CURLM_OUT_OF_MEMORY)
return CURLE_OUT_OF_MEMORY;
- else
- return CURLE_FAILED_INIT;
+ return CURLE_FAILED_INIT;
}
sigpipe_ignore(data, &pipe_st);
@@ -870,6 +877,11 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
* get setup on-demand in the code, as that would probably decrease
* the likeliness of us forgetting to init a buffer here in the future.
*/
+ outcurl->set.buffer_size = data->set.buffer_size;
+ outcurl->state.buffer = malloc(outcurl->set.buffer_size + 1);
+ if(!outcurl->state.buffer)
+ goto fail;
+
outcurl->state.headerbuff = malloc(HEADERSIZE);
if(!outcurl->state.headerbuff)
goto fail;
@@ -940,6 +952,7 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
if(outcurl) {
curl_slist_free_all(outcurl->change.cookielist);
outcurl->change.cookielist = NULL;
+ Curl_safefree(outcurl->state.buffer);
Curl_safefree(outcurl->state.headerbuff);
Curl_safefree(outcurl->change.url);
Curl_safefree(outcurl->change.referer);
@@ -975,6 +988,10 @@ void curl_easy_reset(struct Curl_easy *data)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
+
+ /* zero out authentication data: */
+ memset(&data->state.authhost, 0, sizeof(struct auth));
+ memset(&data->state.authproxy, 0, sizeof(struct auth));
}
/*
@@ -1002,19 +1019,32 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
/* put it back in the keepon */
k->keepon = newstate;
- if(!(newstate & KEEP_RECV_PAUSE) && data->state.tempwrite) {
- /* we have a buffer for sending that we now seem to be able to deliver
- since the receive pausing is lifted! */
-
- /* get the pointer in local copy since the function may return PAUSE
- again and then we'll get a new copy allocted and stored in
- the tempwrite variables */
- char *tempwrite = data->state.tempwrite;
-
- data->state.tempwrite = NULL;
- result = Curl_client_chop_write(data->easy_conn, data->state.tempwritetype,
- tempwrite, data->state.tempwritesize);
- free(tempwrite);
+ if(!(newstate & KEEP_RECV_PAUSE) && data->state.tempcount) {
+ /* there are buffers for sending that can be delivered as the receive
+ pausing is lifted! */
+ unsigned int i;
+ unsigned int count = data->state.tempcount;
+ struct tempbuf writebuf[3]; /* there can only be three */
+
+ /* copy the structs to allow for immediate re-pausing */
+ for(i=0; i < data->state.tempcount; i++) {
+ writebuf[i] = data->state.tempwrite[i];
+ data->state.tempwrite[i].buf = NULL;
+ }
+ data->state.tempcount = 0;
+
+ for(i=0; i < count; i++) {
+ /* even if one function returns error, this loops through and frees all
+ buffers */
+ if(!result)
+ result = Curl_client_chop_write(data->easy_conn,
+ writebuf[i].type,
+ writebuf[i].buf,
+ writebuf[i].len);
+ free(writebuf[i].buf);
+ }
+ if(result)
+ return result;
}
/* if there's no error and we're not pausing both directions, we want
@@ -1022,7 +1052,7 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
if(!result &&
((newstate&(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
- Curl_expire(data, 0); /* get this handle going again */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
return result;
}
diff --git a/lib/escape.c b/lib/escape.c
index 9c811b8e..973aeb6e 100644
--- a/lib/escape.c
+++ b/lib/escape.c
@@ -113,9 +113,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
testing_ptr = Curl_saferealloc(ns, alloc);
if(!testing_ptr)
return NULL;
- else {
- ns = testing_ptr;
- }
+ ns = testing_ptr;
}
result = Curl_convert_to_network(data, &in, 1);
diff --git a/lib/file.c b/lib/file.c
index 3dbc0f2b..666cbe75 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -108,6 +108,7 @@ const struct Curl_handler Curl_handler_file = {
ZERO_NULL, /* perform_getsock */
file_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
0, /* defport */
CURLPROTO_FILE, /* protocol */
PROTOPT_NONETWORK | PROTOPT_NOURLQUERY /* flags */
@@ -311,7 +312,6 @@ static CURLcode file_upload(struct connectdata *conn)
size_t nread;
size_t nwrite;
curl_off_t bytecount = 0;
- struct timeval now = Curl_tvnow();
struct_stat file_stat;
const char *buf2;
@@ -355,13 +355,12 @@ static CURLcode file_upload(struct connectdata *conn)
failf(data, "Can't get the size of %s", file->path);
return CURLE_WRITE_ERROR;
}
- else
- data->state.resume_from = (curl_off_t)file_stat.st_size;
+ data->state.resume_from = (curl_off_t)file_stat.st_size;
}
while(!result) {
int readcount;
- result = Curl_fillreadbuffer(conn, BUFSIZE, &readcount);
+ result = Curl_fillreadbuffer(conn, (int)data->set.buffer_size, &readcount);
if(result)
break;
@@ -400,7 +399,7 @@ static CURLcode file_upload(struct connectdata *conn)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, now);
+ result = Curl_speedcheck(data, Curl_tvnow());
}
if(!result && Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
@@ -437,7 +436,6 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
char *buf = data->state.buffer;
curl_off_t bytecount = 0;
int fd;
- struct timeval now = Curl_tvnow();
struct FILEPROTO *file;
*done = TRUE; /* unconditionally */
@@ -476,9 +474,10 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
time_t filetime;
struct tm buffer;
const struct tm *tm = &buffer;
- snprintf(buf, sizeof(data->state.buffer),
+ char header[80];
+ snprintf(header, sizeof(header),
"Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", expected_size);
- result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0);
+ result = Curl_client_write(conn, CLIENTWRITE_BOTH, header, 0);
if(result)
return result;
@@ -493,7 +492,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
return result;
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
- snprintf(buf, BUFSIZE-1,
+ snprintf(header, sizeof(header),
"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,
@@ -502,7 +501,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
- result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0);
+ result = Curl_client_write(conn, CLIENTWRITE_BOTH, header, 0);
if(!result)
/* set the file size to make it available post transfer */
Curl_pgrsSetDownloadSize(data, expected_size);
@@ -519,8 +518,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
failf(data, "Can't get the size of file.");
return CURLE_READ_ERROR;
}
- else
- data->state.resume_from += (curl_off_t)statbuf.st_size;
+ data->state.resume_from += (curl_off_t)statbuf.st_size;
}
if(data->state.resume_from <= expected_size)
@@ -559,12 +557,11 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
size_t bytestoread;
if(size_known) {
- bytestoread =
- (expected_size < CURL_OFF_T_C(BUFSIZE) - CURL_OFF_T_C(1)) ?
- curlx_sotouz(expected_size) : BUFSIZE - 1;
+ bytestoread = (expected_size < data->set.buffer_size) ?
+ curlx_sotouz(expected_size) : (size_t)data->set.buffer_size;
}
else
- bytestoread = BUFSIZE-1;
+ bytestoread = data->set.buffer_size-1;
nread = read(fd, buf, bytestoread);
@@ -587,7 +584,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, now);
+ result = Curl_speedcheck(data, Curl_tvnow());
}
if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK;
diff --git a/lib/fileinfo.c b/lib/fileinfo.c
index 144c65b1..38729884 100644
--- a/lib/fileinfo.c
+++ b/lib/fileinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 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
@@ -28,23 +28,19 @@
/* The last #include file should be: */
#include "memdebug.h"
-struct curl_fileinfo *Curl_fileinfo_alloc(void)
+struct fileinfo *Curl_fileinfo_alloc(void)
{
- struct curl_fileinfo *tmp = malloc(sizeof(struct curl_fileinfo));
- if(!tmp)
- return NULL;
- memset(tmp, 0, sizeof(struct curl_fileinfo));
- return tmp;
+ return calloc(1, sizeof(struct fileinfo));
}
void Curl_fileinfo_dtor(void *user, void *element)
{
- struct curl_fileinfo *finfo = element;
+ struct fileinfo *finfo = element;
(void) user;
if(!finfo)
return;
- Curl_safefree(finfo->b_data);
+ Curl_safefree(finfo->info.b_data);
free(finfo);
}
diff --git a/lib/fileinfo.h b/lib/fileinfo.h
index 5324f1a4..c5d0ee5b 100644
--- a/lib/fileinfo.h
+++ b/lib/fileinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010, 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
@@ -23,11 +23,15 @@
***************************************************************************/
#include <curl/curl.h>
+#include "llist.h"
-struct curl_fileinfo *Curl_fileinfo_alloc(void);
+struct fileinfo {
+ struct curl_fileinfo info;
+ struct curl_llist_element list;
+};
-void Curl_fileinfo_dtor(void *, void *);
+struct fileinfo *Curl_fileinfo_alloc(void);
-struct curl_fileinfo *Curl_fileinfo_dup(const struct curl_fileinfo *src);
+void Curl_fileinfo_dtor(void *, void *);
#endif /* HEADER_CURL_FILEINFO_H */
diff --git a/lib/formdata.c b/lib/formdata.c
index abd2da07..e48a6276 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -48,15 +48,12 @@ static char *Curl_basename(char *path);
#endif
static size_t readfromfile(struct Form *form, char *buffer, size_t size);
-static char *formboundary(struct Curl_easy *data);
+static CURLcode formboundary(struct Curl_easy *data, char *buffer, size_t len);
/* What kind of Content-Type to use on un-specified files with unrecognized
extensions. */
#define HTTPPOST_CONTENTTYPE_DEFAULT "application/octet-stream"
-#define FORM_FILE_SEPARATOR ','
-#define FORM_TYPE_SEPARATOR ';'
-
#define HTTPPOST_PTRNAME CURL_HTTPPOST_PTRNAME
#define HTTPPOST_FILENAME CURL_HTTPPOST_FILENAME
#define HTTPPOST_PTRCONTENTS CURL_HTTPPOST_PTRCONTENTS
@@ -99,7 +96,7 @@ AddHttpPost(char *name, size_t namelength,
post->contenttype = contenttype;
post->contentheader = contentHeader;
post->showfilename = showfilename;
- post->userp = userp,
+ post->userp = userp;
post->flags = flags | CURL_HTTPPOST_LARGE;
}
else
@@ -342,6 +339,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
#else
current_form->flags |= HTTPPOST_PTRNAME; /* fall through */
#endif
+ /* FALLTHROUGH */
case CURLFORM_COPYNAME:
if(current_form->name)
return_value = CURL_FORMADD_OPTION_TWICE;
@@ -629,70 +627,68 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
return_value = CURL_FORMADD_INCOMPLETE;
break;
}
- else {
- if(((form->flags & HTTPPOST_FILENAME) ||
- (form->flags & HTTPPOST_BUFFER)) &&
- !form->contenttype) {
- char *f = form->flags & HTTPPOST_BUFFER?
- form->showfilename : form->value;
-
- /* our contenttype is missing */
- form->contenttype = strdup(ContentTypeForFilename(f, prevtype));
- if(!form->contenttype) {
- return_value = CURL_FORMADD_MEMORY;
- break;
- }
- form->contenttype_alloc = TRUE;
+ if(((form->flags & HTTPPOST_FILENAME) ||
+ (form->flags & HTTPPOST_BUFFER)) &&
+ !form->contenttype) {
+ char *f = form->flags & HTTPPOST_BUFFER?
+ form->showfilename : form->value;
+
+ /* our contenttype is missing */
+ form->contenttype = strdup(ContentTypeForFilename(f, prevtype));
+ if(!form->contenttype) {
+ return_value = CURL_FORMADD_MEMORY;
+ break;
}
- if(!(form->flags & HTTPPOST_PTRNAME) &&
- (form == first_form) ) {
- /* Note that there's small risk that form->name is NULL here if the
- app passed in a bad combo, so we better check for that first. */
- if(form->name) {
- /* copy name (without strdup; possibly contains null characters) */
- form->name = Curl_memdup(form->name, form->namelength?
- form->namelength:
- strlen(form->name)+1);
- }
- if(!form->name) {
- return_value = CURL_FORMADD_MEMORY;
- break;
- }
- form->name_alloc = TRUE;
+ form->contenttype_alloc = TRUE;
+ }
+ if(!(form->flags & HTTPPOST_PTRNAME) &&
+ (form == first_form) ) {
+ /* Note that there's small risk that form->name is NULL here if the
+ app passed in a bad combo, so we better check for that first. */
+ if(form->name) {
+ /* copy name (without strdup; possibly contains null characters) */
+ form->name = Curl_memdup(form->name, form->namelength?
+ form->namelength:
+ strlen(form->name)+1);
+ }
+ if(!form->name) {
+ return_value = CURL_FORMADD_MEMORY;
+ break;
}
- if(!(form->flags & (HTTPPOST_FILENAME | HTTPPOST_READFILE |
- HTTPPOST_PTRCONTENTS | HTTPPOST_PTRBUFFER |
- HTTPPOST_CALLBACK)) && form->value) {
- /* copy value (without strdup; possibly contains null characters) */
- size_t clen = (size_t) form->contentslength;
- if(!clen)
- clen = strlen(form->value)+1;
+ form->name_alloc = TRUE;
+ }
+ if(!(form->flags & (HTTPPOST_FILENAME | HTTPPOST_READFILE |
+ HTTPPOST_PTRCONTENTS | HTTPPOST_PTRBUFFER |
+ HTTPPOST_CALLBACK)) && form->value) {
+ /* copy value (without strdup; possibly contains null characters) */
+ size_t clen = (size_t) form->contentslength;
+ if(!clen)
+ clen = strlen(form->value)+1;
- form->value = Curl_memdup(form->value, clen);
+ form->value = Curl_memdup(form->value, clen);
- if(!form->value) {
- return_value = CURL_FORMADD_MEMORY;
- break;
- }
- form->value_alloc = TRUE;
- }
- post = AddHttpPost(form->name, form->namelength,
- form->value, form->contentslength,
- form->buffer, form->bufferlength,
- form->contenttype, form->flags,
- form->contentheader, form->showfilename,
- form->userp,
- post, httppost,
- last_post);
-
- if(!post) {
+ if(!form->value) {
return_value = CURL_FORMADD_MEMORY;
break;
}
-
- if(form->contenttype)
- prevtype = form->contenttype;
+ form->value_alloc = TRUE;
+ }
+ post = AddHttpPost(form->name, form->namelength,
+ form->value, form->contentslength,
+ form->buffer, form->bufferlength,
+ form->contenttype, form->flags,
+ form->contentheader, form->showfilename,
+ form->userp,
+ post, httppost,
+ last_post);
+
+ if(!post) {
+ return_value = CURL_FORMADD_MEMORY;
+ break;
}
+
+ if(form->contenttype)
+ prevtype = form->contenttype;
}
if(CURL_FORMADD_OK != return_value) {
/* On error, free allocated fields for nodes of the FormInfo linked
@@ -1163,20 +1159,19 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
struct FormData *firstform;
struct curl_httppost *file;
CURLcode result = CURLE_OK;
-
curl_off_t size = 0; /* support potentially ENORMOUS formposts */
- char *boundary;
- char *fileboundary = NULL;
+ char fileboundary[42];
struct curl_slist *curList;
+ char boundary[42];
*finalform = NULL; /* default form is empty */
if(!post)
return result; /* no input => no output! */
- boundary = formboundary(data);
- if(!boundary)
- return CURLE_OUT_OF_MEMORY;
+ result = formboundary(data, boundary, sizeof(boundary));
+ if(result)
+ return result;
/* Make the first line of the output */
result = AddFormDataf(&form, NULL,
@@ -1186,7 +1181,6 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
boundary);
if(result) {
- free(boundary);
return result;
}
/* we DO NOT include that line in the total size of the POST, since it'll be
@@ -1229,10 +1223,8 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
/* If used, this is a link to more file names, we must then do
the magic to include several files with the same field name */
- free(fileboundary);
- fileboundary = formboundary(data);
- if(!fileboundary) {
- result = CURLE_OUT_OF_MEMORY;
+ result = formboundary(data, fileboundary, sizeof(fileboundary));
+ if(result) {
break;
}
@@ -1332,7 +1324,7 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
char buffer[512];
while((nread = fread(buffer, 1, sizeof(buffer), fileread)) != 0) {
result = AddFormData(&form, FORM_CONTENT, buffer, nread, &size);
- if(result)
+ if(result || feof(fileread) || ferror(fileread))
break;
}
}
@@ -1383,16 +1375,10 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
if(result) {
Curl_formclean(&firstform);
- free(fileboundary);
- free(boundary);
return result;
}
*sizep = size;
-
- free(fileboundary);
- free(boundary);
-
*finalform = firstform;
return result;
@@ -1462,8 +1448,7 @@ static size_t readfromfile(struct Form *form, char *buffer,
if(callback) {
if(form->fread_func == ZERO_NULL)
return 0;
- else
- nread = form->fread_func(buffer, 1, size, form->data->line);
+ nread = form->fread_func(buffer, 1, size, form->data->line);
}
else {
if(!form->fp) {
@@ -1553,7 +1538,7 @@ char *Curl_formpostheader(void *formp, size_t *len)
struct Form *form=(struct Form *)formp;
if(!form->data)
- return 0; /* nothing, ERROR! */
+ return NULL; /* nothing, ERROR! */
header = form->data->line;
*len = form->data->length;
@@ -1567,16 +1552,18 @@ char *Curl_formpostheader(void *formp, size_t *len)
* formboundary() creates a suitable boundary string and returns an allocated
* one.
*/
-static char *formboundary(struct Curl_easy *data)
+static CURLcode formboundary(struct Curl_easy *data,
+ char *buffer, size_t buflen)
{
/* 24 dashes and 16 hexadecimal digits makes 64 bit (18446744073709551615)
combinations */
- unsigned int rnd[2];
- CURLcode result = Curl_rand(data, &rnd[0], 2);
- if(result)
- return NULL;
+ if(buflen < 41)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
- return aprintf("------------------------%08x%08x", rnd[0], rnd[1]);
+ memset(buffer, '-', 24);
+ Curl_rand_hex(data, (unsigned char *)&buffer[24], 17);
+
+ return CURLE_OK;
}
#else /* CURL_DISABLE_HTTP */
diff --git a/lib/ftp.c b/lib/ftp.c
index fd77a5ac..6e86e538 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -178,10 +178,11 @@ const struct Curl_handler Curl_handler_ftp = {
ZERO_NULL, /* perform_getsock */
ftp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_FTP, /* defport */
CURLPROTO_FTP, /* protocol */
- PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD
- | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
+ PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP /* flags */
};
@@ -205,6 +206,7 @@ const struct Curl_handler Curl_handler_ftps = {
ZERO_NULL, /* perform_getsock */
ftp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_FTPS, /* defport */
CURLPROTO_FTPS, /* protocol */
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
@@ -212,59 +214,6 @@ const struct Curl_handler Curl_handler_ftps = {
};
#endif
-#ifndef CURL_DISABLE_HTTP
-/*
- * HTTP-proxyed FTP protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_ftp_proxy = {
- "FTP", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_FTP, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-
-
-#ifdef USE_SSL
-/*
- * HTTP-proxyed FTPS protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_ftps_proxy = {
- "FTPS", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_FTPS, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-#endif
-#endif
-
static void close_secondarysocket(struct connectdata *conn)
{
if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET]) {
@@ -272,7 +221,6 @@ static void close_secondarysocket(struct connectdata *conn)
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
}
conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE;
- conn->tunnel_state[SECONDARYSOCKET] = TUNNEL_INIT;
}
/*
@@ -388,7 +336,7 @@ static time_t ftp_timeleft_accept(struct Curl_easy *data)
{
time_t timeout_ms = DEFAULT_ACCEPT_TIMEOUT;
time_t other;
- struct timeval now;
+ struct curltime now;
if(data->set.accepttimeout > 0)
timeout_ms = data->set.accepttimeout;
@@ -580,10 +528,8 @@ 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(data->set.accepttimeout > 0)
- Curl_expire(data, data->set.accepttimeout);
- else
- Curl_expire(data, DEFAULT_ACCEPT_TIMEOUT);
+ Curl_expire(data, data->set.accepttimeout > 0 ?
+ data->set.accepttimeout: DEFAULT_ACCEPT_TIMEOUT, 0);
}
}
@@ -916,8 +862,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
return bits;
}
- else
- return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
+ return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}
/* This is called after the FTP_QUOTE state is passed.
@@ -942,21 +887,24 @@ 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->bits.reuse && ftpc->entrypath) {
+ 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) {
/* 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: */
- ftpc->count1 = 0; /* we count this as the first path, then we add one
- for all upcoming ones in the ftp->dirs[] array */
+ ftpc->cwdcount = 0; /* we count this as the first path, then we add one
+ for all upcoming ones in the ftp->dirs[] array */
PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->entrypath);
state(conn, FTP_CWD);
}
else {
if(ftpc->dirdepth) {
- ftpc->count1 = 1;
+ ftpc->cwdcount = 1;
/* issue the first CWD, the rest is sent when the CWD responses are
received... */
- PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->dirs[ftpc->count1 -1]);
+ PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->dirs[ftpc->cwdcount -1]);
state(conn, FTP_CWD);
}
else {
@@ -1209,7 +1157,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
possibly_non_local = FALSE; /* don't try this again */
continue;
}
- else if(error != EADDRINUSE && error != EACCES) {
+ if(error != EADDRINUSE && error != EACCES) {
failf(data, "bind(port=%hu) failed: %s", port,
Curl_strerror(conn, error) );
Curl_closesocket(conn, portsock);
@@ -1307,7 +1255,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
}
break;
}
- else if(PORT == fcmd) {
+ if(PORT == fcmd) {
char *source = myhost;
char *dest = tmp;
@@ -1674,31 +1622,30 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
}
if(seekerr != CURL_SEEKFUNC_OK) {
+ curl_off_t passed=0;
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
return CURLE_FTP_COULDNT_USE_REST;
}
/* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
- else {
- curl_off_t passed=0;
- do {
- size_t readthisamountnow =
- (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
- BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
-
- size_t actuallyread =
- data->state.fread_func(data->state.buffer, 1, readthisamountnow,
- data->state.in);
-
- passed += actuallyread;
- if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
- /* this checks for greater-than only to make sure that the
- CURL_READFUNC_ABORT return code still aborts */
- failf(data, "Failed to read data");
- return CURLE_FTP_COULDNT_USE_REST;
- }
- } while(passed < data->state.resume_from);
- }
+ do {
+ size_t readthisamountnow =
+ (data->state.resume_from - passed > data->set.buffer_size) ?
+ (size_t)data->set.buffer_size :
+ curlx_sotouz(data->state.resume_from - passed);
+
+ size_t actuallyread =
+ data->state.fread_func(data->state.buffer, 1, readthisamountnow,
+ data->state.in);
+
+ passed += actuallyread;
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+ /* this checks for greater-than only to make sure that the
+ CURL_READFUNC_ABORT return code still aborts */
+ failf(data, "Failed to read data");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ } while(passed < data->state.resume_from);
}
/* now, decrease the size of the read */
if(data->state.infilesize>0) {
@@ -1757,7 +1704,7 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
/*
* This state uses:
* 'count1' to iterate over the commands to send
- * 'count2' to store wether to allow commands to fail
+ * 'count2' to store whether to allow commands to fail
*/
if(init)
@@ -2000,7 +1947,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
if(!addr) {
failf(data, "Can't resolve proxy host %s:%hu", host_name, connectport);
- return CURLE_FTP_CANT_GET_HOST;
+ return CURLE_COULDNT_RESOLVE_PROXY;
}
}
else {
@@ -2040,11 +1987,14 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* this just dumps information about this second connection */
ftp_pasv_verbose(conn, addr->addr, ftpc->newhost, connectport);
+ Curl_resolv_unlock(data, addr); /* we're done using this address */
+
Curl_safefree(conn->secondaryhostname);
- conn->secondaryhostname = strdup(ftpc->newhost);
conn->secondary_port = ftpc->newport;
+ conn->secondaryhostname = strdup(ftpc->newhost);
+ if(!conn->secondaryhostname)
+ return CURLE_OUT_OF_MEMORY;
- Curl_resolv_unlock(data, addr); /* we're done using this address */
conn->bits.do_more = TRUE;
state(conn, FTP_STOP); /* this phase is completed */
@@ -2101,17 +2051,17 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
/* we got a time. Format should be: "YYYYMMDDHHMMSS[.sss]" where the
last .sss part is optional and means fractions of a second */
int year, month, day, hour, minute, second;
- char *buf = data->state.buffer;
- if(6 == sscanf(buf+4, "%04d%02d%02d%02d%02d%02d",
+ if(6 == sscanf(&data->state.buffer[4], "%04d%02d%02d%02d%02d%02d",
&year, &month, &day, &hour, &minute, &second)) {
/* we have a time, reformat it */
+ char timebuf[24];
time_t secs=time(NULL);
- /* using the good old yacc/bison yuck */
- snprintf(buf, sizeof(conn->data->state.buffer),
+
+ snprintf(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 = (long)curl_getdate(buf, &secs);
+ data->info.filetime = (long)curl_getdate(timebuf, &secs);
}
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2122,6 +2072,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
ftpc->file &&
data->set.get_filetime &&
(data->info.filetime>=0) ) {
+ char headerbuf[128];
time_t filetime = (time_t)data->info.filetime;
struct tm buffer;
const struct tm *tm = &buffer;
@@ -2131,7 +2082,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
return result;
/* format: "Tue, 15 Nov 1994 12:45:26" */
- snprintf(buf, BUFSIZE-1,
+ 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,
@@ -2140,7 +2091,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
- result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0);
+ result = Curl_client_write(conn, CLIENTWRITE_BOTH, headerbuf, 0);
if(result)
return result;
} /* end of a ridiculous amount of conditionals */
@@ -2318,9 +2269,10 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
if(-1 != filesize) {
- snprintf(buf, sizeof(data->state.buffer),
+ char clbuf[128];
+ snprintf(clbuf, sizeof(clbuf),
"Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", filesize);
- result = Curl_client_write(conn, CLIENTWRITE_BOTH, buf, 0);
+ result = Curl_client_write(conn, CLIENTWRITE_BOTH, clbuf, 0);
if(result)
return result;
}
@@ -2409,8 +2361,7 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn,
return CURLE_OK;
}
- else
- return InitiateTransfer(conn);
+ return InitiateTransfer(conn);
}
/* for LIST and RETR responses */
@@ -2421,7 +2372,6 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct FTP *ftp = data->req.protop;
- char *buf = data->state.buffer;
if((ftpcode == 150) || (ftpcode == 125)) {
@@ -2465,6 +2415,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
*
* Example D above makes this parsing a little tricky */
char *bytes;
+ char *buf = data->state.buffer;
bytes=strstr(buf, " bytes");
if(bytes--) {
long in=(long)(bytes-buf);
@@ -2823,6 +2774,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
case FTP_PWD:
if(ftpcode == 257) {
char *ptr=&data->state.buffer[4]; /* start on the first letter */
+ const size_t buf_size = data->set.buffer_size;
char *dir;
char *store;
@@ -2840,7 +2792,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
*/
/* scan for the first double-quote for non-standard responses */
- while(ptr < &data->state.buffer[sizeof(data->state.buffer)]
+ while(ptr < &data->state.buffer[buf_size]
&& *ptr != '\n' && *ptr != '\0' && *ptr != '"')
ptr++;
@@ -2870,7 +2822,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
does not start with a '/'), we probably need some server-dependent
adjustments. For example, this is the case when connecting to
an OS400 FTP server: this server supports two name syntaxes,
- the default one being incompatible with standard pathes. In
+ the default one being incompatible with standard paths. In
addition, this server switches automatically to the regular path
syntax when one is encountered in a command: this results in
having an entrypath in the wrong syntax when later used in CWD.
@@ -2944,12 +2896,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
state(conn, FTP_NAMEFMT);
break;
}
- else {
- /* Nothing special for the target server. */
- /* remember target server OS */
- Curl_safefree(ftpc->server_os);
- ftpc->server_os = os;
- }
+ /* Nothing special for the target server. */
+ /* remember target server OS */
+ Curl_safefree(ftpc->server_os);
+ ftpc->server_os = os;
}
else {
/* Cannot identify server OS. Continue anyway and cross fingers. */
@@ -2989,10 +2939,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if(ftpcode/100 != 2) {
/* failure to CWD there */
if(conn->data->set.ftp_create_missing_dirs &&
- ftpc->count1 && !ftpc->count2) {
+ ftpc->cwdcount && !ftpc->count2) {
/* try making it */
ftpc->count2++; /* counter to prevent CWD-MKD loops */
- PPSENDF(&ftpc->pp, "MKD %s", ftpc->dirs[ftpc->count1 - 1]);
+ PPSENDF(&ftpc->pp, "MKD %s", ftpc->dirs[ftpc->cwdcount - 1]);
state(conn, FTP_MKD);
}
else {
@@ -3006,9 +2956,9 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
else {
/* success */
ftpc->count2=0;
- if(++ftpc->count1 <= ftpc->dirdepth) {
+ if(++ftpc->cwdcount <= ftpc->dirdepth) {
/* send next CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->count1 - 1]);
+ PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
}
else {
result = ftp_state_mdtm(conn);
@@ -3026,7 +2976,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
}
state(conn, FTP_CWD);
/* send CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->count1 - 1]);
+ PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
break;
case FTP_MDTM:
@@ -3210,6 +3160,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
/* until we cope better with prematurely ended requests, let them
* fallback as if in complete failure */
+ /* FALLTHROUGH */
default: /* by default, an error means the control connection is
wedged and should not be used anymore */
ftpc->ctl_valid = FALSE;
@@ -3553,7 +3504,7 @@ static CURLcode ftp_range(struct connectdata *conn)
" to %" CURL_FORMAT_CURL_OFF_T ", totally %"
CURL_FORMAT_CURL_OFF_T " bytes\n",
from, to, data->req.maxdownload));
- ftpc->dont_check = TRUE; /* dont check for successful transfer */
+ ftpc->dont_check = TRUE; /* don't check for successful transfer */
}
else
data->req.maxdownload = -1;
@@ -3585,10 +3536,10 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
/* if the second connection isn't done yet, wait for it */
if(!conn->bits.tcpconnect[SECONDARYSOCKET]) {
- if(conn->tunnel_state[SECONDARYSOCKET] == TUNNEL_CONNECT) {
+ 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 */
- result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, NULL, 0, FALSE);
+ result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, NULL, 0);
return result;
}
@@ -3617,12 +3568,12 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
return result;
if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
- conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE)
+ Curl_connect_ongoing(conn))
return result;
if(ftpc->state) {
- /* already in a state so skip the intial commands.
+ /* already in a state so skip the initial commands.
They are only done to kickstart the do_more state */
result = ftp_multi_statemach(conn, &complete);
@@ -3795,12 +3746,10 @@ static CURLcode init_wc_data(struct connectdata *conn)
result = ftp_parse_url_path(conn);
return result;
}
- else {
- wildcard->pattern = strdup(last_slash);
- if(!wildcard->pattern)
- return CURLE_OUT_OF_MEMORY;
- last_slash[0] = '\0'; /* cut file from path */
- }
+ wildcard->pattern = strdup(last_slash);
+ if(!wildcard->pattern)
+ return CURLE_OUT_OF_MEMORY;
+ last_slash[0] = '\0'; /* cut file from path */
}
else { /* there is only 'wildcard pattern' or nothing */
if(path[0]) {
@@ -3885,8 +3834,7 @@ static CURLcode wc_statemach(struct connectdata *conn)
if(wildcard->state == CURLWC_CLEAN)
/* only listing! */
break;
- else
- wildcard->state = result ? CURLWC_ERROR : CURLWC_MATCHING;
+ wildcard->state = result ? CURLWC_ERROR : CURLWC_MATCHING;
break;
case CURLWC_MATCHING: {
@@ -3904,7 +3852,7 @@ static CURLcode wc_statemach(struct connectdata *conn)
wildcard->state = CURLWC_CLEAN;
return wc_statemach(conn);
}
- else if(wildcard->filelist->size == 0) {
+ if(wildcard->filelist.size == 0) {
/* no corresponding file */
wildcard->state = CURLWC_CLEAN;
return CURLE_REMOTE_FILE_NOT_FOUND;
@@ -3915,7 +3863,7 @@ static CURLcode wc_statemach(struct connectdata *conn)
case CURLWC_DOWNLOADING: {
/* filelist has at least one file, lets get first one */
struct ftp_conn *ftpc = &conn->proto.ftpc;
- struct curl_fileinfo *finfo = wildcard->filelist->head->ptr;
+ struct curl_fileinfo *finfo = wildcard->filelist.head->ptr;
char *tmp_path = aprintf("%s%s", wildcard->path, finfo->filename);
if(!tmp_path)
@@ -3930,7 +3878,7 @@ static CURLcode wc_statemach(struct connectdata *conn)
infof(conn->data, "Wildcard - START of \"%s\"\n", finfo->filename);
if(conn->data->set.chunk_bgn) {
long userresponse = conn->data->set.chunk_bgn(
- finfo, wildcard->customptr, (int)wildcard->filelist->size);
+ finfo, wildcard->customptr, (int)wildcard->filelist.size);
switch(userresponse) {
case CURL_CHUNK_BGN_FUNC_SKIP:
infof(conn->data, "Wildcard - \"%s\" skipped by user\n",
@@ -3955,9 +3903,9 @@ static CURLcode wc_statemach(struct connectdata *conn)
return result;
/* we don't need the Curl_fileinfo of first file anymore */
- Curl_llist_remove(wildcard->filelist, wildcard->filelist->head, NULL);
+ Curl_llist_remove(&wildcard->filelist, wildcard->filelist.head, NULL);
- if(wildcard->filelist->size == 0) { /* remains only one file to down. */
+ if(wildcard->filelist.size == 0) { /* remains only one file to down. */
wildcard->state = CURLWC_CLEAN;
/* after that will be ftp_do called once again and no transfer
will be done because of CURLWC_CLEAN state */
@@ -3968,8 +3916,8 @@ static CURLcode wc_statemach(struct connectdata *conn)
case CURLWC_SKIP: {
if(conn->data->set.chunk_end)
conn->data->set.chunk_end(conn->data->wildcard.customptr);
- Curl_llist_remove(wildcard->filelist, wildcard->filelist->head, NULL);
- wildcard->state = (wildcard->filelist->size == 0) ?
+ Curl_llist_remove(&wildcard->filelist, wildcard->filelist.head, NULL);
+ wildcard->state = (wildcard->filelist.size == 0) ?
CURLWC_CLEAN : CURLWC_DOWNLOADING;
return wc_statemach(conn);
}
@@ -3985,6 +3933,7 @@ static CURLcode wc_statemach(struct connectdata *conn)
case CURLWC_DONE:
case CURLWC_ERROR:
+ case CURLWC_CLEAR:
break;
}
@@ -4282,7 +4231,6 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
&ftpc->dirs[ftpc->dirdepth], NULL,
TRUE);
if(result) {
- free(ftpc->dirs[ftpc->dirdepth]);
freedirs(ftpc);
return result;
}
@@ -4466,28 +4414,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
char command;
struct FTP *ftp;
- if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
- /* Unless we have asked to tunnel ftp operations through the proxy, we
- switch and use HTTP operations only */
-#ifndef CURL_DISABLE_HTTP
- if(conn->handler == &Curl_handler_ftp)
- conn->handler = &Curl_handler_ftp_proxy;
- else {
-#ifdef USE_SSL
- conn->handler = &Curl_handler_ftps_proxy;
-#else
- failf(data, "FTPS not supported!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
- /* set it up as a HTTP connection instead */
- return conn->handler->setup_connection(conn);
-#else
- failf(data, "FTP over http proxy requires HTTP support built-in!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
conn->data->req.protop = ftp = malloc(sizeof(struct FTP));
if(NULL == ftp)
return CURLE_OUT_OF_MEMORY;
diff --git a/lib/ftp.h b/lib/ftp.h
index 3bbf2620..9c6c2c8d 100644
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -130,6 +130,7 @@ struct ftp_conn {
should be FALSE when it gets to Curl_ftp_quit() */
bool cwddone; /* if it has been determined that the proper CWD combo
already has been done */
+ int cwdcount; /* number of CWD commands issued */
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 */
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index f94b31b9..2acce31d 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -165,7 +165,7 @@ struct ftp_parselist_data {
} state;
CURLcode error;
- struct curl_fileinfo *file_data;
+ struct fileinfo *file_data;
unsigned int item_length;
size_t item_offset;
struct {
@@ -275,14 +275,15 @@ static void PL_ERROR(struct connectdata *conn, CURLcode err)
}
static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
- struct curl_fileinfo *finfo)
+ struct fileinfo *infop)
{
curl_fnmatch_callback compare;
struct WildcardData *wc = &conn->data->wildcard;
struct ftp_wc_tmpdata *tmpdata = wc->tmp;
- struct curl_llist *llist = wc->filelist;
+ struct curl_llist *llist = &wc->filelist;
struct ftp_parselist_data *parser = tmpdata->parser;
bool add = TRUE;
+ struct curl_fileinfo *finfo = &infop->info;
/* move finfo pointers to b_data */
char *str = finfo->b_data;
@@ -316,11 +317,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
}
if(add) {
- if(!Curl_llist_insert_next(llist, llist->tail, finfo)) {
- Curl_fileinfo_dtor(NULL, finfo);
- tmpdata->parser->file_data = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
+ Curl_llist_insert_next(llist, llist->tail, finfo, &infop->list);
}
else {
Curl_fileinfo_dtor(NULL, finfo);
@@ -337,6 +334,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
struct connectdata *conn = (struct connectdata *)connptr;
struct ftp_wc_tmpdata *tmpdata = conn->data->wildcard.tmp;
struct ftp_parselist_data *parser = tmpdata->parser;
+ struct fileinfo *infop;
struct curl_fileinfo *finfo;
unsigned long i = 0;
CURLcode result;
@@ -366,17 +364,18 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->error = CURLE_OUT_OF_MEMORY;
return bufflen;
}
- parser->file_data->b_data = malloc(FTP_BUFFER_ALLOCSIZE);
- if(!parser->file_data->b_data) {
+ parser->file_data->info.b_data = malloc(FTP_BUFFER_ALLOCSIZE);
+ if(!parser->file_data->info.b_data) {
PL_ERROR(conn, CURLE_OUT_OF_MEMORY);
return bufflen;
}
- parser->file_data->b_size = FTP_BUFFER_ALLOCSIZE;
+ parser->file_data->info.b_size = FTP_BUFFER_ALLOCSIZE;
parser->item_offset = 0;
parser->item_length = 0;
}
- finfo = parser->file_data;
+ infop = parser->file_data;
+ finfo = &infop->info;
finfo->b_data[finfo->b_used++] = c;
if(finfo->b_used >= finfo->b_size - 1) {
@@ -433,10 +432,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
return bufflen;
}
- else {
- parser->state.UNIX.main = PL_UNIX_FILETYPE;
- finfo->b_used = 0;
- }
+ parser->state.UNIX.main = PL_UNIX_FILETYPE;
+ finfo->b_used = 0;
}
else {
PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
@@ -500,8 +497,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
PL_ERROR(conn, CURLE_FTP_BAD_FILE_LIST);
return bufflen;
}
- parser->file_data->flags |= CURLFINFOFLAG_KNOWN_PERM;
- parser->file_data->perm = perm;
+ parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_PERM;
+ parser->file_data->info.perm = perm;
parser->offsets.perm = parser->item_offset;
parser->item_length = 0;
@@ -532,8 +529,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
hlinks = strtol(finfo->b_data + parser->item_offset, &p, 10);
if(p[0] == '\0' && hlinks != LONG_MAX && hlinks != LONG_MIN) {
- parser->file_data->flags |= CURLFINFOFLAG_KNOWN_HLINKCOUNT;
- parser->file_data->hardlinks = hlinks;
+ parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_HLINKCOUNT;
+ parser->file_data->info.hardlinks = hlinks;
}
parser->item_length = 0;
parser->item_offset = 0;
@@ -615,8 +612,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
fsize = curlx_strtoofft(finfo->b_data+parser->item_offset, &p, 10);
if(p[0] == '\0' && fsize != CURL_OFF_T_MAX &&
fsize != CURL_OFF_T_MIN) {
- parser->file_data->flags |= CURLFINFOFLAG_KNOWN_SIZE;
- parser->file_data->size = fsize;
+ parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_SIZE;
+ parser->file_data->info.size = fsize;
}
parser->item_length = 0;
parser->item_offset = 0;
@@ -733,7 +730,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
parser->offsets.filename = parser->item_offset;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
@@ -745,7 +742,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
parser->offsets.filename = parser->item_offset;
parser->state.UNIX.main = PL_UNIX_FILETYPE;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
@@ -840,7 +837,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
else if(c == '\n') {
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
parser->offsets.symlink_target = parser->item_offset;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
@@ -852,7 +849,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
if(c == '\n') {
finfo->b_data[parser->item_offset + parser->item_length - 1] = 0;
parser->offsets.symlink_target = parser->item_offset;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
@@ -955,10 +952,10 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
return bufflen;
}
/* correct file type */
- parser->file_data->filetype = CURLFILETYPE_FILE;
+ parser->file_data->info.filetype = CURLFILETYPE_FILE;
}
- parser->file_data->flags |= CURLFINFOFLAG_KNOWN_SIZE;
+ parser->file_data->info.flags |= CURLFINFOFLAG_KNOWN_SIZE;
parser->item_length = 0;
parser->state.NT.main = PL_WINNT_FILENAME;
parser->state.NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
@@ -985,7 +982,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
parser->offsets.filename = parser->item_offset;
finfo->b_data[finfo->b_used - 1] = 0;
parser->offsets.filename = parser->item_offset;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
@@ -997,7 +994,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
case PL_WINNT_FILENAME_WINEOL:
if(c == '\n') {
parser->offsets.filename = parser->item_offset;
- result = ftp_pl_insert_finfo(conn, finfo);
+ result = ftp_pl_insert_finfo(conn, infop);
if(result) {
PL_ERROR(conn, result);
return bufflen;
diff --git a/lib/getinfo.c b/lib/getinfo.c
index a1ce5058..dc3a107e 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -246,27 +246,60 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
return CURLE_OK;
}
+#define DOUBLE_SECS(x) (double)(x)/1000000
+
+static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
+ curl_off_t *param_offt)
+{
+ switch(info) {
+ case CURLINFO_SIZE_UPLOAD_T:
+ *param_offt = data->progress.uploaded;
+ break;
+ case CURLINFO_SIZE_DOWNLOAD_T:
+ *param_offt = data->progress.downloaded;
+ break;
+ case CURLINFO_SPEED_DOWNLOAD_T:
+ *param_offt = data->progress.dlspeed;
+ break;
+ case CURLINFO_SPEED_UPLOAD_T:
+ *param_offt = data->progress.ulspeed;
+ break;
+ case CURLINFO_CONTENT_LENGTH_DOWNLOAD_T:
+ *param_offt = (data->progress.flags & PGRS_DL_SIZE_KNOWN)?
+ data->progress.size_dl:-1;
+ break;
+ case CURLINFO_CONTENT_LENGTH_UPLOAD_T:
+ *param_offt = (data->progress.flags & PGRS_UL_SIZE_KNOWN)?
+ data->progress.size_ul:-1;
+ break;
+ default:
+ return CURLE_UNKNOWN_OPTION;
+ }
+
+ return CURLE_OK;
+}
+
static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
double *param_doublep)
{
switch(info) {
case CURLINFO_TOTAL_TIME:
- *param_doublep = data->progress.timespent;
+ *param_doublep = DOUBLE_SECS(data->progress.timespent);
break;
case CURLINFO_NAMELOOKUP_TIME:
- *param_doublep = data->progress.t_nslookup;
+ *param_doublep = DOUBLE_SECS(data->progress.t_nslookup);
break;
case CURLINFO_CONNECT_TIME:
- *param_doublep = data->progress.t_connect;
+ *param_doublep = DOUBLE_SECS(data->progress.t_connect);
break;
case CURLINFO_APPCONNECT_TIME:
- *param_doublep = data->progress.t_appconnect;
+ *param_doublep = DOUBLE_SECS(data->progress.t_appconnect);
break;
case CURLINFO_PRETRANSFER_TIME:
- *param_doublep = data->progress.t_pretransfer;
+ *param_doublep = DOUBLE_SECS(data->progress.t_pretransfer);
break;
case CURLINFO_STARTTRANSFER_TIME:
- *param_doublep = data->progress.t_starttransfer;
+ *param_doublep = DOUBLE_SECS(data->progress.t_starttransfer);
break;
case CURLINFO_SIZE_UPLOAD:
*param_doublep = (double)data->progress.uploaded;
@@ -289,7 +322,7 @@ static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
(double)data->progress.size_ul:-1;
break;
case CURLINFO_REDIRECT_TIME:
- *param_doublep = data->progress.t_redirect;
+ *param_doublep = DOUBLE_SECS(data->progress.t_redirect);
break;
default:
@@ -394,6 +427,7 @@ CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info, ...)
va_list arg;
long *param_longp = NULL;
double *param_doublep = NULL;
+ curl_off_t *param_offt = NULL;
const char **param_charp = NULL;
struct curl_slist **param_slistp = NULL;
curl_socket_t *param_socketp = NULL;
@@ -422,6 +456,11 @@ CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info, ...)
if(param_doublep)
result = getinfo_double(data, info, param_doublep);
break;
+ case CURLINFO_OFF_T:
+ param_offt = va_arg(arg, curl_off_t *);
+ if(param_offt)
+ result = getinfo_offt(data, info, param_offt);
+ break;
case CURLINFO_SLIST:
param_slistp = va_arg(arg, struct curl_slist **);
if(param_slistp)
diff --git a/lib/gopher.c b/lib/gopher.c
index a073d0ba..836f7255 100644
--- a/lib/gopher.c
+++ b/lib/gopher.c
@@ -65,6 +65,7 @@ const struct Curl_handler Curl_handler_gopher = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_GOPHER, /* defport */
CURLPROTO_GOPHER, /* protocol */
PROTOPT_NONE /* flags */
@@ -78,7 +79,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
curl_off_t *bytecount = &data->req.bytecount;
char *path = data->state.path;
- char *sel;
+ char *sel = NULL;
char *sel_org = NULL;
ssize_t amount, k;
size_t len;
@@ -106,8 +107,8 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
/* ... and finally unescape */
result = Curl_urldecode(data, newp, 0, &sel, &len, FALSE);
- if(!sel)
- return CURLE_OUT_OF_MEMORY;
+ if(result)
+ return result;
sel_org = sel;
}
diff --git a/lib/hash.c b/lib/hash.c
index 06550423..6afeaa12 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -37,8 +37,6 @@ hash_element_dtor(void *user, void *element)
struct curl_hash *h = (struct curl_hash *) user;
struct curl_hash_element *e = (struct curl_hash_element *) element;
- Curl_safefree(e->key);
-
if(e->ptr) {
h->dtor(e->ptr);
e->ptr = NULL;
@@ -74,54 +72,32 @@ Curl_hash_init(struct curl_hash *h,
h->size = 0;
h->slots = slots;
- h->table = malloc(slots * sizeof(struct curl_llist *));
+ h->table = malloc(slots * sizeof(struct curl_llist));
if(h->table) {
- for(i = 0; i < slots; ++i) {
- h->table[i] = Curl_llist_alloc((curl_llist_dtor) hash_element_dtor);
- if(!h->table[i]) {
- while(i--) {
- Curl_llist_destroy(h->table[i], NULL);
- h->table[i] = NULL;
- }
- free(h->table);
- h->table = NULL;
- h->slots = 0;
- return 1; /* failure */
- }
- }
+ for(i = 0; i < slots; ++i)
+ Curl_llist_init(&h->table[i], (curl_llist_dtor) hash_element_dtor);
return 0; /* fine */
}
- else {
- h->slots = 0;
- return 1; /* failure */
- }
+ h->slots = 0;
+ return 1; /* failure */
}
static struct curl_hash_element *
mk_hash_element(const void *key, size_t key_len, const void *p)
{
- struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element));
-
+ /* allocate the struct plus memory after it to store the key */
+ struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element) +
+ key_len);
if(he) {
- void *dupkey = malloc(key_len);
- if(dupkey) {
- /* copy the key */
- memcpy(dupkey, key, key_len);
-
- he->key = dupkey;
- he->key_len = key_len;
- he->ptr = (void *) p;
- }
- else {
- /* failed to duplicate the key, free memory and fail */
- free(he);
- he = NULL;
- }
+ /* copy the key */
+ memcpy(he->key, key, key_len);
+ he->key_len = key_len;
+ he->ptr = (void *) p;
}
return he;
}
-#define FETCH_LIST(x,y,z) x->table[x->hash_func(y, z, x->slots)]
+#define FETCH_LIST(x,y,z) &x->table[x->hash_func(y, z, x->slots)]
/* Insert the data in the hash. If there already was a match in the hash,
* that data is replaced.
@@ -148,18 +124,9 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
he = mk_hash_element(key, key_len, p);
if(he) {
- if(Curl_llist_insert_next(l, l->tail, he)) {
- ++h->size;
- return p; /* return the new entry */
- }
- /*
- * Couldn't insert it, destroy the 'he' element and the key again. We
- * don't call hash_element_dtor() since that would also call the
- * "destructor" for the actual data 'p'. When we fail, we shall not touch
- * that data.
- */
- free(he->key);
- free(he);
+ Curl_llist_insert_next(l, l->tail, he, &he->list);
+ ++h->size;
+ return p; /* return the new entry */
}
return NULL; /* failure */
@@ -243,8 +210,7 @@ Curl_hash_destroy(struct curl_hash *h)
int i;
for(i = 0; i < h->slots; ++i) {
- Curl_llist_destroy(h->table[i], (void *) h);
- h->table[i] = NULL;
+ Curl_llist_destroy(&h->table[i], (void *) h);
}
Curl_safefree(h->table);
@@ -276,7 +242,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
return;
for(i = 0; i < h->slots; ++i) {
- list = h->table[i];
+ list = &h->table[i];
le = list->head; /* get first list entry */
while(le) {
struct curl_hash_element *he = le->ptr;
@@ -335,8 +301,8 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
/* If we have reached the end of the list, find the next one */
if(!iter->current_element) {
for(i = iter->slot_index;i < h->slots;i++) {
- if(h->table[i]->head) {
- iter->current_element = h->table[i]->head;
+ if(h->table[i].head) {
+ iter->current_element = h->table[i].head;
iter->slot_index = i+1;
break;
}
@@ -347,10 +313,8 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
struct curl_hash_element *he = iter->current_element->ptr;
return he;
}
- else {
- iter->current_element = NULL;
- return NULL;
- }
+ iter->current_element = NULL;
+ return NULL;
}
#if 0 /* useful function for debugging hashes and their contents */
diff --git a/lib/hash.h b/lib/hash.h
index a5a6cac7..90a25d1c 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -44,7 +44,7 @@ typedef size_t (*comp_function) (void *key1,
typedef void (*curl_hash_dtor)(void *);
struct curl_hash {
- struct curl_llist **table;
+ struct curl_llist *table;
/* Hash function to be used for this hash table */
hash_function hash_func;
@@ -57,9 +57,10 @@ struct curl_hash {
};
struct curl_hash_element {
+ struct curl_llist_element list;
void *ptr;
- char *key;
size_t key_len;
+ char key[1]; /* allocated memory following the struct */
};
struct curl_hash_iterator {
diff --git a/lib/hostcheck.c b/lib/hostcheck.c
index cbd08936..156091ca 100644
--- a/lib/hostcheck.c
+++ b/lib/hostcheck.c
@@ -87,7 +87,7 @@ static int hostmatch(char *hostname, char *pattern)
if(Curl_inet_pton(AF_INET, hostname, &ignored) > 0)
return CURL_HOST_NOMATCH;
#ifdef ENABLE_IPV6
- else if(Curl_inet_pton(AF_INET6, hostname, &si6.sin6_addr) > 0)
+ if(Curl_inet_pton(AF_INET6, hostname, &si6.sin6_addr) > 0)
return CURL_HOST_NOMATCH;
#endif
diff --git a/lib/hostip.c b/lib/hostip.c
index fa4bad98..619ec84b 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -143,7 +143,7 @@ void Curl_global_host_cache_dtor(void)
}
/*
- * Return # of adresses in a Curl_addrinfo struct
+ * Return # of addresses in a Curl_addrinfo struct
*/
int Curl_num_addresses(const Curl_addrinfo *addr)
{
@@ -538,7 +538,6 @@ RETSIGTYPE alarmfunc(int sig)
/* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */
(void)sig;
siglongjmp(curl_jmpenv, 1);
- return;
}
#endif /* USE_ALARM_TIMEOUT */
@@ -573,7 +572,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
struct sigaction keep_sigact; /* store the old struct here */
- volatile bool keep_copysig = FALSE; /* wether old sigact has been saved */
+ volatile bool keep_copysig = FALSE; /* whether old sigact has been saved */
struct sigaction sigact;
#else
#ifdef HAVE_SIGNAL
@@ -597,7 +596,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
/* Ignore the timeout when signals are disabled */
timeout = 0;
else
- timeout = timeoutms;
+ timeout = (timeoutms > LONG_MAX) ? LONG_MAX : (long)timeoutms;
if(!timeout)
/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */
@@ -689,10 +688,11 @@ clean_up:
the time we spent until now! */
if(prev_alarm) {
/* there was an alarm() set before us, now put it back */
- unsigned long elapsed_ms = Curl_tvdiff(Curl_tvnow(), conn->created);
+ unsigned long elapsed_secs = (unsigned long) (Curl_tvdiff(Curl_tvnow(),
+ conn->created) / 1000);
/* the alarm period is counted in even number of seconds */
- unsigned long alarm_set = prev_alarm - elapsed_ms/1000;
+ unsigned long alarm_set = prev_alarm - elapsed_secs;
if(!alarm_set ||
((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
diff --git a/lib/hostip.h b/lib/hostip.h
index 1dc4079f..298eeeee 100644
--- a/lib/hostip.h
+++ b/lib/hostip.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -130,7 +130,7 @@ int Curl_mk_dnscache(struct curl_hash *hash);
/* prune old entries from the DNS cache */
void Curl_hostcache_prune(struct Curl_easy *data);
-/* Return # of adresses in a Curl_addrinfo struct */
+/* Return # of addresses in a Curl_addrinfo struct */
int Curl_num_addresses(const Curl_addrinfo *addr);
#if defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO)
diff --git a/lib/http.c b/lib/http.c
index 4c1c07fe..d66b8482 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -119,6 +119,7 @@ const struct Curl_handler Curl_handler_http = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
PROTOPT_CREDSPERREQUEST /* flags */
@@ -143,6 +144,7 @@ const struct Curl_handler Curl_handler_https = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_HTTPS, /* defport */
CURLPROTO_HTTPS, /* protocol */
PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN /* flags */
@@ -285,6 +287,7 @@ static CURLcode http_output_basic(struct connectdata *conn, bool proxy)
const char *user;
const char *pwd;
CURLcode result;
+ char *out;
if(proxy) {
userp = &conn->allocptr.proxyuserpwd;
@@ -297,26 +300,32 @@ static CURLcode http_output_basic(struct connectdata *conn, bool proxy)
pwd = conn->passwd;
}
- snprintf(data->state.buffer, sizeof(data->state.buffer), "%s:%s", user, pwd);
+ out = aprintf("%s:%s", user, pwd);
+ if(!out)
+ return CURLE_OUT_OF_MEMORY;
- result = Curl_base64_encode(data,
- data->state.buffer, strlen(data->state.buffer),
- &authorization, &size);
+ result = Curl_base64_encode(data, out, strlen(out), &authorization, &size);
if(result)
- return result;
+ goto fail;
- if(!authorization)
- return CURLE_REMOTE_ACCESS_DENIED;
+ if(!authorization) {
+ result = CURLE_REMOTE_ACCESS_DENIED;
+ goto fail;
+ }
free(*userp);
*userp = aprintf("%sAuthorization: Basic %s\r\n",
proxy ? "Proxy-" : "",
authorization);
free(authorization);
- if(!*userp)
- return CURLE_OUT_OF_MEMORY;
+ if(!*userp) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
- return CURLE_OK;
+ fail:
+ free(out);
+ return result;
}
/* pickoneauth() selects the most favourable authentication method from the
@@ -412,8 +421,6 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
case HTTPREQ_POST:
if(data->state.infilesize != -1)
expectsend = data->state.infilesize;
- else if(data->set.postfields)
- expectsend = (curl_off_t)strlen(data->set.postfields);
break;
case HTTPREQ_PUT:
if(data->state.infilesize != -1)
@@ -644,10 +651,10 @@ output_auth_headers(struct connectdata *conn,
proxy ? "Proxy" : "Server", auth,
proxy ? (conn->http_proxy.user ? conn->http_proxy.user : "") :
(conn->user ? conn->user : ""));
- authstatus->multi = (!authstatus->done) ? TRUE : FALSE;
+ authstatus->multipass = (!authstatus->done) ? TRUE : FALSE;
}
else
- authstatus->multi = FALSE;
+ authstatus->multipass = FALSE;
return CURLE_OK;
}
@@ -1110,7 +1117,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
buffer is using this size.
*/
- sendsize = (size > CURL_MAX_WRITE_SIZE) ? CURL_MAX_WRITE_SIZE : size;
+ sendsize = CURLMIN(size, CURL_MAX_WRITE_SIZE);
/* OpenSSL is very picky and we must send the SAME buffer pointer to the
library when we attempt to re-send this buffer. Sending the same data
@@ -1196,8 +1203,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
This needs FIXing.
*/
return CURLE_SEND_ERROR;
- else
- Curl_pipeline_leave_write(conn);
+ Curl_pipeline_leave_write(conn);
}
}
Curl_add_buffer_free(in);
@@ -1358,14 +1364,18 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
if(result)
return result;
+ if(conn->bits.proxy_connect_closed)
+ /* this is not an error, just part of the connection negotiation */
+ return CURLE_OK;
+
if(CONNECT_FIRSTSOCKET_PROXY_SSL())
return CURLE_OK; /* wait for HTTPS proxy SSL initialization to complete */
- if(conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT)
+ if(!Curl_connect_complete(conn))
/* nothing else to do except wait right now - we're not done here. */
return CURLE_OK;
- if(conn->given->flags & PROTOPT_SSL) {
+ if(conn->given->protocol & CURLPROTO_HTTPS) {
/* perform SSL initialization */
result = https_connecting(conn, done);
if(result)
@@ -1425,7 +1435,10 @@ CURLcode Curl_http_done(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct HTTP *http = data->req.protop;
- infof(data, "Curl_http_done: called premature == %d\n", premature);
+ /* Clear multipass flag. If authentication isn't done yet, then it will get
+ * a chance to be set back to true when we output the next auth header */
+ data->state.authhost.multipass = FALSE;
+ data->state.authproxy.multipass = FALSE;
Curl_unencode_cleanup(conn);
@@ -1511,6 +1524,20 @@ static bool use_http_1_1plus(const struct Curl_easy *data,
(data->set.httpversion >= CURL_HTTP_VERSION_1_1));
}
+static const char *get_http_string(const struct Curl_easy *data,
+ const struct connectdata *conn)
+{
+#ifdef USE_NGHTTP2
+ if(conn->proto.httpc.h2)
+ return "2";
+#endif
+
+ if(use_http_1_1plus(data, conn))
+ return "1.1";
+
+ return "1.0";
+}
+
/* check and possibly add an Expect: header */
static CURLcode expect100(struct Curl_easy *data,
struct connectdata *conn,
@@ -1668,9 +1695,10 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
Curl_send_buffer *req_buffer)
{
const struct tm *tm;
- char *buf = data->state.buffer;
struct tm keeptime;
CURLcode result;
+ char datestr[80];
+ const char *condp;
if(data->set.timecondition == CURL_TIMECOND_NONE)
/* no condition was asked for */
@@ -1683,6 +1711,21 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
}
tm = &keeptime;
+ switch(data->set.timecondition) {
+ default:
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ case CURL_TIMECOND_IFMODSINCE:
+ condp = "If-Modified-Since";
+ break;
+ case CURL_TIMECOND_IFUNMODSINCE:
+ condp = "If-Unmodified-Since";
+ break;
+ case CURL_TIMECOND_LASTMOD:
+ condp = "Last-Modified";
+ break;
+ }
+
/* 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
@@ -1691,8 +1734,9 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
*/
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
- snprintf(buf, BUFSIZE-1,
- "%s, %02d %s %4d %02d:%02d:%02d 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],
@@ -1701,22 +1745,7 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
tm->tm_min,
tm->tm_sec);
- switch(data->set.timecondition) {
- default:
- break;
- case CURL_TIMECOND_IFMODSINCE:
- result = Curl_add_bufferf(req_buffer,
- "If-Modified-Since: %s\r\n", buf);
- break;
- case CURL_TIMECOND_IFUNMODSINCE:
- result = Curl_add_bufferf(req_buffer,
- "If-Unmodified-Since: %s\r\n", buf);
- break;
- case CURL_TIMECOND_LASTMOD:
- result = Curl_add_bufferf(req_buffer,
- "Last-Modified: %s\r\n", buf);
- break;
- }
+ result = Curl_add_buffer(req_buffer, datestr, strlen(datestr));
return result;
}
@@ -1824,6 +1853,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
case HTTPREQ_PUT:
request = "PUT";
break;
+ case HTTPREQ_OPTIONS:
+ request = "OPTIONS";
+ break;
default: /* this should never happen */
case HTTPREQ_GET:
request = "GET";
@@ -1849,7 +1881,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
- if((data->state.authhost.multi || data->state.authproxy.multi) &&
+ if((data->state.authhost.multipass || data->state.authproxy.multipass) &&
(httpreq != HTTPREQ_GET) &&
(httpreq != HTTPREQ_HEAD)) {
/* Auth is required and we are not authenticated yet. Make a PUT or POST
@@ -2134,32 +2166,32 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
if(seekerr != CURL_SEEKFUNC_OK) {
+ curl_off_t passed=0;
+
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
return CURLE_READ_ERROR;
}
/* when seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
- else {
- curl_off_t passed=0;
- do {
- size_t readthisamountnow =
- (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
- BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
-
- size_t actuallyread =
- data->state.fread_func(data->state.buffer, 1, readthisamountnow,
- data->state.in);
-
- passed += actuallyread;
- if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
- /* this checks for greater-than only to make sure that the
- CURL_READFUNC_ABORT return code still aborts */
- failf(data, "Could only read %" CURL_FORMAT_CURL_OFF_T
- " bytes from the input", passed);
- return CURLE_READ_ERROR;
- }
- } while(passed < data->state.resume_from);
- }
+ do {
+ size_t readthisamountnow =
+ (data->state.resume_from - passed > data->set.buffer_size) ?
+ (size_t)data->set.buffer_size :
+ curlx_sotouz(data->state.resume_from - passed);
+
+ size_t actuallyread =
+ data->state.fread_func(data->state.buffer, 1, readthisamountnow,
+ data->state.in);
+
+ passed += actuallyread;
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+ /* this checks for greater-than only to make sure that the
+ CURL_READFUNC_ABORT return code still aborts */
+ failf(data, "Could only read %" CURL_FORMAT_CURL_OFF_T
+ " bytes from the input", passed);
+ return CURLE_READ_ERROR;
+ }
+ } while(passed < data->state.resume_from);
}
/* now, decrease the size of the read */
@@ -2225,9 +2257,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
}
- /* Use 1.1 unless the user specifically asked for 1.0 or the server only
- supports 1.0 */
- httpstring= use_http_1_1plus(data, conn)?"1.1":"1.0";
+ httpstring = get_http_string(data, conn);
/* initialize a dynamic send-buffer */
req_buffer = Curl_add_buffer_init();
@@ -2241,6 +2271,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result)
return result;
+ if(data->set.str[STRING_TARGET])
+ ppath = data->set.str[STRING_TARGET];
+
/* url */
if(paste_ftp_userpwd)
result = Curl_add_bufferf(req_buffer, "ftp://%s:%s@%s",
@@ -2294,20 +2327,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
te
);
- /* clear userpwd to avoid re-using credentials from re-used connections */
+ /* clear userpwd and proxyuserpwd to avoid re-using old credentials
+ * from re-used connections */
Curl_safefree(conn->allocptr.userpwd);
-
- /*
- * Free proxyuserpwd for Negotiate/NTLM. Cannot reuse as it is associated
- * with the connection and shouldn't be repeated over it either.
- */
- switch(data->state.authproxy.picked) {
- case CURLAUTH_NEGOTIATE:
- case CURLAUTH_NTLM:
- case CURLAUTH_NTLM_WB:
- Curl_safefree(conn->allocptr.proxyuserpwd);
- break;
- }
+ Curl_safefree(conn->allocptr.proxyuserpwd);
if(result)
return result;
@@ -2501,7 +2524,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
postsize = data->state.infilesize;
if((postsize != -1) && !data->req.upload_chunky &&
- !Curl_checkheaders(conn, "Content-Length:")) {
+ (conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length:"))) {
/* only add Content-Length if not uploading chunked */
result = Curl_add_bufferf(req_buffer,
"Content-Length: %" CURL_FORMAT_CURL_OFF_T
@@ -2542,18 +2565,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(conn->bits.authneg)
postsize = 0;
- else {
- /* figure out the size of the postfields */
- postsize = (data->state.infilesize != -1)?
- data->state.infilesize:
- (data->set.postfields? (curl_off_t)strlen(data->set.postfields):-1);
- }
+ else
+ /* the size of the post body */
+ postsize = data->state.infilesize;
/* 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
kinds of headers (Transfer-Encoding: chunked and Content-Length) */
if((postsize != -1) && !data->req.upload_chunky &&
- !Curl_checkheaders(conn, "Content-Length:")) {
+ (conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length:"))) {
/* we allow replacing this header if not during auth negotiation,
although it isn't very wise to actually set your own */
result = Curl_add_bufferf(req_buffer,
@@ -2580,7 +2600,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
data->state.expect100header =
Curl_compareheader(ptr, "Expect:", "100-continue");
}
- else if(postsize > TINY_INITIAL_POST_SIZE || postsize < 0) {
+ else if(postsize > EXPECT_100_THRESHOLD || postsize < 0) {
result = expect100(data, conn, req_buffer);
if(result)
return result;
@@ -2729,6 +2749,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
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);
}
}
@@ -2807,8 +2828,7 @@ checkrtspprefix(struct Curl_easy *data,
#endif /* CURL_DOES_CONVERSIONS */
if(checkprefix("RTSP/", s))
return TRUE;
- else
- return FALSE;
+ return FALSE;
}
#endif /* CURL_DISABLE_RTSP */
@@ -3026,6 +3046,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(k->exp100 > EXP100_SEND_DATA) {
k->exp100 = EXP100_SEND_DATA;
k->keepon |= KEEP_SEND;
+ Curl_expire_done(data, EXPIRE_100_TIMEOUT);
}
break;
case 101:
@@ -3152,6 +3173,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* request body has been sent we stop sending and mark the
* connection for closure after we've read the entire response.
*/
+ Curl_expire_done(data, EXPIRE_100_TIMEOUT);
if(!k->upload_done) {
if(data->set.http_keep_sending_on_error) {
infof(data, "HTTP error before end of send, keep sending\n");
@@ -3229,9 +3251,17 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
k->maxdownload = k->size;
}
- /* If max download size is *zero* (nothing) we already
- have nothing and can safely return ok now! */
- if(0 == k->maxdownload)
+ /* If max download size is *zero* (nothing) we already have
+ nothing and can safely return ok now! But for HTTP/2, we'd
+ like to call http2_handle_stream_close to properly close a
+ stream. In order to do this, we keep reading until we
+ close the stream. */
+ if(0 == k->maxdownload
+#if defined(USE_NGHTTP2)
+ && !((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
+ conn->httpversion == 20)
+#endif
+ )
*stop_reading = TRUE;
if(*stop_reading) {
@@ -3288,23 +3318,26 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/*
* https://tools.ietf.org/html/rfc7230#section-3.1.2
*
- * The reponse code is always a three-digit number in HTTP as the spec
+ * The response code is always a three-digit number in HTTP as the spec
* says. We try to allow any number here, but we cannot make
* guarantees on future behaviors since it isn't within the protocol.
*/
+ char separator;
nc = sscanf(HEADER1,
- " HTTP/%d.%d %d",
+ " HTTP/%1d.%1d%c%3d",
&httpversion_major,
&conn->httpversion,
+ &separator,
&k->httpcode);
if(nc == 1 && httpversion_major == 2 &&
1 == sscanf(HEADER1, " HTTP/2 %d", &k->httpcode)) {
conn->httpversion = 0;
- nc = 3;
+ nc = 4;
+ separator = ' ';
}
- if(nc==3) {
+ if((nc==4) && (' ' == separator)) {
conn->httpversion += 10 * httpversion_major;
if(k->upgr101 == UPGR101_RECEIVED) {
@@ -3313,7 +3346,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
infof(data, "Lying server, not serving HTTP/2\n");
}
}
- else {
+ else if(!nc) {
/* this is the real world, not a Nirvana
NCSA 1.5.x returns this crap when asked for HTTP/1.1
*/
@@ -3331,6 +3364,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
}
+ else {
+ failf(data, "Unsupported HTTP version in response\n");
+ return CURLE_UNSUPPORTED_PROTOCOL;
+ }
}
else if(conn->handler->protocol & CURLPROTO_RTSP) {
nc = sscanf(HEADER1,
diff --git a/lib/http.h b/lib/http.h
index 9fb669c9..a845f564 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -115,8 +115,13 @@ CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
#define MAX_INITIAL_POST_SIZE (64*1024)
#endif
-#ifndef TINY_INITIAL_POST_SIZE
-#define TINY_INITIAL_POST_SIZE 1024
+/* EXPECT_100_THRESHOLD is the request body size limit for when libcurl will
+ * automatically add an "Expect: 100-continue" header in HTTP requests. When
+ * the size is unknown, it will always add it.
+ *
+ */
+#ifndef EXPECT_100_THRESHOLD
+#define EXPECT_100_THRESHOLD 1024
#endif
#endif /* CURL_DISABLE_HTTP */
@@ -219,6 +224,10 @@ struct http_conn {
/* this is a hash of all individual streams (Curl_easy structs) */
struct h2settings settings;
+
+ /* list of settings that will be sent */
+ nghttp2_settings_entry local_settings[3];
+ size_t local_settings_num;
#else
int unused; /* prevent a compiler warning */
#endif
diff --git a/lib/http2.c b/lib/http2.c
index 4cc17ba2..0e558013 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -28,6 +28,7 @@
#include "http2.h"
#include "http.h"
#include "sendf.h"
+#include "select.h"
#include "curl_base64.h"
#include "strcase.h"
#include "multiif.h"
@@ -116,18 +117,11 @@ static int http2_getsock(struct connectdata *conn,
return http2_perform_getsock(conn, sock, numsocks);
}
-static CURLcode http2_disconnect(struct connectdata *conn,
- bool dead_connection)
+/*
+ * http2_stream_free() free HTTP2 stream related data
+ */
+static void http2_stream_free(struct HTTP *http)
{
- struct HTTP *http = conn->data->req.protop;
- struct http_conn *c = &conn->proto.httpc;
- (void)dead_connection;
-
- DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT starts now\n"));
-
- nghttp2_session_del(c->h2);
- Curl_safefree(c->inbuf);
-
if(http) {
Curl_add_buffer_free(http->header_recvbuf);
http->header_recvbuf = NULL; /* clear the pointer */
@@ -139,12 +133,68 @@ static CURLcode http2_disconnect(struct connectdata *conn,
free(http->push_headers);
http->push_headers = NULL;
}
+}
+
+static CURLcode http2_disconnect(struct connectdata *conn,
+ bool dead_connection)
+{
+ struct http_conn *c = &conn->proto.httpc;
+ (void)dead_connection;
+
+ DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT starts now\n"));
+
+ nghttp2_session_del(c->h2);
+ Curl_safefree(c->inbuf);
+ http2_stream_free(conn->data->req.protop);
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n"));
return CURLE_OK;
}
+/*
+ * The server may send us data at any point (e.g. PING frames). Therefore,
+ * we cannot assume that an HTTP/2 socket is dead just because it is readable.
+ *
+ * Instead, if it is readable, run Curl_connalive() to peek at the socket
+ * and distinguish between closed and data.
+ */
+static bool http2_connisdead(struct connectdata *check)
+{
+ int sval;
+ bool ret_val = TRUE;
+
+ sval = SOCKET_READABLE(check->sock[FIRSTSOCKET], 0);
+ if(sval == 0) {
+ /* timeout */
+ ret_val = FALSE;
+ }
+ else if(sval & CURL_CSELECT_ERR) {
+ /* socket is in an error state */
+ ret_val = TRUE;
+ }
+ else if(sval & CURL_CSELECT_IN) {
+ /* readable with no error. could still be closed */
+ ret_val = !Curl_connalive(check);
+ }
+
+ return ret_val;
+}
+
+
+static unsigned int http2_conncheck(struct connectdata *check,
+ unsigned int checks_to_perform)
+{
+ unsigned int ret_val = CONNRESULT_NONE;
+
+ if(checks_to_perform & CONNCHECK_ISDEAD) {
+ if(http2_connisdead(check))
+ ret_val |= CONNRESULT_DEAD;
+ }
+
+ return ret_val;
+}
+
/* called from Curl_http_setup_conn */
void Curl_http2_setup_req(struct Curl_easy *data)
{
@@ -159,7 +209,7 @@ void Curl_http2_setup_req(struct Curl_easy *data)
http->closed = FALSE;
http->close_handled = FALSE;
http->mem = data->state.buffer;
- http->len = BUFSIZE;
+ http->len = data->set.buffer_size;
http->memlen = 0;
}
@@ -175,7 +225,7 @@ void Curl_http2_setup_conn(struct connectdata *conn)
* but will be used at run-time when the protocol is dynamically switched from
* HTTP to HTTP2.
*/
-const struct Curl_handler Curl_handler_http2 = {
+static const struct Curl_handler Curl_handler_http2 = {
"HTTP", /* scheme */
ZERO_NULL, /* setup_connection */
Curl_http, /* do_it */
@@ -190,12 +240,13 @@ const struct Curl_handler Curl_handler_http2 = {
http2_perform_getsock, /* perform_getsock */
http2_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
PROTOPT_STREAM /* flags */
};
-const struct Curl_handler Curl_handler_http2_ssl = {
+static const struct Curl_handler Curl_handler_http2_ssl = {
"HTTPS", /* scheme */
ZERO_NULL, /* setup_connection */
Curl_http, /* do_it */
@@ -210,6 +261,7 @@ const struct Curl_handler Curl_handler_http2_ssl = {
http2_perform_getsock, /* perform_getsock */
http2_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
@@ -402,6 +454,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);
rv = 1;
goto fail;
}
@@ -415,9 +468,11 @@ static int push_promise(struct Curl_easy *data,
free(stream->push_headers[i]);
free(stream->push_headers);
stream->push_headers = NULL;
+ stream->push_headers_used = 0;
if(rv) {
/* denied, kill off the new handle again */
+ http2_stream_free(newhandle->req.protop);
(void)Curl_close(newhandle);
goto fail;
}
@@ -432,6 +487,7 @@ static int push_promise(struct Curl_easy *data,
rc = Curl_multi_add_perform(data->multi, newhandle, conn);
if(rc) {
infof(data, "failed to add handle to multi\n");
+ http2_stream_free(newhandle->req.protop);
Curl_close(newhandle);
rv = 1;
goto fail;
@@ -559,7 +615,7 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
/* if we receive data for another handle, wake that up */
if(conn_s->data != data_s)
- Curl_expire(data_s, 0);
+ Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
}
break;
case NGHTTP2_PUSH_PROMISE:
@@ -587,6 +643,9 @@ static int on_invalid_frame_recv(nghttp2_session *session,
{
struct Curl_easy *data_s = NULL;
(void)userp;
+#if !defined(DEBUGBUILD) || defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void)lib_error_code;
+#endif
data_s = nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
if(data_s) {
@@ -633,7 +692,7 @@ static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags,
/* if we receive data for another handle, wake that up */
if(conn->data != data_s)
- Curl_expire(data_s, 0);
+ Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
DEBUGF(infof(data_s, "%zu data received for stream %u "
"(%zu left in buffer %p, total %zu)\n",
@@ -697,6 +756,9 @@ static int on_frame_not_send(nghttp2_session *session,
{
struct Curl_easy *data_s;
(void)userp;
+#if !defined(DEBUGBUILD) || defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void)lib_error_code;
+#endif
data_s = nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
if(data_s) {
@@ -768,7 +830,7 @@ static int on_begin_headers(nghttp2_session *session,
/* This is trailer HEADERS started. Allocate buffer for them. */
DEBUGF(infof(data_s, "trailer field started\n"));
- assert(stream->trailer_recvbuf == NULL);
+ DEBUGASSERT(stream->trailer_recvbuf == NULL);
stream->trailer_recvbuf = Curl_add_buffer_init();
if(!stream->trailer_recvbuf) {
@@ -893,7 +955,7 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
Curl_add_buffer(stream->header_recvbuf, " \r\n", 3);
/* if we receive data for another handle, wake that up */
if(conn->data != data_s)
- Curl_expire(data_s, 0);
+ Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
DEBUGF(infof(data_s, "h2 status: HTTP/2 %03d (easy %p)\n",
stream->status_code, data_s));
@@ -909,7 +971,7 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
Curl_add_buffer(stream->header_recvbuf, "\r\n", 2);
/* if we receive data for another handle, wake that up */
if(conn->data != data_s)
- Curl_expire(data_s, 0);
+ Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
DEBUGF(infof(data_s, "h2 header: %.*s: %.*s\n", namelen, name, valuelen,
value));
@@ -967,14 +1029,6 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
return nread;
}
-/*
- * The HTTP2 settings we send in the Upgrade request
- */
-static nghttp2_settings_entry settings[] = {
- { NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 },
- { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, HTTP2_HUGE_WINDOW_SIZE },
-};
-
#define H2_BUFSIZE 32768
#ifdef NGHTTP2_HAS_ERROR_CALLBACK
@@ -990,6 +1044,23 @@ static int error_callback(nghttp2_session *session,
}
#endif
+static void populate_settings(struct connectdata *conn,
+ struct http_conn *httpc)
+{
+ nghttp2_settings_entry *iv = httpc->local_settings;
+
+ iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
+ iv[0].value = 100;
+
+ iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
+ iv[1].value = HTTP2_HUGE_WINDOW_SIZE;
+
+ iv[2].settings_id = NGHTTP2_SETTINGS_ENABLE_PUSH;
+ iv[2].value = conn->data->multi->push_cb != NULL;
+
+ httpc->local_settings_num = 3;
+}
+
void Curl_http2_done(struct connectdata *conn, bool premature)
{
struct Curl_easy *data = conn->data;
@@ -1103,16 +1174,14 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
size_t blen;
struct SingleRequest *k = &conn->data->req;
uint8_t *binsettings = conn->proto.httpc.binsettings;
+ struct http_conn *httpc = &conn->proto.httpc;
- /* As long as we have a fixed set of settings, we don't have to dynamically
- * figure out the base64 strings since it'll always be the same. However,
- * the settings will likely not be fixed every time in the future.
- */
+ populate_settings(conn, httpc);
/* this returns number of bytes it wrote */
binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN,
- settings,
- sizeof(settings)/sizeof(settings[0]));
+ httpc->local_settings,
+ httpc->local_settings_num);
if(!binlen) {
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
return CURLE_FAILED_INIT;
@@ -1430,7 +1499,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
infof(data, "%zu data bytes written\n", nread);
if(stream->pauselen == 0) {
DEBUGF(infof(data, "Unpaused by stream %u\n", stream->stream_id));
- assert(httpc->pause_stream_id == stream->stream_id);
+ DEBUGASSERT(httpc->pause_stream_id == stream->stream_id);
httpc->pause_stream_id = 0;
stream->pausedata = NULL;
@@ -1862,28 +1931,22 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
/* Warn stream may be rejected if cumulative length of headers is too large.
It appears nghttp2 will not send a header frame larger than 64KB. */
+#define MAX_ACC 60000 /* <64KB to account for some overhead */
{
size_t acc = 0;
- const size_t max_acc = 60000; /* <64KB to account for some overhead */
for(i = 0; i < nheader; ++i) {
- if(nva[i].namelen > max_acc - acc)
- break;
- acc += nva[i].namelen;
-
- if(nva[i].valuelen > max_acc - acc)
- break;
- acc += nva[i].valuelen;
+ acc += nva[i].namelen + nva[i].valuelen;
DEBUGF(infof(conn->data, "h2 header: %.*s:%.*s\n",
nva[i].namelen, nva[i].name,
nva[i].valuelen, nva[i].value));
}
- if(i != nheader) {
+ if(acc > MAX_ACC) {
infof(conn->data, "http2_send: Warning: The cumulative length of all "
- "headers exceeds %zu bytes and that could cause the "
- "stream to be rejected.\n", max_acc);
+ "headers exceeds %zu bytes and that could cause the "
+ "stream to be rejected.\n", MAX_ACC);
}
}
@@ -2037,10 +2100,13 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
conn->data);
}
else {
+ populate_settings(conn, httpc);
+
/* stream ID is unknown at this point */
stream->stream_id = -1;
- rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, settings,
- sizeof(settings) / sizeof(settings[0]));
+ rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE,
+ httpc->local_settings,
+ httpc->local_settings_num);
if(rv != 0) {
failf(data, "nghttp2_submit_settings() failed: %s(%d)",
nghttp2_strerror(rv), rv);
@@ -2114,40 +2180,46 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
return CURLE_OK;
}
-void Curl_http2_add_child(struct Curl_easy *parent, struct Curl_easy *child,
- bool exclusive)
+CURLcode Curl_http2_add_child(struct Curl_easy *parent,
+ struct Curl_easy *child,
+ bool exclusive)
{
- struct Curl_http2_dep **tail;
- struct Curl_http2_dep *dep = calloc(1, sizeof(struct Curl_http2_dep));
- dep->data = child;
-
- if(parent->set.stream_dependents && exclusive) {
- struct Curl_http2_dep *node = parent->set.stream_dependents;
- while(node) {
- node->data->set.stream_depends_on = child;
- node = node->next;
+ if(parent) {
+ struct Curl_http2_dep **tail;
+ struct Curl_http2_dep *dep = calloc(1, sizeof(struct Curl_http2_dep));
+ if(!dep)
+ return CURLE_OUT_OF_MEMORY;
+ dep->data = child;
+
+ if(parent->set.stream_dependents && exclusive) {
+ struct Curl_http2_dep *node = parent->set.stream_dependents;
+ while(node) {
+ node->data->set.stream_depends_on = child;
+ node = node->next;
+ }
+
+ tail = &child->set.stream_dependents;
+ while(*tail)
+ tail = &(*tail)->next;
+
+ DEBUGASSERT(!*tail);
+ *tail = parent->set.stream_dependents;
+ parent->set.stream_dependents = 0;
}
- tail = &child->set.stream_dependents;
- while(*tail)
+ tail = &parent->set.stream_dependents;
+ while(*tail) {
+ (*tail)->data->set.stream_depends_e = FALSE;
tail = &(*tail)->next;
+ }
DEBUGASSERT(!*tail);
- *tail = parent->set.stream_dependents;
- parent->set.stream_dependents = 0;
+ *tail = dep;
}
- tail = &parent->set.stream_dependents;
- while(*tail) {
- (*tail)->data->set.stream_depends_e = FALSE;
- tail = &(*tail)->next;
- }
-
- DEBUGASSERT(!*tail);
- *tail = dep;
-
child->set.stream_depends_on = parent;
child->set.stream_depends_e = exclusive;
+ return CURLE_OK;
}
void Curl_http2_remove_child(struct Curl_easy *parent, struct Curl_easy *child)
diff --git a/lib/http2.h b/lib/http2.h
index f405b3ae..f597c805 100644
--- a/lib/http2.h
+++ b/lib/http2.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -53,8 +53,9 @@ 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);
CURLcode Curl_http2_done_sending(struct connectdata *conn);
-void Curl_http2_add_child(struct Curl_easy *parent, struct Curl_easy *child,
- bool exclusive);
+CURLcode Curl_http2_add_child(struct Curl_easy *parent,
+ struct Curl_easy *child,
+ bool exclusive);
void Curl_http2_remove_child(struct Curl_easy *parent,
struct Curl_easy *child);
void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c
index 21c77cd6..8a78bd29 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -27,7 +27,7 @@
/*
* NTLM details:
*
- * http://davenport.sourceforge.net/ntlm.html
+ * https://davenport.sourceforge.io/ntlm.html
* https://www.innovation.ch/java/ntlm.html
*/
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index e0213f34..36567d36 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,11 +22,11 @@
#include "curl_setup.h"
+#include "http_proxy.h"
+
#if !defined(CURL_DISABLE_PROXY) && !defined(CURL_DISABLE_HTTP)
-#include "urldata.h"
#include <curl/curl.h>
-#include "http_proxy.h"
#include "sendf.h"
#include "http.h"
#include "url.h"
@@ -98,16 +98,21 @@ CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
* original pointer
*
* This function might be called several times in the multi interface case
- * if the proxy's CONNTECT response is not instant.
+ * if the proxy's CONNECT response is not instant.
*/
prot_save = conn->data->req.protop;
memset(&http_proxy, 0, sizeof(http_proxy));
conn->data->req.protop = &http_proxy;
connkeep(conn, "HTTP proxy CONNECT");
- if(sockindex == SECONDARYSOCKET)
- hostname = conn->secondaryhostname;
- else if(conn->bits.conn_to_host)
+
+ /* for the secondary socket (FTP), use the "connect to host"
+ * but ignore the "connect to port" (use the secondary port)
+ */
+
+ if(conn->bits.conn_to_host)
hostname = conn->conn_to_host.name;
+ else if(sockindex == SECONDARYSOCKET)
+ hostname = conn->secondaryhostname;
else
hostname = conn->host.name;
@@ -117,8 +122,7 @@ CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
remote_port = conn->conn_to_port;
else
remote_port = conn->remote_port;
- result = Curl_proxyCONNECT(conn, sockindex, hostname,
- remote_port, FALSE);
+ result = Curl_proxyCONNECT(conn, sockindex, hostname, remote_port);
conn->data->req.protop = prot_save;
if(CURLE_OK != result)
return result;
@@ -131,43 +135,73 @@ CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
return CURLE_OK;
}
-/*
- * Curl_proxyCONNECT() requires that we're connected to a HTTP proxy. This
- * function will issue the necessary commands to get a seamless tunnel through
- * this proxy. After that, the socket can be used just as a normal socket.
- *
- * 'blocking' set to TRUE means that this function will do the entire CONNECT
- * + response in a blocking fashion. Should be avoided!
- */
+bool Curl_connect_complete(struct connectdata *conn)
+{
+ return conn->connect_state &&
+ (conn->connect_state->tunnel_state == TUNNEL_COMPLETE);
+}
-CURLcode Curl_proxyCONNECT(struct connectdata *conn,
- int sockindex,
- const char *hostname,
- int remote_port,
- bool blocking)
+bool Curl_connect_ongoing(struct connectdata *conn)
+{
+ return conn->connect_state &&
+ (conn->connect_state->tunnel_state != TUNNEL_COMPLETE);
+}
+
+static CURLcode connect_init(struct connectdata *conn, bool reinit)
+{
+ struct http_connect_state *s;
+ if(!reinit) {
+ DEBUGASSERT(!conn->connect_state);
+ s = calloc(1, sizeof(struct http_connect_state));
+ if(!s)
+ return CURLE_OUT_OF_MEMORY;
+ infof(conn->data, "allocate connect buffer!\n");
+ conn->connect_state = s;
+ }
+ else {
+ DEBUGASSERT(conn->connect_state);
+ s = conn->connect_state;
+ }
+ s->tunnel_state = TUNNEL_INIT;
+ s->keepon=TRUE;
+ s->line_start = s->connect_buffer;
+ s->ptr = s->line_start;
+ s->cl=0;
+ return CURLE_OK;
+}
+
+static void connect_done(struct connectdata *conn)
+{
+ struct http_connect_state *s = conn->connect_state;
+ s->tunnel_state = TUNNEL_COMPLETE;
+ infof(conn->data, "CONNECT phase completed!\n");
+}
+
+static CURLcode CONNECT(struct connectdata *conn,
+ int sockindex,
+ const char *hostname,
+ int remote_port)
{
int subversion=0;
struct Curl_easy *data=conn->data;
struct SingleRequest *k = &data->req;
CURLcode result;
curl_socket_t tunnelsocket = conn->sock[sockindex];
- curl_off_t cl=0;
bool closeConnection = FALSE;
- bool chunked_encoding = FALSE;
time_t check;
+ struct http_connect_state *s = conn->connect_state;
#define SELECT_OK 0
#define SELECT_ERROR 1
#define SELECT_TIMEOUT 2
- int error = SELECT_OK;
- if(conn->tunnel_state[sockindex] == TUNNEL_COMPLETE)
+ if(Curl_connect_complete(conn))
return CURLE_OK; /* CONNECT is already completed */
conn->bits.proxy_connect_closed = FALSE;
do {
- if(TUNNEL_INIT == conn->tunnel_state[sockindex]) {
+ if(TUNNEL_INIT == s->tunnel_state) {
/* BEGIN CONNECT PHASE */
char *host_port;
Curl_send_buffer *req_buffer;
@@ -199,7 +233,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
free(host_port);
if(!result) {
- char *host=(char *)"";
+ char *host = NULL;
const char *proxyconn="";
const char *useragent="";
const char *http = (conn->http_proxy.proxytype == CURLPROXY_HTTP_1_0) ?
@@ -242,13 +276,13 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
"%s", /* Proxy-Connection */
hostheader,
http,
- host,
+ host?host:"",
conn->allocptr.proxyuserpwd?
conn->allocptr.proxyuserpwd:"",
useragent,
proxyconn);
- if(host && *host)
+ if(host)
free(host);
free(hostheader);
@@ -275,72 +309,46 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
if(result)
return result;
- conn->tunnel_state[sockindex] = TUNNEL_CONNECT;
+ s->tunnel_state = TUNNEL_CONNECT;
+ s->perline = 0;
} /* END CONNECT PHASE */
check = Curl_timeleft(data, NULL, TRUE);
if(check <= 0) {
failf(data, "Proxy CONNECT aborted due to timeout");
- return CURLE_RECV_ERROR;
+ return CURLE_OPERATION_TIMEDOUT;
}
- if(!blocking) {
- if(!Curl_conn_data_pending(conn, sockindex))
- /* return so we'll be called again polling-style */
- return CURLE_OK;
- else {
- DEBUGF(infof(data,
- "Read response immediately from proxy CONNECT\n"));
- }
- }
+ if(!Curl_conn_data_pending(conn, sockindex))
+ /* return so we'll be called again polling-style */
+ return CURLE_OK;
/* at this point, the tunnel_connecting phase is over. */
{ /* READING RESPONSE PHASE */
- size_t nread; /* total size read */
- int perline; /* count bytes per line */
- int keepon=TRUE;
- ssize_t gotbytes;
- char *ptr;
- char *line_start;
+ int error = SELECT_OK;
- ptr = data->state.buffer;
- line_start = ptr;
+ while(s->keepon && !error) {
+ ssize_t gotbytes;
- nread = 0;
- perline = 0;
-
- while(nread < BUFSIZE && keepon && !error) {
- int writetype;
-
- if(Curl_pgrsUpdate(conn))
- return CURLE_ABORTED_BY_CALLBACK;
-
- if(ptr >= &data->state.buffer[BUFSIZE]) {
+ /* make sure we have space to read more data */
+ if(s->ptr >= &s->connect_buffer[CONNECT_BUFFER_SIZE]) {
failf(data, "CONNECT response too large!");
return CURLE_RECV_ERROR;
}
- check = Curl_timeleft(data, NULL, TRUE);
- if(check <= 0) {
- failf(data, "Proxy CONNECT aborted due to timeout");
- error = SELECT_TIMEOUT; /* already too little time */
- break;
- }
-
/* Read one byte at a time to avoid a race condition. Wait at most one
second before looping to ensure continuous pgrsUpdates. */
- result = Curl_read(conn, tunnelsocket, ptr, 1, &gotbytes);
- if(result == CURLE_AGAIN) {
- if(SOCKET_READABLE(tunnelsocket, check<1000L?check:1000) == -1) {
- error = SELECT_ERROR;
- failf(data, "Proxy CONNECT aborted due to select/poll error");
- break;
- }
- continue;
- }
- else if(result) {
- keepon = FALSE;
+ result = Curl_read(conn, tunnelsocket, s->ptr, 1, &gotbytes);
+ if(result == CURLE_AGAIN)
+ /* socket buffer drained, return */
+ return CURLE_OK;
+
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ if(result) {
+ s->keepon = FALSE;
break;
}
else if(gotbytes <= 0) {
@@ -354,24 +362,22 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
error = SELECT_ERROR;
failf(data, "Proxy CONNECT aborted");
}
- keepon = FALSE;
+ s->keepon = FALSE;
break;
}
- /* We got a byte of data */
- nread++;
- if(keepon > TRUE) {
+ if(s->keepon > TRUE) {
/* This means we are currently ignoring a response-body */
- nread = 0; /* make next read start over in the read buffer */
- ptr = data->state.buffer;
- if(cl) {
+ s->ptr = s->connect_buffer;
+ if(s->cl) {
/* A Content-Length based body: simply count down the counter
and make sure to break out of the loop when we're done! */
- cl--;
- if(cl <= 0) {
- keepon = FALSE;
+ s->cl--;
+ if(s->cl <= 0) {
+ s->keepon = FALSE;
+ s->tunnel_state = TUNNEL_COMPLETE;
break;
}
}
@@ -383,23 +389,23 @@ CURLcode Curl_proxyCONNECT(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, ptr, 1, &tookcareof);
+ r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
- keepon = FALSE;
+ s->keepon = FALSE;
/* we did the full CONNECT treatment, go COMPLETE */
- conn->tunnel_state[sockindex] = TUNNEL_COMPLETE;
+ s->tunnel_state = TUNNEL_COMPLETE;
}
}
continue;
}
- perline++; /* amount of bytes in this line so far */
+ s->perline++; /* amount of bytes in this line so far */
/* if this is not the end of a header line then continue */
- if(*ptr != 0x0a) {
- ptr++;
+ if(*s->ptr != 0x0a) {
+ s->ptr++;
continue;
}
@@ -412,42 +418,42 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
/* output debug if that is requested */
if(data->set.verbose)
Curl_debug(data, CURLINFO_HEADER_IN,
- line_start, (size_t)perline, conn);
-
- /* send the header to the callback */
- writetype = CLIENTWRITE_HEADER;
- if(data->set.include_header)
- writetype |= CLIENTWRITE_BODY;
+ s->line_start, (size_t)s->perline, conn);
- result = Curl_client_write(conn, writetype, line_start, perline);
+ if(!data->set.suppress_connect_headers) {
+ /* send the header to the callback */
+ int writetype = CLIENTWRITE_HEADER;
+ if(data->set.include_header)
+ writetype |= CLIENTWRITE_BODY;
- data->info.header_size += (long)perline;
- data->req.headerbytecount += (long)perline;
+ result = Curl_client_write(conn, writetype,
+ s->line_start, s->perline);
+ if(result)
+ return result;
+ }
- if(result)
- return result;
+ data->info.header_size += (long)s->perline;
+ data->req.headerbytecount += (long)s->perline;
/* Newlines are CRLF, so the CR is ignored as the line isn't
really terminated until the LF comes. Treat a following CR
as end-of-headers as well.*/
- if(('\r' == line_start[0]) ||
- ('\n' == line_start[0])) {
+ if(('\r' == s->line_start[0]) ||
+ ('\n' == s->line_start[0])) {
/* end of response-headers from the proxy */
- nread = 0; /* make next read start over in the read
- buffer */
- ptr = data->state.buffer;
+ s->ptr = s->connect_buffer;
if((407 == k->httpcode) && !data->state.authproblem) {
/* If we get a 407 response code with content length
when we have no auth problem, we must ignore the
whole response-body */
- keepon = 2;
+ s->keepon = 2;
- if(cl) {
+ if(s->cl) {
infof(data, "Ignore %" CURL_FORMAT_CURL_OFF_T
- " bytes of response-body\n", cl);
+ " bytes of response-body\n", s->cl);
}
- else if(chunked_encoding) {
+ else if(s->chunked_encoding) {
CHUNKcode r;
infof(data, "Ignore chunked response-body\n");
@@ -458,46 +464,46 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
function returns! */
k->ignorebody = TRUE;
- if(line_start[1] == '\n') {
+ if(s->line_start[1] == '\n') {
/* this can only be a LF if the letter at index 0
was a CR */
- line_start++;
+ s->line_start++;
}
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, line_start + 1, 1, &gotbytes);
+ r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
- keepon = FALSE;
- /* we did the full CONNECT treatment, go to
- COMPLETE */
- conn->tunnel_state[sockindex] = TUNNEL_COMPLETE;
+ s->keepon = FALSE;
+ /* we did the full CONNECT treatment, go to COMPLETE */
+ s->tunnel_state = TUNNEL_COMPLETE;
}
}
else {
/* without content-length or chunked encoding, we
can't keep the connection alive since the close is
the end signal so we bail out at once instead */
- keepon = FALSE;
+ s->keepon = FALSE;
}
}
else
- keepon = FALSE;
- /* we did the full CONNECT treatment, go to COMPLETE */
- conn->tunnel_state[sockindex] = TUNNEL_COMPLETE;
+ s->keepon = FALSE;
+ if(!s->cl)
+ /* we did the full CONNECT treatment, go to COMPLETE */
+ s->tunnel_state = TUNNEL_COMPLETE;
continue;
}
- line_start[perline] = 0; /* zero terminate the buffer */
- if((checkprefix("WWW-Authenticate:", line_start) &&
+ s->line_start[s->perline] = 0; /* zero terminate the buffer */
+ if((checkprefix("WWW-Authenticate:", s->line_start) &&
(401 == k->httpcode)) ||
- (checkprefix("Proxy-authenticate:", line_start) &&
+ (checkprefix("Proxy-authenticate:", s->line_start) &&
(407 == k->httpcode))) {
bool proxy = (k->httpcode == 407) ? TRUE : FALSE;
- char *auth = Curl_copy_header_value(line_start);
+ char *auth = Curl_copy_header_value(s->line_start);
if(!auth)
return CURLE_OUT_OF_MEMORY;
@@ -508,48 +514,50 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
if(result)
return result;
}
- else if(checkprefix("Content-Length:", line_start)) {
+ else if(checkprefix("Content-Length:", s->line_start)) {
if(k->httpcode/100 == 2) {
- /* A server MUST NOT send any Transfer-Encoding or
- Content-Length header fields in a 2xx (Successful)
- response to CONNECT. (RFC 7231 section 4.3.6) */
- failf(data, "Content-Length: in %03d response",
+ /* A client MUST ignore any Content-Length or Transfer-Encoding
+ header fields received in a successful response to CONNECT.
+ "Successful" described as: 2xx (Successful). RFC 7231 4.3.6 */
+ infof(data, "Ignoring Content-Length in CONNECT %03d response\n",
k->httpcode);
- return CURLE_RECV_ERROR;
}
-
- cl = curlx_strtoofft(line_start +
- strlen("Content-Length:"), NULL, 10);
+ else {
+ s->cl = curlx_strtoofft(s->line_start +
+ strlen("Content-Length:"), NULL, 10);
+ }
}
- else if(Curl_compareheader(line_start, "Connection:", "close"))
+ else if(Curl_compareheader(s->line_start, "Connection:", "close"))
closeConnection = TRUE;
- else if(Curl_compareheader(line_start,
- "Transfer-Encoding:",
- "chunked")) {
+ else if(checkprefix("Transfer-Encoding:", s->line_start)) {
if(k->httpcode/100 == 2) {
- /* A server MUST NOT send any Transfer-Encoding or
- Content-Length header fields in a 2xx (Successful)
- response to CONNECT. (RFC 7231 section 4.3.6) */
- failf(data, "Transfer-Encoding: in %03d response", k->httpcode);
- return CURLE_RECV_ERROR;
+ /* A client MUST ignore any Content-Length or Transfer-Encoding
+ header fields received in a successful response to CONNECT.
+ "Successful" described as: 2xx (Successful). RFC 7231 4.3.6 */
+ infof(data, "Ignoring Transfer-Encoding in "
+ "CONNECT %03d response\n", k->httpcode);
+ }
+ else if(Curl_compareheader(s->line_start,
+ "Transfer-Encoding:", "chunked")) {
+ infof(data, "CONNECT responded chunked\n");
+ s->chunked_encoding = TRUE;
+ /* init our chunky engine */
+ Curl_httpchunk_init(conn);
}
- infof(data, "CONNECT responded chunked\n");
- chunked_encoding = TRUE;
- /* init our chunky engine */
- Curl_httpchunk_init(conn);
}
- else if(Curl_compareheader(line_start, "Proxy-Connection:", "close"))
+ else if(Curl_compareheader(s->line_start,
+ "Proxy-Connection:", "close"))
closeConnection = TRUE;
- else if(2 == sscanf(line_start, "HTTP/1.%d %d",
+ else if(2 == sscanf(s->line_start, "HTTP/1.%d %d",
&subversion,
&k->httpcode)) {
/* store the HTTP code from the proxy */
data->info.httpproxycode = k->httpcode;
}
- perline = 0; /* line starts over here */
- ptr = data->state.buffer;
- line_start = ptr;
+ s->perline = 0; /* line starts over here */
+ s->ptr = s->connect_buffer;
+ s->line_start = s->ptr;
} /* while there's buffer left and loop is requested */
if(Curl_pgrsUpdate(conn))
@@ -583,11 +591,8 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
/* If we are supposed to continue and request a new URL, which basically
* means the HTTP authentication is still going on so if the tunnel
* is complete we start over in INIT state */
- if(data->req.newurl &&
- (TUNNEL_COMPLETE == conn->tunnel_state[sockindex])) {
- conn->tunnel_state[sockindex] = TUNNEL_INIT;
- infof(data, "TUNNEL_STATE switched to: %d\n",
- conn->tunnel_state[sockindex]);
+ if(data->req.newurl && (TUNNEL_COMPLETE == s->tunnel_state)) {
+ connect_init(conn, TRUE); /* reinit */
}
} while(data->req.newurl);
@@ -596,6 +601,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
if(closeConnection && data->req.newurl) {
conn->bits.proxy_connect_closed = TRUE;
infof(data, "Connect me again please\n");
+ connect_done(conn);
}
else {
free(data->req.newurl);
@@ -607,19 +613,17 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
}
/* to back to init state */
- conn->tunnel_state[sockindex] = TUNNEL_INIT;
+ s->tunnel_state = TUNNEL_INIT;
if(conn->bits.proxy_connect_closed)
/* this is not an error, just part of the connection negotiation */
return CURLE_OK;
- else {
- failf(data, "Received HTTP code %d from proxy after CONNECT",
- data->req.httpcode);
- return CURLE_RECV_ERROR;
- }
+ failf(data, "Received HTTP code %d from proxy after CONNECT",
+ data->req.httpcode);
+ return CURLE_RECV_ERROR;
}
- conn->tunnel_state[sockindex] = TUNNEL_COMPLETE;
+ s->tunnel_state = TUNNEL_COMPLETE;
/* If a proxy-authorization header was used for the proxy, then we should
make sure that it isn't accidentally used for the document request
@@ -635,4 +639,46 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
document request */
return CURLE_OK;
}
+
+void Curl_connect_free(struct Curl_easy *data)
+{
+ struct connectdata *conn = data->easy_conn;
+ struct http_connect_state *s = conn->connect_state;
+ if(s) {
+ free(s);
+ conn->connect_state = NULL;
+ }
+}
+
+/*
+ * Curl_proxyCONNECT() requires that we're connected to a HTTP proxy. This
+ * function will issue the necessary commands to get a seamless tunnel through
+ * this proxy. After that, the socket can be used just as a normal socket.
+ */
+
+CURLcode Curl_proxyCONNECT(struct connectdata *conn,
+ int sockindex,
+ const char *hostname,
+ int remote_port)
+{
+ CURLcode result;
+ if(!conn->connect_state) {
+ result = connect_init(conn, FALSE);
+ if(result)
+ return result;
+ }
+ result = CONNECT(conn, sockindex, hostname, remote_port);
+
+ if(result || Curl_connect_complete(conn))
+ connect_done(conn);
+
+ return result;
+}
+
+#else
+void Curl_connect_free(struct Curl_easy *data)
+{
+ (void)data;
+}
+
#endif /* CURL_DISABLE_PROXY */
diff --git a/lib/http_proxy.h b/lib/http_proxy.h
index d1f5a7c8..e19fa859 100644
--- a/lib/http_proxy.h
+++ b/lib/http_proxy.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,21 +22,30 @@
*
***************************************************************************/
+#include "curl_setup.h"
+#include "urldata.h"
+
#if !defined(CURL_DISABLE_PROXY) && !defined(CURL_DISABLE_HTTP)
/* ftp can use this as well */
CURLcode Curl_proxyCONNECT(struct connectdata *conn,
int tunnelsocket,
- const char *hostname, int remote_port,
- bool blocking);
+ const char *hostname, int remote_port);
/* Default proxy timeout in milliseconds */
#define PROXY_TIMEOUT (3600*1000)
CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex);
+bool Curl_connect_complete(struct connectdata *conn);
+bool Curl_connect_ongoing(struct connectdata *conn);
+
#else
-#define Curl_proxyCONNECT(x,y,z,w,v) CURLE_NOT_BUILT_IN
+#define Curl_proxyCONNECT(x,y,z,w) CURLE_NOT_BUILT_IN
#define Curl_proxy_connect(x,y) CURLE_OK
+#define Curl_connect_complete(x) CURLE_OK
+#define Curl_connect_ongoing(x) FALSE
#endif
+void Curl_connect_free(struct Curl_easy *data);
+
#endif /* HEADER_CURL_HTTP_PROXY_H */
diff --git a/lib/if2ip.c b/lib/if2ip.c
index d876615e..3e74cc68 100644
--- a/lib/if2ip.c
+++ b/lib/if2ip.c
@@ -121,11 +121,11 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
#ifndef ENABLE_IPV6
(void) remote_scope;
-
-#ifndef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
- (void) remote_scope_id;
#endif
+#if !defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) || \
+ !defined(ENABLE_IPV6)
+ (void) remote_scope_id;
#endif
if(getifaddrs(&head) >= 0) {
@@ -239,7 +239,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
return IF2IP_NOT_FOUND;
}
- s = (struct sockaddr_in *)&req.ifr_addr;
+ s = (struct sockaddr_in *)(void *)&req.ifr_addr;
memcpy(&in, &s->sin_addr, sizeof(in));
Curl_inet_ntop(s->sin_family, &in, buf, buf_size);
diff --git a/lib/imap.c b/lib/imap.c
index 78dc6fa2..48af2902 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -128,9 +128,11 @@ const struct Curl_handler Curl_handler_imap = {
ZERO_NULL, /* perform_getsock */
imap_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_IMAP, /* defport */
CURLPROTO_IMAP, /* protocol */
- PROTOPT_CLOSEACTION /* flags */
+ PROTOPT_CLOSEACTION| /* flags */
+ PROTOPT_URLOPTIONS
};
#ifdef USE_SSL
@@ -153,64 +155,13 @@ const struct Curl_handler Curl_handler_imaps = {
ZERO_NULL, /* perform_getsock */
imap_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_IMAPS, /* defport */
CURLPROTO_IMAPS, /* protocol */
PROTOPT_CLOSEACTION | PROTOPT_SSL /* flags */
};
#endif
-#ifndef CURL_DISABLE_HTTP
-/*
- * HTTP-proxyed IMAP protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_imap_proxy = {
- "IMAP", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_IMAP, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-
-#ifdef USE_SSL
-/*
- * HTTP-proxyed IMAPS protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_imaps_proxy = {
- "IMAPS", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_IMAPS, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-#endif
-#endif
-
/* SASL parameters for the imap protocol */
static const struct SASLproto saslimap = {
"imap", /* The service name */
@@ -952,7 +903,7 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
if(imapcode != 'O') {
if(data->set.use_ssl != CURLUSESSL_TRY) {
- failf(data, "STARTTLS denied. %c", imapcode);
+ failf(data, "STARTTLS denied");
result = CURLE_USE_SSL_FAILED;
}
else
@@ -1714,31 +1665,6 @@ static CURLcode imap_setup_connection(struct connectdata *conn)
/* Clear the TLS upgraded flag */
conn->tls_upgraded = FALSE;
-
- /* Set up the proxy if necessary */
- if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
- /* Unless we have asked to tunnel IMAP operations through the proxy, we
- switch and use HTTP operations only */
-#ifndef CURL_DISABLE_HTTP
- if(conn->handler == &Curl_handler_imap)
- conn->handler = &Curl_handler_imap_proxy;
- else {
-#ifdef USE_SSL
- conn->handler = &Curl_handler_imaps_proxy;
-#else
- failf(data, "IMAPS not supported!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
- /* set it up as an HTTP connection instead */
- return conn->handler->setup_connection(conn);
-#else
- failf(data, "IMAP over http proxy requires HTTP support built-in!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
data->state.path++; /* don't include the initial slash */
return CURLE_OK;
@@ -1748,7 +1674,7 @@ static CURLcode imap_setup_connection(struct connectdata *conn)
*
* imap_sendf()
*
- * Sends the formated string as an IMAP command to the server.
+ * Sends the formatted string as an IMAP command to the server.
*
* Designed to never block.
*/
diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c
index 9afbdbb3..22f08e84 100644
--- a/lib/inet_ntop.c
+++ b/lib/inet_ntop.c
@@ -63,7 +63,7 @@ static char *inet_ntop4 (const unsigned char *src, char *dst, size_t size)
len = strlen(tmp);
if(len == 0 || len >= size) {
- SET_ERRNO(ENOSPC);
+ errno = ENOSPC;
return (NULL);
}
strcpy(dst, tmp);
@@ -142,7 +142,7 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
if(i == 6 && best.base == 0 &&
(best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
if(!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) {
- SET_ERRNO(ENOSPC);
+ errno = ENOSPC;
return (NULL);
}
tp += strlen(tp);
@@ -160,7 +160,7 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
/* Check for overflow, copy, and we're done.
*/
if((size_t)(tp - tmp) > size) {
- SET_ERRNO(ENOSPC);
+ errno = ENOSPC;
return (NULL);
}
strcpy(dst, tmp);
@@ -177,8 +177,8 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
*
* On Windows we store the error in the thread errno, not
* in the winsock error code. This is to avoid losing the
- * actual last winsock error. So use macro ERRNO to fetch the
- * errno this function sets when returning NULL, not SOCKERRNO.
+ * actual last winsock error. So when this function returns
+ * NULL, check errno not SOCKERRNO.
*/
char *Curl_inet_ntop(int af, const void *src, char *buf, size_t size)
{
@@ -190,7 +190,7 @@ char *Curl_inet_ntop(int af, const void *src, char *buf, size_t size)
return inet_ntop6((const unsigned char *)src, buf, size);
#endif
default:
- SET_ERRNO(EAFNOSUPPORT);
+ errno = EAFNOSUPPORT;
return NULL;
}
}
diff --git a/lib/inet_pton.c b/lib/inet_pton.c
index 475f44ab..fef9610d 100644
--- a/lib/inet_pton.c
+++ b/lib/inet_pton.c
@@ -57,8 +57,8 @@ static int inet_pton6(const char *src, unsigned char *dst);
* notice:
* On Windows we store the error in the thread errno, not
* in the winsock error code. This is to avoid losing the
- * actual last winsock error. So use macro ERRNO to fetch the
- * errno this function sets when returning (-1), not SOCKERRNO.
+ * actual last winsock error. So when this function returns
+ * -1, check errno not SOCKERRNO.
* author:
* Paul Vixie, 1996.
*/
@@ -73,7 +73,7 @@ Curl_inet_pton(int af, const char *src, void *dst)
return (inet_pton6(src, (unsigned char *)dst));
#endif
default:
- SET_ERRNO(EAFNOSUPPORT);
+ errno = EAFNOSUPPORT;
return (-1);
}
/* NOTREACHED */
diff --git a/lib/inet_pton.h b/lib/inet_pton.h
index 9188d959..e216f4ef 100644
--- a/lib/inet_pton.h
+++ b/lib/inet_pton.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -29,6 +29,9 @@ int Curl_inet_pton(int, const char *, void *);
#ifdef HAVE_INET_PTON
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
+#elif defined(HAVE_WS2TCPIP_H)
+/* inet_pton() exists in Vista or later */
+#include <ws2tcpip.h>
#endif
#define Curl_inet_pton(x,y,z) inet_pton(x,y,z)
#endif
diff --git a/lib/krb5.c b/lib/krb5.c
index 067b0a57..69a35979 100644
--- a/lib/krb5.c
+++ b/lib/krb5.c
@@ -164,6 +164,7 @@ krb5_auth(void *app_data, struct connectdata *conn)
size_t base64_sz = 0;
struct sockaddr_in **remote_addr =
(struct sockaddr_in **)&conn->ip_addr->ai_addr;
+ char *stringp;
if(getsockname(conn->sock[FIRSTSOCKET],
(struct sockaddr *)&conn->local_addr, &l) < 0)
@@ -193,16 +194,19 @@ krb5_auth(void *app_data, struct connectdata *conn)
return -1;
}
- input_buffer.value = data->state.buffer;
- input_buffer.length = snprintf(input_buffer.value, BUFSIZE, "%s@%s",
- service, host);
+ stringp = aprintf("%s@%s", service, host);
+ if(!stringp)
+ return -2;
+
+ input_buffer.value = stringp;
+ input_buffer.length = strlen(stringp);
maj = gss_import_name(&min, &input_buffer, GSS_C_NT_HOSTBASED_SERVICE,
&gssname);
+ free(stringp);
if(maj != GSS_S_COMPLETE) {
gss_release_name(&min, &gssname);
if(service == srv_host) {
- Curl_failf(data, "Error importing service name %s",
- input_buffer.value);
+ Curl_failf(data, "Error importing service name %s@%s", service, host);
return AUTH_ERROR;
}
service = srv_host;
diff --git a/lib/ldap.c b/lib/ldap.c
index 979ce7de..435b990a 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
PROTOPT_NONE /* flags */
@@ -175,12 +176,87 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
CURLPROTO_LDAPS, /* protocol */
PROTOPT_SSL /* flags */
};
#endif
+#if defined(USE_WIN32_LDAP)
+
+#if defined(USE_WINDOWS_SSPI)
+static int ldap_win_bind_auth(LDAP *server, const char *user,
+ const char *passwd, unsigned long authflags)
+{
+ ULONG method = 0;
+ SEC_WINNT_AUTH_IDENTITY cred = { 0, };
+ int rc = LDAP_AUTH_METHOD_NOT_SUPPORTED;
+
+#if defined(USE_SPNEGO)
+ if(authflags & CURLAUTH_NEGOTIATE) {
+ method = LDAP_AUTH_NEGOTIATE;
+ }
+ else
+#endif
+#if defined(USE_NTLM)
+ if(authflags & CURLAUTH_NTLM) {
+ method = LDAP_AUTH_NTLM;
+ }
+ else
+#endif
+#if !defined(CURL_DISABLE_CRYPTO_AUTH)
+ if(authflags & CURLAUTH_DIGEST) {
+ method = LDAP_AUTH_DIGEST;
+ }
+ else
+#endif
+ {
+ /* required anyway if one of upper preprocessor definitions enabled */
+ }
+
+ if(method && user && passwd) {
+ rc = Curl_create_sspi_identity(user, passwd, &cred);
+ if(!rc) {
+ rc = ldap_bind_s(server, NULL, (TCHAR *)&cred, method);
+ Curl_sspi_free_identity(&cred);
+ }
+ }
+ else {
+ /* proceed with current user credentials */
+ method = LDAP_AUTH_NEGOTIATE;
+ rc = ldap_bind_s(server, NULL, NULL, method);
+ }
+ return rc;
+}
+#endif /* #if defined(USE_WINDOWS_SSPI) */
+
+static int ldap_win_bind(struct connectdata *conn, LDAP *server,
+ const char *user, const char *passwd)
+{
+ int rc = LDAP_INVALID_CREDENTIALS;
+
+ PTCHAR inuser = NULL;
+ PTCHAR inpass = NULL;
+
+ if(user && passwd && (conn->data->set.httpauth & CURLAUTH_BASIC)) {
+ inuser = Curl_convert_UTF8_to_tchar((char *) user);
+ inpass = Curl_convert_UTF8_to_tchar((char *) passwd);
+
+ rc = ldap_simple_bind_s(server, inuser, inpass);
+
+ Curl_unicodefree(inuser);
+ Curl_unicodefree(inpass);
+ }
+#if defined(USE_WINDOWS_SSPI)
+ else {
+ rc = ldap_win_bind_auth(server, user, passwd, conn->data->set.httpauth);
+ }
+#endif
+
+ return rc;
+}
+#endif /* #if defined(USE_WIN32_LDAP) */
static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
{
@@ -202,13 +278,11 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
#endif
#if defined(USE_WIN32_LDAP)
TCHAR *host = NULL;
- TCHAR *user = NULL;
- TCHAR *passwd = NULL;
#else
char *host = NULL;
+#endif
char *user = NULL;
char *passwd = NULL;
-#endif
*done = TRUE; /* unconditionally */
infof(data, "LDAP local: LDAP Vendor = %s ; LDAP Version = %d\n",
@@ -239,24 +313,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
goto quit;
}
-
- if(conn->bits.user_passwd) {
- user = Curl_convert_UTF8_to_tchar(conn->user);
- passwd = Curl_convert_UTF8_to_tchar(conn->passwd);
- if(!user || !passwd) {
- result = CURLE_OUT_OF_MEMORY;
-
- goto quit;
- }
- }
#else
host = conn->host.name;
+#endif
if(conn->bits.user_passwd) {
user = conn->user;
passwd = conn->passwd;
}
-#endif
#ifdef LDAP_OPT_NETWORK_TIMEOUT
ldap_set_option(NULL, LDAP_OPT_NETWORK_TIMEOUT, &ldap_timeout);
@@ -402,11 +466,19 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
#endif
+#ifdef USE_WIN32_LDAP
+ rc = ldap_win_bind(conn, server, user, passwd);
+#else
rc = ldap_simple_bind_s(server, user, passwd);
+#endif
if(!ldap_ssl && rc != 0) {
ldap_proto = LDAP_VERSION2;
ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
+#ifdef USE_WIN32_LDAP
+ rc = ldap_win_bind(conn, server, user, passwd);
+#else
rc = ldap_simple_bind_s(server, user, passwd);
+#endif
}
if(rc != 0) {
failf(data, "LDAP local: ldap_simple_bind_s %s", ldap_err2string(rc));
@@ -669,8 +741,6 @@ quit:
#endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */
#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(passwd);
- Curl_unicodefree(user);
Curl_unicodefree(host);
#endif
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index eb48ed2c..2dbb4762 100644
--- a/lib/libcurl.plist
+++ b/lib/libcurl.plist
@@ -15,7 +15,7 @@
<string>se.haxx.curl.libcurl</string>
<key>CFBundleVersion</key>
- <string>7.52.1</string>
+ <string>7.55.0</string>
<key>CFBundleName</key>
<string>libcurl</string>
@@ -27,9 +27,9 @@
<string>????</string>
<key>CFBundleShortVersionString</key>
- <string>libcurl 7.52.1</string>
+ <string>libcurl 7.55.0</string>
<key>CFBundleGetInfoString</key>
- <string>libcurl.plist 7.52.1</string>
+ <string>libcurl.plist 7.55.0</string>
</dict>
</plist>
diff --git a/lib/libcurl.rc b/lib/libcurl.rc
index c1efbadc..3316fba1 100644
--- a/lib/libcurl.rc
+++ b/lib/libcurl.rc
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -51,7 +51,7 @@ BEGIN
VALUE "OriginalFilename", "libcurl.dll\0"
VALUE "ProductName", "The curl library\0"
VALUE "ProductVersion", LIBCURL_VERSION "\0"
- VALUE "LegalCopyright", "© " LIBCURL_COPYRIGHT "\0"
+ VALUE "LegalCopyright", "\xa9 " LIBCURL_COPYRIGHT "\0" /* a9: Copyright symbol */
VALUE "License", "https://curl.haxx.se/docs/copyright.html\0"
END
END
diff --git a/lib/llist.c b/lib/llist.c
index 482aaa04..4bb0a51b 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,8 +33,8 @@
/*
* @unittest: 1300
*/
-static void
-llist_init(struct curl_llist *l, curl_llist_dtor dtor)
+void
+Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
{
l->size = 0;
l->dtor = dtor;
@@ -42,20 +42,6 @@ llist_init(struct curl_llist *l, curl_llist_dtor dtor)
l->tail = NULL;
}
-struct curl_llist *
-Curl_llist_alloc(curl_llist_dtor dtor)
-{
- struct curl_llist *list;
-
- list = malloc(sizeof(struct curl_llist));
- if(!list)
- return NULL;
-
- llist_init(list, dtor);
-
- return list;
-}
-
/*
* Curl_llist_insert_next()
*
@@ -63,18 +49,15 @@ Curl_llist_alloc(curl_llist_dtor dtor)
* entry is NULL and the list already has elements, the new one will be
* inserted first in the list.
*
- * Returns: 1 on success and 0 on failure.
+ * The 'ne' argument should be a pointer into the object to store.
*
* @unittest: 1300
*/
-int
+void
Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
- const void *p)
+ const void *p,
+ struct curl_llist_element *ne)
{
- struct curl_llist_element *ne = malloc(sizeof(struct curl_llist_element));
- if(!ne)
- return 0;
-
ne->ptr = (void *) p;
if(list->size == 0) {
list->head = ne;
@@ -101,19 +84,18 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
}
++list->size;
-
- return 1;
}
/*
* @unittest: 1300
*/
-int
+void
Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
void *user)
{
+ void *ptr;
if(e == NULL || list->size == 0)
- return 1;
+ return;
if(e == list->head) {
list->head = e->next;
@@ -131,16 +113,17 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
e->next->prev = e->prev;
}
- list->dtor(user, e->ptr);
+ ptr = e->ptr;
e->ptr = NULL;
e->prev = NULL;
e->next = NULL;
- free(e);
--list->size;
- return 1;
+ /* call the dtor() last for when it actually frees the 'e' memory itself */
+ if(list->dtor)
+ list->dtor(user, ptr);
}
void
@@ -149,8 +132,6 @@ Curl_llist_destroy(struct curl_llist *list, void *user)
if(list) {
while(list->size > 0)
Curl_llist_remove(list, list->tail, user);
-
- free(list);
}
}
@@ -163,13 +144,13 @@ Curl_llist_count(struct curl_llist *list)
/*
* @unittest: 1300
*/
-int Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
- struct curl_llist *to_list,
- struct curl_llist_element *to_e)
+void Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
+ struct curl_llist *to_list,
+ struct curl_llist_element *to_e)
{
/* Remove element from list */
if(e == NULL || list->size == 0)
- return 0;
+ return;
if(e == list->head) {
list->head = e->next;
@@ -209,6 +190,4 @@ int Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
}
++to_list->size;
-
- return 1;
}
diff --git a/lib/llist.h b/lib/llist.h
index 39ff408e..6b644b99 100644
--- a/lib/llist.h
+++ b/lib/llist.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -29,7 +29,6 @@ typedef void (*curl_llist_dtor)(void *, void *);
struct curl_llist_element {
void *ptr;
-
struct curl_llist_element *prev;
struct curl_llist_element *next;
};
@@ -37,21 +36,19 @@ struct curl_llist_element {
struct curl_llist {
struct curl_llist_element *head;
struct curl_llist_element *tail;
-
curl_llist_dtor dtor;
-
size_t size;
};
-struct curl_llist *Curl_llist_alloc(curl_llist_dtor);
-int Curl_llist_insert_next(struct curl_llist *, struct curl_llist_element *,
- const void *);
-int Curl_llist_remove(struct curl_llist *, struct curl_llist_element *,
- void *);
+void Curl_llist_init(struct curl_llist *, curl_llist_dtor);
+void Curl_llist_insert_next(struct curl_llist *, struct curl_llist_element *,
+ const void *, struct curl_llist_element *node);
+void Curl_llist_remove(struct curl_llist *, struct curl_llist_element *,
+ void *);
size_t Curl_llist_count(struct curl_llist *);
void Curl_llist_destroy(struct curl_llist *, void *);
-int Curl_llist_move(struct curl_llist *, struct curl_llist_element *,
- struct curl_llist *, struct curl_llist_element *);
+void Curl_llist_move(struct curl_llist *, struct curl_llist_element *,
+ struct curl_llist *, struct curl_llist_element *);
#endif /* HEADER_CURL_LLIST_H */
diff --git a/lib/makefile.dj b/lib/makefile.dj
index 2331afe3..8ab2d575 100644
--- a/lib/makefile.dj
+++ b/lib/makefile.dj
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2003 - 2008, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2003 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2003 - 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
@@ -26,20 +26,19 @@
#
DEPEND_PREREQ = curl_config.h
-VPATH = vtls
+VPATH = vtls vauth
TOPDIR = ..
include ../packages/DOS/common.dj
include Makefile.inc
+CFLAGS += -DBUILDING_LIBCURL
+
SOURCES = $(sort $(CSOURCES))
OBJECTS = $(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.c=.o)))
CURL_LIB = libcurl.a
-# NOTE: if ../include/curl/curlbuild.h is missing, you're probably building
-# this from a git checkout and then you need to run buildconf.bat first.
-
all: $(OBJ_DIR) curl_config.h $(CURL_LIB)
$(CURL_LIB): $(OBJECTS)
diff --git a/lib/md4.c b/lib/md4.c
index 1bdc9f36..2bb7dcc2 100644
--- a/lib/md4.c
+++ b/lib/md4.c
@@ -37,9 +37,10 @@
#include "curl_setup.h"
-/* NSS and OS/400 crypto library do not provide the MD4 hash algorithm, so
- * that we have a local implementation of it */
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO)
+/* 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"
@@ -89,7 +90,7 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx);
*/
#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
#define SET(n) \
- (*(MD4_u32plus *)&ptr[(n) * 4])
+ (*(MD4_u32plus *)(void *)&ptr[(n) * 4])
#define GET(n) \
SET(n)
#else
@@ -302,4 +303,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) */
+#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
+ (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
diff --git a/lib/md5.c b/lib/md5.c
index f2dc16c0..80301a14 100644
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -260,7 +260,7 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx);
*/
#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
#define SET(n) \
- (*(MD5_u32plus *)&ptr[(n) * 4])
+ (*(MD5_u32plus *)(void *)&ptr[(n) * 4])
#define GET(n) \
SET(n)
#else
diff --git a/lib/memdebug.c b/lib/memdebug.c
index 15e86616..8c9fe950 100644
--- a/lib/memdebug.c
+++ b/lib/memdebug.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -35,10 +35,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifndef HAVE_ASSERT_H
-# define assert(x) Curl_nop_stmt
-#endif
-
/*
* Until 2011-08-17 libcurl's Memory Tracking feature also performed
* automatic malloc and free filling operations using 0xA5 and 0x13
@@ -119,7 +115,8 @@ void curl_memdebug(const char *logname)
logfile = stderr;
#ifdef MEMDEBUG_LOG_SYNC
/* Flush the log file after every line so the log isn't lost in a crash */
- setbuf(logfile, (char *)NULL);
+ if(logfile)
+ setbuf(logfile, (char *)NULL);
#endif
}
}
@@ -150,7 +147,7 @@ static bool countcheck(const char *func, int line, const char *source)
source, line, func);
fflush(logfile); /* because it might crash now */
}
- SET_ERRNO(ENOMEM);
+ errno = ENOMEM;
return TRUE; /* RETURN ERROR! */
}
else
@@ -167,7 +164,7 @@ void *curl_domalloc(size_t wantedsize, int line, const char *source)
struct memdebug *mem;
size_t size;
- assert(wantedsize != 0);
+ DEBUGASSERT(wantedsize != 0);
if(countcheck("malloc", line, source))
return NULL;
@@ -196,8 +193,8 @@ void *curl_docalloc(size_t wanted_elements, size_t wanted_size,
struct memdebug *mem;
size_t size, user_size;
- assert(wanted_elements != 0);
- assert(wanted_size != 0);
+ DEBUGASSERT(wanted_elements != 0);
+ DEBUGASSERT(wanted_size != 0);
if(countcheck("calloc", line, source))
return NULL;
@@ -223,7 +220,7 @@ char *curl_dostrdup(const char *str, int line, const char *source)
char *mem;
size_t len;
- assert(str != NULL);
+ DEBUGASSERT(str != NULL);
if(countcheck("strdup", line, source))
return NULL;
@@ -236,7 +233,7 @@ char *curl_dostrdup(const char *str, int line, const char *source)
if(source)
curl_memlog("MEM %s:%d strdup(%p) (%zu) = %p\n",
- source, line, (void *)str, len, (void *)mem);
+ source, line, (const void *)str, len, (const void *)mem);
return mem;
}
@@ -247,7 +244,7 @@ wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source)
wchar_t *mem;
size_t wsiz, bsiz;
- assert(str != NULL);
+ DEBUGASSERT(str != NULL);
if(countcheck("wcsdup", line, source))
return NULL;
@@ -276,7 +273,7 @@ void *curl_dorealloc(void *ptr, size_t wantedsize,
size_t size = sizeof(struct memdebug)+wantedsize;
- assert(wantedsize != 0);
+ DEBUGASSERT(wantedsize != 0);
if(countcheck("realloc", line, source))
return NULL;
@@ -445,7 +442,7 @@ int curl_fclose(FILE *file, int line, const char *source)
{
int res;
- assert(file != NULL);
+ DEBUGASSERT(file != NULL);
res=fclose(file);
@@ -458,7 +455,7 @@ int curl_fclose(FILE *file, int line, const char *source)
#define LOGLINE_BUFSIZE 1024
-/* this does the writting to the memory tracking log file */
+/* this does the writing to the memory tracking log file */
void curl_memlog(const char *format, ...)
{
char *buf;
@@ -480,7 +477,7 @@ void curl_memlog(const char *format, ...)
nchars = LOGLINE_BUFSIZE - 1;
if(nchars > 0)
- fwrite(buf, 1, nchars, logfile);
+ fwrite(buf, 1, (size_t)nchars, logfile);
(Curl_cfree)(buf);
}
diff --git a/lib/mk-ca-bundle.pl b/lib/mk-ca-bundle.pl
index 9574f1db..cc36c768 100755
--- a/lib/mk-ca-bundle.pl
+++ b/lib/mk-ca-bundle.pl
@@ -310,7 +310,7 @@ if(!$opt_n) {
my $proto = !$opt_k ? "--proto =https" : "";
my $quiet = $opt_q ? "-s" : "";
my @out = `curl -w %{response_code} $proto $quiet -o "$txt" "$url"`;
- if(@out && $out[0] == 200) {
+ if(!$? && @out && $out[0] == 200) {
$fetched = 1;
report "Downloaded $txt";
}
diff --git a/lib/mprintf.c b/lib/mprintf.c
index e4270abe..eb7ee0c6 100644
--- a/lib/mprintf.c
+++ b/lib/mprintf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1999 - 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
@@ -42,10 +42,6 @@
/* The last #include file should be: */
#include "memdebug.h"
-#ifndef SIZEOF_LONG_DOUBLE
-#define SIZEOF_LONG_DOUBLE 0
-#endif
-
/*
* If SIZEOF_SIZE_T has not been defined, default to the size of long.
*/
@@ -614,7 +610,7 @@ static int dprintf_formatf(
int is_neg;
/* Base of a number to be written. */
- long base;
+ unsigned long base;
/* Integral values to be written. */
mp_uintmax_t num;
@@ -955,9 +951,7 @@ static int dprintf_formatf(
/* NOTE NOTE NOTE!! Not all sprintf implementations return number of
output characters */
(sprintf)(work, formatbuf, p->data.dnum);
-#ifdef CURLDEBUG
- assert(strlen(work) <= sizeof(work));
-#endif
+ DEBUGASSERT(strlen(work) <= sizeof(work));
for(fptr=work; *fptr; fptr++)
OUTCHAR(*fptr);
}
@@ -1096,8 +1090,7 @@ char *curl_maprintf(const char *format, ...)
info.buffer[info.len] = 0; /* we terminate this with a zero byte */
return info.buffer;
}
- else
- return strdup("");
+ return strdup("");
}
char *curl_mvaprintf(const char *format, va_list ap_save)
@@ -1121,8 +1114,7 @@ char *curl_mvaprintf(const char *format, va_list ap_save)
info.buffer[info.len] = 0; /* we terminate this with a zero byte */
return info.buffer;
}
- else
- return strdup("");
+ return strdup("");
}
static int storebuffer(int output, FILE *data)
diff --git a/lib/multi.c b/lib/multi.c
index 950b600c..d5bc532e 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -44,6 +44,7 @@
#include "sigpipe.h"
#include "vtls/vtls.h"
#include "connect.h"
+#include "http_proxy.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -69,7 +70,7 @@ static void singlesocket(struct Curl_multi *multi,
struct Curl_easy *data);
static int update_timer(struct Curl_multi *multi);
-static CURLMcode add_next_timeout(struct timeval now,
+static CURLMcode add_next_timeout(struct curltime now,
struct Curl_multi *multi,
struct Curl_easy *d);
static CURLMcode multi_timeout(struct Curl_multi *multi,
@@ -99,8 +100,6 @@ static const char * const statename[]={
};
#endif
-static void multi_freetimeout(void *a, void *b);
-
/* function pointer called once when switching TO a state */
typedef void (*init_multistate_func)(struct Curl_easy *data);
@@ -116,6 +115,13 @@ static void mstate(struct Curl_easy *data, CURLMstate state
NULL,
NULL,
Curl_init_CONNECT, /* CONNECT */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ Curl_connect_free /* DO */
/* the rest is NULL too */
};
@@ -280,9 +286,8 @@ static int sh_init(struct curl_hash *hash, int hashsize)
static CURLMcode multi_addmsg(struct Curl_multi *multi,
struct Curl_message *msg)
{
- if(!Curl_llist_insert_next(multi->msglist, multi->msglist->tail, msg))
- return CURLM_OUT_OF_MEMORY;
-
+ Curl_llist_insert_next(&multi->msglist, multi->msglist.tail, msg,
+ &msg->list);
return CURLM_OK;
}
@@ -316,13 +321,8 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
if(Curl_conncache_init(&multi->conn_cache, chashsize))
goto error;
- multi->msglist = Curl_llist_alloc(multi_freeamsg);
- if(!multi->msglist)
- goto error;
-
- multi->pending = Curl_llist_alloc(multi_freeamsg);
- if(!multi->pending)
- goto error;
+ Curl_llist_init(&multi->msglist, multi_freeamsg);
+ Curl_llist_init(&multi->pending, multi_freeamsg);
/* allocate a new easy handle to use when closing cached connections */
multi->closure_handle = curl_easy_init();
@@ -345,8 +345,8 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
Curl_conncache_destroy(&multi->conn_cache);
Curl_close(multi->closure_handle);
multi->closure_handle = NULL;
- Curl_llist_destroy(multi->msglist, NULL);
- Curl_llist_destroy(multi->pending, NULL);
+ Curl_llist_destroy(&multi->msglist, NULL);
+ Curl_llist_destroy(&multi->pending, NULL);
free(multi);
return NULL;
@@ -361,8 +361,6 @@ struct Curl_multi *curl_multi_init(void)
CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
struct Curl_easy *data)
{
- struct curl_llist *timeoutlist;
-
/* First, make some basic checks that the CURLM handle is a good handle */
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -376,10 +374,8 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
if(data->multi)
return CURLM_ADDED_ALREADY;
- /* Allocate and initialize timeout list for easy handle */
- timeoutlist = Curl_llist_alloc(multi_freetimeout);
- if(!timeoutlist)
- return CURLM_OUT_OF_MEMORY;
+ /* Initialize timeout list for this handle */
+ Curl_llist_init(&data->state.timeoutlist, NULL);
/*
* No failure allowed in this function beyond this point. And no
@@ -388,10 +384,6 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
* function no matter what.
*/
- /* Make easy handle use timeout list initialized above */
- data->state.timeoutlist = timeoutlist;
- timeoutlist = NULL;
-
/* set the easy handle */
multistate(data, CURLM_STATE_INIT);
@@ -444,7 +436,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
sockets that time-out or have actions will be dealt with. Since this
handle has no action yet, we make sure it times out to get things to
happen. */
- Curl_expire(data, 0);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
/* increase the node-counter */
multi->num_easy++;
@@ -532,6 +524,7 @@ static CURLcode multi_done(struct connectdata **connp,
CURLcode result;
struct connectdata *conn;
struct Curl_easy *data;
+ unsigned int i;
DEBUGASSERT(*connp);
@@ -579,7 +572,7 @@ static CURLcode multi_done(struct connectdata **connp,
result = CURLE_ABORTED_BY_CALLBACK;
}
- if(conn->send_pipe->size + conn->recv_pipe->size != 0 &&
+ if(conn->send_pipe.size + conn->recv_pipe.size != 0 &&
!data->set.reuse_forbid &&
!conn->bits.close) {
/* Stop if pipeline is not empty and we do not have to close
@@ -598,9 +591,11 @@ static CURLcode multi_done(struct connectdata **connp,
}
/* if the transfer was completed in a paused state there can be buffered
- data left to write and then kill */
- free(data->state.tempwrite);
- data->state.tempwrite = NULL;
+ data left to free */
+ for(i=0; i < data->state.tempcount; i++) {
+ free(data->state.tempwrite[i].buf);
+ }
+ data->state.tempcount = 0;
/* 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
@@ -638,7 +633,10 @@ static CURLcode multi_done(struct connectdata **connp,
infof(data, "Connection #%ld to host %s left intact\n",
conn->connection_id,
- conn->bits.httpproxy?conn->proxy.dispname:conn->host.dispname);
+ 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);
}
else
data->state.lastconnect = NULL;
@@ -692,13 +690,13 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
if(data->easy_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");
- /* 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;
easy_owns_conn = TRUE;
}
@@ -735,10 +733,7 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
/* destroy the timeout list that is held in the easy handle, do this *after*
multi_done() as that may actually call Curl_expire that uses this */
- if(data->state.timeoutlist) {
- Curl_llist_destroy(data->state.timeoutlist, NULL);
- data->state.timeoutlist = NULL;
- }
+ Curl_llist_destroy(&data->state.timeoutlist, NULL);
/* as this was using a shared connection cache we clear the pointer to that
since we're not part of that multi handle anymore */
@@ -761,11 +756,11 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
/* make sure there's no pending message in the queue sent from this easy
handle */
- for(e = multi->msglist->head; e; e = e->next) {
+ for(e = multi->msglist.head; e; e = e->next) {
struct Curl_message *msg = e->ptr;
if(msg->extmsg.easy_handle == easy) {
- Curl_llist_remove(multi->msglist, e, NULL);
+ Curl_llist_remove(&multi->msglist, e, NULL);
/* there can only be one from this specific handle */
break;
}
@@ -839,7 +834,7 @@ static int waitproxyconnect_getsock(struct connectdata *conn,
/* when we've sent a CONNECT to a proxy, we should rather wait for the
socket to become readable to be able to get the response headers */
- if(conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT)
+ if(conn->connect_state)
return GETSOCK_READSOCK(0);
return GETSOCK_WRITESOCK(0);
@@ -956,10 +951,8 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
if(s == CURL_SOCKET_BAD)
/* this socket is unused, break out of loop */
break;
- else {
- if((int)s > this_max_fd)
- this_max_fd = (int)s;
- }
+ if((int)s > this_max_fd)
+ this_max_fd = (int)s;
}
data = data->next; /* check next handle */
@@ -970,6 +963,8 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
return CURLM_OK;
}
+#define NUM_POLLS_ON_STACK 10
+
CURLMcode curl_multi_wait(struct Curl_multi *multi,
struct curl_waitfd extra_fds[],
unsigned int extra_nfds,
@@ -983,8 +978,10 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
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];
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -1023,10 +1020,19 @@ 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 || extra_nfds) {
- ufds = malloc(nfds * sizeof(struct pollfd));
- if(!ufds)
- return CURLM_OUT_OF_MEMORY;
+ 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];
}
nfds = 0;
@@ -1104,7 +1110,8 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
}
}
- free(ufds);
+ if(ufds_malloc)
+ free(ufds);
if(ret)
*ret = retcode;
return CURLM_OK;
@@ -1294,7 +1301,7 @@ static CURLcode multi_do_more(struct connectdata *conn, int *complete)
}
static CURLMcode multi_runsingle(struct Curl_multi *multi,
- struct timeval now,
+ struct curltime now,
struct Curl_easy *data)
{
struct Curl_message *msg = NULL;
@@ -1307,6 +1314,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
CURLcode result = CURLE_OK;
struct SingleRequest *k;
time_t timeout_ms;
+ time_t recv_timeout_ms;
+ time_t send_timeout_ms;
int control;
if(!GOOD_EASY_HANDLE(data))
@@ -1432,10 +1441,9 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
multistate(data, CURLM_STATE_CONNECT_PEND);
/* add this handle to the list of connect-pending handles */
- if(!Curl_llist_insert_next(multi->pending, multi->pending->tail, data))
- result = CURLE_OUT_OF_MEMORY;
- else
- result = CURLE_OK;
+ Curl_llist_insert_next(&multi->pending, multi->pending.tail, data,
+ &data->connect_queue);
+ result = CURLE_OK;
break;
}
@@ -1459,7 +1467,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
CURLM_STATE_WAITDO:CURLM_STATE_DO);
else {
#ifndef CURL_DISABLE_HTTP
- if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT)
+ if(Curl_connect_ongoing(data->easy_conn))
multistate(data, CURLM_STATE_WAITPROXYCONNECT);
else
#endif
@@ -1477,8 +1485,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
struct connectdata *conn = data->easy_conn;
const char *hostname;
- if(conn->bits.proxy)
- hostname = conn->proxy.name;
+ if(conn->bits.httpproxy)
+ hostname = conn->http_proxy.host.name;
else if(conn->bits.conn_to_host)
hostname = conn->conn_to_host.name;
else
@@ -1524,7 +1532,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
CURLM_STATE_WAITDO:CURLM_STATE_DO);
else {
#ifndef CURL_DISABLE_HTTP
- if(data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT)
+ if(Curl_connect_ongoing(data->easy_conn))
multistate(data, CURLM_STATE_WAITPROXYCONNECT);
else
#endif
@@ -1556,7 +1564,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
else if(!result) {
if((data->easy_conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
- (data->easy_conn->tunnel_state[FIRSTSOCKET] != TUNNEL_CONNECT)) {
+ Curl_connect_complete(data->easy_conn)) {
rc = CURLM_CALL_MULTI_PERFORM;
/* initiate protocol connect phase */
multistate(data, CURLM_STATE_SENDPROTOCONNECT);
@@ -1572,7 +1580,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
#ifndef CURL_DISABLE_HTTP
if((data->easy_conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
!data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
- (data->easy_conn->tunnel_state[FIRSTSOCKET] == TUNNEL_CONNECT)) {
+ Curl_connect_ongoing(data->easy_conn)) {
multistate(data, CURLM_STATE_WAITPROXYCONNECT);
break;
}
@@ -1719,20 +1727,18 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
else {
/* Follow failed */
result = drc;
- free(newurl);
}
}
else {
/* done didn't return OK or SEND_ERROR */
result = drc;
- free(newurl);
}
}
else {
/* Have error handler disconnect conn if we can't retry */
stream_error = TRUE;
- free(newurl);
}
+ free(newurl);
}
else {
/* failure detected */
@@ -1826,19 +1832,30 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
else
result = Curl_speedcheck(data, now);
- if(( (data->set.max_send_speed == 0) ||
- (Curl_pgrsLimitWaitTime(data->progress.uploaded,
- data->progress.ul_limit_size,
- data->set.max_send_speed,
- data->progress.ul_limit_start,
- now) <= 0)) &&
- ( (data->set.max_recv_speed == 0) ||
- (Curl_pgrsLimitWaitTime(data->progress.downloaded,
- data->progress.dl_limit_size,
- data->set.max_recv_speed,
- data->progress.dl_limit_start,
- now) <= 0)))
- multistate(data, CURLM_STATE_PERFORM);
+ if(!result) {
+ send_timeout_ms = 0;
+ if(data->set.max_send_speed > 0)
+ send_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.uploaded,
+ data->progress.ul_limit_size,
+ data->set.max_send_speed,
+ data->progress.ul_limit_start,
+ now);
+
+ recv_timeout_ms = 0;
+ if(data->set.max_recv_speed > 0)
+ recv_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.downloaded,
+ data->progress.dl_limit_size,
+ data->set.max_recv_speed,
+ data->progress.dl_limit_start,
+ now);
+
+ if(send_timeout_ms <= 0 && recv_timeout_ms <= 0)
+ multistate(data, CURLM_STATE_PERFORM);
+ else if(send_timeout_ms >= recv_timeout_ms)
+ Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
+ else
+ Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
+ }
break;
case CURLM_STATE_PERFORM:
@@ -1848,31 +1865,30 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
bool comeback = FALSE;
/* check if over send speed */
- if(data->set.max_send_speed > 0) {
- timeout_ms = Curl_pgrsLimitWaitTime(data->progress.uploaded,
- data->progress.ul_limit_size,
- data->set.max_send_speed,
- data->progress.ul_limit_start,
- now);
- if(timeout_ms > 0) {
- multistate(data, CURLM_STATE_TOOFAST);
- Curl_expire_latest(data, timeout_ms);
- break;
- }
- }
+ send_timeout_ms = 0;
+ if(data->set.max_send_speed > 0)
+ send_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.uploaded,
+ data->progress.ul_limit_size,
+ data->set.max_send_speed,
+ data->progress.ul_limit_start,
+ now);
/* check if over recv speed */
- if(data->set.max_recv_speed > 0) {
- timeout_ms = Curl_pgrsLimitWaitTime(data->progress.downloaded,
- data->progress.dl_limit_size,
- data->set.max_recv_speed,
- data->progress.dl_limit_start,
- now);
- if(timeout_ms > 0) {
- multistate(data, CURLM_STATE_TOOFAST);
- Curl_expire_latest(data, timeout_ms);
- break;
- }
+ recv_timeout_ms = 0;
+ if(data->set.max_recv_speed > 0)
+ recv_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.downloaded,
+ data->progress.dl_limit_size,
+ data->set.max_recv_speed,
+ data->progress.dl_limit_start,
+ now);
+
+ if(send_timeout_ms > 0 || recv_timeout_ms > 0) {
+ multistate(data, CURLM_STATE_TOOFAST);
+ if(send_timeout_ms >= recv_timeout_ms)
+ Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
+ else
+ Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
+ break;
}
/* read/write data if it is ready to do so */
@@ -1928,11 +1944,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
Curl_posttransfer(data);
/* we're no longer receiving */
- Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe);
+ Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
/* expire the new receiving pipeline head */
- if(data->easy_conn->recv_pipe->head)
- Curl_expire_latest(data->easy_conn->recv_pipe->head->ptr, 0);
+ if(data->easy_conn->recv_pipe.head)
+ Curl_expire(data->easy_conn->recv_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
/* Check if we can move pending requests to send pipe */
Curl_multi_process_pending_handles(multi);
@@ -1956,9 +1972,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(!result) {
multistate(data, CURLM_STATE_CONNECT);
rc = CURLM_CALL_MULTI_PERFORM;
- newurl = NULL; /* handed over the memory ownership to
- Curl_follow(), make sure we don't free() it
- here */
}
}
}
@@ -1972,9 +1985,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
newurl = data->req.location;
data->req.location = NULL;
result = Curl_follow(data, newurl, FOLLOW_FAKE);
- if(!result)
- newurl = NULL; /* allocation was handed over Curl_follow() */
- else
+ if(result)
stream_error = TRUE;
}
@@ -1997,7 +2008,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
CURLcode res;
/* Remove ourselves from the receive pipeline, if we are there. */
- Curl_removeHandleFromPipeline(data, data->easy_conn->recv_pipe);
+ Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
/* Check if we can move pending requests to send pipe */
Curl_multi_process_pending_handles(multi);
@@ -2073,8 +2084,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* 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);
+ Curl_removeHandleFromPipeline(data, &data->easy_conn->send_pipe);
+ Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
if(stream_error) {
/* Don't attempt to send data over a connection that timed out */
@@ -2135,7 +2146,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
struct Curl_easy *data;
CURLMcode returncode=CURLM_OK;
struct Curl_tree *t;
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -2229,8 +2240,8 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_hash_destroy(&multi->sockhash);
Curl_conncache_destroy(&multi->conn_cache);
- Curl_llist_destroy(multi->msglist, NULL);
- Curl_llist_destroy(multi->pending, NULL);
+ Curl_llist_destroy(&multi->msglist, NULL);
+ Curl_llist_destroy(&multi->pending, NULL);
/* remove all easy handles */
data = multi->easyp;
@@ -2262,8 +2273,7 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
return CURLM_OK;
}
- else
- return CURLM_BAD_HANDLE;
+ return CURLM_BAD_HANDLE;
}
/*
@@ -2282,24 +2292,23 @@ CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
*msgs_in_queue = 0; /* default to none */
- if(GOOD_MULTI_HANDLE(multi) && Curl_llist_count(multi->msglist)) {
+ if(GOOD_MULTI_HANDLE(multi) && Curl_llist_count(&multi->msglist)) {
/* there is one or more messages in the list */
struct curl_llist_element *e;
/* extract the head of the list to return */
- e = multi->msglist->head;
+ e = multi->msglist.head;
msg = e->ptr;
/* remove the extracted entry */
- Curl_llist_remove(multi->msglist, e, NULL);
+ Curl_llist_remove(&multi->msglist, e, NULL);
- *msgs_in_queue = curlx_uztosi(Curl_llist_count(multi->msglist));
+ *msgs_in_queue = curlx_uztosi(Curl_llist_count(&multi->msglist));
return &msg->extmsg;
}
- else
- return NULL;
+ return NULL;
}
/*
@@ -2394,7 +2403,7 @@ static void singlesocket(struct Curl_multi *multi,
removed. */
struct connectdata *easy_conn = data->easy_conn;
if(easy_conn) {
- if(easy_conn->recv_pipe && easy_conn->recv_pipe->size > 1) {
+ if(easy_conn->recv_pipe.size > 1) {
/* the handle should not be removed from the pipe yet */
remove_sock_from_hash = FALSE;
@@ -2403,12 +2412,12 @@ static void singlesocket(struct Curl_multi *multi,
isn't already) */
if(entry->easy == data) {
if(Curl_recvpipe_head(data, easy_conn))
- entry->easy = easy_conn->recv_pipe->head->next->ptr;
+ entry->easy = easy_conn->recv_pipe.head->next->ptr;
else
- entry->easy = easy_conn->recv_pipe->head->ptr;
+ entry->easy = easy_conn->recv_pipe.head->ptr;
}
}
- if(easy_conn->send_pipe && easy_conn->send_pipe->size > 1) {
+ if(easy_conn->send_pipe.size > 1) {
/* the handle should not be removed from the pipe yet */
remove_sock_from_hash = FALSE;
@@ -2417,9 +2426,9 @@ static void singlesocket(struct Curl_multi *multi,
isn't already) */
if(entry->easy == data) {
if(Curl_sendpipe_head(data, easy_conn))
- entry->easy = easy_conn->send_pipe->head->next->ptr;
+ entry->easy = easy_conn->send_pipe.head->next->ptr;
else
- entry->easy = easy_conn->send_pipe->head->ptr;
+ entry->easy = easy_conn->send_pipe.head->ptr;
}
}
/* Don't worry about overwriting recv_pipe head with send_pipe_head,
@@ -2475,8 +2484,6 @@ void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
}
}
-
-
/*
* add_next_timeout()
*
@@ -2489,20 +2496,23 @@ void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
* The splay tree only has each sessionhandle as a single node and the nearest
* timeout is used to sort it on.
*/
-static CURLMcode add_next_timeout(struct timeval now,
+static CURLMcode add_next_timeout(struct curltime now,
struct Curl_multi *multi,
struct Curl_easy *d)
{
- struct timeval *tv = &d->state.expiretime;
- struct curl_llist *list = d->state.timeoutlist;
+ struct curltime *tv = &d->state.expiretime;
+ struct curl_llist *list = &d->state.timeoutlist;
struct curl_llist_element *e;
+ struct time_node *node = NULL;
/* move over the timeout list for this specific handle and remove all
timeouts that are now passed tense and store the next pending
timeout in *tv */
for(e = list->head; e;) {
struct curl_llist_element *n = e->next;
- time_t diff = curlx_tvdiff(*(struct timeval *)e->ptr, now);
+ time_t diff;
+ node = (struct time_node *)e->ptr;
+ diff = curlx_tvdiff(node->time, now);
if(diff <= 0)
/* remove outdated entry */
Curl_llist_remove(list, e, NULL);
@@ -2520,12 +2530,10 @@ static CURLMcode add_next_timeout(struct timeval now,
}
else {
/* copy the first entry to 'tv' */
- memcpy(tv, e->ptr, sizeof(*tv));
-
- /* remove first entry from list */
- Curl_llist_remove(list, e, NULL);
+ memcpy(tv, &node->time, sizeof(*tv));
- /* insert this node again into the splay */
+ /* Insert this node again into the splay. Keep the timer in the list in
+ case we need to recompute future timers. */
multi->timetree = Curl_splayinsert(*tv, multi->timetree,
&d->state.timenode);
}
@@ -2541,7 +2549,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
CURLMcode result = CURLM_OK;
struct Curl_easy *data = NULL;
struct Curl_tree *t;
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
if(checkall) {
/* *perform() deals with running_handles on its own */
@@ -2560,7 +2568,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
/* or should we fall-through and do the timer-based stuff? */
return result;
}
- else if(s != CURL_SOCKET_TIMEOUT) {
+ if(s != CURL_SOCKET_TIMEOUT) {
struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
@@ -2585,13 +2593,11 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
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 &&
- data->easy_conn->send_pipe->head)
- data = data->easy_conn->send_pipe->head->ptr;
+ 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 &&
- data->easy_conn->recv_pipe->head)
- data = data->easy_conn->recv_pipe->head->ptr;
+ data->easy_conn->recv_pipe.head)
+ data = data->easy_conn->recv_pipe.head->ptr;
}
if(data->easy_conn &&
@@ -2769,11 +2775,11 @@ CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
static CURLMcode multi_timeout(struct Curl_multi *multi,
long *timeout_ms)
{
- static struct timeval tv_zero = {0, 0};
+ static struct curltime tv_zero = {0, 0};
if(multi->timetree) {
/* we have a tree of expire times */
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
/* splay the lowest to the bottom */
multi->timetree = Curl_splay(tv_zero, multi->timetree);
@@ -2825,7 +2831,7 @@ static int update_timer(struct Curl_multi *multi)
return -1;
}
if(timeout_ms < 0) {
- static const struct timeval none={0, 0};
+ static const struct curltime none={0, 0};
if(Curl_splaycomparekeys(none, multi->timer_lastcall)) {
multi->timer_lastcall = none;
/* there's no timeout now but there was one previously, tell the app to
@@ -2848,17 +2854,23 @@ static int update_timer(struct Curl_multi *multi)
}
/*
- * multi_freetimeout()
+ * multi_deltimeout()
*
- * Callback used by the llist system when a single timeout list entry is
- * destroyed.
+ * Remove a given timestamp from the list of timeouts.
*/
-static void multi_freetimeout(void *user, void *entryptr)
+static void
+multi_deltimeout(struct Curl_easy *data, expire_id eid)
{
- (void)user;
-
- /* the entry was plain malloc()'ed */
- free(entryptr);
+ struct curl_llist_element *e;
+ struct curl_llist *timeoutlist = &data->state.timeoutlist;
+ /* find and remove the specific node from the list */
+ for(e = timeoutlist->head; e; e = e->next) {
+ struct time_node *n = (struct time_node *)e->ptr;
+ if(n->eid == eid) {
+ Curl_llist_remove(timeoutlist, e, NULL);
+ return;
+ }
+ }
}
/*
@@ -2869,25 +2881,28 @@ static void multi_freetimeout(void *user, void *entryptr)
*
*/
static CURLMcode
-multi_addtimeout(struct curl_llist *timeoutlist,
- struct timeval *stamp)
+multi_addtimeout(struct Curl_easy *data,
+ struct curltime *stamp,
+ expire_id eid)
{
struct curl_llist_element *e;
- struct timeval *timedup;
+ struct time_node *node;
struct curl_llist_element *prev = NULL;
+ size_t n;
+ struct curl_llist *timeoutlist = &data->state.timeoutlist;
- timedup = malloc(sizeof(*timedup));
- if(!timedup)
- return CURLM_OUT_OF_MEMORY;
+ node = &data->state.expires[eid];
- /* copy the timestamp */
- memcpy(timedup, stamp, sizeof(*timedup));
+ /* copy the timestamp and id */
+ memcpy(&node->time, stamp, sizeof(*stamp));
+ node->eid = eid; /* also marks it as in use */
- if(Curl_llist_count(timeoutlist)) {
+ n = Curl_llist_count(timeoutlist);
+ if(n) {
/* find the correct spot in the list */
for(e = timeoutlist->head; e; e = e->next) {
- struct timeval *checktime = e->ptr;
- time_t diff = curlx_tvdiff(*checktime, *timedup);
+ struct time_node *check = (struct time_node *)e->ptr;
+ time_t diff = curlx_tvdiff(check->time, node->time);
if(diff > 0)
break;
prev = e;
@@ -2897,11 +2912,7 @@ multi_addtimeout(struct curl_llist *timeoutlist,
/* else
this is the first timeout on the list */
- if(!Curl_llist_insert_next(timeoutlist, prev, timedup)) {
- free(timedup);
- return CURLM_OUT_OF_MEMORY;
- }
-
+ Curl_llist_insert_next(timeoutlist, prev, node, &node->list);
return CURLM_OK;
}
@@ -2913,44 +2924,51 @@ multi_addtimeout(struct curl_llist *timeoutlist,
*
* The timeout will be added to a queue of timeouts if it defines a moment in
* time that is later than the current head of queue.
+ *
+ * Expire replaces a former timeout using the same id if already set.
*/
-void Curl_expire(struct Curl_easy *data, time_t milli)
+void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
{
struct Curl_multi *multi = data->multi;
- struct timeval *nowp = &data->state.expiretime;
+ struct curltime *nowp = &data->state.expiretime;
int rc;
- struct timeval set;
+ struct curltime set;
/* this is only interesting while there is still an associated multi struct
remaining! */
if(!multi)
return;
+ DEBUGASSERT(id < EXPIRE_LAST);
+
set = Curl_tvnow();
- set.tv_sec += (long)(milli/1000);
- set.tv_usec += (milli%1000)*1000;
+ set.tv_sec += milli/1000;
+ set.tv_usec += (unsigned int)(milli%1000)*1000;
if(set.tv_usec >= 1000000) {
set.tv_sec++;
set.tv_usec -= 1000000;
}
+ /* Remove any timer with the same id just in case. */
+ multi_deltimeout(data, id);
+
+ /* Add it to the timer list. It must stay in the list until it has expired
+ in case we need to recompute the minimum timer later. */
+ multi_addtimeout(data, &set, id);
+
if(nowp->tv_sec || nowp->tv_usec) {
/* This means that the struct is added as a node in the splay tree.
Compare if the new time is earlier, and only remove-old/add-new if it
is. */
time_t diff = curlx_tvdiff(set, *nowp);
+
if(diff > 0) {
- /* the new expire time was later so just add it to the queue
- and get out */
- multi_addtimeout(data->state.timeoutlist, &set);
+ /* The current splay tree entry is sooner than this new expiry time.
+ We don't need to update our splay tree entry. */
return;
}
- /* the new time is newer than the presently set one, so add the current
- to the queue and update the head */
- multi_addtimeout(data->state.timeoutlist, nowp);
-
/* Since this is an updated time, we must remove the previous entry from
the splay tree first and then re-add the new value */
rc = Curl_splayremovebyaddr(multi->timetree,
@@ -2960,6 +2978,8 @@ void Curl_expire(struct Curl_easy *data, time_t milli)
infof(data, "Internal error removing splay node = %d\n", rc);
}
+ /* Indicate that we are in the splay tree and insert the new timer expiry
+ value since it is our local minimum. */
*nowp = set;
data->state.timenode.payload = data;
multi->timetree = Curl_splayinsert(*nowp, multi->timetree,
@@ -2967,46 +2987,17 @@ void Curl_expire(struct Curl_easy *data, time_t milli)
}
/*
- * Curl_expire_latest()
+ * Curl_expire_done()
*
- * This is like Curl_expire() but will only add a timeout node to the list of
- * timers if there is no timeout that will expire before the given time.
- *
- * Use this function if the code logic risks calling this function many times
- * or if there's no particular conditional wait in the code for this specific
- * time-out period to expire.
+ * Removes the expire timer. Marks it as done.
*
*/
-void Curl_expire_latest(struct Curl_easy *data, time_t milli)
+void Curl_expire_done(struct Curl_easy *data, expire_id id)
{
- struct timeval *expire = &data->state.expiretime;
-
- struct timeval set;
-
- set = Curl_tvnow();
- set.tv_sec += (long)(milli / 1000);
- set.tv_usec += (milli % 1000) * 1000;
-
- if(set.tv_usec >= 1000000) {
- set.tv_sec++;
- set.tv_usec -= 1000000;
- }
-
- if(expire->tv_sec || expire->tv_usec) {
- /* This means that the struct is added as a node in the splay tree.
- Compare if the new time is earlier, and only remove-old/add-new if it
- is. */
- time_t diff = curlx_tvdiff(set, *expire);
- if(diff > 0)
- /* the new expire time was later than the top time, so just skip this */
- return;
- }
-
- /* Just add the timeout like normal */
- Curl_expire(data, milli);
+ /* remove the timer, if there */
+ multi_deltimeout(data, id);
}
-
/*
* Curl_expire_clear()
*
@@ -3015,7 +3006,7 @@ void Curl_expire_latest(struct Curl_easy *data, time_t milli)
void Curl_expire_clear(struct Curl_easy *data)
{
struct Curl_multi *multi = data->multi;
- struct timeval *nowp = &data->state.expiretime;
+ struct curltime *nowp = &data->state.expiretime;
int rc;
/* this is only interesting while there is still an associated multi struct
@@ -3026,7 +3017,7 @@ void Curl_expire_clear(struct Curl_easy *data)
if(nowp->tv_sec || nowp->tv_usec) {
/* Since this is an cleared time, we must remove the previous entry from
the splay tree */
- struct curl_llist *list = data->state.timeoutlist;
+ struct curl_llist *list = &data->state.timeoutlist;
rc = Curl_splayremovebyaddr(multi->timetree,
&data->state.timenode,
@@ -3035,8 +3026,9 @@ void Curl_expire_clear(struct Curl_easy *data)
infof(data, "Internal error clearing splay node = %d\n", rc);
/* flush the timeout list too */
- while(list->size > 0)
+ while(list->size > 0) {
Curl_llist_remove(list, list->tail, NULL);
+ }
#ifdef DEBUGBUILD
infof(data, "Expire cleared\n");
@@ -3086,17 +3078,17 @@ curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
{
- return multi->pipelining_site_bl;
+ return &multi->pipelining_site_bl;
}
struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
{
- return multi->pipelining_server_bl;
+ return &multi->pipelining_server_bl;
}
void Curl_multi_process_pending_handles(struct Curl_multi *multi)
{
- struct curl_llist_element *e = multi->pending->head;
+ struct curl_llist_element *e = multi->pending.head;
while(e) {
struct Curl_easy *data = e->ptr;
@@ -3106,10 +3098,10 @@ void Curl_multi_process_pending_handles(struct Curl_multi *multi)
multistate(data, CURLM_STATE_CONNECT);
/* Remove this node from the list */
- Curl_llist_remove(multi->pending, e, NULL);
+ Curl_llist_remove(&multi->pending, e, NULL);
/* Make sure that the handle will be processed soonish. */
- Curl_expire_latest(data, 0);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
}
e = next; /* operate on next handle */
diff --git a/lib/multihandle.h b/lib/multihandle.h
index 0b78de94..40575394 100644
--- a/lib/multihandle.h
+++ b/lib/multihandle.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -25,6 +25,7 @@
#include "conncache.h"
struct Curl_message {
+ struct curl_llist_element list;
/* the 'CURLMsg' is the part that is visible to the external user */
struct CURLMsg extmsg;
};
@@ -80,10 +81,10 @@ struct Curl_multi {
int num_alive; /* amount of easy handles that are added but have not yet
reached COMPLETE state */
- struct curl_llist *msglist; /* a list of messages from completed transfers */
+ struct curl_llist msglist; /* a list of messages from completed transfers */
- struct curl_llist *pending; /* Curl_easys that are in the
- CURLM_STATE_CONNECT_PEND state */
+ struct curl_llist pending; /* Curl_easys that are in the
+ CURLM_STATE_CONNECT_PEND state */
/* callback function and user data pointer for the *socket() API */
curl_socket_callback socket_cb;
@@ -138,16 +139,16 @@ struct Curl_multi {
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_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 */
+ 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 timeval timer_lastcall; /* the fixed time for the timeout for the
+ struct curltime timer_lastcall; /* the fixed time for the timeout for the
previous callback */
};
diff --git a/lib/multiif.h b/lib/multiif.h
index e5de1fc4..a877571a 100644
--- a/lib/multiif.h
+++ b/lib/multiif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -25,9 +25,10 @@
/*
* Prototypes for library-wide functions provided by multi.c
*/
-void Curl_expire(struct Curl_easy *data, time_t milli);
+
+void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
-void Curl_expire_latest(struct Curl_easy *data, time_t milli);
+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);
diff --git a/lib/netrc.c b/lib/netrc.c
index 996711d1..6e4858b3 100644
--- a/lib/netrc.c
+++ b/lib/netrc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -119,6 +119,9 @@ int Curl_parsenetrc(const char *host,
while(!done && fgets(netrcbuffer, netrcbuffsize, file)) {
tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
+ if(tok && *tok == '#')
+ /* treat an initial hash as a comment line */
+ continue;
while(!done && tok) {
if((*loginp && **loginp) && (*passwordp && **passwordp)) {
diff --git a/lib/non-ascii.c b/lib/non-ascii.c
index 2f5de4c6..ae009703 100644
--- a/lib/non-ascii.c
+++ b/lib/non-ascii.c
@@ -98,19 +98,17 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
/* do the translation ourselves */
char *input_ptr, *output_ptr;
size_t in_bytes, out_bytes, rc;
- int error;
/* open an iconv conversion descriptor if necessary */
if(data->outbound_cd == (iconv_t)-1) {
data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
CURL_ICONV_CODESET_OF_HOST);
if(data->outbound_cd == (iconv_t)-1) {
- error = ERRNO;
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_NETWORK,
CURL_ICONV_CODESET_OF_HOST,
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
}
@@ -120,10 +118,9 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
rc = iconv(data->outbound_cd, (const char **)&input_ptr, &in_bytes,
&output_ptr, &out_bytes);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
- error = ERRNO;
failf(data,
"The Curl_convert_to_network iconv call failed with errno %i: %s",
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
#else
@@ -158,19 +155,17 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
/* do the translation ourselves */
char *input_ptr, *output_ptr;
size_t in_bytes, out_bytes, rc;
- int error;
/* open an iconv conversion descriptor if necessary */
if(data->inbound_cd == (iconv_t)-1) {
data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
CURL_ICONV_CODESET_OF_NETWORK);
if(data->inbound_cd == (iconv_t)-1) {
- error = ERRNO;
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_HOST,
CURL_ICONV_CODESET_OF_NETWORK,
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
}
@@ -180,10 +175,9 @@ CURLcode Curl_convert_from_network(struct Curl_easy *data,
rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
&output_ptr, &out_bytes);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
- error = ERRNO;
failf(data,
"Curl_convert_from_network iconv call failed with errno %i: %s",
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
#else
@@ -219,19 +213,17 @@ CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
const char *input_ptr;
char *output_ptr;
size_t in_bytes, out_bytes, rc;
- int error;
/* open an iconv conversion descriptor if necessary */
if(data->utf8_cd == (iconv_t)-1) {
data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
CURL_ICONV_CODESET_FOR_UTF8);
if(data->utf8_cd == (iconv_t)-1) {
- error = ERRNO;
failf(data,
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
CURL_ICONV_CODESET_OF_HOST,
CURL_ICONV_CODESET_FOR_UTF8,
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
}
@@ -241,10 +233,9 @@ CURLcode Curl_convert_from_utf8(struct Curl_easy *data,
rc = iconv(data->utf8_cd, &input_ptr, &in_bytes,
&output_ptr, &out_bytes);
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
- error = ERRNO;
failf(data,
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
- error, strerror(error));
+ errno, strerror(errno));
return CURLE_CONV_FAILED;
}
if(output_ptr < input_ptr) {
diff --git a/lib/nonblock.c b/lib/nonblock.c
index b764278a..5959281e 100644
--- a/lib/nonblock.c
+++ b/lib/nonblock.c
@@ -58,8 +58,7 @@ int curlx_nonblock(curl_socket_t sockfd, /* operate on this */
flags = sfcntl(sockfd, F_GETFL, 0);
if(nonblock)
return sfcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
- else
- return sfcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
+ return sfcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
#elif defined(HAVE_IOCTL_FIONBIO)
diff --git a/lib/objnames.inc b/lib/objnames.inc
index b895528a..6a5b2a83 100644
--- a/lib/objnames.inc
+++ b/lib/objnames.inc
@@ -5,7 +5,7 @@
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
-# * Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 2012 - 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
@@ -36,7 +36,7 @@
# file name that may be longer than 10 characters, or not, into a string
# with at most 10 characters which may be used as an OS/400 object name.
#
-# This function might not be universally usefull, nor we care about it.
+# This function might not be universally useful, nor we care about it.
#
# It is intended to be used with libcurl's (*.c) source file names, so
# dependency on libcurl's source file naming scheme is acceptable and
diff --git a/lib/openldap.c b/lib/openldap.c
index 4b8cfb9c..369309cf 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -85,6 +85,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* perform_getsock */
ldap_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
PROTOPT_NONE /* flags */
@@ -110,6 +111,7 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* perform_getsock */
ldap_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
CURLPROTO_LDAP, /* protocol */
PROTOPT_SSL /* flags */
diff --git a/lib/parsedate.c b/lib/parsedate.c
index 3c783be4..609fd536 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -404,12 +404,12 @@ static int parsedate(const char *date, time_t *output)
int error;
int old_errno;
- old_errno = ERRNO;
- SET_ERRNO(0);
+ old_errno = errno;
+ errno = 0;
lval = strtol(date, &end, 10);
- error = ERRNO;
- if(error != old_errno)
- SET_ERRNO(old_errno);
+ error = errno;
+ if(errno != old_errno)
+ errno = old_errno;
if(error)
return PARSEDATE_FAIL;
diff --git a/lib/pingpong.c b/lib/pingpong.c
index 7a993572..5ed79b71 100644
--- a/lib/pingpong.c
+++ b/lib/pingpong.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -152,7 +152,7 @@ void Curl_pp_init(struct pingpong *pp)
*
* Curl_pp_vsendf()
*
- * Send the formated string as a command to a pingpong server. Note that
+ * Send the formatted string as a command to a pingpong server. Note that
* the string should not have any CRLF appended, as this function will
* append the necessary things itself.
*
@@ -239,7 +239,7 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
*
* Curl_pp_sendf()
*
- * Send the formated string as a command to a pingpong server. Note that
+ * Send the formatted string as a command to a pingpong server. Note that
* the string should not have any CRLF appended, as this function will
* append the necessary things itself.
*
@@ -286,7 +286,8 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
/* number of bytes in the current line, so far */
perline = (ssize_t)(ptr-pp->linestart_resp);
- while((pp->nread_resp<BUFSIZE) && (keepon && !result)) {
+ while((pp->nread_resp < (size_t)data->set.buffer_size) &&
+ (keepon && !result)) {
if(pp->cache) {
/* we had data in the "cache", copy that instead of doing an actual
@@ -296,7 +297,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
* it would have been populated with something of size int to begin
* with, even though its datatype may be larger than an int.
*/
- DEBUGASSERT((ptr+pp->cache_size) <= (buf+BUFSIZE+1));
+ DEBUGASSERT((ptr+pp->cache_size) <= (buf+data->set.buffer_size+1));
memcpy(ptr, pp->cache, pp->cache_size);
gotbytes = (ssize_t)pp->cache_size;
free(pp->cache); /* free the cache */
@@ -308,8 +309,10 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
enum protection_level prot = conn->data_prot;
conn->data_prot = PROT_CLEAR;
#endif
- DEBUGASSERT((ptr+BUFSIZE-pp->nread_resp) <= (buf+BUFSIZE+1));
- result = Curl_read(conn, sockfd, ptr, BUFSIZE-pp->nread_resp,
+ DEBUGASSERT((ptr + data->set.buffer_size - pp->nread_resp) <=
+ (buf + data->set.buffer_size + 1));
+ result = Curl_read(conn, sockfd, ptr,
+ data->set.buffer_size - pp->nread_resp,
&gotbytes);
#ifdef HAVE_GSSAPI
DEBUGASSERT(prot > PROT_NONE && prot < PROT_LAST);
@@ -402,7 +405,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
}
else if(keepon) {
- if((perline == gotbytes) && (gotbytes > BUFSIZE/2)) {
+ if((perline == gotbytes) && (gotbytes > data->set.buffer_size/2)) {
/* We got an excessive line without newlines and we need to deal
with it. We keep the first bytes of the line then we throw
away the rest. */
@@ -414,7 +417,7 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
interested in the first piece */
clipamount = 40;
}
- else if(pp->nread_resp > BUFSIZE/2) {
+ else if(pp->nread_resp > (size_t)data->set.buffer_size/2) {
/* We got a large chunk of data and there's potentially still
trailing data to take care of, so we put any such part in the
"cache", clear the buffer to make space and restart. */
diff --git a/lib/pingpong.h b/lib/pingpong.h
index 500100ae..a2c8ff59 100644
--- a/lib/pingpong.h
+++ b/lib/pingpong.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -58,7 +58,7 @@ struct pingpong {
server */
size_t sendleft; /* number of bytes left to send from the sendthis buffer */
size_t sendsize; /* total size of the sendthis buffer */
- struct timeval response; /* set to Curl_tvnow() when a command has been sent
+ struct curltime response; /* set to Curl_tvnow() when a command has been sent
off, used to time-out response reading */
long response_time; /* When no timeout is given, this is the amount of
milliseconds we await for a server response. */
@@ -95,7 +95,7 @@ time_t Curl_pp_state_timeout(struct pingpong *pp);
*
* Curl_pp_sendf()
*
- * Send the formated string as a command to a pingpong server. Note that
+ * Send the formatted string as a command to a pingpong server. Note that
* the string should not have any CRLF appended, as this function will
* append the necessary things itself.
*
@@ -108,7 +108,7 @@ CURLcode Curl_pp_sendf(struct pingpong *pp,
*
* Curl_pp_vsendf()
*
- * Send the formated string as a command to a pingpong server. Note that
+ * Send the formatted string as a command to a pingpong server. Note that
* the string should not have any CRLF appended, as this function will
* append the necessary things itself.
*
diff --git a/lib/pipeline.c b/lib/pipeline.c
index 40a5e82d..4d41b041 100644
--- a/lib/pipeline.c
+++ b/lib/pipeline.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2013, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2013-2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 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
@@ -38,16 +38,15 @@
#include "memdebug.h"
struct site_blacklist_entry {
- char *hostname;
+ 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;
-
- Curl_safefree(entry->hostname);
free(entry);
}
@@ -69,8 +68,8 @@ bool Curl_pipeline_penalized(struct Curl_easy *data,
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 && conn->recv_pipe->head) {
- struct Curl_easy *recv_handle = conn->recv_pipe->head->ptr;
+ if(conn->recv_pipe.head) {
+ struct Curl_easy *recv_handle = conn->recv_pipe.head->ptr;
recv_size = recv_handle->req.size;
@@ -94,8 +93,8 @@ bool Curl_pipeline_penalized(struct Curl_easy *data,
static CURLcode addHandleToPipeline(struct Curl_easy *data,
struct curl_llist *pipeline)
{
- if(!Curl_llist_insert_next(pipeline, pipeline->tail, data))
- return CURLE_OUT_OF_MEMORY;
+ Curl_llist_insert_next(pipeline, pipeline->tail, data,
+ &data->pipeline_queue);
return CURLE_OK;
}
@@ -103,18 +102,18 @@ static CURLcode addHandleToPipeline(struct Curl_easy *data,
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_element *sendhead = conn->send_pipe.head;
struct curl_llist *pipeline;
CURLcode result;
- pipeline = conn->send_pipe;
+ pipeline = &conn->send_pipe;
result = addHandleToPipeline(handle, pipeline);
- if(pipeline == conn->send_pipe && sendhead != conn->send_pipe->head) {
+ if(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);
+ Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
}
#if 0 /* enable for pipeline debugging */
@@ -135,21 +134,21 @@ void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle,
{
struct curl_llist_element *curr;
- curr = conn->send_pipe->head;
+ 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);
+ Curl_llist_move(&conn->send_pipe, curr,
+ &conn->recv_pipe, conn->recv_pipe.tail);
- if(conn->send_pipe->head) {
+ 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);
+ (void *)conn->send_pipe.head->ptr);
#endif
- Curl_expire(conn->send_pipe->head->ptr, 0);
+ Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
}
/* The receiver's list is not really interesting here since either this
@@ -191,36 +190,28 @@ bool Curl_pipeline_site_blacklisted(struct Curl_easy *handle,
}
CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
- struct curl_llist **list_ptr)
+ struct curl_llist *list)
{
- struct curl_llist *old_list = *list_ptr;
- struct curl_llist *new_list = NULL;
+ /* Free the old list */
+ if(list->size)
+ Curl_llist_destroy(list, NULL);
if(sites) {
- new_list = Curl_llist_alloc((curl_llist_dtor) site_blacklist_llist_dtor);
- if(!new_list)
- return CURLM_OUT_OF_MEMORY;
+ Curl_llist_init(list, (curl_llist_dtor) site_blacklist_llist_dtor);
/* Parse the URLs and populate the list */
while(*sites) {
- char *hostname;
char *port;
struct site_blacklist_entry *entry;
- hostname = strdup(*sites);
- if(!hostname) {
- Curl_llist_destroy(new_list, NULL);
- return CURLM_OUT_OF_MEMORY;
- }
-
- entry = malloc(sizeof(struct site_blacklist_entry));
+ entry = malloc(sizeof(struct site_blacklist_entry) + strlen(*sites));
if(!entry) {
- free(hostname);
- Curl_llist_destroy(new_list, NULL);
+ Curl_llist_destroy(list, NULL);
return CURLM_OUT_OF_MEMORY;
}
+ strcpy(entry->hostname, *sites);
- port = strchr(hostname, ':');
+ port = strchr(entry->hostname, ':');
if(port) {
*port = '\0';
port++;
@@ -231,51 +222,35 @@ CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
entry->port = 80;
}
- entry->hostname = hostname;
-
- if(!Curl_llist_insert_next(new_list, new_list->tail, entry)) {
- site_blacklist_llist_dtor(NULL, entry);
- Curl_llist_destroy(new_list, NULL);
- return CURLM_OUT_OF_MEMORY;
- }
-
+ Curl_llist_insert_next(list, list->tail, entry, &entry->list);
sites++;
}
}
- /* Free the old list */
- if(old_list) {
- Curl_llist_destroy(old_list, NULL);
- }
-
- /* This might be NULL if sites == NULL, i.e the blacklist is cleared */
- *list_ptr = new_list;
-
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 *blacklist =
+ struct curl_llist *list =
Curl_multi_pipelining_server_bl(handle->multi);
- if(blacklist) {
- struct curl_llist_element *curr;
-
- curr = blacklist->head;
- while(curr) {
- char *bl_server_name;
-
- bl_server_name = curr->ptr;
- if(strncasecompare(bl_server_name, server_name,
- strlen(bl_server_name))) {
- infof(handle, "Server %s is blacklisted\n", server_name);
- return TRUE;
- }
- curr = curr->next;
+ 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));
@@ -284,43 +259,32 @@ bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
}
CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
- struct curl_llist **list_ptr)
+ struct curl_llist *list)
{
- struct curl_llist *old_list = *list_ptr;
- struct curl_llist *new_list = NULL;
+ /* Free the old list */
+ if(list->size)
+ Curl_llist_destroy(list, NULL);
if(servers) {
- new_list = Curl_llist_alloc((curl_llist_dtor) server_blacklist_llist_dtor);
- if(!new_list)
- return CURLM_OUT_OF_MEMORY;
+ Curl_llist_init(list, (curl_llist_dtor) server_blacklist_llist_dtor);
/* Parse the URLs and populate the list */
while(*servers) {
- char *server_name;
-
- server_name = strdup(*servers);
- if(!server_name) {
- Curl_llist_destroy(new_list, NULL);
- return CURLM_OUT_OF_MEMORY;
- }
+ struct blacklist_node *n;
+ size_t len = strlen(*servers);
- if(!Curl_llist_insert_next(new_list, new_list->tail, server_name)) {
- Curl_llist_destroy(new_list, NULL);
- Curl_safefree(server_name);
+ 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++;
}
}
- /* Free the old list */
- if(old_list) {
- Curl_llist_destroy(old_list, NULL);
- }
-
- /* This might be NULL if sites == NULL, i.e the blacklist is cleared */
- *list_ptr = new_list;
return CURLM_OK;
}
@@ -340,14 +304,14 @@ static bool pipe_head(struct Curl_easy *data,
bool Curl_recvpipe_head(struct Curl_easy *data,
struct connectdata *conn)
{
- return pipe_head(data, conn->recv_pipe);
+ 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);
+ return pipe_head(data, &conn->send_pipe);
}
diff --git a/lib/pipeline.h b/lib/pipeline.h
index a64f7102..413ba31a 100644
--- a/lib/pipeline.h
+++ b/lib/pipeline.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * 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
@@ -34,13 +34,13 @@ 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);
+ 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);
+ struct curl_llist *list_ptr);
bool Curl_pipeline_checkget_write(struct Curl_easy *data,
struct connectdata *conn);
diff --git a/lib/pop3.c b/lib/pop3.c
index 9bb691c9..5792a4a6 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -125,9 +125,11 @@ const struct Curl_handler Curl_handler_pop3 = {
ZERO_NULL, /* perform_getsock */
pop3_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_POP3, /* defport */
CURLPROTO_POP3, /* protocol */
- PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
+ PROTOPT_URLOPTIONS
};
#ifdef USE_SSL
@@ -150,65 +152,14 @@ const struct Curl_handler Curl_handler_pop3s = {
ZERO_NULL, /* perform_getsock */
pop3_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_POP3S, /* defport */
CURLPROTO_POP3S, /* protocol */
PROTOPT_CLOSEACTION | PROTOPT_SSL
- | PROTOPT_NOURLQUERY /* flags */
+ | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
#endif
-#ifndef CURL_DISABLE_HTTP
-/*
- * HTTP-proxyed POP3 protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_pop3_proxy = {
- "POP3", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_POP3, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-
-#ifdef USE_SSL
-/*
- * HTTP-proxyed POP3S protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_pop3s_proxy = {
- "POP3S", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_POP3S, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-#endif
-#endif
-
/* SASL parameters for the pop3 protocol */
static const struct SASLproto saslpop3 = {
"pop", /* The service name */
@@ -799,7 +750,7 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
if(pop3code != '+') {
if(data->set.use_ssl != CURLUSESSL_TRY) {
- failf(data, "STARTTLS denied. %c", pop3code);
+ failf(data, "STARTTLS denied");
result = CURLE_USE_SSL_FAILED;
}
else
@@ -1354,31 +1305,6 @@ static CURLcode pop3_setup_connection(struct connectdata *conn)
/* Clear the TLS upgraded flag */
conn->tls_upgraded = FALSE;
-
- /* Set up the proxy if necessary */
- if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
- /* Unless we have asked to tunnel POP3 operations through the proxy, we
- switch and use HTTP operations only */
-#ifndef CURL_DISABLE_HTTP
- if(conn->handler == &Curl_handler_pop3)
- conn->handler = &Curl_handler_pop3_proxy;
- else {
-#ifdef USE_SSL
- conn->handler = &Curl_handler_pop3s_proxy;
-#else
- failf(data, "POP3S not supported!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
- /* set it up as an HTTP connection instead */
- return conn->handler->setup_connection(conn);
-#else
- failf(data, "POP3 over http proxy requires HTTP support built-in!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
data->state.path++; /* don't include the initial slash */
return CURLE_OK;
diff --git a/lib/progress.c b/lib/progress.c
index 60627b2a..740ff288 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -152,18 +152,22 @@ int Curl_pgrsDone(struct connectdata *conn)
/* reset all times except redirect, and reset the known transfer sizes */
void Curl_pgrsResetTimesSizes(struct Curl_easy *data)
{
- data->progress.t_nslookup = 0.0;
- data->progress.t_connect = 0.0;
- data->progress.t_pretransfer = 0.0;
- data->progress.t_starttransfer = 0.0;
+ data->progress.t_nslookup = 0;
+ data->progress.t_connect = 0;
+ data->progress.t_pretransfer = 0;
+ data->progress.t_starttransfer = 0;
Curl_pgrsSetDownloadSize(data, -1);
Curl_pgrsSetUploadSize(data, -1);
}
+/*
+ * @unittest: 1399
+ */
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
+ time_t *delta = NULL;
switch(timer) {
default:
@@ -178,38 +182,48 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
/* This is set at the start of each single fetch */
data->progress.t_startsingle = now;
break;
-
case TIMER_STARTACCEPT:
- data->progress.t_acceptdata = Curl_tvnow();
+ data->progress.t_acceptdata = now;
break;
-
case TIMER_NAMELOOKUP:
- data->progress.t_nslookup =
- Curl_tvdiff_secs(now, data->progress.t_startsingle);
+ delta = &data->progress.t_nslookup;
break;
case TIMER_CONNECT:
- data->progress.t_connect =
- Curl_tvdiff_secs(now, data->progress.t_startsingle);
+ delta = &data->progress.t_connect;
break;
case TIMER_APPCONNECT:
- data->progress.t_appconnect =
- Curl_tvdiff_secs(now, data->progress.t_startsingle);
+ delta = &data->progress.t_appconnect;
break;
case TIMER_PRETRANSFER:
- data->progress.t_pretransfer =
- Curl_tvdiff_secs(now, data->progress.t_startsingle);
+ delta = &data->progress.t_pretransfer;
break;
case TIMER_STARTTRANSFER:
- data->progress.t_starttransfer =
- Curl_tvdiff_secs(now, data->progress.t_startsingle);
- break;
+ delta = &data->progress.t_starttransfer;
+ /* prevent updating t_starttransfer unless:
+ * 1) this is the first time we're setting t_starttransfer
+ * 2) a redirect has occurred since the last time t_starttransfer was set
+ * This prevents repeated invocations of the function from incorrectly
+ * changing the t_starttransfer time.
+ */
+ if (*delta > data->progress.t_redirect) {
+ return;
+ }
+ else {
+ break;
+ }
case TIMER_POSTRANSFER:
/* this is the normal end-of-transfer thing */
break;
case TIMER_REDIRECT:
- data->progress.t_redirect = Curl_tvdiff_secs(now, data->progress.start);
+ data->progress.t_redirect = Curl_tvdiff_us(now, data->progress.start);
break;
}
+ if(delta) {
+ time_t us = Curl_tvdiff_us(now, data->progress.t_startsingle);
+ if(!us)
+ us++; /* make sure at least one microsecond passed */
+ *delta = us;
+ }
}
void Curl_pgrsStartNow(struct Curl_easy *data)
@@ -229,16 +243,16 @@ void Curl_pgrsStartNow(struct Curl_easy *data)
* need to wait until we're back under the speed limit, if needed.
*
* The way it works is by having a "starting point" (time & amount of data
- * transfered by then) used in the speed computation, to be used instead of the
- * start of the transfer.
- * This starting point is regularly moved as transfer goes on, to keep getting
- * accurate values (instead of average over the entire tranfer).
+ * transferred by then) used in the speed computation, to be used instead of
+ * the start of the transfer. This starting point is regularly moved as
+ * transfer goes on, to keep getting accurate values (instead of average over
+ * the entire transfer).
*
- * This function takes the current amount of data transfered, the amount at the
- * starting point, the limit (in bytes/s), the time of the starting point and
- * the current time.
+ * This function takes the current amount of data transferred, the amount at
+ * the starting point, the limit (in bytes/s), the time of the starting point
+ * and the current time.
*
- * Returns -1 if no waiting is needed (not enough data transfered since
+ * Returns -1 if no waiting is needed (not enough data transferred since
* starting point yet), 0 when no waiting is needed but the starting point
* should be reset (to current), or the number of milliseconds to wait to get
* back under the speed limit.
@@ -246,8 +260,8 @@ void Curl_pgrsStartNow(struct Curl_easy *data)
long Curl_pgrsLimitWaitTime(curl_off_t cursize,
curl_off_t startsize,
curl_off_t limit,
- struct timeval start,
- struct timeval now)
+ struct curltime start,
+ struct curltime now)
{
curl_off_t size = cursize - startsize;
time_t minimum;
@@ -267,13 +281,13 @@ long Curl_pgrsLimitWaitTime(curl_off_t cursize,
if(actual < minimum)
/* this is a conversion on some systems (64bit time_t => 32bit long) */
return (long)(minimum - actual);
- else
- return 0;
+
+ return 0;
}
void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
{
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
data->progress.downloaded = size;
@@ -291,7 +305,7 @@ void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size)
{
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
data->progress.uploaded = size;
@@ -337,7 +351,7 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
*/
int Curl_pgrsUpdate(struct connectdata *conn)
{
- struct timeval now;
+ struct curltime now;
int result;
char max5[6][10];
curl_off_t dlpercen=0;
@@ -361,18 +375,18 @@ int Curl_pgrsUpdate(struct connectdata *conn)
now = Curl_tvnow(); /* what time is it */
/* The time spent so far (from the start) */
- data->progress.timespent = curlx_tvdiff_secs(now, data->progress.start);
- timespent = (curl_off_t)data->progress.timespent;
+ data->progress.timespent = Curl_tvdiff_us(now, data->progress.start);
+ timespent = (curl_off_t)data->progress.timespent/1000000; /* seconds */
/* The average download speed this far */
data->progress.dlspeed = (curl_off_t)
- ((double)data->progress.downloaded/
- (data->progress.timespent>0?data->progress.timespent:1));
+ (data->progress.downloaded/
+ (timespent>0?timespent:1));
/* The average upload speed this far */
data->progress.ulspeed = (curl_off_t)
- ((double)data->progress.uploaded/
- (data->progress.timespent>0?data->progress.timespent:1));
+ (data->progress.uploaded/
+ (timespent>0?timespent:1));
/* Calculations done at most once a second, unless end is reached */
if(data->progress.lastshow != now.tv_sec) {
@@ -380,11 +394,10 @@ int Curl_pgrsUpdate(struct connectdata *conn)
data->progress.lastshow = now.tv_sec;
- /* Let's do the "current speed" thing, which should use the fastest
- of the dl/ul speeds. Store the faster speed at entry 'nowindex'. */
+ /* Let's do the "current speed" thing, with the dl + ul speeds
+ combined. Store the speed at entry 'nowindex'. */
data->progress.speeder[ nowindex ] =
- data->progress.downloaded>data->progress.uploaded?
- data->progress.downloaded:data->progress.uploaded;
+ data->progress.downloaded + data->progress.uploaded;
/* remember the exact time for this moment */
data->progress.speeder_time [ nowindex ] = now;
@@ -433,10 +446,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
}
}
else
- /* the first second we use the main average */
+ /* the first second we use the average */
data->progress.current_speed =
- (data->progress.ulspeed>data->progress.dlspeed)?
- data->progress.ulspeed:data->progress.dlspeed;
+ data->progress.ulspeed + data->progress.dlspeed;
} /* Calculations end */
@@ -454,7 +466,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
failf(data, "Callback aborted");
return result;
}
- else if(data->set.fprogress) {
+ if(data->set.fprogress) {
/* The older deprecated callback is set, call that */
result= data->set.fprogress(data->set.progress_client,
(double)data->progress.size_dl,
diff --git a/lib/progress.h b/lib/progress.h
index 155ff04f..ed57e336 100644
--- a/lib/progress.h
+++ b/lib/progress.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -52,8 +52,8 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer);
long Curl_pgrsLimitWaitTime(curl_off_t cursize,
curl_off_t startsize,
curl_off_t limit,
- struct timeval start,
- struct timeval now);
+ struct curltime start,
+ struct curltime now);
/* Don't show progress for sizes smaller than: */
#define LEAST_SIZE_PROGRESS BUFSIZE
diff --git a/lib/rand.c b/lib/rand.c
index a51951ce..2713a0aa 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -22,7 +22,9 @@
#include "curl_setup.h"
+#ifdef HAVE_FCNTL_H
#include <fcntl.h>
+#endif
#include <curl/curl.h>
#include "vtls/vtls.h"
@@ -45,10 +47,12 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
char *force_entropy = getenv("CURL_ENTROPY");
if(force_entropy) {
if(!seeded) {
+ unsigned int seed = 0;
size_t elen = strlen(force_entropy);
- size_t clen = sizeof(randseed);
+ size_t clen = sizeof(seed);
size_t min = elen < clen ? elen : clen;
- memcpy((char *)&randseed, force_entropy, min);
+ memcpy((char *)&seed, force_entropy, min);
+ randseed = ntohl(seed);
seeded = TRUE;
}
else
@@ -61,7 +65,7 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
/* data may be NULL! */
result = Curl_ssl_random(data, (unsigned char *)rnd, sizeof(*rnd));
if(result != CURLE_NOT_BUILT_IN)
- /* only if there is no random funtion in the TLS backend do the non crypto
+ /* only if there is no random function in the TLS backend do the non crypto
version, otherwise return result */
return result;
@@ -82,7 +86,7 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
#endif
if(!seeded) {
- struct timeval now = curlx_tvnow();
+ struct curltime now = curlx_tvnow();
infof(data, "WARNING: Using weak random seed\n");
randseed += (unsigned int)now.tv_usec + (unsigned int)now.tv_sec;
randseed = randseed * 1103515245 + 12345;
@@ -113,18 +117,63 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
*
*/
-CURLcode Curl_rand(struct Curl_easy *data, unsigned int *rndptr,
- unsigned int num)
+CURLcode Curl_rand(struct Curl_easy *data, unsigned char *rnd, size_t num)
{
CURLcode result = CURLE_BAD_FUNCTION_ARGUMENT;
- unsigned int i;
- assert(num > 0);
+ DEBUGASSERT(num > 0);
+
+ while(num) {
+ unsigned int r;
+ size_t left = num < sizeof(unsigned int) ? num : sizeof(unsigned int);
- for(i = 0; i < num; i++) {
- result = randit(data, rndptr++);
+ result = randit(data, &r);
if(result)
return result;
+
+ while(left) {
+ *rnd++ = (unsigned char)(r & 0xFF);
+ r >>= 8;
+ --num;
+ --left;
+ }
+ }
+
+ return result;
+}
+
+/*
+ * 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)
+{
+ CURLcode result = CURLE_BAD_FUNCTION_ARGUMENT;
+ const char *hex = "0123456789abcdef";
+ unsigned char buffer[128];
+ unsigned char *bufp = buffer;
+ DEBUGASSERT(num > 1);
+
+ if((num/2 >= sizeof(buffer)) || !(num&1))
+ /* make sure it fits in the local buffer and that it is an odd number! */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ num--; /* save one for zero termination */
+
+ result = Curl_rand(data, buffer, num/2);
+ if(result)
+ return result;
+
+ while(num) {
+ *rnd++ = hex[(*bufp & 0xF0)>>4];
+ *rnd++ = hex[*bufp & 0x0F];
+ bufp++;
+ num -= 2;
}
+ *rnd = 0;
+
return result;
}
diff --git a/lib/rand.h b/lib/rand.h
index 0f898612..c6fae355 100644
--- a/lib/rand.h
+++ b/lib/rand.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,7 +23,7 @@
***************************************************************************/
/*
- * Curl_rand() stores 'num' number of random unsigned integers in the buffer
+ * Curl_rand() stores 'num' number of random unsigned characters in the buffer
* 'rnd' points to.
*
* If libcurl is built without TLS support or with a TLS backend that lacks a
@@ -37,7 +37,11 @@
* easy handle!
*
*/
-CURLcode Curl_rand(struct Curl_easy *data, unsigned int *rnd,
- unsigned int num);
+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.*/
+CURLcode Curl_rand_hex(struct Curl_easy *data, unsigned char *rnd,
+ size_t num);
#endif /* HEADER_CURL_RAND_H */
diff --git a/lib/rtsp.c b/lib/rtsp.c
index 65c6c3b0..9bd935fd 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -81,6 +81,9 @@ static CURLcode rtsp_rtp_readwrite(struct Curl_easy *data,
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);
/* this returns the socket to wait for in the DO and DOING state for the multi
interface and then we're always _sending_ a request and thus we wait for
@@ -117,6 +120,7 @@ const struct Curl_handler Curl_handler_rtsp = {
ZERO_NULL, /* perform_getsock */
rtsp_disconnect, /* disconnect */
rtsp_rtp_readwrite, /* readwrite */
+ rtsp_conncheck, /* connection_check */
PORT_RTSP, /* defport */
CURLPROTO_RTSP, /* protocol */
PROTOPT_NONE /* flags */
@@ -143,7 +147,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 Curl_rtsp_connisdead(struct connectdata *check)
+bool rtsp_connisdead(struct connectdata *check)
{
int sval;
bool ret_val = TRUE;
@@ -165,6 +169,23 @@ bool Curl_rtsp_connisdead(struct connectdata *check)
return ret_val;
}
+/*
+ * Function to check on various aspects of a connection.
+ */
+static unsigned int rtsp_conncheck(struct connectdata *check,
+ unsigned int checks_to_perform)
+{
+ unsigned int ret_val = CONNRESULT_NONE;
+
+ if(checks_to_perform & CONNCHECK_ISDEAD) {
+ if(rtsp_connisdead(check))
+ ret_val |= CONNRESULT_DEAD;
+ }
+
+ return ret_val;
+}
+
+
static CURLcode rtsp_connect(struct connectdata *conn, bool *done)
{
CURLcode httpStatus;
@@ -216,7 +237,7 @@ static CURLcode rtsp_done(struct connectdata *conn,
CSeq_sent, CSeq_recv);
return CURLE_RTSP_CSEQ_ERROR;
}
- else if(data->set.rtspreq == RTSPREQ_RECEIVE &&
+ 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 */
@@ -648,31 +669,29 @@ static CURLcode rtsp_rtp_readwrite(struct Curl_easy *data,
*readmore = TRUE;
break;
}
- else {
- /* We have the full RTP interleaved packet
- * Write out the header including the leading '$' */
- DEBUGF(infof(data, "RTP write channel %d rtp_length %d\n",
- rtspc->rtp_channel, rtp_length));
- result = rtp_client_write(conn, &rtp[0], rtp_length + 4);
- if(result) {
- failf(data, "Got an error writing an RTP packet");
- *readmore = FALSE;
- Curl_safefree(rtspc->rtp_buf);
- rtspc->rtp_buf = NULL;
- rtspc->rtp_bufsize = 0;
- return result;
- }
+ /* We have the full RTP interleaved packet
+ * Write out the header including the leading '$' */
+ DEBUGF(infof(data, "RTP write channel %d rtp_length %d\n",
+ rtspc->rtp_channel, rtp_length));
+ result = rtp_client_write(conn, &rtp[0], rtp_length + 4);
+ if(result) {
+ failf(data, "Got an error writing an RTP packet");
+ *readmore = FALSE;
+ Curl_safefree(rtspc->rtp_buf);
+ rtspc->rtp_buf = NULL;
+ rtspc->rtp_bufsize = 0;
+ return result;
+ }
- /* Move forward in the buffer */
- rtp_dataleft -= rtp_length + 4;
- rtp += rtp_length + 4;
+ /* Move forward in the buffer */
+ rtp_dataleft -= rtp_length + 4;
+ rtp += rtp_length + 4;
- if(data->set.rtspreq == RTSPREQ_RECEIVE) {
- /* If we are in a passive receive, give control back
- * to the app as often as we can.
- */
- k->keepon &= ~KEEP_RECV;
- }
+ if(data->set.rtspreq == RTSPREQ_RECEIVE) {
+ /* If we are in a passive receive, give control back
+ * to the app as often as we can.
+ */
+ k->keepon &= ~KEEP_RECV;
}
}
else {
@@ -703,20 +722,18 @@ static CURLcode rtsp_rtp_readwrite(struct Curl_easy *data,
*nread = 0;
return CURLE_OK;
}
- else {
- /* Fix up k->str to point just after the last RTP packet */
- k->str += *nread - rtp_dataleft;
+ /* Fix up k->str to point just after the last RTP packet */
+ k->str += *nread - rtp_dataleft;
- /* either all of the data has been read or...
- * rtp now points at the next byte to parse
- */
- if(rtp_dataleft > 0)
- DEBUGASSERT(k->str[0] == rtp[0]);
+ /* either all of the data has been read or...
+ * rtp now points at the next byte to parse
+ */
+ if(rtp_dataleft > 0)
+ DEBUGASSERT(k->str[0] == rtp[0]);
- DEBUGASSERT(rtp_dataleft <= *nread); /* sanity check */
+ DEBUGASSERT(rtp_dataleft <= *nread); /* sanity check */
- *nread = rtp_dataleft;
- }
+ *nread = rtp_dataleft;
/* If we get here, we have finished with the leftover/merge buffer */
Curl_safefree(rtspc->rtp_buf);
@@ -797,7 +814,7 @@ CURLcode Curl_rtsp_parseheader(struct connectdata *conn,
/* If the Session ID is not set, and we find it in a response, then set
* it.
*
- * Allow any non whitespace content, up to the field seperator or end of
+ * Allow any non whitespace content, up to the field separator or end of
* line. RFC 2326 isn't 100% clear on the session ID and for example
* gstreamer does url-encoded session ID's not covered by the standard.
*/
diff --git a/lib/rtsp.h b/lib/rtsp.h
index 5a8d5556..8375a531 100644
--- a/lib/rtsp.h
+++ b/lib/rtsp.h
@@ -25,13 +25,11 @@
extern const struct Curl_handler Curl_handler_rtsp;
-bool Curl_rtsp_connisdead(struct connectdata *check);
CURLcode Curl_rtsp_parseheader(struct connectdata *conn, char *header);
#else
/* disabled */
#define Curl_rtsp_parseheader(x,y) CURLE_NOT_BUILT_IN
-#define Curl_rtsp_connisdead(x) TRUE
#endif /* CURL_DISABLE_RTSP */
diff --git a/lib/security.c b/lib/security.c
index 4a8f4443..f4a87634 100644
--- a/lib/security.c
+++ b/lib/security.c
@@ -367,6 +367,10 @@ int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
size_t decoded_sz = 0;
CURLcode error;
+ if(!conn->mech)
+ /* not inititalized, return error */
+ return -1;
+
DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz);
diff --git a/lib/select.c b/lib/select.c
index 03af645e..f6fecaf5 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -78,7 +78,7 @@ int Curl_wait_ms(int timeout_ms)
#ifndef HAVE_POLL_FINE
struct timeval pending_tv;
#endif
- struct timeval initial_tv;
+ struct curltime initial_tv;
int pending_ms;
int error;
#endif
@@ -129,7 +129,7 @@ int Curl_wait_ms(int timeout_ms)
* and a file descriptor is too large for FD_SETSIZE.
*
* A negative timeout value makes this function wait indefinitely,
- * unles no valid file descriptor is given, when this happens the
+ * unless no valid file descriptor is given, when this happens the
* negative timeout is ignored and the function times out immediately.
*
* Return values:
@@ -158,13 +158,13 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
fd_set fds_err;
curl_socket_t maxfd;
#endif
- struct timeval initial_tv = {0, 0};
+ struct curltime initial_tv = {0, 0};
int pending_ms = 0;
int error;
int r;
int ret;
-#if SIZEOF_LONG != SIZEOF_INT
+#if SIZEOF_TIME_T != SIZEOF_INT
/* wrap-around precaution */
if(timeout_ms >= INT_MAX)
timeout_ms = INT_MAX;
@@ -380,7 +380,7 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
* select() is used instead. An error is returned if select() is
* being used and a file descriptor is too large for FD_SETSIZE.
* A negative timeout value makes this function wait indefinitely,
- * unles no valid file descriptor is given, when this happens the
+ * unless no valid file descriptor is given, when this happens the
* negative timeout is ignored and the function times out immediately.
*
* Return values:
@@ -398,7 +398,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
fd_set fds_err;
curl_socket_t maxfd;
#endif
- struct timeval initial_tv = {0, 0};
+ struct curltime initial_tv = {0, 0};
bool fds_none = TRUE;
unsigned int i;
int pending_ms = 0;
@@ -571,8 +571,8 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
*
* Return values are the same as select's.
*/
-int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
- fd_set* excepts, struct timeval* tv)
+int tpf_select_libcurl(int maxfds, fd_set *reads, fd_set *writes,
+ fd_set *excepts, struct timeval *tv)
{
int rc;
diff --git a/lib/select.h b/lib/select.h
index e247bd9d..4351786c 100644
--- a/lib/select.h
+++ b/lib/select.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -24,10 +24,10 @@
#include "curl_setup.h"
-#ifdef HAVE_SYS_POLL_H
-#include <sys/poll.h>
-#elif defined(HAVE_POLL_H)
+#ifdef HAVE_POLL_H
#include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+#include <sys/poll.h>
#endif
/*
@@ -36,7 +36,8 @@
#if !defined(HAVE_STRUCT_POLLFD) && \
!defined(HAVE_SYS_POLL_H) && \
- !defined(HAVE_POLL_H)
+ !defined(HAVE_POLL_H) && \
+ !defined(POLLIN)
#define POLLIN 0x01
#define POLLPRI 0x02
diff --git a/lib/sendf.c b/lib/sendf.c
index 76016978..595c3617 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,6 +33,7 @@
#include "non-ascii.h"
#include "strerror.h"
#include "select.h"
+#include "strdup.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -148,7 +149,7 @@ static void pre_receive_plain(struct connectdata *conn, int num)
/* Have some incoming data */
if(!psnd->buffer) {
/* Use buffer double default size for intermediate buffer */
- psnd->allocated_size = 2 * BUFSIZE;
+ psnd->allocated_size = 2 * conn->data->set.buffer_size;
psnd->buffer = malloc(psnd->allocated_size);
psnd->recv_size = 0;
psnd->recv_processed = 0;
@@ -242,27 +243,26 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
{
va_list ap;
size_t len;
+ char error[CURL_ERROR_SIZE + 2];
va_start(ap, fmt);
- vsnprintf(data->state.buffer, BUFSIZE, fmt, ap);
+ vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
+ len = strlen(error);
if(data->set.errorbuffer && !data->state.errorbuf) {
- snprintf(data->set.errorbuffer, CURL_ERROR_SIZE, "%s", data->state.buffer);
+ strcpy(data->set.errorbuffer, error);
data->state.errorbuf = TRUE; /* wrote error string */
}
if(data->set.verbose) {
- len = strlen(data->state.buffer);
- if(len < BUFSIZE - 1) {
- data->state.buffer[len] = '\n';
- data->state.buffer[++len] = '\0';
- }
- Curl_debug(data, CURLINFO_TEXT, data->state.buffer, len, NULL);
+ error[len] = '\n';
+ error[++len] = '\0';
+ Curl_debug(data, CURLINFO_TEXT, error, len, NULL);
}
va_end(ap);
}
-/* Curl_sendf() sends formated data to the server */
+/* Curl_sendf() sends formatted data to the server */
CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
const char *fmt, ...)
{
@@ -474,21 +474,58 @@ static CURLcode pausewrite(struct Curl_easy *data,
we want to send we need to dup it to save a copy for when the sending
is again enabled */
struct SingleRequest *k = &data->req;
- char *dupl = malloc(len);
- if(!dupl)
- return CURLE_OUT_OF_MEMORY;
+ struct UrlState *s = &data->state;
+ char *dupl;
+ unsigned int i;
+ bool newtype = TRUE;
+
+ if(s->tempcount) {
+ for(i=0; i< s->tempcount; i++) {
+ if(s->tempwrite[i].type == type) {
+ /* data for this type exists */
+ newtype = FALSE;
+ break;
+ }
+ }
+ DEBUGASSERT(i < 3);
+ }
+ else
+ i = 0;
+
+ if(!newtype) {
+ /* append new data to old data */
+
+ /* figure out the new size of the data to save */
+ size_t newlen = len + s->tempwrite[i].len;
+ /* allocate the new memory area */
+ char *newptr = realloc(s->tempwrite[i].buf, newlen);
+ if(!newptr)
+ return CURLE_OUT_OF_MEMORY;
+ /* copy the new data to the end of the new area */
+ memcpy(newptr + s->tempwrite[i].len, ptr, len);
+
+ /* update the pointer and the size */
+ s->tempwrite[i].buf = newptr;
+ s->tempwrite[i].len = newlen;
+ }
+ else {
+ dupl = Curl_memdup(ptr, len);
+ if(!dupl)
+ return CURLE_OUT_OF_MEMORY;
- memcpy(dupl, ptr, len);
+ /* store this information in the state struct for later use */
+ s->tempwrite[i].buf = dupl;
+ s->tempwrite[i].len = len;
+ s->tempwrite[i].type = type;
- /* store this information in the state struct for later use */
- data->state.tempwrite = dupl;
- data->state.tempwritesize = len;
- data->state.tempwritetype = type;
+ if(newtype)
+ s->tempcount++;
+ }
/* mark the connection as RECV paused */
k->keepon |= KEEP_RECV_PAUSE;
- DEBUGF(infof(data, "Pausing with %zu bytes in buffer for type %02x\n",
+ DEBUGF(infof(data, "Paused %zu bytes in buffer for type %02x\n",
len, type));
return CURLE_OK;
@@ -511,31 +548,10 @@ CURLcode Curl_client_chop_write(struct connectdata *conn,
if(!len)
return CURLE_OK;
- /* If reading is actually paused, we're forced to append this chunk of data
- to the already held data, but only if it is the same type as otherwise it
- can't work and it'll return error instead. */
- if(data->req.keepon & KEEP_RECV_PAUSE) {
- size_t newlen;
- char *newptr;
- if(type != data->state.tempwritetype)
- /* major internal confusion */
- return CURLE_RECV_ERROR;
-
- DEBUGASSERT(data->state.tempwrite);
-
- /* figure out the new size of the data to save */
- newlen = len + data->state.tempwritesize;
- /* allocate the new memory area */
- newptr = realloc(data->state.tempwrite, newlen);
- if(!newptr)
- return CURLE_OUT_OF_MEMORY;
- /* copy the new data to the end of the new area */
- memcpy(newptr + data->state.tempwritesize, ptr, len);
- /* update the pointer and the size */
- data->state.tempwrite = newptr;
- data->state.tempwritesize = newlen;
- return CURLE_OK;
- }
+ /* If reading is paused, append this data to the already held data for this
+ type. */
+ if(data->req.keepon & KEEP_RECV_PAUSE)
+ return pausewrite(data, type, ptr, len);
/* Determine the callback(s) to use. */
if(type & CLIENTWRITE_BODY)
@@ -565,10 +581,9 @@ CURLcode Curl_client_chop_write(struct connectdata *conn,
failf(data, "Write callback asked for PAUSE when not supported!");
return CURLE_WRITE_ERROR;
}
- else
- return pausewrite(data, type, ptr, len);
+ return pausewrite(data, type, ptr, len);
}
- else if(wrote != chunklen) {
+ if(wrote != chunklen) {
failf(data, "Failed writing body (%zu != %zu)", wrote, chunklen);
return CURLE_WRITE_ERROR;
}
@@ -616,6 +631,8 @@ CURLcode Curl_client_write(struct connectdata *conn,
if(0 == len)
len = strlen(ptr);
+ DEBUGASSERT(type <= 3);
+
/* FTP data may need conversion. */
if((type & CLIENTWRITE_BODY) &&
(conn->handler->protocol & PROTO_FAMILY_FTP) &&
@@ -652,8 +669,7 @@ CURLcode Curl_read_plain(curl_socket_t sockfd,
#endif
if(return_error)
return CURLE_AGAIN;
- else
- return CURLE_RECV_ERROR;
+ return CURLE_RECV_ERROR;
}
/* we only return number of bytes read when we return OK */
@@ -677,9 +693,10 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
ssize_t nread = 0;
size_t bytesfromsocket = 0;
char *buffertofill = NULL;
+ struct Curl_easy *data = conn->data;
/* if HTTP/1 pipelining is both wanted and possible */
- bool pipelining = Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1) &&
+ 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.
@@ -705,13 +722,11 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
}
/* 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, BUFSIZE * sizeof(char));
+ bytesfromsocket = CURLMIN(sizerequested, MASTERBUF_SIZE);
buffertofill = conn->master_buffer;
}
else {
- bytesfromsocket = CURLMIN((long)sizerequested,
- conn->data->set.buffer_size ?
- conn->data->set.buffer_size : BUFSIZE);
+ bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
buffertofill = buf;
}
@@ -736,21 +751,19 @@ static int showit(struct Curl_easy *data, curl_infotype type,
{
static const char s_infotype[CURLINFO_END][3] = {
"* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
+ int rc = 0;
#ifdef CURL_DOES_CONVERSIONS
- char buf[BUFSIZE+1];
+ char *buf = NULL;
size_t conv_size = 0;
switch(type) {
case CURLINFO_HEADER_OUT:
- /* assume output headers are ASCII */
- /* copy the data into my buffer so the original is unchanged */
- if(size > BUFSIZE) {
- size = BUFSIZE; /* truncate if necessary */
- buf[BUFSIZE] = '\0';
- }
+ buf = Curl_memdup(ptr, size);
+ if(!buf)
+ return 1;
conv_size = size;
- memcpy(buf, ptr, size);
+
/* Special processing is needed for this block if it
* contains both headers and data (separated by CRLFCRLF).
* We want to convert just the headers, leaving the data as-is.
@@ -778,26 +791,29 @@ static int showit(struct Curl_easy *data, curl_infotype type,
#endif /* CURL_DOES_CONVERSIONS */
if(data->set.fdebug)
- return (*data->set.fdebug)(data, type, ptr, size,
- data->set.debugdata);
-
- switch(type) {
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_OUT:
- case CURLINFO_HEADER_IN:
- fwrite(s_infotype[type], 2, 1, data->set.err);
- fwrite(ptr, size, 1, data->set.err);
+ rc = (*data->set.fdebug)(data, type, ptr, size, data->set.debugdata);
+ else {
+ switch(type) {
+ case CURLINFO_TEXT:
+ case CURLINFO_HEADER_OUT:
+ case CURLINFO_HEADER_IN:
+ fwrite(s_infotype[type], 2, 1, data->set.err);
+ fwrite(ptr, size, 1, data->set.err);
#ifdef CURL_DOES_CONVERSIONS
- if(size != conv_size) {
- /* we had untranslated data so we need an explicit newline */
- fwrite("\n", 1, 1, data->set.err);
- }
+ if(size != conv_size) {
+ /* we had untranslated data so we need an explicit newline */
+ fwrite("\n", 1, 1, data->set.err);
+ }
#endif
- break;
- default: /* nada */
- break;
+ break;
+ default: /* nada */
+ break;
+ }
}
- return 0;
+#ifdef CURL_DOES_CONVERSIONS
+ free(buf);
+#endif
+ return rc;
}
int Curl_debug(struct Curl_easy *data, curl_infotype type,
diff --git a/lib/smb.c b/lib/smb.c
index f197fe1c..13dfd514 100644
--- 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, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2016-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
@@ -23,8 +23,8 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
- (CURL_SIZEOF_CURL_OFF_T > 4)
+#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
+ (CURL_SIZEOF_CURL_OFF_T > 4)
#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
@@ -32,8 +32,12 @@
#ifdef HAVE_PROCESS_H
#include <process.h>
+#ifdef CURL_WINDOWS_APP
+#define getpid GetCurrentProcessId
+#elif !defined(MSDOS)
#define getpid _getpid
#endif
+#endif
#include "smb.h"
#include "urldata.h"
@@ -81,6 +85,7 @@ const struct Curl_handler Curl_handler_smb = {
ZERO_NULL, /* perform_getsock */
smb_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SMB, /* defport */
CURLPROTO_SMB, /* protocol */
PROTOPT_NONE /* flags */
@@ -105,6 +110,7 @@ const struct Curl_handler Curl_handler_smbs = {
ZERO_NULL, /* perform_getsock */
smb_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SMBS, /* defport */
CURLPROTO_SMBS, /* protocol */
PROTOPT_SSL /* flags */
@@ -117,18 +123,18 @@ const struct Curl_handler Curl_handler_smbs = {
#define SERVICENAME "?????"
/* Append a string to an SMB message */
-#define MSGCAT(str) \
- strcpy(p, (str)); \
+#define MSGCAT(str) \
+ strcpy(p, (str)); \
p += strlen(str);
/* Append a null-terminated string to an SMB message */
-#define MSGCATNULL(str) \
- strcpy(p, (str)); \
+#define MSGCATNULL(str) \
+ strcpy(p, (str)); \
p += strlen(str) + 1;
/* SMB is mostly little endian */
#if (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \
- defined(__OS400__)
+ defined(__OS400__)
static unsigned short smb_swap16(unsigned short x)
{
return (unsigned short) ((x << 8) | ((x >> 8) & 0xff));
@@ -137,20 +143,20 @@ static unsigned short smb_swap16(unsigned short x)
static unsigned int smb_swap32(unsigned int x)
{
return (x << 24) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) |
- ((x >> 24) & 0xff);
+ ((x >> 24) & 0xff);
}
#ifdef HAVE_LONGLONG
static unsigned long long smb_swap64(unsigned long long x)
{
return ((unsigned long long) smb_swap32((unsigned int) x) << 32) |
- smb_swap32((unsigned int) (x >> 32));
+ smb_swap32((unsigned int) (x >> 32));
}
#else
static unsigned __int64 smb_swap64(unsigned __int64 x)
{
return ((unsigned __int64) smb_swap32((unsigned int) x) << 32) |
- smb_swap32((unsigned int) (x >> 32));
+ smb_swap32((unsigned int) (x >> 32));
}
#endif
#else
@@ -197,7 +203,7 @@ static void conn_state(struct connectdata *conn, enum smb_conn_state newstate)
if(smb->state != newstate)
infof(conn->data, "SMB conn %p state change from %s to %s\n",
- (void *)smb, names[smb->state], names[newstate]);
+ (void *)smb, names[smb->state], names[newstate]);
#endif
smb->state = newstate;
@@ -223,7 +229,7 @@ static void request_state(struct connectdata *conn,
if(req->state != newstate)
infof(conn->data, "SMB request %p state change from %s to %s\n",
- (void *)req, names[req->state], names[newstate]);
+ (void *)req, names[req->state], names[newstate]);
#endif
req->state = newstate;
@@ -308,8 +314,9 @@ static CURLcode smb_recv_message(struct connectdata *conn, void **msg)
if(smbc->got < sizeof(unsigned int))
return CURLE_OK;
- nbt_size = Curl_read16_be((const unsigned char *)(buf +
- sizeof(unsigned short))) + sizeof(unsigned int);
+ nbt_size = Curl_read16_be((const unsigned char *)
+ (buf + sizeof(unsigned short))) +
+ sizeof(unsigned int);
if(smbc->got < nbt_size)
return CURLE_OK;
@@ -320,7 +327,7 @@ static CURLcode smb_recv_message(struct connectdata *conn, void **msg)
if(nbt_size >= msg_size + sizeof(unsigned short)) {
/* Add the byte count */
msg_size += sizeof(unsigned short) +
- Curl_read16_le((const unsigned char *)&buf[msg_size]);
+ Curl_read16_le((const unsigned char *)&buf[msg_size]);
if(nbt_size < msg_size)
return CURLE_READ_ERROR;
}
@@ -441,7 +448,7 @@ static CURLcode smb_send_setup(struct connectdata *conn)
Curl_ntlm_core_mk_lm_hash(conn->data, conn->passwd, lm_hash);
Curl_ntlm_core_lm_resp(lm_hash, smbc->challenge, lm);
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
Curl_ntlm_core_mk_nt_hash(conn->data, conn->passwd, nt_hash);
Curl_ntlm_core_lm_resp(nt_hash, smbc->challenge, nt);
#else
@@ -602,8 +609,8 @@ static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
/* Check if there is data in the transfer buffer */
if(!smbc->send_size && smbc->upload_size) {
- int nread = smbc->upload_size > BUFSIZE ? BUFSIZE :
- (int) smbc->upload_size;
+ int nread = smbc->upload_size > UPLOAD_BUFSIZE ? UPLOAD_BUFSIZE :
+ (int) smbc->upload_size;
conn->data->req.upload_fromhere = conn->data->state.uploadbuffer;
result = Curl_fillreadbuffer(conn, nread, &nread);
if(result && result != CURLE_AGAIN)
@@ -708,6 +715,23 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
return CURLE_OK;
}
+/*
+ * Convert a timestamp from the Windows world (100 nsec units from
+ * 1 Jan 1601) to Posix time.
+ */
+static void get_posix_time(long *_out, const void *_in)
+{
+#ifdef HAVE_LONGLONG
+ long long timestamp = *(long long *) _in;
+#else
+ unsigned __int64 timestamp = *(unsigned __int64 *) _in;
+#endif
+
+ timestamp -= 116444736000000000ULL;
+ timestamp /= 10000000;
+ *_out = (long) timestamp;
+}
+
static CURLcode smb_request_state(struct connectdata *conn, bool *done)
{
struct smb_request *req = conn->data->req.protop;
@@ -718,6 +742,7 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
unsigned short off;
CURLcode result;
void *msg = NULL;
+ const struct smb_nt_create_response *smb_m;
/* Start the request */
if(req->state == SMB_REQUESTING) {
@@ -760,7 +785,8 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
next_state = SMB_TREE_DISCONNECT;
break;
}
- req->fid = smb_swap16(((struct smb_nt_create_response *)msg)->fid);
+ smb_m = (const struct smb_nt_create_response*) msg;
+ req->fid = smb_swap16(smb_m->fid);
conn->data->req.offset = 0;
if(conn->data->set.upload) {
conn->data->req.size = conn->data->state.infilesize;
@@ -768,9 +794,11 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
next_state = SMB_UPLOAD;
}
else {
- conn->data->req.size =
- smb_swap64(((struct smb_nt_create_response *)msg)->end_of_file);
+ smb_m = (const struct smb_nt_create_response*) msg;
+ conn->data->req.size = smb_swap64(smb_m->end_of_file);
Curl_pgrsSetDownloadSize(conn->data, conn->data->req.size);
+ if(conn->data->set.get_filetime)
+ get_posix_time(&conn->data->info.filetime, &smb_m->last_change_time);
next_state = SMB_DOWNLOAD;
}
break;
diff --git a/lib/smtp.c b/lib/smtp.c
index ff8e80d6..4e2c3361 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -124,9 +124,11 @@ const struct Curl_handler Curl_handler_smtp = {
ZERO_NULL, /* perform_getsock */
smtp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SMTP, /* defport */
CURLPROTO_SMTP, /* protocol */
- PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */
+ PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
+ PROTOPT_URLOPTIONS
};
#ifdef USE_SSL
@@ -149,65 +151,14 @@ const struct Curl_handler Curl_handler_smtps = {
ZERO_NULL, /* perform_getsock */
smtp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SMTPS, /* defport */
CURLPROTO_SMTPS, /* protocol */
PROTOPT_CLOSEACTION | PROTOPT_SSL
- | PROTOPT_NOURLQUERY /* flags */
+ | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
#endif
-#ifndef CURL_DISABLE_HTTP
-/*
- * HTTP-proxyed SMTP protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_smtp_proxy = {
- "SMTP", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_SMTP, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-
-#ifdef USE_SSL
-/*
- * HTTP-proxyed SMTPS protocol handler.
- */
-
-static const struct Curl_handler Curl_handler_smtps_proxy = {
- "SMTPS", /* scheme */
- Curl_http_setup_conn, /* setup_connection */
- Curl_http, /* do_it */
- Curl_http_done, /* done */
- ZERO_NULL, /* do_more */
- ZERO_NULL, /* connect_it */
- ZERO_NULL, /* connecting */
- ZERO_NULL, /* doing */
- ZERO_NULL, /* proto_getsock */
- ZERO_NULL, /* doing_getsock */
- ZERO_NULL, /* domore_getsock */
- ZERO_NULL, /* perform_getsock */
- ZERO_NULL, /* disconnect */
- ZERO_NULL, /* readwrite */
- PORT_SMTPS, /* defport */
- CURLPROTO_HTTP, /* protocol */
- PROTOPT_NONE /* flags */
-};
-#endif
-#endif
-
/* SASL parameters for the smtp protocol */
static const struct SASLproto saslsmtp = {
"smtp", /* The service name */
@@ -692,7 +643,7 @@ static CURLcode smtp_state_starttls_resp(struct connectdata *conn,
if(smtpcode != 220) {
if(data->set.use_ssl != CURLUSESSL_TRY) {
- failf(data, "STARTTLS denied. %c", smtpcode);
+ failf(data, "STARTTLS denied, code %d", smtpcode);
result = CURLE_USE_SSL_FAILED;
}
else
@@ -1450,30 +1401,6 @@ static CURLcode smtp_setup_connection(struct connectdata *conn)
/* Clear the TLS upgraded flag */
conn->tls_upgraded = FALSE;
- /* Set up the proxy if necessary */
- if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
- /* Unless we have asked to tunnel SMTP operations through the proxy, we
- switch and use HTTP operations only */
-#ifndef CURL_DISABLE_HTTP
- if(conn->handler == &Curl_handler_smtp)
- conn->handler = &Curl_handler_smtp_proxy;
- else {
-#ifdef USE_SSL
- conn->handler = &Curl_handler_smtps_proxy;
-#else
- failf(data, "SMTPS not supported!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
- /* set it up as a HTTP connection instead */
- return conn->handler->setup_connection(conn);
-
-#else
- failf(data, "SMTP over http proxy requires HTTP support built-in!");
- return CURLE_UNSUPPORTED_PROTOCOL;
-#endif
- }
-
/* Initialise the SMTP layer */
result = smtp_init(conn);
if(result)
@@ -1590,7 +1517,7 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread)
if(!scratch || data->set.crlf) {
oldscratch = scratch;
- scratch = newscratch = malloc(2 * BUFSIZE);
+ scratch = newscratch = malloc(2 * data->set.buffer_size);
if(!newscratch) {
failf(data, "Failed to alloc scratch buffer!");
diff --git a/lib/socks.c b/lib/socks.c
index 774fb20b..000cd9c2 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -73,7 +73,7 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
result = Curl_read_plain(sockfd, buf, buffersize, &nread);
if(CURLE_AGAIN == result)
continue;
- else if(result)
+ if(result)
break;
if(buffersize == nread) {
@@ -105,7 +105,7 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
* Set protocol4a=true for "SOCKS 4A (Simple Extension to SOCKS 4 Protocol)"
* Nonsupport "Identification Protocol (RFC1413)"
*/
-CURLcode Curl_SOCKS4(const char *proxy_name,
+CURLcode Curl_SOCKS4(const char *proxy_user,
const char *hostname,
int remote_port,
int sockindex,
@@ -206,14 +206,14 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
* This is currently not supporting "Identification Protocol (RFC1413)".
*/
socksreq[8] = 0; /* ensure empty userid is NUL-terminated */
- if(proxy_name) {
- size_t plen = strlen(proxy_name);
+ if(proxy_user) {
+ size_t plen = strlen(proxy_user);
if(plen >= sizeof(socksreq) - 8) {
failf(data, "Too long SOCKS proxy name, can't use!\n");
return CURLE_COULDNT_CONNECT;
}
/* copy the proxy name WITH trailing zero */
- memcpy(socksreq + 8, proxy_name, plen+1);
+ memcpy(socksreq + 8, proxy_user, plen+1);
}
/*
@@ -350,7 +350,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
* This function logs in to a SOCKS5 proxy and sends the specifics to the final
* destination server.
*/
-CURLcode Curl_SOCKS5(const char *proxy_name,
+CURLcode Curl_SOCKS5(const char *proxy_user,
const char *proxy_password,
const char *hostname,
int remote_port,
@@ -375,6 +375,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
*/
unsigned char socksreq[600]; /* room for large user/pw (255 max each) */
+ int idx;
ssize_t actualread;
ssize_t written;
int result;
@@ -386,6 +387,8 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS5) ? TRUE : FALSE;
const size_t hostname_len = strlen(hostname);
ssize_t len = 0;
+ const unsigned long auth = data->set.socks5auth;
+ bool allow_gssapi = FALSE;
if(conn->bits.httpproxy)
infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
@@ -416,7 +419,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
failf(conn->data, "SOCKS5: no connection here");
return CURLE_COULDNT_CONNECT;
}
- else if(0 == result) {
+ if(0 == result) {
failf(conn->data, "SOCKS5: connection timeout");
return CURLE_OPERATION_TIMEDOUT;
}
@@ -426,18 +429,29 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
return CURLE_COULDNT_CONNECT;
}
- socksreq[0] = 5; /* version */
+ if(auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
+ infof(conn->data,
+ "warning: unsupported value passed to CURLOPT_SOCKS5_AUTH: %lu\n",
+ auth);
+ if(!(auth & CURLAUTH_BASIC))
+ /* disable username/password auth */
+ proxy_user = NULL;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- socksreq[1] = (char)(proxy_name ? 3 : 2); /* number of methods (below) */
- socksreq[2] = 0; /* no authentication */
- socksreq[3] = 1; /* GSS-API */
- socksreq[4] = 2; /* username/password */
-#else
- socksreq[1] = (char)(proxy_name ? 2 : 1); /* number of methods (below) */
- socksreq[2] = 0; /* no authentication */
- socksreq[3] = 2; /* username/password */
+ if(auth & CURLAUTH_GSSAPI)
+ allow_gssapi = TRUE;
#endif
+ idx = 0;
+ socksreq[idx++] = 5; /* version */
+ idx++; /* reserve for the number of authentication methods */
+ socksreq[idx++] = 0; /* no authentication */
+ if(allow_gssapi)
+ socksreq[idx++] = 1; /* GSS-API */
+ if(proxy_user)
+ socksreq[idx++] = 2; /* username/password */
+ /* write the number of authentication methods */
+ socksreq[1] = (unsigned char) (idx - 2);
+
(void)curlx_nonblock(sock, FALSE);
infof(data, "SOCKS5 communication to %s:%d\n", hostname, remote_port);
@@ -457,7 +471,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
failf(conn->data, "SOCKS5 nothing to read");
return CURLE_COULDNT_CONNECT;
}
- else if(0 == result) {
+ if(0 == result) {
failf(conn->data, "SOCKS5 read timeout");
return CURLE_OPERATION_TIMEDOUT;
}
@@ -484,7 +498,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
;
}
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- else if(socksreq[1] == 1) {
+ else if(allow_gssapi && (socksreq[1] == 1)) {
code = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
if(code) {
failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
@@ -494,13 +508,13 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
#endif
else if(socksreq[1] == 2) {
/* Needs user name and password */
- size_t proxy_name_len, proxy_password_len;
- if(proxy_name && proxy_password) {
- proxy_name_len = strlen(proxy_name);
+ size_t proxy_user_len, proxy_password_len;
+ if(proxy_user && proxy_password) {
+ proxy_user_len = strlen(proxy_user);
proxy_password_len = strlen(proxy_password);
}
else {
- proxy_name_len = 0;
+ proxy_user_len = 0;
proxy_password_len = 0;
}
@@ -513,10 +527,10 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
*/
len = 0;
socksreq[len++] = 1; /* username/pw subnegotiation version */
- socksreq[len++] = (unsigned char) proxy_name_len;
- if(proxy_name && proxy_name_len)
- memcpy(socksreq + len, proxy_name, proxy_name_len);
- len += proxy_name_len;
+ socksreq[len++] = (unsigned char) proxy_user_len;
+ if(proxy_user && proxy_user_len)
+ 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)
memcpy(socksreq + len, proxy_password, proxy_password_len);
@@ -545,17 +559,13 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
}
else {
/* error */
-#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(socksreq[1] == 255) {
-#else
- if(socksreq[1] == 1) {
+ if(!allow_gssapi && (socksreq[1] == 1)) {
failf(data,
"SOCKS5 GSSAPI per-message authentication is not supported.");
return CURLE_COULDNT_CONNECT;
}
- else if(socksreq[1] == 255) {
-#endif
- if(!proxy_name || !*proxy_name) {
+ if(socksreq[1] == 255) {
+ if(!proxy_user || !*proxy_user) {
failf(data,
"No authentication method was acceptable. (It is quite likely"
" that the SOCKS5 server wanted a username/password, since none"
@@ -772,9 +782,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
}
return CURLE_COULDNT_CONNECT;
}
- else {
- infof(data, "SOCKS5 request granted.\n");
- }
+ infof(data, "SOCKS5 request granted.\n");
(void)curlx_nonblock(sock, TRUE);
return CURLE_OK; /* Proxy was successful! */
diff --git a/lib/speedcheck.c b/lib/speedcheck.c
index bc15d97b..fe669f11 100644
--- a/lib/speedcheck.c
+++ b/lib/speedcheck.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -30,45 +30,44 @@
void Curl_speedinit(struct Curl_easy *data)
{
- memset(&data->state.keeps_speed, 0, sizeof(struct timeval));
+ memset(&data->state.keeps_speed, 0, sizeof(struct curltime));
}
+/*
+ * @unittest: 1606
+ */
CURLcode Curl_speedcheck(struct Curl_easy *data,
- struct timeval now)
+ struct curltime now)
{
- if((data->progress.current_speed >= 0) &&
- data->set.low_speed_time &&
- (Curl_tvlong(data->state.keeps_speed) != 0) &&
- (data->progress.current_speed < data->set.low_speed_limit)) {
- time_t howlong = Curl_tvdiff(now, data->state.keeps_speed);
- time_t nextcheck = (data->set.low_speed_time * 1000) - howlong;
+ if((data->progress.current_speed >= 0) && data->set.low_speed_time) {
+ if(data->progress.current_speed < data->set.low_speed_limit) {
+ if(!data->state.keeps_speed.tv_sec)
+ /* under the limit at this very moment */
+ data->state.keeps_speed = now;
+ else {
+ /* how long has it been under the limit */
+ time_t howlong = Curl_tvdiff(now, data->state.keeps_speed);
- /* We are now below the "low speed limit". If we are below it
- for "low speed time" seconds we consider that enough reason
- to abort the download. */
- if(nextcheck <= 0) {
- /* we have been this slow for long enough, now die */
- failf(data,
- "Operation too slow. "
- "Less than %ld bytes/sec transferred the last %ld seconds",
- data->set.low_speed_limit,
- data->set.low_speed_time);
- return CURLE_OPERATION_TIMEDOUT;
- }
- else {
- /* wait complete low_speed_time */
- Curl_expire_latest(data, nextcheck);
+ if(howlong >= data->set.low_speed_time * 1000) {
+ /* too long */
+ failf(data,
+ "Operation too slow. "
+ "Less than %ld bytes/sec transferred the last %ld seconds",
+ data->set.low_speed_limit,
+ data->set.low_speed_time);
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ }
}
+ else
+ /* faster right now */
+ data->state.keeps_speed.tv_sec = 0;
}
- else {
- /* we keep up the required speed all right */
- data->state.keeps_speed = now;
- if(data->set.low_speed_limit)
- /* if there is a low speed limit enabled, we set the expire timer to
- make this connection's speed get checked again no later than when
- this time is up */
- Curl_expire_latest(data, data->set.low_speed_time*1000);
- }
+ if(data->set.low_speed_limit)
+ /* if low speed limit is enabled, set the expire timer to make this
+ connection's speed get checked again in a second */
+ Curl_expire(data, 1000, EXPIRE_SPEEDCHECK);
+
return CURLE_OK;
}
diff --git a/lib/speedcheck.h b/lib/speedcheck.h
index 7dbe3d6d..5c2dc9a2 100644
--- a/lib/speedcheck.h
+++ b/lib/speedcheck.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -28,6 +28,6 @@
void Curl_speedinit(struct Curl_easy *data);
CURLcode Curl_speedcheck(struct Curl_easy *data,
- struct timeval now);
+ struct curltime now);
#endif /* HEADER_CURL_SPEEDCHECK_H */
diff --git a/lib/splay.c b/lib/splay.c
index 7aa2e4ba..68ff9c5d 100644
--- a/lib/splay.c
+++ b/lib/splay.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1997 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 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
@@ -37,7 +37,7 @@
* Splay using the key i (which may or may not be in the tree.) The starting
* root is t.
*/
-struct Curl_tree *Curl_splay(struct timeval i,
+struct Curl_tree *Curl_splay(struct curltime i,
struct Curl_tree *t)
{
struct Curl_tree N, *l, *r, *y;
@@ -97,11 +97,13 @@ struct Curl_tree *Curl_splay(struct timeval i,
*
* @unittest: 1309
*/
-struct Curl_tree *Curl_splayinsert(struct timeval i,
+struct Curl_tree *Curl_splayinsert(struct curltime i,
struct Curl_tree *t,
struct Curl_tree *node)
{
- static const struct timeval KEY_NOTUSED = {-1, -1}; /* will *NEVER* appear */
+ static const struct curltime KEY_NOTUSED = {
+ (time_t)-1, (unsigned int)-1
+ }; /* will *NEVER* appear */
if(node == NULL)
return t;
@@ -110,22 +112,17 @@ struct Curl_tree *Curl_splayinsert(struct timeval i,
t = Curl_splay(i, t);
if(compare(i, t->key)==0) {
/* There already exists a node in the tree with the very same key. Build
- a linked list of nodes. We make the new 'node' struct the new master
- node and make the previous node the first one in the 'same' list. */
+ a doubly-linked circular list of nodes. We add the new 'node' struct
+ to the end of this list. */
- node->same = t;
- node->key = i;
- node->smaller = t->smaller;
- node->larger = t->larger;
+ node->key = KEY_NOTUSED; /* we set the key in the sub node to NOTUSED
+ to quickly identify this node as a subnode */
+ node->samen = t;
+ node->samep = t->samep;
+ t->samep->samen = node;
+ t->samep = node;
- t->smaller = node; /* in the sub node for this same key, we use the
- smaller pointer to point back to the master
- node */
-
- t->key = KEY_NOTUSED; /* and we set the key in the sub node to NOTUSED
- to quickly identify this node as a subnode */
-
- return node; /* new root node */
+ return t; /* the root node always stays the same */
}
}
@@ -145,16 +142,20 @@ struct Curl_tree *Curl_splayinsert(struct timeval i,
}
node->key = i;
- node->same = NULL; /* no identical node (yet) */
+ /* no identical nodes (yet), we are the only one in the list of nodes */
+ node->samen = node;
+ node->samep = node;
return node;
}
/* Finds and deletes the best-fit node from the tree. Return a pointer to the
- resulting tree. best-fit means the node with the given or lower key */
-struct Curl_tree *Curl_splaygetbest(struct timeval i,
+ resulting tree. best-fit means the smallest node if it is not larger than
+ the key */
+struct Curl_tree *Curl_splaygetbest(struct curltime i,
struct Curl_tree *t,
struct Curl_tree **removed)
{
+ static struct curltime tv_zero = {0, 0};
struct Curl_tree *x;
if(!t) {
@@ -162,49 +163,36 @@ struct Curl_tree *Curl_splaygetbest(struct timeval i,
return NULL;
}
- t = Curl_splay(i, t);
+ /* find smallest */
+ t = Curl_splay(tv_zero, t);
if(compare(i, t->key) < 0) {
- /* too big node, try the smaller chain */
- if(t->smaller)
- t=Curl_splay(t->smaller->key, t);
- else {
- /* fail */
- *removed = NULL;
- return t;
- }
+ /* even the smallest is too big */
+ *removed = NULL;
+ return t;
}
- if(compare(i, t->key) >= 0) { /* found it */
- /* FIRST! Check if there is a list with identical keys */
- x = t->same;
- if(x) {
- /* there is, pick one from the list */
+ /* FIRST! Check if there is a list with identical keys */
+ x = t->samen;
+ if(x != t) {
+ /* there is, pick one from the list */
- /* 'x' is the new root node */
+ /* 'x' is the new root node */
- x->key = t->key;
- x->larger = t->larger;
- x->smaller = t->smaller;
-
- *removed = t;
- return x; /* new root */
- }
+ x->key = t->key;
+ x->larger = t->larger;
+ x->smaller = t->smaller;
+ x->samep = t->samep;
+ t->samep->samen = x;
- if(t->smaller == NULL) {
- x = t->larger;
- }
- else {
- x = Curl_splay(i, t->smaller);
- x->larger = t->larger;
- }
*removed = t;
-
- return x;
- }
- else {
- *removed = NULL; /* no match */
- return t; /* It wasn't there */
+ return x; /* new root */
}
+
+ /* we splayed the tree to the smallest element, there is no smaller */
+ x = t->larger;
+ *removed = t;
+
+ return x;
}
@@ -223,7 +211,9 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
struct Curl_tree *removenode,
struct Curl_tree **newroot)
{
- static const struct timeval KEY_NOTUSED = {-1, -1}; /* will *NEVER* appear */
+ static const struct curltime KEY_NOTUSED = {
+ (time_t)-1, (unsigned int)-1
+ }; /* will *NEVER* appear */
struct Curl_tree *x;
if(!t || !removenode)
@@ -231,19 +221,17 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
if(compare(KEY_NOTUSED, removenode->key) == 0) {
/* Key set to NOTUSED means it is a subnode within a 'same' linked list
- and thus we can unlink it easily. The 'smaller' link of a subnode
- links to the parent node. */
- if(removenode->smaller == NULL)
+ and thus we can unlink it easily. */
+ if(removenode->samen == removenode)
+ /* A non-subnode should never be set to KEY_NOTUSED */
return 3;
- removenode->smaller->same = removenode->same;
- if(removenode->same)
- removenode->same->smaller = removenode->smaller;
+ removenode->samep->samen = removenode->samen;
+ removenode->samen->samep = removenode->samep;
/* Ensures that double-remove gets caught. */
- removenode->smaller = NULL;
+ removenode->samen = removenode;
- /* voila, we're done! */
*newroot = t; /* return the same root */
return 0;
}
@@ -262,14 +250,16 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
/* Check if there is a list with identical sizes, as then we're trying to
remove the root node of a list of nodes with identical keys. */
- x = t->same;
- if(x) {
+ x = t->samen;
+ if(x != t) {
/* 'x' is the new root node, we just make it use the root node's
smaller/larger links */
x->key = t->key;
x->larger = t->larger;
x->smaller = t->smaller;
+ x->samep = t->samep;
+ t->samep->samen = x;
}
else {
/* Remove the root node */
diff --git a/lib/splay.h b/lib/splay.h
index 427bfc8e..0273bad3 100644
--- a/lib/splay.h
+++ b/lib/splay.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1997 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 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
@@ -22,29 +22,31 @@
*
***************************************************************************/
#include "curl_setup.h"
+#include "timeval.h"
struct Curl_tree {
struct Curl_tree *smaller; /* smaller node */
struct Curl_tree *larger; /* larger node */
- struct Curl_tree *same; /* points to a node with identical key */
- struct timeval key; /* this node's "sort" key */
+ struct Curl_tree *samen; /* points to the next node with identical key */
+ struct Curl_tree *samep; /* points to the prev node with identical key */
+ struct curltime key; /* this node's "sort" key */
void *payload; /* data the splay code doesn't care about */
};
-struct Curl_tree *Curl_splay(struct timeval i,
+struct Curl_tree *Curl_splay(struct curltime i,
struct Curl_tree *t);
-struct Curl_tree *Curl_splayinsert(struct timeval key,
+struct Curl_tree *Curl_splayinsert(struct curltime key,
struct Curl_tree *t,
struct Curl_tree *newnode);
#if 0
-struct Curl_tree *Curl_splayremove(struct timeval key,
+struct Curl_tree *Curl_splayremove(struct curltime key,
struct Curl_tree *t,
struct Curl_tree **removed);
#endif
-struct Curl_tree *Curl_splaygetbest(struct timeval key,
+struct Curl_tree *Curl_splaygetbest(struct curltime key,
struct Curl_tree *t,
struct Curl_tree **removed);
diff --git a/lib/ssh.c b/lib/ssh.c
index 5ed036a1..9443e24b 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -113,6 +113,7 @@
libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
(t), (m), LIBSSH2_SFTP_REALPATH)
+
/* Local functions: */
static const char *sftp_libssh2_strerror(int err);
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
@@ -176,6 +177,7 @@ const struct Curl_handler Curl_handler_scp = {
ssh_perform_getsock, /* perform_getsock */
scp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SCP, /* protocol */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
@@ -202,6 +204,7 @@ const struct Curl_handler Curl_handler_sftp = {
ssh_perform_getsock, /* perform_getsock */
sftp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SFTP, /* protocol */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
@@ -688,14 +691,11 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
return sshc->actualcode;
}
- else {
- infof(data, "MD5 checksum match!\n");
- /* as we already matched, we skip the check for known hosts */
- return CURLE_OK;
- }
+ infof(data, "MD5 checksum match!\n");
+ /* as we already matched, we skip the check for known hosts */
+ return CURLE_OK;
}
- else
- return ssh_knownhost(conn);
+ return ssh_knownhost(conn);
}
/*
@@ -738,7 +738,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc) {
+ if(rc) {
failf(data, "Failure establishing ssh session");
state(conn, SSH_SESSION_FREE);
sshc->actualcode = CURLE_FAILED_INIT;
@@ -782,16 +782,14 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_AUTH_DONE);
break;
}
+ err = libssh2_session_last_errno(sshc->ssh_session);
+ if(err == LIBSSH2_ERROR_EAGAIN)
+ rc = LIBSSH2_ERROR_EAGAIN;
else {
- err = libssh2_session_last_errno(sshc->ssh_session);
- if(err == LIBSSH2_ERROR_EAGAIN)
- rc = LIBSSH2_ERROR_EAGAIN;
- else {
- state(conn, SSH_SESSION_FREE);
- sshc->actualcode = libssh2_session_error_to_CURLE(err);
- }
- break;
+ state(conn, SSH_SESSION_FREE);
+ sshc->actualcode = libssh2_session_error_to_CURLE(err);
}
+ break;
}
infof(data, "SSH authentication methods available: %s\n",
sshc->authlist);
@@ -918,6 +916,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
&err_msg, NULL, 0);
infof(data, "SSH public key authentication failed: %s\n", err_msg);
state(conn, SSH_AUTH_PASS_INIT);
+ rc = 0; /* clear rc and continue */
}
break;
@@ -928,6 +927,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
else {
state(conn, SSH_AUTH_HOST_INIT);
+ rc = 0; /* clear rc and continue */
}
break;
@@ -940,7 +940,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc == 0) {
+ if(rc == 0) {
sshc->authed = TRUE;
infof(data, "Initialized password authentication\n");
state(conn, SSH_AUTH_DONE);
@@ -989,6 +989,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc < 0) {
infof(data, "Failure connecting to agent\n");
state(conn, SSH_AUTH_KEY_INIT);
+ rc = 0; /* clear rc and continue */
}
else {
state(conn, SSH_AUTH_AGENT_LIST);
@@ -1008,6 +1009,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc < 0) {
infof(data, "Failure requesting identities to agent\n");
state(conn, SSH_AUTH_KEY_INIT);
+ rc = 0; /* clear rc and continue */
}
else {
state(conn, SSH_AUTH_AGENT);
@@ -1077,7 +1079,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc == 0) {
+ if(rc == 0) {
sshc->authed = TRUE;
infof(data, "Initialized keyboard interactive authentication\n");
}
@@ -1116,21 +1118,19 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
*/
sshc->sftp_session = libssh2_sftp_init(sshc->ssh_session);
if(!sshc->sftp_session) {
+ char *err_msg;
if(libssh2_session_last_errno(sshc->ssh_session) ==
LIBSSH2_ERROR_EAGAIN) {
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- else {
- char *err_msg;
- (void)libssh2_session_last_error(sshc->ssh_session,
- &err_msg, NULL, 0);
- failf(data, "Failure initializing sftp session: %s", err_msg);
- state(conn, SSH_SESSION_FREE);
- sshc->actualcode = CURLE_FAILED_INIT;
- break;
- }
+ (void)libssh2_session_last_error(sshc->ssh_session,
+ &err_msg, NULL, 0);
+ failf(data, "Failure initializing sftp session: %s", err_msg);
+ state(conn, SSH_SESSION_FREE);
+ sshc->actualcode = CURLE_FAILED_INIT;
+ break;
}
state(conn, SSH_SFTP_REALPATH);
break;
@@ -1147,7 +1147,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc > 0) {
+ if(rc > 0) {
/* It seems that this string is not always NULL terminated */
tempHome[rc] = '\0';
sshc->homedir = strdup(tempHome);
@@ -1261,7 +1261,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_SFTP_NEXT_QUOTE);
break;
}
- else if(cmd) {
+ if(cmd) {
/*
* the arguments following the command must be separated from the
* command with a space so we can check for it unconditionally
@@ -1321,7 +1321,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_SFTP_QUOTE_STAT);
break;
}
- else if(strncasecompare(cmd, "ln ", 3) ||
+ if(strncasecompare(cmd, "ln ", 3) ||
strncasecompare(cmd, "symlink ", 8)) {
/* symbolic linking */
/* sshc->quote_path1 is the source */
@@ -1443,7 +1443,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
+ if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
@@ -1514,7 +1514,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
@@ -1537,7 +1537,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
@@ -1558,7 +1558,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
failf(data, "mkdir command failed: %s", sftp_libssh2_strerror(err));
@@ -1582,7 +1582,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
@@ -1601,7 +1601,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
failf(data, "rmdir command failed: %s", sftp_libssh2_strerror(err));
@@ -1619,7 +1619,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
failf(data, "rm command failed: %s", sftp_libssh2_strerror(err));
@@ -1642,7 +1642,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc != 0 && !sshc->acceptfail) {
+ if(rc != 0 && !sshc->acceptfail) {
err = sftp_libssh2_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
failf(data, "statvfs command failed: %s", sftp_libssh2_strerror(err));
@@ -1705,7 +1705,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc == 0) {
+ if(rc == 0) {
data->info.filetime = (long)attrs.mtime;
}
@@ -1743,7 +1743,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc) {
+ if(rc) {
data->state.resume_from = 0;
}
else {
@@ -1778,47 +1778,47 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(LIBSSH2_ERROR_EAGAIN == rc)
break;
- else {
- if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
- /* only when there was an SFTP protocol error can we extract
- the sftp error! */
- err = sftp_libssh2_last_error(sshc->sftp_session);
- else
- err = -1; /* not an sftp error at all */
- if(sshc->secondCreateDirs) {
- state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = err>= LIBSSH2_FX_OK?
- sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
- failf(data, "Creating the dir/file failed: %s",
- sftp_libssh2_strerror(err));
- break;
- }
- else if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
- (err == LIBSSH2_FX_FAILURE) ||
- (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
- (data->set.ftp_create_missing_dirs &&
- (strlen(sftp_scp->path) > 1))) {
- /* try to create the path remotely */
- sshc->secondCreateDirs = 1;
- state(conn, SSH_SFTP_CREATE_DIRS_INIT);
- break;
- }
+ if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
+ /* only when there was an SFTP protocol error can we extract
+ the sftp error! */
+ err = sftp_libssh2_last_error(sshc->sftp_session);
+ else
+ err = -1; /* not an sftp error at all */
+
+ if(sshc->secondCreateDirs) {
state(conn, SSH_SFTP_CLOSE);
sshc->actualcode = err>= LIBSSH2_FX_OK?
sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
- if(!sshc->actualcode) {
- /* Sometimes, for some reason libssh2_sftp_last_error() returns
- zero even though libssh2_sftp_open() failed previously! We need
- to work around that! */
- sshc->actualcode = CURLE_SSH;
- err=-1;
- }
- failf(data, "Upload failed: %s (%d/%d)",
- err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
- err, rc);
+ failf(data, "Creating the dir/file failed: %s",
+ sftp_libssh2_strerror(err));
+ break;
+ }
+ if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
+ (err == LIBSSH2_FX_FAILURE) ||
+ (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
+ (data->set.ftp_create_missing_dirs &&
+ (strlen(sftp_scp->path) > 1))) {
+ /* try to create the path remotely */
+ rc = 0; /* clear rc and continue */
+ sshc->secondCreateDirs = 1;
+ state(conn, SSH_SFTP_CREATE_DIRS_INIT);
break;
}
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = err>= LIBSSH2_FX_OK?
+ sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
+ if(!sshc->actualcode) {
+ /* Sometimes, for some reason libssh2_sftp_last_error() returns
+ zero even though libssh2_sftp_open() failed previously! We need
+ to work around that! */
+ sshc->actualcode = CURLE_SSH;
+ err=-1;
+ }
+ failf(data, "Upload failed: %s (%d/%d)",
+ err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
+ err, rc);
+ break;
}
/* If we have a restart point then we need to seek to the correct
@@ -1831,32 +1831,31 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
if(seekerr != CURL_SEEKFUNC_OK) {
+ curl_off_t passed=0;
if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
failf(data, "Could not seek stream");
return CURLE_FTP_COULDNT_USE_REST;
}
/* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
- else {
- curl_off_t passed=0;
- do {
- size_t readthisamountnow =
- (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ?
- BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
-
- size_t actuallyread =
- data->state.fread_func(data->state.buffer, 1,
- readthisamountnow, data->state.in);
-
- passed += actuallyread;
- if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
- /* this checks for greater-than only to make sure that the
- CURL_READFUNC_ABORT return code still aborts */
- failf(data, "Failed to read data");
- return CURLE_FTP_COULDNT_USE_REST;
- }
- } while(passed < data->state.resume_from);
- }
+ do {
+ size_t readthisamountnow =
+ (data->state.resume_from - passed > data->set.buffer_size) ?
+ (size_t)data->set.buffer_size :
+ curlx_sotouz(data->state.resume_from - passed);
+
+ size_t actuallyread =
+ data->state.fread_func(data->state.buffer, 1,
+ readthisamountnow, data->state.in);
+
+ passed += actuallyread;
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+ /* this checks for greater-than only to make sure that the
+ CURL_READFUNC_ABORT return code still aborts */
+ failf(data, "Failed to read data");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ } while(passed < data->state.resume_from);
}
/* now, decrease the size of the read */
@@ -1895,7 +1894,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* since we don't really wait for anything at this point, we want the
state machine to move on as soon as possible so we set a very short
timeout here */
- Curl_expire(data, 0);
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
state(conn, SSH_STOP);
}
@@ -1921,9 +1920,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
break;
}
- else {
- state(conn, SSH_SFTP_UPLOAD_INIT);
- }
+ state(conn, SSH_SFTP_UPLOAD_INIT);
break;
case SSH_SFTP_CREATE_DIRS_MKDIR:
@@ -1936,7 +1933,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
*sshc->slash_pos = '/';
++sshc->slash_pos;
- if(rc == -1) {
+ if(rc < 0) {
/*
* Abort if failure wasn't that the dir already exists or the
* permission was denied (creation might succeed further down the
@@ -1951,6 +1948,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
sshc->actualcode = result?result:CURLE_SSH;
break;
}
+ rc = 0; /* clear rc and continue */
}
state(conn, SSH_SFTP_CREATE_DIRS);
break;
@@ -1977,15 +1975,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- else {
- err = sftp_libssh2_last_error(sshc->sftp_session);
- failf(data, "Could not open directory for reading: %s",
- sftp_libssh2_strerror(err));
- state(conn, SSH_SFTP_CLOSE);
- result = sftp_libssh2_error_to_CURLE(err);
- sshc->actualcode = result?result:CURLE_SSH;
- break;
- }
+ err = sftp_libssh2_last_error(sshc->sftp_session);
+ failf(data, "Could not open directory for reading: %s",
+ sftp_libssh2_strerror(err));
+ state(conn, SSH_SFTP_CLOSE);
+ result = sftp_libssh2_error_to_CURLE(err);
+ sshc->actualcode = result?result:CURLE_SSH;
+ break;
}
sshc->readdir_filename = malloc(PATH_MAX+1);
if(!sshc->readdir_filename) {
@@ -2192,15 +2188,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- else {
- err = sftp_libssh2_last_error(sshc->sftp_session);
- failf(data, "Could not open remote file for reading: %s",
- sftp_libssh2_strerror(err));
- state(conn, SSH_SFTP_CLOSE);
- result = sftp_libssh2_error_to_CURLE(err);
- sshc->actualcode = result?result:CURLE_SSH;
- break;
- }
+ err = sftp_libssh2_last_error(sshc->sftp_session);
+ failf(data, "Could not open remote file for reading: %s",
+ sftp_libssh2_strerror(err));
+ state(conn, SSH_SFTP_CLOSE);
+ result = sftp_libssh2_error_to_CURLE(err);
+ sshc->actualcode = result?result:CURLE_SSH;
+ break;
}
state(conn, SSH_SFTP_DOWNLOAD_STAT);
break;
@@ -2215,7 +2209,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc ||
+ if(rc ||
!(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) ||
(attrs.filesize == 0)) {
/*
@@ -2313,18 +2307,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_STOP);
break;
}
- else {
- Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
- FALSE, NULL, -1, NULL);
+ Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
+ FALSE, NULL, -1, NULL);
- /* not set by Curl_setup_transfer to preserve keepon bits */
- conn->writesockfd = conn->sockfd;
+ /* not set by Curl_setup_transfer to preserve keepon bits */
+ conn->writesockfd = conn->sockfd;
+
+ /* we want to use the _receiving_ function even when the socket turns
+ out writableable as the underlying libssh2 recv function will deal
+ with both accordingly */
+ conn->cselect_bits = CURL_CSELECT_IN;
- /* we want to use the _receiving_ function even when the socket turns
- out writableable as the underlying libssh2 recv function will deal
- with both accordingly */
- conn->cselect_bits = CURL_CSELECT_IN;
- }
if(result) {
/* this should never occur; the close state should be entered
at the time the error occurs */
@@ -2342,7 +2335,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to close libssh2 file\n");
}
sshc->sftp_handle = NULL;
@@ -2376,7 +2369,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to close libssh2 file\n");
}
sshc->sftp_handle = NULL;
@@ -2386,7 +2379,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to stop libssh2 sftp subsystem\n");
}
sshc->sftp_session = NULL;
@@ -2431,22 +2424,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
data->state.infilesize);
if(!sshc->ssh_channel) {
+ int ssh_err;
+ char *err_msg;
+
if(libssh2_session_last_errno(sshc->ssh_session) ==
LIBSSH2_ERROR_EAGAIN) {
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- else {
- int ssh_err;
- char *err_msg;
- ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
- &err_msg, NULL, 0));
- failf(conn->data, "%s", err_msg);
- state(conn, SSH_SCP_CHANNEL_FREE);
- sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
- break;
- }
+ ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
+ &err_msg, NULL, 0));
+ failf(conn->data, "%s", err_msg);
+ state(conn, SSH_SCP_CHANNEL_FREE);
+ sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
+ break;
}
/* upload data */
@@ -2501,22 +2493,22 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
#endif
if(!sshc->ssh_channel) {
+ int ssh_err;
+ char *err_msg;
+
if(libssh2_session_last_errno(sshc->ssh_session) ==
LIBSSH2_ERROR_EAGAIN) {
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- else {
- int ssh_err;
- char *err_msg;
- ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
- &err_msg, NULL, 0));
- failf(conn->data, "%s", err_msg);
- state(conn, SSH_SCP_CHANNEL_FREE);
- sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
- break;
- }
+
+ ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
+ &err_msg, NULL, 0));
+ failf(conn->data, "%s", err_msg);
+ state(conn, SSH_SCP_CHANNEL_FREE);
+ sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
+ break;
}
/* download data */
@@ -2554,7 +2546,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc) {
+ if(rc) {
infof(data, "Failed to send libssh2 channel EOF\n");
}
}
@@ -2567,7 +2559,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc) {
+ if(rc) {
infof(data, "Failed to get channel EOF: %d\n", rc);
}
}
@@ -2580,7 +2572,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc) {
+ if(rc) {
infof(data, "Channel failed to close: %d\n", rc);
}
}
@@ -2593,7 +2585,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to free libssh2 scp subsystem\n");
}
sshc->ssh_channel = NULL;
@@ -2615,7 +2607,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to free libssh2 scp subsystem\n");
}
sshc->ssh_channel = NULL;
@@ -2626,7 +2618,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to disconnect libssh2 session\n");
}
}
@@ -2651,7 +2643,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to disconnect from libssh2 agent\n");
}
libssh2_agent_free(sshc->ssh_agent);
@@ -2669,7 +2661,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- else if(rc < 0) {
+ if(rc < 0) {
infof(data, "Failed to free libssh2 session\n");
}
sshc->ssh_session = NULL;
@@ -2826,7 +2818,7 @@ static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
}
static CURLcode ssh_block_statemach(struct connectdata *conn,
- bool duringconnect)
+ bool disconnect)
{
struct ssh_conn *sshc = &conn->proto.sshc;
CURLcode result = CURLE_OK;
@@ -2834,25 +2826,26 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
while((sshc->state != SSH_STOP) && !result) {
bool block;
- long left;
+ time_t left = 1000;
+ struct curltime now = Curl_tvnow();
result = ssh_statemach_act(conn, &block);
if(result)
break;
- if(Curl_pgrsUpdate(conn))
- return CURLE_ABORTED_BY_CALLBACK;
- else {
- struct timeval now = Curl_tvnow();
+ if(!disconnect) {
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
result = Curl_speedcheck(data, now);
if(result)
break;
- }
- left = Curl_timeleft(data, NULL, duringconnect);
- if(left < 0) {
- failf(data, "Operation timed out");
- return CURLE_OPERATION_TIMEDOUT;
+ left = Curl_timeleft(data, NULL, FALSE);
+ if(left < 0) {
+ failf(data, "Operation timed out");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
}
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
@@ -3068,7 +3061,7 @@ static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection)
state(conn, SSH_SESSION_DISCONNECT);
- result = ssh_block_statemach(conn, FALSE);
+ result = ssh_block_statemach(conn, TRUE);
}
return result;
@@ -3222,7 +3215,7 @@ static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
if(conn->proto.sshc.ssh_session) {
/* only if there's a session still around to use! */
state(conn, SSH_SFTP_SHUTDOWN);
- result = ssh_block_statemach(conn, FALSE);
+ result = ssh_block_statemach(conn, TRUE);
}
DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
diff --git a/lib/strcase.c b/lib/strcase.c
index a750f7b4..a74a4be5 100644
--- a/lib/strcase.c
+++ b/lib/strcase.c
@@ -125,9 +125,9 @@ int Curl_safe_strcasecompare(const char *first, const char *second)
if(first && second)
/* both pointers point to something then compare them */
return Curl_strcasecompare(first, second);
- else
- /* if both pointers are NULL then treat them as equal */
- return (NULL == first && NULL == second);
+
+ /* if both pointers are NULL then treat them as equal */
+ return (NULL == first && NULL == second);
}
/*
diff --git a/lib/strerror.c b/lib/strerror.c
index 7e5cde47..83a96dda 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2004 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2004 - 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
@@ -49,6 +49,10 @@
#include "curl_memory.h"
#include "memdebug.h"
+#if defined(WIN32) || defined(_WIN32_WCE)
+#define PRESERVE_WINDOWS_ERROR_CODE
+#endif
+
const char *
curl_easy_strerror(CURLcode error)
{
@@ -432,6 +436,10 @@ curl_share_strerror(CURLSHcode error)
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;
const char *p;
#ifndef CURL_DISABLE_VERBOSE_STRINGS
@@ -611,6 +619,15 @@ get_winsock_error (int err, char *buf, size_t len)
#endif
strncpy(buf, p, len);
buf [len-1] = '\0';
+
+ if(errno != old_errno)
+ errno = old_errno;
+
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ if(old_win_err != GetLastError())
+ SetLastError(old_win_err);
+#endif
+
return buf;
}
#endif /* USE_WINSOCK */
@@ -628,9 +645,12 @@ get_winsock_error (int err, char *buf, size_t len)
*/
const char *Curl_strerror(struct connectdata *conn, int err)
{
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ DWORD old_win_err = GetLastError();
+#endif
+ int old_errno = errno;
char *buf, *p;
size_t max;
- int old_errno = ERRNO;
DEBUGASSERT(conn);
DEBUGASSERT(err >= 0);
@@ -722,8 +742,13 @@ const char *Curl_strerror(struct connectdata *conn, int err)
if(p && (p - buf) >= 1)
*p = '\0';
- if(old_errno != ERRNO)
- SET_ERRNO(old_errno);
+ if(errno != old_errno)
+ errno = old_errno;
+
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ if(old_win_err != GetLastError())
+ SetLastError(old_win_err);
+#endif
return buf;
}
@@ -731,16 +756,19 @@ const char *Curl_strerror(struct connectdata *conn, int err)
#ifdef USE_WINDOWS_SSPI
const char *Curl_sspi_strerror (struct connectdata *conn, int err)
{
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ DWORD old_win_err = GetLastError();
+#endif
+ int old_errno = errno;
+ const char *txt;
+ char *outbuf;
+ size_t outmax;
#ifndef CURL_DISABLE_VERBOSE_STRINGS
char txtbuf[80];
char msgbuf[sizeof(conn->syserr_buf)];
char *p, *str, *msg = NULL;
bool msg_formatted = FALSE;
- int old_errno;
#endif
- const char *txt;
- char *outbuf;
- size_t outmax;
DEBUGASSERT(conn);
@@ -750,8 +778,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
#ifndef CURL_DISABLE_VERBOSE_STRINGS
- old_errno = ERRNO;
-
switch(err) {
case SEC_E_OK:
txt = "No error";
@@ -1051,9 +1077,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
strncpy(outbuf, str, outmax);
}
- if(old_errno != ERRNO)
- SET_ERRNO(old_errno);
-
#else
if(err == SEC_E_OK)
@@ -1067,6 +1090,14 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
outbuf[outmax] = '\0';
+ if(errno != old_errno)
+ errno = old_errno;
+
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ if(old_win_err != GetLastError())
+ SetLastError(old_win_err);
+#endif
+
return outbuf;
}
#endif /* USE_WINDOWS_SSPI */
diff --git a/lib/strtoofft.c b/lib/strtoofft.c
index b854bf4d..c2adc728 100644
--- a/lib/strtoofft.c
+++ b/lib/strtoofft.c
@@ -29,7 +29,7 @@
*
* In the ISO C standard (IEEE Std 1003.1), there is a strtoimax() function we
* could use in case strtoll() doesn't exist... See
- * http://www.opengroup.org/onlinepubs/009695399/functions/strtoimax.html
+ * https://www.opengroup.org/onlinepubs/009695399/functions/strtoimax.html
*/
#ifdef NEED_CURL_STRTOLL
@@ -132,7 +132,7 @@ curlx_strtoll(const char *nptr, char **endptr, int base)
else
value = CURL_OFF_T_MAX;
- SET_ERRNO(ERANGE);
+ errno = ERANGE;
}
if(endptr)
diff --git a/lib/system_win32.c b/lib/system_win32.c
index 78737593..cfbbf327 100644
--- a/lib/system_win32.c
+++ b/lib/system_win32.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2017, 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
@@ -68,7 +68,7 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
*
* majorVersion [in] - The major version number.
* minorVersion [in] - The minor version number.
- * platform [in] - The optional platform identifer.
+ * platform [in] - The optional platform identifier.
* condition [in] - The test condition used to specifier whether we are
* checking a version less then, equal to or greater than
* what is specified in the major and minor version
diff --git a/lib/telnet.c b/lib/telnet.c
index 551af60f..3dec9590 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -81,10 +81,12 @@
} WHILE_FALSE
#define CURL_SB_GET(x) ((*x->subpointer++)&0xff)
-#define CURL_SB_PEEK(x) ((*x->subpointer)&0xff)
-#define CURL_SB_EOF(x) (x->subpointer >= x->subend)
#define CURL_SB_LEN(x) (x->subend - x->subpointer)
+/* For posterity:
+#define CURL_SB_PEEK(x) ((*x->subpointer)&0xff)
+#define CURL_SB_EOF(x) (x->subpointer >= x->subend) */
+
#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define printoption(a,b,c,d) Curl_nop_stmt
#endif
@@ -190,6 +192,7 @@ const struct Curl_handler Curl_handler_telnet = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_TELNET, /* defport */
CURLPROTO_TELNET, /* protocol */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
@@ -872,7 +875,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
continue;
}
- /* Window Size */
+ /* Window Size */
if(strcasecompare(option_keyword, "WS")) {
if(sscanf(option_arg, "%hu%*[xX]%hu",
&tn->subopt_wsx, &tn->subopt_wsy) == 2)
@@ -896,14 +899,12 @@ static CURLcode check_telnet_options(struct connectdata *conn)
}
failf(data, "Unknown telnet option %s", head->data);
- result = CURLE_UNKNOWN_TELNET_OPTION;
- break;
- }
- else {
- failf(data, "Syntax error in telnet option: %s", head->data);
- result = CURLE_TELNET_OPTION_SYNTAX;
+ result = CURLE_UNKNOWN_OPTION;
break;
}
+ failf(data, "Syntax error in telnet option: %s", head->data);
+ result = CURLE_TELNET_OPTION_SYNTAX;
+ break;
}
if(result) {
@@ -1016,7 +1017,7 @@ static void sendsuboption(struct connectdata *conn, int option)
CURL_SB_ACCUM(tn, CURL_IAC);
CURL_SB_ACCUM(tn, CURL_SB);
CURL_SB_ACCUM(tn, CURL_TELOPT_NAWS);
- /* We must deal either with litte or big endien processors */
+ /* We must deal either with litte or big endian processors */
/* Window size must be sent according to the 'network order' */
x=htons(tn->subopt_wsx);
y=htons(tn->subopt_wsy);
@@ -1186,7 +1187,7 @@ CURLcode telrcv(struct connectdata *conn,
* IAC SE was left off, or another option got inserted into the
* suboption are all possibilities. If we assume that the IAC was
* not doubled, and really the IAC SE was left off, we could get
- * into an infinate loop here. So, instead, we terminate the
+ * into an infinite loop here. So, instead, we terminate the
* suboption, and process the partial suboption if we can.
*/
CURL_SB_ACCUM(tn, CURL_IAC);
@@ -1220,43 +1221,63 @@ CURLcode telrcv(struct connectdata *conn,
}
/* Escape and send a telnet data block */
-/* TODO: write large chunks of data instead of one byte at a time */
static CURLcode send_telnet_data(struct connectdata *conn,
char *buffer, ssize_t nread)
{
- unsigned char outbuf[2];
- ssize_t bytes_written, total_written;
- int out_count;
+ ssize_t escapes, i, j, outlen;
+ unsigned char *outbuf = NULL;
CURLcode result = CURLE_OK;
+ ssize_t bytes_written, total_written;
- while(!result && nread--) {
- outbuf[0] = *buffer++;
- out_count = 1;
- if(outbuf[0] == CURL_IAC)
- outbuf[out_count++] = CURL_IAC;
-
- total_written = 0;
- do {
- /* Make sure socket is writable to avoid EWOULDBLOCK condition */
- struct pollfd pfd[1];
- pfd[0].fd = conn->sock[FIRSTSOCKET];
- pfd[0].events = POLLOUT;
- switch(Curl_poll(pfd, 1, -1)) {
- case -1: /* error, abort writing */
- case 0: /* timeout (will never happen) */
- result = CURLE_SEND_ERROR;
- break;
- default: /* write! */
- bytes_written = 0;
- result = Curl_write(conn, conn->sock[FIRSTSOCKET],
- outbuf+total_written, out_count-total_written,
- &bytes_written);
- total_written += bytes_written;
- break;
- }
- /* handle partial write */
- } while(!result && total_written < out_count);
+ /* Determine size of new buffer after escaping */
+ escapes = 0;
+ for(i = 0; i < nread; i++)
+ if((unsigned char)buffer[i] == CURL_IAC)
+ escapes++;
+ outlen = nread + escapes;
+
+ if(outlen == nread)
+ outbuf = (unsigned char *)buffer;
+ else {
+ outbuf = malloc(nread + escapes + 1);
+ if(!outbuf)
+ return CURLE_OUT_OF_MEMORY;
+
+ j = 0;
+ for(i = 0; i < nread; i++) {
+ outbuf[j++] = buffer[i];
+ if((unsigned char)buffer[i] == CURL_IAC)
+ outbuf[j++] = CURL_IAC;
+ }
+ outbuf[j] = '\0';
+ }
+
+ total_written = 0;
+ while(!result && total_written < outlen) {
+ /* Make sure socket is writable to avoid EWOULDBLOCK condition */
+ struct pollfd pfd[1];
+ pfd[0].fd = conn->sock[FIRSTSOCKET];
+ pfd[0].events = POLLOUT;
+ switch(Curl_poll(pfd, 1, -1)) {
+ case -1: /* error, abort writing */
+ case 0: /* timeout (will never happen) */
+ result = CURLE_SEND_ERROR;
+ break;
+ default: /* write! */
+ bytes_written = 0;
+ result = Curl_write(conn, conn->sock[FIRSTSOCKET],
+ outbuf + total_written,
+ outlen - total_written,
+ &bytes_written);
+ total_written += bytes_written;
+ break;
+ }
}
+
+ /* Free malloc copy if escaped */
+ if(outbuf != (unsigned char *)buffer)
+ free(outbuf);
+
return result;
}
@@ -1306,7 +1327,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
curl_off_t total_ul = 0;
#endif
ssize_t nread;
- struct timeval now;
+ struct curltime now;
bool keepon = TRUE;
char *buf = data->state.buffer;
struct TELNET *tn;
@@ -1326,7 +1347,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
#ifdef USE_WINSOCK
/*
** This functionality only works with WinSock >= 2.0. So,
- ** make sure have it.
+ ** make sure we have it.
*/
result = check_wsock2(data);
if(result)
@@ -1336,14 +1357,14 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* load ws2_32.dll and get the function pointers we need. */
wsock2 = Curl_load_library(TEXT("WS2_32.DLL"));
if(wsock2 == NULL) {
- failf(data, "failed to load WS2_32.DLL (%d)", ERRNO);
+ failf(data, "failed to load WS2_32.DLL (%u)", GetLastError());
return CURLE_FAILED_INIT;
}
/* Grab a pointer to WSACreateEvent */
create_event_func = GetProcAddress(wsock2, "WSACreateEvent");
if(create_event_func == NULL) {
- failf(data, "failed to find WSACreateEvent function (%d)", ERRNO);
+ failf(data, "failed to find WSACreateEvent function (%u)", GetLastError());
FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
@@ -1351,7 +1372,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* And WSACloseEvent */
close_event_func = GetProcAddress(wsock2, "WSACloseEvent");
if(close_event_func == NULL) {
- failf(data, "failed to find WSACloseEvent function (%d)", ERRNO);
+ failf(data, "failed to find WSACloseEvent function (%u)", GetLastError());
FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
@@ -1359,7 +1380,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* And WSAEventSelect */
event_select_func = GetProcAddress(wsock2, "WSAEventSelect");
if(event_select_func == NULL) {
- failf(data, "failed to find WSAEventSelect function (%d)", ERRNO);
+ failf(data, "failed to find WSAEventSelect function (%u)", GetLastError());
FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
@@ -1367,7 +1388,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* And WSAEnumNetworkEvents */
enum_netevents_func = GetProcAddress(wsock2, "WSAEnumNetworkEvents");
if(enum_netevents_func == NULL) {
- failf(data, "failed to find WSAEnumNetworkEvents function (%d)", ERRNO);
+ failf(data, "failed to find WSAEnumNetworkEvents function (%u)",
+ GetLastError());
FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
@@ -1416,28 +1438,29 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* Keep on listening and act on events */
while(keepon) {
+ const DWORD buf_size = (DWORD)data->set.buffer_size;
waitret = WaitForMultipleObjects(obj_count, objs, FALSE, wait_timeout);
switch(waitret) {
case WAIT_TIMEOUT:
{
for(;;) {
if(data->set.is_fread_set) {
+ size_t n;
/* read from user-supplied method */
- result = (int)data->state.fread_func(buf, 1, BUFSIZE - 1,
- data->state.in);
- if(result == CURL_READFUNC_ABORT) {
+ n = data->state.fread_func(buf, 1, buf_size, data->state.in);
+ if(n == CURL_READFUNC_ABORT) {
keepon = FALSE;
result = CURLE_READ_ERROR;
break;
}
- if(result == CURL_READFUNC_PAUSE)
+ if(n == CURL_READFUNC_PAUSE)
break;
- if(result == 0) /* no bytes */
+ if(n == 0) /* no bytes */
break;
- readfile_read = result; /* fall thru with number of bytes read */
+ readfile_read = (DWORD)n; /* fall thru with number of bytes read */
}
else {
/* read from stdin */
@@ -1451,7 +1474,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
if(!readfile_read)
break;
- if(!ReadFile(stdin_handle, buf, sizeof(data->state.buffer),
+ if(!ReadFile(stdin_handle, buf, buf_size,
&readfile_read, NULL)) {
keepon = FALSE;
result = CURLE_READ_ERROR;
@@ -1470,7 +1493,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
case WAIT_OBJECT_0 + 1:
{
- if(!ReadFile(stdin_handle, buf, sizeof(data->state.buffer),
+ if(!ReadFile(stdin_handle, buf, buf_size,
&readfile_read, NULL)) {
keepon = FALSE;
result = CURLE_READ_ERROR;
@@ -1499,7 +1522,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
}
if(events.lNetworkEvents & FD_READ) {
/* read data from network */
- result = Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
+ result = Curl_read(conn, sockfd, buf, data->set.buffer_size, &nread);
/* read would've blocked. Loop again */
if(result == CURLE_AGAIN)
break;
@@ -1559,7 +1582,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
/* We called LoadLibrary, so call FreeLibrary */
if(!FreeLibrary(wsock2))
- infof(data, "FreeLibrary(wsock2) failed (%d)", ERRNO);
+ infof(data, "FreeLibrary(wsock2) failed (%u)", GetLastError());
#else
pfd[0].fd = sockfd;
pfd[0].events = POLLIN;
@@ -1588,12 +1611,12 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
default: /* read! */
if(pfd[0].revents & POLLIN) {
/* read data from network */
- result = Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
+ result = Curl_read(conn, sockfd, buf, data->set.buffer_size, &nread);
/* read would've blocked. Loop again */
if(result == CURLE_AGAIN)
break;
/* returned not-zero, this an error */
- else if(result) {
+ if(result) {
keepon = FALSE;
break;
}
@@ -1624,12 +1647,12 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
nread = 0;
if(poll_cnt == 2) {
if(pfd[1].revents & POLLIN) { /* read from in file */
- nread = read(pfd[1].fd, buf, BUFSIZE - 1);
+ nread = read(pfd[1].fd, buf, data->set.buffer_size);
}
}
else {
/* read from user-supplied method */
- nread = (int)data->state.fread_func(buf, 1, BUFSIZE - 1,
+ nread = (int)data->state.fread_func(buf, 1, data->set.buffer_size,
data->state.in);
if(nread == CURL_READFUNC_ABORT) {
keepon = FALSE;
diff --git a/lib/tftp.c b/lib/tftp.c
index f2f83477..f6f4bce5 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -181,6 +181,7 @@ const struct Curl_handler Curl_handler_tftp = {
ZERO_NULL, /* perform_getsock */
tftp_disconnect, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
PORT_TFTP, /* defport */
CURLPROTO_TFTP, /* protocol */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
@@ -359,7 +360,7 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
failf(data, "invalid blocksize value in OACK packet");
return CURLE_TFTP_ILLEGAL;
}
- else if(blksize > TFTP_BLKSIZE_MAX) {
+ if(blksize > TFTP_BLKSIZE_MAX) {
failf(data, "%s (%d)", "blksize is larger than max supported",
TFTP_BLKSIZE_MAX);
return CURLE_TFTP_ILLEGAL;
@@ -490,6 +491,11 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
if(result)
return result;
+ if(strlen(filename) > (state->blksize - strlen(mode) - 4)) {
+ failf(data, "TFTP file name too long\n");
+ 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');
@@ -1119,7 +1125,8 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
}
else {
/* The event is given by the TFTP packet time */
- state->event = (tftp_event_t)getrpacketevent(&state->rpacket);
+ unsigned short event = getrpacketevent(&state->rpacket);
+ state->event = (tftp_event_t)event;
switch(state->event) {
case TFTP_EVENT_DATA:
@@ -1138,9 +1145,12 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
}
break;
case TFTP_EVENT_ERROR:
- state->error = (tftp_error_t)getrpacketblock(&state->rpacket);
+ {
+ unsigned short error = getrpacketblock(&state->rpacket);
+ state->error = (tftp_error_t)error;
infof(data, "%s\n", (const char *)state->rpacket.data+4);
break;
+ }
case TFTP_EVENT_ACK:
break;
case TFTP_EVENT_OACK:
@@ -1189,7 +1199,7 @@ static long tftp_state_timeout(struct connectdata *conn, tftp_event_t *event)
state->state = TFTP_STATE_FIN;
return 0;
}
- else if(current > state->rx_time+state->retry_time) {
+ if(current > state->rx_time+state->retry_time) {
if(event)
*event = TFTP_EVENT_TIMEOUT;
time(&state->rx_time); /* update even though we received nothing */
@@ -1223,7 +1233,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
failf(data, "TFTP response timeout");
return CURLE_OPERATION_TIMEDOUT;
}
- else if(event != TFTP_EVENT_NONE) {
+ if(event != TFTP_EVENT_NONE) {
result = tftp_state_machine(state, event);
if(result)
return result;
@@ -1340,7 +1350,7 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
state = (tftp_state_data_t *)conn->proto.tftpc;
if(!state)
- return CURLE_BAD_CALLING_ORDER;
+ return CURLE_TFTP_ILLEGAL;
result = tftp_perform(conn, done);
diff --git a/lib/timeval.c b/lib/timeval.c
index f3b207a3..69a8fb1f 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -24,14 +24,14 @@
#if defined(WIN32) && !defined(MSDOS)
-struct timeval curlx_tvnow(void)
+struct curltime curlx_tvnow(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 timeval now;
+ struct curltime now;
#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \
(_WIN32_WINNT < _WIN32_WINNT_VISTA)
DWORD milliseconds = GetTickCount();
@@ -39,8 +39,8 @@ struct timeval curlx_tvnow(void)
now.tv_usec = (milliseconds % 1000) * 1000;
#else
ULONGLONG milliseconds = GetTickCount64();
- now.tv_sec = (long) (milliseconds / 1000);
- now.tv_usec = (long) (milliseconds % 1000) * 1000;
+ now.tv_sec = (time_t) (milliseconds / 1000);
+ now.tv_usec = (unsigned int) (milliseconds % 1000) * 1000;
#endif
return now;
@@ -48,7 +48,7 @@ struct timeval curlx_tvnow(void)
#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
-struct timeval curlx_tvnow(void)
+struct curltime curlx_tvnow(void)
{
/*
** clock_gettime() is granted to be increased monotonically when the
@@ -58,10 +58,11 @@ struct timeval curlx_tvnow(void)
** system has started up.
*/
struct timeval now;
+ struct curltime cnow;
struct timespec tsnow;
if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
- now.tv_sec = tsnow.tv_sec;
- now.tv_usec = tsnow.tv_nsec / 1000;
+ cnow.tv_sec = tsnow.tv_sec;
+ cnow.tv_usec = (unsigned int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
@@ -69,20 +70,23 @@ struct timeval curlx_tvnow(void)
** run-time. When this occurs simply fallback to other time source.
*/
#ifdef HAVE_GETTIMEOFDAY
- else
+ else {
(void)gettimeofday(&now, NULL);
+ cnow.tv_sec = now.tv_sec;
+ cnow.tv_usec = (unsigned int)now.tv_usec;
+ }
#else
else {
- now.tv_sec = (long)time(NULL);
- now.tv_usec = 0;
+ cnow.tv_sec = time(NULL);
+ cnow.tv_usec = 0;
}
#endif
- return now;
+ return cnow;
}
#elif defined(HAVE_GETTIMEOFDAY)
-struct timeval curlx_tvnow(void)
+struct curltime curlx_tvnow(void)
{
/*
** gettimeofday() is not granted to be increased monotonically, due to
@@ -90,19 +94,22 @@ struct timeval curlx_tvnow(void)
** forward or backward in time.
*/
struct timeval now;
+ struct curltime ret;
(void)gettimeofday(&now, NULL);
- return now;
+ ret.tv_sec = now.tv_sec;
+ ret.tv_usec = now.tv_usec;
+ return ret;
}
#else
-struct timeval curlx_tvnow(void)
+struct curltime curlx_tvnow(void)
{
/*
** time() returns the value of time in seconds since the Epoch.
*/
- struct timeval now;
- now.tv_sec = (long)time(NULL);
+ struct curltime now;
+ now.tv_sec = time(NULL);
now.tv_usec = 0;
return now;
}
@@ -115,8 +122,10 @@ struct timeval curlx_tvnow(void)
*
* Returns: the time difference in number of milliseconds. For large diffs it
* returns 0x7fffffff on 32bit time_t systems.
+ *
+ * @unittest: 1323
*/
-time_t curlx_tvdiff(struct timeval newer, struct timeval older)
+time_t curlx_tvdiff(struct curltime newer, struct curltime older)
{
#if SIZEOF_TIME_T < 8
/* for 32bit time_t systems, add a precaution to avoid overflow for really
@@ -126,25 +135,28 @@ time_t curlx_tvdiff(struct timeval newer, struct timeval older)
return 0x7fffffff;
#endif
return (newer.tv_sec-older.tv_sec)*1000+
- (time_t)(newer.tv_usec-older.tv_usec)/1000;
+ (int)(newer.tv_usec-older.tv_usec)/1000;
}
/*
- * Same as curlx_tvdiff but with full usec resolution.
+ * Make sure that the first argument is the more recent time, as otherwise
+ * we'll get a weird negative time-diff back...
*
- * Returns: the time difference in seconds with subsecond resolution.
+ * Returns: the time difference in number of microseconds. For too large diffs
+ * it returns max value.
*/
-double curlx_tvdiff_secs(struct timeval newer, struct timeval older)
+time_t Curl_tvdiff_us(struct curltime newer, struct curltime older)
{
- if(newer.tv_sec != older.tv_sec)
- return (double)(newer.tv_sec-older.tv_sec)+
- (double)(newer.tv_usec-older.tv_usec)/1000000.0;
- else
- return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
-}
-
-/* return the number of seconds in the given input timeval struct */
-time_t Curl_tvlong(struct timeval t1)
-{
- return t1.tv_sec;
+ time_t diff = newer.tv_sec-older.tv_sec;
+#if SIZEOF_TIME_T < 8
+ /* for 32bit time_t systems */
+ if(diff >= (0x7fffffff/1000000))
+ return 0x7fffffff;
+#else
+ /* for 64bit time_t systems */
+ if(diff >= (0x7fffffffffffffffLL/1000000))
+ return 0x7fffffffffffffffLL;
+#endif
+ return (newer.tv_sec-older.tv_sec)*1000000+
+ (time_t)(newer.tv_usec-older.tv_usec);
}
diff --git a/lib/timeval.h b/lib/timeval.h
index 09f8b3a2..1ee4b304 100644
--- a/lib/timeval.h
+++ b/lib/timeval.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -29,7 +29,12 @@
#include "curl_setup.h"
-struct timeval curlx_tvnow(void);
+struct curltime {
+ time_t tv_sec; /* seconds */
+ unsigned int tv_usec; /* microseconds */
+};
+
+struct curltime curlx_tvnow(void);
/*
* Make sure that the first argument (t1) is the more recent time and t2 is
@@ -37,22 +42,20 @@ struct timeval curlx_tvnow(void);
*
* Returns: the time difference in number of milliseconds.
*/
-time_t curlx_tvdiff(struct timeval t1, struct timeval t2);
+time_t curlx_tvdiff(struct curltime t1, struct curltime t2);
/*
- * Same as curlx_tvdiff but with full usec resolution.
+ * Make sure that the first argument (t1) is the more recent time and t2 is
+ * the older time, as otherwise you get a weird negative time-diff back...
*
- * Returns: the time difference in seconds with subsecond resolution.
+ * Returns: the time difference in number of microseconds.
*/
-double curlx_tvdiff_secs(struct timeval t1, struct timeval t2);
-
-time_t Curl_tvlong(struct timeval t1);
+time_t Curl_tvdiff_us(struct curltime newer, struct curltime older);
/* These two defines below exist to provide the older API for library
internals only. */
#define Curl_tvnow() curlx_tvnow()
#define Curl_tvdiff(x,y) curlx_tvdiff(x,y)
-#define Curl_tvdiff_secs(x,y) curlx_tvdiff_secs(x,y)
#endif /* HEADER_CURL_TIMEVAL_H */
diff --git a/lib/transfer.c b/lib/transfer.c
index 750fb04e..81c056e0 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -117,7 +117,8 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
*nreadp = 0;
return CURLE_ABORTED_BY_CALLBACK;
}
- else if(nread == CURL_READFUNC_PAUSE) {
+ if(nread == CURL_READFUNC_PAUSE) {
+ struct SingleRequest *k = &data->req;
if(conn->handler->flags & PROTOPT_NONETWORK) {
/* protocols that work without network cannot be paused. This is
@@ -126,16 +127,15 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
failf(data, "Read callback asked for PAUSE when not supported!");
return CURLE_READ_ERROR;
}
- else {
- struct SingleRequest *k = &data->req;
- /* CURL_READFUNC_PAUSE pauses read callbacks that feed socket writes */
- k->keepon |= KEEP_SEND_PAUSE; /* mark socket send as paused */
- if(data->req.upload_chunky) {
+
+ /* CURL_READFUNC_PAUSE pauses read callbacks that feed socket writes */
+ k->keepon |= KEEP_SEND_PAUSE; /* mark socket send as paused */
+ if(data->req.upload_chunky) {
/* Back out the preallocation done above */
- data->req.upload_fromhere -= (8 + 2);
- }
- *nreadp = 0;
+ data->req.upload_fromhere -= (8 + 2);
}
+ *nreadp = 0;
+
return CURLE_OK; /* nothing was read */
}
else if((size_t)nread > buffersize) {
@@ -405,8 +405,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* This is where we loop until we have read everything there is to
read or we get a CURLE_AGAIN */
do {
- size_t buffersize = data->set.buffer_size?
- data->set.buffer_size : BUFSIZE;
+ size_t buffersize = data->set.buffer_size;
size_t bytestoread = buffersize;
if(
@@ -642,7 +641,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
failf(data, "%s in chunked-encoding", Curl_chunked_strerror(res));
return CURLE_RECV_ERROR;
}
- else if(CHUNKE_STOP == res) {
+ if(CHUNKE_STOP == res) {
size_t dataleft;
/* we're done reading chunks! */
k->keepon &= ~KEEP_RECV; /* read no more */
@@ -681,8 +680,6 @@ 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)) {
- /* The 'excess' amount below can't be more than BUFSIZE which
- always will fit in a size_t */
infof(data,
"Rewinding stream by : %zu"
" bytes on url %s (size = %" CURL_FORMAT_CURL_OFF_T
@@ -853,7 +850,6 @@ static CURLcode done_sending(struct connectdata *conn,
*/
static CURLcode readwrite_upload(struct Curl_easy *data,
struct connectdata *conn,
- struct SingleRequest *k,
int *didwhat)
{
ssize_t i, si;
@@ -861,6 +857,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
CURLcode result;
ssize_t nread; /* number of bytes read */
bool sending_http_headers = FALSE;
+ struct SingleRequest *k = &data->req;
if((k->bytecount == 0) && (k->writebytecount == 0))
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
@@ -871,15 +868,15 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
/* only read more data if there's no upload data already
present in the upload buffer */
- if(0 == data->req.upload_present) {
+ if(0 == k->upload_present) {
/* init the "upload from here" pointer */
- data->req.upload_fromhere = k->uploadbuf;
+ k->upload_fromhere = data->state.uploadbuffer;
if(!k->upload_done) {
/* HTTP pollution, this should be written nicer to become more
protocol agnostic. */
int fillcount;
- struct HTTP *http = data->req.protop;
+ struct HTTP *http = k->protop;
if((k->exp100 == EXP100_SENDING_REQUEST) &&
(http->sending == HTTPSEND_BODY)) {
@@ -892,7 +889,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
*didwhat &= ~KEEP_SEND; /* we didn't write anything actually */
/* set a timeout for the multi interface */
- Curl_expire(data, data->set.expect_100_timeout);
+ Curl_expire(data, data->set.expect_100_timeout, EXPIRE_100_TIMEOUT);
break;
}
@@ -905,7 +902,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
sending_http_headers = FALSE;
}
- result = Curl_fillreadbuffer(conn, BUFSIZE, &fillcount);
+ result = Curl_fillreadbuffer(conn, UPLOAD_BUFSIZE, &fillcount);
if(result)
return result;
@@ -918,7 +915,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
/* this is a paused transfer */
break;
}
- else if(nread<=0) {
+ if(nread<=0) {
result = done_sending(conn, k);
if(result)
return result;
@@ -926,7 +923,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
}
/* store number of bytes available for upload */
- data->req.upload_present = nread;
+ k->upload_present = nread;
/* convert LF to CRLF if so asked */
if((!sending_http_headers) && (
@@ -937,7 +934,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
(data->set.crlf))) {
/* Do we need to allocate a scratch buffer? */
if(!data->state.scratch) {
- data->state.scratch = malloc(2 * BUFSIZE);
+ data->state.scratch = malloc(2 * data->set.buffer_size);
if(!data->state.scratch) {
failf(data, "Failed to alloc scratch buffer!");
@@ -952,7 +949,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
* must be used instead of the escape sequences \r & \n.
*/
for(i = 0, si = 0; i < nread; i++, si++) {
- if(data->req.upload_fromhere[i] == 0x0a) {
+ if(k->upload_fromhere[i] == 0x0a) {
data->state.scratch[si++] = 0x0d;
data->state.scratch[si] = 0x0a;
if(!data->set.crlf) {
@@ -963,7 +960,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
}
}
else
- data->state.scratch[si] = data->req.upload_fromhere[i];
+ data->state.scratch[si] = k->upload_fromhere[i];
}
if(si != nread) {
@@ -972,10 +969,10 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
nread = si;
/* upload from the new (replaced) buffer instead */
- data->req.upload_fromhere = data->state.scratch;
+ k->upload_fromhere = data->state.scratch;
/* set the new amount too */
- data->req.upload_present = nread;
+ k->upload_present = nread;
}
}
@@ -986,7 +983,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
return result;
}
#endif /* CURL_DISABLE_SMTP */
- } /* if 0 == data->req.upload_present */
+ } /* if 0 == k->upload_present */
else {
/* We have a partial buffer left from a previous "round". Use
that instead of reading more data */
@@ -994,17 +991,17 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
/* write to socket (send away data) */
result = Curl_write(conn,
- conn->writesockfd, /* socket to send to */
- data->req.upload_fromhere, /* buffer pointer */
- data->req.upload_present, /* buffer size */
- &bytes_written); /* actually sent */
+ conn->writesockfd, /* socket to send to */
+ k->upload_fromhere, /* buffer pointer */
+ k->upload_present, /* buffer size */
+ &bytes_written); /* actually sent */
if(result)
return result;
if(data->set.verbose)
/* show the data before we change the pointer upload_fromhere */
- Curl_debug(data, CURLINFO_DATA_OUT, data->req.upload_fromhere,
+ Curl_debug(data, CURLINFO_DATA_OUT, k->upload_fromhere,
(size_t)bytes_written, conn);
k->writebytecount += bytes_written;
@@ -1015,20 +1012,20 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
infof(data, "We are completely uploaded and fine\n");
}
- if(data->req.upload_present != bytes_written) {
+ if(k->upload_present != bytes_written) {
/* we only wrote a part of the buffer (if anything), deal with it! */
/* store the amount of bytes left in the buffer to write */
- data->req.upload_present -= bytes_written;
+ k->upload_present -= bytes_written;
/* advance the pointer where to find the buffer when the next send
is to happen */
- data->req.upload_fromhere += bytes_written;
+ k->upload_fromhere += bytes_written;
}
else {
/* we've uploaded that buffer now */
- data->req.upload_fromhere = k->uploadbuf;
- data->req.upload_present = 0; /* no more bytes left */
+ k->upload_fromhere = data->state.uploadbuffer;
+ k->upload_present = 0; /* no more bytes left */
if(k->upload_done) {
result = done_sending(conn, k);
@@ -1108,7 +1105,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
if((k->keepon & KEEP_SEND) && (select_res & CURL_CSELECT_OUT)) {
/* write */
- result = readwrite_upload(data, conn, k, &didwhat);
+ result = readwrite_upload(data, conn, &didwhat);
if(result)
return result;
}
@@ -1142,6 +1139,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* we've waited long enough, continue anyway */
k->exp100 = EXP100_SEND_DATA;
k->keepon |= KEEP_SEND;
+ Curl_expire_done(data, EXPIRE_100_TIMEOUT);
infof(data, "Done waiting for 100-continue\n");
}
}
@@ -1186,15 +1184,13 @@ CURLcode Curl_readwrite(struct connectdata *conn,
*/
(k->bytecount != (k->size + data->state.crlf_conversions)) &&
#endif /* CURL_DO_LINEEND_CONV */
- !data->req.newurl) {
+ !k->newurl) {
failf(data, "transfer closed with %" CURL_FORMAT_CURL_OFF_T
- " bytes remaining to read",
- k->size - k->bytecount);
+ " bytes remaining to read", k->size - k->bytecount);
return CURLE_PARTIAL_FILE;
}
- else if(!(data->set.opt_no_body) &&
- k->chunk &&
- (conn->chunk.state != CHUNK_STOP)) {
+ if(!(data->set.opt_no_body) && k->chunk &&
+ (conn->chunk.state != CHUNK_STOP)) {
/*
* In chunked mode, return an error if the connection is closed prior to
* the empty (terminating) chunk is read.
@@ -1292,6 +1288,13 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
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;
+ }
+ 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
after the *_setopt() calls (that could specify the size of the cache) but
@@ -1313,8 +1316,11 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
if(data->set.httpreq == HTTPREQ_PUT)
data->state.infilesize = data->set.filesize;
- else
+ else {
data->state.infilesize = data->set.postfieldsize;
+ if(data->set.postfields && (data->state.infilesize == -1))
+ data->state.infilesize = (curl_off_t)strlen(data->set.postfields);
+ }
/* If there is a list of cookie files to read, do it now! */
if(data->change.cookielist)
@@ -1343,10 +1349,10 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
Curl_pgrsStartNow(data);
if(data->set.timeout)
- Curl_expire(data, data->set.timeout);
+ Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);
if(data->set.connecttimeout)
- Curl_expire(data, 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
@@ -1356,13 +1362,12 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
if(data->set.wildcardmatch) {
struct WildcardData *wc = &data->wildcard;
- if(!wc->filelist) {
+ if(wc->state < CURLWC_INIT) {
result = Curl_wildcard_init(wc); /* init wildcard structures */
if(result)
return CURLE_OUT_OF_MEMORY;
}
}
-
}
return result;
@@ -1629,9 +1634,7 @@ static char *concat_url(const char *base, const char *relurl)
* as given by the remote server and set up the new URL to request.
*/
CURLcode Curl_follow(struct Curl_easy *data,
- char *newurl, /* this 'newurl' is the Location: string,
- and it must be malloc()ed before passed
- here */
+ char *newurl, /* the Location: string */
followtype type) /* see transfer.h */
{
#ifdef CURL_DISABLE_HTTP
@@ -1644,33 +1647,36 @@ CURLcode Curl_follow(struct Curl_easy *data,
/* Location: redirect */
bool disallowport = FALSE;
+ bool reachedmax = FALSE;
if(type == FOLLOW_REDIR) {
if((data->set.maxredirs != -1) &&
- (data->set.followlocation >= data->set.maxredirs)) {
- failf(data, "Maximum (%ld) redirects followed", data->set.maxredirs);
- return CURLE_TOO_MANY_REDIRECTS;
+ (data->set.followlocation >= data->set.maxredirs)) {
+ reachedmax = TRUE;
+ type = FOLLOW_FAKE; /* switch to fake to store the would-be-redirected
+ to URL */
}
+ else {
+ /* mark the next request as a followed location: */
+ data->state.this_is_a_follow = TRUE;
- /* mark the next request as a followed location: */
- data->state.this_is_a_follow = TRUE;
+ data->set.followlocation++; /* count location-followers */
- data->set.followlocation++; /* count location-followers */
+ if(data->set.http_auto_referer) {
+ /* We are asked to automatically set the previous URL as the referer
+ when we get the next URL. We pick the ->url field, which may or may
+ not be 100% correct */
- if(data->set.http_auto_referer) {
- /* We are asked to automatically set the previous URL as the referer
- when we get the next URL. We pick the ->url field, which may or may
- not be 100% correct */
+ if(data->change.referer_alloc) {
+ Curl_safefree(data->change.referer);
+ data->change.referer_alloc = FALSE;
+ }
- if(data->change.referer_alloc) {
- Curl_safefree(data->change.referer);
- data->change.referer_alloc = FALSE;
+ data->change.referer = strdup(data->change.url);
+ if(!data->change.referer)
+ return CURLE_OUT_OF_MEMORY;
+ data->change.referer_alloc = TRUE; /* yes, free this later */
}
-
- data->change.referer = strdup(data->change.url);
- if(!data->change.referer)
- return CURLE_OUT_OF_MEMORY;
- data->change.referer_alloc = TRUE; /* yes, free this later */
}
}
@@ -1682,7 +1688,6 @@ CURLcode Curl_follow(struct Curl_easy *data,
char *absolute = concat_url(data->change.url, newurl);
if(!absolute)
return CURLE_OUT_OF_MEMORY;
- free(newurl);
newurl = absolute;
}
else {
@@ -1698,8 +1703,6 @@ CURLcode Curl_follow(struct Curl_easy *data,
if(!newest)
return CURLE_OUT_OF_MEMORY;
strcpy_url(newest, newurl); /* create a space-free URL */
-
- free(newurl); /* that was no good */
newurl = newest; /* use this instead now */
}
@@ -1708,6 +1711,11 @@ CURLcode Curl_follow(struct Curl_easy *data,
/* we're only figuring out the new url if we would've followed locations
but now we're done so we can get out! */
data->info.wouldredirect = newurl;
+
+ if(reachedmax) {
+ failf(data, "Maximum (%ld) redirects followed", data->set.maxredirs);
+ return CURLE_TOO_MANY_REDIRECTS;
+ }
return CURLE_OK;
}
@@ -1721,7 +1729,6 @@ CURLcode Curl_follow(struct Curl_easy *data,
data->change.url = newurl;
data->change.url_alloc = TRUE;
- newurl = NULL; /* don't free! */
infof(data, "Issue another request to this URL: '%s'\n", data->change.url);
@@ -1795,7 +1802,7 @@ CURLcode Curl_follow(struct Curl_easy *data,
break;
case 303: /* See Other */
- /* Disable both types of POSTs, unless the user explicitely
+ /* Disable both types of POSTs, unless the user explicitly
asks for POST after POST */
if(data->set.httpreq != HTTPREQ_GET
&& !(data->set.keep_post & CURL_REDIR_POST_303)) {
@@ -1843,12 +1850,17 @@ CURLcode Curl_retry_request(struct connectdata *conn,
return CURLE_OK;
if((data->req.bytecount + data->req.headerbytecount == 0) &&
- conn->bits.reuse &&
- (data->set.rtspreq != RTSPREQ_RECEIVE)) {
- /* We didn't get a single byte when we attempted to re-use a
- connection. This might happen if the connection was left alive when we
- were done using it before, but that was closed when we wanted to use it
- again. Bad luck. Retry the same request on a fresh connect! */
+ conn->bits.reuse &&
+ (!data->set.opt_no_body
+ || (conn->handler->protocol & PROTO_FAMILY_HTTP)) &&
+ (data->set.rtspreq != RTSPREQ_RECEIVE)) {
+ /* We got no data, we attempted to re-use a connection. For HTTP this
+ can be a retry so we try again regardless if we expected a body.
+ For other protocols we only try again only if we expected a body.
+
+ This might happen if the connection was left alive when we were
+ done using it before, but that was closed when we wanted to read from
+ it again. Bad luck. Retry the same request on a fresh connect! */
infof(conn->data, "Connection died, retrying a fresh connect\n");
*url = strdup(conn->data->change.url);
if(!*url)
@@ -1943,7 +1955,7 @@ Curl_setup_transfer(
/* Set a timeout for the multi interface. Add the inaccuracy margin so
that we don't fire slightly too early and get denied to run. */
- Curl_expire(data, data->set.expect_100_timeout);
+ Curl_expire(data, data->set.expect_100_timeout, EXPIRE_100_TIMEOUT);
}
else {
if(data->state.expect100header)
diff --git a/lib/url.c b/lib/url.c
index 7944d7b0..2e793437 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -140,6 +140,19 @@ static CURLcode parse_login_details(const char *login, const size_t len,
char **optionsptr);
static unsigned int get_protocol_family(unsigned int protocol);
+#define READBUFFER_SIZE CURL_MAX_WRITE_SIZE
+#define READBUFFER_MAX CURL_MAX_READ_SIZE
+#define READBUFFER_MIN 1024
+
+/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
+ * more than just a few bytes to play with. Don't let it become too small or
+ * bad things will happen.
+ */
+#if READBUFFER_SIZE < READBUFFER_MIN
+# error READBUFFER_SIZE is too small
+#endif
+
+
/*
* Protocol table.
*/
@@ -261,6 +274,7 @@ static const struct Curl_handler Curl_handler_dummy = {
ZERO_NULL, /* perform_getsock */
ZERO_NULL, /* disconnect */
ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
0, /* defport */
0, /* protocol */
PROTOPT_NONE /* flags */
@@ -411,10 +425,7 @@ CURLcode Curl_close(struct Curl_easy *data)
/* Destroy the timeout list that is held in the easy handle. It is
/normally/ done by curl_multi_remove_handle() but this is "just in
case" */
- if(data->state.timeoutlist) {
- Curl_llist_destroy(data->state.timeoutlist, NULL);
- data->state.timeoutlist = NULL;
- }
+ Curl_llist_destroy(&data->state.timeoutlist, NULL);
data->magic = 0; /* force a clear AFTER the possibly enforced removal from
the multi handle, since that function uses the magic
@@ -452,6 +463,7 @@ CURLcode Curl_close(struct Curl_easy *data)
}
data->change.url = NULL;
+ Curl_safefree(data->state.buffer);
Curl_safefree(data->state.headerbuff);
Curl_flush_cookies(data, 1);
@@ -534,6 +546,9 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
set->httpauth = CURLAUTH_BASIC; /* defaults to basic */
set->proxyauth = CURLAUTH_BASIC; /* defaults to basic */
+ /* SOCKS5 proxy auth defaults to username/password + GSS-API */
+ set->socks5auth = CURLAUTH_BASIC | CURLAUTH_GSSAPI;
+
/* make libcurl quiet by default: */
set->hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */
@@ -548,7 +563,7 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
#endif
set->ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth
type */
- set->general_ssl.sessionid = TRUE; /* session ID caching enabled by
+ set->ssl.primary.sessionid = TRUE; /* session ID caching enabled by
default */
set->proxy_ssl = set->ssl;
@@ -576,14 +591,19 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
result = setstropt(&set->str[STRING_SSL_CAFILE_ORIG], CURL_CA_BUNDLE);
if(result)
return result;
+
+ result = setstropt(&set->str[STRING_SSL_CAFILE_PROXY], CURL_CA_BUNDLE);
+ if(result)
+ return result;
#endif
#if defined(CURL_CA_PATH)
result = setstropt(&set->str[STRING_SSL_CAPATH_ORIG], CURL_CA_PATH);
if(result)
return result;
- result = setstropt(&set->str[STRING_SSL_CAPATH_PROXY],
- (char *) CURL_CA_PATH);
+ result = setstropt(&set->str[STRING_SSL_CAPATH_PROXY], CURL_CA_PATH);
+ if(result)
+ return result;
#endif
set->wildcardmatch = FALSE;
@@ -604,6 +624,7 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
set->expect_100_timeout = 1000L; /* Wait for a second by default. */
set->sep_headers = TRUE; /* separated header lists by default */
+ set->buffer_size = READBUFFER_SIZE;
Curl_http2_init_userset(set);
return result;
@@ -641,6 +662,12 @@ CURLcode Curl_open(struct Curl_easy **curl)
/* We do some initial setup here, all those fields that can't be just 0 */
+ data->state.buffer = malloc(READBUFFER_SIZE + 1);
+ if(!data->state.buffer) {
+ DEBUGF(fprintf(stderr, "Error: malloc of buffer failed\n"));
+ result = CURLE_OUT_OF_MEMORY;
+ }
+
data->state.headerbuff = malloc(HEADERSIZE);
if(!data->state.headerbuff) {
DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n"));
@@ -660,9 +687,6 @@ CURLcode Curl_open(struct Curl_easy **curl)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
-
- data->wildcard.state = CURLWC_INIT;
- data->wildcard.filelist = NULL;
data->set.fnmatch = ZERO_NULL;
data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
@@ -671,6 +695,7 @@ CURLcode Curl_open(struct Curl_easy **curl)
if(result) {
Curl_resolver_cleanup(data->state.resolver);
+ free(data->state.buffer);
free(data->state.headerbuff);
Curl_freeset(data);
free(data);
@@ -682,6 +707,9 @@ CURLcode Curl_open(struct Curl_easy **curl)
return result;
}
+#define C_SSLVERSION_VALUE(x) (x & 0xffff)
+#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
+
CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
va_list param)
{
@@ -805,6 +833,10 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
then this can be changed to HEAD later on) */
data->set.httpreq = HTTPREQ_GET;
break;
+ case CURLOPT_REQUEST_TARGET:
+ result = setstropt(&data->set.str[STRING_TARGET],
+ va_arg(param, char *));
+ break;
case CURLOPT_FILETIME:
/*
* Try to get the file time of the remote document. The time will
@@ -914,7 +946,9 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
* implementations are lame.
*/
#ifdef USE_SSL
- data->set.ssl.primary.version = va_arg(param, long);
+ arg = va_arg(param, long);
+ data->set.ssl.primary.version = C_SSLVERSION_VALUE(arg);
+ data->set.ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
#else
result = CURLE_UNKNOWN_OPTION;
#endif
@@ -925,7 +959,9 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
* implementations are lame.
*/
#ifdef USE_SSL
- data->set.proxy_ssl.primary.version = va_arg(param, long);
+ arg = va_arg(param, long);
+ data->set.proxy_ssl.primary.version = C_SSLVERSION_VALUE(arg);
+ data->set.proxy_ssl.primary.version_max = C_SSLVERSION_MAX_VALUE(arg);
#else
result = CURLE_UNKNOWN_OPTION;
#endif
@@ -995,8 +1031,8 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
* CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
* other - POST is kept as POST after 301 and 302
*/
- int postRedir = curlx_sltosi(va_arg(param, long));
- data->set.keep_post = postRedir & CURL_REDIR_POST_ALL;
+ arg = va_arg(param, long);
+ data->set.keep_post = arg & CURL_REDIR_POST_ALL;
}
break;
@@ -1509,6 +1545,11 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
break;
#endif /* CURL_DISABLE_PROXY */
+ case CURLOPT_SOCKS5_AUTH:
+ data->set.socks5auth = va_arg(param, unsigned long);
+ if(data->set.socks5auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
+ result = CURLE_NOT_BUILT_IN;
+ break;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
case CURLOPT_SOCKS5_GSSAPI_NEC:
/*
@@ -2047,13 +2088,19 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
/*
* Set what local port to bind the socket to when performing an operation.
*/
- data->set.localport = curlx_sltous(va_arg(param, long));
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.localport = curlx_sltous(arg);
break;
case CURLOPT_LOCALPORTRANGE:
/*
* Set number of local ports to try, starting with CURLOPT_LOCALPORT.
*/
- data->set.localportrange = curlx_sltosi(va_arg(param, long));
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 65535))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.localportrange = curlx_sltosi(arg);
break;
case CURLOPT_KRBLEVEL:
/*
@@ -2217,8 +2264,12 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
/* This does not work on windows. */
result = setstropt(&data->set.str[STRING_SSL_CAPATH_ORIG],
va_arg(param, char *));
+#else
+ result = CURLE_NOT_BUILT_IN;
+#endif
break;
case CURLOPT_PROXY_CAPATH:
+#ifdef have_curlssl_ca_path /* not supported by all backends */
/*
* Set CA path info for SSL connection proxy. Specify directory name of the
* CA certificates which have been prepared using openssl c_rehash utility.
@@ -2266,11 +2317,26 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
* The application kindly asks for a differently sized receive buffer.
* If it seems reasonable, we'll use it.
*/
- data->set.buffer_size = va_arg(param, long);
+ arg = va_arg(param, long);
- if((data->set.buffer_size> (BUFSIZE -1)) ||
- (data->set.buffer_size < 1))
- data->set.buffer_size = 0; /* huge internal default */
+ if(arg > READBUFFER_MAX)
+ arg = READBUFFER_MAX;
+ else if(arg < 1)
+ arg = READBUFFER_SIZE;
+ else if(arg < READBUFFER_MIN)
+ arg = READBUFFER_MIN;
+
+ /* Resize if new size */
+ if(arg != data->set.buffer_size) {
+ char *newbuff = realloc(data->state.buffer, arg + 1);
+ if(!newbuff) {
+ DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
+ result = CURLE_OUT_OF_MEMORY;
+ }
+ else
+ data->state.buffer = newbuff;
+ }
+ data->set.buffer_size = arg;
break;
@@ -2470,8 +2536,9 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
break;
case CURLOPT_SSL_SESSIONID_CACHE:
- data->set.general_ssl.sessionid = (0 != va_arg(param, long)) ?
+ data->set.ssl.primary.sessionid = (0 != va_arg(param, long)) ?
TRUE : FALSE;
+ data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
break;
#ifdef USE_LIBSSH2
@@ -2562,7 +2629,10 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
* know that an unsigned int will always hold the value so we blindly
* typecast to this type
*/
- data->set.scope_id = curlx_sltoui(va_arg(param, long));
+ arg = va_arg(param, long);
+ if((arg < 0) || (arg > 0xf))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.scope_id = curlx_sltoui(arg);
break;
case CURLOPT_PROTOCOLS:
@@ -2764,13 +2834,17 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
break;
case CURLOPT_TLSAUTH_TYPE:
- if(strncasecompare((char *)va_arg(param, char *), "SRP", strlen("SRP")))
+ argptr = va_arg(param, char *);
+ if(!argptr ||
+ strncasecompare(argptr, "SRP", strlen("SRP")))
data->set.ssl.authtype = CURL_TLSAUTH_SRP;
else
data->set.ssl.authtype = CURL_TLSAUTH_NONE;
break;
case CURLOPT_PROXY_TLSAUTH_TYPE:
- if(strncasecompare((char *)va_arg(param, char *), "SRP", strlen("SRP")))
+ argptr = va_arg(param, char *);
+ if(!argptr ||
+ strncasecompare(argptr, "SRP", strlen("SRP")))
data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP;
else
data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
@@ -2814,6 +2888,12 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
#ifdef USE_UNIX_SOCKETS
case CURLOPT_UNIX_SOCKET_PATH:
+ data->set.abstract_unix_socket = FALSE;
+ result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_ABSTRACT_UNIX_SOCKET:
+ data->set.abstract_unix_socket = TRUE;
result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH],
va_arg(param, char *));
break;
@@ -2853,6 +2933,9 @@ CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option,
case CURLOPT_CONNECT_TO:
data->set.connect_to = va_arg(param, struct curl_slist *);
break;
+ case CURLOPT_SUPPRESS_CONNECT_HEADERS:
+ data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE;
+ break;
default:
/* unknown tag and its companion, just ignore: */
result = CURLE_UNKNOWN_OPTION;
@@ -2896,8 +2979,7 @@ static void conn_reset_all_postponed_data(struct connectdata *conn)
conn_reset_postponed_data(conn, 1);
}
#else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
-/* Use "do-nothing" macros instead of functions when workaround not used */
-#define conn_reset_postponed_data(c,n) do {} WHILE_FALSE
+/* Use "do-nothing" macro instead of function when workaround not used */
#define conn_reset_all_postponed_data(c) do {} WHILE_FALSE
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
@@ -2954,14 +3036,12 @@ static void conn_free(struct connectdata *conn)
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);
-
- conn->send_pipe = NULL;
- conn->recv_pipe = NULL;
+ Curl_llist_destroy(&conn->send_pipe, NULL);
+ Curl_llist_destroy(&conn->recv_pipe, NULL);
Curl_safefree(conn->localdev);
Curl_free_primary_ssl_config(&conn->ssl_config);
@@ -3001,9 +3081,9 @@ CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection)
* are other users of it
*/
if(!conn->bits.close &&
- (conn->send_pipe->size + conn->recv_pipe->size)) {
+ (conn->send_pipe.size + conn->recv_pipe.size)) {
DEBUGF(infof(data, "Curl_disconnect, usecounter: %d\n",
- conn->send_pipe->size + conn->recv_pipe->size));
+ conn->send_pipe.size + conn->recv_pipe.size));
return CURLE_OK;
}
@@ -3029,7 +3109,6 @@ CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection)
free_fixed_hostname(&conn->host);
free_fixed_hostname(&conn->conn_to_host);
- free_fixed_hostname(&conn->proxy);
free_fixed_hostname(&conn->http_proxy.host);
free_fixed_hostname(&conn->socks_proxy.host);
@@ -3037,8 +3116,8 @@ CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection)
/* Indicate to all handles on the pipe that we're dead */
if(Curl_pipeline_wanted(data->multi, CURLPIPE_ANY)) {
- signalPipeClose(conn->send_pipe, TRUE);
- signalPipeClose(conn->recv_pipe, TRUE);
+ signalPipeClose(&conn->send_pipe, TRUE);
+ signalPipeClose(&conn->recv_pipe, TRUE);
}
conn_free(conn);
@@ -3065,12 +3144,16 @@ static bool SocketIsDead(curl_socket_t sock)
}
/*
- * IsPipeliningPossible() returns TRUE if the options set would allow
- * pipelining/multiplexing and the connection is using a HTTP protocol.
+ * IsPipeliningPossible()
+ *
+ * Return a bitmask with the available pipelining and multiplexing options for
+ * the given requested connection.
*/
-static bool IsPipeliningPossible(const struct Curl_easy *handle,
- const struct connectdata *conn)
+static int IsPipeliningPossible(const struct Curl_easy *handle,
+ const struct connectdata *conn)
{
+ int avail = 0;
+
/* If a HTTP protocol and pipelining is enabled */
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
(!conn->bits.protoconnstart || !conn->bits.close)) {
@@ -3080,14 +3163,14 @@ static bool IsPipeliningPossible(const struct Curl_easy *handle,
(handle->set.httpreq == HTTPREQ_GET ||
handle->set.httpreq == HTTPREQ_HEAD))
/* didn't ask for HTTP/1.0 and a GET or HEAD */
- return TRUE;
+ avail |= CURLPIPE_HTTP1;
if(Curl_pipeline_wanted(handle->multi, CURLPIPE_MULTIPLEX) &&
(handle->set.httpversion >= CURL_HTTP_VERSION_2))
/* allows HTTP/2 */
- return TRUE;
+ avail |= CURLPIPE_MULTIPLEX;
}
- return FALSE;
+ return avail;
}
int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
@@ -3143,9 +3226,9 @@ void Curl_getoff_all_pipelines(struct Curl_easy *data,
bool send_head = (conn->writechannel_inuse &&
Curl_sendpipe_head(data, conn));
- if(Curl_removeHandleFromPipeline(data, conn->recv_pipe) && recv_head)
+ if(Curl_removeHandleFromPipeline(data, &conn->recv_pipe) && recv_head)
Curl_pipeline_leave_read(conn);
- if(Curl_removeHandleFromPipeline(data, conn->send_pipe) && send_head)
+ if(Curl_removeHandleFromPipeline(data, &conn->send_pipe) && send_head)
Curl_pipeline_leave_write(conn);
}
@@ -3192,7 +3275,7 @@ Curl_oldest_idle_connection(struct Curl_easy *data)
struct curl_hash_element *he;
time_t highscore=-1;
time_t score;
- struct timeval now;
+ struct curltime now;
struct connectdata *conn_candidate = NULL;
struct connectbundle *bundle;
@@ -3206,7 +3289,7 @@ Curl_oldest_idle_connection(struct Curl_easy *data)
bundle = he->ptr;
- curr = bundle->conn_list->head;
+ curr = bundle->conn_list.head;
while(curr) {
conn = curr->ptr;
@@ -3234,9 +3317,7 @@ proxy_info_matches(const struct proxy_info* data,
{
if((data->proxytype == needle->proxytype) &&
(data->port == needle->port) &&
- Curl_safe_strcasecompare(data->host.name, needle->host.name) &&
- Curl_safe_strcasecompare(data->user, needle->user) &&
- Curl_safe_strcasecompare(data->passwd, needle->passwd))
+ Curl_safe_strcasecompare(data->host.name, needle->host.name))
return TRUE;
return FALSE;
@@ -3257,7 +3338,7 @@ find_oldest_idle_connection_in_bundle(struct Curl_easy *data,
struct curl_llist_element *curr;
time_t highscore=-1;
time_t score;
- struct timeval now;
+ struct curltime now;
struct connectdata *conn_candidate = NULL;
struct connectdata *conn;
@@ -3265,7 +3346,7 @@ find_oldest_idle_connection_in_bundle(struct Curl_easy *data,
now = Curl_tvnow();
- curr = bundle->conn_list->head;
+ curr = bundle->conn_list.head;
while(curr) {
conn = curr->ptr;
@@ -3293,17 +3374,25 @@ find_oldest_idle_connection_in_bundle(struct Curl_easy *data,
static bool disconnect_if_dead(struct connectdata *conn,
struct Curl_easy *data)
{
- size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size;
+ size_t pipeLen = conn->send_pipe.size + conn->recv_pipe.size;
if(!pipeLen && !conn->inuse) {
/* The check for a dead socket makes sense only if there are no
handles in pipeline and the connection isn't already marked in
use */
bool dead;
- if(conn->handler->protocol & CURLPROTO_RTSP)
- /* RTSP is a special case due to RTP interleaving */
- dead = Curl_rtsp_connisdead(conn);
- 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;
+
+ state = conn->handler->connection_check(conn, CONNCHECK_ISDEAD);
+ dead = (state & CONNRESULT_DEAD);
+ }
+ else {
+ /* Use the general method for determining the death of a connection */
dead = SocketIsDead(conn->sock[FIRSTSOCKET]);
+ }
if(dead) {
conn->data = data;
@@ -3337,7 +3426,7 @@ static int call_disconnect_if_dead(struct connectdata *conn,
*/
static void prune_dead_connections(struct Curl_easy *data)
{
- struct timeval now = Curl_tvnow();
+ struct curltime now = Curl_tvnow();
time_t elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup);
if(elapsed >= 1000L) {
@@ -3376,7 +3465,7 @@ ConnectionExists(struct Curl_easy *data,
struct connectdata *check;
struct connectdata *chosen = 0;
bool foundPendingCandidate = FALSE;
- bool canPipeline = IsPipeliningPossible(data, needle);
+ int canpipe = IsPipeliningPossible(data, needle);
struct connectbundle *bundle;
#ifdef USE_NTLM
@@ -3392,10 +3481,10 @@ ConnectionExists(struct Curl_easy *data,
*force_reuse = FALSE;
*waitpipe = FALSE;
- /* We can't pipe if the site is blacklisted */
- if(canPipeline && Curl_pipeline_site_blacklisted(data, needle)) {
- canPipeline = 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 */
@@ -3406,22 +3495,17 @@ ConnectionExists(struct Curl_easy *data,
max_pipeline_length(data->multi):0;
size_t best_pipe_len = max_pipe_len;
struct curl_llist_element *curr;
- const char *hostname;
-
- if(needle->bits.conn_to_host)
- hostname = needle->conn_to_host.name;
- else
- hostname = needle->host.name;
infof(data, "Found bundle for host %s: %p [%s]\n",
- hostname, (void *)bundle,
- (bundle->multiuse== BUNDLE_PIPELINING?
- "can pipeline":
- (bundle->multiuse== BUNDLE_MULTIPLEX?
- "can multiplex":"serially")));
-
- /* We can't pipe if we don't know anything about the server */
- if(canPipeline) {
+ (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");
@@ -3430,22 +3514,22 @@ ConnectionExists(struct Curl_easy *data,
}
infof(data, "Server doesn't support multi-use (yet)\n");
- canPipeline = FALSE;
+ 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");
- canPipeline = FALSE;
+ canpipe = 0;
}
else if((bundle->multiuse == BUNDLE_MULTIPLEX) &&
!Curl_pipeline_wanted(data->multi, CURLPIPE_MULTIPLEX)) {
infof(data, "Could multiplex, but not asked to!\n");
- canPipeline = FALSE;
+ canpipe = 0;
}
}
- curr = bundle->conn_list->head;
+ curr = bundle->conn_list.head;
while(curr) {
bool match = FALSE;
size_t pipeLen;
@@ -3460,22 +3544,23 @@ ConnectionExists(struct Curl_easy *data,
if(disconnect_if_dead(check, data))
continue;
- pipeLen = check->send_pipe->size + check->recv_pipe->size;
+ pipeLen = check->send_pipe.size + check->recv_pipe.size;
- if(canPipeline) {
+ if(canpipe) {
if(check->bits.protoconnstart && check->bits.close)
continue;
if(!check->bits.multiplex) {
- /* If not multiplexing, make sure the pipe has only GET requests */
- struct Curl_easy* sh = gethandleathead(check->send_pipe);
- struct Curl_easy* rh = gethandleathead(check->recv_pipe);
+ /* 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))
+ if(!(IsPipeliningPossible(sh, check) & CURLPIPE_HTTP1))
continue;
}
else if(rh) {
- if(!IsPipeliningPossible(rh, check))
+ if(!(IsPipeliningPossible(rh, check) & CURLPIPE_HTTP1))
continue;
}
}
@@ -3507,7 +3592,7 @@ ConnectionExists(struct Curl_easy *data,
infof(data, "Connection #%ld isn't open enough, can't reuse\n",
check->connection_id);
#ifdef DEBUGBUILD
- if(check->recv_pipe->size > 0) {
+ if(check->recv_pipe.size > 0) {
infof(data,
"BAD! Unconnected #%ld has a non-empty recv pipeline!\n",
check->connection_id);
@@ -3523,6 +3608,8 @@ ConnectionExists(struct Curl_easy *data,
continue;
if(strcmp(needle->unix_domain_socket, check->unix_domain_socket))
continue;
+ if(needle->abstract_unix_socket != check->abstract_unix_socket)
+ continue;
}
else if(check->unix_domain_socket)
continue;
@@ -3581,7 +3668,7 @@ ConnectionExists(struct Curl_easy *data,
}
}
- if(!canPipeline && check->inuse)
+ if(!canpipe && check->inuse)
/* this request can't be pipelined but the checked connection is
already in use so we skip it */
continue;
@@ -3644,7 +3731,7 @@ ConnectionExists(struct Curl_easy *data,
check->connection_id));
continue;
}
- else if(check->ssl[FIRSTSOCKET].state != ssl_connection_complete) {
+ if(check->ssl[FIRSTSOCKET].state != ssl_connection_complete) {
foundPendingCandidate = TRUE;
DEBUGF(infof(data,
"Connection #%ld has not started SSL connect, "
@@ -3712,7 +3799,7 @@ ConnectionExists(struct Curl_easy *data,
continue;
}
#endif
- if(canPipeline) {
+ 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. */
@@ -3797,17 +3884,19 @@ CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex)
if(conn->bits.socksproxy) {
#ifndef CURL_DISABLE_PROXY
- const char * const host = conn->bits.conn_to_host ?
- conn->conn_to_host.name :
- conn->bits.httpproxy ?
+ /* 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.conn_to_port ? conn->conn_to_port :
- conn->bits.httpproxy ?
- (int)conn->http_proxy.port :
- sockindex == SECONDARYSOCKET ?
- conn->secondary_port : conn->remote_port;
+ 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:
@@ -3845,7 +3934,8 @@ void Curl_verboseconnect(struct connectdata *conn)
infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n",
conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
conn->bits.httpproxy ? conn->http_proxy.host.dispname :
- conn->host.dispname,
+ conn->bits.conn_to_host ? conn->conn_to_host.dispname :
+ conn->host.dispname,
conn->ip_addr_str, conn->port, conn->connection_id);
}
#endif
@@ -3944,7 +4034,7 @@ CURLcode Curl_protocol_connect(struct connectdata *conn,
return CURLE_OK;
if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
- (conn->tunnel_state[FIRSTSOCKET] != TUNNEL_COMPLETE))
+ 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;
@@ -3968,7 +4058,7 @@ CURLcode Curl_protocol_connect(struct connectdata *conn,
}
/*
- * Helpers for IDNA convertions.
+ * Helpers for IDNA conversions.
*/
static bool is_ASCII_name(const char *hostname)
{
@@ -4010,7 +4100,15 @@ static void fix_hostname(struct connectdata *conn, struct hostname *host)
#ifdef USE_LIBIDN2
if(idn2_check_version(IDN2_VERSION)) {
char *ace_hostname = NULL;
- int rc = idn2_lookup_ul((const char *)host->name, &ace_hostname, 0);
+#if IDN2_VERSION_NUMBER >= 0x00140000
+ /* IDN2_NFC_INPUT: Normalize input string using normalization form C.
+ IDN2_NONTRANSITIONAL: Perform Unicode TR46 non-transitional
+ processing. */
+ int flags = IDN2_NFC_INPUT | IDN2_NONTRANSITIONAL;
+#else
+ int flags = IDN2_NFC_INPUT;
+#endif
+ int rc = idn2_lookup_ul((const char *)host->name, &ace_hostname, flags);
if(rc == IDN2_OK) {
host->encalloc = (char *)ace_hostname;
/* change the name pointer to point to the encoded hostname */
@@ -4084,7 +4182,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->tempsock[1] = CURL_SOCKET_BAD; /* no file descriptor */
conn->connection_id = -1; /* no ID */
conn->port = -1; /* unknown at this point */
- conn->remote_port = -1; /* unknown */
+ conn->remote_port = -1; /* unknown at this point */
#if defined(USE_RECV_BEFORE_SEND_WORKAROUND) && defined(DEBUGBUILD)
conn->postponed[0].bindsock = CURL_SOCKET_BAD; /* no file descriptor */
conn->postponed[1].bindsock = CURL_SOCKET_BAD; /* no file descriptor */
@@ -4141,8 +4239,11 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
+ 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;
+ conn->proxy_ssl_config.verifystatus =
+ 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;
@@ -4159,16 +4260,14 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
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(BUFSIZE, sizeof(char));
+ conn->master_buffer = calloc(MASTERBUF_SIZE, sizeof(char));
if(!conn->master_buffer)
goto error;
}
/* Initialize the pipeline lists */
- conn->send_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
- conn->recv_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
- if(!conn->send_pipe || !conn->recv_pipe)
- goto error;
+ Curl_llist_init(&conn->send_pipe, (curl_llist_dtor) llist_dtor);
+ Curl_llist_init(&conn->recv_pipe, (curl_llist_dtor) llist_dtor);
#ifdef HAVE_GSSAPI
conn->data_prot = PROT_CLEAR;
@@ -4191,11 +4290,8 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
return conn;
error:
- Curl_llist_destroy(conn->send_pipe, NULL);
- Curl_llist_destroy(conn->recv_pipe, NULL);
-
- conn->send_pipe = NULL;
- conn->recv_pipe = NULL;
+ Curl_llist_destroy(&conn->send_pipe, NULL);
+ Curl_llist_destroy(&conn->recv_pipe, NULL);
free(conn->master_buffer);
free(conn->localdev);
@@ -4258,11 +4354,13 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
char *fragment;
char *path = data->state.path;
char *query;
+ int i;
int rc;
- char protobuf[16] = "";
const char *protop = "";
CURLcode result;
bool rebuild_url = FALSE;
+ bool url_has_scheme = FALSE;
+ char protobuf[16];
*prot_missing = FALSE;
@@ -4281,10 +4379,50 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
* proxy -- and we don't know if we will need to use SSL until we parse the
* url ...
************************************************************/
- if((2 == sscanf(data->change.url, "%15[^:]:%[^\n]",
- protobuf, path)) &&
- strcasecompare(protobuf, "file")) {
- if(path[0] == '/' && path[1] == '/') {
+ if(data->change.url[0] == ':') {
+ failf(data, "Bad URL, colon is first character");
+ return CURLE_URL_MALFORMAT;
+ }
+
+ /* MSDOS/Windows style drive prefix, eg c: in c:foo */
+#define STARTS_WITH_DRIVE_PREFIX(str) \
+ ((('a' <= str[0] && str[0] <= 'z') || \
+ ('A' <= str[0] && str[0] <= 'Z')) && \
+ (str[1] == ':'))
+
+ /* Don't mistake a drive letter for a scheme if the default protocol is file.
+ curld --proto-default file c:/foo/bar.txt */
+ if(STARTS_WITH_DRIVE_PREFIX(data->change.url) &&
+ data->set.str[STRING_DEFAULT_PROTOCOL] &&
+ strcasecompare(data->set.str[STRING_DEFAULT_PROTOCOL], "file")) {
+ ; /* do nothing */
+ }
+ else { /* check for a scheme */
+ for(i = 0; i < 16 && data->change.url[i]; ++i) {
+ if(data->change.url[i] == '/')
+ break;
+ if(data->change.url[i] == ':') {
+ url_has_scheme = TRUE;
+ break;
+ }
+ }
+ }
+
+ /* handle the file: scheme */
+ if((url_has_scheme && strncasecompare(data->change.url, "file:", 5)) ||
+ (!url_has_scheme && data->set.str[STRING_DEFAULT_PROTOCOL] &&
+ strcasecompare(data->set.str[STRING_DEFAULT_PROTOCOL], "file"))) {
+ if(url_has_scheme)
+ rc = sscanf(data->change.url, "%*15[^\n/:]:%[^\n]", path);
+ else
+ rc = sscanf(data->change.url, "%[^\n]", path);
+
+ if(rc != 1) {
+ failf(data, "Bad URL");
+ return CURLE_URL_MALFORMAT;
+ }
+
+ if(url_has_scheme && path[0] == '/' && path[1] == '/') {
/* Allow omitted hostname (e.g. file:/<path>). This is not strictly
* speaking a valid file: URL by RFC 1738, but treating file:/<path> as
* file://localhost/<path> is similar to how other schemes treat missing
@@ -4294,18 +4432,20 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
memory areas overlap! */
memmove(path, path + 2, strlen(path + 2)+1);
}
+
/*
* we deal with file://<host>/<path> differently since it supports no
* hostname other than "localhost" and "127.0.0.1", which is unique among
* the URL protocols specified in RFC 1738
*/
- if(path[0] != '/') {
+ if(path[0] != '/' && !STARTS_WITH_DRIVE_PREFIX(path)) {
/* the URL includes a host name, it must match "localhost" or
"127.0.0.1" to be valid */
char *ptr;
if(!checkprefix("localhost/", path) &&
!checkprefix("127.0.0.1/", path)) {
- failf(data, "Valid host name with slash missing in URL");
+ failf(data, "Invalid file://hostname/, "
+ "expected localhost or 127.0.0.1 or none");
return CURLE_URL_MALFORMAT;
}
ptr = &path[9]; /* now points to the slash after the host */
@@ -4334,7 +4474,15 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
memmove(path, ptr, strlen(ptr)+1);
}
+#if !defined(MSDOS) && !defined(WIN32) && !defined(__CYGWIN__)
+ if(STARTS_WITH_DRIVE_PREFIX(path)) {
+ failf(data, "File drive letters are only accepted in MSDOS/Windows.");
+ return CURLE_URL_MALFORMAT;
+ }
+#endif
+
protop = "file"; /* protocol string */
+ *prot_missing = !url_has_scheme;
}
else {
/* clear path */
@@ -4342,7 +4490,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
path[0]=0;
rc = sscanf(data->change.url,
- "%15[^\n:]:%3[/]%[^\n/?#]%[^\n]",
+ "%15[^\n/:]:%3[/]%[^\n/?#]%[^\n]",
protobuf, slashbuf, conn->host.name, path);
if(2 == rc) {
failf(data, "Bad URL");
@@ -4498,14 +4646,30 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
size_t plen = strlen(path); /* new path, should be 1 byte longer than
the original */
- size_t urllen = strlen(data->change.url); /* original URL length */
-
size_t prefixlen = strlen(conn->host.name);
- if(!*prot_missing)
- prefixlen += strlen(protop) + strlen("://");
+ if(!*prot_missing) {
+ size_t protolen = strlen(protop);
- reurl = malloc(urllen + 2); /* 2 for zerobyte + slash */
+ if(curl_strnequal(protop, data->change.url, protolen))
+ prefixlen += protolen;
+ else {
+ failf(data, "<url> malformed");
+ return CURLE_URL_MALFORMAT;
+ }
+
+ if(curl_strnequal("://", &data->change.url[protolen], 3))
+ prefixlen += 3;
+ /* only file: is allowed to omit one or both slashes */
+ else if(curl_strnequal("file:", data->change.url, 5))
+ prefixlen += 1 + (data->change.url[5] == '/');
+ else {
+ failf(data, "<url> malformed");
+ return CURLE_URL_MALFORMAT;
+ }
+ }
+
+ reurl = malloc(prefixlen + plen + 1);
if(!reurl)
return CURLE_OUT_OF_MEMORY;
@@ -4527,6 +4691,10 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
data->change.url_alloc = TRUE; /* free this later */
}
+ result = findprotocol(data, conn, protop);
+ if(result)
+ return result;
+
/*
* Parse the login details from the URL and strip them out of
* the host name
@@ -4613,8 +4781,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
* conn->host.name is B
* data->state.path is /C
*/
-
- return findprotocol(data, conn, protop);
+ return CURLE_OK;
}
/*
@@ -4783,6 +4950,7 @@ static bool check_noproxy(const char *name, const char *no_proxy)
return FALSE;
}
+#ifndef CURL_DISABLE_HTTP
/****************************************************************
* Detect what (if any) proxy to use. Remember that this selects a host
* name and is not limited to HTTP proxies only.
@@ -4792,7 +4960,6 @@ static char *detect_proxy(struct connectdata *conn)
{
char *proxy = NULL;
-#ifndef CURL_DISABLE_HTTP
/* If proxy was not specified, we check for default proxy environment
* variables, to enable i.e Lynx compliance:
*
@@ -4810,65 +4977,50 @@ static char *detect_proxy(struct connectdata *conn)
* For compatibility, the all-uppercase versions of these variables are
* checked if the lowercase versions don't exist.
*/
- char *no_proxy=NULL;
char proxy_env[128];
+ const char *protop = conn->handler->scheme;
+ char *envp = proxy_env;
+ char *prox;
- no_proxy=curl_getenv("no_proxy");
- if(!no_proxy)
- no_proxy=curl_getenv("NO_PROXY");
-
- if(!check_noproxy(conn->host.name, no_proxy)) {
- /* It was not listed as without proxy */
- const char *protop = conn->handler->scheme;
- char *envp = proxy_env;
- char *prox;
+ /* Now, build <protocol>_proxy and check for such a one to use */
+ while(*protop)
+ *envp++ = (char)tolower((int)*protop++);
- /* Now, build <protocol>_proxy and check for such a one to use */
- while(*protop)
- *envp++ = (char)tolower((int)*protop++);
+ /* append _proxy */
+ strcpy(envp, "_proxy");
- /* append _proxy */
- strcpy(envp, "_proxy");
+ /* read the protocol proxy: */
+ prox=curl_getenv(proxy_env);
- /* read the protocol proxy: */
+ /*
+ * We don't try the uppercase version of HTTP_PROXY because of
+ * security reasons:
+ *
+ * When curl is used in a webserver application
+ * environment (cgi or php), this environment variable can
+ * be controlled by the web server user by setting the
+ * http header 'Proxy:' to some value.
+ *
+ * This can cause 'internal' http/ftp requests to be
+ * arbitrarily redirected by any external attacker.
+ */
+ if(!prox && !strcasecompare("http_proxy", proxy_env)) {
+ /* There was no lowercase variable, try the uppercase version: */
+ Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env));
prox=curl_getenv(proxy_env);
+ }
- /*
- * We don't try the uppercase version of HTTP_PROXY because of
- * security reasons:
- *
- * When curl is used in a webserver application
- * environment (cgi or php), this environment variable can
- * be controlled by the web server user by setting the
- * http header 'Proxy:' to some value.
- *
- * This can cause 'internal' http/ftp requests to be
- * arbitrarily redirected by any external attacker.
- */
- if(!prox && !strcasecompare("http_proxy", proxy_env)) {
- /* There was no lowercase variable, try the uppercase version: */
- Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env));
- prox=curl_getenv(proxy_env);
- }
-
- if(prox)
- proxy = prox; /* use this */
- else {
- proxy = curl_getenv("all_proxy"); /* default proxy to use */
- if(!proxy)
- proxy=curl_getenv("ALL_PROXY");
- }
- } /* if(!check_noproxy(conn->host.name, no_proxy)) - it wasn't specified
- non-proxy */
- free(no_proxy);
-
-#else /* !CURL_DISABLE_HTTP */
-
- (void)conn;
-#endif /* CURL_DISABLE_HTTP */
+ if(prox)
+ proxy = prox; /* use this */
+ else {
+ proxy = curl_getenv("all_proxy"); /* default proxy to use */
+ if(!proxy)
+ proxy=curl_getenv("ALL_PROXY");
+ }
return proxy;
}
+#endif /* CURL_DISABLE_HTTP */
/*
* If this is supposed to use a proxy, we need to figure out the proxy
@@ -5032,15 +5184,19 @@ static CURLcode parse_proxy(struct Curl_easy *data,
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)
+ 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;
@@ -5097,6 +5253,171 @@ static CURLcode parse_proxy_auth(struct Curl_easy *data,
NULL, FALSE);
return result;
}
+
+/* create_conn helper to parse and init proxy values. to be called after unix
+ socket init but before any proxy vars are evaluated. */
+static CURLcode create_conn_helper_init_proxy(struct connectdata *conn)
+{
+ char *proxy = NULL;
+ char *socksproxy = NULL;
+ char *no_proxy = NULL;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+
+ /*************************************************************
+ * Extract the user and password from the authentication string
+ *************************************************************/
+ if(conn->bits.proxy_user_passwd) {
+ result = parse_proxy_auth(data, conn);
+ if(result)
+ goto out;
+ }
+
+ /*************************************************************
+ * Detect what (if any) proxy to use
+ *************************************************************/
+ if(data->set.str[STRING_PROXY]) {
+ proxy = strdup(data->set.str[STRING_PROXY]);
+ /* if global proxy is set, this is it */
+ if(NULL == proxy) {
+ failf(data, "memory shortage");
+ result = CURLE_OUT_OF_MEMORY;
+ goto out;
+ }
+ }
+
+ if(data->set.str[STRING_PRE_PROXY]) {
+ socksproxy = strdup(data->set.str[STRING_PRE_PROXY]);
+ /* if global socks proxy is set, this is it */
+ if(NULL == socksproxy) {
+ failf(data, "memory shortage");
+ result = CURLE_OUT_OF_MEMORY;
+ goto out;
+ }
+ }
+
+ no_proxy = curl_getenv("no_proxy");
+ if(!no_proxy)
+ no_proxy = curl_getenv("NO_PROXY");
+
+ if(check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY]) ||
+ (!data->set.str[STRING_NOPROXY] &&
+ check_noproxy(conn->host.name, no_proxy))) {
+ Curl_safefree(proxy);
+ Curl_safefree(socksproxy);
+ }
+ else if(!proxy && !socksproxy)
+#ifndef CURL_DISABLE_HTTP
+ /* if the host is not in the noproxy list, detect proxy. */
+ proxy = detect_proxy(conn);
+#else /* !CURL_DISABLE_HTTP */
+ proxy = NULL;
+#endif /* CURL_DISABLE_HTTP */
+
+ Curl_safefree(no_proxy);
+
+#ifdef USE_UNIX_SOCKETS
+ /* For the time being do not mix proxy and unix domain sockets. See #1274 */
+ if(proxy && conn->unix_domain_socket) {
+ free(proxy);
+ proxy = NULL;
+ }
+#endif
+
+ if(proxy && (!*proxy || (conn->handler->flags & PROTOPT_NONETWORK))) {
+ free(proxy); /* Don't bother with an empty proxy string or if the
+ protocol doesn't work with network */
+ proxy = NULL;
+ }
+ if(socksproxy && (!*socksproxy ||
+ (conn->handler->flags & PROTOPT_NONETWORK))) {
+ free(socksproxy); /* Don't bother with an empty socks proxy string or if
+ the protocol doesn't work with network */
+ socksproxy = NULL;
+ }
+
+ /***********************************************************************
+ * If this is supposed to use a proxy, we need to figure out the proxy host
+ * name, proxy type and port number, so that we can re-use an existing
+ * connection that may exist registered to the same proxy host.
+ ***********************************************************************/
+ if(proxy || socksproxy) {
+ if(proxy) {
+ result = parse_proxy(data, conn, proxy, conn->http_proxy.proxytype);
+ Curl_safefree(proxy); /* parse_proxy copies the proxy string */
+ if(result)
+ goto out;
+ }
+
+ if(socksproxy) {
+ result = parse_proxy(data, conn, socksproxy,
+ conn->socks_proxy.proxytype);
+ /* parse_proxy copies the socks proxy string */
+ Curl_safefree(socksproxy);
+ if(result)
+ goto out;
+ }
+
+ if(conn->http_proxy.host.rawalloc) {
+#ifdef CURL_DISABLE_HTTP
+ /* asking for a HTTP proxy is a bit funny when HTTP is disabled... */
+ result = CURLE_UNSUPPORTED_PROTOCOL;
+ goto out;
+#else
+ /* force this connection's protocol to become HTTP if compatible */
+ if(!(conn->handler->protocol & PROTO_FAMILY_HTTP)) {
+ if((conn->handler->flags & PROTOPT_PROXY_AS_HTTP) &&
+ !conn->bits.tunnel_proxy)
+ conn->handler = &Curl_handler_http;
+ else
+ /* if not converting to HTTP over the proxy, enforce tunneling */
+ conn->bits.tunnel_proxy = TRUE;
+ }
+ conn->bits.httpproxy = TRUE;
+#endif
+ }
+ else {
+ conn->bits.httpproxy = FALSE; /* not a HTTP proxy */
+ conn->bits.tunnel_proxy = FALSE; /* no tunneling if not HTTP */
+ }
+
+ if(conn->socks_proxy.host.rawalloc) {
+ if(!conn->http_proxy.host.rawalloc) {
+ /* once a socks proxy */
+ if(!conn->socks_proxy.user) {
+ conn->socks_proxy.user = conn->http_proxy.user;
+ conn->http_proxy.user = NULL;
+ Curl_safefree(conn->socks_proxy.passwd);
+ conn->socks_proxy.passwd = conn->http_proxy.passwd;
+ conn->http_proxy.passwd = NULL;
+ }
+ }
+ conn->bits.socksproxy = TRUE;
+ }
+ else
+ conn->bits.socksproxy = FALSE; /* not a socks proxy */
+ }
+ else {
+ conn->bits.socksproxy = FALSE;
+ conn->bits.httpproxy = FALSE;
+ }
+ conn->bits.proxy = conn->bits.httpproxy || conn->bits.socksproxy;
+
+ if(!conn->bits.proxy) {
+ /* we aren't using the proxy after all... */
+ conn->bits.proxy = FALSE;
+ conn->bits.httpproxy = FALSE;
+ conn->bits.socksproxy = FALSE;
+ conn->bits.proxy_user_passwd = FALSE;
+ conn->bits.tunnel_proxy = FALSE;
+ }
+
+out:
+
+ free(socksproxy);
+ free(proxy);
+ return result;
+}
#endif /* CURL_DISABLE_PROXY */
/*
@@ -5137,6 +5458,7 @@ static CURLcode parse_url_login(struct Curl_easy *data,
DEBUGASSERT(!**user);
DEBUGASSERT(!**passwd);
DEBUGASSERT(!**options);
+ DEBUGASSERT(conn->handler);
if(!ptr)
goto out;
@@ -5155,9 +5477,12 @@ static CURLcode parse_url_login(struct Curl_easy *data,
if(data->set.use_netrc == CURL_NETRC_REQUIRED)
goto out;
- /* We could use the login information in the URL so extract it */
+ /* We could use the login information in the URL so extract it. Only parse
+ options if the handler says we should. */
result = parse_login_details(login, ptr - login - 1,
- &userp, &passwdp, &optionsp);
+ &userp, &passwdp,
+ (conn->handler->flags & PROTOPT_URLOPTIONS)?
+ &optionsp:NULL);
if(result)
goto out;
@@ -5387,7 +5712,7 @@ static CURLcode parse_remote_port(struct Curl_easy *data,
}
#endif
- portptr = strrchr(conn->host.name, ':');
+ portptr = strchr(conn->host.name, ':');
}
if(data->set.use_port && data->state.allow_port) {
@@ -5442,15 +5767,16 @@ static CURLcode parse_remote_port(struct Curl_easy *data,
return CURLE_URL_MALFORMAT;
}
- else if(rest != &portptr[1]) {
+ if(rest[0]) {
+ failf(data, "Port number ended with '%c'", rest[0]);
+ return CURLE_URL_MALFORMAT;
+ }
+
+ if(rest != &portptr[1]) {
*portptr = '\0'; /* cut off the name there */
conn->remote_port = curlx_ultous(port);
}
else {
- if(rest[0]) {
- failf(data, "Illegal port number");
- return CURLE_URL_MALFORMAT;
- }
/* 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. */
@@ -5584,6 +5910,10 @@ static CURLcode parse_connect_to_host_port(struct Curl_easy *data,
char *portptr;
int port = -1;
+#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void) data;
+#endif
+
*hostname_result = NULL;
*port_result = -1;
@@ -5749,14 +6079,11 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
return result;
if(host && *host) {
- bool ipv6host;
conn->conn_to_host.rawalloc = host;
conn->conn_to_host.name = host;
conn->bits.conn_to_host = TRUE;
- ipv6host = strchr(host, ':') != NULL;
- infof(data, "Connecting to hostname: %s%s%s\n",
- ipv6host ? "[" : "", host, ipv6host ? "]" : "");
+ infof(data, "Connecting to hostname: %s\n", host);
}
else {
/* no "connect to host" */
@@ -5816,8 +6143,9 @@ static CURLcode resolve_server(struct Curl_easy *data,
if(!hostaddr)
result = CURLE_OUT_OF_MEMORY;
else {
- int longpath=0;
- hostaddr->addr = Curl_unix2addr(path, &longpath);
+ bool longpath = FALSE;
+ hostaddr->addr = Curl_unix2addr(path, &longpath,
+ conn->abstract_unix_socket);
if(hostaddr->addr)
hostaddr->inuse++;
else {
@@ -5847,7 +6175,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
if(conn->bits.conn_to_port)
conn->port = conn->conn_to_port;
else
- conn->port = conn->remote_port; /* it is the same port */
+ conn->port = conn->remote_port;
/* Resolve target host right on */
rc = Curl_resolv_timeout(conn, connhost->name, (int)conn->port,
@@ -5903,11 +6231,9 @@ static void reuse_conn(struct connectdata *old_conn,
{
free_fixed_hostname(&old_conn->http_proxy.host);
free_fixed_hostname(&old_conn->socks_proxy.host);
- free_fixed_hostname(&old_conn->proxy);
free(old_conn->http_proxy.host.rawalloc);
free(old_conn->socks_proxy.host.rawalloc);
- free(old_conn->proxy.rawalloc);
/* free the SSL config struct from this connection struct as this was
allocated in vain and is targeted for destruction */
@@ -5962,7 +6288,6 @@ static void reuse_conn(struct connectdata *old_conn,
Curl_persistconninfo(conn);
conn_reset_all_postponed_data(old_conn); /* free buffers */
- conn_reset_all_postponed_data(conn); /* reset unprocessed data */
/* re-use init */
conn->bits.reuse = TRUE; /* yes, we're re-using here */
@@ -5975,11 +6300,8 @@ static void reuse_conn(struct connectdata *old_conn,
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);
-
- old_conn->send_pipe = NULL;
- old_conn->recv_pipe = NULL;
+ Curl_llist_destroy(&old_conn->send_pipe, NULL);
+ Curl_llist_destroy(&old_conn->recv_pipe, NULL);
Curl_safefree(old_conn->master_buffer);
@@ -6016,8 +6338,6 @@ static CURLcode create_conn(struct Curl_easy *data,
char *passwd = NULL;
char *options = NULL;
bool reuse;
- char *proxy = NULL;
- char *socksproxy = NULL;
bool prot_missing = FALSE;
bool connections_available = TRUE;
bool force_reuse = FALSE;
@@ -6161,147 +6481,24 @@ static CURLcode create_conn(struct Curl_easy *data,
}
}
-#ifndef CURL_DISABLE_PROXY
- /*************************************************************
- * Extract the user and password from the authentication string
- *************************************************************/
- if(conn->bits.proxy_user_passwd) {
- result = parse_proxy_auth(data, conn);
- if(result)
- goto out;
- }
-
- /*************************************************************
- * Detect what (if any) proxy to use
- *************************************************************/
- if(data->set.str[STRING_PROXY]) {
- proxy = strdup(data->set.str[STRING_PROXY]);
- /* if global proxy is set, this is it */
- if(NULL == proxy) {
- failf(data, "memory shortage");
- result = CURLE_OUT_OF_MEMORY;
- goto out;
- }
- }
-
- if(data->set.str[STRING_PRE_PROXY]) {
- socksproxy = strdup(data->set.str[STRING_PRE_PROXY]);
- /* if global socks proxy is set, this is it */
- if(NULL == socksproxy) {
- failf(data, "memory shortage");
- result = CURLE_OUT_OF_MEMORY;
- goto out;
- }
- }
-
- if(data->set.str[STRING_NOPROXY] &&
- check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY])) {
- Curl_safefree(proxy);
- Curl_safefree(socksproxy);
- }
- else if(!proxy && !socksproxy)
- proxy = detect_proxy(conn);
-
#ifdef USE_UNIX_SOCKETS
if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
- if(proxy) {
- free(proxy); /* Unix domain sockets cannot be proxied, so disable it */
- proxy = NULL;
- }
conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
if(conn->unix_domain_socket == NULL) {
result = CURLE_OUT_OF_MEMORY;
goto out;
}
+ conn->abstract_unix_socket = data->set.abstract_unix_socket;
}
#endif
- if(proxy && (!*proxy || (conn->handler->flags & PROTOPT_NONETWORK))) {
- free(proxy); /* Don't bother with an empty proxy string or if the
- protocol doesn't work with network */
- proxy = NULL;
- }
- if(socksproxy && (!*socksproxy ||
- (conn->handler->flags & PROTOPT_NONETWORK))) {
- free(socksproxy); /* Don't bother with an empty socks proxy string or if
- the protocol doesn't work with network */
- socksproxy = NULL;
- }
-
- /***********************************************************************
- * If this is supposed to use a proxy, we need to figure out the proxy host
- * name, proxy type and port number, so that we can re-use an existing
- * connection that may exist registered to the same proxy host.
- ***********************************************************************/
- if(proxy || socksproxy) {
- if(proxy) {
- result = parse_proxy(data, conn, proxy, conn->http_proxy.proxytype);
- Curl_safefree(proxy); /* parse_proxy copies the proxy string */
- if(result)
- goto out;
- }
-
- if(socksproxy) {
- result = parse_proxy(data, conn, socksproxy,
- conn->socks_proxy.proxytype);
- /* parse_proxy copies the socks proxy string */
- Curl_safefree(socksproxy);
- if(result)
- goto out;
- }
-
- if(conn->http_proxy.host.rawalloc) {
-#ifdef CURL_DISABLE_HTTP
- /* asking for a HTTP proxy is a bit funny when HTTP is disabled... */
- result = CURLE_UNSUPPORTED_PROTOCOL;
- goto out;
-#else
- /* force this connection's protocol to become HTTP if not already
- compatible - if it isn't tunneling through */
- if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) &&
- !conn->bits.tunnel_proxy)
- conn->handler = &Curl_handler_http;
-
- conn->bits.httpproxy = TRUE;
+ /* After the unix socket init but before the proxy vars are used, parse and
+ initialize the proxy vars */
+#ifndef CURL_DISABLE_PROXY
+ result = create_conn_helper_init_proxy(conn);
+ if(result)
+ goto out;
#endif
- }
- else {
- conn->bits.httpproxy = FALSE; /* not a HTTP proxy */
- conn->bits.tunnel_proxy = FALSE; /* no tunneling if not HTTP */
- }
-
- if(conn->socks_proxy.host.rawalloc) {
- if(!conn->http_proxy.host.rawalloc) {
- /* once a socks proxy */
- if(!conn->socks_proxy.user) {
- conn->socks_proxy.user = conn->http_proxy.user;
- conn->http_proxy.user = NULL;
- Curl_safefree(conn->socks_proxy.passwd);
- conn->socks_proxy.passwd = conn->http_proxy.passwd;
- conn->http_proxy.passwd = NULL;
- }
- }
- conn->bits.socksproxy = TRUE;
- }
- else
- conn->bits.socksproxy = FALSE; /* not a socks proxy */
- }
- else {
- conn->bits.socksproxy = FALSE;
- conn->bits.httpproxy = FALSE;
- }
- conn->bits.proxy = conn->bits.httpproxy || conn->bits.socksproxy;
-
- if(!conn->bits.proxy) {
- /* we aren't using the proxy after all... */
- conn->bits.proxy = FALSE;
- conn->bits.httpproxy = FALSE;
- conn->bits.socksproxy = FALSE;
- conn->bits.proxy_user_passwd = FALSE;
- conn->bits.tunnel_proxy = FALSE;
- }
-
-#endif /* CURL_DISABLE_PROXY */
/*************************************************************
* If the protocol is using SSL and HTTP proxy is used, we set
@@ -6340,12 +6537,14 @@ static CURLcode create_conn(struct Curl_easy *data,
fix_hostname(conn, &conn->host);
if(conn->bits.conn_to_host)
fix_hostname(conn, &conn->conn_to_host);
- if(conn->proxy.name && *conn->proxy.name)
- fix_hostname(conn, &conn->proxy);
+ if(conn->bits.httpproxy)
+ fix_hostname(conn, &conn->http_proxy.host);
+ if(conn->bits.socksproxy)
+ fix_hostname(conn, &conn->socks_proxy.host);
/*************************************************************
* 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-fixed.
*************************************************************/
if(conn->bits.conn_to_host &&
strcasecompare(conn->conn_to_host.name, conn->host.name)) {
@@ -6501,7 +6700,7 @@ static CURLcode create_conn(struct Curl_easy *data,
/* If we found a reusable connection, 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;
+ 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);
@@ -6661,13 +6860,11 @@ static CURLcode create_conn(struct Curl_easy *data,
*************************************************************/
result = resolve_server(data, conn, async);
- out:
+out:
free(options);
free(passwd);
free(user);
- free(socksproxy);
- free(proxy);
return result;
}
@@ -6771,7 +6968,7 @@ CURLcode Curl_connect(struct Curl_easy *data,
if(!result) {
/* no error */
- if((*in_connect)->send_pipe->size || (*in_connect)->recv_pipe->size)
+ if((*in_connect)->send_pipe.size || (*in_connect)->recv_pipe.size)
/* pipelining */
*protocol_done = TRUE;
else if(!*asyncp) {
@@ -6836,7 +7033,6 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
k->bytecount = 0;
k->buf = data->state.buffer;
- k->uploadbuf = data->state.uploadbuffer;
k->hbufp = data->state.headerbuff;
k->ignorebody=FALSE;
@@ -6860,7 +7056,7 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
* Returns the family as a single bit protocol identifier.
*/
-unsigned int get_protocol_family(unsigned int protocol)
+static unsigned int get_protocol_family(unsigned int protocol)
{
unsigned int family;
diff --git a/lib/urldata.h b/lib/urldata.h
index 0271d266..45ad04e0 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -136,8 +136,10 @@
#undef realloc
#endif /* USE_AXTLS */
-#ifdef USE_SCHANNEL
+#if defined(USE_SCHANNEL) || defined(USE_WINDOWS_SSPI)
#include "curl_sspi.h"
+#endif
+#ifdef USE_SCHANNEL
#include <schnlsp.h>
#include <schannel.h>
#endif
@@ -198,9 +200,12 @@
#include <libssh2_sftp.h>
#endif /* HAVE_LIBSSH2_H */
-/* Download buffer size, keep it fairly big for speed reasons */
-#undef BUFSIZE
-#define BUFSIZE CURL_MAX_WRITE_SIZE
+/* The upload buffer size, should not be smaller than CURL_MAX_WRITE_SIZE, as
+ it needs to hold a full buffer as could be sent in a write callback */
+#define UPLOAD_BUFSIZE CURL_MAX_WRITE_SIZE
+
+/* 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. */
@@ -311,7 +316,7 @@ struct ssl_connect_data {
PRFileDesc *handle;
char *client_nickname;
struct Curl_easy *data;
- struct curl_llist *obj_list;
+ struct curl_llist obj_list;
PK11GenericObject *obj_clicert;
#elif defined(USE_GSKIT)
gsk_handle handle;
@@ -328,6 +333,11 @@ struct ssl_connect_data {
size_t encdata_length, decdata_length;
size_t encdata_offset, decdata_offset;
unsigned char *encdata_buffer, *decdata_buffer;
+ /* encdata_is_incomplete: if encdata contains only a partial record that
+ can't be decrypted without another Curl_read_plain (that is, status is
+ SEC_E_INCOMPLETE_MESSAGE) then set this true. after Curl_read_plain writes
+ more bytes into encdata then set this back to false. */
+ bool encdata_is_incomplete;
unsigned long req_flags, ret_flags;
CURLcode recv_unrecoverable_err; /* schannel_recv had an unrecoverable err */
bool recv_sspi_close_notify; /* true if connection closed by close_notify */
@@ -345,6 +355,7 @@ struct ssl_connect_data {
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 */
@@ -354,6 +365,7 @@ struct ssl_primary_config {
char *random_file; /* path to file containing "random" data */
char *egdsocket; /* path to file containing the EGD daemon socket */
char *cipher_list; /* list of ciphers to use */
+ bool sessionid; /* cache session IDs or not */
};
struct ssl_config_data {
@@ -383,7 +395,6 @@ struct ssl_config_data {
};
struct ssl_general_config {
- bool sessionid; /* cache session IDs or not */
size_t max_ssl_sessions; /* SSL session id cache size */
};
@@ -405,6 +416,7 @@ struct digestdata {
#if defined(USE_WINDOWS_SSPI)
BYTE *input_token;
size_t input_token_len;
+ CtxtHandle *http_context;
#else
char *nonce;
char *cnonce;
@@ -666,8 +678,8 @@ struct SingleRequest {
100 reply (without a following second response
code) result in a CURLE_GOT_NOTHING error code */
- struct timeval start; /* transfer started at this time */
- struct timeval now; /* current time */
+ 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 */
@@ -689,7 +701,7 @@ struct SingleRequest {
Content-Range: header */
int httpcode; /* error code from the 'HTTP/1.? XXX' or
'RTSP/1.? XXX' line */
- struct timeval start100; /* time stamp to wait for the 100 code from */
+ struct curltime start100; /* time stamp to wait for the 100 code from */
enum expect100 exp100; /* expect 100 continue state */
enum upgrade101 upgr101; /* 101 upgrade state */
@@ -709,7 +721,6 @@ struct SingleRequest {
long bodywrites;
char *buf;
- char *uploadbuf;
curl_socket_t maxfd;
int keepon;
@@ -818,6 +829,12 @@ struct Curl_handler {
CURLcode (*readwrite)(struct Curl_easy *data, struct connectdata *conn,
ssize_t *nread, bool *readmore);
+ /* This function can perform various checks on the connection. See
+ CONNCHECK_* for more information about the checks that can be performed,
+ and CONNRESULT_* for the results that can be returned. */
+ unsigned int (*connection_check)(struct connectdata *conn,
+ unsigned int checks_to_perform);
+
long defport; /* Default port. */
unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
specific protocol bit */
@@ -842,6 +859,17 @@ struct Curl_handler {
request instead of per connection */
#define PROTOPT_ALPN_NPN (1<<8) /* set ALPN and/or NPN for this */
#define PROTOPT_STREAM (1<<9) /* a protocol with individual logical streams */
+#define PROTOPT_URLOPTIONS (1<<10) /* allow options part in the userinfo field
+ of the URL */
+#define PROTOPT_PROXY_AS_HTTP (1<<11) /* allow this non-HTTP scheme over a
+ HTTP proxy as HTTP proxies may know
+ this protocol and act as a gateway */
+
+#define CONNCHECK_NONE 0 /* No checks */
+#define CONNCHECK_ISDEAD (1<<0) /* Check if the connection is dead. */
+
+#define CONNRESULT_NONE 0 /* No extra information. */
+#define CONNRESULT_DEAD (1<<0) /* The connection is dead. */
/* return the count of bytes sent, or -1 on error */
typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
@@ -879,6 +907,24 @@ struct proxy_info {
char *passwd; /* proxy password string, allocated */
};
+#define CONNECT_BUFFER_SIZE 16384
+
+/* struct for HTTP CONNECT state data */
+struct http_connect_state {
+ char connect_buffer[CONNECT_BUFFER_SIZE];
+ int perline; /* count bytes per line */
+ int keepon;
+ 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;
+};
+
/*
* The connectdata struct contains all fields and variables that should be
* unique for an entire connection.
@@ -889,6 +935,8 @@ struct connectdata {
connection is used! */
struct Curl_easy *data;
+ struct curl_llist_element bundle_node; /* conncache */
+
/* chunk is for HTTP chunked encoding, but is in the general connectdata
struct only because we can do just about any protocol through a HTTP proxy
and a HTTP proxy may in fact respond using chunked encoding */
@@ -931,7 +979,6 @@ struct connectdata {
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 */
- struct hostname proxy;
struct proxy_info socks_proxy;
struct proxy_info http_proxy;
@@ -969,8 +1016,8 @@ struct connectdata {
int httpversion; /* the HTTP version*10 reported by the server */
int rtspversion; /* the RTSP version*10 reported by the server */
- struct timeval now; /* "current" time */
- struct timeval created; /* creation time */
+ struct curltime now; /* "current" time */
+ struct curltime created; /* creation time */
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 */
@@ -993,7 +1040,7 @@ struct connectdata {
/* connecttime: when connect() is called on the current IP address. Used to
be able to track when to move on to try next IP - but only when the multi
interface is used. */
- struct timeval connecttime;
+ 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
@@ -1050,10 +1097,10 @@ struct connectdata {
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 */
+ 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 */
@@ -1120,19 +1167,13 @@ struct connectdata {
char *localdev;
unsigned short localport;
int localportrange;
-
- /* tunnel as in tunnel through a HTTP proxy with CONNECT */
- enum {
- TUNNEL_INIT, /* init/default/no tunnel state */
- TUNNEL_CONNECT, /* CONNECT has been sent off */
- TUNNEL_COMPLETE /* CONNECT response received completely */
- } tunnel_state[2]; /* two separate ones to allow FTP */
+ struct http_connect_state *connect_state; /* for HTTP CONNECT */
struct connectbundle *bundle; /* The bundle we are member of */
-
int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
#ifdef USE_UNIX_SOCKETS
char *unix_domain_socket;
+ bool abstract_unix_socket;
#endif
};
@@ -1197,34 +1238,34 @@ struct Progress {
int width; /* screen width at download start */
int flags; /* see progress.h */
- double timespent;
+ time_t timespent;
curl_off_t dlspeed;
curl_off_t ulspeed;
- double t_nslookup;
- double t_connect;
- double t_appconnect;
- double t_pretransfer;
- double t_starttransfer;
- double t_redirect;
+ time_t t_nslookup;
+ time_t t_connect;
+ time_t t_appconnect;
+ time_t t_pretransfer;
+ time_t t_starttransfer;
+ time_t t_redirect;
- struct timeval start;
- struct timeval t_startsingle;
- struct timeval t_startop;
- struct timeval t_acceptdata;
+ struct curltime start;
+ struct curltime t_startsingle;
+ struct curltime t_startop;
+ struct curltime t_acceptdata;
/* upload speed limit */
- struct timeval ul_limit_start;
+ struct curltime ul_limit_start;
curl_off_t ul_limit_size;
/* download speed limit */
- struct timeval dl_limit_start;
+ struct curltime dl_limit_start;
curl_off_t dl_limit_size;
#define CURR_TIME (5+1) /* 6 entries for 5 seconds */
curl_off_t speeder[ CURR_TIME ];
- struct timeval speeder_time[ CURR_TIME ];
+ struct curltime speeder_time[ CURR_TIME ];
int speeder_c;
};
@@ -1235,6 +1276,7 @@ typedef enum {
HTTPREQ_POST_FORM, /* we make a difference internally */
HTTPREQ_PUT,
HTTPREQ_HEAD,
+ HTTPREQ_OPTIONS,
HTTPREQ_CUSTOM,
HTTPREQ_LAST /* last in list */
} Curl_HttpReq;
@@ -1274,8 +1316,8 @@ struct auth {
this resource */
bool done; /* TRUE when the auth phase is done and ready to do the *actual*
request */
- bool multi; /* TRUE if this is not yet authenticated but within the auth
- multipass negotiation */
+ bool 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 */
};
@@ -1285,6 +1327,43 @@ struct Curl_http2_dep {
struct Curl_easy *data;
};
+/*
+ * This struct is for holding data that was attemped to get sent to the user's
+ * callback but is held due to pausing. One instance per type (BOTH, HEADER,
+ * BODY).
+ */
+struct tempbuf {
+ char *buf; /* allocated buffer to keep data in when a write callback
+ returns to make the connection paused */
+ size_t len; /* size of the 'tempwrite' allocated buffer */
+ int type; /* type of the 'tempwrite' buffer as a bitmask that is used with
+ Curl_client_write() */
+};
+
+/* Timers */
+typedef enum {
+ EXPIRE_100_TIMEOUT,
+ EXPIRE_ASYNC_NAME,
+ EXPIRE_CONNECTTIMEOUT,
+ EXPIRE_DNS_PER_NAME,
+ EXPIRE_HAPPY_EYEBALLS,
+ EXPIRE_MULTI_PENDING,
+ EXPIRE_RUN_NOW,
+ EXPIRE_SPEEDCHECK,
+ EXPIRE_TIMEOUT,
+ EXPIRE_TOOFAST,
+ EXPIRE_LAST /* not an actual timer, used as a marker only */
+} expire_id;
+
+/*
+ * One instance for each timeout an easy handle can set.
+ */
+struct time_node {
+ struct curl_llist_element list;
+ struct curltime time;
+ expire_id eid;
+};
+
struct UrlState {
/* Points to the connection cache */
@@ -1296,16 +1375,16 @@ struct UrlState {
bool multi_owned_by_easy;
/* buffers to store authentication data in, as parsed from input options */
- struct timeval keeps_speed; /* for the progress meter really */
+ struct curltime keeps_speed; /* for the progress meter really */
struct connectdata *lastconnect; /* The last connection, NULL if undefined */
char *headerbuff; /* allocated buffer to store headers in */
size_t headersize; /* size of the allocation */
- char buffer[BUFSIZE+1]; /* download buffer */
- char uploadbuffer[BUFSIZE+1]; /* upload buffer */
- curl_off_t current_speed; /* the ProgressShow() funcion sets this,
+ char *buffer; /* download buffer */
+ char uploadbuffer[UPLOAD_BUFSIZE+1]; /* upload buffer */
+ curl_off_t current_speed; /* the ProgressShow() function sets this,
bytes / second */
bool this_is_a_follow; /* this is a followed Location: request */
@@ -1318,12 +1397,9 @@ struct UrlState {
int first_remote_port; /* remote port of the first (not followed) request */
struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
long sessionage; /* number of the most recent session */
- char *tempwrite; /* allocated buffer to keep data in when a write
- callback returns to make the connection paused */
- size_t tempwritesize; /* size of the 'tempwrite' allocated buffer */
- int tempwritetype; /* type of the 'tempwrite' buffer as a bitmask that is
- used with Curl_client_write() */
- char *scratch; /* huge buffer[BUFSIZE*2] when doing upload CRLF replacing */
+ 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. */
@@ -1353,9 +1429,10 @@ struct UrlState {
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H)
ENGINE *engine;
#endif /* USE_OPENSSL */
- struct timeval expiretime; /* set this with Curl_expire() only */
+ struct curltime expiretime; /* set this with Curl_expire() only */
struct Curl_tree timenode; /* for the splay stuff */
- struct curl_llist *timeoutlist; /* list of pending timeouts */
+ struct curl_llist timeoutlist; /* list of pending timeouts */
+ struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */
/* a place to store the most recently set FTP entrypath */
char *most_recent_ftp_entrypath;
@@ -1523,7 +1600,7 @@ enum dupstring {
#ifdef USE_UNIX_SOCKETS
STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */
#endif
-
+ STRING_TARGET, /* CURLOPT_REQUEST_TARGET */
/* -- end of zero-terminated strings -- */
STRING_LASTZEROTERMINATED,
@@ -1550,6 +1627,7 @@ struct UserDefined {
long use_port; /* which port to use (when not using default) */
unsigned long httpauth; /* kind of HTTP authentication to use (bitmask) */
unsigned long proxyauth; /* kind of proxy authentication to use (bitmask) */
+ unsigned long socks5auth;/* kind of SOCKS5 authentication to use (bitmask) */
long followlocation; /* as in HTTP Location: */
long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1
for infinity */
@@ -1634,11 +1712,11 @@ 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 */
curl_proxytype proxytype; /* what kind of proxy that is in use */
- curl_proxytype socks_proxytype; /* what kind of socks proxy that is in use */
long dns_cache_timeout; /* DNS cache timeout */
long buffer_size; /* size of receive buffer to use */
void *private_data; /* application-private data */
@@ -1748,12 +1826,16 @@ struct UserDefined {
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 */
struct Curl_easy *stream_depends_on;
bool stream_depends_e; /* set or don't set the Exclusive bit */
int stream_weight;
struct Curl_http2_dep *stream_dependents;
+
+ bool abstract_unix_socket;
};
struct Names {
@@ -1782,6 +1864,8 @@ struct Curl_easy {
struct Curl_easy *prev;
struct connectdata *easy_conn; /* the "unit's" connection */
+ struct curl_llist_element connect_queue;
+ struct curl_llist_element pipeline_queue;
CURLMstate mstate; /* the handle's state */
CURLcode result; /* previous result */
diff --git a/lib/vauth/digest.c b/lib/vauth/digest.c
index 7d9200ad..185098ed 100644
--- a/lib/vauth/digest.c
+++ b/lib/vauth/digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -205,7 +205,7 @@ static CURLcode auth_digest_get_qop_values(const char *options, int *value)
{
char *tmp;
char *token;
- char *tok_buf;
+ char *tok_buf = NULL;
/* Initialise the output */
*value = 0;
@@ -237,7 +237,7 @@ static CURLcode auth_digest_get_qop_values(const char *options, int *value)
* auth_decode_digest_md5_message()
*
* This is used internally to decode an already encoded DIGEST-MD5 challenge
- * message into the seperate attributes.
+ * message into the separate attributes.
*
* Parameters:
*
@@ -360,13 +360,12 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
char qop_options[64];
int qop_values;
char cnonce[33];
- unsigned int entropy[4];
char nonceCount[] = "00000001";
char method[] = "AUTHENTICATE";
char qop[] = DIGEST_QOP_VALUE_STRING_AUTH;
char *spn = NULL;
- /* Decode the challange message */
+ /* Decode the challenge message */
result = auth_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
realm, sizeof(realm),
algorithm, sizeof(algorithm),
@@ -387,15 +386,11 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
if(!(qop_values & DIGEST_QOP_VALUE_AUTH))
return CURLE_BAD_CONTENT_ENCODING;
- /* Generate 16 bytes of random data */
- result = Curl_rand(data, &entropy[0], 4);
+ /* Generate 32 random hex chars, 32 bytes + 1 zero termination */
+ result = Curl_rand_hex(data, (unsigned char *)cnonce, sizeof(cnonce));
if(result)
return result;
- /* Convert the random data into a 32 byte hex string */
- snprintf(cnonce, sizeof(cnonce), "%08x%08x%08x%08x",
- entropy[0], entropy[1], entropy[2], entropy[3]);
-
/* So far so good, now calculate A1 and H(A1) according to RFC 2831 */
ctxt = Curl_MD5_init(Curl_DIGEST_MD5);
if(!ctxt)
@@ -502,7 +497,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
/*
* Curl_auth_decode_digest_http_message()
*
- * This is used to decode a HTTP DIGEST challenge message into the seperate
+ * This is used to decode a HTTP DIGEST challenge message into the separate
* attributes.
*
* Parameters:
@@ -563,7 +558,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
return CURLE_OUT_OF_MEMORY;
}
else if(strcasecompare(value, "qop")) {
- char *tok_buf;
+ char *tok_buf = NULL;
/* Tokenize the list and choose auth if possible, use a temporary
clone of the buffer since strtok_r() ruins it */
tmp = strdup(content);
@@ -684,12 +679,10 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
digest->nc = 1;
if(!digest->cnonce) {
- unsigned int rnd[4];
- result = Curl_rand(data, &rnd[0], 4);
+ result = Curl_rand_hex(data, (unsigned char *)cnoncebuf,
+ sizeof(cnoncebuf));
if(result)
return result;
- snprintf(cnoncebuf, sizeof(cnoncebuf), "%08x%08x%08x%08x",
- rnd[0], rnd[1], rnd[2], rnd[3]);
result = Curl_base64_encode(data, cnoncebuf, strlen(cnoncebuf),
&cnonce, &cnonce_sz);
diff --git a/lib/vauth/digest_sspi.c b/lib/vauth/digest_sspi.c
index b9ceb12a..0bd94442 100644
--- a/lib/vauth/digest_sspi.c
+++ b/lib/vauth/digest_sspi.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
- * Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 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
@@ -320,7 +320,7 @@ CURLcode Curl_override_sspi_http_realm(const char *chlg,
/*
* Curl_auth_decode_digest_http_message()
*
- * This is used to decode a HTTP DIGEST challenge message into the seperate
+ * This is used to decode a HTTP DIGEST challenge message into the separate
* attributes.
*
* Parameters:
@@ -335,13 +335,44 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
{
size_t chlglen = strlen(chlg);
- /* We had an input token before and we got another one now. This means we
- provided bad credentials in the previous request. */
- if(digest->input_token)
- return CURLE_BAD_CONTENT_ENCODING;
+ /* We had an input token before so if there's another one now that means we
+ provided bad credentials in the previous request or it's stale. */
+ if(digest->input_token) {
+ bool stale = false;
+ const char *p = chlg;
+
+ /* Check for the 'stale' directive */
+ for(;;) {
+ char value[DIGEST_MAX_VALUE_LENGTH];
+ char content[DIGEST_MAX_CONTENT_LENGTH];
+
+ while(*p && ISSPACE(*p))
+ p++;
+
+ if(!Curl_auth_digest_get_pair(p, value, content, &p))
+ break;
+
+ if(Curl_strcasecompare(value, "stale")
+ && Curl_strcasecompare(content, "true")) {
+ stale = true;
+ break;
+ }
+
+ while(*p && ISSPACE(*p))
+ p++;
+
+ if(',' == *p)
+ p++;
+ }
+
+ if(stale)
+ Curl_auth_digest_cleanup(digest);
+ else
+ return CURLE_LOGIN_DENIED;
+ }
- /* Simply store the challenge for use later */
- digest->input_token = (BYTE *) Curl_memdup(chlg, chlglen);
+ /* Store the challenge for use later */
+ digest->input_token = (BYTE *) Curl_memdup(chlg, chlglen + 1);
if(!digest->input_token)
return CURLE_OUT_OF_MEMORY;
@@ -379,21 +410,13 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
char **outptr, size_t *outlen)
{
size_t token_max;
- CredHandle credentials;
- CtxtHandle context;
char *resp;
BYTE *output_token;
+ size_t output_token_len = 0;
PSecPkgInfo SecurityPackage;
- SEC_WINNT_AUTH_IDENTITY identity;
- SEC_WINNT_AUTH_IDENTITY *p_identity;
- SecBuffer chlg_buf[3];
- SecBuffer resp_buf;
+ SecBuffer chlg_buf[5];
SecBufferDesc chlg_desc;
- SecBufferDesc resp_desc;
SECURITY_STATUS status;
- unsigned long attrs;
- TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */
- TCHAR *spn;
(void) data;
@@ -408,123 +431,168 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
/* Release the package buffer as it is not required anymore */
s_pSecFn->FreeContextBuffer(SecurityPackage);
- if(userp && *userp) {
- /* Populate our identity structure */
- if(Curl_create_sspi_identity(userp, passwdp, &identity))
- return CURLE_OUT_OF_MEMORY;
-
- /* Populate our identity domain */
- if(Curl_override_sspi_http_realm((const char *) digest->input_token,
- &identity))
- return CURLE_OUT_OF_MEMORY;
+ /* Allocate the output buffer according to the max token size as indicated
+ by the security package */
+ output_token = malloc(token_max);
+ if(!output_token) {
+ return CURLE_OUT_OF_MEMORY;
+ }
- /* Allow proper cleanup of the identity structure */
- p_identity = &identity;
+ if(digest->http_context) {
+ chlg_desc.ulVersion = SECBUFFER_VERSION;
+ chlg_desc.cBuffers = 5;
+ chlg_desc.pBuffers = chlg_buf;
+ chlg_buf[0].BufferType = SECBUFFER_TOKEN;
+ chlg_buf[0].pvBuffer = NULL;
+ chlg_buf[0].cbBuffer = 0;
+ chlg_buf[1].BufferType = SECBUFFER_PKG_PARAMS;
+ chlg_buf[1].pvBuffer = (void *) request;
+ chlg_buf[1].cbBuffer = curlx_uztoul(strlen((const char *) request));
+ chlg_buf[2].BufferType = SECBUFFER_PKG_PARAMS;
+ chlg_buf[2].pvBuffer = (void *) uripath;
+ chlg_buf[2].cbBuffer = curlx_uztoul(strlen((const char *) uripath));
+ chlg_buf[3].BufferType = SECBUFFER_PKG_PARAMS;
+ chlg_buf[3].pvBuffer = NULL;
+ chlg_buf[3].cbBuffer = 0;
+ chlg_buf[4].BufferType = SECBUFFER_PADDING;
+ chlg_buf[4].pvBuffer = output_token;
+ chlg_buf[4].cbBuffer = curlx_uztoul(token_max);
+
+ status = s_pSecFn->MakeSignature(digest->http_context, 0, &chlg_desc, 0);
+ if(status == SEC_E_OK)
+ output_token_len = chlg_buf[4].cbBuffer;
+ else { /* delete the context so a new one can be made */
+ infof(data, "digest_sspi: MakeSignature failed, error 0x%08lx\n",
+ (long)status);
+ s_pSecFn->DeleteSecurityContext(digest->http_context);
+ Curl_safefree(digest->http_context);
+ }
}
- else
- /* Use the current Windows user */
- p_identity = NULL;
- /* Acquire our credentials handle */
- status = s_pSecFn->AcquireCredentialsHandle(NULL,
- (TCHAR *) TEXT(SP_NAME_DIGEST),
- SECPKG_CRED_OUTBOUND, NULL,
- p_identity, NULL, NULL,
- &credentials, &expiry);
- if(status != SEC_E_OK) {
- Curl_sspi_free_identity(p_identity);
+ if(!digest->http_context) {
+ CredHandle credentials;
+ SEC_WINNT_AUTH_IDENTITY identity;
+ SEC_WINNT_AUTH_IDENTITY *p_identity;
+ SecBuffer resp_buf;
+ SecBufferDesc resp_desc;
+ unsigned long attrs;
+ TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */
+ TCHAR *spn;
+
+ if(userp && *userp) {
+ /* Populate our identity structure */
+ if(Curl_create_sspi_identity(userp, passwdp, &identity)) {
+ free(output_token);
+ return CURLE_OUT_OF_MEMORY;
+ }
- return CURLE_LOGIN_DENIED;
- }
+ /* Populate our identity domain */
+ if(Curl_override_sspi_http_realm((const char *) digest->input_token,
+ &identity)) {
+ free(output_token);
+ return CURLE_OUT_OF_MEMORY;
+ }
- /* Allocate the output buffer according to the max token size as indicated
- by the security package */
- output_token = malloc(token_max);
- if(!output_token) {
- s_pSecFn->FreeCredentialsHandle(&credentials);
+ /* Allow proper cleanup of the identity structure */
+ p_identity = &identity;
+ }
+ else
+ /* Use the current Windows user */
+ p_identity = NULL;
+
+ /* Acquire our credentials handle */
+ status = s_pSecFn->AcquireCredentialsHandle(NULL,
+ (TCHAR *) TEXT(SP_NAME_DIGEST),
+ SECPKG_CRED_OUTBOUND, NULL,
+ p_identity, NULL, NULL,
+ &credentials, &expiry);
+ if(status != SEC_E_OK) {
+ Curl_sspi_free_identity(p_identity);
+ free(output_token);
- Curl_sspi_free_identity(p_identity);
+ return CURLE_LOGIN_DENIED;
+ }
- return CURLE_OUT_OF_MEMORY;
- }
+ /* Setup the challenge "input" security buffer if present */
+ chlg_desc.ulVersion = SECBUFFER_VERSION;
+ chlg_desc.cBuffers = 3;
+ chlg_desc.pBuffers = chlg_buf;
+ chlg_buf[0].BufferType = SECBUFFER_TOKEN;
+ chlg_buf[0].pvBuffer = digest->input_token;
+ chlg_buf[0].cbBuffer = curlx_uztoul(digest->input_token_len);
+ chlg_buf[1].BufferType = SECBUFFER_PKG_PARAMS;
+ chlg_buf[1].pvBuffer = (void *) request;
+ chlg_buf[1].cbBuffer = curlx_uztoul(strlen((const char *) request));
+ chlg_buf[2].BufferType = SECBUFFER_PKG_PARAMS;
+ chlg_buf[2].pvBuffer = NULL;
+ chlg_buf[2].cbBuffer = 0;
+
+ /* Setup the response "output" security buffer */
+ resp_desc.ulVersion = SECBUFFER_VERSION;
+ resp_desc.cBuffers = 1;
+ resp_desc.pBuffers = &resp_buf;
+ resp_buf.BufferType = SECBUFFER_TOKEN;
+ resp_buf.pvBuffer = output_token;
+ resp_buf.cbBuffer = curlx_uztoul(token_max);
+
+ spn = Curl_convert_UTF8_to_tchar((char *) uripath);
+ if(!spn) {
+ s_pSecFn->FreeCredentialsHandle(&credentials);
+
+ Curl_sspi_free_identity(p_identity);
+ free(output_token);
- /* Setup the challenge "input" security buffer if present */
- chlg_desc.ulVersion = SECBUFFER_VERSION;
- chlg_desc.cBuffers = 3;
- chlg_desc.pBuffers = chlg_buf;
- chlg_buf[0].BufferType = SECBUFFER_TOKEN;
- chlg_buf[0].pvBuffer = digest->input_token;
- chlg_buf[0].cbBuffer = curlx_uztoul(digest->input_token_len);
- chlg_buf[1].BufferType = SECBUFFER_PKG_PARAMS;
- chlg_buf[1].pvBuffer = (void *) request;
- chlg_buf[1].cbBuffer = curlx_uztoul(strlen((const char *) request));
- chlg_buf[2].BufferType = SECBUFFER_PKG_PARAMS;
- chlg_buf[2].pvBuffer = NULL;
- chlg_buf[2].cbBuffer = 0;
+ return CURLE_OUT_OF_MEMORY;
+ }
- /* Setup the response "output" security buffer */
- resp_desc.ulVersion = SECBUFFER_VERSION;
- resp_desc.cBuffers = 1;
- resp_desc.pBuffers = &resp_buf;
- resp_buf.BufferType = SECBUFFER_TOKEN;
- resp_buf.pvBuffer = output_token;
- resp_buf.cbBuffer = curlx_uztoul(token_max);
+ /* Allocate our new context handle */
+ digest->http_context = calloc(1, sizeof(CtxtHandle));
+ if(!digest->http_context)
+ return CURLE_OUT_OF_MEMORY;
- spn = Curl_convert_UTF8_to_tchar((char *) uripath);
- if(!spn) {
- s_pSecFn->FreeCredentialsHandle(&credentials);
+ /* Generate our response message */
+ status = s_pSecFn->InitializeSecurityContext(&credentials, NULL,
+ spn,
+ ISC_REQ_USE_HTTP_STYLE, 0, 0,
+ &chlg_desc, 0,
+ digest->http_context,
+ &resp_desc, &attrs, &expiry);
+ Curl_unicodefree(spn);
+
+ if(status == SEC_I_COMPLETE_NEEDED ||
+ status == SEC_I_COMPLETE_AND_CONTINUE)
+ s_pSecFn->CompleteAuthToken(&credentials, &resp_desc);
+ else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
+ s_pSecFn->FreeCredentialsHandle(&credentials);
+
+ Curl_sspi_free_identity(p_identity);
+ free(output_token);
- Curl_sspi_free_identity(p_identity);
- free(output_token);
+ Curl_safefree(digest->http_context);
- return CURLE_OUT_OF_MEMORY;
- }
+ return CURLE_OUT_OF_MEMORY;
+ }
- /* Generate our reponse message */
- status = s_pSecFn->InitializeSecurityContext(&credentials, NULL,
- spn,
- ISC_REQ_USE_HTTP_STYLE, 0, 0,
- &chlg_desc, 0, &context,
- &resp_desc, &attrs, &expiry);
- Curl_unicodefree(spn);
+ output_token_len = resp_buf.cbBuffer;
- if(status == SEC_I_COMPLETE_NEEDED ||
- status == SEC_I_COMPLETE_AND_CONTINUE)
- s_pSecFn->CompleteAuthToken(&credentials, &resp_desc);
- else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
s_pSecFn->FreeCredentialsHandle(&credentials);
-
Curl_sspi_free_identity(p_identity);
- free(output_token);
-
- return CURLE_OUT_OF_MEMORY;
}
- resp = malloc(resp_buf.cbBuffer + 1);
+ resp = malloc(output_token_len + 1);
if(!resp) {
- s_pSecFn->DeleteSecurityContext(&context);
- s_pSecFn->FreeCredentialsHandle(&credentials);
-
- Curl_sspi_free_identity(p_identity);
free(output_token);
return CURLE_OUT_OF_MEMORY;
}
- /* Copy the generated reponse */
- memcpy(resp, resp_buf.pvBuffer, resp_buf.cbBuffer);
- resp[resp_buf.cbBuffer] = 0x00;
+ /* Copy the generated response */
+ memcpy(resp, output_token, output_token_len);
+ resp[output_token_len] = 0;
/* Return the response */
*outptr = resp;
- *outlen = resp_buf.cbBuffer;
-
- /* Free our handles */
- s_pSecFn->DeleteSecurityContext(&context);
- s_pSecFn->FreeCredentialsHandle(&credentials);
-
- /* Free the identity structure */
- Curl_sspi_free_identity(p_identity);
+ *outlen = output_token_len;
/* Free the response buffer */
free(output_token);
@@ -549,6 +617,12 @@ void Curl_auth_digest_cleanup(struct digestdata *digest)
/* Reset any variables */
digest->input_token_len = 0;
+
+ /* Delete security context */
+ if(digest->http_context) {
+ s_pSecFn->DeleteSecurityContext(digest->http_context);
+ Curl_safefree(digest->http_context);
+ }
}
#endif /* USE_WINDOWS_SSPI && !CURL_DISABLE_CRYPTO_AUTH */
diff --git a/lib/vauth/krb5_gssapi.c b/lib/vauth/krb5_gssapi.c
index c754fae4..560ecc5b 100644
--- a/lib/vauth/krb5_gssapi.c
+++ b/lib/vauth/krb5_gssapi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, 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
@@ -68,7 +68,7 @@ bool Curl_auth_is_gssapi_supported(void)
* passdwp [in] - The user's password.
* service [in] - The service type such as http, smtp, pop or imap.
* host [in[ - The host name.
- * mutual_auth [in] - Flag specifing whether or not mutual authentication
+ * mutual_auth [in] - Flag specifying whether or not mutual authentication
* is enabled.
* chlg64 [in] - Pointer to the optional base64 encoded challenge
* message.
diff --git a/lib/vauth/krb5_sspi.c b/lib/vauth/krb5_sspi.c
index 151794e6..1b4cef48 100644
--- a/lib/vauth/krb5_sspi.c
+++ b/lib/vauth/krb5_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2017, 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
@@ -74,7 +74,7 @@ bool Curl_auth_is_gssapi_supported(void)
* passdwp [in] - The user's password.
* service [in] - The service type such as http, smtp, pop or imap.
* host [in] - The host name.
- * mutual_auth [in] - Flag specifing whether or not mutual authentication
+ * mutual_auth [in] - Flag specifying whether or not mutual authentication
* is enabled.
* chlg64 [in] - The optional base64 encoded challenge message.
* krb5 [in/out] - The Kerberos 5 data struct being used and modified.
diff --git a/lib/vauth/ntlm.c b/lib/vauth/ntlm.c
index b4d345d6..42196455 100644
--- a/lib/vauth/ntlm.c
+++ b/lib/vauth/ntlm.c
@@ -27,7 +27,7 @@
/*
* NTLM details:
*
- * http://davenport.sourceforge.net/ntlm.html
+ * https://davenport.sourceforge.io/ntlm.html
* https://www.innovation.ch/java/ntlm.html
*/
@@ -394,7 +394,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(const char *userp,
/* Clean up any former leftovers and initialise to defaults */
Curl_auth_ntlm_cleanup(ntlm);
-#if USE_NTRESPONSES && USE_NTLM2SESSION
+#if defined(USE_NTRESPONSES) && defined(USE_NTLM2SESSION)
#define NTLM2FLAG NTLMFLAG_NEGOTIATE_NTLM2_KEY
#else
#define NTLM2FLAG 0
@@ -509,7 +509,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
unsigned char ntlmbuf[NTLM_BUFSIZE];
int lmrespoff;
unsigned char lmresp[24]; /* fixed-size */
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
int ntrespoff;
unsigned int ntresplen = 24;
unsigned char ntresp[24]; /* fixed-size */
@@ -552,13 +552,13 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
hostlen = strlen(host);
}
-#if USE_NTRESPONSES && USE_NTLM_V2
+#if defined(USE_NTRESPONSES) && defined(USE_NTLM_V2)
if(ntlm->target_info_len) {
unsigned char ntbuffer[0x18];
- unsigned int entropy[2];
+ unsigned char entropy[8];
unsigned char ntlmv2hash[0x18];
- result = Curl_rand(data, &entropy[0], 2);
+ result = Curl_rand(data, entropy, 8);
if(result)
return result;
@@ -572,15 +572,13 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
return result;
/* LMv2 response */
- result = Curl_ntlm_core_mk_lmv2_resp(ntlmv2hash,
- (unsigned char *)&entropy[0],
+ result = Curl_ntlm_core_mk_lmv2_resp(ntlmv2hash, entropy,
&ntlm->nonce[0], lmresp);
if(result)
return result;
/* NTLMv2 response */
- result = Curl_ntlm_core_mk_ntlmv2_resp(ntlmv2hash,
- (unsigned char *)&entropy[0],
+ result = Curl_ntlm_core_mk_ntlmv2_resp(ntlmv2hash, entropy,
ntlm, &ntlmv2resp, &ntresplen);
if(result)
return result;
@@ -590,16 +588,16 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
else
#endif
-#if USE_NTRESPONSES && USE_NTLM2SESSION
+#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) {
unsigned char ntbuffer[0x18];
unsigned char tmp[0x18];
unsigned char md5sum[MD5_DIGEST_LENGTH];
- unsigned int entropy[2];
+ unsigned char entropy[8];
/* Need to create 8 bytes random data */
- result = Curl_rand(data, &entropy[0], 2);
+ result = Curl_rand(data, entropy, 8);
if(result)
return result;
@@ -630,12 +628,12 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
#endif
{
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
unsigned char ntbuffer[0x18];
#endif
unsigned char lmbuffer[0x18];
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
if(result)
return result;
@@ -651,7 +649,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
/* A safer but less compatible alternative is:
* Curl_ntlm_core_lm_resp(ntbuffer, &ntlm->nonce[0], lmresp);
- * See http://davenport.sourceforge.net/ntlm.html#ntlmVersion2 */
+ * See https://davenport.sourceforge.io/ntlm.html#ntlmVersion2 */
}
if(unicode) {
@@ -661,7 +659,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
}
lmrespoff = 64; /* size of the message header */
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
ntrespoff = lmrespoff + 0x18;
domoff = ntrespoff + ntresplen;
#else
@@ -721,7 +719,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
SHORTPAIR(lmrespoff),
0x0, 0x0,
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
SHORTPAIR(ntresplen), /* NT-response length, twice */
SHORTPAIR(ntresplen),
SHORTPAIR(ntrespoff),
@@ -768,7 +766,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
ntlm_print_hex(stderr, (char *)&ntlmbuf[lmrespoff], 0x18);
});
-#if USE_NTRESPONSES
+#ifdef USE_NTRESPONSES
if(size < (NTLM_BUFSIZE - ntresplen)) {
DEBUGASSERT(size == (size_t)ntrespoff);
memcpy(&ntlmbuf[size], ptr_ntresp, ntresplen);
diff --git a/lib/vauth/ntlm.h b/lib/vauth/ntlm.h
index b14e7a56..f906a3c7 100644
--- a/lib/vauth/ntlm.h
+++ b/lib/vauth/ntlm.h
@@ -32,7 +32,7 @@
/* Stuff only required for curl_ntlm_msgs.c */
#ifdef BUILDING_CURL_NTLM_MSGS_C
-/* Flag bits definitions based on http://davenport.sourceforge.net/ntlm.html */
+/* Flag bits definitions based on https://davenport.sourceforge.io/ntlm.html */
#define NTLMFLAG_NEGOTIATE_UNICODE (1<<0)
/* Indicates that Unicode strings are supported for use in security buffer
diff --git a/lib/vauth/spnego_gssapi.c b/lib/vauth/spnego_gssapi.c
index 8840db8f..5196c270 100644
--- a/lib/vauth/spnego_gssapi.c
+++ b/lib/vauth/spnego_gssapi.c
@@ -180,6 +180,10 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
return CURLE_OUT_OF_MEMORY;
}
+ /* Free previous token */
+ if(nego->output_token.length && nego->output_token.value)
+ gss_release_buffer(&unused_status, &nego->output_token);
+
nego->output_token = output_token;
return CURLE_OK;
diff --git a/lib/vauth/spnego_sspi.c b/lib/vauth/spnego_sspi.c
index 5fa95e2e..a6797cda 100644
--- a/lib/vauth/spnego_sspi.c
+++ b/lib/vauth/spnego_sspi.c
@@ -34,6 +34,7 @@
#include "warnless.h"
#include "curl_multibyte.h"
#include "sendf.h"
+#include "strerror.h"
/* The last #include files should be: */
#include "curl_memory.h"
@@ -224,6 +225,8 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
free(chlg);
if(GSS_ERROR(nego->status)) {
+ failf(data, "InitializeSecurityContext failed: %s",
+ Curl_sspi_strerror(data->easy_conn, nego->status));
return CURLE_OUT_OF_MEMORY;
}
diff --git a/lib/vtls/axtls.c b/lib/vtls/axtls.c
index ff4634e5..f0e37664 100644
--- a/lib/vtls/axtls.c
+++ b/lib/vtls/axtls.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, DirecTV, Contact: Eric Hu, <ehu@directv.com>.
- * Copyright (C) 2010 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 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
@@ -156,6 +156,12 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
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)) {
@@ -256,7 +262,7 @@ static CURLcode connect_prep(struct connectdata *conn, int sockindex)
* 2) setting up callbacks. these seem gnutls specific
*/
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
const uint8_t *ssl_sessionid;
size_t ssl_idsize;
@@ -267,13 +273,13 @@ static CURLcode connect_prep(struct connectdata *conn, int 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);
+ 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);
+ ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex], NULL, 0, NULL);
conn->ssl[sockindex].ssl = ssl;
return CURLE_OK;
@@ -386,9 +392,9 @@ static CURLcode connect_finish(struct connectdata *conn, int sockindex)
conn->send[sockindex] = axtls_send;
/* Put our freshly minted SSL session in cache */
- if(data->set.general_ssl.sessionid) {
- const uint8_t *ssl_sessionid = ssl_get_session_id_size(ssl);
- size_t ssl_idsize = ssl_get_session_id(ssl);
+ 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)
@@ -680,9 +686,9 @@ size_t Curl_axtls_version(char *buffer, size_t size)
return snprintf(buffer, size, "axTLS/%s", ssl_version());
}
-int Curl_axtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+CURLcode Curl_axtls_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length)
{
static bool ssl_seeded = FALSE;
(void)data;
@@ -694,7 +700,7 @@ int Curl_axtls_random(struct Curl_easy *data,
RNG_initialize();
}
get_random((int)length, entropy);
- return 0;
+ return CURLE_OK;
}
#endif /* USE_AXTLS */
diff --git a/lib/vtls/axtls.h b/lib/vtls/axtls.h
index b16d051a..53797ead 100644
--- a/lib/vtls/axtls.h
+++ b/lib/vtls/axtls.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, DirecTV, Contact: Eric Hu <ehu@directv.com>
- * Copyright (C) 2010 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 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
@@ -42,9 +42,9 @@ void Curl_axtls_session_free(void *ptr);
size_t Curl_axtls_version(char *buffer, size_t size);
int Curl_axtls_shutdown(struct connectdata *conn, int sockindex);
int Curl_axtls_check_cxn(struct connectdata *conn);
-int Curl_axtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
+CURLcode Curl_axtls_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length);
/* Set the API backend definition to axTLS */
#define CURL_SSL_BACKEND CURLSSLBACKEND_AXTLS
diff --git a/lib/vtls/cyassl.c b/lib/vtls/cyassl.c
index fc4dde4a..01bfdabd 100644
--- a/lib/vtls/cyassl.c
+++ b/lib/vtls/cyassl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -44,6 +44,38 @@ and that's a problem since options.h hasn't been included yet. */
#include <cyassl/options.h>
#endif
+/* To determine what functions are available we rely on one or both of:
+ - the user's options.h generated by CyaSSL/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. */
+
+/* HAVE_ALPN is wolfSSL's build time symbol for enabling ALPN in options.h. */
+#ifndef HAVE_ALPN
+#ifdef HAVE_WOLFSSL_USEALPN
+#define HAVE_ALPN
+#endif
+#endif
+
+/* WOLFSSL_ALLOW_SSLV3 is wolfSSL's build time symbol for enabling SSLv3 in
+ 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)
+#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
+
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
@@ -78,38 +110,6 @@ and that's a problem since options.h hasn't been included yet. */
#define CYASSL_MAX_ERROR_SZ 80
#endif
-/* To determine what functions are available we rely on one or both of:
- - the user's options.h generated by CyaSSL/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. */
-
-/* HAVE_ALPN is wolfSSL's build time symbol for enabling ALPN in options.h. */
-#ifndef HAVE_ALPN
-#ifdef HAVE_WOLFSSL_USEALPN
-#define HAVE_ALPN
-#endif
-#endif
-
-/* WOLFSSL_ALLOW_SSLV3 is wolfSSL's build time symbol for enabling SSLv3 in
- 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)
-#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
-
static Curl_recv cyassl_recv;
static Curl_send cyassl_send;
@@ -134,6 +134,7 @@ cyassl_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* conssl = &conn->ssl[sockindex];
SSL_METHOD* req_method = NULL;
@@ -148,6 +149,11 @@ cyassl_connect_step1(struct connectdata *conn,
if(conssl->state == ssl_connection_complete)
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");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+
/* check to see if we've been told to use an explicit SSL/TLS version */
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
@@ -229,6 +235,15 @@ cyassl_connect_step1(struct connectdata *conn,
break;
}
+ ciphers = SSL_CONN_CONFIG(cipher_list);
+ if(ciphers) {
+ if(!SSL_CTX_set_cipher_list(conssl->ctx, ciphers)) {
+ failf(data, "failed setting cipher list: %s", ciphers);
+ return CURLE_SSL_CIPHER;
+ }
+ infof(data, "Cipher selection: %s\n", ciphers);
+ }
+
#ifndef NO_FILESYSTEM
/* load trusted cacert */
if(SSL_CONN_CONFIG(CAfile)) {
@@ -383,7 +398,7 @@ cyassl_connect_step1(struct connectdata *conn,
#endif /* HAVE_ALPN */
/* Check if there's a cached ID we can/should use here! */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
void *ssl_sessionid = NULL;
Curl_ssl_sessionid_lock(conn);
@@ -581,7 +596,13 @@ cyassl_connect_step2(struct connectdata *conn,
#endif /* HAVE_ALPN */
conssl->connecting_state = ssl_connect_3;
+#if (LIBCYASSL_VERSION_HEX >= 0x03009010)
+ infof(data, "SSL connection using %s / %s\n",
+ wolfSSL_get_version(conssl->handle),
+ wolfSSL_get_cipher_name(conssl->handle));
+#else
infof(data, "SSL connected\n");
+#endif
return CURLE_OK;
}
@@ -597,7 +618,7 @@ cyassl_connect_step3(struct connectdata *conn,
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
bool incache;
SSL_SESSION *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
@@ -720,7 +741,9 @@ void Curl_cyassl_session_free(void *ptr)
size_t Curl_cyassl_version(char *buffer, size_t size)
{
-#ifdef WOLFSSL_VERSION
+#if LIBCYASSL_VERSION_HEX >= 0x03006000
+ return snprintf(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);
@@ -772,7 +795,7 @@ cyassl_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;
+ time_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -901,19 +924,19 @@ Curl_cyassl_connect(struct connectdata *conn,
return CURLE_OK;
}
-int Curl_cyassl_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+CURLcode Curl_cyassl_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length)
{
RNG rng;
(void)data;
if(InitRng(&rng))
- return 1;
+ return CURLE_FAILED_INIT;
if(length > UINT_MAX)
- return 1;
+ return CURLE_FAILED_INIT;
if(RNG_GenerateBlock(&rng, entropy, (unsigned)length))
- return 1;
- return 0;
+ return CURLE_FAILED_INIT;
+ return CURLE_OK;
}
void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
diff --git a/lib/vtls/cyassl.h b/lib/vtls/cyassl.h
index 508dfaaf..f47719e4 100644
--- a/lib/vtls/cyassl.h
+++ b/lib/vtls/cyassl.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -51,15 +51,15 @@ int Curl_cyassl_init(void);
CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn,
int sockindex,
bool *done);
-int Curl_cyassl_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
+CURLcode Curl_cyassl_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length);
void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
size_t tmplen,
unsigned char *sha256sum, /* output */
size_t unused);
-/* Set the API backend definition to Schannel */
+/* Set the API backend definition to CyaSSL */
#define CURL_SSL_BACKEND CURLSSLBACKEND_CYASSL
/* this backend supports CURLOPT_SSL_CTX_* */
diff --git a/lib/vtls/darwinssl.c b/lib/vtls/darwinssl.c
index a43e3912..6f9c6012 100644
--- a/lib/vtls/darwinssl.c
+++ b/lib/vtls/darwinssl.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012 - 2014, Nick Zitzmann, <nickzman@gmail.com>.
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -34,6 +34,11 @@
#ifdef USE_DARWINSSL
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+#endif /* __clang__ */
+
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
@@ -113,6 +118,36 @@
#define ioErr -36
#define paramErr -50
+#ifdef DARWIN_SSL_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,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+ 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00};
+
+static const unsigned char rsa2048SpkiHeader[] = {
+ 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+ 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00};
+#ifdef DARWIN_SSL_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,
+ 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
+ 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48,
+ 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
+ 0x42, 0x00};
+
+static const unsigned char ecDsaSecp384r1SpkiHeader[] = {
+ 0x30, 0x76, 0x30, 0x10, 0x06, 0x07,
+ 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 */
+
/* The following two functions were ripped from Apple sample code,
* with some modifications: */
static OSStatus SocketRead(SSLConnectionRef connection,
@@ -219,6 +254,7 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
return ortn;
}
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
CF_INLINE const char *SSLCipherNameForNumber(SSLCipherSuite cipher)
{
switch(cipher) {
@@ -776,6 +812,7 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher)
}
return "TLS_NULL_WITH_NULL_NULL";
}
+#endif /* !CURL_DISABLE_VERBOSE_STRINGS */
#if CURL_BUILD_MAC
CF_INLINE void GetDarwinVersionNumber(int *major, int *minor)
@@ -885,12 +922,13 @@ static OSStatus CopyIdentityWithLabel(char *label,
SecIdentityRef *out_cert_and_key)
{
OSStatus status = errSecItemNotFound;
+
+#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
CFArrayRef keys_list;
CFIndex keys_list_count;
CFIndex i;
CFStringRef common_name;
-#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
/* SecItemCopyMatching() was introduced in iOS and Snow Leopard.
kSecClassIdentity was introduced in Lion. If both exist, let's use them
to find the certificate. */
@@ -929,28 +967,35 @@ static OSStatus CopyIdentityWithLabel(char *label,
if(status == noErr) {
keys_list_count = CFArrayGetCount(keys_list);
*out_cert_and_key = NULL;
+ status = 1;
for(i=0; i<keys_list_count; i++) {
OSStatus err = noErr;
SecCertificateRef cert = NULL;
- *out_cert_and_key =
+ SecIdentityRef identity =
(SecIdentityRef) CFArrayGetValueAtIndex(keys_list, i);
- err = SecIdentityCopyCertificate(*out_cert_and_key, &cert);
+ err = SecIdentityCopyCertificate(identity, &cert);
if(err == noErr) {
+#if CURL_BUILD_IOS
+ common_name = SecCertificateCopySubjectSummary(cert);
+#elif CURL_BUILD_MAC_10_7
SecCertificateCopyCommonName(cert, &common_name);
+#endif
if(CFStringCompare(common_name, label_cf, 0) == kCFCompareEqualTo) {
CFRelease(cert);
CFRelease(common_name);
+ CFRetain(identity);
+ *out_cert_and_key = identity;
status = noErr;
break;
}
CFRelease(common_name);
}
- *out_cert_and_key = NULL;
- status = 1;
CFRelease(cert);
}
}
+ if(keys_list)
+ CFRelease(keys_list);
CFRelease(query_dict);
CFRelease(label_cf);
}
@@ -1034,6 +1079,110 @@ CF_INLINE bool is_file(const char *filename)
return false;
}
+#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
+static CURLcode darwinssl_version_from_curl(SSLProtocol *darwinver,
+ long ssl_version)
+{
+ switch(ssl_version) {
+ case CURL_SSLVERSION_TLSv1_0:
+ *darwinver = kTLSProtocol1;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1:
+ *darwinver = kTLSProtocol11;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2:
+ *darwinver = kTLSProtocol12;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_3:
+ break;
+ }
+ return CURLE_SSL_CONNECT_ERROR;
+}
+#endif
+
+static CURLcode
+set_ssl_version_min_max(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+
+ switch(ssl_version) {
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ ssl_version = CURL_SSLVERSION_TLSv1_0;
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version << 16;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
+ if(SSLSetProtocolVersionMax != NULL) {
+ SSLProtocol darwin_ver_min = kTLSProtocol1;
+ SSLProtocol darwin_ver_max = kTLSProtocol1;
+ CURLcode result = darwinssl_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,
+ ssl_version_max >> 16);
+ if(result) {
+ failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+
+ (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, darwin_ver_min);
+ (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, darwin_ver_max);
+ return result;
+ }
+ else {
+#if CURL_SUPPORT_MAC_10_8
+ long i = ssl_version;
+ (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ kSSLProtocolAll,
+ false);
+ for(; i <= (ssl_version_max >> 16); i++) {
+ switch(i) {
+ case CURL_SSLVERSION_TLSv1_0:
+ (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ kTLSProtocol1,
+ true);
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ kTLSProtocol11,
+ true);
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
+ kTLSProtocol12,
+ true);
+ break;
+ case CURL_SSLVERSION_TLSv1_3:
+ failf(data, "DarwinSSL: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ }
+ return CURLE_OK;
+#endif /* CURL_SUPPORT_MAC_10_8 */
+ }
+#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
+ failf(data, "DarwinSSL: cannot set SSL protocol");
+ return CURLE_SSL_CONNECT_ERROR;
+}
+
+
static CURLcode darwinssl_connect_step1(struct connectdata *conn,
int sockindex)
{
@@ -1103,20 +1252,15 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
(void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol12);
break;
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol1);
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol1);
- break;
case CURL_SSLVERSION_TLSv1_1:
- (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol11);
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol11);
- break;
case CURL_SSLVERSION_TLSv1_2:
- (void)SSLSetProtocolVersionMin(connssl->ssl_ctx, kTLSProtocol12);
- (void)SSLSetProtocolVersionMax(connssl->ssl_ctx, kTLSProtocol12);
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "DarwinSSL: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv3:
err = SSLSetProtocolVersionMin(connssl->ssl_ctx, kSSLProtocol3);
if(err != noErr) {
@@ -1157,23 +1301,15 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
true);
break;
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
- kTLSProtocol1,
- true);
- break;
case CURL_SSLVERSION_TLSv1_1:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
- kTLSProtocol11,
- true);
- break;
case CURL_SSLVERSION_TLSv1_2:
- (void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
- kTLSProtocol12,
- true);
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "DarwinSSL: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv3:
err = SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
kSSLProtocol3,
@@ -1199,6 +1335,11 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
#endif /* CURL_SUPPORT_MAC_10_8 */
}
#else
+ if(conn->ssl_config.version_max != CURL_SSLVERSION_MAX_NONE) {
+ failf(data, "Your version of the OS does not support to set maximum"
+ " SSL/TLS version");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
(void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocolAll, false);
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
@@ -1269,7 +1410,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
else
err = CopyIdentityWithLabel(ssl_cert, &cert_and_key);
- if(err == noErr) {
+ if(err == noErr && cert_and_key) {
SecCertificateRef cert = NULL;
CFTypeRef certs_c[1];
CFArrayRef certs;
@@ -1385,18 +1526,13 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
}
#endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */
- if(ssl_cafile) {
+ if(ssl_cafile && verifypeer) {
bool is_cert_file = is_file(ssl_cafile);
if(!is_cert_file) {
failf(data, "SSL: can't load CA certificate file %s", ssl_cafile);
return CURLE_SSL_CACERT_BADFILE;
}
- if(!verifypeer) {
- failf(data, "SSL: CA certificate set, but certificate verification "
- "is disabled");
- return CURLE_SSL_CONNECT_ERROR;
- }
}
/* Configure hostname check. SNI is used if available.
@@ -1420,6 +1556,9 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
"the OS.\n");
}
}
+ else {
+ infof(data, "WARNING: disabling hostname validation also disables SNI.\n");
+ }
/* Disable cipher suites that ST supports but are not safe. These ciphers
are unlikely to be used in any case since ST gives other ciphers a much
@@ -1541,7 +1680,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */
/* Check if there's a cached ID we can/should use here! */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
char *ssl_sessionid;
size_t ssl_sessionid_len;
@@ -1893,6 +2032,113 @@ static int verify_cert(const char *cafile, struct Curl_easy *data,
}
}
+#ifdef DARWIN_SSL_PINNEDPUBKEY
+static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
+ SSLContextRef ctx,
+ const char *pinnedpubkey)
+{ /* Scratch */
+ size_t pubkeylen, realpubkeylen, spkiHeaderLength = 24;
+ unsigned char *pubkey = NULL, *realpubkey = NULL;
+ const unsigned char *spkiHeader = NULL;
+ CFDataRef publicKeyBits = NULL;
+
+ /* Result is returned to caller */
+ CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
+
+ /* if a path wasn't specified, don't pin */
+ if(!pinnedpubkey)
+ return CURLE_OK;
+
+
+ if(!ctx)
+ return result;
+
+ do {
+ SecTrustRef trust;
+ OSStatus ret = SSLCopyPeerTrust(ctx, &trust);
+ if(ret != noErr || trust == NULL)
+ break;
+
+ SecKeyRef keyRef = SecTrustCopyPublicKey(trust);
+ CFRelease(trust);
+ if(keyRef == NULL)
+ break;
+
+#ifdef DARWIN_SSL_PINNEDPUBKEY_V1
+
+ publicKeyBits = SecKeyCopyExternalRepresentation(keyRef, NULL);
+ CFRelease(keyRef);
+ if(publicKeyBits == NULL)
+ break;
+
+#elif DARWIN_SSL_PINNEDPUBKEY_V2
+
+ OSStatus success = SecItemExport(keyRef, kSecFormatOpenSSL, 0, NULL,
+ &publicKeyBits);
+ CFRelease(keyRef);
+ if(success != errSecSuccess || publicKeyBits == NULL)
+ break;
+
+#endif /* DARWIN_SSL_PINNEDPUBKEY_V2 */
+
+ pubkeylen = CFDataGetLength(publicKeyBits);
+ pubkey = (unsigned char *)CFDataGetBytePtr(publicKeyBits);
+
+ switch(pubkeylen) {
+ case 526:
+ /* 4096 bit RSA pubkeylen == 526 */
+ spkiHeader = rsa4096SpkiHeader;
+ break;
+ case 270:
+ /* 2048 bit RSA pubkeylen == 270 */
+ spkiHeader = rsa2048SpkiHeader;
+ break;
+#ifdef DARWIN_SSL_PINNEDPUBKEY_V1
+ case 65:
+ /* ecDSA secp256r1 pubkeylen == 65 */
+ spkiHeader = ecDsaSecp256r1SpkiHeader;
+ spkiHeaderLength = 26;
+ break;
+ case 97:
+ /* ecDSA secp384r1 pubkeylen == 97 */
+ spkiHeader = ecDsaSecp384r1SpkiHeader;
+ spkiHeaderLength = 23;
+ break;
+ default:
+ infof(data, "SSL: unhandled public key length: %d\n", pubkeylen);
+#elif DARWIN_SSL_PINNEDPUBKEY_V2
+ default:
+ /* ecDSA secp256r1 pubkeylen == 91 header already included?
+ * ecDSA secp384r1 header already included too
+ * we assume rest of algorithms do same, so do nothing
+ */
+ result = Curl_pin_peer_pubkey(data, pinnedpubkey, pubkey,
+ pubkeylen);
+#endif /* DARWIN_SSL_PINNEDPUBKEY_V2 */
+ continue; /* break from loop */
+ }
+
+ realpubkeylen = pubkeylen + spkiHeaderLength;
+ realpubkey = malloc(realpubkeylen);
+ if(!realpubkey)
+ break;
+
+ memcpy(realpubkey, spkiHeader, spkiHeaderLength);
+ memcpy(realpubkey + spkiHeaderLength, pubkey, pubkeylen);
+
+ result = Curl_pin_peer_pubkey(data, pinnedpubkey, realpubkey,
+ realpubkeylen);
+
+ } while(0);
+
+ Curl_safefree(realpubkey);
+ if(publicKeyBits != NULL)
+ CFRelease(publicKeyBits);
+
+ return result;
+}
+#endif /* DARWIN_SSL_PINNEDPUBKEY */
+
static CURLcode
darwinssl_connect_step2(struct connectdata *conn, int sockindex)
{
@@ -1921,7 +2167,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
/* The below is errSSLServerAuthCompleted; it's not defined in
Leopard's headers */
case -9841:
- if(SSL_CONN_CONFIG(CAfile)) {
+ if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
int res = verify_cert(SSL_CONN_CONFIG(CAfile), data,
connssl->ssl_ctx);
if(res != CURLE_OK)
@@ -1999,6 +2245,17 @@ 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
+ if(data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]) {
+ CURLcode result = pkp_pin_peer_pubkey(data, connssl->ssl_ctx,
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]);
+ if(result) {
+ failf(data, "SSL: public key does not match pinned public key!");
+ return result;
+ }
+ }
+#endif /* DARWIN_SSL_PINNEDPUBKEY */
+
/* Informational message */
(void)SSLGetNegotiatedCipher(connssl->ssl_ctx, &cipher);
(void)SSLGetNegotiatedProtocolVersion(connssl->ssl_ctx, &protocol);
@@ -2034,9 +2291,11 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
}
}
-static CURLcode
-darwinssl_connect_step3(struct connectdata *conn,
- int sockindex)
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+/* This should be called during step3 of the connection at the earliest */
+static void
+show_verbose_server_cert(struct connectdata *conn,
+ int sockindex)
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -2048,9 +2307,9 @@ darwinssl_connect_step3(struct connectdata *conn,
CFIndex i, count;
SecTrustRef trust = NULL;
- /* There is no step 3!
- * Well, okay, if verbose mode is on, let's print the details of the
- * server certificates. */
+ if(!connssl->ssl_ctx)
+ return;
+
#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
#if CURL_BUILD_IOS
#pragma unused(server_certs)
@@ -2147,6 +2406,23 @@ darwinssl_connect_step3(struct connectdata *conn,
CFRelease(server_certs);
}
#endif /* CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS */
+}
+#endif /* !CURL_DISABLE_VERBOSE_STRINGS */
+
+static CURLcode
+darwinssl_connect_step3(struct connectdata *conn,
+ int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+
+ /* There is no step 3!
+ * Well, okay, if verbose mode is on, let's print the details of the
+ * server certificates. */
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ if(data->set.verbose)
+ show_verbose_server_cert(conn, sockindex);
+#endif
connssl->connecting_state = ssl_connect_done;
return CURLE_OK;
@@ -2424,8 +2700,8 @@ bool Curl_darwinssl_data_pending(const struct connectdata *conn,
return false;
}
-int Curl_darwinssl_random(unsigned char *entropy,
- size_t length)
+CURLcode Curl_darwinssl_random(unsigned char *entropy,
+ size_t length)
{
/* arc4random_buf() isn't available on cats older than Lion, so let's
do this manually for the benefit of the older cats. */
@@ -2439,7 +2715,7 @@ int Curl_darwinssl_random(unsigned char *entropy,
random_number >>= 8;
}
i = random_number = 0;
- return 0;
+ return CURLE_OK;
}
void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
@@ -2451,6 +2727,15 @@ void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
(void)CC_MD5(tmp, (CC_LONG)tmplen, md5sum);
}
+void Curl_darwinssl_sha256sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum, /* output */
+ size_t sha256len)
+{
+ assert(sha256len >= SHA256_DIGEST_LENGTH);
+ (void)CC_SHA256(tmp, (CC_LONG)tmplen, sha256sum);
+}
+
bool Curl_darwinssl_false_start(void)
{
#if CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7
@@ -2566,4 +2851,8 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
return (ssize_t)processed;
}
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
#endif /* USE_DARWINSSL */
diff --git a/lib/vtls/darwinssl.h b/lib/vtls/darwinssl.h
index 8b185b67..13e78515 100644
--- a/lib/vtls/darwinssl.h
+++ b/lib/vtls/darwinssl.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012 - 2014, Nick Zitzmann, <nickzman@gmail.com>.
- * Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -42,17 +42,40 @@ int Curl_darwinssl_check_cxn(struct connectdata *conn);
bool Curl_darwinssl_data_pending(const struct connectdata *conn,
int connindex);
-int Curl_darwinssl_random(unsigned char *entropy,
- size_t length);
+CURLcode Curl_darwinssl_random(unsigned char *entropy,
+ size_t length);
void Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
size_t tmplen,
unsigned char *md5sum, /* output */
size_t md5len);
+void Curl_darwinssl_sha256sum(unsigned char *tmp, /* input */
+ size_t tmplen,
+ unsigned char *sha256sum, /* output */
+ size_t sha256len);
bool Curl_darwinssl_false_start(void);
/* Set the API backend definition to SecureTransport */
#define CURL_SSL_BACKEND CURLSSLBACKEND_DARWINSSL
+/* pinned public key support tests */
+
+/* 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
+#endif
+
+/* version 2 supports MacOSX 10.7+ */
+#if (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
+#define DARWIN_SSL_PINNEDPUBKEY_V2 1
+#endif
+
+#if defined(DARWIN_SSL_PINNEDPUBKEY_V1) || defined(DARWIN_SSL_PINNEDPUBKEY_V2)
+/* this backend supports CURLOPT_PINNEDPUBLICKEY */
+#define DARWIN_SSL_PINNEDPUBKEY 1
+#define have_curlssl_pinnedpubkey 1
+#endif /* DARWIN_SSL_PINNEDPUBKEY */
+
/* API setup for SecureTransport */
#define curlssl_init() (1)
#define curlssl_cleanup() Curl_nop_stmt
@@ -70,6 +93,8 @@ bool Curl_darwinssl_false_start(void);
#define curlssl_data_pending(x,y) Curl_darwinssl_data_pending(x, y)
#define curlssl_random(x,y,z) ((void)x, Curl_darwinssl_random(y,z))
#define curlssl_md5sum(a,b,c,d) Curl_darwinssl_md5sum(a,b,c,d)
+#define curlssl_sha256sum(a,b,c,d) \
+ Curl_darwinssl_sha256sum((unsigned char *)a, b, c, d)
#define curlssl_false_start() Curl_darwinssl_false_start()
#endif /* USE_DARWINSSL */
diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c
index a0d462b7..bf75bddc 100644
--- a/lib/vtls/gskit.c
+++ b/lib/vtls/gskit.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -320,7 +320,7 @@ static CURLcode set_ciphers(struct connectdata *conn,
/* We allocate GSKit buffers of the same size as the input string: since
GSKit tokens are always shorter than their cipher names, allocated buffers
- will always be large enough to accomodate the result. */
+ will always be large enough to accommodate the result. */
l = strlen(cipherlist) + 1;
memset((char *) ciphers, 0, sizeof ciphers);
for(i = 0; i < CURL_GSKPROTO_LAST; i++) {
@@ -748,6 +748,40 @@ static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf,
return (ssize_t) nread;
}
+static CURLcode
+set_ssl_version_min_max(unsigned int *protoflags, struct connectdata *conn)
+{
+ struct Curl_easy *data = conn->data;
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ long i = ssl_version;
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_TLSv1_2;
+ break;
+ }
+ for(; i <= (ssl_version_max >> 16); ++i) {
+ switch(i) {
+ case CURL_SSLVERSION_TLSv1_0:
+ *protoflags |= CURL_GSKPROTO_TLSV10_MASK;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ *protoflags |= CURL_GSKPROTO_TLSV11_MASK;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ *protoflags |= CURL_GSKPROTO_TLSV11_MASK;
+ break;
+ case CURL_SSLVERSION_TLSv1_3:
+ failf(data, "GSKit: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ }
+
+ return CURLE_OK;
+}
static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
{
@@ -764,7 +798,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
conn->host.name;
const char *sni;
- unsigned int protoflags;
+ unsigned int protoflags = 0;
long timeout;
Qso_OverlappedIO_t commarea;
int sockpair[2];
@@ -849,17 +883,13 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK;
break;
case CURL_SSLVERSION_TLSv1_0:
- protoflags = CURL_GSKPROTO_TLSV10_MASK;
- break;
case CURL_SSLVERSION_TLSv1_1:
- protoflags = CURL_GSKPROTO_TLSV11_MASK;
- break;
case CURL_SSLVERSION_TLSv1_2:
- protoflags = CURL_GSKPROTO_TLSV12_MASK;
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "GSKit: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ result = set_ssl_version_min_max(&protoflags, conn);
+ if(result != CURLE_OK)
+ return result;
+ break;
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
return CURLE_SSL_CONNECT_ERROR;
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index 0e308cb7..d55f995e 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -60,15 +60,13 @@
/* The last #include file should be: */
#include "memdebug.h"
-/*
- Some hackish cast macros based on:
- https://developer.gnome.org/glib/unstable/glib-Type-Conversion-Macros.html
-*/
-#ifndef GNUTLS_POINTER_TO_INT_CAST
-#define GNUTLS_POINTER_TO_INT_CAST(p) ((int) (long) (p))
+#ifndef GNUTLS_POINTER_TO_SOCKET_CAST
+#define GNUTLS_POINTER_TO_SOCKET_CAST(p) \
+ ((curl_socket_t) ((char *)(p) - (char *)NULL))
#endif
-#ifndef GNUTLS_INT_TO_POINTER_CAST
-#define GNUTLS_INT_TO_POINTER_CAST(i) ((void *) (long) (i))
+#ifndef GNUTLS_SOCKET_TO_POINTER_CAST
+#define GNUTLS_SOCKET_TO_POINTER_CAST(s) \
+ ((void *) ((char *)NULL + (s)))
#endif
/* Enable GnuTLS debugging by defining GTLSDEBUG */
@@ -92,11 +90,11 @@ static bool gtls_inited = FALSE;
# define GNUTLS_MAPS_WINSOCK_ERRORS 1
# endif
-# if (GNUTLS_VERSION_NUMBER >= 0x030200)
+# if HAVE_GNUTLS_ALPN_SET_PROTOCOLS
# define HAS_ALPN
# endif
-# if (GNUTLS_VERSION_NUMBER >= 0x03020d)
+# if HAVE_GNUTLS_OCSP_REQ_INIT
# define HAS_OCSP
# endif
@@ -153,7 +151,7 @@ static int gtls_mapped_sockerrno(void)
static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
{
- ssize_t ret = swrite(GNUTLS_POINTER_TO_INT_CAST(s), buf, len);
+ ssize_t ret = swrite(GNUTLS_POINTER_TO_SOCKET_CAST(s), buf, len);
#if defined(USE_WINSOCK) && !defined(GNUTLS_MAPS_WINSOCK_ERRORS)
if(ret < 0)
gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
@@ -163,7 +161,7 @@ static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
static ssize_t Curl_gtls_pull(void *s, void *buf, size_t len)
{
- ssize_t ret = sread(GNUTLS_POINTER_TO_INT_CAST(s), buf, len);
+ ssize_t ret = sread(GNUTLS_POINTER_TO_SOCKET_CAST(s), buf, len);
#if defined(USE_WINSOCK) && !defined(GNUTLS_MAPS_WINSOCK_ERRORS)
if(ret < 0)
gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
@@ -211,18 +209,20 @@ int Curl_gtls_cleanup(void)
return 1;
}
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
static void showtime(struct Curl_easy *data,
const char *text,
time_t stamp)
{
struct tm buffer;
const struct tm *tm = &buffer;
+ char str[96];
CURLcode result = Curl_gmtime(stamp, &buffer);
if(result)
return;
- snprintf(data->state.buffer,
- BUFSIZE,
+ 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],
@@ -232,8 +232,9 @@ static void showtime(struct Curl_easy *data,
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
- infof(data, "%s\n", data->state.buffer);
+ infof(data, "%s\n", str);
}
+#endif
static gnutls_datum_t load_file(const char *file)
{
@@ -278,7 +279,7 @@ static CURLcode handshake(struct connectdata *conn,
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
gnutls_session_t session = conn->ssl[sockindex].session;
curl_socket_t sockfd = conn->sock[sockindex];
- long timeout_ms;
+ time_t timeout_ms;
int rc;
int what;
@@ -314,7 +315,7 @@ static CURLcode handshake(struct connectdata *conn,
return CURLE_OK;
else if(timeout_ms) {
/* timeout */
- failf(data, "SSL connection timeout at %ld", timeout_ms);
+ failf(data, "SSL connection timeout at %ld", (long)timeout_ms);
return CURLE_OPERATION_TIMEDOUT;
}
}
@@ -375,11 +376,106 @@ static gnutls_x509_crt_fmt_t do_file_type(const char *type)
return -1;
}
+#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT
+static CURLcode
+set_ssl_version_min_max(int *list, size_t list_size, struct connectdata *conn)
+{
+ struct Curl_easy *data = conn->data;
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ long i = ssl_version;
+ long protocol_priority_idx = 0;
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version << 16;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ for(; i <= (ssl_version_max >> 16) &&
+ protocol_priority_idx < list_size; ++i) {
+ switch(i) {
+ case CURL_SSLVERSION_TLSv1_0:
+ protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_0;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_1;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_2;
+ break;
+ case CURL_SSLVERSION_TLSv1_3:
+ failf(data, "GnuTLS: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ }
+ return CURLE_OK;
+}
+#else
+#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
+/* If GnuTLS was compiled without support for SRP it will error out if SRP is
+ requested in the priority string, so treat it specially
+ */
+#define GNUTLS_SRP "+SRP"
+
+static CURLcode
+set_ssl_version_min_max(const char **prioritylist, struct connectdata *conn)
+{
+ struct Curl_easy *data = conn->data;
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ if(ssl_version == CURL_SSLVERSION_TLSv1_3 ||
+ ssl_version_max == CURL_SSLVERSION_MAX_TLSv1_3) {
+ failf(data, "GnuTLS: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ if(ssl_version_max == CURL_SSLVERSION_MAX_NONE) {
+ ssl_version_max = ssl_version << 16;
+ }
+ switch(ssl_version | ssl_version_max) {
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_0:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:" GNUTLS_SRP;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_1:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:+VERS-TLS1.1:" GNUTLS_SRP;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_2:
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2:" GNUTLS_SRP;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_1:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.1:" GNUTLS_SRP;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_2:
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.1:+VERS-TLS1.2:" GNUTLS_SRP;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_TLSv1_2:
+ case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.2:" GNUTLS_SRP;
+ return CURLE_OK;
+ }
+
+ failf(data, "GnuTLS: cannot set ssl protocol");
+ return CURLE_SSL_CONNECT_ERROR;
+}
+#endif
+
static CURLcode
gtls_connect_step1(struct connectdata *conn,
int sockindex)
{
struct Curl_easy *data = conn->data;
+ unsigned int init_flags;
gnutls_session_t session;
int rc;
bool sni = TRUE; /* default is SNI enabled */
@@ -405,13 +501,8 @@ gtls_connect_step1(struct connectdata *conn,
GNUTLS_CIPHER_3DES_CBC,
};
static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
- static int protocol_priority[] = { 0, 0, 0, 0 };
+ int protocol_priority[] = { 0, 0, 0, 0 };
#else
-#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
-/* If GnuTLS was compiled without support for SRP it will error out if SRP is
- requested in the priority string, so treat it specially
- */
-#define GNUTLS_SRP "+SRP"
const char *prioritylist;
const char *err = NULL;
#endif
@@ -526,7 +617,14 @@ gtls_connect_step1(struct connectdata *conn,
}
/* Initialize TLS session as a client */
- rc = gnutls_init(&conn->ssl[sockindex].session, GNUTLS_CLIENT);
+ init_flags = GNUTLS_CLIENT;
+
+#if defined(GNUTLS_NO_TICKETS)
+ /* Disable TLS session tickets */
+ init_flags |= GNUTLS_NO_TICKETS;
+#endif
+
+ rc = gnutls_init(&conn->ssl[sockindex].session, init_flags);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_init() failed: %d", rc);
return CURLE_SSL_CONNECT_ERROR;
@@ -568,7 +666,7 @@ gtls_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
- switch(SSL_CONN_CONFIG(version) {
+ switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_SSLv3:
protocol_priority[0] = GNUTLS_SSL3;
break;
@@ -579,17 +677,16 @@ gtls_connect_step1(struct connectdata *conn,
protocol_priority[2] = GNUTLS_TLS1_2;
break;
case CURL_SSLVERSION_TLSv1_0:
- protocol_priority[0] = GNUTLS_TLS1_0;
- break;
case CURL_SSLVERSION_TLSv1_1:
- protocol_priority[0] = GNUTLS_TLS1_1;
- break;
case CURL_SSLVERSION_TLSv1_2:
- protocol_priority[0] = GNUTLS_TLS1_2;
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "GnuTLS: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(protocol_priority,
+ sizeof(protocol_priority)/sizeof(protocol_priority[0]), conn);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv2:
failf(data, "GnuTLS does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
@@ -617,20 +714,15 @@ gtls_connect_step1(struct connectdata *conn,
prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:" GNUTLS_SRP;
break;
case CURL_SSLVERSION_TLSv1_0:
- prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.0:" GNUTLS_SRP;
- break;
case CURL_SSLVERSION_TLSv1_1:
- prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.1:" GNUTLS_SRP;
- break;
case CURL_SSLVERSION_TLSv1_2:
- prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.2:" GNUTLS_SRP;
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "GnuTLS: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(&prioritylist, conn);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv2:
failf(data, "GnuTLS does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
@@ -669,7 +761,8 @@ gtls_connect_step1(struct connectdata *conn,
gnutls_datum_t protocols[2];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
+ (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
protocols[cur].data = (unsigned char *)NGHTTP2_PROTO_VERSION_ID;
protocols[cur].size = NGHTTP2_PROTO_VERSION_ID_LEN;
cur++;
@@ -755,7 +848,7 @@ gtls_connect_step1(struct connectdata *conn,
}
else {
/* file descriptor for the socket */
- transport_ptr = GNUTLS_INT_TO_POINTER_CAST(conn->sock[sockindex]);
+ transport_ptr = GNUTLS_SOCKET_TO_POINTER_CAST(conn->sock[sockindex]);
gnutls_transport_push = Curl_gtls_push;
gnutls_transport_pull = Curl_gtls_pull;
}
@@ -782,7 +875,7 @@ gtls_connect_step1(struct connectdata *conn,
/* This might be a reconnect, so we check for a session ID in the cache
to speed up things */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
void *ssl_sessionid;
size_t ssl_idsize;
@@ -871,8 +964,6 @@ gtls_connect_step3(struct connectdata *conn,
gnutls_datum_t issuerp;
char certbuf[256] = ""; /* big enough? */
size_t size;
- unsigned int algo;
- unsigned int bits;
time_t certclock;
const char *ptr;
struct Curl_easy *data = conn->data;
@@ -882,7 +973,11 @@ gtls_connect_step3(struct connectdata *conn,
gnutls_datum_t proto;
#endif
CURLcode result = CURLE_OK;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ unsigned int algo;
+ unsigned int bits;
gnutls_protocol_t version = gnutls_protocol_get_version(session);
+#endif
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
@@ -1251,6 +1346,7 @@ gtls_connect_step3(struct connectdata *conn,
*/
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
/* public key algorithm's parameters */
algo = gnutls_x509_crt_get_pk_algorithm(x509_cert, &bits);
infof(data, "\t certificate public key: %s\n",
@@ -1275,12 +1371,13 @@ gtls_connect_step3(struct connectdata *conn,
gnutls_x509_crt_get_issuer_dn(x509_cert, certbuf, &size);
infof(data, "\t issuer: %s\n", certbuf);
- gnutls_x509_crt_deinit(x509_cert);
-
/* 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);
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
@@ -1311,7 +1408,7 @@ gtls_connect_step3(struct connectdata *conn,
conn->recv[sockindex] = gtls_recv;
conn->send[sockindex] = gtls_send;
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
/* we always unconditionally get the session id here, as even if we
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
@@ -1625,19 +1722,21 @@ static int Curl_gtls_seed(struct Curl_easy *data)
#endif
/* data might be NULL! */
-int Curl_gtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+CURLcode Curl_gtls_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length)
{
#if defined(USE_GNUTLS_NETTLE)
+ int rc;
(void)data;
- gnutls_rnd(GNUTLS_RND_RANDOM, entropy, length);
+ rc = gnutls_rnd(GNUTLS_RND_RANDOM, entropy, length);
+ return rc?CURLE_FAILED_INIT:CURLE_OK;
#elif defined(USE_GNUTLS)
if(data)
Curl_gtls_seed(data); /* Initiate the seed if not already done */
gcry_randomize(entropy, length, GCRY_STRONG_RANDOM);
#endif
- return 0;
+ return CURLE_OK;
}
void Curl_gtls_md5sum(unsigned char *tmp, /* input */
diff --git a/lib/vtls/gtls.h b/lib/vtls/gtls.h
index 65312017..462c0485 100644
--- a/lib/vtls/gtls.h
+++ b/lib/vtls/gtls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -43,9 +43,9 @@ void Curl_gtls_close(struct connectdata *conn, int sockindex);
void Curl_gtls_session_free(void *ptr);
size_t Curl_gtls_version(char *buffer, size_t size);
int Curl_gtls_shutdown(struct connectdata *conn, int sockindex);
-int Curl_gtls_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
+CURLcode Curl_gtls_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length);
void Curl_gtls_md5sum(unsigned char *tmp, /* input */
size_t tmplen,
unsigned char *md5sum, /* output */
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index 8bcaddd2..037babe3 100644
--- a/lib/vtls/mbedtls.c
+++ b/lib/vtls/mbedtls.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -67,7 +67,7 @@
#endif
#if defined(THREADING_SUPPORT)
-static mbedtls_entropy_context entropy;
+static mbedtls_entropy_context ts_entropy;
static int entropy_init_initialized = 0;
@@ -131,7 +131,7 @@ static void mbed_debug(void *context, int level, const char *f_name,
/*
* profile
*/
-const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_fr =
+static const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_fr =
{
/* Hashes from SHA-1 and above */
MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) |
@@ -157,6 +157,71 @@ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_fr =
static Curl_recv mbed_recv;
static Curl_send mbed_send;
+static CURLcode mbedtls_version_from_curl(int *mbedver, long version)
+{
+ switch(version) {
+ case CURL_SSLVERSION_TLSv1_0:
+ *mbedver = MBEDTLS_SSL_MINOR_VERSION_1;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1:
+ *mbedver = MBEDTLS_SSL_MINOR_VERSION_2;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2:
+ *mbedver = MBEDTLS_SSL_MINOR_VERSION_3;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_3:
+ break;
+ }
+ return CURLE_SSL_CONNECT_ERROR;
+}
+
+static CURLcode
+set_ssl_version_min_max(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ int mbedtls_ver_min = MBEDTLS_SSL_MINOR_VERSION_1;
+ int mbedtls_ver_max = MBEDTLS_SSL_MINOR_VERSION_1;
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ CURLcode result = CURLE_OK;
+
+ switch(ssl_version) {
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ ssl_version = CURL_SSLVERSION_TLSv1_0;
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version << 16;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ result = mbedtls_version_from_curl(&mbedtls_ver_min, ssl_version);
+ if(result) {
+ failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+ result = mbedtls_version_from_curl(&mbedtls_ver_max, ssl_version_max >> 16);
+ if(result) {
+ failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+
+ mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ver_min);
+ mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ver_max);
+
+ return result;
+}
+
static CURLcode
mbed_connect_step1(struct connectdata *conn,
int sockindex)
@@ -182,11 +247,11 @@ mbed_connect_step1(struct connectdata *conn,
}
#ifdef THREADING_SUPPORT
- entropy_init_mutex(&entropy);
+ entropy_init_mutex(&ts_entropy);
mbedtls_ctr_drbg_init(&connssl->ctr_drbg);
ret = mbedtls_ctr_drbg_seed(&connssl->ctr_drbg, entropy_func_mutex,
- &entropy, NULL, 0);
+ &ts_entropy, NULL, 0);
if(ret) {
#ifdef MBEDTLS_ERROR_C
mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
@@ -333,29 +398,15 @@ mbed_connect_step1(struct connectdata *conn,
infof(data, "mbedTLS: Set SSL version to SSLv3\n");
break;
case CURL_SSLVERSION_TLSv1_0:
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_1);
- mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_1);
- infof(data, "mbedTLS: Set SSL version to TLS 1.0\n");
- break;
case CURL_SSLVERSION_TLSv1_1:
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_2);
- mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_2);
- infof(data, "mbedTLS: Set SSL version to TLS 1.1\n");
- break;
case CURL_SSLVERSION_TLSv1_2:
- mbedtls_ssl_conf_min_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_3);
- mbedtls_ssl_conf_max_version(&connssl->config, MBEDTLS_SSL_MAJOR_VERSION_3,
- MBEDTLS_SSL_MINOR_VERSION_3);
- infof(data, "mbedTLS: Set SSL version to TLS 1.2\n");
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "mbedTLS: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
return CURLE_SSL_CONNECT_ERROR;
@@ -373,8 +424,18 @@ mbed_connect_step1(struct connectdata *conn,
mbedtls_ssl_conf_ciphersuites(&connssl->config,
mbedtls_ssl_list_ciphersuites());
+#if defined(MBEDTLS_SSL_RENEGOTIATION)
+ mbedtls_ssl_conf_renegotiation(&connssl->config,
+ MBEDTLS_SSL_RENEGOTIATION_ENABLED);
+#endif
+
+#if defined(MBEDTLS_SSL_SESSION_TICKETS)
+ mbedtls_ssl_conf_session_tickets(&connssl->config,
+ MBEDTLS_SSL_SESSION_TICKETS_DISABLED);
+#endif
+
/* Check if there's a cached ID we can/should use here! */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
void *old_session = NULL;
Curl_ssl_sessionid_lock(conn);
@@ -439,6 +500,16 @@ mbed_connect_step1(struct connectdata *conn,
mbedtls_debug_set_threshold(4);
#endif
+ /* give application a chance to interfere with mbedTLS set up. */
+ if(data->set.ssl.fsslctx) {
+ ret = (*data->set.ssl.fsslctx)(data, &connssl->config,
+ data->set.ssl.fsslctxp);
+ if(ret) {
+ failf(data, "error signaled by ssl ctx callback");
+ return ret;
+ }
+ }
+
connssl->connecting_state = ssl_connect_2;
return CURLE_OK;
@@ -618,7 +689,7 @@ mbed_connect_step3(struct connectdata *conn,
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
int ret;
mbedtls_ssl_session *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
@@ -631,6 +702,7 @@ mbed_connect_step3(struct connectdata *conn,
ret = mbedtls_ssl_get_session(&connssl->ssl, our_ssl_sessionid);
if(ret) {
+ free(our_ssl_sessionid);
failf(data, "mbedtls_ssl_get_session returned -0x%x", -ret);
return CURLE_SSL_CONNECT_ERROR;
}
@@ -729,6 +801,55 @@ size_t Curl_mbedtls_version(char *buffer, size_t size)
(version>>16)&0xff, (version>>8)&0xff);
}
+CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
+ size_t length)
+{
+#if defined(MBEDTLS_CTR_DRBG_C)
+ int ret = -1;
+ char errorbuf[128];
+ mbedtls_entropy_context ctr_entropy;
+ mbedtls_ctr_drbg_context ctr_drbg;
+ mbedtls_entropy_init(&ctr_entropy);
+ mbedtls_ctr_drbg_init(&ctr_drbg);
+ errorbuf[0]=0;
+
+ ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
+ &ctr_entropy, NULL, 0);
+
+ if(ret) {
+#ifdef MBEDTLS_ERROR_C
+ mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
+#endif /* MBEDTLS_ERROR_C */
+ failf(data, "Failed - mbedTLS: ctr_drbg_seed returned (-0x%04X) %s\n",
+ -ret, errorbuf);
+ }
+ else {
+ ret = mbedtls_ctr_drbg_random(&ctr_drbg, entropy, length);
+
+ if(ret) {
+#ifdef MBEDTLS_ERROR_C
+ mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
+#endif /* MBEDTLS_ERROR_C */
+ failf(data, "mbedTLS: ctr_drbg_init returned (-0x%04X) %s\n",
+ -ret, errorbuf);
+ }
+ }
+
+ mbedtls_ctr_drbg_free(&ctr_drbg);
+ mbedtls_entropy_free(&ctr_entropy);
+
+ return ret == 0 ? CURLE_OK : CURLE_FAILED_INIT;
+#elif defined(MBEDTLS_HAVEGE_C)
+ mbedtls_havege_state hs;
+ mbedtls_havege_init(&hs);
+ mbedtls_havege_random(&hs, entropy, length);
+ mbedtls_havege_free(&hs);
+ return CURLE_OK;
+#else
+ return CURLE_NOT_BUILT_IN;
+#endif
+}
+
static CURLcode
mbed_connect_common(struct connectdata *conn,
int sockindex,
@@ -883,9 +1004,7 @@ void Curl_mbedtls_cleanup(void)
int Curl_mbedtls_data_pending(const struct connectdata *conn, int sockindex)
{
- mbedtls_ssl_context *ssl =
- (mbedtls_ssl_context *)&conn->ssl[sockindex].ssl;
- return ssl->in_msglen != 0;
+ return mbedtls_ssl_get_bytes_avail(&conn->ssl[sockindex].ssl) != 0;
}
#endif /* USE_MBEDTLS */
diff --git a/lib/vtls/mbedtls.h b/lib/vtls/mbedtls.h
index 1021d546..71d17a49 100644
--- a/lib/vtls/mbedtls.h
+++ b/lib/vtls/mbedtls.h
@@ -50,9 +50,15 @@ void Curl_mbedtls_session_free(void *ptr);
size_t Curl_mbedtls_version(char *buffer, size_t size);
int Curl_mbedtls_shutdown(struct connectdata *conn, int sockindex);
+CURLcode Curl_mbedtls_random(struct Curl_easy *data, unsigned char *entropy,
+ size_t length);
+
/* this backends supports CURLOPT_PINNEDPUBLICKEY */
#define have_curlssl_pinnedpubkey 1
+/* this backend supports CURLOPT_SSL_CTX_* */
+#define have_curlssl_ssl_ctx 1
+
/* API setup for mbedTLS */
#define curlssl_init() Curl_mbedtls_init()
#define curlssl_cleanup() Curl_mbedtls_cleanup()
@@ -70,11 +76,7 @@ int Curl_mbedtls_shutdown(struct connectdata *conn, int sockindex);
#define curlssl_data_pending(x,y) Curl_mbedtls_data_pending(x, y)
#define CURL_SSL_BACKEND CURLSSLBACKEND_MBEDTLS
#define curlssl_sha256sum(a,b,c,d) mbedtls_sha256(a,b,c,0)
-
-/* This might cause libcurl to use a weeker random!
- TODO: implement proper use of Polarssl's CTR-DRBG or HMAC-DRBG and use that
-*/
-#define curlssl_random(x,y,z) (x=x, y=y, z=z, CURLE_NOT_BUILT_IN)
+#define curlssl_random(x,y,z) Curl_mbedtls_random(x, y, z)
#endif /* USE_MBEDTLS */
#endif /* HEADER_CURL_MBEDTLS_H */
diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index ba8d5826..d1711d6a 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -56,7 +56,8 @@
#include <base64.h>
#include <cert.h>
#include <prerror.h>
-#include <keyhi.h> /* for SECKEY_DestroyPublicKey() */
+#include <keyhi.h> /* for SECKEY_DestroyPublicKey() */
+#include <private/pprio.h> /* for PR_ImportTCPSocket */
#define NSSVERNUM ((NSS_VMAJOR<<16)|(NSS_VMINOR<<8)|NSS_VPATCH)
@@ -77,14 +78,20 @@
/* enough to fit the string "PEM Token #[0|1]" */
#define SLOTSIZE 13
-PRFileDesc *PR_ImportTCPSocket(PRInt32 osfd);
static PRLock *nss_initlock = NULL;
static PRLock *nss_crllock = NULL;
static PRLock *nss_findslot_lock = NULL;
-static struct curl_llist *nss_crl_list = NULL;
+static PRLock *nss_trustload_lock = NULL;
+static struct curl_llist nss_crl_list;
static NSSInitContext *nss_context = NULL;
static volatile int initialized = 0;
+/* type used to wrap pointers as list nodes */
+struct ptr_list_wrap {
+ void *ptr;
+ struct curl_llist_element node;
+};
+
typedef struct {
const char *name;
int num;
@@ -201,7 +208,10 @@ static const cipher_s cipherlist[] = {
};
static const char *pem_library = "libnsspem.so";
-static SECMODModule *mod = NULL;
+static SECMODModule *pem_module = NULL;
+
+static const char *trust_library = "libnssckbi.so";
+static SECMODModule *trust_module = NULL;
/* NSPR I/O layer we use to detect blocking direction during SSL handshake */
static PRDescIdentity nspr_io_identity = PR_INVALID_IO_LAYER;
@@ -365,12 +375,24 @@ static char *dup_nickname(struct Curl_easy *data, const char *str)
static PK11SlotInfo* nss_find_slot_by_name(const char *slot_name)
{
PK11SlotInfo *slot;
- PR_Lock(nss_initlock);
+ PR_Lock(nss_findslot_lock);
slot = PK11_FindSlotByName(slot_name);
- PR_Unlock(nss_initlock);
+ PR_Unlock(nss_findslot_lock);
return slot;
}
+/* wrap 'ptr' as list node and tail-insert into 'list' */
+static CURLcode insert_wrapped_ptr(struct curl_llist *list, void *ptr)
+{
+ struct ptr_list_wrap *wrap = malloc(sizeof *wrap);
+ if(!wrap)
+ return CURLE_OUT_OF_MEMORY;
+
+ wrap->ptr = ptr;
+ Curl_llist_insert_next(list, list->tail, wrap, &wrap->node);
+ return CURLE_OK;
+}
+
/* Call PK11_CreateGenericObject() with the given obj_class and filename. If
* the call succeeds, append the object handle to the list of objects so that
* the object can be destroyed in Curl_nss_close(). */
@@ -401,7 +423,7 @@ static CURLcode nss_create_object(struct ssl_connect_data *ssl,
PK11_SETATTRS(attrs, attr_cnt, CKA_CLASS, &obj_class, sizeof(obj_class));
PK11_SETATTRS(attrs, attr_cnt, CKA_TOKEN, &cktrue, sizeof(CK_BBOOL));
PK11_SETATTRS(attrs, attr_cnt, CKA_LABEL, (unsigned char *)filename,
- strlen(filename) + 1);
+ (CK_ULONG)strlen(filename) + 1);
if(CKO_CERTIFICATE == obj_class) {
CK_BBOOL *pval = (cacert) ? (&cktrue) : (&ckfalse);
@@ -413,7 +435,7 @@ static CURLcode nss_create_object(struct ssl_connect_data *ssl,
if(!obj)
return result;
- if(!Curl_llist_insert_next(ssl->obj_list, ssl->obj_list->tail, obj)) {
+ if(insert_wrapped_ptr(&ssl->obj_list, obj) != CURLE_OK) {
PK11_DestroyGenericObject(obj);
return CURLE_OUT_OF_MEMORY;
}
@@ -430,17 +452,21 @@ static CURLcode nss_create_object(struct ssl_connect_data *ssl,
* NSS objects in Curl_nss_close() */
static void nss_destroy_object(void *user, void *ptr)
{
- PK11GenericObject *obj = (PK11GenericObject *)ptr;
+ struct ptr_list_wrap *wrap = (struct ptr_list_wrap *) ptr;
+ PK11GenericObject *obj = (PK11GenericObject *) wrap->ptr;
(void) user;
PK11_DestroyGenericObject(obj);
+ free(wrap);
}
/* same as nss_destroy_object() but for CRL items */
static void nss_destroy_crl_item(void *user, void *ptr)
{
- SECItem *crl_der = (SECItem *)ptr;
+ struct ptr_list_wrap *wrap = (struct ptr_list_wrap *) ptr;
+ SECItem *crl_der = (SECItem *) wrap->ptr;
(void) user;
SECITEM_FreeItem(crl_der, PR_TRUE);
+ free(wrap);
}
static CURLcode nss_load_cert(struct ssl_connect_data *ssl,
@@ -496,7 +522,7 @@ static CURLcode nss_cache_crl(SECItem *crl_der)
PR_Lock(nss_crllock);
/* store the CRL item so that we can free it in Curl_nss_cleanup() */
- if(!Curl_llist_insert_next(nss_crl_list, nss_crl_list->tail, crl_der)) {
+ if(insert_wrapped_ptr(&nss_crl_list, crl_der) != CURLE_OK) {
SECITEM_FreeItem(crl_der, PR_TRUE);
PR_Unlock(nss_crllock);
return CURLE_OUT_OF_MEMORY;
@@ -581,7 +607,7 @@ fail:
static CURLcode nss_load_key(struct connectdata *conn, int sockindex,
char *key_file)
{
- PK11SlotInfo *slot;
+ PK11SlotInfo *slot, *tmp;
SECStatus status;
CURLcode result;
struct ssl_connect_data *ssl = conn->ssl;
@@ -600,7 +626,9 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex,
return CURLE_SSL_CERTPROBLEM;
/* This will force the token to be seen as re-inserted */
- SECMOD_WaitForAnyTokenEvent(mod, 0, 0);
+ tmp = SECMOD_WaitForAnyTokenEvent(pem_module, 0, 0);
+ if(tmp)
+ PK11_FreeSlot(tmp);
PK11_IsPresent(slot);
status = PK11_Authenticate(slot, PR_TRUE, SSL_SET_OPTION(key_passwd));
@@ -1178,6 +1206,50 @@ static PRStatus nspr_io_close(PRFileDesc *fd)
return close_fn(fd);
}
+/* load a PKCS #11 module */
+static CURLcode nss_load_module(SECMODModule **pmod, const char *library,
+ const char *name)
+{
+ char *config_string;
+ SECMODModule *module = *pmod;
+ if(module)
+ /* already loaded */
+ return CURLE_OK;
+
+ config_string = aprintf("library=%s name=%s", library, name);
+ if(!config_string)
+ return CURLE_OUT_OF_MEMORY;
+
+ module = SECMOD_LoadUserModule(config_string, NULL, PR_FALSE);
+ free(config_string);
+
+ if(module && module->loaded) {
+ /* loaded successfully */
+ *pmod = module;
+ return CURLE_OK;
+ }
+
+ if(module)
+ SECMOD_DestroyModule(module);
+ return CURLE_FAILED_INIT;
+}
+
+/* unload a PKCS #11 module */
+static void nss_unload_module(SECMODModule **pmod)
+{
+ SECMODModule *module = *pmod;
+ if(!module)
+ /* not loaded */
+ return;
+
+ if(SECMOD_UnloadUserModule(module) != SECSuccess)
+ /* unload failed */
+ return;
+
+ SECMOD_DestroyModule(module);
+ *pmod = NULL;
+}
+
/* data might be NULL */
static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
{
@@ -1227,9 +1299,7 @@ static CURLcode nss_init(struct Curl_easy *data)
return CURLE_OK;
/* list of all CRL items we need to destroy in Curl_nss_cleanup() */
- nss_crl_list = Curl_llist_alloc(nss_destroy_crl_item);
- if(!nss_crl_list)
- return CURLE_OUT_OF_MEMORY;
+ Curl_llist_init(&nss_crl_list, nss_destroy_crl_item);
/* First we check if $SSL_DIR points to a valid dir */
cert_dir = getenv("SSL_DIR");
@@ -1289,6 +1359,7 @@ int Curl_nss_init(void)
nss_initlock = PR_NewLock();
nss_crllock = PR_NewLock();
nss_findslot_lock = PR_NewLock();
+ nss_trustload_lock = PR_NewLock();
}
/* We will actually initialize NSS later */
@@ -1327,23 +1398,21 @@ void Curl_nss_cleanup(void)
* the certificates. */
SSL_ClearSessionCache();
- if(mod && SECSuccess == SECMOD_UnloadUserModule(mod)) {
- SECMOD_DestroyModule(mod);
- mod = NULL;
- }
+ nss_unload_module(&pem_module);
+ nss_unload_module(&trust_module);
NSS_ShutdownContext(nss_context);
nss_context = NULL;
}
/* destroy all CRL items */
- Curl_llist_destroy(nss_crl_list, NULL);
- nss_crl_list = NULL;
+ Curl_llist_destroy(&nss_crl_list, NULL);
PR_Unlock(nss_initlock);
PR_DestroyLock(nss_initlock);
PR_DestroyLock(nss_crllock);
PR_DestroyLock(nss_findslot_lock);
+ PR_DestroyLock(nss_trustload_lock);
nss_initlock = NULL;
initialized = 0;
@@ -1385,8 +1454,7 @@ static void nss_close(struct ssl_connect_data *connssl)
connssl->client_nickname = NULL;
/* destroy all NSS objects in order to avoid failure of NSS shutdown */
- Curl_llist_destroy(connssl->obj_list, NULL);
- connssl->obj_list = NULL;
+ Curl_llist_destroy(&connssl->obj_list, NULL);
connssl->obj_clicert = NULL;
if(connssl->handle) {
@@ -1466,12 +1534,44 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
struct Curl_easy *data = conn->data;
const char *cafile = SSL_CONN_CONFIG(CAfile);
const char *capath = SSL_CONN_CONFIG(CApath);
+ bool use_trust_module;
+ CURLcode result = CURLE_OK;
- if(cafile) {
- CURLcode result = nss_load_cert(&conn->ssl[sockindex], cafile, PR_TRUE);
- if(result)
- return result;
+ /* treat empty string as unset */
+ if(cafile && !cafile[0])
+ cafile = NULL;
+ if(capath && !capath[0])
+ capath = NULL;
+
+ infof(data, " CAfile: %s\n CApath: %s\n",
+ cafile ? cafile : "none",
+ capath ? capath : "none");
+
+ /* load libnssckbi.so if no other trust roots were specified */
+ use_trust_module = !cafile && !capath;
+
+ PR_Lock(nss_trustload_lock);
+ if(use_trust_module && !trust_module) {
+ /* libnssckbi.so needed but not yet loaded --> load it! */
+ result = nss_load_module(&trust_module, trust_library, "trust");
+ infof(data, "%s %s\n", (result) ? "failed to load" : "loaded",
+ trust_library);
+ if(result == CURLE_FAILED_INIT)
+ /* make the error non-fatal if we are not going to verify peer */
+ result = CURLE_SSL_CACERT_BADFILE;
+ }
+ else if(!use_trust_module && trust_module) {
+ /* libnssckbi.so not needed but already loaded --> unload it! */
+ infof(data, "unloading %s\n", trust_library);
+ nss_unload_module(&trust_module);
}
+ PR_Unlock(nss_trustload_lock);
+
+ if(cafile)
+ result = nss_load_cert(&conn->ssl[sockindex], cafile, PR_TRUE);
+
+ if(result)
+ return result;
if(capath) {
struct_stat st;
@@ -1505,85 +1605,111 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
infof(data, "warning: CURLOPT_CAPATH not a directory (%s)\n", capath);
}
- infof(data, " CAfile: %s\n CApath: %s\n",
- cafile ? cafile : "none",
- capath ? capath : "none");
-
return CURLE_OK;
}
-static CURLcode nss_init_sslver(SSLVersionRange *sslver,
- struct Curl_easy *data,
- struct connectdata *conn)
+static CURLcode nss_sslver_from_curl(PRUint16 *nssver, long version)
{
- switch(SSL_CONN_CONFIG(version)) {
- case CURL_SSLVERSION_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;
- return CURLE_OK;
-
+ switch(version) {
case CURL_SSLVERSION_TLSv1:
- sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
/* TODO: set sslver->max to SSL_LIBRARY_VERSION_TLS_1_3 once stable */
#ifdef SSL_LIBRARY_VERSION_TLS_1_2
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_2;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_2;
#elif defined SSL_LIBRARY_VERSION_TLS_1_1
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_1;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_1;
#else
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_0;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_0;
#endif
return CURLE_OK;
case CURL_SSLVERSION_SSLv2:
- sslver->min = SSL_LIBRARY_VERSION_2;
- sslver->max = SSL_LIBRARY_VERSION_2;
+ *nssver = SSL_LIBRARY_VERSION_2;
return CURLE_OK;
case CURL_SSLVERSION_SSLv3:
- sslver->min = SSL_LIBRARY_VERSION_3_0;
- sslver->max = SSL_LIBRARY_VERSION_3_0;
+ *nssver = SSL_LIBRARY_VERSION_3_0;
return CURLE_OK;
case CURL_SSLVERSION_TLSv1_0:
- sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_0;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_0;
return CURLE_OK;
case CURL_SSLVERSION_TLSv1_1:
#ifdef SSL_LIBRARY_VERSION_TLS_1_1
- sslver->min = SSL_LIBRARY_VERSION_TLS_1_1;
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_1;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_1;
return CURLE_OK;
+#else
+ return CURLE_SSL_CONNECT_ERROR;
#endif
- break;
case CURL_SSLVERSION_TLSv1_2:
#ifdef SSL_LIBRARY_VERSION_TLS_1_2
- sslver->min = SSL_LIBRARY_VERSION_TLS_1_2;
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_2;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_2;
return CURLE_OK;
+#else
+ return CURLE_SSL_CONNECT_ERROR;
#endif
- break;
case CURL_SSLVERSION_TLSv1_3:
#ifdef SSL_LIBRARY_VERSION_TLS_1_3
- sslver->min = SSL_LIBRARY_VERSION_TLS_1_3;
- sslver->max = SSL_LIBRARY_VERSION_TLS_1_3;
+ *nssver = SSL_LIBRARY_VERSION_TLS_1_3;
return CURLE_OK;
+#else
+ return CURLE_SSL_CONNECT_ERROR;
#endif
- break;
default:
- failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
return CURLE_SSL_CONNECT_ERROR;
}
+}
+
+static CURLcode nss_init_sslver(SSLVersionRange *sslver,
+ struct Curl_easy *data,
+ struct connectdata *conn)
+{
+ 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;
+ }
- failf(data, "TLS minor version cannot be set");
- return CURLE_SSL_CONNECT_ERROR;
+ switch(min) {
+ case CURL_SSLVERSION_DEFAULT:
+ break;
+ case CURL_SSLVERSION_TLSv1:
+ sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
+ break;
+ default:
+ result = nss_sslver_from_curl(&sslver->min, min);
+ if(result) {
+ failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+ if(max == CURL_SSLVERSION_MAX_NONE)
+ sslver->max = sslver->min;
+ }
+
+ switch(max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ break;
+ default:
+ result = nss_sslver_from_curl(&sslver->max, max >> 16);
+ if(result) {
+ failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+ }
+
+ return CURLE_OK;
}
static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
@@ -1606,19 +1732,19 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
}
/* cleanup on connection failure */
- Curl_llist_destroy(connssl->obj_list, NULL);
- connssl->obj_list = NULL;
+ Curl_llist_destroy(&connssl->obj_list, NULL);
return curlerr;
}
-/* Switch the SSL socket into non-blocking mode. */
-static CURLcode nss_set_nonblock(struct ssl_connect_data *connssl,
- struct Curl_easy *data)
+/* Switch the SSL socket into blocking or non-blocking mode. */
+static CURLcode nss_set_blocking(struct ssl_connect_data *connssl,
+ struct Curl_easy *data,
+ bool blocking)
{
static PRSocketOptionData sock_opt;
sock_opt.option = PR_SockOpt_Nonblocking;
- sock_opt.value.non_blocking = PR_TRUE;
+ sock_opt.value.non_blocking = !blocking;
if(PR_SetSocketOption(connssl->handle, &sock_opt) != PR_SUCCESS)
return nss_fail_connect(connssl, data, CURLE_SSL_CONNECT_ERROR);
@@ -1647,9 +1773,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
connssl->data = data;
/* list of all NSS objects we need to destroy in Curl_nss_close() */
- connssl->obj_list = Curl_llist_alloc(nss_destroy_object);
- if(!connssl->obj_list)
- return CURLE_OUT_OF_MEMORY;
+ Curl_llist_init(&connssl->obj_list, nss_destroy_object);
/* FIXME. NSS doesn't support multiple databases open at the same time. */
PR_Lock(nss_initlock);
@@ -1659,29 +1783,17 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
}
- result = CURLE_SSL_CONNECT_ERROR;
-
- if(!mod) {
- char *configstring = aprintf("library=%s name=PEM", pem_library);
- if(!configstring) {
- PR_Unlock(nss_initlock);
- goto error;
- }
- mod = SECMOD_LoadUserModule(configstring, NULL, PR_FALSE);
- free(configstring);
-
- if(!mod || !mod->loaded) {
- if(mod) {
- SECMOD_DestroyModule(mod);
- mod = NULL;
- }
- infof(data, "WARNING: failed to load NSS PEM library %s. Using "
- "OpenSSL PEM certificates will not work.\n", pem_library);
- }
- }
-
PK11_SetPasswordFunc(nss_get_password);
+
+ result = nss_load_module(&pem_module, pem_library, "PEM");
PR_Unlock(nss_initlock);
+ if(result == CURLE_FAILED_INIT)
+ infof(data, "WARNING: failed to load NSS PEM library %s. Using "
+ "OpenSSL PEM certificates will not work.\n", pem_library);
+ else if(result)
+ goto error;
+
+ result = CURLE_SSL_CONNECT_ERROR;
model = PR_NewTCPSocket();
if(!model)
@@ -1696,7 +1808,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
/* do not use SSL cache if disabled or we are not going to verify peer */
- ssl_no_cache = (data->set.general_ssl.sessionid
+ ssl_no_cache = (SSL_SET_OPTION(primary.sessionid)
&& SSL_CONN_CONFIG(verifypeer)) ? PR_FALSE : PR_TRUE;
if(SSL_OptionSet(model, SSL_NO_CACHE, ssl_no_cache) != SECSuccess)
goto error;
@@ -1746,9 +1858,12 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
if(SSL_HandshakeCallback(model, HandshakeCallback, conn) != SECSuccess)
goto error;
- if(SSL_CONN_CONFIG(verifypeer)) {
+ {
const CURLcode rv = nss_load_ca_certificates(conn, sockindex);
- if(rv) {
+ if((rv == CURLE_SSL_CACERT_BADFILE) && !SSL_CONN_CONFIG(verifypeer))
+ /* not a fatal error because we are not going to verify the peer */
+ infof(data, "warning: CA certificates failed to load\n");
+ else if(rv) {
result = rv;
goto error;
}
@@ -1877,7 +1992,8 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
unsigned char protocols[128];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
+ (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN;
memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID,
NGHTTP2_PROTO_VERSION_ID_LEN);
@@ -1933,8 +2049,8 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
/* check timeout situation */
- const long time_left = Curl_timeleft(data, NULL, TRUE);
- if(time_left < 0L) {
+ const time_t time_left = Curl_timeleft(data, NULL, TRUE);
+ if(time_left < 0) {
failf(data, "timed out before SSL handshake");
result = CURLE_OPERATION_TIMEDOUT;
goto error;
@@ -2007,16 +2123,14 @@ static CURLcode nss_connect_common(struct connectdata *conn, int sockindex,
/* we do not expect CURLE_AGAIN from nss_setup_connect() */
return result;
- if(!blocking) {
- /* in non-blocking mode, set NSS non-blocking mode before handshake */
- result = nss_set_nonblock(connssl, data);
- if(result)
- return result;
- }
-
connssl->connecting_state = ssl_connect_2;
}
+ /* enable/disable blocking mode before handshake */
+ result = nss_set_blocking(connssl, data, blocking);
+ if(result)
+ return result;
+
result = nss_do_connect(conn, sockindex);
switch(result) {
case CURLE_OK:
@@ -2032,7 +2146,7 @@ static CURLcode nss_connect_common(struct connectdata *conn, int sockindex,
if(blocking) {
/* in blocking mode, set NSS non-blocking mode _after_ SSL handshake */
- result = nss_set_nonblock(connssl, data);
+ result = nss_set_blocking(connssl, data, /* blocking */ FALSE);
if(result)
return result;
}
@@ -2067,8 +2181,14 @@ static ssize_t nss_send(struct connectdata *conn, /* connection data */
size_t len, /* amount to write */
CURLcode *curlcode)
{
- ssize_t rc = PR_Send(conn->ssl[sockindex].handle, mem, (int)len, 0,
- PR_INTERVAL_NO_WAIT);
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ ssize_t rc;
+
+ /* The SelectClientCert() hook uses this for infof() and failf() but the
+ handle stored in nss_setup_connect() could have already been freed. */
+ connssl->data = conn->data;
+
+ rc = PR_Send(connssl->handle, mem, (int)len, 0, PR_INTERVAL_NO_WAIT);
if(rc < 0) {
PRInt32 err = PR_GetError();
if(err == PR_WOULD_BLOCK_ERROR)
@@ -2092,14 +2212,21 @@ static ssize_t nss_send(struct connectdata *conn, /* connection data */
return rc; /* number of bytes */
}
-static ssize_t nss_recv(struct connectdata * conn, /* connection data */
- int num, /* socketindex */
+static ssize_t nss_recv(struct connectdata *conn, /* connection data */
+ int sockindex, /* socketindex */
char *buf, /* store read data here */
size_t buffersize, /* max amount to read */
CURLcode *curlcode)
{
- ssize_t nread = PR_Recv(conn->ssl[num].handle, buf, (int)buffersize, 0,
- PR_INTERVAL_NO_WAIT);
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ ssize_t nread;
+
+ /* The SelectClientCert() hook uses this for infof() and failf() but the
+ handle stored in nss_setup_connect() could have already been freed. */
+ connssl->data = conn->data;
+
+ nread = PR_Recv(connssl->handle, buf, (int)buffersize, 0,
+ PR_INTERVAL_NO_WAIT);
if(nread < 0) {
/* failed SSL read */
PRInt32 err = PR_GetError();
@@ -2138,17 +2265,17 @@ int Curl_nss_seed(struct Curl_easy *data)
}
/* data might be NULL */
-int Curl_nss_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length)
+CURLcode Curl_nss_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length)
{
Curl_nss_seed(data); /* Initiate the seed if not already done */
if(SECSuccess != PK11_GenerateRandom(entropy, curlx_uztosi(length)))
/* signal a failure */
- return -1;
+ return CURLE_FAILED_INIT;
- return 0;
+ return CURLE_OK;
}
void Curl_nss_md5sum(unsigned char *tmp, /* input */
diff --git a/lib/vtls/nssg.h b/lib/vtls/nssg.h
index fd94003f..8c46929f 100644
--- a/lib/vtls/nssg.h
+++ b/lib/vtls/nssg.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -47,9 +47,9 @@ int Curl_nss_seed(struct Curl_easy *data);
/* initialize NSS library if not already */
CURLcode Curl_nss_force_init(struct Curl_easy *data);
-int Curl_nss_random(struct Curl_easy *data,
- unsigned char *entropy,
- size_t length);
+CURLcode Curl_nss_random(struct Curl_easy *data,
+ unsigned char *entropy,
+ size_t length);
void Curl_nss_md5sum(unsigned char *tmp, /* input */
size_t tmplen,
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index d92e7136..40bb2dde 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -55,7 +55,9 @@
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/x509v3.h>
+#ifndef OPENSSL_NO_DSA
#include <openssl/dsa.h>
+#endif
#include <openssl/dh.h>
#include <openssl/err.h>
#include <openssl/md5.h>
@@ -156,10 +158,56 @@ static unsigned long OpenSSL_version_num(void)
* Number of bytes to read from the random number seed file. This must be
* a finite value (because some entropy "files" like /dev/urandom have
* an infinite length), but must be large enough to provide enough
- * entopy to properly seed OpenSSL's PRNG.
+ * entropy to properly seed OpenSSL's PRNG.
*/
#define RAND_LOAD_LENGTH 1024
+static const char *SSL_ERROR_to_str(int err)
+{
+ switch(err) {
+ case SSL_ERROR_NONE:
+ return "SSL_ERROR_NONE";
+ case SSL_ERROR_SSL:
+ return "SSL_ERROR_SSL";
+ case SSL_ERROR_WANT_READ:
+ return "SSL_ERROR_WANT_READ";
+ case SSL_ERROR_WANT_WRITE:
+ return "SSL_ERROR_WANT_WRITE";
+ case SSL_ERROR_WANT_X509_LOOKUP:
+ return "SSL_ERROR_WANT_X509_LOOKUP";
+ case SSL_ERROR_SYSCALL:
+ return "SSL_ERROR_SYSCALL";
+ case SSL_ERROR_ZERO_RETURN:
+ return "SSL_ERROR_ZERO_RETURN";
+ case SSL_ERROR_WANT_CONNECT:
+ return "SSL_ERROR_WANT_CONNECT";
+ case SSL_ERROR_WANT_ACCEPT:
+ return "SSL_ERROR_WANT_ACCEPT";
+#if defined(SSL_ERROR_WANT_ASYNC)
+ case SSL_ERROR_WANT_ASYNC:
+ return "SSL_ERROR_WANT_ASYNC";
+#endif
+#if defined(SSL_ERROR_WANT_ASYNC_JOB)
+ case SSL_ERROR_WANT_ASYNC_JOB:
+ return "SSL_ERROR_WANT_ASYNC_JOB";
+#endif
+#if defined(SSL_ERROR_WANT_EARLY)
+ case SSL_ERROR_WANT_EARLY:
+ return "SSL_ERROR_WANT_EARLY";
+#endif
+ default:
+ return "SSL_ERROR unknown";
+ }
+}
+
+/* Return error string for last OpenSSL error
+ */
+static char *ossl_strerror(unsigned long error, char *buf, size_t size)
+{
+ ERR_error_string_n(error, buf, size);
+ return buf;
+}
+
static int passwd_callback(char *buf, int num, int encrypting,
void *global_passwd)
{
@@ -188,8 +236,7 @@ static CURLcode Curl_ossl_seed(struct Curl_easy *data)
/* we have the "SSL is seeded" boolean static to prevent multiple
time-consuming seedings in vain */
static bool ssl_seeded = FALSE;
- char *buf = data->state.buffer; /* point to the big buffer */
- int nread=0;
+ char fname[256];
if(ssl_seeded)
return CURLE_OK;
@@ -208,12 +255,12 @@ static CURLcode Curl_ossl_seed(struct Curl_easy *data)
#endif
{
/* let the option override the define */
- nread += RAND_load_file((data->set.str[STRING_SSL_RANDOM_FILE]?
- data->set.str[STRING_SSL_RANDOM_FILE]:
- RANDOM_FILE),
- RAND_LOAD_LENGTH);
+ RAND_load_file((data->set.str[STRING_SSL_RANDOM_FILE]?
+ data->set.str[STRING_SSL_RANDOM_FILE]:
+ RANDOM_FILE),
+ RAND_LOAD_LENGTH);
if(rand_enough())
- return nread;
+ return CURLE_OK;
}
#if defined(HAVE_RAND_EGD)
@@ -231,35 +278,47 @@ static CURLcode Curl_ossl_seed(struct Curl_easy *data)
int ret = RAND_egd(data->set.str[STRING_SSL_EGDSOCKET]?
data->set.str[STRING_SSL_EGDSOCKET]:EGD_SOCKET);
if(-1 != ret) {
- nread += ret;
if(rand_enough())
- return nread;
+ return CURLE_OK;
}
}
#endif
- /* If we get here, it means we need to seed the PRNG using a "silly"
- approach! */
+ /* fallback to a custom seeding of the PRNG using a hash based on a current
+ time */
do {
unsigned char randb[64];
- int len = sizeof(randb);
- if(!RAND_bytes(randb, len))
- break;
- RAND_add(randb, len, (len >> 1));
+ size_t len = sizeof(randb);
+ size_t i, i_max;
+ for(i = 0, i_max = len / sizeof(struct curltime); i < i_max; ++i) {
+ struct curltime tv = curlx_tvnow();
+ Curl_wait_ms(1);
+ tv.tv_sec *= i + 1;
+ tv.tv_usec *= (unsigned int)i + 2;
+ tv.tv_sec ^= ((curlx_tvnow().tv_sec + curlx_tvnow().tv_usec) *
+ (i + 3)) << 8;
+ tv.tv_usec ^= (unsigned int) ((curlx_tvnow().tv_sec +
+ curlx_tvnow().tv_usec) *
+ (i + 4)) << 16;
+ memcpy(&randb[i * sizeof(struct curltime)], &tv,
+ sizeof(struct curltime));
+ }
+ RAND_add(randb, (int)len, (double)len/2);
} while(!rand_enough());
/* generates a default path for the random seed file */
- buf[0]=0; /* blank it first */
- RAND_file_name(buf, BUFSIZE);
- if(buf[0]) {
+ fname[0]=0; /* blank it first */
+ RAND_file_name(fname, sizeof(fname));
+ if(fname[0]) {
/* we got a file name to try */
- nread += RAND_load_file(buf, RAND_LOAD_LENGTH);
+ RAND_load_file(fname, RAND_LOAD_LENGTH);
if(rand_enough())
- return nread;
+ return CURLE_OK;
}
infof(data, "libcurl is now using a weak random seed!\n");
- return CURLE_SSL_CONNECT_ERROR; /* confusing error code */
+ return (rand_enough() ? CURLE_OK :
+ CURLE_SSL_CONNECT_ERROR /* confusing error code */);
}
#ifndef SSL_FILETYPE_ENGINE
@@ -335,6 +394,7 @@ int cert_stuff(struct connectdata *conn,
char *key_passwd)
{
struct Curl_easy *data = conn->data;
+ char error_buffer[256];
int file_type = do_file_type(cert_type);
@@ -360,7 +420,8 @@ int cert_stuff(struct connectdata *conn,
"could not load PEM client certificate, " OSSL_PACKAGE
" error %s, "
"(no key found, wrong pass phrase, or wrong file format?)",
- ERR_error_string(ERR_get_error(), NULL) );
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
return 0;
}
break;
@@ -376,7 +437,8 @@ int cert_stuff(struct connectdata *conn,
"could not load ASN1 client certificate, " OSSL_PACKAGE
" error %s, "
"(no key found, wrong pass phrase, or wrong file format?)",
- ERR_error_string(ERR_get_error(), NULL) );
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
return 0;
}
break;
@@ -405,7 +467,8 @@ int cert_stuff(struct connectdata *conn,
0, &params, NULL, 1)) {
failf(data, "ssl engine cannot load client cert with id"
" '%s' [%s]", cert_file,
- ERR_error_string(ERR_get_error(), NULL));
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)));
return 0;
}
@@ -461,7 +524,8 @@ int cert_stuff(struct connectdata *conn,
failf(data,
"could not parse PKCS12 file, check password, " OSSL_PACKAGE
" error %s",
- ERR_error_string(ERR_get_error(), NULL) );
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
PKCS12_free(p12);
return 0;
}
@@ -472,7 +536,8 @@ int cert_stuff(struct connectdata *conn,
failf(data,
"could not load PKCS12 client certificate, " OSSL_PACKAGE
" error %s",
- ERR_error_string(ERR_get_error(), NULL) );
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
goto fail;
}
@@ -493,21 +558,19 @@ int cert_stuff(struct connectdata *conn,
/*
* Note that sk_X509_pop() is used below to make sure the cert is
* removed from the stack properly before getting passed to
- * SSL_CTX_add_extra_chain_cert(). Previously we used
- * sk_X509_value() instead, but then we'd clean it in the subsequent
- * sk_X509_pop_free() call.
+ * SSL_CTX_add_extra_chain_cert(), which takes ownership. Previously
+ * we used sk_X509_value() instead, but then we'd clean it in the
+ * subsequent sk_X509_pop_free() call.
*/
X509 *x = sk_X509_pop(ca);
- if(!SSL_CTX_add_extra_chain_cert(ctx, x)) {
+ if(!SSL_CTX_add_client_CA(ctx, x)) {
X509_free(x);
- failf(data, "cannot add certificate to certificate chain");
+ failf(data, "cannot add certificate to client CA list");
goto fail;
}
- /* SSL_CTX_add_client_CA() seems to work with either sk_* function,
- * presumably because it duplicates what we pass to it.
- */
- if(!SSL_CTX_add_client_CA(ctx, x)) {
- failf(data, "cannot add certificate to client CA list");
+ if(!SSL_CTX_add_extra_chain_cert(ctx, x)) {
+ X509_free(x);
+ failf(data, "cannot add certificate to certificate chain");
goto fail;
}
}
@@ -541,6 +604,7 @@ int cert_stuff(struct connectdata *conn,
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) {
failf(data, "unable to set private key file: '%s' type %s",
@@ -664,17 +728,6 @@ static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
#endif
}
-/* Return error string for last OpenSSL error
- */
-static char *ossl_strerror(unsigned long error, char *buf, size_t size)
-{
- /* OpenSSL 0.9.6 and later has a function named
- ERR_error_string_n() that takes the size of the buffer as a
- third argument */
- ERR_error_string_n(error, buf, size);
- return buf;
-}
-
/**
* Global SSL init
*
@@ -776,7 +829,7 @@ int Curl_ossl_check_cxn(struct connectdata *conn)
(RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK);
if(nread == 0)
return 0; /* connection has been closed */
- else if(nread == 1)
+ if(nread == 1)
return 1; /* connection still in place */
else if(nread == -1) {
int err = SOCKERRNO;
@@ -981,8 +1034,10 @@ int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
default:
/* openssl/ssl.h says "look at error stack/return value/errno" */
sslerror = ERR_get_error();
- failf(conn->data, OSSL_PACKAGE " SSL read: %s, errno %d",
- ossl_strerror(sslerror, buf, sizeof(buf)),
+ failf(conn->data, OSSL_PACKAGE " SSL_read on shutdown: %s, errno %d",
+ (sslerror ?
+ ossl_strerror(sslerror, buf, sizeof(buf)) :
+ SSL_ERROR_to_str(err)),
SOCKERRNO);
done = 1;
break;
@@ -1327,7 +1382,8 @@ static CURLcode verifystatus(struct connectdata *conn,
st = SSL_CTX_get_cert_store(connssl->ctx);
#if ((OPENSSL_VERSION_NUMBER <= 0x1000201fL) /* Fixed after 1.0.2a */ || \
- defined(LIBRESSL_VERSION_NUMBER))
+ (defined(LIBRESSL_VERSION_NUMBER) && \
+ LIBRESSL_VERSION_NUMBER <= 0x2040200fL))
/* The authorized responder cert in the OCSP response MUST be signed by the
peer cert's issuer (see RFC6960 section 4.2.2.2). If that's a root cert,
no problem, but if it's an intermediate cert OpenSSL has a bug where it
@@ -1609,7 +1665,7 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
#ifdef HAS_NPN
/*
- * in is a list of lenght prefixed strings. this function has to select
+ * in is a list of length prefixed strings. this function has to select
* the protocol we want to use from the list and write its string into out.
*/
@@ -1693,6 +1749,85 @@ get_ssl_version_txt(SSL *ssl)
return "unknown";
}
+static CURLcode
+set_ssl_version_min_max(long *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
+ variable */
+ struct Curl_easy *data = conn->data;
+#endif
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+
+ if(ssl_version_max == CURL_SSLVERSION_MAX_NONE) {
+ ssl_version_max = ssl_version << 16;
+ }
+
+ switch(ssl_version) {
+ case CURL_SSLVERSION_TLSv1_3:
+#ifdef TLS1_3_VERSION
+ {
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ SSL_CTX_set_max_proto_version(connssl->ctx, TLS1_3_VERSION);
+ *ctx_options |= SSL_OP_NO_TLSv1_2;
+ }
+#else
+ (void)sockindex;
+ failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
+ return CURLE_NOT_BUILT_IN;
+#endif
+ case CURL_SSLVERSION_TLSv1_2:
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ *ctx_options |= SSL_OP_NO_TLSv1_1;
+#else
+ failf(data, OSSL_PACKAGE " was built without TLS 1.2 support");
+ return CURLE_NOT_BUILT_IN;
+#endif
+ /* FALLTHROUGH */
+ case CURL_SSLVERSION_TLSv1_1:
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ *ctx_options |= SSL_OP_NO_TLSv1;
+#else
+ failf(data, OSSL_PACKAGE " was built without TLS 1.1 support");
+ return CURLE_NOT_BUILT_IN;
+#endif
+ /* FALLTHROUGH */
+ case CURL_SSLVERSION_TLSv1_0:
+ *ctx_options |= SSL_OP_NO_SSLv2;
+ *ctx_options |= SSL_OP_NO_SSLv3;
+ break;
+ }
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_TLSv1_0:
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ *ctx_options |= SSL_OP_NO_TLSv1_1;
+#endif
+ /* FALLTHROUGH */
+ case CURL_SSLVERSION_MAX_TLSv1_1:
+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+ *ctx_options |= SSL_OP_NO_TLSv1_2;
+#endif
+ /* FALLTHROUGH */
+ case CURL_SSLVERSION_MAX_TLSv1_2:
+ case CURL_SSLVERSION_MAX_DEFAULT:
+#ifdef TLS1_3_VERSION
+ *ctx_options |= SSL_OP_NO_TLSv1_3;
+#endif
+ break;
+ case CURL_SSLVERSION_MAX_TLSv1_3:
+#ifdef TLS1_3_VERSION
+ break;
+#else
+ failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
+ return CURLE_NOT_BUILT_IN;
+#endif
+ }
+ return CURLE_OK;
+}
+
static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
{
CURLcode result = CURLE_OK;
@@ -1702,9 +1837,11 @@ 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;
+ long ctx_options = 0;
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
bool sni;
+ const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ conn->host.name;
#ifdef ENABLE_IPV6
struct in6_addr addr;
#else
@@ -1723,8 +1860,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
+ char error_buffer[256];
DEBUGASSERT(ssl_connect_1 == connssl->connecting_state);
@@ -1790,7 +1926,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(!connssl->ctx) {
failf(data, "SSL: couldn't create a context: %s",
- ERR_error_string(ERR_peek_error(), NULL));
+ ossl_strerror(ERR_peek_error(), error_buffer, sizeof(error_buffer)));
return CURLE_OUT_OF_MEMORY;
}
@@ -1889,60 +2025,13 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
break;
case CURL_SSLVERSION_TLSv1_0:
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_SSLv3;
-#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
- break;
-
case CURL_SSLVERSION_TLSv1_1:
-#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_SSLv3;
- ctx_options |= SSL_OP_NO_TLSv1;
- ctx_options |= SSL_OP_NO_TLSv1_2;
-#ifdef TLS1_3_VERSION
- ctx_options |= SSL_OP_NO_TLSv1_3;
-#endif
- break;
-#else
- failf(data, OSSL_PACKAGE " was built without TLS 1.1 support");
- return CURLE_NOT_BUILT_IN;
-#endif
-
case CURL_SSLVERSION_TLSv1_2:
-#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_SSLv3;
- ctx_options |= SSL_OP_NO_TLSv1;
- ctx_options |= SSL_OP_NO_TLSv1_1;
-#ifdef TLS1_3_VERSION
- ctx_options |= SSL_OP_NO_TLSv1_3;
-#endif
- break;
-#else
- failf(data, OSSL_PACKAGE " was built without TLS 1.2 support");
- return CURLE_NOT_BUILT_IN;
-#endif
-
case CURL_SSLVERSION_TLSv1_3:
-#ifdef TLS1_3_VERSION
- SSL_CTX_set_max_proto_version(connssl->ctx, TLS1_3_VERSION);
- ctx_options |= SSL_OP_NO_SSLv2;
- ctx_options |= SSL_OP_NO_SSLv3;
- ctx_options |= SSL_OP_NO_TLSv1;
- ctx_options |= SSL_OP_NO_TLSv1_1;
- ctx_options |= SSL_OP_NO_TLSv1_2;
+ result = set_ssl_version_min_max(&ctx_options, conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
break;
-#else
- failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
- return CURLE_NOT_BUILT_IN;
-#endif
case CURL_SSLVERSION_SSLv2:
#ifndef OPENSSL_NO_SSL2
@@ -1979,7 +2068,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
unsigned char protocols[128];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
+ (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN;
memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID,
@@ -2056,12 +2146,10 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
ssl_capath ? ssl_capath : "none");
return CURLE_SSL_CACERT_BADFILE;
}
- else {
- /* Just continue with a warning if no strict certificate verification
- is required. */
- infof(data, "error setting certificate verify locations,"
- " continuing anyway:\n");
- }
+ /* Just continue with a warning if no strict certificate verification
+ is required. */
+ infof(data, "error setting certificate verify locations,"
+ " continuing anyway:\n");
}
else {
/* Everything is fine. */
@@ -2091,12 +2179,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
failf(data, "error loading CRL file: %s", ssl_crlfile);
return CURLE_SSL_CRL_BADFILE;
}
- else {
- /* Everything is fine. */
- infof(data, "successfully load CRL file:\n");
- X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx),
- X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
- }
+ /* Everything is fine. */
+ infof(data, "successfully load CRL file:\n");
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx),
+ X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
+
infof(data, " CRLfile: %s\n", ssl_crlfile);
}
@@ -2161,7 +2248,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#endif
/* Check if there's a cached ID we can/should use here! */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
void *ssl_sessionid = NULL;
Curl_ssl_sessionid_lock(conn);
@@ -2170,7 +2257,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(!SSL_set_session(connssl->handle, ssl_sessionid)) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
- ERR_error_string(ERR_get_error(), NULL));
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)));
return CURLE_SSL_CONNECT_ERROR;
}
/* Informational message */
@@ -2190,7 +2278,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
else if(!SSL_set_fd(connssl->handle, (int)sockfd)) {
/* pass the raw socket into the SSL layers */
failf(data, "SSL: SSL_set_fd failed: %s",
- ERR_error_string(ERR_get_error(), NULL));
+ ossl_strerror(ERR_get_error(), error_buffer, sizeof(error_buffer)));
return CURLE_SSL_CONNECT_ERROR;
}
@@ -2224,15 +2312,14 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
connssl->connecting_state = ssl_connect_2_reading;
return CURLE_OK;
}
- else if(SSL_ERROR_WANT_WRITE == detail) {
+ if(SSL_ERROR_WANT_WRITE == detail) {
connssl->connecting_state = ssl_connect_2_writing;
return CURLE_OK;
}
else {
/* untreated error */
unsigned long errdetail;
- char error_buffer[256]=""; /* OpenSSL documents that this must be at
- least 256 bytes long. */
+ char error_buffer[256]="";
CURLcode result;
long lerr;
int lib;
@@ -2280,8 +2367,8 @@ 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;
- failf(data, "Unknown SSL protocol error in connection to %s:%ld ",
- hostname, port);
+ failf(data, OSSL_PACKAGE " SSL_connect: %s in connection to %s:%ld ",
+ SSL_ERROR_to_str(detail), hostname, port);
return result;
}
@@ -2554,44 +2641,25 @@ static CURLcode get_cert_chain(struct connectdata *conn,
{
const BIGNUM *n;
const BIGNUM *e;
- const BIGNUM *d;
- const BIGNUM *p;
- const BIGNUM *q;
- const BIGNUM *dmp1;
- const BIGNUM *dmq1;
- const BIGNUM *iqmp;
- RSA_get0_key(rsa, &n, &e, &d);
- RSA_get0_factors(rsa, &p, &q);
- RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
+ RSA_get0_key(rsa, &n, &e, NULL);
BN_print(mem, n);
push_certinfo("RSA Public Key", i);
print_pubkey_BN(rsa, n, i);
print_pubkey_BN(rsa, e, i);
- print_pubkey_BN(rsa, d, i);
- print_pubkey_BN(rsa, p, i);
- print_pubkey_BN(rsa, q, i);
- print_pubkey_BN(rsa, dmp1, i);
- print_pubkey_BN(rsa, dmq1, i);
- print_pubkey_BN(rsa, iqmp, i);
}
#else
BIO_printf(mem, "%d", BN_num_bits(rsa->n));
push_certinfo("RSA Public Key", i);
print_pubkey_BN(rsa, n, i);
print_pubkey_BN(rsa, e, i);
- print_pubkey_BN(rsa, d, i);
- print_pubkey_BN(rsa, p, i);
- print_pubkey_BN(rsa, q, i);
- print_pubkey_BN(rsa, dmp1, i);
- print_pubkey_BN(rsa, dmq1, i);
- print_pubkey_BN(rsa, iqmp, i);
#endif
break;
}
case EVP_PKEY_DSA:
{
+#ifndef OPENSSL_NO_DSA
DSA *dsa;
#ifdef HAVE_OPAQUE_EVP_PKEY
dsa = EVP_PKEY_get0_DSA(pubkey);
@@ -2603,25 +2671,23 @@ static CURLcode get_cert_chain(struct connectdata *conn,
const BIGNUM *p;
const BIGNUM *q;
const BIGNUM *g;
- const BIGNUM *priv_key;
const BIGNUM *pub_key;
DSA_get0_pqg(dsa, &p, &q, &g);
- DSA_get0_key(dsa, &pub_key, &priv_key);
+ DSA_get0_key(dsa, &pub_key, NULL);
print_pubkey_BN(dsa, p, i);
print_pubkey_BN(dsa, q, i);
print_pubkey_BN(dsa, g, i);
- print_pubkey_BN(dsa, priv_key, i);
print_pubkey_BN(dsa, pub_key, i);
}
#else
print_pubkey_BN(dsa, p, i);
print_pubkey_BN(dsa, q, i);
print_pubkey_BN(dsa, g, i);
- print_pubkey_BN(dsa, priv_key, i);
print_pubkey_BN(dsa, pub_key, i);
#endif
+#endif /* !OPENSSL_NO_DSA */
break;
}
case EVP_PKEY_DH:
@@ -2637,20 +2703,17 @@ static CURLcode get_cert_chain(struct connectdata *conn,
const BIGNUM *p;
const BIGNUM *q;
const BIGNUM *g;
- const BIGNUM *priv_key;
const BIGNUM *pub_key;
DH_get0_pqg(dh, &p, &q, &g);
- DH_get0_key(dh, &pub_key, &priv_key);
+ DH_get0_key(dh, &pub_key, NULL);
print_pubkey_BN(dh, p, i);
print_pubkey_BN(dh, q, i);
print_pubkey_BN(dh, g, i);
- print_pubkey_BN(dh, priv_key, i);
print_pubkey_BN(dh, pub_key, i);
}
#else
print_pubkey_BN(dh, p, i);
print_pubkey_BN(dh, g, i);
- print_pubkey_BN(dh, priv_key, i);
print_pubkey_BN(dh, pub_key, i);
#endif
break;
@@ -2757,7 +2820,7 @@ static CURLcode servercert(struct connectdata *conn,
struct Curl_easy *data = conn->data;
X509 *issuer;
FILE *fp;
- char *buffer = data->state.buffer;
+ char buffer[2048];
const char *ptr;
long * const certverifyresult = SSL_IS_PROXY() ?
&data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
@@ -2769,6 +2832,7 @@ static CURLcode servercert(struct connectdata *conn,
connssl->server_cert = SSL_get_peer_certificate(connssl->handle);
if(!connssl->server_cert) {
+ BIO_free(mem);
if(!strict)
return CURLE_OK;
@@ -2779,7 +2843,7 @@ static CURLcode servercert(struct connectdata *conn,
infof(data, "%s certificate:\n", SSL_IS_PROXY() ? "Proxy" : "Server");
rc = x509_name_oneline(X509_get_subject_name(connssl->server_cert),
- buffer, BUFSIZE);
+ buffer, sizeof(buffer));
infof(data, " subject: %s\n", rc?"[NONE]":buffer);
ASN1_TIME_print(mem, X509_get0_notBefore(connssl->server_cert));
@@ -2804,7 +2868,7 @@ static CURLcode servercert(struct connectdata *conn,
}
rc = x509_name_oneline(X509_get_issuer_name(connssl->server_cert),
- buffer, BUFSIZE);
+ buffer, sizeof(buffer));
if(rc) {
if(strict)
failf(data, "SSL: couldn't get X509-issuer name!");
@@ -2915,7 +2979,7 @@ static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex)
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
bool incache;
SSL_SESSION *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
@@ -3037,16 +3101,14 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
return CURLE_SSL_CONNECT_ERROR;
}
- else if(0 == what) {
+ if(0 == what) {
if(nonblocking) {
*done = FALSE;
return CURLE_OK;
}
- else {
- /* timeout */
- failf(data, "SSL connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
+ /* timeout */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
}
/* socket is readable or writable */
}
@@ -3116,8 +3178,7 @@ bool Curl_ossl_data_pending(const struct connectdata *conn, int connindex)
(conn->proxy_ssl[connindex].handle &&
0 != SSL_pending(conn->proxy_ssl[connindex].handle))) ?
TRUE : FALSE;
- else
- return FALSE;
+ return FALSE;
}
static ssize_t ossl_send(struct connectdata *conn,
@@ -3129,8 +3190,7 @@ static ssize_t ossl_send(struct connectdata *conn,
/* SSL_write() is said to return 'int' while write() and send() returns
'size_t' */
int err;
- char error_buffer[256]; /* OpenSSL documents that this must be at least 256
- bytes long. */
+ char error_buffer[256];
unsigned long sslerror;
int memlen;
int rc;
@@ -3176,7 +3236,8 @@ static ssize_t ossl_send(struct connectdata *conn,
return -1;
}
/* a true error */
- failf(conn->data, "SSL_write() return error %d", err);
+ failf(conn->data, OSSL_PACKAGE " SSL_write: %s, errno %d",
+ SSL_ERROR_to_str(err), SOCKERRNO);
*curlcode = CURLE_SEND_ERROR;
return -1;
}
@@ -3190,8 +3251,7 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
size_t buffersize, /* max amount to read */
CURLcode *curlcode)
{
- char error_buffer[256]; /* OpenSSL documents that this must be at
- least 256 bytes long. */
+ char error_buffer[256];
unsigned long sslerror;
ssize_t nread;
int buffsize;
@@ -3221,8 +3281,10 @@ 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 */
- failf(conn->data, "SSL read: %s, errno %d",
- ossl_strerror(sslerror, error_buffer, sizeof(error_buffer)),
+ 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);
*curlcode = CURLE_RECV_ERROR;
return -1;
@@ -3272,19 +3334,21 @@ size_t Curl_ossl_version(char *buffer, size_t size)
}
/* can be called with data == NULL */
-int Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length)
+CURLcode Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
+ size_t length)
{
+ int rc;
if(data) {
if(Curl_ossl_seed(data)) /* Initiate the seed if not already done */
- return 1; /* couldn't seed for some reason */
+ return CURLE_FAILED_INIT; /* couldn't seed for some reason */
}
else {
if(!rand_enough())
- return 1;
+ return CURLE_FAILED_INIT;
}
- RAND_bytes(entropy, curlx_uztosi(length));
- return 0; /* 0 as in no problem */
+ /* RAND_bytes() returns 1 on success, 0 otherwise. */
+ rc = RAND_bytes(entropy, curlx_uztosi(length));
+ return (rc == 1 ? CURLE_OK : CURLE_FAILED_INIT);
}
void Curl_ossl_md5sum(unsigned char *tmp, /* input */
diff --git a/lib/vtls/openssl.h b/lib/vtls/openssl.h
index cff1e909..b9648d51 100644
--- a/lib/vtls/openssl.h
+++ b/lib/vtls/openssl.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -66,8 +66,8 @@ bool Curl_ossl_data_pending(const struct connectdata *conn,
int connindex);
/* return 0 if a find random is filled in */
-int Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
- size_t length);
+CURLcode Curl_ossl_random(struct Curl_easy *data, unsigned char *entropy,
+ size_t length);
void Curl_ossl_md5sum(unsigned char *tmp, /* input */
size_t tmplen,
unsigned char *md5sum /* output */,
diff --git a/lib/vtls/polarssl.c b/lib/vtls/polarssl.c
index 4bba3e3f..669091cb 100644
--- a/lib/vtls/polarssl.c
+++ b/lib/vtls/polarssl.c
@@ -140,6 +140,68 @@ static void polarssl_debug(void *context, int level, const char *line)
static Curl_recv polarssl_recv;
static Curl_send polarssl_send;
+static CURLcode polarssl_version_from_curl(int *polarver, long ssl_version)
+{
+ switch(ssl_version) {
+ case CURL_SSLVERSION_TLSv1_0:
+ *polarver = SSL_MINOR_VERSION_1;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1:
+ *polarver = SSL_MINOR_VERSION_2;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2:
+ *polarver = SSL_MINOR_VERSION_3;
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_3:
+ break;
+ }
+ return CURLE_SSL_CONNECT_ERROR;
+}
+
+static CURLcode
+set_ssl_version_min_max(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data* connssl = &conn->ssl[sockindex];
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ int ssl_min_ver = SSL_MINOR_VERSION_1;
+ int ssl_max_ver = SSL_MINOR_VERSION_1;
+ CURLcode result = CURLE_OK;
+
+ switch(ssl_version) {
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ ssl_version = CURL_SSLVERSION_TLSv1_0;
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version << 16;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+
+ result = polarssl_version_from_curl(&ssl_min_ver, ssl_version);
+ if(result) {
+ failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+ result = polarssl_version_from_curl(&ssl_max_ver, ssl_version_max >> 16);
+ if(result) {
+ failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
+ return result;
+ }
+
+ ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3, ssl_min_ver);
+ ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3, ssl_max_ver);
+
+ return result;
+}
static CURLcode
polarssl_connect_step1(struct connectdata *conn,
@@ -287,29 +349,15 @@ polarssl_connect_step1(struct connectdata *conn,
infof(data, "PolarSSL: Forced min. SSL Version to be SSLv3\n");
break;
case CURL_SSLVERSION_TLSv1_0:
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_1);
- ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_1);
- infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.0\n");
- break;
case CURL_SSLVERSION_TLSv1_1:
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_2);
- ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_2);
- infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.1\n");
- break;
case CURL_SSLVERSION_TLSv1_2:
- ssl_set_min_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_3);
- ssl_set_max_version(&connssl->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_3);
- infof(data, "PolarSSL: Forced min. SSL Version to be TLS 1.2\n");
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "PolarSSL: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ CURLcode result = set_ssl_version_min_max(conn, sockindex);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
return CURLE_SSL_CONNECT_ERROR;
@@ -327,7 +375,7 @@ polarssl_connect_step1(struct connectdata *conn,
ssl_set_ciphersuites(&connssl->ssl, ssl_list_ciphersuites());
/* Check if there's a cached ID we can/should use here! */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
void *old_session = NULL;
Curl_ssl_sessionid_lock(conn);
@@ -555,7 +603,7 @@ polarssl_connect_step3(struct connectdata *conn,
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
int ret;
ssl_session *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
@@ -564,7 +612,7 @@ polarssl_connect_step3(struct connectdata *conn,
if(!our_ssl_sessionid)
return CURLE_OUT_OF_MEMORY;
- ssl_session_init(our_ssl_sessionid);
+ memset(our_ssl_sessionid, 0, sizeof(ssl_session));
ret = ssl_get_session(&connssl->ssl, our_ssl_sessionid);
if(ret) {
@@ -816,4 +864,10 @@ void Curl_polarssl_cleanup(void)
(void)Curl_polarsslthreadlock_thread_cleanup();
}
+
+int Curl_polarssl_data_pending(const struct connectdata *conn, int sockindex)
+{
+ return ssl_get_bytes_avail(&conn->ssl[sockindex].ssl) != 0;
+}
+
#endif /* USE_POLARSSL */
diff --git a/lib/vtls/polarssl.h b/lib/vtls/polarssl.h
index 7098b24a..47af7b41 100644
--- a/lib/vtls/polarssl.h
+++ b/lib/vtls/polarssl.h
@@ -31,6 +31,7 @@
/* Called on first use PolarSSL, setup threading if supported */
int Curl_polarssl_init(void);
void Curl_polarssl_cleanup(void);
+int Curl_polarssl_data_pending(const struct connectdata *conn, int sockindex);
CURLcode Curl_polarssl_connect(struct connectdata *conn, int sockindex);
@@ -69,7 +70,7 @@ int Curl_polarssl_shutdown(struct connectdata *conn, int sockindex);
#define curlssl_engines_list(x) ((void)x, (struct curl_slist *)NULL)
#define curlssl_version Curl_polarssl_version
#define curlssl_check_cxn(x) ((void)x, -1)
-#define curlssl_data_pending(x,y) ((void)x, (void)y, 0)
+#define curlssl_data_pending(x,y) Curl_polarssl_data_pending(x, y)
#define curlssl_sha256sum(a,b,c,d) sha256(a,b,c,0)
/* This might cause libcurl to use a weeker random!
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c
index ac8b7055..94603018 100644
--- a/lib/vtls/schannel.c
+++ b/lib/vtls/schannel.c
@@ -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 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -103,6 +103,41 @@ static void InitSecBufferDesc(SecBufferDesc *desc, SecBuffer *BufArr,
}
static CURLcode
+set_ssl_version_min_max(SCHANNEL_CRED *schannel_cred, struct connectdata *conn)
+{
+ struct Curl_easy *data = conn->data;
+ long ssl_version = SSL_CONN_CONFIG(version);
+ long ssl_version_max = SSL_CONN_CONFIG(version_max);
+ long i = ssl_version;
+
+ switch(ssl_version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ ssl_version_max = ssl_version << 16;
+ break;
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
+ }
+ for(; i <= (ssl_version_max >> 16); ++i) {
+ switch(i) {
+ case CURL_SSLVERSION_TLSv1_0:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_0_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_1_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_2_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_3:
+ failf(data, "Schannel: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ }
+ return CURLE_OK;
+}
+
+static CURLcode
schannel_connect_step1(struct connectdata *conn, int sockindex)
{
ssize_t written = -1;
@@ -124,12 +159,20 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#endif
TCHAR *host_name;
CURLcode result;
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ 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);
+ 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
+ algorithms that may not be supported by all servers. */
+ infof(data, "schannel: WinSSL version is old and may not be able to "
+ "connect to some servers due to lack of SNI, algorithms, etc.\n");
+ }
+
#ifdef HAS_ALPN
/* ALPN is only supported on Windows 8.1 / Server 2012 R2 and above.
Also it doesn't seem to be supported for Wine, see curl bug #983. */
@@ -145,7 +188,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
connssl->cred = NULL;
/* check for an existing re-usable credential handle */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL, sockindex)) {
connssl->cred = old_cred;
@@ -197,7 +240,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
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. Also disables SNI.\n");
+ "names in server certificates.\n");
}
switch(conn->ssl_config.version) {
@@ -208,17 +251,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
SP_PROT_TLS1_2_CLIENT;
break;
case CURL_SSLVERSION_TLSv1_0:
- schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_0_CLIENT;
- break;
case CURL_SSLVERSION_TLSv1_1:
- schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_1_CLIENT;
- break;
case CURL_SSLVERSION_TLSv1_2:
- schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT;
- break;
case CURL_SSLVERSION_TLSv1_3:
- failf(data, "Schannel: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ {
+ result = set_ssl_version_min_max(&schannel_cred, conn);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv3:
schannel_cred.grbitEnabledProtocols = SP_PROT_SSL3_CLIENT;
break;
@@ -391,6 +432,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
connssl->recv_unrecoverable_err = CURLE_OK;
connssl->recv_sspi_close_notify = false;
connssl->recv_connection_closed = false;
+ connssl->encdata_is_incomplete = false;
/* continue to second handshake step */
connssl->connecting_state = ssl_connect_2;
@@ -415,7 +457,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
TCHAR *host_name;
CURLcode result;
bool doread;
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
doread = (connssl->connecting_state != ssl_connect_2_writing) ? TRUE : FALSE;
@@ -439,6 +481,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
/* buffer to store previously received and encrypted data */
if(connssl->encdata_buffer == NULL) {
+ connssl->encdata_is_incomplete = false;
connssl->encdata_offset = 0;
connssl->encdata_length = CURL_SCHANNEL_BUFFER_INIT_SIZE;
connssl->encdata_buffer = malloc(connssl->encdata_length);
@@ -491,6 +534,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
/* increase encrypted data buffer offset */
connssl->encdata_offset += nread;
+ connssl->encdata_is_incomplete = false;
+ infof(data, "schannel: encrypted data got %zd\n", nread);
}
infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
@@ -535,6 +580,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
/* check if the handshake was incomplete */
if(sspi_status == SEC_E_INCOMPLETE_MESSAGE) {
+ connssl->encdata_is_incomplete = true;
connssl->connecting_state = ssl_connect_2_reading;
infof(data, "schannel: received incomplete message, need more data\n");
return CURLE_OK;
@@ -584,7 +630,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
else
failf(data, "schannel: next InitializeSecurityContext failed: %s",
Curl_sspi_strerror(conn, sspi_status));
- return CURLE_SSL_CONNECT_ERROR;
+ return sspi_status == SEC_E_UNTRUSTED_ROOT ?
+ CURLE_SSL_CACERT_BADFILE : CURLE_SSL_CONNECT_ERROR;
}
/* check if there was additional remaining encrypted data */
@@ -649,8 +696,10 @@ 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
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#endif
#ifdef HAS_ALPN
SecPkgContext_ApplicationProtocol alpn_result;
#endif
@@ -714,7 +763,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
#endif
/* save the current session data for possible re-use */
- if(data->set.general_ssl.sessionid) {
+ if(SSL_SET_OPTION(primary.sessionid)) {
bool incache;
struct curl_schannel_cred *old_cred = NULL;
@@ -1134,6 +1183,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
}
else if(nread > 0) {
connssl->encdata_offset += (size_t)nread;
+ connssl->encdata_is_incomplete = false;
infof(data, "schannel: encrypted data got %zd\n", nread);
}
}
@@ -1270,6 +1320,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
}
}
else if(sspi_status == SEC_E_INCOMPLETE_MESSAGE) {
+ connssl->encdata_is_incomplete = true;
if(!*err)
*err = CURLE_AGAIN;
infof(data, "schannel: failed to decrypt data, need more data\n");
@@ -1371,8 +1422,8 @@ bool Curl_schannel_data_pending(const struct connectdata *conn, int sockindex)
const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
if(connssl->use) /* SSL/TLS is in use */
- return (connssl->encdata_offset > 0 ||
- connssl->decdata_offset > 0) ? TRUE : FALSE;
+ return (connssl->decdata_offset > 0 ||
+ (connssl->encdata_offset > 0 && !connssl->encdata_is_incomplete));
else
return FALSE;
}
@@ -1391,7 +1442,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
*/
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
@@ -1475,6 +1526,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
Curl_safefree(connssl->encdata_buffer);
connssl->encdata_length = 0;
connssl->encdata_offset = 0;
+ connssl->encdata_is_incomplete = false;
}
/* free internal buffer for received decrypted data */
@@ -1516,21 +1568,21 @@ size_t Curl_schannel_version(char *buffer, size_t size)
return size;
}
-int Curl_schannel_random(unsigned char *entropy, size_t length)
+CURLcode Curl_schannel_random(unsigned char *entropy, size_t length)
{
HCRYPTPROV hCryptProv = 0;
if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
- return 1;
+ return CURLE_FAILED_INIT;
if(!CryptGenRandom(hCryptProv, (DWORD)length, entropy)) {
CryptReleaseContext(hCryptProv, 0UL);
- return 1;
+ return CURLE_FAILED_INIT;
}
CryptReleaseContext(hCryptProv, 0UL);
- return 0;
+ return CURLE_OK;
}
#ifdef _WIN32_WCE
diff --git a/lib/vtls/schannel.h b/lib/vtls/schannel.h
index 8a4991ec..8627c63c 100644
--- a/lib/vtls/schannel.h
+++ b/lib/vtls/schannel.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012, Marc Hoersken, <info@marc-hoersken.de>, et al.
- * Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -92,7 +92,7 @@ int Curl_schannel_init(void);
void Curl_schannel_cleanup(void);
size_t Curl_schannel_version(char *buffer, size_t size);
-int Curl_schannel_random(unsigned char *entropy, size_t length);
+CURLcode Curl_schannel_random(unsigned char *entropy, size_t length);
/* Set the API backend definition to Schannel */
#define CURL_SSL_BACKEND CURLSSLBACKEND_SCHANNEL
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index b808e1c5..d5d0971c 100644
--- a/lib/vtls/vtls.c
+++ b/lib/vtls/vtls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -95,6 +95,7 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
struct ssl_primary_config* needle)
{
if((data->version == needle->version) &&
+ (data->version_max == needle->version_max) &&
(data->verifypeer == needle->verifypeer) &&
(data->verifyhost == needle->verifyhost) &&
Curl_safe_strcasecompare(data->CApath, needle->CApath) &&
@@ -113,6 +114,7 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
dest->verifyhost = source->verifyhost;
dest->verifypeer = source->verifypeer;
dest->version = source->version;
+ dest->version_max = source->version_max;
CLONE_STRING(CAfile);
CLONE_STRING(CApath);
@@ -120,6 +122,9 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
CLONE_STRING(egdsocket);
CLONE_STRING(random_file);
CLONE_STRING(clientcert);
+
+ /* Disable dest sessionid cache if a client cert is used, CVE-2016-5419. */
+ dest->sessionid = (dest->clientcert ? false : source->sessionid);
return TRUE;
}
@@ -173,11 +178,24 @@ void Curl_ssl_cleanup(void)
static bool ssl_prefs_check(struct Curl_easy *data)
{
/* check for CURLOPT_SSLVERSION invalid parameter value */
- if((data->set.ssl.primary.version < 0)
- || (data->set.ssl.primary.version >= CURL_SSLVERSION_LAST)) {
+ const long sslver = data->set.ssl.primary.version;
+ if((sslver < 0) || (sslver >= CURL_SSLVERSION_LAST)) {
failf(data, "Unrecognized parameter value passed via CURLOPT_SSLVERSION");
return FALSE;
}
+
+ switch(data->set.ssl.primary.version_max) {
+ case CURL_SSLVERSION_MAX_NONE:
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ break;
+
+ default:
+ if((data->set.ssl.primary.version_max >> 16) < sslver) {
+ failf(data, "CURL_SSLVERSION_MAX incompatible with CURL_SSLVERSION");
+ return FALSE;
+ }
+ }
+
return TRUE;
}
@@ -286,16 +304,16 @@ bool Curl_ssl_getsessionid(struct connectdata *conn,
const bool isProxy = CONNECT_PROXY_SSL();
struct ssl_primary_config * const ssl_config = isProxy ?
- &conn->proxy_ssl_config :
- &conn->ssl_config;
+ &conn->proxy_ssl_config :
+ &conn->ssl_config;
const char * const name = isProxy ? conn->http_proxy.host.name :
- conn->host.name;
+ conn->host.name;
int port = isProxy ? (int)conn->port : conn->remote_port;
*ssl_sessionid = NULL;
- DEBUGASSERT(data->set.general_ssl.sessionid);
+ DEBUGASSERT(SSL_SET_OPTION(primary.sessionid));
- if(!data->set.general_ssl.sessionid)
+ if(!SSL_SET_OPTION(primary.sessionid))
/* session ID re-use is disabled */
return TRUE;
@@ -394,10 +412,10 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
long *general_age;
const bool isProxy = CONNECT_PROXY_SSL();
struct ssl_primary_config * const ssl_config = isProxy ?
- &conn->proxy_ssl_config :
- &conn->ssl_config;
+ &conn->proxy_ssl_config :
+ &conn->ssl_config;
- DEBUGASSERT(data->set.general_ssl.sessionid);
+ DEBUGASSERT(SSL_SET_OPTION(primary.sessionid));
clone_host = strdup(isProxy ? conn->http_proxy.host.name : conn->host.name);
if(!clone_host)
@@ -447,7 +465,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
store->sessionid = ssl_sessionid;
store->idsize = idsize;
store->age = *general_age; /* set current age */
- /* free it if there's one already present */
+ /* free it if there's one already present */
free(store->name);
free(store->conn_to_host);
store->name = clone_host; /* clone host name */
@@ -484,9 +502,9 @@ void Curl_ssl_close_all(struct Curl_easy *data)
curlssl_close_all(data);
}
-#if defined(USE_SSLEAY) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
- defined(USE_DARWINSSL) || defined(USE_NSS)
-/* This function is for OpenSSL, GnuTLS, darwinssl, and schannel only. */
+#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
+ defined(USE_DARWINSSL) || defined(USE_POLARSSL) || defined(USE_NSS) || \
+ defined(USE_MBEDTLS)
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
int numsocks)
{
@@ -500,7 +518,7 @@ int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_WRITESOCK(0);
}
- else if(connssl->connecting_state == ssl_connect_2_reading) {
+ if(connssl->connecting_state == ssl_connect_2_reading) {
/* read mode */
socks[0] = conn->sock[FIRSTSOCKET];
return GETSOCK_READSOCK(0);
@@ -510,15 +528,15 @@ 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,
+ int numsocks)
{
(void)conn;
(void)socks;
(void)numsocks;
return GETSOCK_BLANK;
}
-/* USE_SSLEAY || USE_GNUTLS || USE_SCHANNEL || USE_DARWINSSL || USE_NSS */
+/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_DARWINSSL || USE_NSS */
#endif
void Curl_ssl_close(struct connectdata *conn, int sockindex)
@@ -703,12 +721,7 @@ CURLcode Curl_ssl_random(struct Curl_easy *data,
unsigned char *entropy,
size_t length)
{
- int rc = curlssl_random(data, entropy, length);
- if(rc) {
- failf(data, "PRNG seeding failed");
- return CURLE_FAILED_INIT; /* possibly weird return code */
- }
- return CURLE_OK;
+ return curlssl_random(data, entropy, length);
}
/*
diff --git a/lib/warnless.c b/lib/warnless.c
index 0c4472e4..fb085c86 100644
--- a/lib/warnless.c
+++ b/lib/warnless.c
@@ -183,12 +183,15 @@ curl_off_t curlx_uztoso(size_t uznum)
#ifdef __INTEL_COMPILER
# pragma warning(push)
# pragma warning(disable:810) /* conversion may lose significant bits */
+#elif defined(_MSC_VER)
+# pragma warning(push)
+# pragma warning(disable:4310) /* cast truncates constant value */
#endif
DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT);
return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT);
-#ifdef __INTEL_COMPILER
+#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
# pragma warning(pop)
#endif
}
diff --git a/lib/wildcard.c b/lib/wildcard.c
index dbbe45f6..af45c79b 100644
--- a/lib/wildcard.c
+++ b/lib/wildcard.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -32,13 +32,9 @@
CURLcode Curl_wildcard_init(struct WildcardData *wc)
{
- DEBUGASSERT(wc->filelist == NULL);
- /* now allocate only wc->filelist, everything else
- will be allocated if it is needed. */
- wc->filelist = Curl_llist_alloc(Curl_fileinfo_dtor);
- if(!wc->filelist) {;
- return CURLE_OUT_OF_MEMORY;
- }
+ Curl_llist_init(&wc->filelist, Curl_fileinfo_dtor);
+ wc->state = CURLWC_INIT;
+
return CURLE_OK;
}
@@ -54,10 +50,8 @@ void Curl_wildcard_dtor(struct WildcardData *wc)
}
DEBUGASSERT(wc->tmp == NULL);
- if(wc->filelist) {
- Curl_llist_destroy(wc->filelist, NULL);
- wc->filelist = NULL;
- }
+ Curl_llist_destroy(&wc->filelist, NULL);
+
free(wc->path);
wc->path = NULL;
diff --git a/lib/wildcard.h b/lib/wildcard.h
index 7f61cd17..8a5e4b76 100644
--- a/lib/wildcard.h
+++ b/lib/wildcard.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 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
@@ -24,9 +24,12 @@
#include <curl/curl.h>
+#include "llist.h"
+
/* list of wildcard process states */
typedef enum {
- CURLWC_INIT = 0,
+ CURLWC_CLEAR = 0,
+ CURLWC_INIT = 1,
CURLWC_MATCHING, /* library is trying to get list of addresses for
downloading */
CURLWC_DOWNLOADING,
@@ -44,7 +47,7 @@ struct WildcardData {
curl_wildcard_states state;
char *path; /* path to the directory, where we trying wildcard-match */
char *pattern; /* wildcard pattern */
- struct curl_llist *filelist; /* llist with struct Curl_fileinfo */
+ struct curl_llist filelist; /* llist with struct Curl_fileinfo */
void *tmp; /* pointer to protocol specific temporary data */
curl_wildcard_tmp_dtor tmp_dtor;
void *customptr; /* for CURLOPT_CHUNK_DATA pointer */
diff --git a/lib/x509asn1.c b/lib/x509asn1.c
index c4bc7c1f..bba20233 100644
--- a/lib/x509asn1.c
+++ b/lib/x509asn1.c
@@ -466,6 +466,7 @@ static const char *GTime2str(const char *beg, const char *end)
break;
case 2:
sec1 = fracp[-2];
+ /* FALLTHROUGH */
case 1:
sec2 = fracp[-1];
break;
diff --git a/m4/ax_code_coverage.m4 b/m4/ax_code_coverage.m4
new file mode 100644
index 00000000..6484f033
--- /dev/null
+++ b/m4/ax_code_coverage.m4
@@ -0,0 +1,264 @@
+# ===========================================================================
+# 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])])
+])
diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4
index 3219baf6..3c87efa0 100644
--- a/m4/curl-compilers.m4
+++ b/m4/curl-compilers.m4
@@ -84,7 +84,16 @@ AC_DEFUN([CURL_CHECK_COMPILER_CLANG], [
if test "$curl_cv_have_def___clang__" = "yes"; then
AC_MSG_RESULT([yes])
compiler_id="CLANG"
- clangver=`$CC -dumpversion`
+ 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
+ dnl Starting with XCode 7 / clang 3.7, Apple clang won't tell its upstream version
+ 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`
@@ -158,7 +167,7 @@ AC_DEFUN([CURL_CHECK_COMPILER_GNU_C], [
flags_dbg_all="$flags_dbg_all -gvms"
flags_dbg_yes="-g"
flags_dbg_off=""
- flags_opt_all="-O -O0 -O1 -O2 -O3 -Os"
+ flags_opt_all="-O -O0 -O1 -O2 -O3 -Os -Og -Ofast"
flags_opt_yes="-O2"
flags_opt_off="-O0"
CURL_CHECK_DEF([_WIN32], [], [silent])
@@ -577,8 +586,11 @@ AC_DEFUN([CURL_SET_COMPILER_BASIC_OPTS], [
#
GNU_C)
#
- dnl Placeholder
- tmp_CFLAGS="$tmp_CFLAGS"
+ dnl turn implicit-function-declaration warning into error,
+ dnl at least gcc 2.95 and later support this
+ if test "$compiler_num" -ge "295"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Werror-implicit-function-declaration"
+ fi
;;
#
HP_UX_C)
@@ -878,6 +890,39 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
if test "$compiler_num" -ge "101"; then
tmp_CFLAGS="$tmp_CFLAGS -Wunused"
fi
+ #
+ dnl Only clang 2.8 or later
+ if test "$compiler_num" -ge "208"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wvla"
+ fi
+ #
+ dnl Only clang 2.9 or later
+ if test "$compiler_num" -ge "209"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wshift-sign-overflow"
+ fi
+ #
+ dnl Only clang 3.2 or later
+ if test "$compiler_num" -ge "302"; then
+ case $host_os in
+ cygwin* | mingw*)
+ dnl skip missing-variable-declarations warnings for cygwin and
+ dnl mingw because the libtool wrapper executable causes them
+ ;;
+ *)
+ tmp_CFLAGS="$tmp_CFLAGS -Wmissing-variable-declarations"
+ ;;
+ esac
+ fi
+ #
+ dnl Only clang 3.6 or later
+ if test "$compiler_num" -ge "306"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ fi
+ #
+ dnl Only clang 3.9 or later
+ if test "$compiler_num" -ge "309"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+ fi
fi
;;
#
@@ -989,6 +1034,11 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
fi
fi
#
+ dnl Only gcc 4.6 or later
+ if test "$compiler_num" -ge "406"; then
+ tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ fi
+ #
fi
#
dnl Do not issue warnings for code in system include paths.
diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4
index 69b9a143..42f2a965 100644
--- a/m4/curl-confopts.m4
+++ b/m4/curl-confopts.m4
@@ -346,10 +346,6 @@ AC_DEFUN([CURL_CHECK_OPTION_RT], [
AC_MSG_RESULT([no])
;;
esac
- dnl TODO: may require mutual exclusion
- if test "$dontwant_rt" = "yes" && test "$want_thres" = "yes" ; then
- AC_MSG_ERROR([options --disable-rt and --enable-thread-resolver are mutually exclusive, at most one can be selected.])
- fi
])
@@ -520,8 +516,8 @@ AC_DEFUN([CURL_CHECK_LIB_ARES], [
fi
fi
#
- CPPFLAGS="$ares_CPPFLAGS $clean_CPPFLAGS"
- LDFLAGS="$ares_LDFLAGS $clean_LDFLAGS"
+ CPPFLAGS="$clean_CPPFLAGS $ares_CPPFLAGS"
+ LDFLAGS="$clean_LDFLAGS $ares_LDFLAGS"
LIBS="$ares_LIBS $clean_LIBS"
#
if test "$embedded_ares" != "yes"; then
diff --git a/m4/curl-override.m4 b/m4/curl-override.m4
index a35d3b2f..b27cb611 100644
--- a/m4/curl-override.m4
+++ b/m4/curl-override.m4
@@ -21,7 +21,7 @@ dnl -------------------------------------------------
dnl This is done to prevent compiler warning
dnl 'function declaration isn't a prototype'
dnl in function main. This requires at least
-dnl a c89 compiler and does not suport K&R.
+dnl a c89 compiler and does not support K&R.
m4_define([AC_LANG_PROGRAM(C)],
[$1
diff --git a/m4/xc-lt-iface.m4 b/m4/xc-lt-iface.m4
index 82aaafae..ec903f57 100644
--- a/m4/xc-lt-iface.m4
+++ b/m4/xc-lt-iface.m4
@@ -112,7 +112,7 @@ esac
# of non-PIC compiled objects will fail with following linker error
# "relocation R_X86_64_32 can not be used when making a shared object"
# is to build PIC objects even for static libraries. This behavior may
-# be overriden using 'configure --disable-shared --without-pic'.
+# be overridden using 'configure --disable-shared --without-pic'.
#
if test "x$xc_lt_want_with_pic" = 'xdefault'; then
@@ -171,7 +171,7 @@ dnl _XC_CHECK_LT_BUILD_LIBRARIES
dnl -------------------------------------------------
dnl Private macro.
dnl
-dnl Checks wether libtool shared and static libraries
+dnl Checks whether libtool shared and static libraries
dnl are finally built depending on user input, default
dnl behavior and knowledge that libtool has about host
dnl characteristics.
@@ -306,7 +306,7 @@ dnl _XC_CHECK_LT_BUILD_WITH_PIC
dnl -------------------------------------------------
dnl Private macro.
dnl
-dnl Checks wether libtool shared and static libraries
+dnl Checks whether libtool shared and static libraries
dnl would be built with PIC depending on user input,
dnl default behavior and knowledge that libtool has
dnl about host characteristics.
@@ -317,7 +317,7 @@ dnl xc_lt_build_static_with_pic
m4_define([_XC_CHECK_LT_BUILD_WITH_PIC],
[dnl
#
-# Find out wether libtool libraries would be built wit PIC
+# Find out whether libtool libraries would be built wit PIC
#
case "x$pic_mode" in @%:@ ((((
@@ -352,7 +352,7 @@ dnl _XC_CHECK_LT_BUILD_SINGLE_VERSION
dnl -------------------------------------------------
dnl Private macro.
dnl
-dnl Checks wether a libtool shared or static library
+dnl Checks whether a libtool shared or static library
dnl is finally built exclusively without the other.
dnl Results stored in following shell variables:
dnl xc_lt_build_shared_only
diff --git a/m4/zz50-xc-ovr.m4 b/m4/zz50-xc-ovr.m4
index 7e9ae592..de0c8431 100644
--- a/m4/zz50-xc-ovr.m4
+++ b/m4/zz50-xc-ovr.m4
@@ -31,7 +31,7 @@ dnl file may override those provided in other files.
dnl Override some language related macros
dnl -------------------------------------------------
dnl This is done to prevent Libtool 1.5.X from doing
-dnl unnecesary C++, Fortran and Java tests when only
+dnl unnecessary C++, Fortran and Java tests when only
dnl using C language and reduce resulting configure
dnl script by nearly 300 Kb.
diff --git a/maketgz b/maketgz
index 8d117e68..e377c9b7 100755
--- a/maketgz
+++ b/maketgz
@@ -9,7 +9,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -67,8 +67,8 @@ if test -z "$only"; then
PLIST="$PLIST$ext"
fi
-# requires a date command that knows -u for UTC time zone
-datestamp=`LC_TIME=C date -u`
+# requires a date command that knows + for format
+datestamp=`date +"%F"`
# Replace version number in header file:
sed -i -e 's/^#define LIBCURL_VERSION .*/#define LIBCURL_VERSION "'$libversion'"/g' \
@@ -90,14 +90,6 @@ if test -n "$only"; then
exit;
fi
-# Generate VC7, VC8, VC9, VC10, VC11, VC12 and VC14 versions from the VC6
-# Makefile versions
-for ver in vc7 vc8 vc9 vc10 vc11 vc12 vc14; do
- make -f Makefile.dist $ver
- mv src/Makefile.$ver src/Makefile.$ver.dist
- mv lib/Makefile.$ver lib/Makefile.$ver.dist
-done
-
echo "curl version $curlversion"
echo "libcurl version $libversion"
echo "libcurl numerical $numeric"
@@ -141,6 +133,17 @@ fi
############################################################################
#
+# Modify the man pages to display the version number and date.
+#
+
+echo "update man pages"
+./scripts/updatemanpages.pl $version
+
+# make the generated file newer than the man page
+touch src/tool_hugehelp.c
+
+############################################################################
+#
# Update the IDE files
echo "make vc-ide"
make -s vc-ide
@@ -168,12 +171,12 @@ gzip -dc $targz | bzip2 --best > $bzip2
############################################################################
#
-# Now make an lzma archive from the tar.gz original
+# Now make an xz archive from the tar.gz original
#
-lzma="curl-$version.tar.lzma"
-echo "Generating $lzma"
-gzip -dc $targz | lzma --best - > $lzma
+xz="curl-$version.tar.xz"
+echo "Generating $xz"
+gzip -dc $targz | xz -6e - > $xz
############################################################################
#
@@ -199,7 +202,7 @@ makezip
echo "------------------"
echo "maketgz report:"
echo ""
-ls -l $targz $bzip2 $zip $lzma
+ls -l $targz $bzip2 $zip $xz
echo "Run this:"
-echo "gpg -b -a $targz && gpg -b -a $bzip2 && gpg -b -a $zip && gpg -b -a $lzma"
+echo "gpg -b -a $targz && gpg -b -a $bzip2 && gpg -b -a $zip && gpg -b -a $xz"
diff --git a/packages/AIX/Makefile.in b/packages/AIX/Makefile.in
index 0c98cbe1..6133c85c 100644
--- a/packages/AIX/Makefile.in
+++ b/packages/AIX/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/AIX
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -210,6 +210,12 @@ 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@
@@ -249,6 +255,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -261,6 +269,7 @@ 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@
@@ -400,9 +409,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/AIX/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/AIX/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/AIX/Makefile
+ $(AUTOMAKE) --foreign packages/AIX/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/AIX/RPM/Makefile.in b/packages/AIX/RPM/Makefile.in
index 9fd169a7..c509f414 100644
--- a/packages/AIX/RPM/Makefile.in
+++ b/packages/AIX/RPM/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/AIX/RPM
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+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@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
@@ -339,9 +348,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/AIX/RPM/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/AIX/RPM/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/AIX/RPM/Makefile
+ $(AUTOMAKE) --foreign packages/AIX/RPM/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/AIX/RPM/curl.spec.in b/packages/AIX/RPM/curl.spec.in
index c64a0b75..634fc71a 100644
--- a/packages/AIX/RPM/curl.spec.in
+++ b/packages/AIX/RPM/curl.spec.in
@@ -36,7 +36,7 @@ Note: this version is compiled without SSL support.
%endif
%package devel
-Summary: Development files for the curl libary
+Summary: Development files for the curl library
Group: Development/Libraries
%if %{SSL} == 1
Requires: openssl >= 0.9.5
diff --git a/packages/Android/Android.mk b/packages/Android/Android.mk
index 301ab9e7..72f5e231 100644
--- a/packages/Android/Android.mk
+++ b/packages/Android/Android.mk
@@ -59,9 +59,8 @@ common_CFLAGS := -Wpointer-arith -Wwrite-strings -Wunused -Winline -Wnested-exte
include $(CLEAR_VARS)
include $(LOCAL_PATH)/lib/Makefile.inc
CURL_HEADERS := \
- curlbuild.h \
curl.h \
- curlrules.h \
+ system.h \
curlver.h \
easy.h \
mprintf.h \
diff --git a/packages/EPM/Makefile.in b/packages/EPM/Makefile.in
index eec71c17..1194a044 100644
--- a/packages/EPM/Makefile.in
+++ b/packages/EPM/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/EPM
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES = curl.list
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
diff --git a/packages/EPM/curl.list.in b/packages/EPM/curl.list.in
index 00f05fb1..3a2028b8 100644
--- a/packages/EPM/curl.list.in
+++ b/packages/EPM/curl.list.in
@@ -16,7 +16,7 @@ $datarootdir=@datarootdir@
%vendor Daniel Stenberg, <daniel@haxx.se>
%license ${srcdir}/MITX.txt
%readme ${srcdir}/README
-%description Curl is a command line tool for transfering data specified
+%description Curl is a command line tool for transferring data specified
%description with URL syntax
%version @VERSION@
%packager Giuseppe "Cowo" Corbelli <cowo@lugbs.linux.it>
diff --git a/packages/Linux/Makefile.in b/packages/Linux/Makefile.in
index 363d4309..3540b28c 100644
--- a/packages/Linux/Makefile.in
+++ b/packages/Linux/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/Linux
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -210,6 +210,12 @@ 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@
@@ -249,6 +255,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -261,6 +269,7 @@ 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@
@@ -399,9 +408,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Linux/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Linux/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Linux/Makefile
+ $(AUTOMAKE) --foreign packages/Linux/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/Linux/RPM/Makefile.in b/packages/Linux/RPM/Makefile.in
index b6f76f84..d177f6d8 100644
--- a/packages/Linux/RPM/Makefile.in
+++ b/packages/Linux/RPM/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/Linux/RPM
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+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@)
@@ -151,6 +151,12 @@ 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@
@@ -190,6 +196,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -202,6 +210,7 @@ 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@
@@ -340,9 +349,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Linux/RPM/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Linux/RPM/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Linux/RPM/Makefile
+ $(AUTOMAKE) --foreign packages/Linux/RPM/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/Makefile.in b/packages/Makefile.in
index 77a00842..908082f2 100644
--- a/packages/Makefile.in
+++ b/packages/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -210,6 +210,12 @@ 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@
@@ -249,6 +255,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -261,6 +269,7 @@ 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@
@@ -431,9 +440,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Makefile
+ $(AUTOMAKE) --foreign packages/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/OS400/README.OS400 b/packages/OS400/README.OS400
index 5efad0f6..552a3cb7 100644
--- a/packages/OS400/README.OS400
+++ b/packages/OS400/README.OS400
@@ -63,6 +63,7 @@ designer. CCSID 0 can be used to select the current job's CCSID.
_ curl_easy_setopt_ccsid()
Variable arguments are a string pointer and a CCSID (unsigned int) for
options:
+ CURLOPT_ABSTRACT_UNIX_SOCKET
CURLOPT_CAINFO
CURLOPT_CAPATH
CURLOPT_COOKIE
@@ -90,6 +91,7 @@ options:
CURLOPT_NOPROXY
CURLOPT_PASSWORD
CURLOPT_PINNEDPUBLICKEY
+ CURLOPT_PRE_PROXY
CURLOPT_PROXY
CURLOPT_PROXYPASSWORD
CURLOPT_PROXYUSERNAME
@@ -116,7 +118,6 @@ options:
CURLOPT_RTSP_TRANSPORT
CURLOPT_SERVICE_NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE
- CURLOPT_SOCKS_PROXY
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
CURLOPT_SSH_KNOWNHOSTS
CURLOPT_SSH_PRIVATE_KEYFILE
@@ -275,7 +276,7 @@ _ CURL.INC member in file H. This defines everything needed by an ILE/RPG
program using libcurl.
_ LIBxxx modules and programs. Although the test environment is not supported
on OS/400, the libcurl test programs are compiled for manual tests.
-_ IFS directory /curl/include/curl containg the C header files for IFS source
+_ IFS directory /curl/include/curl containing the C header files for IFS source
C/C++ compilation and curl.inc.rpgle for IFS source ILE/RPG compilation.
diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c
index b1c12443..de2c9cc0 100644
--- a/packages/OS400/ccsidcurl.c
+++ b/packages/OS400/ccsidcurl.c
@@ -797,7 +797,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
unsigned int contentccsid;
unsigned int nameccsid;
- /* A single curl_formadd() call cannot be splitted in several calls to deal
+ /* A single curl_formadd() call cannot be split in several calls to deal
with all parameters: the original parameters are thus copied to a local
curl_forms array and converted to ASCII when needed.
CURLFORM_PTRNAME is processed as if it were CURLFORM_COPYNAME.
@@ -1135,6 +1135,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
switch (tag) {
+ case CURLOPT_ABSTRACT_UNIX_SOCKET:
case CURLOPT_CAINFO:
case CURLOPT_CAPATH:
case CURLOPT_COOKIE:
@@ -1161,6 +1162,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
case CURLOPT_NOPROXY:
case CURLOPT_PASSWORD:
case CURLOPT_PINNEDPUBLICKEY:
+ case CURLOPT_PRE_PROXY:
case CURLOPT_PROXY:
case CURLOPT_PROXYPASSWORD:
case CURLOPT_PROXYUSERNAME:
@@ -1187,7 +1189,6 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
case CURLOPT_RTSP_TRANSPORT:
case CURLOPT_SERVICE_NAME:
case CURLOPT_SOCKS5_GSSAPI_SERVICE:
- case CURLOPT_SOCKS_PROXY:
case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
case CURLOPT_SSH_KNOWNHOSTS:
case CURLOPT_SSH_PRIVATE_KEYFILE:
diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in
index a3ed8378..e4d2d30c 100644
--- a/packages/OS400/curl.inc.in
+++ b/packages/OS400/curl.inc.in
@@ -262,6 +262,16 @@
d c 6
d CURL_SSLVERSION_TLSv1_3...
d c 7
+ d CURL_SSLVERSION_MAX_DEFAULT...
+ d c X'00010000'
+ d CURL_SSLVERSION_MAX_TLSv1_0...
+ d c X'00040000'
+ d CURL_SSLVERSION_MAX_TLSv1_1...
+ d c X'00050000'
+ d CURL_SSLVERSION_MAX_TLSv1_2...
+ d c X'00060000'
+ d CURL_SSLVERSION_MAX_TLSv1_3...
+ d c X'00070000'
*
d CURL_TLSAUTH_NONE...
d c 0
@@ -1294,12 +1304,14 @@
d c 10260
d CURLOPT_PROXY_SSL_OPTIONS...
d c 00261
- d CURLOPT_SOCKS_PROXY...
+ d CURLOPT_PRE_PROXY...
d c 10262
- d CURLOPT_SOCKS_PROXYTYPE...
- d c 00263
d CURLOPT_PROXY_PINNEDPUBLICKEY...
+ d c 10263
+ d CURLOPT_ABSTRACT_UNIX_SOCKET...
d c 10264
+ d CURLOPT_SUPPRESS_CONNECT_HEADERS...
+ d c 00265
*
/if not defined(CURL_NO_OLDIES)
d CURLOPT_FILE c 10001
diff --git a/packages/OS400/make-include.sh b/packages/OS400/make-include.sh
index ad72cf4a..3c50d2d5 100644
--- a/packages/OS400/make-include.sh
+++ b/packages/OS400/make-include.sh
@@ -8,15 +8,6 @@ SCRIPTDIR=`dirname "${0}"`
cd "${TOPDIR}/include"
-# Produce the curlbuild.h header file if not yet in distribution (CVS).
-
-if action_needed curl/curlbuild.h
-then if action_needed curl/curlbuild.h curl/curlbuild.h.dist
- then cp -p curl/curlbuild.h.dist curl/curlbuild.h
- fi
-fi
-
-
# Create the OS/400 source program file for the header files.
SRCPF="${LIBIFSNAME}/H.FILE"
diff --git a/packages/OS400/os400sys.c b/packages/OS400/os400sys.c
index 89837bdc..8ae635e4 100644
--- a/packages/OS400/os400sys.c
+++ b/packages/OS400/os400sys.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,7 +23,7 @@
/* OS/400 additional support. */
-#include "curlbuild.h"
+#include <curl/curl.h>
#include "config-os400.h" /* Not curl_setup.h: we only need some defines. */
#include <sys/types.h>
diff --git a/packages/Solaris/Makefile.in b/packages/Solaris/Makefile.in
index 29ff622c..3ef676e5 100644
--- a/packages/Solaris/Makefile.in
+++ b/packages/Solaris/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -92,7 +92,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/Solaris
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -113,8 +114,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -153,6 +153,12 @@ 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@
@@ -192,6 +198,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -204,6 +212,7 @@ 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@
@@ -346,9 +355,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Solaris/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Solaris/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Solaris/Makefile
+ $(AUTOMAKE) --foreign packages/Solaris/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/Symbian/readme.txt b/packages/Symbian/readme.txt
index 57b899f9..d6312fbe 100644
--- a/packages/Symbian/readme.txt
+++ b/packages/Symbian/readme.txt
@@ -70,7 +70,7 @@ P.I.P.S. causes a USER:87 panic if certain timeouts much longer than
half an hour are selected.
LDAP, SCP or SFTP methods are not supported due to lack of support for
-the dependent libaries on Symbian.
+the dependent libraries on Symbian.
gzip and deflate decompression is supported when the appropriate macro
is uncommented in the libcurl.mmp file.
diff --git a/packages/Win32/Makefile.in b/packages/Win32/Makefile.in
index 2a701ca0..489551b4 100644
--- a/packages/Win32/Makefile.in
+++ b/packages/Win32/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/Win32
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -210,6 +210,12 @@ 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@
@@ -249,6 +255,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -261,6 +269,7 @@ 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@
@@ -400,9 +409,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Win32/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Win32/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Win32/Makefile
+ $(AUTOMAKE) --foreign packages/Win32/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/Win32/README b/packages/Win32/README
index eb5d0a6a..b37b5753 100644
--- a/packages/Win32/README
+++ b/packages/Win32/README
@@ -20,7 +20,7 @@ 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 implicitely assumed that all of the binary files (curl.exe, libcurl.a,
+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
diff --git a/packages/Win32/cygwin/Makefile.in b/packages/Win32/cygwin/Makefile.in
index 3ec4369e..8d3c083b 100644
--- a/packages/Win32/cygwin/Makefile.in
+++ b/packages/Win32/cygwin/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/Win32/cygwin
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
@@ -356,9 +365,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Win32/cygwin/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Win32/cygwin/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/Win32/cygwin/Makefile
+ $(AUTOMAKE) --foreign packages/Win32/cygwin/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/Win32/cygwin/README b/packages/Win32/cygwin/README
index 60bb5e10..9a61341d 100644
--- a/packages/Win32/cygwin/README
+++ b/packages/Win32/cygwin/README
@@ -40,7 +40,7 @@ Build Instructions (to recompile from the cygwin source tarball):
(**) 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:
- http://mail.gnu.org/pipermail/libtool/2001-September/005549.html
+ 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
diff --git a/packages/vms/Makefile.in b/packages/vms/Makefile.in
index fad423c9..e2a4bdc5 100644
--- a/packages/vms/Makefile.in
+++ b/packages/vms/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = packages/vms
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
@@ -375,9 +384,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/vms/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/vms/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu packages/vms/Makefile
+ $(AUTOMAKE) --foreign packages/vms/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/packages/vms/clean_gnv_curl.com b/packages/vms/clean_gnv_curl.com
index 24ecb11e..67b9d9db 100644
--- a/packages/vms/clean_gnv_curl.com
+++ b/packages/vms/clean_gnv_curl.com
@@ -11,7 +11,7 @@ $!
$! This should be run with no parameters after the gnv_curl_configure.sh
$! script is run.
$!
-$! Paramter P1: REALCLEAN
+$! Parameter P1: REALCLEAN
$! This removes all build products and brings the environment back to
$! the point where the gnv_curl_configure.sh procedure needs to be run again.
$!
@@ -105,9 +105,6 @@ $!
$ file = "lcl_root:[...]*.lai"
$ if f$search(file) .nes. "" then delete 'file';*
$!
-$ file = "lcl_root:[.include.curl]curlbuild.h_old"
-$ if f$search(file) .nes. "" then delete 'file';*
-$!
$ file = "lcl_root:[.packages.vms]curl-*_original_src.bck"
$ if f$search(file) .nes. "" then delete 'file';*
$!
@@ -166,9 +163,6 @@ $!
$ file = "lcl_root:[]config.h"
$ if f$search(file) .nes. "" then delete 'file';*
$!
-$ file = "lcl_root:[.include.curl]curlbuild.h"
-$ if f$search(file) .nes. "" then delete 'file';*
-$!
$ file = "lcl_root:[.src]config.h"
$ if f$search(file) .nes. "" then delete 'file';*
$!
diff --git a/packages/vms/curl_gnv_build_steps.txt b/packages/vms/curl_gnv_build_steps.txt
index 83534c00..3420aae7 100644
--- a/packages/vms/curl_gnv_build_steps.txt
+++ b/packages/vms/curl_gnv_build_steps.txt
@@ -235,7 +235,7 @@ branding the PCSI kit based on who is making the kit.
Since at this time curl does not need this alias procedure, the steps
to automatically build it are not included here.
- While newer versions of PCSI can support ODS-5 filenames, not all verions
+ While newer versions of PCSI can support ODS-5 filenames, not all versions
of PCSI on systems that have ODS-5 filenames do. So as a post install
step, the PCSI kit built by these steps does a rename to the correct
case as a post install step.
diff --git a/packages/vms/generate_vax_transfer.com b/packages/vms/generate_vax_transfer.com
index 115db8a8..92391f92 100644
--- a/packages/vms/generate_vax_transfer.com
+++ b/packages/vms/generate_vax_transfer.com
@@ -219,7 +219,7 @@ $deck
; The first for upper case which matches the tradition method of generating
; VAX transfer vectors.
;
-; The second is the exact case for compatibilty with open source C programs
+; The second is the exact case for compatibility with open source C programs
; that expect exact case symbols in images. These are separated because a
; previous kit had only upper case symbols.
;
diff --git a/packages/vms/gnv_link_curl.com b/packages/vms/gnv_link_curl.com
index add4be95..64b0aa87 100644
--- a/packages/vms/gnv_link_curl.com
+++ b/packages/vms/gnv_link_curl.com
@@ -262,7 +262,7 @@ version or a compatible later version.
For Alpha and IA64 platforms, see the url below to register to get the
download URL. The kit will be HP 1.4-467 or later.
- http://h71000.www7.hp.com/openvms/products/ssl/ssl.html
+ https://h41379.www4.hpe.com/openvms/products/ssl/ssl.html
For VAX, use the same registration, but remove the kit name from any of the
download URLs provided and put in CPQ-VAXVMS-SSL-V0101-B-1.PCSI-DCX_VAXEXE
diff --git a/packages/vms/pcsi_gnv_curl_file_list.txt b/packages/vms/pcsi_gnv_curl_file_list.txt
index ab5b633d..07539b2c 100644
--- a/packages/vms/pcsi_gnv_curl_file_list.txt
+++ b/packages/vms/pcsi_gnv_curl_file_list.txt
@@ -58,8 +58,7 @@
[gnv.usr.bin]curl-config.
[gnv.usr.bin]gnv$curl.exe
[gnv.usr.include.curl]curl.h
-[gnv.usr.include.curl]curlbuild.h
-[gnv.usr.include.curl]curlrules.h
+[gnv.usr.include.curl]system.h
[gnv.usr.include.curl]curlver.h
[gnv.usr.include.curl]easy.h
[gnv.usr.include.curl]mprintf.h
diff --git a/packages/vms/readme b/packages/vms/readme
index 5f116a55..ddfac747 100644
--- a/packages/vms/readme
+++ b/packages/vms/readme
@@ -218,7 +218,7 @@ allow interrupted downloads to be continued.
The libcurl file module still does not understand VMS file types and requires
-the input files to be in STREAM_LF to work propery.
+the input files to be in STREAM_LF to work property.
The test suites are not supported as of 7.11.0.
diff --git a/packages/vms/stage_curl_install.com b/packages/vms/stage_curl_install.com
index 0dccdd6a..84540d73 100644
--- a/packages/vms/stage_curl_install.com
+++ b/packages/vms/stage_curl_install.com
@@ -11,8 +11,6 @@ $! [usr.bin]curl-config.
$! [usr.lib]gnv$libcurl.exe
$! [usr.bin]curl. hard link for [usr.bin]gnv$curl.exe
$! [usr.include.curl]curl.h
-$! [usr.include.curl]curlbuild.h
-$! [usr.include.curl]curlrules.h
$! [usr.include.curl]curlver.h
$! [usr.include.curl]easy.h
$! [usr.include.curl]mprintf.h
@@ -132,10 +130,8 @@ $!
$ if remove_files .eq. 0
$ then
$ copy [--.include.curl]curl.h 'new_gnu'[usr.include.curl]curl.h
-$ copy [--.include.curl]curlbuild.h -
- 'new_gnu'[usr.include.curl]curlbuild.h
-$ copy [--.include.curl]curlrules.h -
- 'new_gnu'[usr.include.curl]curlrules.h
+$ copy [--.include.curl]system.h -
+ 'new_gnu'[usr.include.curl]system.h
$ copy [--.include.curl]curlver.h -
'new_gnu'[usr.include.curl]curlver.h
$ copy [--.include.curl]easy.h -
diff --git a/projects/Windows/VC10/src/curl.vcxproj b/projects/Windows/VC10/src/curl.vcxproj
index 7f7da007..3011e782 100644
--- a/projects/Windows/VC10/src/curl.vcxproj
+++ b/projects/Windows/VC10/src/curl.vcxproj
@@ -2667,7 +2667,6 @@
<ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
- <ClCompile Include="..\..\..\..\src\tool_writeenv.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
@@ -2717,7 +2716,6 @@
<ClInclude Include="..\..\..\..\src\tool_util.h" />
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
- <ClInclude Include="..\..\..\..\src\tool_writeenv.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
diff --git a/projects/Windows/VC11/src/curl.vcxproj b/projects/Windows/VC11/src/curl.vcxproj
index bd575331..a303ea53 100644
--- a/projects/Windows/VC11/src/curl.vcxproj
+++ b/projects/Windows/VC11/src/curl.vcxproj
@@ -2723,7 +2723,6 @@
<ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
- <ClCompile Include="..\..\..\..\src\tool_writeenv.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
@@ -2773,7 +2772,6 @@
<ClInclude Include="..\..\..\..\src\tool_util.h" />
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
- <ClInclude Include="..\..\..\..\src\tool_writeenv.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
diff --git a/projects/Windows/VC12/src/curl.vcxproj b/projects/Windows/VC12/src/curl.vcxproj
index 7ab96634..e2475ef2 100644
--- a/projects/Windows/VC12/src/curl.vcxproj
+++ b/projects/Windows/VC12/src/curl.vcxproj
@@ -2723,7 +2723,6 @@
<ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
- <ClCompile Include="..\..\..\..\src\tool_writeenv.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
@@ -2773,7 +2772,6 @@
<ClInclude Include="..\..\..\..\src\tool_util.h" />
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
- <ClInclude Include="..\..\..\..\src\tool_writeenv.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
diff --git a/projects/Windows/VC14/src/curl.vcxproj b/projects/Windows/VC14/src/curl.vcxproj
index 6960a7b1..02d91880 100644
--- a/projects/Windows/VC14/src/curl.vcxproj
+++ b/projects/Windows/VC14/src/curl.vcxproj
@@ -2723,7 +2723,6 @@
<ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
- <ClCompile Include="..\..\..\..\src\tool_writeenv.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
@@ -2773,7 +2772,6 @@
<ClInclude Include="..\..\..\..\src\tool_util.h" />
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
- <ClInclude Include="..\..\..\..\src\tool_writeenv.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
diff --git a/projects/Windows/VC6/src/curl.dsp b/projects/Windows/VC6/src/curl.dsp
index bdd7b944..49655873 100644
--- a/projects/Windows/VC6/src/curl.dsp
+++ b/projects/Windows/VC6/src/curl.dsp
@@ -839,10 +839,6 @@ SOURCE=..\..\..\..\src\tool_vms.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_writeenv.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_writeout.c
# End Source File
# Begin Source File
@@ -1035,10 +1031,6 @@ SOURCE=..\..\..\..\src\tool_vms.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\src\tool_writeenv.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\src\tool_writeout.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC7.1/src/curl.vcproj b/projects/Windows/VC7.1/src/curl.vcproj
index b9aeca79..524fe70d 100644
--- a/projects/Windows/VC7.1/src/curl.vcproj
+++ b/projects/Windows/VC7.1/src/curl.vcproj
@@ -1482,9 +1482,6 @@
RelativePath="..\..\..\..\src\tool_vms.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.c">
</File>
<File
@@ -1630,9 +1627,6 @@
RelativePath="..\..\..\..\src\tool_vms.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.h">
</File>
<File
diff --git a/projects/Windows/VC7/src/curl.vcproj b/projects/Windows/VC7/src/curl.vcproj
index 4975ac59..2ca82c60 100644
--- a/projects/Windows/VC7/src/curl.vcproj
+++ b/projects/Windows/VC7/src/curl.vcproj
@@ -1336,9 +1336,6 @@
RelativePath="..\..\..\..\src\tool_vms.c">
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.c">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.c">
</File>
<File
@@ -1484,9 +1481,6 @@
RelativePath="..\..\..\..\src\tool_vms.h">
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.h">
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.h">
</File>
<File
diff --git a/projects/Windows/VC8/src/curl.vcproj b/projects/Windows/VC8/src/curl.vcproj
index 800ad648..8248ce85 100644
--- a/projects/Windows/VC8/src/curl.vcproj
+++ b/projects/Windows/VC8/src/curl.vcproj
@@ -4241,10 +4241,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.c"
>
</File>
@@ -4437,10 +4433,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.h"
>
</File>
diff --git a/projects/Windows/VC9/src/curl.vcproj b/projects/Windows/VC9/src/curl.vcproj
index acd81663..51a3b51c 100644
--- a/projects/Windows/VC9/src/curl.vcproj
+++ b/projects/Windows/VC9/src/curl.vcproj
@@ -4098,10 +4098,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.c"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.c"
>
</File>
@@ -4294,10 +4290,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\src\tool_writeenv.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\src\tool_writeout.h"
>
</File>
diff --git a/projects/checksrc.bat b/projects/checksrc.bat
index 5c83aabf..3c38f50e 100644
--- a/projects/checksrc.bat
+++ b/projects/checksrc.bat
@@ -104,7 +104,7 @@ rem ***************************************************************************
rem Check the lib directory
if exist %SRC_DIR%\lib (
for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib" "%%i"
- for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib" -Wcurl_config.h.cmake "%%i"
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib" -Wcurl_config.h.cmake -Wcurl_config.h.in -Wcurl_config.h "%%i"
)
rem Check the lib\vauth directory
diff --git a/projects/generate.bat b/projects/generate.bat
new file mode 100644
index 00000000..fbe3a923
--- /dev/null
+++ b/projects/generate.bat
@@ -0,0 +1,439 @@
+@echo off
+rem ***************************************************************************
+rem * _ _ ____ _
+rem * Project ___| | | | _ \| |
+rem * / __| | | | |_) | |
+rem * | (__| |_| | _ <| |___
+rem * \___|\___/|_| \_\_____|
+rem *
+rem * Copyright (C) 2014 - 2015, 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
+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 ***************************************************************************
+
+:begin
+ rem Check we are running on a Windows NT derived OS
+ if not "%OS%" == "Windows_NT" goto nodos
+
+ rem Set our variables
+ setlocal ENABLEEXTENSIONS
+ set VERSION=ALL
+ set MODE=GENERATE
+
+ rem Check we are not running on a network drive
+ if "%~d0."=="\\." goto nonetdrv
+
+ rem Switch to this batch file's directory
+ cd /d "%~0\.." 1>NUL 2>&1
+
+ rem Check we are running from a curl git repository
+ if not exist ..\GIT-INFO goto norepo
+
+:parseArgs
+ if "%~1" == "" goto start
+
+ if /i "%~1" == "pre" (
+ set VERSION=PRE
+ ) else if /i "%~1" == "vc6" (
+ set VERSION=VC6
+ ) else if /i "%~1" == "vc7" (
+ set VERSION=VC7
+ ) else if /i "%~1" == "vc7.1" (
+ set VERSION=VC7.1
+ ) else if /i "%~1" == "vc8" (
+ set VERSION=VC8
+ ) else if /i "%~1" == "vc9" (
+ set VERSION=VC9
+ ) else if /i "%~1" == "vc10" (
+ set VERSION=VC10
+ ) else if /i "%~1" == "vc11" (
+ set VERSION=VC11
+ ) else if /i "%~1" == "vc12" (
+ set VERSION=VC12
+ ) else if /i "%~1" == "vc14" (
+ set VERSION=VC14
+ ) else if /i "%~1" == "-clean" (
+ set MODE=CLEAN
+ ) else if /i "%~1" == "-?" (
+ goto syntax
+ ) else if /i "%~1" == "-h" (
+ goto syntax
+ ) else if /i "%~1" == "-help" (
+ goto syntax
+ ) else (
+ goto unknown
+ )
+
+ shift & goto parseArgs
+
+:start
+ if exist ..\buildconf.bat (
+ if "%MODE%" == "GENERATE" (
+ call ..\buildconf
+ ) else if "%VERSION%" == "PRE" (
+ call ..\buildconf -clean
+ ) else if "%VERSION%" == "ALL" (
+ call ..\buildconf -clean
+ )
+ )
+ if "%VERSION%" == "PRE" goto success
+ if "%VERSION%" == "VC6" goto vc6
+ if "%VERSION%" == "VC7" goto vc7
+ if "%VERSION%" == "VC7.1" goto vc71
+ if "%VERSION%" == "VC8" goto vc8
+ if "%VERSION%" == "VC9" goto vc9
+ if "%VERSION%" == "VC10" goto vc10
+ if "%VERSION%" == "VC11" goto vc11
+ if "%VERSION%" == "VC12" goto vc12
+ if "%VERSION%" == "VC14" goto vc14
+
+:vc6
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC6 project files
+ call :generate dsp Windows\VC6\src\curl.tmpl Windows\VC6\src\curl.dsp
+ call :generate dsp Windows\VC6\lib\libcurl.tmpl Windows\VC6\lib\libcurl.dsp
+ ) else (
+ echo Removing VC6 project files
+ call :clean Windows\VC6\src\curl.dsp
+ call :clean Windows\VC6\lib\libcurl.dsp
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc7
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC7 project files
+ call :generate vcproj1 Windows\VC7\src\curl.tmpl Windows\VC7\src\curl.vcproj
+ call :generate vcproj1 Windows\VC7\lib\libcurl.tmpl Windows\VC7\lib\libcurl.vcproj
+ ) else (
+ echo Removing VC7 project files
+ call :clean Windows\VC7\src\curl.vcproj
+ call :clean Windows\VC7\lib\libcurl.vcproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc71
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC7.1 project files
+ call :generate vcproj1 Windows\VC7.1\src\curl.tmpl Windows\VC7.1\src\curl.vcproj
+ call :generate vcproj1 Windows\VC7.1\lib\libcurl.tmpl Windows\VC7.1\lib\libcurl.vcproj
+ ) else (
+ echo Removing VC7.1 project files
+ call :clean Windows\VC7.1\src\curl.vcproj
+ call :clean Windows\VC7.1\lib\libcurl.vcproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc8
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC8 project files
+ call :generate vcproj2 Windows\VC8\src\curl.tmpl Windows\VC8\src\curl.vcproj
+ call :generate vcproj2 Windows\VC8\lib\libcurl.tmpl Windows\VC8\lib\libcurl.vcproj
+ ) else (
+ echo Removing VC8 project files
+ call :clean Windows\VC8\src\curl.vcproj
+ call :clean Windows\VC8\lib\libcurl.vcproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc9
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC9 project files
+ call :generate vcproj2 Windows\VC9\src\curl.tmpl Windows\VC9\src\curl.vcproj
+ call :generate vcproj2 Windows\VC9\lib\libcurl.tmpl Windows\VC9\lib\libcurl.vcproj
+ ) else (
+ echo Removing VC9 project files
+ call :clean Windows\VC9\src\curl.vcproj
+ call :clean Windows\VC9\lib\libcurl.vcproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc10
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC10 project files
+ call :generate vcxproj Windows\VC10\src\curl.tmpl Windows\VC10\src\curl.vcxproj
+ call :generate vcxproj Windows\VC10\lib\libcurl.tmpl Windows\VC10\lib\libcurl.vcxproj
+ ) else (
+ echo Removing VC10 project files
+ call :clean Windows\VC10\src\curl.vcxproj
+ call :clean Windows\VC10\lib\libcurl.vcxproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc11
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC11 project files
+ call :generate vcxproj Windows\VC11\src\curl.tmpl Windows\VC11\src\curl.vcxproj
+ call :generate vcxproj Windows\VC11\lib\libcurl.tmpl Windows\VC11\lib\libcurl.vcxproj
+ ) else (
+ echo Removing VC11 project files
+ call :clean Windows\VC11\src\curl.vcxproj
+ call :clean Windows\VC11\lib\libcurl.vcxproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc12
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC12 project files
+ call :generate vcxproj Windows\VC12\src\curl.tmpl Windows\VC12\src\curl.vcxproj
+ call :generate vcxproj Windows\VC12\lib\libcurl.tmpl Windows\VC12\lib\libcurl.vcxproj
+ ) else (
+ echo Removing VC12 project files
+ call :clean Windows\VC12\src\curl.vcxproj
+ call :clean Windows\VC12\lib\libcurl.vcxproj
+ )
+
+ if not "%VERSION%" == "ALL" goto success
+
+:vc14
+ echo.
+
+ if "%MODE%" == "GENERATE" (
+ echo Generating VC14 project files
+ call :generate vcxproj Windows\VC14\src\curl.tmpl Windows\VC14\src\curl.vcxproj
+ call :generate vcxproj Windows\VC14\lib\libcurl.tmpl Windows\VC14\lib\libcurl.vcxproj
+ ) else (
+ echo Removing VC14 project files
+ call :clean Windows\VC14\src\curl.vcxproj
+ call :clean Windows\VC14\lib\libcurl.vcxproj
+ )
+
+ goto success
+
+rem Main generate function.
+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 and VC14)
+rem %2 - Input template file
+rem %3 - Output project file
+rem
+:generate
+ if not exist %2 (
+ echo.
+ echo Error: Cannot open %2
+ exit /B
+ )
+
+ if exist %3 (
+ del %3
+ )
+
+ echo * %CD%\%3
+ for /f "usebackq delims=" %%i in (`"findstr /n ^^ %2"`) do (
+ set "var=%%i"
+ setlocal enabledelayedexpansion
+ set "var=!var:*:=!"
+
+ if "!var!" == "CURL_SRC_C_FILES" (
+ for /f "delims=" %%c in ('dir /b ..\src\*.c') do call :element %1 src "%%c" %3
+ ) else if "!var!" == "CURL_SRC_H_FILES" (
+ for /f "delims=" %%h in ('dir /b ..\src\*.h') do call :element %1 src "%%h" %3
+ ) else if "!var!" == "CURL_SRC_RC_FILES" (
+ for /f "delims=" %%r in ('dir /b ..\src\*.rc') do call :element %1 src "%%r" %3
+ ) else if "!var!" == "CURL_SRC_X_C_FILES" (
+ call :element %1 lib "strtoofft.c" %3
+ call :element %1 lib "nonblock.c" %3
+ call :element %1 lib "warnless.c" %3
+ ) else if "!var!" == "CURL_SRC_X_H_FILES" (
+ call :element %1 lib "config-win32.h" %3
+ call :element %1 lib "curl_setup.h" %3
+ call :element %1 lib "strtoofft.h" %3
+ call :element %1 lib "nonblock.h" %3
+ call :element %1 lib "warnless.h" %3
+ ) else if "!var!" == "CURL_LIB_C_FILES" (
+ for /f "delims=" %%c in ('dir /b ..\lib\*.c') do call :element %1 lib "%%c" %3
+ ) else if "!var!" == "CURL_LIB_H_FILES" (
+ for /f "delims=" %%h in ('dir /b ..\include\curl\*.h') do call :element %1 include\curl "%%h" %3
+ for /f "delims=" %%h in ('dir /b ..\lib\*.h') do call :element %1 lib "%%h" %3
+ ) else if "!var!" == "CURL_LIB_RC_FILES" (
+ for /f "delims=" %%r in ('dir /b ..\lib\*.rc') do call :element %1 lib "%%r" %3
+ ) else if "!var!" == "CURL_LIB_VAUTH_C_FILES" (
+ 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_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" (
+ for /f "delims=" %%h in ('dir /b ..\lib\vtls\*.h') do call :element %1 lib\vtls "%%h" %3
+ ) else (
+ echo.!var!>> %3
+ )
+
+ endlocal
+ )
+ exit /B
+
+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 and VC14)
+rem %2 - Directory (src, lib, lib\vauth or lib\vtls)
+rem %3 - Source filename
+rem %4 - Output project file
+rem
+:element
+ set "SPACES= "
+ if "%2" == "lib\vauth" (
+ set "TABS= "
+ ) else if "%2" == "lib\vtls" (
+ set "TABS= "
+ ) else (
+ set "TABS= "
+ )
+
+ call :extension %3 ext
+
+ if "%1" == "dsp" (
+ echo # Begin Source File>> %4
+ echo.>> %4
+ echo SOURCE=..\..\..\..\%2\%~3>> %4
+ echo # End Source File>> %4
+ ) else if "%1" == "vcproj1" (
+ echo %TABS%^<File>> %4
+ echo %TABS% RelativePath="..\..\..\..\%2\%~3"^>>> %4
+ echo %TABS%^</File^>>> %4
+ ) else if "%1" == "vcproj2" (
+ echo %TABS%^<File>> %4
+ echo %TABS% RelativePath="..\..\..\..\%2\%~3">> %4
+ echo %TABS%^>>> %4
+ echo %TABS%^</File^>>> %4
+ ) else if "%1" == "vcxproj" (
+ if "%ext%" == "c" (
+ echo %SPACES%^<ClCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4
+ ) else if "%ext%" == "h" (
+ echo %SPACES%^<ClInclude Include=^"..\..\..\..\%2\%~3^" /^>>> %4
+ ) else if "%ext%" == "rc" (
+ echo %SPACES%^<ResourceCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4
+ )
+ )
+
+ exit /B
+
+rem Returns the extension for a given filename.
+rem
+rem %1 - The filename
+rem %2 - The return value
+rem
+:extension
+ set fname=%~1
+ set ename=
+:loop1
+ if "%fname%"=="" (
+ set %2=
+ exit /B
+ )
+
+ if not "%fname:~-1%"=="." (
+ set ename=%fname:~-1%%ename%
+ set fname=%fname:~0,-1%
+ goto loop1
+ )
+
+ set %2=%ename%
+ exit /B
+
+rem Removes the given project file.
+rem
+rem %1 - The filename
+rem
+:clean
+ echo * %CD%\%1
+
+ if exist %1 (
+ del %1
+ )
+
+ exit /B
+
+:syntax
+ rem Display the help
+ echo.
+ echo Usage: generate [what] [-clean]
+ echo.
+ echo What to generate:
+ echo.
+ echo pre - Prerequisites only
+ echo vc6 - Use Visual Studio 6
+ echo vc7 - Use Visual Studio .NET
+ echo vc7.1 - Use Visual Studio .NET 2003
+ echo vc8 - Use Visual Studio 2005
+ echo vc9 - Use Visual Studio 2008
+ echo vc10 - Use Visual Studio 2010
+ echo vc11 - Use Visual Studio 2012
+ echo vc12 - Use Visual Studio 2013
+ echo vc14 - Use Visual Studio 2015
+ echo.
+ echo -clean - Removes the project files
+ goto error
+
+:unknown
+ echo.
+ echo Error: Unknown argument '%1'
+ goto error
+
+:nodos
+ echo.
+ echo Error: Only a Windows NT based Operating System is supported
+ goto error
+
+:nonetdrv
+ echo.
+ echo Error: This batch file cannot run from a network drive
+ goto error
+
+:norepo
+ echo.
+ echo Error: This batch file should only be used from a curl git repository
+ goto error
+
+:seterr
+ rem Set the caller's errorlevel.
+ rem %1[opt]: Errorlevel as integer.
+ rem If %1 is empty the errorlevel will be set to 0.
+ rem If %1 is not empty and not an integer the errorlevel will be set to 1.
+ setlocal
+ set EXITCODE=%~1
+ if not defined EXITCODE set EXITCODE=0
+ echo %EXITCODE%|findstr /r "[^0-9\-]" 1>NUL 2>&1
+ if %ERRORLEVEL% EQU 0 set EXITCODE=1
+ exit /b %EXITCODE%
+
+:error
+ if "%OS%" == "Windows_NT" endlocal
+ exit /B 1
+
+:success
+ endlocal
+ exit /B 0
diff --git a/projects/wolfssl_options.h b/projects/wolfssl_options.h
new file mode 100644
index 00000000..f6af47ca
--- /dev/null
+++ b/projects/wolfssl_options.h
@@ -0,0 +1,224 @@
+/*
+By default wolfSSL has a very conservative configuration that can result in
+connections to servers failing due to certificate or algorithm problems.
+To remedy this issue for libcurl I've generated this options file that
+build-wolfssl will copy to the wolfSSL include directories and will result in
+maximum compatibility.
+
+These are the configure options that were used to build wolfSSL v3.11.0 in
+mingw and generate the options in this file:
+
+C_EXTRA_FLAGS="\
+ -Wno-attributes \
+ -Wno-unused-but-set-variable \
+ -DFP_MAX_BITS=16384 \
+ -DTFM_TIMING_RESISTANT \
+ -DWOLFSSL_STATIC_DH \
+ -DWOLFSSL_STATIC_RSA \
+ " \
+./configure --prefix=/usr/local \
+ --disable-jobserver \
+ --enable-aesgcm \
+ --enable-alpn \
+ --enable-certgen \
+ --enable-des3 \
+ --enable-dh \
+ --enable-dsa \
+ --enable-ecc \
+ --enable-eccshamir \
+ --enable-fastmath \
+ --enable-opensslextra \
+ --enable-ripemd \
+ --enable-sessioncerts \
+ --enable-sha512 \
+ --enable-sni \
+ --enable-sslv3 \
+ --enable-supportedcurves \
+ --enable-testcert \
+ > config.out 2>&1
+
+Two generated options HAVE_THREAD_LS and _POSIX_THREADS were removed since they
+are inapplicable for our Visual Studio build. Currently thread local storage is
+only used by the Fixed Point cache ECC which we're not enabling. However even
+if we later may decide to enable the cache it will fallback on mutexes when
+thread local storage is not available. wolfSSL is using __declspec(thread) to
+create the thread local storage and that could be a problem for LoadLibrary.
+
+Regarding the options that were added via C_EXTRA_FLAGS:
+
+FP_MAX_BITS=16384
+http://www.yassl.com/forums/topic423-cacertorgs-ca-cert-verify-failed-but-withdisablefastmath-it-works.html
+"Since root.crt uses a 4096-bit RSA key, you'll need to increase the fastmath
+buffer size. You can do this using the define:
+FP_MAX_BITS and setting it to 8192."
+
+TFM_TIMING_RESISTANT
+https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-2-building-wolfssl.html
+From section 2.4.5 Increasing Performance, USE_FAST_MATH:
+"Because the stack memory usage can be larger when using fastmath, we recommend
+defining TFM_TIMING_RESISTANT as well when using this option."
+
+WOLFSSL_STATIC_DH: Allow TLS_ECDH_ ciphers
+WOLFSSL_STATIC_RSA: Allow TLS_RSA_ ciphers
+https://github.com/wolfSSL/wolfssl/blob/v3.6.6/README.md#note-1
+Static key cipher suites are deprecated and disabled by default since v3.6.6.
+*/
+
+/* wolfssl options.h
+ * generated from configure options
+ *
+ * Copyright (C) 2006-2015 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL. (formerly known as CyaSSL)
+ *
+ */
+
+#ifndef WOLFSSL_OPTIONS_H
+#define WOLFSSL_OPTIONS_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef FP_MAX_BITS
+#define FP_MAX_BITS 16384
+
+#undef TFM_TIMING_RESISTANT
+#define TFM_TIMING_RESISTANT
+
+#undef WOLFSSL_STATIC_DH
+#define WOLFSSL_STATIC_DH
+
+#undef WOLFSSL_STATIC_RSA
+#define WOLFSSL_STATIC_RSA
+
+#undef OPENSSL_EXTRA
+#define OPENSSL_EXTRA
+
+/*
+The commented out defines below are the equivalent of --enable-tls13.
+Uncomment them to build wolfSSL with TLS 1.3 support as of v3.11.1-tls13-beta.
+This is for experimenting only, afaict TLS 1.3 support doesn't appear to be
+functioning correctly yet. https://github.com/wolfSSL/wolfssl/pull/943
+
+#undef WC_RSA_PSS
+#define WC_RSA_PSS
+
+#undef WOLFSSL_TLS13
+#define WOLFSSL_TLS13
+
+#undef HAVE_TLS_EXTENSIONS
+#define HAVE_TLS_EXTENSIONS
+
+#undef HAVE_FFDHE_2048
+#define HAVE_FFDHE_2048
+
+#undef HAVE_HKDF
+#define HAVE_HKDF
+*/
+
+#undef TFM_TIMING_RESISTANT
+#define TFM_TIMING_RESISTANT
+
+#undef ECC_TIMING_RESISTANT
+#define ECC_TIMING_RESISTANT
+
+#undef WC_RSA_BLINDING
+#define WC_RSA_BLINDING
+
+#undef HAVE_AESGCM
+#define HAVE_AESGCM
+
+#undef WOLFSSL_RIPEMD
+#define WOLFSSL_RIPEMD
+
+#undef WOLFSSL_SHA512
+#define WOLFSSL_SHA512
+
+#undef WOLFSSL_SHA384
+#define WOLFSSL_SHA384
+
+#undef SESSION_CERTS
+#define SESSION_CERTS
+
+#undef WOLFSSL_CERT_GEN
+#define WOLFSSL_CERT_GEN
+
+#undef HAVE_ECC
+#define HAVE_ECC
+
+#undef TFM_ECC256
+#define TFM_ECC256
+
+#undef ECC_SHAMIR
+#define ECC_SHAMIR
+
+#undef WOLFSSL_ALLOW_SSLV3
+#define WOLFSSL_ALLOW_SSLV3
+
+#undef NO_RC4
+#define NO_RC4
+
+#undef NO_HC128
+#define NO_HC128
+
+#undef NO_RABBIT
+#define NO_RABBIT
+
+#undef HAVE_POLY1305
+#define HAVE_POLY1305
+
+#undef HAVE_ONE_TIME_AUTH
+#define HAVE_ONE_TIME_AUTH
+
+#undef HAVE_CHACHA
+#define HAVE_CHACHA
+
+#undef HAVE_HASHDRBG
+#define HAVE_HASHDRBG
+
+#undef HAVE_TLS_EXTENSIONS
+#define HAVE_TLS_EXTENSIONS
+
+#undef HAVE_SNI
+#define HAVE_SNI
+
+#undef HAVE_TLS_EXTENSIONS
+#define HAVE_TLS_EXTENSIONS
+
+#undef HAVE_ALPN
+#define HAVE_ALPN
+
+#undef HAVE_TLS_EXTENSIONS
+#define HAVE_TLS_EXTENSIONS
+
+#undef HAVE_SUPPORTED_CURVES
+#define HAVE_SUPPORTED_CURVES
+
+#undef HAVE_EXTENDED_MASTER
+#define HAVE_EXTENDED_MASTER
+
+#undef WOLFSSL_TEST_CERT
+#define WOLFSSL_TEST_CERT
+
+#undef NO_PSK
+#define NO_PSK
+
+#undef NO_MD4
+#define NO_MD4
+
+#undef USE_FAST_MATH
+#define USE_FAST_MATH
+
+#undef WC_NO_ASYNC_THREADING
+#define WC_NO_ASYNC_THREADING
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* WOLFSSL_OPTIONS_H */
+
diff --git a/projects/wolfssl_override.props b/projects/wolfssl_override.props
new file mode 100644
index 00000000..e37d0b7a
--- /dev/null
+++ b/projects/wolfssl_override.props
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+We use this file to override some properties of the wolfSSL project files.
+
+In build-wolfssl when we call msbuild to build wolfSSL we pass in this props
+file by using the CustomAfterMicrosoftCommonTargets property.
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
+ <!--
+ Our options file wolfssl_options.h is copied by build-wolfssl to
+ $(SolutionDir)\wolfssl\options.h. It includes all the options we need
+ to build wolfSSL for compatibility. See wolfssl_options.h for more info.
+ -->
+ <ForcedIncludeFiles>$(SolutionDir)\wolfssl\options.h;%(ForcedIncludeFiles);</ForcedIncludeFiles>
+ <!--
+ Do not use the Unicode character set since their mingw config doesn't.
+ Do not use their IDE\WIN\user_settings.h since we have wolfssl_options.h.
+ -->
+ <UndefinePreprocessorDefinitions>_UNICODE;UNICODE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(UndefinePreprocessorDefinitions);</UndefinePreprocessorDefinitions>
+ </ClCompile>
+ <ResourceCompile>
+ <UndefinePreprocessorDefinitions>_UNICODE;UNICODE;%(UndefinePreprocessorDefinitions);</UndefinePreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <!--
+ The project GUID for wolfssl.vcxproj is 73973223-5EE8-41CA-8E88-1D60E89A237B.
+ Since we have are using certain options like fast math (TFM) in our options
+ file we must compile the corresponding units in wolfssl.vcxproj. If the user
+ disables such an option the unit can still be compiled it just won't be used.
+ -->
+ <ItemGroup Condition="'$(ProjectGuid)'=='{73973223-5EE8-41CA-8E88-1D60E89A237B}'">
+ <ClCompile Include="wolfcrypt\src\chacha.c" />
+ <ClCompile Include="wolfcrypt\src\chacha20_poly1305.c" />
+ <ClCompile Include="wolfcrypt\src\poly1305.c" />
+ <ClCompile Include="wolfcrypt\src\tfm.c" />
+ </ItemGroup>
+</Project>
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
index 25716412..2a55f8ae 100644
--- a/scripts/Makefile.in
+++ b/scripts/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = scripts
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
@@ -361,9 +370,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scripts/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu scripts/Makefile
+ $(AUTOMAKE) --foreign scripts/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/scripts/coverage.sh b/scripts/coverage.sh
new file mode 100755
index 00000000..86cd7a12
--- /dev/null
+++ b/scripts/coverage.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+./buildconf
+mkdir -p cvr
+cd cvr
+../configure --disable-shared --enable-debug --enable-maintainer-mode --enable-code-coverage
+make -sj
+# the regular test run
+make TFLAGS=-n test-nonflaky
+# make all allocs/file operations fail
+#make TFLAGS=-n test-torture
+# do everything event-based
+make TFLAGS=-n test-event
+lcov -d . -c -o cov.lcov
+genhtml cov.lcov --output-directory coverage --title "curl code coverage"
+tar -cjf curl-coverage.tar.bz2 coverage
diff --git a/scripts/updatemanpages.pl b/scripts/updatemanpages.pl
new file mode 100755
index 00000000..6a58dbd4
--- /dev/null
+++ b/scripts/updatemanpages.pl
@@ -0,0 +1,355 @@
+#!/usr/bin/perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 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.
+#
+###########################################################################
+
+# Update man pages.
+
+use strict;
+use warnings;
+use Tie::File;
+
+# Data from the command line.
+
+my $curlver = $ARGV[0];
+my $curldate = $ARGV[1];
+
+# Directories and extensions.
+
+my @dirlist = ("docs/", "docs/libcurl/", "docs/libcurl/opts/", "tests/");
+my @extlist = (".1", ".3");
+my @excludelist = ("mk-ca-bundle.1", "template.3");
+
+# Subroutines
+
+sub printargs{
+ # Print arguments and exit.
+
+ print "usage: updatemanpages.pl <version> <date>\n";
+ exit;
+}
+
+sub getthline{
+ # Process file looking for .TH section.
+
+ my $filename = shift;
+ my $file_handle;
+ my $file_line;
+
+ # Open the file.
+
+ open($file_handle, $filename);
+
+ # Look for the .TH section, process it into an array,
+ # modify it and write to file.
+
+ tie(my @file_data, 'Tie::File', $filename);
+ foreach my $file_data_line(@file_data) {
+ if($file_data_line =~ /^.TH/) {
+ $file_line = $file_data_line;
+ last;
+ }
+ }
+
+ # Close the file.
+
+ close($file_handle);
+ return $file_line;
+}
+
+sub extractth{
+ # Extract .TH section as an array.
+
+ my $input = shift;
+
+ # Split the line into an array.
+
+ my @tharray;
+ my $inputsize = length($input);
+ my $inputcurrent = "";
+ my $quotemode = 0;
+
+ for(my $inputseek = 0; $inputseek < $inputsize; $inputseek++) {
+
+ if(substr($input, $inputseek, 1) eq " " && $quotemode eq 0) {
+ push(@tharray, $inputcurrent);
+ $inputcurrent = "";
+ next;
+ }
+
+ $inputcurrent = $inputcurrent . substr($input, $inputseek, 1);
+
+ if(substr($input, $inputseek, 1) eq "\"") {
+ if($quotemode eq 0) {
+ $quotemode = 1;
+ }
+ else {
+ $quotemode = 0;
+ }
+ }
+ }
+
+ if($inputcurrent ne "") {
+ push(@tharray, $inputcurrent);
+ }
+
+ return @tharray;
+}
+
+sub getdate{
+ # Get the date from the .TH section.
+
+ my $filename = shift;
+ my $thline;
+ my @tharray;
+ my $date = "";
+
+ $thline = getthline($filename);
+
+ # Return nothing if there is no .TH section found.
+
+ if(!$thline || $thline eq "") {
+ return "";
+ }
+
+ @tharray = extractth($thline);
+
+ # Remove the quotes at the start and end.
+
+ $date = substr($tharray[3], 1, -1);
+ return $date;
+}
+
+sub processth{
+ # Process .TH section.
+
+ my $input = shift;
+ my $date = shift;
+
+ # Split the line into an array.
+
+ my @tharray = extractth($input);
+
+ # Alter the date.
+
+ my $itemdate = "\"";
+ $itemdate .= $date;
+ $itemdate .= "\"";
+ $tharray[3] = $itemdate;
+
+ # Alter the item version.
+
+ my $itemver = $tharray[4];
+ my $itemname = "";
+
+ for(my $itemnameseek = 1;
+ $itemnameseek < length($itemver);
+ $itemnameseek++) {
+ if(substr($itemver, $itemnameseek, 1) eq " " ||
+ substr($itemver, $itemnameseek, 1) eq "\"") {
+ last;
+ }
+ $itemname .= substr($itemver, $itemnameseek, 1);
+ }
+
+ $itemver = "\"";
+ $itemver .= $itemname;
+ $itemver .= " ";
+ $itemver .= $curlver;
+ $itemver .= "\"";
+
+ $tharray[4] = $itemver;
+
+ my $thoutput = "";
+
+ foreach my $thvalue (@tharray) {
+ $thoutput .= $thvalue;
+ $thoutput .= " ";
+ }
+ $thoutput =~ s/\s+$//;
+ $thoutput .= "\n";
+
+ # Return updated string.
+
+ return $thoutput;
+}
+
+sub processfile{
+ # Process file looking for .TH section.
+
+ my $filename = shift;
+ my $date = shift;
+ my $file_handle;
+ my $file_dist_handle;
+ my $filename_dist;
+
+ # Open a handle for the original file and a second file handle
+ # for the dist file.
+
+ $filename_dist = $filename . ".dist";
+
+ open($file_handle, $filename);
+ open($file_dist_handle, ">" . $filename_dist);
+
+ # Look for the .TH section, process it into an array,
+ # modify it and write to file.
+
+ tie(my @file_data, 'Tie::File', $filename);
+ foreach my $file_data_line (@file_data) {
+ if($file_data_line =~ /^.TH/) {
+ my $file_dist_line = processth($file_data_line, $date);
+ print $file_dist_handle $file_dist_line . "\n";
+ }
+ else {
+ print $file_dist_handle $file_data_line . "\n";
+ }
+ }
+
+ # Close the file.
+
+ close($file_handle);
+ close($file_dist_handle);
+}
+
+# Check that $curlver is set, otherwise print arguments and exit.
+
+if(!$curlver) {
+ printargs();
+}
+
+# check to see that the git command works, it requires git 2.6 something
+my $gitcheck = `git log -1 --date="format:%B %d, %Y" $dirlist[0] 2>/dev/null`;
+if(length($gitcheck) < 1) {
+ print "git version too old or $dirlist[0] is a bad argument\n";
+ exit;
+}
+
+# Look in each directory.
+
+my $dir_handle;
+
+foreach my $dirname (@dirlist) {
+ foreach my $extname (@extlist) {
+ # Go through the directory looking for files ending with
+ # the current extension.
+
+ opendir($dir_handle, $dirname);
+ my @filelist = grep(/.$extname$/i, readdir($dir_handle));
+
+ foreach my $file (@filelist) {
+ # Skip if file is in exclude list.
+
+ if(grep(/^$file$/, @excludelist)) {
+ next;
+ }
+
+ # Load the file and get the date.
+
+ my $filedate;
+
+ # Check if dist version exists and load date from that
+ # file if it does.
+
+ if(-e ($dirname . $file . ".dist")) {
+ $filedate = getdate(($dirname . $file . ".dist"));
+ }
+ else {
+ $filedate = getdate(($dirname . $file));
+ }
+
+ # Skip if value is empty.
+
+ if(!$filedate || $filedate eq "") {
+ next;
+ }
+
+ # Check the man page in the git repository.
+
+ my $repodata = `LC_TIME=C git log -1 --date="format:%B %d, %Y" \\
+ --since="$filedate" $dirname$file | grep ^Date:`;
+
+ # If there is output then update the man page
+ # with the new date/version.
+
+ # Process the file if there is output.
+
+ if($repodata) {
+ my $thisdate;
+ if(!$curldate) {
+ if($repodata =~ /^Date: +(.*)/) {
+ $thisdate = $1;
+ }
+ else {
+ print STDERR "Warning: " . ($dirname . $file) . ": found no " .
+ "date\n";
+ }
+ }
+ else {
+ $thisdate = $curldate;
+ }
+ processfile(($dirname . $file), $thisdate);
+ print $dirname . $file . " page updated to $thisdate\n";
+ }
+ }
+ closedir($dir_handle);
+ }
+}
+
+__END__
+
+=pod
+
+=head1 updatemanpages.pl
+
+Updates the man pages with the version number and optional date. If the date
+isn't provided, the last modified date from git is used.
+
+=head2 USAGE
+
+updatemanpages.pl version [date]
+
+=head3 version
+
+Specifies version (required)
+
+=head3 date
+
+Specifies date (optional)
+
+=head2 SETTINGS
+
+=head3 @dirlist
+
+Specifies the list of directories to look for files in.
+
+=head3 @extlist
+
+Specifies the list of files with extensions to process.
+
+=head3 @excludelist
+
+Specifies the list of files to not process.
+
+=head2 NOTES
+
+This script is used during maketgz.
+
+=cut
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9bbeb605..de188be6 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,7 +1,6 @@
set(EXE_NAME curl)
if(USE_MANUAL)
- find_package(Perl REQUIRED)
# Use the C locale to ensure that only ASCII characters appear in the
# embedded text. NROFF and MANOPT are set in the parent CMakeLists.txt
add_custom_command(
@@ -9,18 +8,19 @@ if(USE_MANUAL)
COMMAND ${CMAKE_COMMAND} -E echo "#include \"tool_setup.h\"" > tool_hugehelp.c
COMMAND ${CMAKE_COMMAND} -E echo "#ifndef HAVE_LIBZ" >> tool_hugehelp.c
COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT}
- "${CURL_SOURCE_DIR}/docs/curl.1" |
- "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl"
+ "${CURL_BINARY_DIR}/docs/curl.1" |
+ "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl"
"${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c
COMMAND ${CMAKE_COMMAND} -E echo "#else" >> tool_hugehelp.c
COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT}
- "${CURL_SOURCE_DIR}/docs/curl.1" |
- "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c
+ "${CURL_BINARY_DIR}/docs/curl.1" |
+ "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c
"${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c
COMMAND ${CMAKE_COMMAND} -E echo "#endif /* HAVE_LIBZ */" >> tool_hugehelp.c
DEPENDS
"${CURL_SOURCE_DIR}/docs/MANUAL"
- "${CURL_SOURCE_DIR}/docs/curl.1"
+ generate-curl.1
+ "${CURL_BINARY_DIR}/docs/curl.1"
"${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl"
"${CMAKE_CURRENT_SOURCE_DIR}/tool_hugehelp.h"
VERBATIM)
@@ -56,7 +56,7 @@ source_group("curl header files" FILES ${CURL_HFILES})
include_directories(
${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h"
${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
- ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h"
+ ${CURL_BINARY_DIR}/include # To be able to reach "curl/curl.h"
# This is needed as tool_hugehelp.c is generated in the binary dir
${CURL_SOURCE_DIR}/src # To be able to reach "tool_hugehelp.h"
)
diff --git a/src/Makefile.am b/src/Makefile.am
index 878bbfef..bfcd877f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -29,17 +29,13 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_builddir)/src is for curl's generated src/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
# $(top_srcdir)/src is for curl's src/tool_setup.h and "curl-private" files
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_builddir)/src \
-I$(top_srcdir)/lib \
@@ -47,6 +43,8 @@ AM_CPPFLAGS = -I$(top_builddir)/include/curl \
bin_PROGRAMS = curl
+SUBDIRS = ../docs
+
if USE_CPPFLAG_CURL_STATICLIB
AM_CPPFLAGS += -DCURL_STATICLIB
endif
@@ -70,7 +68,10 @@ endif
curl_LDFLAGS = @LIBMETALINK_LDFLAGS@
curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
-curl_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+
+@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
@@ -82,18 +83,18 @@ libcurltool_la_LDFLAGS = -static $(LINKFLAGS)
libcurltool_la_SOURCES = $(curl_SOURCES)
endif
-BUILT_SOURCES = tool_hugehelp.c
CLEANFILES = tool_hugehelp.c
# Use the C locale to ensure that only ASCII characters appear in the
# embedded text.
NROFF=env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script
-EXTRA_DIST = mkhelp.pl makefile.dj Makefile.vc6 Makefile.b32 \
+EXTRA_DIST = mkhelp.pl makefile.dj Makefile.b32 \
Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \
macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \
curl.rc Makefile.netware Makefile.inc Makefile.Watcom CMakeLists.txt
-MANPAGE=$(top_srcdir)/docs/curl.1
+# 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
@@ -101,10 +102,13 @@ HUGE=tool_hugehelp.c
if USE_MANUAL
# Here are the stuff to create a built-in manual
+$(MANPAGE):
+ cd $(top_builddir)/docs && $(MAKE)
+
if HAVE_LIBZ
# This generates the tool_hugehelp.c file in both uncompressed and
-# compressed formats
-$(HUGE): $(README) $(MANPAGE) mkhelp.pl
+# compressed formats.
+$(HUGE): $(MANPAGE) $(README) $(MKHELP)
echo '#include "tool_setup.h"' > $(HUGE)
echo '#ifndef HAVE_LIBZ' >> $(HUGE)
$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
@@ -113,7 +117,7 @@ $(HUGE): $(README) $(MANPAGE) mkhelp.pl
echo '#endif /* HAVE_LIBZ */' >> $(HUGE)
else # HAVE_LIBZ
# This generates the tool_hugehelp.c file uncompressed only
-$(HUGE): $(README) $(MANPAGE) mkhelp.pl
+$(HUGE): $(MANPAGE) $(README) $(MKHELP)
echo '#include "tool_setup.h"' > $(HUGE)
$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
endif
diff --git a/src/Makefile.in b/src/Makefile.in
index ef8aa68a..08d5b8a9 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -102,7 +102,8 @@ 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/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -123,8 +124,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
@@ -138,20 +138,19 @@ am__libcurltool_la_SOURCES_DIST = slist_wc.c tool_binmode.c \
tool_main.c tool_metalink.c tool_mfiles.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_writeenv.c \
- tool_writeout.c tool_xattr.c ../lib/strtoofft.c \
- ../lib/nonblock.c ../lib/warnless.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 tool_cb_wrt.h tool_cfgable.h \
- tool_convert.h tool_dirhie.h tool_doswin.h tool_easysrc.h \
- tool_formparse.h 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_mfiles.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_writeenv.h tool_writeout.h \
- tool_xattr.h
+ tool_urlglob.c tool_util.c tool_vms.c tool_writeout.c \
+ tool_xattr.c ../lib/strtoofft.c ../lib/nonblock.c \
+ ../lib/warnless.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 tool_cb_wrt.h tool_cfgable.h tool_convert.h \
+ tool_dirhie.h tool_doswin.h tool_easysrc.h tool_formparse.h \
+ 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_mfiles.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
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 \
@@ -172,8 +171,8 @@ am__objects_1 = libcurltool_la-slist_wc.lo \
libcurltool_la-tool_parsecfg.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_writeenv.lo \
- libcurltool_la-tool_writeout.lo libcurltool_la-tool_xattr.lo
+ libcurltool_la-tool_vms.lo libcurltool_la-tool_writeout.lo \
+ libcurltool_la-tool_xattr.lo
am__dirstamp = $(am__leading_dot)dirstamp
am__objects_2 = ../lib/libcurltool_la-strtoofft.lo \
../lib/libcurltool_la-nonblock.lo \
@@ -212,13 +211,17 @@ am__objects_6 = curl-slist_wc.$(OBJEXT) curl-tool_binmode.$(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_writeenv.$(OBJEXT) \
- curl-tool_writeout.$(OBJEXT) curl-tool_xattr.$(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)
am__objects_8 = $(am__objects_6) $(am__objects_7) $(am__objects_3)
am_curl_OBJECTS = $(am__objects_8)
curl_OBJECTS = $(am_curl_OBJECTS)
+@USE_EXPLICIT_LIB_DEPS_FALSE@curl_DEPENDENCIES = \
+@USE_EXPLICIT_LIB_DEPS_FALSE@ $(top_builddir)/lib/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@curl_DEPENDENCIES = \
+@USE_EXPLICIT_LIB_DEPS_TRUE@ $(top_builddir)/lib/libcurl.la
curl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(curl_LDFLAGS) $(LDFLAGS) -o $@
@@ -258,11 +261,27 @@ am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
SOURCES = $(libcurltool_la_SOURCES) $(curl_SOURCES)
DIST_SOURCES = $(am__libcurltool_la_SOURCES_DIST) $(curl_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
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
@@ -282,9 +301,35 @@ am__define_uniq_tagged_files = \
done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \
$(top_srcdir)/depcomp
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@
@@ -299,8 +344,14 @@ CC = @CC@
CCDEPMODE = @CCDEPMODE@
# This might hold -Werror
-CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
+CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@ $(CODE_COVERAGE_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@
@@ -340,6 +391,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -352,6 +405,7 @@ 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@
@@ -489,7 +543,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -510,17 +564,15 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_builddir)/src is for curl's generated src/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
# $(top_srcdir)/src is for curl's src/tool_setup.h and "curl-private" files
-AM_CPPFLAGS = -I$(top_builddir)/include/curl -I$(top_builddir)/include \
- -I$(top_srcdir)/include -I$(top_builddir)/lib \
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \
-I$(top_builddir)/src -I$(top_srcdir)/lib -I$(top_srcdir)/src \
$(am__append_1)
+SUBDIRS = ../docs
# 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.
@@ -573,7 +625,6 @@ CURL_CFILES = \
tool_urlglob.c \
tool_util.c \
tool_vms.c \
- tool_writeenv.c \
tool_writeout.c \
tool_xattr.c
@@ -618,7 +669,6 @@ CURL_HFILES = \
tool_util.h \
tool_version.h \
tool_vms.h \
- tool_writeenv.h \
tool_writeout.h \
tool_xattr.h
@@ -631,9 +681,8 @@ 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@
+curl_LDFLAGS = @LIBMETALINK_LDFLAGS@ $(CODE_COVERAGE_LDFLAGS)
curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
-curl_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
# if unit tests are enabled, build a static library to link them with
@BUILD_UNITTESTS_TRUE@noinst_LTLIBRARIES = libcurltool.la
@@ -643,19 +692,19 @@ curl_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
@BUILD_UNITTESTS_TRUE@libcurltool_la_CFLAGS =
@BUILD_UNITTESTS_TRUE@libcurltool_la_LDFLAGS = -static $(LINKFLAGS)
@BUILD_UNITTESTS_TRUE@libcurltool_la_SOURCES = $(curl_SOURCES)
-BUILT_SOURCES = tool_hugehelp.c
CLEANFILES = tool_hugehelp.c
-EXTRA_DIST = mkhelp.pl makefile.dj Makefile.vc6 Makefile.b32 \
+EXTRA_DIST = mkhelp.pl makefile.dj Makefile.b32 \
Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \
macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \
curl.rc Makefile.netware Makefile.inc Makefile.Watcom CMakeLists.txt
-MANPAGE = $(top_srcdir)/docs/curl.1
+
+# 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
-all: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) all-am
+all: all-recursive
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
@@ -826,7 +875,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_urlglob.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_util.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_vms.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeenv.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeout.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_xattr.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-slist_wc.Plo@am__quote@
@@ -866,7 +914,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_util.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_vms.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_writeenv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_writeout.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_xattr.Plo@am__quote@
@@ -1153,13 +1200,6 @@ libcurltool_la-tool_vms.lo: tool_vms.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_vms.lo `test -f 'tool_vms.c' || echo '$(srcdir)/'`tool_vms.c
-libcurltool_la-tool_writeenv.lo: tool_writeenv.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_writeenv.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_writeenv.Tpo -c -o libcurltool_la-tool_writeenv.lo `test -f 'tool_writeenv.c' || echo '$(srcdir)/'`tool_writeenv.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_writeenv.Tpo $(DEPDIR)/libcurltool_la-tool_writeenv.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_writeenv.c' object='libcurltool_la-tool_writeenv.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_writeenv.lo `test -f 'tool_writeenv.c' || echo '$(srcdir)/'`tool_writeenv.c
-
libcurltool_la-tool_writeout.lo: tool_writeout.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_writeout.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_writeout.Tpo -c -o libcurltool_la-tool_writeout.lo `test -f 'tool_writeout.c' || echo '$(srcdir)/'`tool_writeout.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_writeout.Tpo $(DEPDIR)/libcurltool_la-tool_writeout.Plo
@@ -1713,20 +1753,6 @@ curl-tool_vms.obj: tool_vms.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_vms.obj `if test -f 'tool_vms.c'; then $(CYGPATH_W) 'tool_vms.c'; else $(CYGPATH_W) '$(srcdir)/tool_vms.c'; fi`
-curl-tool_writeenv.o: tool_writeenv.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_writeenv.o -MD -MP -MF $(DEPDIR)/curl-tool_writeenv.Tpo -c -o curl-tool_writeenv.o `test -f 'tool_writeenv.c' || echo '$(srcdir)/'`tool_writeenv.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_writeenv.Tpo $(DEPDIR)/curl-tool_writeenv.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_writeenv.c' object='curl-tool_writeenv.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_writeenv.o `test -f 'tool_writeenv.c' || echo '$(srcdir)/'`tool_writeenv.c
-
-curl-tool_writeenv.obj: tool_writeenv.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_writeenv.obj -MD -MP -MF $(DEPDIR)/curl-tool_writeenv.Tpo -c -o curl-tool_writeenv.obj `if test -f 'tool_writeenv.c'; then $(CYGPATH_W) 'tool_writeenv.c'; else $(CYGPATH_W) '$(srcdir)/tool_writeenv.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_writeenv.Tpo $(DEPDIR)/curl-tool_writeenv.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tool_writeenv.c' object='curl-tool_writeenv.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_writeenv.obj `if test -f 'tool_writeenv.c'; then $(CYGPATH_W) 'tool_writeenv.c'; else $(CYGPATH_W) '$(srcdir)/tool_writeenv.c'; fi`
-
curl-tool_writeout.o: tool_writeout.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_writeout.o -MD -MP -MF $(DEPDIR)/curl-tool_writeout.Tpo -c -o curl-tool_writeout.o `test -f 'tool_writeout.c' || echo '$(srcdir)/'`tool_writeout.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_writeout.Tpo $(DEPDIR)/curl-tool_writeout.Po
@@ -1804,14 +1830,61 @@ clean-libtool:
-rm -rf .libs _libs
-rm -rf ../lib/.libs ../lib/_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-am
+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 \
@@ -1824,7 +1897,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
$$unique; \
fi; \
fi
-ctags: ctags-am
+ctags: ctags-recursive
CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
@@ -1837,7 +1910,7 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
+cscopelist: cscopelist-recursive
cscopelist-am: $(am__tagged_files)
list='$(am__tagged_files)'; \
@@ -1886,25 +1959,49 @@ distdir: $(DISTFILES)
|| 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: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) check-am
+check: check-recursive
@CURLDEBUG_FALSE@all-local:
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local
-installdirs:
+installdirs: installdirs-recursive
+installdirs-am:
for dir in "$(DESTDIR)$(bindir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
-install: $(BUILT_SOURCES)
- $(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-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-am
+installcheck: installcheck-recursive
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -1929,94 +2026,94 @@ distclean-generic:
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
- -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
+clean: clean-recursive
clean-am: clean-binPROGRAMS clean-generic clean-libtool \
clean-noinstLTLIBRARIES mostlyclean-am
-distclean: distclean-am
+distclean: distclean-recursive
-rm -rf ../lib/$(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
-dvi: dvi-am
+dvi: dvi-recursive
dvi-am:
-html: html-am
+html: html-recursive
html-am:
-info: info-am
+info: info-recursive
info-am:
install-data-am:
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
install-dvi-am:
install-exec-am: install-binPROGRAMS
-install-html: install-html-am
+install-html: install-html-recursive
install-html-am:
-install-info: install-info-am
+install-info: install-info-recursive
install-info-am:
install-man:
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
install-pdf-am:
-install-ps: install-ps-am
+install-ps: install-ps-recursive
install-ps-am:
installcheck-am:
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
-rm -rf ../lib/$(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
-pdf: pdf-am
+pdf: pdf-recursive
pdf-am:
-ps: ps-am
+ps: ps-recursive
ps-am:
uninstall-am: uninstall-binPROGRAMS
-.MAKE: all check install install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
- clean-binPROGRAMS clean-generic clean-libtool \
- clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-binPROGRAMS 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-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
+ check check-am clean clean-binPROGRAMS clean-generic \
+ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ 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-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS
.PRECIOUS: Makefile
@@ -2024,11 +2121,16 @@ 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):
+@USE_MANUAL_TRUE@ cd $(top_builddir)/docs && $(MAKE)
+
# This generates the tool_hugehelp.c file in both uncompressed and
-# compressed formats
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@$(HUGE): $(README) $(MANPAGE) mkhelp.pl
+# 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)
@@ -2036,7 +2138,7 @@ uninstall-am: uninstall-binPROGRAMS
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c $(README) >> $(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): $(README) $(MANPAGE) mkhelp.pl
+@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)
diff --git a/src/Makefile.inc b/src/Makefile.inc
index 2196ffa3..5074f8fc 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -58,7 +58,6 @@ CURL_CFILES = \
tool_urlglob.c \
tool_util.c \
tool_vms.c \
- tool_writeenv.c \
tool_writeout.c \
tool_xattr.c
@@ -103,7 +102,6 @@ CURL_HFILES = \
tool_util.h \
tool_version.h \
tool_vms.h \
- tool_writeenv.h \
tool_writeout.h \
tool_xattr.h
diff --git a/src/Makefile.m32 b/src/Makefile.m32
index 40852e57..315cd5cb 100644
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@ -89,7 +89,7 @@ LIBCARES_PATH = $(PROOT)/ares
endif
CC = $(CROSSPREFIX)gcc
-CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall
+CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall -W
CFLAGS += -fno-strict-aliasing
# comment LDFLAGS below to keep debug info
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
diff --git a/src/Makefile.vc10 b/src/Makefile.vc10
deleted file mode 100644
index 24abbdb5..00000000
--- a/src/Makefile.vc10
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC10
-## Use: nmake -f makefile.vc10 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc10 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC10 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC10
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc11 b/src/Makefile.vc11
deleted file mode 100644
index 6798b11e..00000000
--- a/src/Makefile.vc11
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC11
-## Use: nmake -f makefile.vc11 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc11 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC11 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC11
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc12 b/src/Makefile.vc12
deleted file mode 100644
index d13234a6..00000000
--- a/src/Makefile.vc12
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC12
-## Use: nmake -f makefile.vc12 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc12 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC12 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC12
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc14 b/src/Makefile.vc14
deleted file mode 100644
index 17427328..00000000
--- a/src/Makefile.vc14
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC14
-## Use: nmake -f makefile.vc14 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc14 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC14 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC14
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc6 b/src/Makefile.vc6
deleted file mode 100644
index 85828ced..00000000
--- a/src/Makefile.vc6
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC6
-## Use: nmake -f makefile.vc6 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc6 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC6 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /GZ
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC6
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc7 b/src/Makefile.vc7
deleted file mode 100644
index e872aa96..00000000
--- a/src/Makefile.vc7
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC7
-## Use: nmake -f makefile.vc6 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc6 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC7 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /GZ
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC7
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc8 b/src/Makefile.vc8
deleted file mode 100644
index e20950c8..00000000
--- a/src/Makefile.vc8
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC8
-## Use: nmake -f makefile.vc6 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc6 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC8 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib bufferoverflowu.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC8
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc9 b/src/Makefile.vc9
deleted file mode 100644
index aa0aa23e..00000000
--- a/src/Makefile.vc9
+++ /dev/null
@@ -1,550 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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.
-#
-#***************************************************************************
-
-# All files in the Makefile.vc* series are generated automatically from the
-# one made for MSVC version 6. Alas, if you want to do changes to any of the
-# files and send back to the project, edit the version six, make your diff and
-# mail curl-users.
-
-#############################################################
-#
-## Makefile for building curl.exe with MSVC9
-## Use: nmake -f makefile.vc9 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc9 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-# -------------------------------------------
-# Verify that current subdir is curl's 'src'
-# -------------------------------------------
-
-!IF ! EXIST(.\tool_main.c)
-! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
-! MESSAGE Change to curl's 'src' subdirectory, and try again.
-! ERROR See previous message.
-!ENDIF
-
-# ------------------------------------------------
-# Makefile.msvc.names provides libcurl file names
-# ------------------------------------------------
-
-!INCLUDE ..\winbuild\Makefile.msvc.names
-
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-1.0.2a
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.8
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC9 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# https://msdn.microsoft.com/windows/bb980924.aspx
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_OPENSSL
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
-WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
-
-WINSSL_CFLAGS = /DUSE_SCHANNEL
-#WINSSL_LIBS = gdi32.lib user32.lib
-
-!IFDEF USE_IDN
-WINLIBS = $(WINLIBS) normaliz.lib
-!ENDIF
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC9
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- nonblockr.obj \
- strcaser.obj \
- strtoofftr.obj \
- warnless.obj \
- slist_wc.obj \
- tool_binmoder.obj \
- tool_bnamer.obj \
- tool_cb_dbgr.obj \
- tool_cb_hdrr.obj \
- tool_cb_prgr.obj \
- tool_cb_rear.obj \
- tool_cb_seer.obj \
- tool_cb_wrtr.obj \
- tool_cfgabler.obj \
- tool_convertr.obj \
- tool_dirhier.obj \
- tool_doswinr.obj \
- tool_easysrcr.obj \
- tool_formparser.obj \
- tool_getparamr.obj \
- tool_getpassr.obj \
- tool_helpr.obj \
- tool_helpersr.obj \
- tool_homedirr.obj \
- tool_hugehelpr.obj \
- tool_libinfor.obj \
- tool_mainr.obj \
- tool_metalinkr.obj \
- tool_mfilesr.obj \
- tool_msgsr.obj \
- tool_operater.obj \
- tool_operhlpr.obj \
- tool_panykeyr.obj \
- tool_paramhlpr.obj \
- tool_parsecfgr.obj \
- tool_setoptr.obj \
- tool_sleepr.obj \
- tool_urlglobr.obj \
- tool_utilr.obj \
- tool_vmsr.obj \
- tool_writeenvr.obj \
- tool_writeoutr.obj \
- tool_xattrr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- nonblockd.obj \
- strcased.obj \
- strtoofftd.obj \
- warnlessd.obj \
- slist_wcd.obj \
- tool_binmoded.obj \
- tool_bnamed.obj \
- tool_cb_dbgd.obj \
- tool_cb_hdrd.obj \
- tool_cb_prgd.obj \
- tool_cb_read.obj \
- tool_cb_seed.obj \
- tool_cb_wrtd.obj \
- tool_cfgabled.obj \
- tool_convertd.obj \
- tool_dirhied.obj \
- tool_doswind.obj \
- tool_easysrcd.obj \
- tool_formparsed.obj \
- tool_getparamd.obj \
- tool_getpassd.obj \
- tool_helpd.obj \
- tool_helpersd.obj \
- tool_homedird.obj \
- tool_hugehelpd.obj \
- tool_libinfod.obj \
- tool_maind.obj \
- tool_metalinkd.obj \
- tool_mfilesd.obj \
- tool_msgsd.obj \
- tool_operated.obj \
- tool_operhlpd.obj \
- tool_panykeyd.obj \
- tool_paramhlpd.obj \
- tool_parsecfgd.obj \
- tool_setoptd.obj \
- tool_sleepd.obj \
- tool_urlglobd.obj \
- tool_utild.obj \
- tool_vmsd.obj \
- tool_writeenvd.obj \
- tool_writeoutd.obj \
- tool_xattrd.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = $(LIBCURL_IMP_LIB_REL)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with winssl and zlib
-
-!IF "$(CFG)" == "release-winssl-zlib"
-CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-LINKLIBS = $(LINKLIBS) $(WINLIBS)
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcaser.obj: ../lib/strcase.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnless.obj: ../lib/warnless.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wc.obj: slist_wc.c
- $(CCR) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoder.obj: tool_binmode.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamer.obj: tool_bname.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgr.obj: tool_cb_dbg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrr.obj: tool_cb_hdr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgr.obj: tool_cb_prg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_rear.obj: tool_cb_rea.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seer.obj: tool_cb_see.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtr.obj: tool_cb_wrt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabler.obj: tool_cfgable.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertr.obj: tool_convert.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhier.obj: tool_dirhie.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswinr.obj: tool_doswin.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcr.obj: tool_easysrc.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparser.obj: tool_formparse.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamr.obj: tool_getparam.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassr.obj: tool_getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpr.obj: tool_help.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersr.obj: tool_helpers.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedirr.obj: tool_homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpr.obj: tool_hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfor.obj: tool_libinfo.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_mainr.obj: tool_main.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkr.obj: tool_metalink.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesr.obj: tool_mfiles.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsr.obj: tool_msgs.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operater.obj: tool_operate.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpr.obj: tool_operhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyr.obj: tool_panykey.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpr.obj: tool_paramhlp.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgr.obj: tool_parsecfg.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptr.obj: tool_setopt.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepr.obj: tool_sleep.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobr.obj: tool_urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utilr.obj: tool_util.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsr.obj: tool_vms.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvr.obj: tool_writeenv.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutr.obj: tool_writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrr.obj: tool_xattr.c
- $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-strcased.obj: ../lib/strcase.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strcase.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-warnlessd.obj: ../lib/warnless.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
-slist_wcd.obj: slist_wc.c
- $(CCD) $(CFLAGS) /Fo"$@" slist_wc.c
-tool_binmoded.obj: tool_binmode.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
-tool_bnamed.obj: tool_bname.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
-tool_cb_dbgd.obj: tool_cb_dbg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
-tool_cb_hdrd.obj: tool_cb_hdr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
-tool_cb_prgd.obj: tool_cb_prg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
-tool_cb_read.obj: tool_cb_rea.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
-tool_cb_seed.obj: tool_cb_see.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
-tool_cb_wrtd.obj: tool_cb_wrt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
-tool_cfgabled.obj: tool_cfgable.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
-tool_convertd.obj: tool_convert.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
-tool_dirhied.obj: tool_dirhie.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
-tool_doswind.obj: tool_doswin.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
-tool_easysrcd.obj: tool_easysrc.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
-tool_formparsed.obj: tool_formparse.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
-tool_getparamd.obj: tool_getparam.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
-tool_getpassd.obj: tool_getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
-tool_helpd.obj: tool_help.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
-tool_helpersd.obj: tool_helpers.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
-tool_homedird.obj: tool_homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
-tool_hugehelpd.obj: tool_hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
-tool_libinfod.obj: tool_libinfo.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
-tool_maind.obj: tool_main.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
-tool_metalinkd.obj: tool_metalink.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
-tool_mfilesd.obj: tool_mfiles.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
-tool_msgsd.obj: tool_msgs.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
-tool_operated.obj: tool_operate.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
-tool_operhlpd.obj: tool_operhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
-tool_panykeyd.obj: tool_panykey.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
-tool_paramhlpd.obj: tool_paramhlp.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
-tool_parsecfgd.obj: tool_parsecfg.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
-tool_setoptd.obj: tool_setopt.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
-tool_sleepd.obj: tool_sleep.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
-tool_urlglobd.obj: tool_urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
-tool_utild.obj: tool_util.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
-tool_vmsd.obj: tool_vms.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
-tool_writeenvd.obj: tool_writeenv.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
-tool_writeoutd.obj: tool_writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
-tool_xattrd.obj: tool_xattr.c
- $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/curl.rc b/src/curl.rc
index 3a2c3a0f..5f49d223 100644
--- a/src/curl.rc
+++ b/src/curl.rc
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -51,7 +51,7 @@ BEGIN
VALUE "OriginalFilename", "curl.exe\0"
VALUE "ProductName", "The curl executable\0"
VALUE "ProductVersion", CURL_VERSION "\0"
- VALUE "LegalCopyright", "© " CURL_COPYRIGHT "\0"
+ VALUE "LegalCopyright", "\xa9 " CURL_COPYRIGHT "\0" /* a9: Copyright symbol */
VALUE "License", "https://curl.haxx.se/docs/copyright.html\0"
END
END
diff --git a/src/macos/MACINSTALL.TXT b/src/macos/MACINSTALL.TXT
index ce4d1dce..2bab9fd3 100644
--- a/src/macos/MACINSTALL.TXT
+++ b/src/macos/MACINSTALL.TXT
@@ -1 +1 @@
-MACOS (not MACOS X) =================== This is the first attempt at porting curl to MacOS. http, ftp, dict and telnet seems to work fine, other protocols and advanced features have not been all tested. This port is heavily based on the GUSI library from Matthias Neeracher. GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library bringing some of the comforts of UNIX 98 to traditional MacOS. The latest GUSI release can be downloaded from sourceforge at <http://sourceforge.net/projects/gusi/> I have also written a few functions to help port Unix applications to MacOS. These functions are part of the GUSI Extra library that can be downloaded at <http://perso.wanadoo.fr/ela/resources.html#gusiextra> OpenSSL support is still experimental but I hope to deliver a version including SSL soon. curl for MacOS requires using the CodeWarrior compiler from Metrowerks. First download GUSI, GUSI Extra and curl. Access paths have been setup so that GUSI, GUSI Extra and curl directories should have the same parent directory. Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to SIOUX and GUSI patches. If you do not apply these patches curl will not behave correctly. In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a stuffit binhexed file) From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access paths if required. Then you should be able to build: - the libcurl libraries for PPC and 68K. - the curl application (also available for PPC and 68K) which is the command line version of curl. If the file "tool_hugehelp.c" is missing rename "curl/src/tool_hugehelp.c.cvs" to "tool_hugehelp.c" and make sure its file type is 'TEXT'
+MACOS (not MACOS X) =================== This is the first attempt at porting curl to MacOS. http, ftp, dict and telnet seems to work fine, other protocols and advanced features have not been all tested. This port is heavily based on the GUSI library from Matthias Neeracher. GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library bringing some of the comforts of UNIX 98 to traditional MacOS. The latest GUSI release can be downloaded from sourceforge at <https://sourceforge.net/projects/gusi/> I have also written a few functions to help port Unix applications to MacOS. These functions are part of the GUSI Extra library that can be downloaded at <http://perso.wanadoo.fr/ela/resources.html#gusiextra> OpenSSL support is still experimental but I hope to deliver a version including SSL soon. curl for MacOS requires using the CodeWarrior compiler from Metrowerks. First download GUSI, GUSI Extra and curl. Access paths have been setup so that GUSI, GUSI Extra and curl directories should have the same parent directory. Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to SIOUX and GUSI patches. If you do not apply these patches curl will not behave correctly. In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a stuffit binhexed file) From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access paths if required. Then you should be able to build: - the libcurl libraries for PPC and 68K. - the curl application (also available for PPC and 68K) which is the command line version of curl. If the file "tool_hugehelp.c" is missing rename "curl/src/tool_hugehelp.c.cvs" to "tool_hugehelp.c" and make sure its file type is 'TEXT'
diff --git a/src/makefile.dj b/src/makefile.dj
index c3bbc237..fbd2d373 100644
--- a/src/makefile.dj
+++ b/src/makefile.dj
@@ -53,8 +53,6 @@ endif
EX_LIBS += $(WATT32_ROOT)/lib/libwatt.a
-CFLAGS += -DUSE_ENVIRONMENT
-
PROGRAM = curl.exe
OBJECTS += $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o))
diff --git a/src/mkhelp.pl b/src/mkhelp.pl
index 74a4b82e..3295dca5 100644
--- a/src/mkhelp.pl
+++ b/src/mkhelp.pl
@@ -36,7 +36,7 @@ if($ARGV[0] eq "-c") {
my $README = $ARGV[0];
if($README eq "") {
- print "usage: mkreadme.pl [-c] <README> < manpage\n";
+ print "usage: mkhelp.pl [-c] <README> < manpage\n";
exit;
}
@@ -102,39 +102,6 @@ while(<READ>) {
}
close(READ);
-# if compressed
-if($c) {
- my @test = `gzip --version 2>&1`;
- if($test[0] =~ /gzip/) {
- open(GZIP, ">dumpit") ||
- die "can't create the dumpit file, try without -c";
- binmode GZIP;
- for(@out) {
- print GZIP $_;
- $gzip += length($_);
- }
- close(GZIP);
-
- system("gzip --best --no-name dumpit");
-
- open(GZIP, "<dumpit.gz") ||
- die "can't read the dumpit.gz file, try without -c";
- binmode GZIP;
- while(<GZIP>) {
- push @gzip, $_;
- $gzipped += length($_);
- }
- close(GZIP);
-
- unlink("dumpit.gz");
- }
- else {
- # no gzip, no compression!
- undef $c;
- print STDERR "MEEEP: Couldn't find gzip, disable compression\n";
- }
-}
-
$now = localtime;
print <<HEAD
/*
@@ -146,27 +113,44 @@ print <<HEAD
HEAD
;
if($c) {
+ # If compression requested, check that the Gzip module is available
+ # or else disable compression
+ $c = eval
+ {
+ require IO::Compress::Gzip;
+ IO::Compress::Gzip->import();
+ 1;
+ };
+ print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
+}
+
+if($c)
+{
+ my $content = join("", @out);
+ my $gzippedContent;
+ IO::Compress::Gzip::gzip(
+ \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
+ $gzip = length($content);
+ $gzipped = length($gzippedContent);
+
print <<HEAD
#include <zlib.h>
#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 shrunk from $gzip
+ Thanks to this operation, the size of this data shrank from $gzip
to $gzipped bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
HEAD
;
+
my $c=0;
print " ";
- for(@gzip) {
- my @all=split(//, $_);
- for(@all) {
- my $num=ord($_);
- printf(" 0x%02x,", 0+$num);
- if(++$c>11) {
- print "\n ";
- $c=0;
- }
+ for(split(//, $gzippedContent)) {
+ my $num=ord($_);
+ printf(" 0x%02x,", 0+$num);
+ if(!(++$c % 12)) {
+ print "\n ";
}
}
print "\n};\n";
diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c
index 8e81f1be..b4fbe0bb 100644
--- a/src/tool_cb_dbg.c
+++ b/src/tool_cb_dbg.c
@@ -26,6 +26,7 @@
#include "curlx.h"
#include "tool_cfgable.h"
+#include "tool_convert.h"
#include "tool_msgs.h"
#include "tool_cb_dbg.h"
#include "tool_util.h"
@@ -41,7 +42,7 @@ static void dump(const char *timebuf, const char *text,
*/
int tool_debug_cb(CURL *handle, curl_infotype type,
- unsigned char *data, size_t size,
+ char *data, size_t size,
void *userdata)
{
struct OperationConfig *operation = userdata;
@@ -171,7 +172,8 @@ int tool_debug_cb(CURL *handle, curl_infotype type,
if(memcmp(&data[i], "\r\n\r\n", 4) == 0) {
/* dump everything through the CRLFCRLF as a sent header */
text = "=> Send header";
- dump(timebuf, text, output, data, i + 4, config->tracetype, type);
+ dump(timebuf, text, output, (unsigned char *)data, i + 4,
+ config->tracetype, type);
data += i + 3;
size -= i + 4;
type = CURLINFO_DATA_OUT;
@@ -185,6 +187,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(output, "%s== Info: %s", timebuf, data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
@@ -208,7 +211,8 @@ int tool_debug_cb(CURL *handle, curl_infotype type,
break;
}
- dump(timebuf, text, output, data, size, config->tracetype, type);
+ dump(timebuf, text, output, (unsigned char *) data, size, config->tracetype,
+ type);
return 0;
}
diff --git a/src/tool_cb_dbg.h b/src/tool_cb_dbg.h
index 7ac15cf9..c1cbc807 100644
--- a/src/tool_cb_dbg.h
+++ b/src/tool_cb_dbg.h
@@ -28,7 +28,7 @@
*/
int tool_debug_cb(CURL *handle, curl_infotype type,
- unsigned char *data, size_t size,
+ char *data, size_t size,
void *userdata);
#endif /* HEADER_CURL_TOOL_CB_DBG_H */
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index 3891b073..0e13eec5 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -40,7 +40,7 @@ static char *parse_filename(const char *ptr, size_t len);
** callback for CURLOPT_HEADERFUNCTION
*/
-size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
+size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
{
struct HdrCbData *hdrcbdata = userdata;
struct OutStruct *outs = hdrcbdata->outs;
@@ -56,7 +56,7 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
* it does not match then it fails with CURLE_WRITE_ERROR. So at this
* point returning a value different from sz*nmemb indicates failure.
*/
- size_t failure = (size * nmemb) ? 0 : 1;
+ size_t failure = (size && nmemb) ? 0 : 1;
if(!heads->config)
return failure;
@@ -128,8 +128,7 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
hdrcbdata->honor_cd_filename = FALSE;
break;
}
- else
- return failure;
+ return failure;
}
}
@@ -215,7 +214,7 @@ static char *parse_filename(const char *ptr, size_t len)
}
#endif /* MSDOS || WIN32 */
- /* in case we built debug enabled, we allow an evironment variable
+ /* in case we built debug enabled, we allow an environment variable
* named CURL_TESTDIR to prefix the given file name to put it into a
* specific directory
*/
diff --git a/src/tool_cb_hdr.h b/src/tool_cb_hdr.h
index bb54bbb8..32032e98 100644
--- a/src/tool_cb_hdr.h
+++ b/src/tool_cb_hdr.h
@@ -48,7 +48,7 @@ struct HdrCbData {
** callback for CURLOPT_HEADERFUNCTION
*/
-size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata);
+size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata);
#endif /* HEADER_CURL_TOOL_CB_HDR_H */
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index eae80fe1..d4ecb3ce 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -83,7 +83,7 @@ int tool_progress_cb(void *clientp,
}
else if(point != bar->prev) {
frac = (double)point / (double)total;
- percent = frac * 100.0f;
+ percent = frac * 100.0;
barwidth = bar->width - 7;
num = (int) (((double)barwidth) * frac);
if(num > MAX_BARLENGTH)
diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c
index 04134576..6716ba5c 100644
--- a/src/tool_cb_wrt.c
+++ b/src/tool_cb_wrt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -72,11 +72,13 @@ bool tool_create_output_file(struct OutStruct *outs)
** callback for CURLOPT_WRITEFUNCTION
*/
-size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata)
+size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
{
size_t rc;
struct OutStruct *outs = userdata;
struct OperationConfig *config = outs->config;
+ size_t bytes = sz * nmemb;
+ bool is_tty = config->global->isatty;
/*
* Once that libcurl has called back tool_write_cb() the returned value
@@ -84,21 +86,26 @@ size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata)
* it does not match then it fails with CURLE_WRITE_ERROR. So at this
* point returning a value different from sz*nmemb indicates failure.
*/
- const size_t failure = (sz * nmemb) ? 0 : 1;
-
- if(!config)
- return failure;
+ const size_t failure = bytes ? 0 : 1;
#ifdef DEBUGBUILD
+ {
+ char *tty = curlx_getenv("CURL_ISATTY");
+ if(tty) {
+ is_tty = TRUE;
+ curl_free(tty);
+ }
+ }
+
if(config->include_headers) {
- if(sz * nmemb > (size_t)CURL_MAX_HTTP_HEADER) {
+ if(bytes > (size_t)CURL_MAX_HTTP_HEADER) {
warnf(config->global, "Header data size exceeds single call write "
"limit!\n");
return failure;
}
}
else {
- if(sz * nmemb > (size_t)CURL_MAX_WRITE_SIZE) {
+ if(bytes > (size_t)CURL_MAX_WRITE_SIZE) {
warnf(config->global, "Data size exceeds single call write limit!\n");
return failure;
}
@@ -137,11 +144,22 @@ size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata)
if(!outs->stream && !tool_create_output_file(outs))
return failure;
+ if(is_tty && (outs->bytes < 2000) && !config->terminal_binary_ok) {
+ /* binary output to terminal? */
+ if(memchr(buffer, 0, bytes)) {
+ warnf(config->global, "Binary output can mess up your terminal. "
+ "Use \"--output -\" to tell curl to output it to your terminal "
+ "anyway, or consider \"--output <FILE>\" to save to a file.\n");
+ config->synthetic_error = ERR_BINARY_TERMINAL;
+ return failure;
+ }
+ }
+
rc = fwrite(buffer, sz, nmemb, outs->stream);
- if((sz * nmemb) == rc)
+ if(bytes == rc)
/* we added this amount of data to the output */
- outs->bytes += (sz * nmemb);
+ outs->bytes += bytes;
if(config->readbusy) {
config->readbusy = FALSE;
diff --git a/src/tool_cb_wrt.h b/src/tool_cb_wrt.h
index fc60be0f..4ccbf3a5 100644
--- a/src/tool_cb_wrt.h
+++ b/src/tool_cb_wrt.h
@@ -27,7 +27,7 @@
** callback for CURLOPT_WRITEFUNCTION
*/
-size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata);
+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);
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index f00a0d1e..675e88b4 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -123,7 +123,7 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->pubkey);
Curl_safefree(config->hostpubmd5);
Curl_safefree(config->engine);
-
+ Curl_safefree(config->request_target);
Curl_safefree(config->customrequest);
Curl_safefree(config->krblevel);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 5db86f4e..254805c8 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -27,6 +27,12 @@
#include "tool_metalink.h"
+typedef enum {
+ ERR_NONE,
+ ERR_BINARY_TERMINAL = 1, /* binary to terminal detected */
+ ERR_LAST
+} curl_error;
+
struct GlobalConfig;
struct OperationConfig {
@@ -133,6 +139,7 @@ struct OperationConfig {
bool crlf;
char *customrequest;
char *krblevel;
+ char *request_target;
long httpversion;
bool nobuffer;
bool readbusy; /* set when reading input returns EAGAIN */
@@ -141,6 +148,7 @@ struct OperationConfig {
bool insecure_ok; /* set TRUE to allow insecure SSL connects */
bool proxy_insecure_ok; /* set TRUE to allow insecure SSL connects
for proxy */
+ bool terminal_binary_ok;
bool verifystatus;
bool create_dirs;
bool ftp_create_dirs;
@@ -151,11 +159,11 @@ struct OperationConfig {
bool proxybasic;
bool proxyanyauth;
char *writeout; /* %-styled format string to output */
- bool writeenv; /* write results to environment, if available */
struct curl_slist *quote;
struct curl_slist *postquote;
struct curl_slist *prequote;
long ssl_version;
+ long ssl_version_max;
long proxy_ssl_version;
long ip_version;
curl_TimeCond timecond;
@@ -181,6 +189,7 @@ struct OperationConfig {
char *preproxy;
int socks5_gssapi_nec; /* The NEC reference server does not protect the
encryption type exchange */
+ unsigned long socks5_auth;/* auth bitmask for socks5 proxies */
char *proxy_service_name; /* set authentication service name for HTTP and
SOCKS5 proxies */
char *service_name; /* set authentication service name for DIGEST-MD5,
@@ -230,9 +239,14 @@ struct OperationConfig {
bool nonpn; /* enable/disable TLS NPN extension */
bool noalpn; /* enable/disable TLS ALPN extension */
char *unix_socket_path; /* path to Unix domain socket */
+ bool abstract_unix_socket; /* path to an abstract Unix domain socket */
bool falsestart;
bool path_as_is;
double expect100timeout;
+ bool suppress_connect_headers; /* suppress proxy CONNECT response headers
+ from user callbacks */
+ curl_error synthetic_error; /* if non-zero, it overrides any libcurl
+ error */
struct GlobalConfig *global;
struct OperationConfig *prev;
struct OperationConfig *next; /* Always last in the struct */
diff --git a/src/tool_dirhie.c b/src/tool_dirhie.c
index 23bb2cb4..1d735920 100644
--- a/src/tool_dirhie.c
+++ b/src/tool_dirhie.c
@@ -50,7 +50,7 @@
static void show_dir_errno(FILE *errors, const char *name)
{
- switch(ERRNO) {
+ switch(errno) {
#ifdef EACCES
case EACCES:
fprintf(errors, "You don't have permission to create %s.\n", name);
diff --git a/src/tool_doswin.c b/src/tool_doswin.c
index 48af3bfb..91299986 100644
--- a/src/tool_doswin.c
+++ b/src/tool_doswin.c
@@ -646,24 +646,18 @@ CURLcode FindWin32CACert(struct OperationConfig *config,
if(curlinfo->features & CURL_VERSION_SSL) {
DWORD res_len;
- DWORD buf_tchar_size = PATH_MAX + 1;
- DWORD buf_bytes_size = sizeof(TCHAR) * buf_tchar_size;
+ char buf[PATH_MAX];
char *ptr = NULL;
- char *buf = malloc(buf_bytes_size);
- if(!buf)
- return CURLE_OUT_OF_MEMORY;
buf[0] = '\0';
- res_len = SearchPathA(NULL, bundle_file, NULL, buf_tchar_size, buf, &ptr);
+ res_len = SearchPathA(NULL, bundle_file, NULL, PATH_MAX, buf, &ptr);
if(res_len > 0) {
Curl_safefree(config->cacert);
config->cacert = strdup(buf);
if(!config->cacert)
result = CURLE_OUT_OF_MEMORY;
}
-
- Curl_safefree(buf);
}
return result;
diff --git a/src/tool_formparse.c b/src/tool_formparse.c
index 88352fb1..952377c4 100644
--- a/src/tool_formparse.c
+++ b/src/tool_formparse.c
@@ -28,6 +28,7 @@
#include "curlx.h"
#include "tool_cfgable.h"
+#include "tool_convert.h"
#include "tool_mfiles.h"
#include "tool_msgs.h"
#include "tool_formparse.h"
@@ -153,7 +154,7 @@ int formparse(struct OperationConfig *config,
char type_major[128] = "";
char type_minor[128] = "";
char *contp;
- const char *type = NULL;
+ char *type = NULL;
char *sep;
if((1 == sscanf(input, "%255[^=]=", name)) &&
@@ -214,7 +215,7 @@ int formparse(struct OperationConfig *config,
}
/* now point beyond the content-type specifier */
- sep = (char *)type + strlen(type_major)+strlen(type_minor)+1;
+ sep = type + strlen(type_major)+strlen(type_minor)+1;
/* there's a semicolon following - we check if it is a filename
specified and if not we simply assume that it is text that
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index d8a3c07b..b7ee519b 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -30,6 +30,7 @@
#include "tool_binmode.h"
#include "tool_cfgable.h"
#include "tool_cb_prg.h"
+#include "tool_convert.h"
#include "tool_formparse.h"
#include "tool_getparam.h"
#include "tool_helpers.h"
@@ -60,243 +61,250 @@
struct LongShort {
const char *letter; /* short name option */
const char *lname; /* long name option */
- bool extraparam; /* whether it takes an additional argument */
+ enum {
+ ARG_NONE, /* stand-alone but not a boolean */
+ ARG_BOOL, /* accepts a --no-[name] prefix */
+ ARG_STRING /* requires an argument */
+ } desc;
};
static const struct LongShort aliases[]= {
/* 'letter' strings with more than one character have *no* short option to
mention. */
- {"*@", "url", TRUE},
- {"*4", "dns-ipv4-addr", TRUE},
- {"*6", "dns-ipv6-addr", TRUE},
- {"*a", "random-file", TRUE},
- {"*b", "egd-file", TRUE},
- {"*B", "oauth2-bearer", TRUE},
- {"*c", "connect-timeout", TRUE},
- {"*d", "ciphers", TRUE},
- {"*D", "dns-interface", TRUE},
- {"*e", "disable-epsv", FALSE},
- {"*E", "epsv", FALSE},
+ {"*@", "url", ARG_STRING},
+ {"*4", "dns-ipv4-addr", ARG_STRING},
+ {"*6", "dns-ipv6-addr", ARG_STRING},
+ {"*a", "random-file", ARG_STRING},
+ {"*b", "egd-file", ARG_STRING},
+ {"*B", "oauth2-bearer", ARG_STRING},
+ {"*c", "connect-timeout", ARG_STRING},
+ {"*d", "ciphers", ARG_STRING},
+ {"*D", "dns-interface", ARG_STRING},
+ {"*e", "disable-epsv", ARG_BOOL},
+ {"*E", "epsv", ARG_BOOL},
/* 'epsv' made like this to make --no-epsv and --epsv to work
although --disable-epsv is the documented option */
-#ifdef USE_ENVIRONMENT
- {"*f", "environment", FALSE},
-#endif
- {"*F", "dns-servers", TRUE},
- {"*g", "trace", TRUE},
- {"*G", "npn", FALSE},
- {"*h", "trace-ascii", TRUE},
- {"*H", "alpn", FALSE},
- {"*i", "limit-rate", TRUE},
- {"*j", "compressed", FALSE},
- {"*J", "tr-encoding", FALSE},
- {"*k", "digest", FALSE},
- {"*l", "negotiate", FALSE},
- {"*m", "ntlm", FALSE},
- {"*M", "ntlm-wb", FALSE},
- {"*n", "basic", FALSE},
- {"*o", "anyauth", FALSE},
+ {"*F", "dns-servers", ARG_STRING},
+ {"*g", "trace", ARG_STRING},
+ {"*G", "npn", ARG_BOOL},
+ {"*h", "trace-ascii", ARG_STRING},
+ {"*H", "alpn", ARG_BOOL},
+ {"*i", "limit-rate", ARG_STRING},
+ {"*j", "compressed", ARG_BOOL},
+ {"*J", "tr-encoding", ARG_BOOL},
+ {"*k", "digest", ARG_BOOL},
+ {"*l", "negotiate", ARG_BOOL},
+ {"*m", "ntlm", ARG_BOOL},
+ {"*M", "ntlm-wb", ARG_BOOL},
+ {"*n", "basic", ARG_BOOL},
+ {"*o", "anyauth", ARG_BOOL},
#ifdef USE_WATT32
- {"*p", "wdebug", FALSE},
+ {"*p", "wdebug", ARG_BOOL},
#endif
- {"*q", "ftp-create-dirs", FALSE},
- {"*r", "create-dirs", FALSE},
- {"*s", "max-redirs", TRUE},
- {"*t", "proxy-ntlm", FALSE},
- {"*u", "crlf", FALSE},
- {"*v", "stderr", TRUE},
- {"*w", "interface", TRUE},
- {"*x", "krb", TRUE},
- {"*x", "krb4", TRUE},
+ {"*q", "ftp-create-dirs", ARG_BOOL},
+ {"*r", "create-dirs", ARG_BOOL},
+ {"*s", "max-redirs", ARG_STRING},
+ {"*t", "proxy-ntlm", ARG_BOOL},
+ {"*u", "crlf", ARG_BOOL},
+ {"*v", "stderr", ARG_STRING},
+ {"*w", "interface", ARG_STRING},
+ {"*x", "krb", ARG_STRING},
+ {"*x", "krb4", ARG_STRING},
/* 'krb4' is the previous name */
- {"*y", "max-filesize", TRUE},
- {"*z", "disable-eprt", FALSE},
- {"*Z", "eprt", FALSE},
+ {"*y", "max-filesize", ARG_STRING},
+ {"*z", "disable-eprt", ARG_BOOL},
+ {"*Z", "eprt", ARG_BOOL},
/* 'eprt' made like this to make --no-eprt and --eprt to work
although --disable-eprt is the documented option */
- {"*~", "xattr", FALSE},
- {"$a", "ftp-ssl", FALSE},
+ {"*~", "xattr", ARG_BOOL},
+ {"$a", "ftp-ssl", ARG_BOOL},
/* 'ftp-ssl' deprecated name since 7.20.0 */
- {"$a", "ssl", FALSE},
+ {"$a", "ssl", ARG_BOOL},
/* 'ssl' new option name in 7.20.0, previously this was ftp-ssl */
- {"$b", "ftp-pasv", FALSE},
- {"$c", "socks5", TRUE},
- {"$d", "tcp-nodelay", FALSE},
- {"$e", "proxy-digest", FALSE},
- {"$f", "proxy-basic", FALSE},
- {"$g", "retry", TRUE},
- {"$V", "retry-connrefused", FALSE},
- {"$h", "retry-delay", TRUE},
- {"$i", "retry-max-time", TRUE},
- {"$k", "proxy-negotiate", FALSE},
- {"$m", "ftp-account", TRUE},
- {"$n", "proxy-anyauth", FALSE},
- {"$o", "trace-time", FALSE},
- {"$p", "ignore-content-length", FALSE},
- {"$q", "ftp-skip-pasv-ip", FALSE},
- {"$r", "ftp-method", TRUE},
- {"$s", "local-port", TRUE},
- {"$t", "socks4", TRUE},
- {"$T", "socks4a", TRUE},
- {"$u", "ftp-alternative-to-user", TRUE},
- {"$v", "ftp-ssl-reqd", FALSE},
+ {"$b", "ftp-pasv", ARG_BOOL},
+ {"$c", "socks5", ARG_STRING},
+ {"$d", "tcp-nodelay", ARG_BOOL},
+ {"$e", "proxy-digest", ARG_BOOL},
+ {"$f", "proxy-basic", ARG_BOOL},
+ {"$g", "retry", ARG_STRING},
+ {"$V", "retry-connrefused", ARG_BOOL},
+ {"$h", "retry-delay", ARG_STRING},
+ {"$i", "retry-max-time", ARG_STRING},
+ {"$k", "proxy-negotiate", ARG_BOOL},
+ {"$m", "ftp-account", ARG_STRING},
+ {"$n", "proxy-anyauth", ARG_BOOL},
+ {"$o", "trace-time", ARG_BOOL},
+ {"$p", "ignore-content-length", ARG_BOOL},
+ {"$q", "ftp-skip-pasv-ip", ARG_BOOL},
+ {"$r", "ftp-method", ARG_STRING},
+ {"$s", "local-port", ARG_STRING},
+ {"$t", "socks4", ARG_STRING},
+ {"$T", "socks4a", ARG_STRING},
+ {"$u", "ftp-alternative-to-user", ARG_STRING},
+ {"$v", "ftp-ssl-reqd", ARG_BOOL},
/* 'ftp-ssl-reqd' deprecated name since 7.20.0 */
- {"$v", "ssl-reqd", FALSE},
+ {"$v", "ssl-reqd", ARG_BOOL},
/* 'ssl-reqd' new in 7.20.0, previously this was ftp-ssl-reqd */
- {"$w", "sessionid", FALSE},
+ {"$w", "sessionid", ARG_BOOL},
/* 'sessionid' listed as --no-sessionid in the help */
- {"$x", "ftp-ssl-control", FALSE},
- {"$y", "ftp-ssl-ccc", FALSE},
- {"$j", "ftp-ssl-ccc-mode", TRUE},
- {"$z", "libcurl", TRUE},
- {"$#", "raw", FALSE},
- {"$0", "post301", FALSE},
- {"$1", "keepalive", FALSE},
+ {"$x", "ftp-ssl-control", ARG_BOOL},
+ {"$y", "ftp-ssl-ccc", ARG_BOOL},
+ {"$j", "ftp-ssl-ccc-mode", ARG_STRING},
+ {"$z", "libcurl", ARG_STRING},
+ {"$#", "raw", ARG_BOOL},
+ {"$0", "post301", ARG_BOOL},
+ {"$1", "keepalive", ARG_BOOL},
/* 'keepalive' listed as --no-keepalive in the help */
- {"$2", "socks5-hostname", TRUE},
- {"$3", "keepalive-time", TRUE},
- {"$4", "post302", FALSE},
- {"$5", "noproxy", TRUE},
- {"$7", "socks5-gssapi-nec", FALSE},
- {"$8", "proxy1.0", TRUE},
- {"$9", "tftp-blksize", TRUE},
- {"$A", "mail-from", TRUE},
- {"$B", "mail-rcpt", TRUE},
- {"$C", "ftp-pret", FALSE},
- {"$D", "proto", TRUE},
- {"$E", "proto-redir", TRUE},
- {"$F", "resolve", TRUE},
- {"$G", "delegation", TRUE},
- {"$H", "mail-auth", TRUE},
- {"$I", "post303", FALSE},
- {"$J", "metalink", FALSE},
- {"$K", "sasl-ir", FALSE},
- {"$L", "test-event", FALSE},
- {"$M", "unix-socket", TRUE},
- {"$N", "path-as-is", FALSE},
- {"$O", "socks5-gssapi-service", TRUE},
+ {"$2", "socks5-hostname", ARG_STRING},
+ {"$3", "keepalive-time", ARG_STRING},
+ {"$4", "post302", ARG_BOOL},
+ {"$5", "noproxy", ARG_STRING},
+ {"$7", "socks5-gssapi-nec", ARG_BOOL},
+ {"$8", "proxy1.0", ARG_STRING},
+ {"$9", "tftp-blksize", ARG_STRING},
+ {"$A", "mail-from", ARG_STRING},
+ {"$B", "mail-rcpt", ARG_STRING},
+ {"$C", "ftp-pret", ARG_BOOL},
+ {"$D", "proto", ARG_STRING},
+ {"$E", "proto-redir", ARG_STRING},
+ {"$F", "resolve", ARG_STRING},
+ {"$G", "delegation", ARG_STRING},
+ {"$H", "mail-auth", ARG_STRING},
+ {"$I", "post303", ARG_BOOL},
+ {"$J", "metalink", ARG_BOOL},
+ {"$K", "sasl-ir", ARG_BOOL},
+ {"$L", "test-event", ARG_BOOL},
+ {"$M", "unix-socket", ARG_STRING},
+ {"$N", "path-as-is", ARG_BOOL},
+ {"$O", "socks5-gssapi-service", ARG_STRING},
/* 'socks5-gssapi-service' merged with'proxy-service-name' and
deprecated since 7.49.0 */
- {"$O", "proxy-service-name", TRUE},
- {"$P", "service-name", TRUE},
- {"$Q", "proto-default", TRUE},
- {"$R", "expect100-timeout", TRUE},
- {"$S", "tftp-no-options", FALSE},
- {"$U", "connect-to", TRUE},
- {"0", "http1.0", FALSE},
- {"01", "http1.1", FALSE},
- {"02", "http2", FALSE},
- {"03", "http2-prior-knowledge", FALSE},
- {"1", "tlsv1", FALSE},
- {"10", "tlsv1.0", FALSE},
- {"11", "tlsv1.1", FALSE},
- {"12", "tlsv1.2", FALSE},
- {"13", "tlsv1.3", FALSE},
- {"2", "sslv2", FALSE},
- {"3", "sslv3", FALSE},
- {"4", "ipv4", FALSE},
- {"6", "ipv6", FALSE},
- {"a", "append", FALSE},
- {"A", "user-agent", TRUE},
- {"b", "cookie", TRUE},
- {"B", "use-ascii", FALSE},
- {"c", "cookie-jar", TRUE},
- {"C", "continue-at", TRUE},
- {"d", "data", TRUE},
- {"dr", "data-raw", TRUE},
- {"da", "data-ascii", TRUE},
- {"db", "data-binary", TRUE},
- {"de", "data-urlencode", TRUE},
- {"D", "dump-header", TRUE},
- {"e", "referer", TRUE},
- {"E", "cert", TRUE},
- {"Ea", "cacert", TRUE},
- {"Eb", "cert-type", TRUE},
- {"Ec", "key", TRUE},
- {"Ed", "key-type", TRUE},
- {"Ee", "pass", TRUE},
- {"Ef", "engine", TRUE},
- {"Eg", "capath", TRUE},
- {"Eh", "pubkey", TRUE},
- {"Ei", "hostpubmd5", TRUE},
- {"Ej", "crlfile", TRUE},
- {"Ek", "tlsuser", TRUE},
- {"El", "tlspassword", TRUE},
- {"Em", "tlsauthtype", TRUE},
- {"En", "ssl-allow-beast", FALSE},
- {"Eo", "login-options", TRUE},
- {"Ep", "pinnedpubkey", TRUE},
- {"Eq", "cert-status", FALSE},
- {"Er", "false-start", FALSE},
- {"Es", "ssl-no-revoke", FALSE},
- {"Et", "tcp-fastopen", FALSE},
- {"Eu", "proxy-tlsuser", TRUE},
- {"Ev", "proxy-tlspassword", TRUE},
- {"Ew", "proxy-tlsauthtype", TRUE},
- {"Ex", "proxy-cert", TRUE},
- {"Ey", "proxy-cert-type", TRUE},
- {"Ez", "proxy-key", TRUE},
- {"E0", "proxy-key-type", TRUE},
- {"E1", "proxy-pass", TRUE},
- {"E2", "proxy-ciphers", TRUE},
- {"E3", "proxy-crlfile", TRUE},
- {"E4", "proxy-ssl-allow-beast", FALSE},
- {"E5", "login-options", TRUE},
- {"E6", "proxy-cacert", TRUE},
- {"E7", "proxy-capath", TRUE},
- {"E8", "proxy-insecure", FALSE},
- {"E9", "proxy-tlsv1", FALSE},
- {"f", "fail", FALSE},
- {"fa", "fail-early", FALSE},
- {"F", "form", TRUE},
- {"Fs", "form-string", TRUE},
- {"g", "globoff", FALSE},
- {"G", "get", FALSE},
- {"h", "help", FALSE},
- {"H", "header", TRUE},
- {"Hp", "proxy-header", TRUE},
- {"i", "include", FALSE},
- {"I", "head", FALSE},
- {"j", "junk-session-cookies", FALSE},
- {"J", "remote-header-name", FALSE},
- {"k", "insecure", FALSE},
- {"K", "config", TRUE},
- {"l", "list-only", FALSE},
- {"L", "location", FALSE},
- {"Lt", "location-trusted", FALSE},
- {"m", "max-time", TRUE},
- {"M", "manual", FALSE},
- {"n", "netrc", FALSE},
- {"no", "netrc-optional", FALSE},
- {"ne", "netrc-file", TRUE},
- {"N", "buffer", FALSE},
+ {"$O", "proxy-service-name", ARG_STRING},
+ {"$P", "service-name", ARG_STRING},
+ {"$Q", "proto-default", ARG_STRING},
+ {"$R", "expect100-timeout", ARG_STRING},
+ {"$S", "tftp-no-options", ARG_BOOL},
+ {"$U", "connect-to", ARG_STRING},
+ {"$W", "abstract-unix-socket", ARG_STRING},
+ {"$X", "tls-max", ARG_STRING},
+ {"$Y", "suppress-connect-headers", ARG_BOOL},
+ {"0", "http1.0", ARG_NONE},
+ {"01", "http1.1", ARG_NONE},
+ {"02", "http2", ARG_NONE},
+ {"03", "http2-prior-knowledge", ARG_NONE},
+ {"1", "tlsv1", ARG_NONE},
+ {"10", "tlsv1.0", ARG_NONE},
+ {"11", "tlsv1.1", ARG_NONE},
+ {"12", "tlsv1.2", ARG_NONE},
+ {"13", "tlsv1.3", ARG_NONE},
+ {"2", "sslv2", ARG_NONE},
+ {"3", "sslv3", ARG_NONE},
+ {"4", "ipv4", ARG_NONE},
+ {"6", "ipv6", ARG_NONE},
+ {"a", "append", ARG_BOOL},
+ {"A", "user-agent", ARG_STRING},
+ {"b", "cookie", ARG_STRING},
+ {"B", "use-ascii", ARG_BOOL},
+ {"c", "cookie-jar", ARG_STRING},
+ {"C", "continue-at", ARG_STRING},
+ {"d", "data", ARG_STRING},
+ {"dr", "data-raw", ARG_STRING},
+ {"da", "data-ascii", ARG_STRING},
+ {"db", "data-binary", ARG_STRING},
+ {"de", "data-urlencode", ARG_STRING},
+ {"D", "dump-header", ARG_STRING},
+ {"e", "referer", ARG_STRING},
+ {"E", "cert", ARG_STRING},
+ {"Ea", "cacert", ARG_STRING},
+ {"Eb", "cert-type", ARG_STRING},
+ {"Ec", "key", ARG_STRING},
+ {"Ed", "key-type", ARG_STRING},
+ {"Ee", "pass", ARG_STRING},
+ {"Ef", "engine", ARG_STRING},
+ {"Eg", "capath", ARG_STRING},
+ {"Eh", "pubkey", ARG_STRING},
+ {"Ei", "hostpubmd5", ARG_STRING},
+ {"Ej", "crlfile", ARG_STRING},
+ {"Ek", "tlsuser", ARG_STRING},
+ {"El", "tlspassword", ARG_STRING},
+ {"Em", "tlsauthtype", ARG_STRING},
+ {"En", "ssl-allow-beast", ARG_BOOL},
+ {"Eo", "login-options", ARG_STRING},
+ {"Ep", "pinnedpubkey", ARG_STRING},
+ {"Eq", "cert-status", ARG_BOOL},
+ {"Er", "false-start", ARG_BOOL},
+ {"Es", "ssl-no-revoke", ARG_BOOL},
+ {"Et", "tcp-fastopen", ARG_BOOL},
+ {"Eu", "proxy-tlsuser", ARG_STRING},
+ {"Ev", "proxy-tlspassword", ARG_STRING},
+ {"Ew", "proxy-tlsauthtype", ARG_STRING},
+ {"Ex", "proxy-cert", ARG_STRING},
+ {"Ey", "proxy-cert-type", ARG_STRING},
+ {"Ez", "proxy-key", ARG_STRING},
+ {"E0", "proxy-key-type", ARG_STRING},
+ {"E1", "proxy-pass", ARG_STRING},
+ {"E2", "proxy-ciphers", ARG_STRING},
+ {"E3", "proxy-crlfile", ARG_STRING},
+ {"E4", "proxy-ssl-allow-beast", ARG_BOOL},
+ {"E5", "login-options", ARG_STRING},
+ {"E6", "proxy-cacert", ARG_STRING},
+ {"E7", "proxy-capath", ARG_STRING},
+ {"E8", "proxy-insecure", ARG_BOOL},
+ {"E9", "proxy-tlsv1", ARG_NONE},
+ {"EA", "socks5-basic", ARG_BOOL},
+ {"EB", "socks5-gssapi", ARG_BOOL},
+ {"f", "fail", ARG_BOOL},
+ {"fa", "fail-early", ARG_BOOL},
+ {"F", "form", ARG_STRING},
+ {"Fs", "form-string", ARG_STRING},
+ {"g", "globoff", ARG_BOOL},
+ {"G", "get", ARG_NONE},
+ {"Ga", "request-target", ARG_STRING},
+ {"h", "help", ARG_BOOL},
+ {"H", "header", ARG_STRING},
+ {"Hp", "proxy-header", ARG_STRING},
+ {"i", "include", ARG_BOOL},
+ {"I", "head", ARG_BOOL},
+ {"j", "junk-session-cookies", ARG_BOOL},
+ {"J", "remote-header-name", ARG_BOOL},
+ {"k", "insecure", ARG_BOOL},
+ {"K", "config", ARG_STRING},
+ {"l", "list-only", ARG_BOOL},
+ {"L", "location", ARG_BOOL},
+ {"Lt", "location-trusted", ARG_BOOL},
+ {"m", "max-time", ARG_STRING},
+ {"M", "manual", ARG_BOOL},
+ {"n", "netrc", ARG_BOOL},
+ {"no", "netrc-optional", ARG_BOOL},
+ {"ne", "netrc-file", ARG_STRING},
+ {"N", "buffer", ARG_BOOL},
/* 'buffer' listed as --no-buffer in the help */
- {"o", "output", TRUE},
- {"O", "remote-name", FALSE},
- {"Oa", "remote-name-all", FALSE},
- {"p", "proxytunnel", FALSE},
- {"P", "ftp-port", TRUE},
- {"q", "disable", FALSE},
- {"Q", "quote", TRUE},
- {"r", "range", TRUE},
- {"R", "remote-time", FALSE},
- {"s", "silent", FALSE},
- {"S", "show-error", FALSE},
- {"t", "telnet-option", TRUE},
- {"T", "upload-file", TRUE},
- {"u", "user", TRUE},
- {"U", "proxy-user", TRUE},
- {"v", "verbose", FALSE},
- {"V", "version", FALSE},
- {"w", "write-out", TRUE},
- {"x", "proxy", TRUE},
- {"xa", "preproxy", TRUE},
- {"X", "request", TRUE},
- {"Y", "speed-limit", TRUE},
- {"y", "speed-time", TRUE},
- {"z", "time-cond", TRUE},
- {"#", "progress-bar", FALSE},
- {":", "next", FALSE},
+ {"o", "output", ARG_STRING},
+ {"O", "remote-name", ARG_NONE},
+ {"Oa", "remote-name-all", ARG_BOOL},
+ {"p", "proxytunnel", ARG_BOOL},
+ {"P", "ftp-port", ARG_STRING},
+ {"q", "disable", ARG_BOOL},
+ {"Q", "quote", ARG_STRING},
+ {"r", "range", ARG_STRING},
+ {"R", "remote-time", ARG_BOOL},
+ {"s", "silent", ARG_BOOL},
+ {"S", "show-error", ARG_BOOL},
+ {"t", "telnet-option", ARG_STRING},
+ {"T", "upload-file", ARG_STRING},
+ {"u", "user", ARG_STRING},
+ {"U", "proxy-user", ARG_STRING},
+ {"v", "verbose", ARG_BOOL},
+ {"V", "version", ARG_BOOL},
+ {"w", "write-out", ARG_STRING},
+ {"x", "proxy", ARG_STRING},
+ {"xa", "preproxy", ARG_STRING},
+ {"X", "request", ARG_STRING},
+ {"Y", "speed-limit", ARG_STRING},
+ {"y", "speed-time", ARG_STRING},
+ {"z", "time-cond", ARG_STRING},
+ {"#", "progress-bar", ARG_BOOL},
+ {":", "next", ARG_NONE},
};
/* Split the argument of -E to 'certname' and 'passphrase' separated by colon.
@@ -415,10 +423,10 @@ GetFileAndPassword(char *nextarg, char **file, char **password)
cleanarg(nextarg);
}
-ParameterError getparameter(char *flag, /* f or -long-flag */
- char *nextarg, /* NULL if unset */
- bool *usedarg, /* set to TRUE if the arg
- has been used */
+ParameterError getparameter(const char *flag, /* f or -long-flag */
+ char *nextarg, /* NULL if unset */
+ bool *usedarg, /* set to TRUE if the arg
+ has been used */
struct GlobalConfig *global,
struct OperationConfig *config)
{
@@ -435,11 +443,12 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
bool toggle = TRUE; /* how to switch boolean options, on or off. Controlled
by using --OPTION or --no-OPTION */
+ *usedarg = FALSE; /* default is that we don't use the arg */
if(('-' != flag[0]) ||
(('-' == flag[0]) && ('-' == flag[1]))) {
/* this should be a long name */
- char *word = ('-' == flag[0]) ? flag+2 : flag;
+ const char *word = ('-' == flag[0]) ? flag+2 : flag;
size_t fnam = strlen(word);
int numhits = 0;
@@ -488,7 +497,6 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
letter = parse[0];
subletter = parse[1];
}
- *usedarg = FALSE; /* default is that we don't use the arg */
if(hit < 0) {
for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) {
@@ -502,7 +510,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
}
}
- if(aliases[hit].extraparam) {
+ if(aliases[hit].desc == ARG_STRING) {
/* this option requires an extra parameter */
if(!longopt && parse[1]) {
nextarg = (char *)&parse[1]; /* this is the actual extra parameter */
@@ -513,6 +521,8 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
else
*usedarg = TRUE; /* mark it as used */
}
+ else if((aliases[hit].desc == ARG_NONE) && !toggle)
+ return PARAM_NO_PREFIX;
switch(letter) {
case '*': /* options without a short option */
@@ -535,7 +545,8 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
GetStr(&config->oauth_bearer, nextarg);
break;
case 'c': /* connect-timeout */
- err = str2udouble(&config->connecttimeout, nextarg);
+ err = str2udouble(&config->connecttimeout, nextarg,
+ LONG_MAX/1000);
if(err)
return err;
break;
@@ -552,11 +563,6 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
case 'E': /* --epsv */
config->disable_epsv = (!toggle)?TRUE:FALSE;
break;
-#ifdef USE_ENVIRONMENT
- case 'f':
- config->writeenv = toggle;
- break;
-#endif
case 'F': /* --dns-servers */
/* IP addrs of DNS servers */
GetStr(&config->dns_servers, nextarg);
@@ -780,11 +786,10 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(!url)
return PARAM_NO_MEM;
- else {
- /* fill in the URL */
- GetStr(&url->url, nextarg);
- url->flags |= GETOUT_URL;
- }
+
+ /* fill in the URL */
+ GetStr(&url->url, nextarg);
+ url->flags |= GETOUT_URL;
}
}
break;
@@ -875,7 +880,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
&config->localportrange);
if(!rc)
return PARAM_BAD_USE;
- else if(rc == 1)
+ if(rc == 1)
config->localportrange = 1; /* default number of ports to try */
else {
config->localportrange -= config->localport;
@@ -1024,6 +1029,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
#endif
break;
case 'M': /* --unix-socket */
+ config->abstract_unix_socket = FALSE;
GetStr(&config->unix_socket_path, nextarg);
break;
case 'N': /* --path-as-is */
@@ -1042,7 +1048,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
return err;
break;
case 'R': /* --expect100-timeout */
- err = str2udouble(&config->expect100timeout, nextarg);
+ err = str2udouble(&config->expect100timeout, nextarg, LONG_MAX/1000);
if(err)
return err;
break;
@@ -1054,6 +1060,18 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(err)
return err;
break;
+ case 'W': /* --abstract-unix-socket */
+ config->abstract_unix_socket = TRUE;
+ GetStr(&config->unix_socket_path, nextarg);
+ break;
+ case 'X': /* --tls-max */
+ err = str2tls_max(&config->ssl_version_max, nextarg);
+ if(err)
+ return err;
+ break;
+ case 'Y': /* --suppress-connect-headers */
+ config->suppress_connect_headers = toggle;
+ break;
}
break;
case '#': /* --progress-bar */
@@ -1540,11 +1558,27 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
config->proxy_insecure_ok = toggle;
break;
- case '9':
+ case '9': /* --proxy-tlsv1 */
/* TLS version 1 for proxy */
config->proxy_ssl_version = CURL_SSLVERSION_TLSv1;
break;
+ case 'A':
+ /* --socks5-basic */
+ if(toggle)
+ config->socks5_auth |= CURLAUTH_BASIC;
+ else
+ config->socks5_auth &= ~CURLAUTH_BASIC;
+ break;
+
+ case 'B':
+ /* --socks5-gssapi */
+ if(toggle)
+ config->socks5_auth |= CURLAUTH_GSSAPI;
+ else
+ config->socks5_auth &= ~CURLAUTH_GSSAPI;
+ break;
+
default: /* unknown flag */
return PARAM_OPTION_UNKNOWN;
}
@@ -1577,7 +1611,11 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
break;
case 'G': /* HTTP GET */
- config->use_httpget = TRUE;
+ if(subletter == 'a') { /* --request-target */
+ GetStr(&config->request_target, nextarg);
+ }
+ else
+ config->use_httpget = TRUE;
break;
case 'h': /* h for help */
@@ -1588,12 +1626,45 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
break;
case 'H':
/* A custom header to append to a list */
- if(subletter == 'p') /* --proxy-header */
- err = add2list(&config->proxyheaders, nextarg);
- else
- err = add2list(&config->headers, nextarg);
- if(err)
- return err;
+ if(nextarg[0] == '@') {
+ /* read many headers from a file or stdin */
+ char *string;
+ size_t len;
+ bool use_stdin = !strcmp(&nextarg[1], "-");
+ FILE *file = use_stdin?stdin:fopen(&nextarg[1], FOPEN_READTEXT);
+ if(!file)
+ warnf(global, "Failed to open %s!\n", &nextarg[1]);
+ else {
+ err = file2memory(&string, &len, file);
+ if(!err) {
+ /* Allow strtok() here since this isn't used threaded */
+ /* !checksrc! disable BANNEDFUNC 2 */
+ char *h = strtok(string, "\r\n");
+ while(h) {
+ if(subletter == 'p') /* --proxy-header */
+ err = add2list(&config->proxyheaders, h);
+ else
+ err = add2list(&config->headers, h);
+ if(err)
+ break;
+ h = strtok(NULL, "\r\n");
+ }
+ free(string);
+ }
+ if(!use_stdin)
+ fclose(file);
+ if(err)
+ return err;
+ }
+ }
+ else {
+ if(subletter == 'p') /* --proxy-header */
+ err = add2list(&config->proxyheaders, nextarg);
+ else
+ err = add2list(&config->headers, nextarg);
+ if(err)
+ return err;
+ }
break;
case 'i':
config->include_headers = toggle; /* include the headers as well in the
@@ -1643,7 +1714,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
break;
case 'm':
/* specified max time */
- err = str2udouble(&config->timeout, nextarg);
+ err = str2udouble(&config->timeout, nextarg, LONG_MAX/1000);
if(err)
return err;
break;
@@ -1712,21 +1783,20 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(!url)
return PARAM_NO_MEM;
+
+ /* fill in the outfile */
+ if('o' == letter) {
+ GetStr(&url->outfile, nextarg);
+ url->flags &= ~GETOUT_USEREMOTE; /* switch off */
+ }
else {
- /* fill in the outfile */
- if('o' == letter) {
- GetStr(&url->outfile, nextarg);
+ url->outfile = NULL; /* leave it */
+ if(toggle)
+ url->flags |= GETOUT_USEREMOTE; /* switch on */
+ else
url->flags &= ~GETOUT_USEREMOTE; /* switch off */
- }
- else {
- url->outfile = NULL; /* leave it */
- if(toggle)
- url->flags |= GETOUT_USEREMOTE; /* switch on */
- else
- url->flags &= ~GETOUT_USEREMOTE; /* switch off */
- }
- url->flags |= GETOUT_OUTFILE;
}
+ url->flags |= GETOUT_OUTFILE;
}
break;
case 'P':
@@ -1851,14 +1921,13 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(!url)
return PARAM_NO_MEM;
+
+ url->flags |= GETOUT_UPLOAD; /* mark -T used */
+ if(!*nextarg)
+ url->flags |= GETOUT_NOUPLOAD;
else {
- url->flags |= GETOUT_UPLOAD; /* mark -T used */
- if(!*nextarg)
- url->flags |= GETOUT_NOUPLOAD;
- else {
- /* "-" equals stdin, but keep the string around for now */
- GetStr(&url->infile, nextarg);
- }
+ /* "-" equals stdin, but keep the string around for now */
+ GetStr(&url->infile, nextarg);
}
}
break;
@@ -1981,7 +2050,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
/* failed, remove time condition */
config->timecond = CURL_TIMECOND_NONE;
warnf(global,
- "Illegal date format for -z, --timecond (and not "
+ "Illegal date format for -z, --time-cond (and not "
"a file name). Disabling time condition. "
"See curl_getdate(3) for valid date syntax.\n");
}
diff --git a/src/tool_getparam.h b/src/tool_getparam.h
index 0c85c690..2148e409 100644
--- a/src/tool_getparam.h
+++ b/src/tool_getparam.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -40,13 +40,15 @@ typedef enum {
PARAM_LIBCURL_UNSUPPORTED_PROTOCOL,
PARAM_NO_MEM,
PARAM_NEXT_OPERATION,
+ PARAM_NO_PREFIX,
+ PARAM_NUMBER_TOO_LARGE,
PARAM_LAST
} ParameterError;
struct GlobalConfig;
struct OperationConfig;
-ParameterError getparameter(char *flag, char *nextarg, bool *usedarg,
+ParameterError getparameter(const char *flag, char *nextarg, bool *usedarg,
struct GlobalConfig *global,
struct OperationConfig *operation);
diff --git a/src/tool_getpass.c b/src/tool_getpass.c
index 8e3e5fa8..e5e2d6dc 100644
--- a/src/tool_getpass.c
+++ b/src/tool_getpass.c
@@ -207,18 +207,16 @@ static bool ttyecho(bool enable, int fd)
#endif
return TRUE; /* disabled */
}
- else {
- /* re-enable echo, assumes we disabled it before (and set the structs we
- now use to reset the terminal status) */
+ /* re-enable echo, assumes we disabled it before (and set the structs we
+ now use to reset the terminal status) */
#ifdef HAVE_TERMIOS_H
- tcsetattr(fd, TCSAFLUSH, &withecho);
+ tcsetattr(fd, TCSAFLUSH, &withecho);
#elif defined(HAVE_TERMIO_H)
- ioctl(fd, TCSETA, &withecho);
+ ioctl(fd, TCSETA, &withecho);
#else
- return FALSE; /* not enabled */
+ return FALSE; /* not enabled */
#endif
- return TRUE; /* enabled */
- }
+ return TRUE; /* enabled */
}
char *getpass_r(const char *prompt, /* prompt to display */
diff --git a/src/tool_help.c b/src/tool_help.c
index a21a336d..42dc7795 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,255 +33,440 @@
#endif
/*
- * A few of these source lines are >80 columns wide, but that's only because
- * breaking the strings narrower makes this chunk look even worse!
- *
- * Starting with 7.18.0, this list of command line options is sorted based
- * on the long option name. It is not done automatically, although a command
- * line like the following can help out:
- *
- * curl --help | cut -c5- | grep "^-" | sort
+ * The help output is generated with the following command
+ ---------------------------------------------------------
+
+ cd $srcroot/docs/cmdline-opts
+ ./gen.pl listhelp
*/
-static const char *const helptext[] = {
- "Usage: curl [options...] <url>",
- "Options: (H) means HTTP/HTTPS only, (F) means FTP only",
- " --anyauth Pick \"any\" authentication method (H)",
- " -a, --append Append to target file when uploading (F/SFTP)",
- " --basic Use HTTP Basic Authentication (H)",
- " --cacert FILE CA certificate to verify peer against (SSL)",
- " --capath DIR CA directory to verify peer against (SSL)",
- " -E, --cert CERT[:PASSWD] Client certificate file and password (SSL)",
- " --cert-status Verify the status of the server certificate (SSL)",
- " --cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)",
- " --ciphers LIST SSL ciphers to use (SSL)",
- " --compressed Request compressed response (using deflate or gzip)",
- " -K, --config FILE Read config from FILE",
- " --connect-timeout SECONDS Maximum time allowed for connection",
- " --connect-to HOST1:PORT1:HOST2:PORT2 Connect to host (network level)",
- " -C, --continue-at OFFSET Resumed transfer OFFSET",
- " -b, --cookie STRING/FILE Read cookies from STRING/FILE (H)",
- " -c, --cookie-jar FILE Write cookies to FILE after operation (H)",
- " --create-dirs Create necessary local directory hierarchy",
- " --crlf Convert LF to CRLF in upload",
- " --crlfile FILE Get a CRL list in PEM format from the given file",
- " -d, --data DATA HTTP POST data (H)",
- " --data-raw DATA HTTP POST data, '@' allowed (H)",
- " --data-ascii DATA HTTP POST ASCII data (H)",
- " --data-binary DATA HTTP POST binary data (H)",
- " --data-urlencode DATA HTTP POST data url encoded (H)",
- " --delegation STRING GSS-API delegation permission",
- " --digest Use HTTP Digest Authentication (H)",
- " --disable-eprt Inhibit using EPRT or LPRT (F)",
- " --disable-epsv Inhibit using EPSV (F)",
- " --dns-servers DNS server addrs to use: 1.1.1.1;2.2.2.2",
- " --dns-interface Interface to use for DNS requests",
- " --dns-ipv4-addr IPv4 address to use for DNS requests, dot notation",
- " --dns-ipv6-addr IPv6 address to use for DNS requests, dot notation",
- " -D, --dump-header FILE Write the received headers to FILE",
- " --egd-file FILE EGD socket path for random data (SSL)",
- " --engine ENGINE Crypto engine (use \"--engine list\" for list) (SSL)",
-#ifdef USE_ENVIRONMENT
- " --environment Write results to environment variables (RISC OS)",
-#endif
- " --expect100-timeout SECONDS How long to wait for 100-continue (H)",
- " -f, --fail Fail silently (no output at all) on HTTP errors (H)",
- " --fail-early Fail on first transfer error, do not continue",
- " --false-start Enable TLS False Start.",
- " -F, --form CONTENT Specify HTTP multipart POST data (H)",
- " --form-string STRING Specify HTTP multipart POST data (H)",
- " --ftp-account DATA Account data string (F)",
- " --ftp-alternative-to-user COMMAND "
- "String to replace \"USER [name]\" (F)",
- " --ftp-create-dirs Create the remote dirs if not present (F)",
- " --ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)",
- " --ftp-pasv Use PASV/EPSV instead of PORT (F)",
- " -P, --ftp-port ADR Use PORT with given address instead of PASV (F)",
- " --ftp-skip-pasv-ip Skip the IP address for PASV (F)\n"
- " --ftp-pret Send PRET before PASV (for drftpd) (F)",
- " --ftp-ssl-ccc Send CCC after authenticating (F)",
- " --ftp-ssl-ccc-mode ACTIVE/PASSIVE Set CCC mode (F)",
- " --ftp-ssl-control Require SSL/TLS for FTP login, "
- "clear for transfer (F)",
- " -G, --get Send the -d data with a HTTP GET (H)",
- " -g, --globoff Disable URL sequences and ranges using {} and []",
- " -H, --header LINE Pass custom header LINE to server (H)",
- " -I, --head Show document info only",
- " -h, --help This help text",
- " --hostpubmd5 MD5 "
- "Hex-encoded MD5 string of the host public key. (SSH)",
- " -0, --http1.0 Use HTTP 1.0 (H)",
- " --http1.1 Use HTTP 1.1 (H)",
- " --http2 Use HTTP 2 (H)",
- " --http2-prior-knowledge Use HTTP 2 without HTTP/1.1 Upgrade (H)",
- " --ignore-content-length Ignore the HTTP Content-Length header",
- " -i, --include Include protocol headers in the output (H/F)",
- " -k, --insecure Allow connections to SSL sites without certs (H)",
- " --interface INTERFACE Use network INTERFACE (or address)",
- " -4, --ipv4 Resolve name to IPv4 address",
- " -6, --ipv6 Resolve name to IPv6 address",
- " -j, --junk-session-cookies Ignore session cookies read from file (H)",
- " --keepalive-time SECONDS Wait SECONDS between keepalive probes",
- " --key KEY Private key file name (SSL/SSH)",
- " --key-type TYPE Private key file type (DER/PEM/ENG) (SSL)",
- " --krb LEVEL Enable Kerberos with security LEVEL (F)",
-#ifndef CURL_DISABLE_LIBCURL_OPTION
- " --libcurl FILE Dump libcurl equivalent code of this command line",
-#endif
- " --limit-rate RATE Limit transfer speed to RATE",
- " -l, --list-only List only mode (F/POP3)",
- " --local-port RANGE Force use of RANGE for local port numbers",
- " -L, --location Follow redirects (H)",
- " --location-trusted "
- "Like '--location', and send auth to other hosts (H)",
- " --login-options OPTIONS Server login options (IMAP, POP3, SMTP)",
- " -M, --manual Display the full manual",
- " --mail-from FROM Mail from this address (SMTP)",
- " --mail-rcpt TO Mail to this/these addresses (SMTP)",
- " --mail-auth AUTH Originator address of the original email (SMTP)",
- " --max-filesize BYTES Maximum file size to download (H/F)",
- " --max-redirs NUM Maximum number of redirects allowed (H)",
- " -m, --max-time SECONDS Maximum time allowed for the transfer",
- " --metalink Process given URLs as metalink XML file",
- " --negotiate Use HTTP Negotiate (SPNEGO) authentication (H)",
- " -n, --netrc Must read .netrc for user name and password",
- " --netrc-optional Use either .netrc or URL; overrides -n",
- " --netrc-file FILE Specify FILE for netrc",
- " -:, --next "
- "Allows the following URL to use a separate set of options",
- " --no-alpn Disable the ALPN TLS extension (H)",
- " -N, --no-buffer Disable buffering of the output stream",
- " --no-keepalive Disable keepalive use on the connection",
- " --no-npn Disable the NPN TLS extension (H)",
- " --no-sessionid Disable SSL session-ID reusing (SSL)",
- " --noproxy List of hosts which do not use proxy",
- " --ntlm Use HTTP NTLM authentication (H)",
- " --ntlm-wb Use HTTP NTLM authentication with winbind (H)",
- " --oauth2-bearer TOKEN OAuth 2 Bearer Token (IMAP, POP3, SMTP)",
- " -o, --output FILE Write to FILE instead of stdout",
- " --pass PASS Pass phrase for the private key (SSL/SSH)",
- " --path-as-is Do not squash .. sequences in URL path",
- " --pinnedpubkey FILE/HASHES Public key to verify peer against (SSL)",
- " --post301 "
- "Do not switch to GET after following a 301 redirect (H)",
- " --post302 "
- "Do not switch to GET after following a 302 redirect (H)",
- " --post303 "
- "Do not switch to GET after following a 303 redirect (H)",
- " --preproxy [PROTOCOL://]HOST[:PORT] Proxy before HTTP(S) proxy",
- " -#, --progress-bar Display transfer progress as a progress bar",
- " --proto PROTOCOLS Enable/disable PROTOCOLS",
- " --proto-default PROTOCOL Use PROTOCOL for any URL missing a scheme",
- " --proto-redir PROTOCOLS Enable/disable PROTOCOLS on redirect",
- " -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port",
- " --proxy-anyauth Pick \"any\" proxy authentication method (H)",
- " --proxy-basic Use Basic authentication on the proxy (H)",
- " --proxy-digest Use Digest authentication on the proxy (H)",
- " --proxy-cacert FILE "
- "CA certificate to verify peer against for proxy (SSL)",
- " --proxy-capath DIR "
- "CA directory to verify peer against for proxy (SSL)",
- " --proxy-cert CERT[:PASSWD] "
- "Client certificate file and password for proxy (SSL)",
- " --proxy-cert-type TYPE "
- "Certificate file type (DER/PEM/ENG) for proxy (SSL)",
- " --proxy-ciphers LIST SSL ciphers to use for proxy (SSL)",
- " --proxy-crlfile FILE "
- "Get a CRL list in PEM format from the given file for proxy",
- " --proxy-insecure "
- "Allow connections to SSL sites without certs for proxy (H)",
- " --proxy-key KEY Private key file name for proxy (SSL)",
- " --proxy-key-type TYPE "
- "Private key file type for proxy (DER/PEM/ENG) (SSL)",
- " --proxy-negotiate "
- "Use HTTP Negotiate (SPNEGO) authentication on the proxy (H)",
- " --proxy-ntlm Use NTLM authentication on the proxy (H)",
- " --proxy-header LINE Pass custom header LINE to proxy (H)",
- " --proxy-pass PASS Pass phrase for the private key for proxy (SSL)",
- " --proxy-ssl-allow-beast "
- "Allow security flaw to improve interop for proxy (SSL)",
- " --proxy-tlsv1 Use TLSv1 for proxy (SSL)",
- " --proxy-tlsuser USER TLS username for proxy",
- " --proxy-tlspassword STRING TLS password for proxy",
- " --proxy-tlsauthtype STRING "
- "TLS authentication type for proxy (default SRP)",
- " --proxy-service-name NAME SPNEGO proxy service name",
- " --service-name NAME SPNEGO service name",
- " -U, --proxy-user USER[:PASSWORD] Proxy user and password",
- " --proxy1.0 HOST[:PORT] Use HTTP/1.0 proxy on given port",
- " -p, --proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
- " --pubkey KEY Public key file name (SSH)",
- " -Q, --quote CMD Send command(s) to server before transfer (F/SFTP)",
- " --random-file FILE File for reading random data from (SSL)",
- " -r, --range RANGE Retrieve only the bytes within RANGE",
- " --raw Do HTTP \"raw\"; no transfer decoding (H)",
- " -e, --referer Referer URL (H)",
- " -J, --remote-header-name Use the header-provided filename (H)",
- " -O, --remote-name Write output to a file named as the remote file",
- " --remote-name-all Use the remote file name for all URLs",
- " -R, --remote-time Set the remote file's time on the local output",
- " -X, --request COMMAND Specify request command to use",
- " --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS",
- " --retry NUM "
- "Retry request NUM times if transient problems occur",
- " --retry-connrefused Retry on connection refused (use with --retry)",
- " --retry-delay SECONDS Wait SECONDS between retries",
- " --retry-max-time SECONDS Retry only within this period",
- " --sasl-ir Enable initial response in SASL authentication",
- " -S, --show-error "
- "Show error. With -s, make curl show errors when they occur",
- " -s, --silent Silent mode (don't output anything)",
- " --socks4 HOST[:PORT] SOCKS4 proxy on given host + port",
- " --socks4a HOST[:PORT] SOCKS4a proxy on given host + port",
- " --socks5 HOST[:PORT] SOCKS5 proxy on given host + port",
- " --socks5-hostname HOST[:PORT] "
- "SOCKS5 proxy, pass host name to proxy",
- " --socks5-gssapi-service NAME SOCKS5 proxy service name for GSS-API",
- " --socks5-gssapi-nec Compatibility with NEC SOCKS5 server",
- " -Y, --speed-limit RATE "
- "Stop transfers below RATE for 'speed-time' secs",
- " -y, --speed-time SECONDS "
- "Trigger 'speed-limit' abort after SECONDS (default: 30)",
- " --ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)",
- " --ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)",
- " -2, --sslv2 Use SSLv2 (SSL)",
- " -3, --sslv3 Use SSLv3 (SSL)",
- " --ssl-allow-beast Allow security flaw to improve interop (SSL)",
- " --ssl-no-revoke Disable cert revocation checks (WinSSL)",
- " --stderr FILE Where to redirect stderr (use \"-\" for stdout)",
- " --tcp-nodelay Use the TCP_NODELAY option",
- " --tcp-fastopen Use TCP Fast Open",
- " -t, --telnet-option OPT=VAL Set telnet option",
- " --tftp-blksize VALUE Set TFTP BLKSIZE option (must be >512)",
- " --tftp-no-options Do not send TFTP options requests",
- " -z, --time-cond TIME Transfer based on a time condition",
- " -1, --tlsv1 Use >= TLSv1 (SSL)",
- " --tlsv1.0 Use TLSv1.0 (SSL)",
- " --tlsv1.1 Use TLSv1.1 (SSL)",
- " --tlsv1.2 Use TLSv1.2 (SSL)",
- " --tlsv1.3 Use TLSv1.3 (SSL)",
- " --trace FILE Write a debug trace to FILE",
- " --trace-ascii FILE Like --trace, but without hex output",
- " --trace-time Add time stamps to trace/verbose output",
- " --tr-encoding Request compressed transfer encoding (H)",
- " -T, --upload-file FILE Transfer FILE to destination",
- " --url URL URL to work with",
- " -B, --use-ascii Use ASCII/text transfer",
- " -u, --user USER[:PASSWORD] Server user and password",
- " --tlsuser USER TLS username",
- " --tlspassword STRING TLS password",
- " --tlsauthtype STRING TLS authentication type (default: SRP)",
- " --unix-socket FILE Connect through this Unix domain socket",
- " -A, --user-agent STRING Send User-Agent STRING to server (H)",
- " -v, --verbose Make the operation more talkative",
- " -V, --version Show version number and quit",
-#ifdef USE_WATT32
- " --wdebug Turn on Watt-32 debugging",
-#endif
- " -w, --write-out FORMAT Use output FORMAT after completion",
- " --xattr Store metadata in extended file attributes",
- " -q, --disable Disable .curlrc (must be first parameter)",
- NULL
+struct helptxt {
+ const char *opt;
+ const char *desc;
+};
+
+static const struct helptxt helptext[] = {
+ {" --abstract-unix-socket <path>",
+ "Connect via abstract Unix domain socket"},
+ {" --anyauth",
+ "Pick any authentication method"},
+ {"-a, --append",
+ "Append to target file when uploading"},
+ {" --basic",
+ "Use HTTP Basic Authentication"},
+ {" --cacert <CA certificate>",
+ "CA certificate to verify peer against"},
+ {" --capath <dir>",
+ "CA directory to verify peer against"},
+ {"-E, --cert <certificate[:password]>",
+ "Client certificate file and password"},
+ {" --cert-status",
+ "Verify the status of the server certificate"},
+ {" --cert-type <type>",
+ "Certificate file type (DER/PEM/ENG)"},
+ {" --ciphers <list of ciphers>",
+ "SSL ciphers to use"},
+ {" --compressed",
+ "Request compressed response"},
+ {"-K, --config <file>",
+ "Read config from a file"},
+ {" --connect-timeout <seconds>",
+ "Maximum time allowed for connection"},
+ {" --connect-to <HOST1:PORT1:HOST2:PORT2>",
+ "Connect to host"},
+ {"-C, --continue-at <offset>",
+ "Resumed transfer offset"},
+ {"-b, --cookie <data>",
+ "Send cookies from string/file"},
+ {"-c, --cookie-jar <filename>",
+ "Write cookies to <filename> after operation"},
+ {" --create-dirs",
+ "Create necessary local directory hierarchy"},
+ {" --crlf",
+ "Convert LF to CRLF in upload"},
+ {" --crlfile <file>",
+ "Get a CRL list in PEM format from the given file"},
+ {"-d, --data <data>",
+ "HTTP POST data"},
+ {" --data-ascii <data>",
+ "HTTP POST ASCII data"},
+ {" --data-binary <data>",
+ "HTTP POST binary data"},
+ {" --data-raw <data>",
+ "HTTP POST data, '@' allowed"},
+ {" --data-urlencode <data>",
+ "HTTP POST data url encoded"},
+ {" --delegation <LEVEL>",
+ "GSS-API delegation permission"},
+ {" --digest",
+ "Use HTTP Digest Authentication"},
+ {"-q, --disable",
+ "Disable .curlrc"},
+ {" --disable-eprt",
+ "Inhibit using EPRT or LPRT"},
+ {" --disable-epsv",
+ "Inhibit using EPSV"},
+ {" --dns-interface <interface>",
+ "Interface to use for DNS requests"},
+ {" --dns-ipv4-addr <address>",
+ "IPv4 address to use for DNS requests"},
+ {" --dns-ipv6-addr <address>",
+ "IPv6 address to use for DNS requests"},
+ {" --dns-servers <addresses>",
+ "DNS server addrs to use"},
+ {"-D, --dump-header <filename>",
+ "Write the received headers to <filename>"},
+ {" --egd-file <file>",
+ "EGD socket path for random data"},
+ {" --engine <name>",
+ "Crypto engine to use"},
+ {" --expect100-timeout <seconds>",
+ "How long to wait for 100-continue"},
+ {"-f, --fail",
+ "Fail silently (no output at all) on HTTP errors"},
+ {" --fail-early",
+ "Fail on first transfer error, do not continue"},
+ {" --false-start",
+ "Enable TLS False Start"},
+ {"-F, --form <name=content>",
+ "Specify HTTP multipart POST data"},
+ {" --form-string <name=string>",
+ "Specify HTTP multipart POST data"},
+ {" --ftp-account <data>",
+ "Account data string"},
+ {" --ftp-alternative-to-user <command>",
+ "String to replace USER [name]"},
+ {" --ftp-create-dirs",
+ "Create the remote dirs if not present"},
+ {" --ftp-method <method>",
+ "Control CWD usage"},
+ {" --ftp-pasv",
+ "Use PASV/EPSV instead of PORT"},
+ {"-P, --ftp-port <address>",
+ "Use PORT instead of PASV"},
+ {" --ftp-pret",
+ "Send PRET before PASV"},
+ {" --ftp-skip-pasv-ip",
+ "Skip the IP address for PASV"},
+ {" --ftp-ssl-ccc",
+ "Send CCC after authenticating"},
+ {" --ftp-ssl-ccc-mode <active/passive>",
+ "Set CCC mode"},
+ {" --ftp-ssl-control",
+ "Require SSL/TLS for FTP login, clear for transfer"},
+ {"-G, --get",
+ "Put the post data in the URL and use GET"},
+ {"-g, --globoff",
+ "Disable URL sequences and ranges using {} and []"},
+ {"-I, --head",
+ "Show document info only"},
+ {"-H, --header <header/@file>",
+ "Pass custom header(s) to server"},
+ {"-h, --help",
+ "This help text"},
+ {" --hostpubmd5 <md5>",
+ "Acceptable MD5 hash of the host public key"},
+ {"-0, --http1.0",
+ "Use HTTP 1.0"},
+ {" --http1.1",
+ "Use HTTP 1.1"},
+ {" --http2",
+ "Use HTTP 2"},
+ {" --http2-prior-knowledge",
+ "Use HTTP 2 without HTTP/1.1 Upgrade"},
+ {" --ignore-content-length",
+ "Ignore the size of the remote resource"},
+ {"-i, --include",
+ "Include protocol response headers in the output"},
+ {"-k, --insecure",
+ "Allow insecure server connections when using SSL"},
+ {" --interface <name>",
+ "Use network INTERFACE (or address)"},
+ {"-4, --ipv4",
+ "Resolve names to IPv4 addresses"},
+ {"-6, --ipv6",
+ "Resolve names to IPv6 addresses"},
+ {"-j, --junk-session-cookies",
+ "Ignore session cookies read from file"},
+ {" --keepalive-time <seconds>",
+ "Interval time for keepalive probes"},
+ {" --key <key>",
+ "Private key file name"},
+ {" --key-type <type>",
+ "Private key file type (DER/PEM/ENG)"},
+ {" --krb <level>",
+ "Enable Kerberos with security <level>"},
+ {" --libcurl <file>",
+ "Dump libcurl equivalent code of this command line"},
+ {" --limit-rate <speed>",
+ "Limit transfer speed to RATE"},
+ {"-l, --list-only",
+ "List only mode"},
+ {" --local-port <num/range>",
+ "Force use of RANGE for local port numbers"},
+ {"-L, --location",
+ "Follow redirects"},
+ {" --location-trusted",
+ "Like --location, and send auth to other hosts"},
+ {" --login-options <options>",
+ "Server login options"},
+ {" --mail-auth <address>",
+ "Originator address of the original email"},
+ {" --mail-from <address>",
+ "Mail from this address"},
+ {" --mail-rcpt <address>",
+ "Mail from this address"},
+ {"-M, --manual",
+ "Display the full manual"},
+ {" --max-filesize <bytes>",
+ "Maximum file size to download"},
+ {" --max-redirs <num>",
+ "Maximum number of redirects allowed"},
+ {"-m, --max-time <time>",
+ "Maximum time allowed for the transfer"},
+ {" --metalink",
+ "Process given URLs as metalink XML file"},
+ {" --negotiate",
+ "Use HTTP Negotiate (SPNEGO) authentication"},
+ {"-n, --netrc",
+ "Must read .netrc for user name and password"},
+ {" --netrc-file <filename>",
+ "Specify FILE for netrc"},
+ {" --netrc-optional",
+ "Use either .netrc or URL"},
+ {"-:, --next",
+ "Make next URL use its separate set of options"},
+ {" --no-alpn",
+ "Disable the ALPN TLS extension"},
+ {"-N, --no-buffer",
+ "Disable buffering of the output stream"},
+ {" --no-keepalive",
+ "Disable TCP keepalive on the connection"},
+ {" --no-npn",
+ "Disable the NPN TLS extension"},
+ {" --no-sessionid",
+ "Disable SSL session-ID reusing"},
+ {" --noproxy <no-proxy-list>",
+ "List of hosts which do not use proxy"},
+ {" --ntlm",
+ "Use HTTP NTLM authentication"},
+ {" --ntlm-wb",
+ "Use HTTP NTLM authentication with winbind"},
+ {" --oauth2-bearer <token>",
+ "OAuth 2 Bearer Token"},
+ {"-o, --output <file>",
+ "Write to file instead of stdout"},
+ {" --pass <phrase>",
+ "Pass phrase for the private key"},
+ {" --path-as-is",
+ "Do not squash .. sequences in URL path"},
+ {" --pinnedpubkey <hashes>",
+ "FILE/HASHES Public key to verify peer against"},
+ {" --post301",
+ "Do not switch to GET after following a 301"},
+ {" --post302",
+ "Do not switch to GET after following a 302"},
+ {" --post303",
+ "Do not switch to GET after following a 303"},
+ {" --preproxy [protocol://]host[:port]",
+ "Use this proxy first"},
+ {"-#, --progress-bar",
+ "Display transfer progress as a bar"},
+ {" --proto <protocols>",
+ "Enable/disable PROTOCOLS"},
+ {" --proto-default <protocol>",
+ "Use PROTOCOL for any URL missing a scheme"},
+ {" --proto-redir <protocols>",
+ "Enable/disable PROTOCOLS on redirect"},
+ {"-x, --proxy [protocol://]host[:port]",
+ "Use this proxy"},
+ {" --proxy-anyauth",
+ "Pick any proxy authentication method"},
+ {" --proxy-basic",
+ "Use Basic authentication on the proxy"},
+ {" --proxy-cacert <file>",
+ "CA certificate to verify peer against for proxy"},
+ {" --proxy-capath <dir>",
+ "CA directory to verify peer against for proxy"},
+ {" --proxy-cert <cert[:passwd]>",
+ "Set client certificate for proxy"},
+ {" --proxy-cert-type <type>",
+ "Client certificate type for HTTS proxy"},
+ {" --proxy-ciphers <list>",
+ "SSL ciphers to use for proxy"},
+ {" --proxy-crlfile <file>",
+ "Set a CRL list for proxy"},
+ {" --proxy-digest",
+ "Use Digest authentication on the proxy"},
+ {" --proxy-header <header/@file>",
+ "Pass custom header(s) to proxy"},
+ {" --proxy-insecure",
+ "Do HTTPS proxy connections without verifying the proxy"},
+ {" --proxy-key <key>",
+ "Private key for HTTPS proxy"},
+ {" --proxy-key-type <type>",
+ "Private key file type for proxy"},
+ {" --proxy-negotiate",
+ "Use HTTP Negotiate (SPNEGO) authentication on the proxy"},
+ {" --proxy-ntlm",
+ "Use NTLM authentication on the proxy"},
+ {" --proxy-pass <phrase>",
+ "Pass phrase for the private key for HTTPS proxy"},
+ {" --proxy-service-name <name>",
+ "SPNEGO proxy service name"},
+ {" --proxy-ssl-allow-beast",
+ "Allow security flaw for interop for HTTPS proxy"},
+ {" --proxy-tlsauthtype <type>",
+ "TLS authentication type for HTTPS proxy"},
+ {" --proxy-tlspassword <string>",
+ "TLS password for HTTPS proxy"},
+ {" --proxy-tlsuser <name>",
+ "TLS username for HTTPS proxy"},
+ {" --proxy-tlsv1",
+ "Use TLSv1 for HTTPS proxy"},
+ {"-U, --proxy-user <user:password>",
+ "Proxy user and password"},
+ {" --proxy1.0 <host[:port]>",
+ "Use HTTP/1.0 proxy on given port"},
+ {"-p, --proxytunnel",
+ "Operate through a HTTP proxy tunnel (using CONNECT)"},
+ {" --pubkey <key>",
+ "SSH Public key file name"},
+ {"-Q, --quote",
+ "Send command(s) to server before transfer"},
+ {" --random-file <file>",
+ "File for reading random data from"},
+ {"-r, --range <range>",
+ "Retrieve only the bytes within RANGE"},
+ {" --raw",
+ "Do HTTP \"raw\"; no transfer decoding"},
+ {"-e, --referer <URL>",
+ "Referrer URL"},
+ {"-J, --remote-header-name",
+ "Use the header-provided filename"},
+ {"-O, --remote-name",
+ "Write output to a file named as the remote file"},
+ {" --remote-name-all",
+ "Use the remote file name for all URLs"},
+ {"-R, --remote-time",
+ "Set the remote file's time on the local output"},
+ {"-X, --request <command>",
+ "Specify request command to use"},
+ {" --request-target",
+ "Specify the target for this request"},
+ {" --resolve <host:port:address>",
+ "Resolve the host+port to this address"},
+ {" --retry <num>",
+ "Retry request if transient problems occur"},
+ {" --retry-connrefused",
+ "Retry on connection refused (use with --retry)"},
+ {" --retry-delay <seconds>",
+ "Wait time between retries"},
+ {" --retry-max-time <seconds>",
+ "Retry only within this period"},
+ {" --sasl-ir",
+ "Enable initial response in SASL authentication"},
+ {" --service-name <name>",
+ "SPNEGO service name"},
+ {"-S, --show-error",
+ "Show error even when -s is used"},
+ {"-s, --silent",
+ "Silent mode"},
+ {" --socks4 <host[:port]>",
+ "SOCKS4 proxy on given host + port"},
+ {" --socks4a <host[:port]>",
+ "SOCKS4a proxy on given host + port"},
+ {" --socks5 <host[:port]>",
+ "SOCKS5 proxy on given host + port"},
+ {" --socks5-basic",
+ "Enable username/password auth for SOCKS5 proxies"},
+ {" --socks5-gssapi",
+ "Enable GSS-API auth for SOCKS5 proxies"},
+ {" --socks5-gssapi-nec",
+ "Compatibility with NEC SOCKS5 server"},
+ {" --socks5-gssapi-service <name>",
+ "SOCKS5 proxy service name for GSS-API"},
+ {" --socks5-hostname <host[:port]>",
+ "SOCKS5 proxy, pass host name to proxy"},
+ {"-Y, --speed-limit <speed>",
+ "Stop transfers slower than this"},
+ {"-y, --speed-time <seconds>",
+ "Trigger 'speed-limit' abort after this time"},
+ {" --ssl",
+ "Try SSL/TLS"},
+ {" --ssl-allow-beast",
+ "Allow security flaw to improve interop"},
+ {" --ssl-no-revoke",
+ "Disable cert revocation checks (WinSSL)"},
+ {" --ssl-reqd",
+ "Require SSL/TLS"},
+ {"-2, --sslv2",
+ "Use SSLv2"},
+ {"-3, --sslv3",
+ "Use SSLv3"},
+ {" --stderr",
+ "Where to redirect stderr"},
+ {" --suppress-connect-headers",
+ "Suppress proxy CONNECT response headers"},
+ {" --tcp-fastopen",
+ "Use TCP Fast Open"},
+ {" --tcp-nodelay",
+ "Use the TCP_NODELAY option"},
+ {"-t, --telnet-option <opt=val>",
+ "Set telnet option"},
+ {" --tftp-blksize <value>",
+ "Set TFTP BLKSIZE option"},
+ {" --tftp-no-options",
+ "Do not send any TFTP options"},
+ {"-z, --time-cond <time>",
+ "Transfer based on a time condition"},
+ {" --tls-max <VERSION>",
+ "Use TLSv1.0 or greater"},
+ {" --tlsauthtype <type>",
+ "TLS authentication type"},
+ {" --tlspassword",
+ "TLS password"},
+ {" --tlsuser <name>",
+ "TLS user name"},
+ {"-1, --tlsv1",
+ "Use TLSv1.0 or greater"},
+ {" --tlsv1.0",
+ "Use TLSv1.0"},
+ {" --tlsv1.1",
+ "Use TLSv1.1"},
+ {" --tlsv1.2",
+ "Use TLSv1.2"},
+ {" --tlsv1.3",
+ "Use TLSv1.3"},
+ {" --tr-encoding",
+ "Request compressed transfer encoding"},
+ {" --trace <file>",
+ "Write a debug trace to FILE"},
+ {" --trace-ascii <file>",
+ "Like --trace, but without hex output"},
+ {" --trace-time",
+ "Add time stamps to trace/verbose output"},
+ {" --unix-socket <path>",
+ "Connect through this Unix domain socket"},
+ {"-T, --upload-file <file>",
+ "Transfer local FILE to destination"},
+ {" --url <url>",
+ "URL to work with"},
+ {"-B, --use-ascii",
+ "Use ASCII/text transfer"},
+ {"-u, --user <user:password>",
+ "Server user and password"},
+ {"-A, --user-agent <name>",
+ "Send User-Agent <name> to server"},
+ {"-v, --verbose",
+ "Make the operation more talkative"},
+ {"-V, --version",
+ "Show version number and quit"},
+ {"-w, --write-out <format>",
+ "Use output FORMAT after completion"},
+ {" --xattr",
+ "Store metadata in extended file attributes"},
+ { NULL, NULL }
};
#ifdef NETWARE
@@ -322,8 +507,9 @@ static const struct feat feats[] = {
void tool_help(void)
{
int i;
- for(i = 0; helptext[i]; i++) {
- puts(helptext[i]);
+ puts("Usage: curl [options...] <url>");
+ for(i = 0; helptext[i].opt; i++) {
+ printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
#ifdef PRINT_LINES_PAUSE
if(i && ((i % PRINT_LINES_PAUSE) == 0))
tool_pressanykey();
@@ -336,6 +522,12 @@ void tool_version_info(void)
const char *const *proto;
printf(CURL_ID "%s\n", curl_version());
+#ifdef CURL_PATCHSTAMP
+ printf("Release-Date: %s, security patched: %s\n",
+ LIBCURL_TIMESTAMP, CURL_PATCHSTAMP);
+#else
+ printf("Release-Date: %s\n", LIBCURL_TIMESTAMP);
+#endif
if(curlinfo->protocols) {
printf("Protocols: ");
for(proto = curlinfo->protocols; *proto; ++proto) {
diff --git a/src/tool_helpers.c b/src/tool_helpers.c
index b5a619b9..b3a9516a 100644
--- a/src/tool_helpers.c
+++ b/src/tool_helpers.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -62,6 +62,10 @@ const char *param2text(int res)
return "a specified protocol is unsupported by libcurl";
case PARAM_NO_MEM:
return "out of memory";
+ case PARAM_NO_PREFIX:
+ return "the given option can't be reversed with a --no- prefix";
+ case PARAM_NUMBER_TOO_LARGE:
+ return "too large number";
default:
return "unknown error";
}
diff --git a/src/tool_homedir.c b/src/tool_homedir.c
index 26b6c535..483553d5 100644
--- a/src/tool_homedir.c
+++ b/src/tool_homedir.c
@@ -39,14 +39,14 @@ static char *GetEnv(const char *variable, char do_expand)
/* Don't use getenv(); it doesn't find variable added after program was
* started. Don't accept truncated results (i.e. rc >= sizeof(buf1)). */
- rc = GetEnvironmentVariable(variable, buf1, sizeof(buf1));
+ rc = GetEnvironmentVariableA(variable, buf1, sizeof(buf1));
if(rc > 0 && rc < sizeof(buf1)) {
env = buf1;
variable = buf1;
}
if(do_expand && strchr(variable, '%')) {
/* buf2 == variable if not expanded */
- rc = ExpandEnvironmentStrings(variable, buf2, sizeof(buf2));
+ rc = ExpandEnvironmentStringsA(variable, buf2, sizeof(buf2));
if(rc > 0 && rc < sizeof(buf2) &&
!strchr(buf2, '%')) /* no vars still unexpanded */
env = buf2;
diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c
index 90265a99..af7f32ad 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -2,7 +2,7 @@
#ifndef HAVE_LIBZ
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Wed Dec 21 13:40:15 2016
+ * Generation time: Tue Aug 8 09:32:01 2017
*/
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
@@ -123,8 +123,8 @@ void hugehelp(void)
" mixing progress meter and response data.\n"
"\n"
" If you want a progress meter for HTTP POST or PUT requests, you need to\n"
-" redirect the response output to a file, using shell redirect (>), -o\n"
-" [file] or similar.\n"
+" redirect the response output to a file, using shell redirect (>), -o,\n"
+" --output or similar.\n"
"\n"
, stdout);
fputs(
@@ -132,45 +132,56 @@ void hugehelp(void)
" out any response data to the terminal.\n"
"\n"
" If you prefer a progress \"bar\" instead of the regular meter, -#,\n"
-" --progress-bar is your friend.\n"
+" --progress-bar is your friend. You can also disable the progress meter\n"
+" completely with the -s, --silent option.\n"
"\n"
"OPTIONS\n"
-" Options start with one or two dashes. Many of the options require an\n"
+" Options start with one or two dashes. Many of the options require an\n"
" additional value next to them.\n"
"\n"
-" The short \"single-dash\" form of the options, -d for example, may be\n"
, stdout);
fputs(
+" The short \"single-dash\" form of the options, -d for example, may be\n"
" used with or without a space between it and its value, although a space\n"
" is a recommended separator. The long \"double-dash\" form, -d, --data for\n"
" example, requires a space between it and its value.\n"
"\n"
" Short version options that don't need any additional values can be used\n"
-" immediately next to each other, like for example you can specify all\n"
-" the options -O, -L and -v at once as -OLv.\n"
-"\n"
+" immediately next to each other, like for example you can specify all\n"
, stdout);
fputs(
+" the options -O, -L and -v at once as -OLv.\n"
+"\n"
" In general, all boolean options are enabled with --option and yet again\n"
-" disabled with --no-option. That is, you use the exact same option name\n"
+" disabled with --no-option. That is, you use the exact same option name\n"
" 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"
+" 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"
+, stdout);
+ fputs(
+"\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"
+" abstract socket prefixed with '@', however the <path> argument\n"
+" should not have this leading character.\n"
+"\n"
+" Added in 7.53.0.\n"
"\n"
" --anyauth\n"
+" (HTTP) Tells curl to figure out authentication method by itself,\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"
" 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"
+, stdout);
+ fputs(
" Using --anyauth is not recommended if you do uploads from stdin,\n"
" since it may require data to be sent twice and then the client\n"
" must be able to rewind. If the need should arise when uploading\n"
@@ -329,52 +340,43 @@ void hugehelp(void)
" of ciphers must specify valid ciphers. Read up on SSL cipher\n"
" list details on this URL:\n"
"\n"
-" https://www.openssl.org/docs/apps/ciphers.html\n"
+" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
, stdout);
fputs(
-" NSS ciphers are done differently than OpenSSL and GnuTLS. The\n"
-" full list of NSS ciphers is in the NSSCipherSuite entry at this\n"
-" URL:\n"
-"\n"
-" https://git.fedora-\n"
-" hosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\n"
-"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --compressed\n"
" (HTTP) Request a compressed response using one of the algorithms\n"
-, stdout);
- fputs(
-" curl supports, and save the uncompressed document. If this\n"
-" option is used and the server sends an unsupported encoding,\n"
+" curl supports, and save the uncompressed document. If this\n"
+" option is used and the server sends an unsupported encoding,\n"
" curl will report an error.\n"
"\n"
" -K, --config <file>\n"
-" Specify which config file to read curl arguments from. The con-\n"
-" fig file is a text file in which command line arguments can be\n"
-" written which then will be used as if they were written on the\n"
-" actual command line.\n"
"\n"
+" Specify a text file to read curl arguments from. The command\n"
, stdout);
fputs(
-" Options and their parameters must be specified on the same con-\n"
-" fig file line, separated by whitespace, colon, or the equals\n"
-" sign. Long option names can optionally be given in the config\n"
-" file without the initial double dashes and if so, the colon or\n"
-" equals characters can be used as separators. If the option is\n"
-" specified with one or two dashes, there can be no colon or\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"
+" in the file, separated by whitespace, colon, or the equals sign.\n"
+" Long option names can optionally be given in the config file\n"
+" without the initial double dashes and if so, the colon or equals\n"
, stdout);
fputs(
-" equals character between the option and its parameter.\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 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"
, stdout);
fputs(
+" 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"
" line in the config file.\n"
"\n"
@@ -382,33 +384,32 @@ void hugehelp(void)
" the file from stdin.\n"
"\n"
" Note that to be able to specify a URL in the config file, you\n"
+, stdout);
+ fputs(
" 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"
" this:\n"
"\n"
-, stdout);
- fputs(
" url = \"https://curl.haxx.se/docs/\"\n"
"\n"
-" When curl is invoked, it always (unless -q, --disable is used)\n"
-" checks for a default config file and uses it if found. The\n"
-" default config file is checked for in the following places in\n"
-" this order:\n"
+" 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"
+" 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"
, stdout);
fputs(
-" it uses getpwuid() on Unix-like systems (which returns the home\n"
-" dir given the current user in your system). On Windows, it then\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"
+" 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"
" PROFILE%\\Application Data'.\n"
"\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"
, stdout);
fputs(
-" Unix-like systems, it will simply try to load .curlrc from the\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"
" # --- Example file ---\n"
@@ -417,164 +418,164 @@ void hugehelp(void)
" output = \"curlhere.html\"\n"
" user-agent = \"superagent/1.0\"\n"
"\n"
+, stdout);
+ fputs(
" # and fetch another URL too\n"
" url = \"example.com/docs/manpage.html\"\n"
" -O\n"
" referer = \"http://nowhereatall.example.com/\"\n"
-, stdout);
- fputs(
" # --- End of example file ---\n"
"\n"
-" This option can be used multiple times to load multiple config\n"
+" This option can be used multiple times to load multiple config\n"
" files.\n"
"\n"
" --connect-timeout <seconds>\n"
-" Maximum time in seconds that you allow curl's connection to\n"
-" 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"
+" 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"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -m, --max-time.\n"
"\n"
" --connect-to <HOST1:PORT1:HOST2:PORT2>\n"
"\n"
-" For a request to the given HOST:PORT pair, connect to CONNECT-\n"
-" TO-HOST:CONNECT-TO-PORT instead. This option is suitable to\n"
+" For a request to the given HOST:PORT pair, connect to CONNECT-\n"
+, stdout);
+ fputs(
+" TO-HOST:CONNECT-TO-PORT instead. This option is suitable to\n"
" direct requests at a specific server, e.g. at a specific cluster\n"
-" node in a cluster of servers. This option is only used to\n"
+" node in a cluster of servers. This option is only used to\n"
+" establish the network connection. It does NOT affect the host-\n"
+" name/port that is used for TLS/SSL (e.g. SNI, certificate veri-\n"
+" fication) or for the application protocols. \"host\" and \"port\"\n"
, stdout);
fputs(
-" establish the network connection. It does NOT affect the host-\n"
-" name/port that is used for TLS/SSL (e.g. SNI, certificate veri-\n"
-" fication) or for the application protocols. \"host\" and \"port\"\n"
-" may be the empty string, meaning \"any host/port\". \"connect-to-\n"
-" host\" and \"connect-to-port\" may also be the empty string, mean-\n"
+" may be the empty string, meaning \"any host/port\". \"connect-to-\n"
+" host\" and \"connect-to-port\" may also be the empty string, mean-\n"
" ing \"use the request's original host/port\".\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"
-" 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"
+" 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"
" 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"
+" 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"
+" (HTTP) Specify to which file you want curl to write all cookies\n"
+" 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(
-" 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"
-" file will be written using the Netscape cookie file format. If\n"
+" 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"
+" 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"
-" 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(
+" 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"
" visible feedback you get about this possibly lethal situation.\n"
"\n"
-" If this option is used several times, the last specified file\n"
+" If this option is used several times, the last specified file\n"
" name will be used.\n"
"\n"
" -b, --cookie <data>\n"
" (HTTP) Pass the data to the HTTP server in the Cookie header. It\n"
-" 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(
+" is supposedly the data previously received from the server in a\n"
+" \"Set-Cookie:\" line. The data should be in the format\n"
" \"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"
, stdout);
fputs(
-" 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"
-" incoming cookies, which may be handy if you're using this in\n"
-" combination with the -L, --location option or do multiple URL\n"
+" 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.\n"
"\n"
-, stdout);
- fputs(
" 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"
+" HTTP headers (Set-Cookie style) or the Netscape/Mozilla cookie\n"
" file format.\n"
"\n"
-" 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"
-" -c, --cookie-jar option.\n"
-"\n"
-" Exercise caution if you are using this option and multiple\n"
+" The file specified with -b, --cookie is only used as input. No\n"
, stdout);
fputs(
+" cookies will be written to the file. To store cookies, use the\n"
+" -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"
+" a file use the Set-Cookie format and don't specify a domain,\n"
" 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"
, stdout);
fputs(
-" likely not what you intended. To address these issues set a\n"
-" domain in Set-Cookie (doing that will include sub domains) or\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"
" use the Netscape format.\n"
"\n"
-" If this option is used several times, the last one will be used.\n"
-" 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"
, stdout);
fputs(
+" If this option is used several times, the last one will be used.\n"
+" 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"
-" create the necessary local directory hierarchy as needed. This\n"
-" option creates the dirs mentioned with the -o, --output option,\n"
-" 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"
+" create the necessary local directory hierarchy as needed. This\n"
, stdout);
fputs(
-" To create remote directories when using FTP or SFTP, try --ftp-\n"
+" option creates the dirs mentioned with the -o, --output option,\n"
+" 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"
+" To create remote directories when using FTP or SFTP, try --ftp-\n"
" create-dirs.\n"
"\n"
-" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
+" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
" (OS/390).\n"
"\n"
" (SMTP added in 7.40.0)\n"
"\n"
+, stdout);
+ fputs(
" --crlfile <file>\n"
" (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"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.19.7.\n"
@@ -583,241 +584,241 @@ void hugehelp(void)
" (HTTP) This is just an alias for -d, --data.\n"
"\n"
" --data-binary <data>\n"
-" (HTTP) This posts data exactly as specified with no extra pro-\n"
-" cessing whatsoever.\n"
-"\n"
-" If you start the data with the letter @, the rest should be a\n"
-" filename. Data is posted in a similar manner as -d, --data\n"
, stdout);
fputs(
-" does, except that newlines and carriage returns are preserved\n"
+" (HTTP) This posts data exactly as specified with no extra pro-\n"
+" cessing whatsoever.\n"
+"\n"
+" If you start the data with the letter @, the rest should be a\n"
+" filename. Data is posted in a similar manner as -d, --data\n"
+" does, except that newlines and carriage returns are preserved\n"
" and conversions are never done.\n"
"\n"
-" If this option is used several times, the ones following the\n"
+" If this option is used several times, the ones following the\n"
+, stdout);
+ fputs(
" first will append data as described in -d, --data.\n"
"\n"
" --data-raw <data>\n"
-" (HTTP) This posts data similarly to -d, --data but without the\n"
+" (HTTP) This posts data similarly to -d, --data but without the\n"
" special interpretation of the @ character.\n"
"\n"
" See also -d, --data. Added in 7.43.0.\n"
"\n"
-, stdout);
- fputs(
" --data-urlencode <data>\n"
-" (HTTP) This posts data, similar to the other -d, --data options\n"
+" (HTTP) This posts data, similar to the other -d, --data options\n"
" with the exception that this performs URL-encoding.\n"
"\n"
-" To be CGI-compliant, the <data> part should begin with a name\n"
-" followed by a separator and a content specification. The <data>\n"
+, stdout);
+ fputs(
+" To be CGI-compliant, the <data> part should begin with a name\n"
+" 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"
+" 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"
, 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"
-" This will make curl URL-encode the content and pass that\n"
+" 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"
+" 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"
-" (including any newlines), URL-encode that data and pass\n"
+, stdout);
+ fputs(
+" 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.\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"
, stdout);
fputs(
-" 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"
" 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"
+" (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"
, 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"
" 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"
+" 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"
-" mand line, the data pieces specified will be merged together\n"
-" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
, stdout);
fputs(
+" If any of these options is used more than once on the same com-\n"
+" mand line, the data pieces specified will be merged together\n"
+" with a separating &-symbol. Thus, using '-d name=daniel -d\n"
" 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 from a file like that, carriage\n"
+" If you start the data with the letter @, the rest should be a\n"
, stdout);
fputs(
+" 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 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"
+" @ character to have a special interpretation use --data-raw\n"
" instead.\n"
"\n"
" See also --data-binary and --data-urlencode and --data-raw. This\n"
+, stdout);
+ fputs(
" option overrides -F, --form and -I, --head and --upload.\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"
-, stdout);
- fputs(
-" cation scheme that prevents the password from being sent over\n"
-" the wire in clear text. Use this in combination with the normal\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"
" -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\n"
+, stdout);
+ fputs(
+" See also -u, --user and --proxy-digest and --anyauth. This\n"
" option overrides --basic and --ntlm and --negotiate.\n"
"\n"
" --disable-eprt\n"
-, stdout);
- fputs(
" (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"
-" 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"
+" 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"
, 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"
-" switch to passive mode you need to not use -P, --ftp-port or\n"
-" force it with --ftp-pasv.\n"
-"\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"
+" 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"
+, stdout);
+ fputs(
" --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
" is an alias for --disable-epsv.\n"
"\n"
-, stdout);
- fputs(
-" 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"
-" config file will not be read and used. See the -K, --config for\n"
+" If used as the first parameter on the command line, the curlrc\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"
" --dns-interface <interface>\n"
-" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
-" face>. This option is a counterpart to --interface (which does\n"
-" not affect DNS). The supplied string must be an interface name\n"
+" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
+" face>. This option is a counterpart to --interface (which does\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"
, stdout);
fputs(
-" 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"
-" requests, so that the DNS requests originate from this address.\n"
+" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS\n"
+" 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"
, stdout);
fputs(
-" 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"
-" requests, so that the DNS requests originate from this address.\n"
+" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS\n"
+" 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"
, stdout);
fputs(
-" 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\n"
" 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"
, stdout);
fputs(
-" --dns-servers requires that the underlying libcurl was built to\n"
+" after each IP address.\n"
+"\n"
+" --dns-servers requires that the underlying libcurl was built to\n"
" support c-ares. Added in 7.33.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"
-" 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"
+" 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"
, stdout);
fputs(
-" --cookie option! The -c, --cookie-jar option is a better way to\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"
" store cookies.\n"
"\n"
-" When used in FTP, the FTP server response lines are considered\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"
@@ -825,452 +826,453 @@ void hugehelp(void)
" See also -o, --output.\n"
"\n"
" --egd-file <file>\n"
-" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
, stdout);
fputs(
-" socket. The socket is used to seed the random engine for SSL\n"
+" (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"
"\n"
" See also --random-file.\n"
"\n"
" --engine <name>\n"
-" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\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"
-" available at run-time.\n"
-"\n"
-" --environment\n"
+" engines. Note that not all (or none) of the engines may be\n"
, stdout);
fputs(
-" Sets a range of environment variables, using the names the -w,\n"
-" --write-out option supports, to allow easier extraction of use-\n"
-" ful information after having run curl.\n"
-"\n"
-" --environment requires that the underlying libcurl was built to\n"
-" support RISC OS.\n"
+" available at run-time.\n"
"\n"
" --expect100-timeout <seconds>\n"
" (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
-, stdout);
- fputs(
" 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"
" will continue as if the response has been received.\n"
"\n"
+, stdout);
+ fputs(
" See also --connect-timeout. Added in 7.47.0.\n"
"\n"
" --fail-early\n"
-" Fail and exit on first detected error.\n"
+" Fail and exit on the first detected transfer error.\n"
"\n"
-, stdout);
- fputs(
" 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"
" the last URL's success will determine the error code curl\n"
+, stdout);
+ fputs(
" returns. So early failures will be \"hidden\" by subsequent suc-\n"
" cessful 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"
+" that are given on the command line. This way, no transfer fail-\n"
+" ures go undetected by scripts and similar.\n"
+"\n"
+" This option is global and does not need to be specified for each\n"
, stdout);
fputs(
-" Using this option, curl will instead return an error on the\n"
-" first transfers that fails, independent on the amount of more\n"
-" URLs that are given on the command line. This way, no transfer\n"
-" failures go undetected by scripts and similar.\n"
+" use of -:, --next.\n"
"\n"
-" This option will apply for all given URLs even if you use -:,\n"
-" --next.\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"
+" fore contained by -:, --next.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -f, --fail\n"
+" (HTTP) Fail silently (no output at all) on server errors. This\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"
+" 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"
+" This method is not fail-safe and there are occasions where non-\n"
, stdout);
fputs(
-" This method is not fail-safe and there are occasions where non-\n"
-" successful response codes will slip through, especially when\n"
+" successful response codes will slip through, especially when\n"
" authentication 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"
+" (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"
-, stdout);
- fputs(
" thus saving a round trip when performing a full handshake.\n"
"\n"
-" This is currently only implemented in the NSS and Secure Trans-\n"
+, stdout);
+ fputs(
+" This is currently only implemented in the NSS and Secure Trans-\n"
" port (on iOS 7.0 or later, or OS X 10.9 or later) backends.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
" --form-string <name=string>\n"
-" (HTTP) Similar to -F, --form except that the value string for\n"
+" (HTTP) Similar to -F, --form except that the value string for\n"
" the named parameter is used literally. Leading '@' and '<' char-\n"
+" acters, and the ';type=' string in the value have no special\n"
, stdout);
fputs(
-" acters, and the ';type=' string in the value have no special\n"
-" meaning. Use this in preference to -F, --form if there's any\n"
-" possibility that the string value may accidentally trigger the\n"
+" meaning. Use this in preference to -F, --form if there's any\n"
+" possibility that the string value may accidentally trigger the\n"
" '@' or '<' features of -F, --form.\n"
"\n"
" See also -F, --form.\n"
"\n"
" -F, --form <name=content>\n"
-" (HTTP) This lets curl emulate a filled-in form in which a user\n"
+" (HTTP) This lets curl emulate a filled-in form in which a user\n"
+" has pressed the submit button. This causes curl to POST data\n"
, stdout);
fputs(
-" has pressed the submit button. This causes curl to POST data\n"
-" using the Content-Type multipart/form-data according to RFC\n"
-" 2388. This enables uploading of binary files etc. To force the\n"
-" 'content' part to be a file, prefix the file name with an @\n"
-" sign. To just get the content part from a file, prefix the file\n"
-" name with the symbol <. The difference between @ and < is then\n"
+" using the Content-Type multipart/form-data according to RFC\n"
+" 2388. This enables uploading of binary files etc. To force the\n"
+" 'content' part to be a file, prefix the file name with an @\n"
+" sign. To just get the content part from a file, prefix the file\n"
+" name with the symbol <. The difference between @ and < is then\n"
+" that @ makes a file get attached in the post as a file upload,\n"
, stdout);
fputs(
-" that @ makes a file get attached in the post as a file upload,\n"
-" while the < makes a text field and just get the contents for\n"
+" while the < makes a text field and just get the contents for\n"
" that text field from a file.\n"
"\n"
-" Example: to send an image to a server, where 'profile' is the\n"
+" Example: to send an image to a server, where 'profile' is the\n"
" name of the form-field to which portrait.jpg will be the input:\n"
"\n"
" curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
"\n"
+" To read content from stdin instead of a file, use - as the file-\n"
, stdout);
fputs(
-" To read content from stdin instead of a file, use - as the file-\n"
-" name. This goes for both @ and < constructs. Unfortunately it\n"
-" does not support reading the file from a named pipe or similar,\n"
+" name. This goes for both @ and < constructs. Unfortunately it\n"
+" does not support reading the file from a named pipe or similar,\n"
" as it needs the full size before the transfer starts.\n"
"\n"
-" You can also tell curl what Content-Type to use by using\n"
+" You can also tell curl what Content-Type to use by using\n"
" 'type=', in a manner similar to:\n"
"\n"
-, stdout);
- fputs(
" curl -F \"web=@index.html;type=text/html\" example.com\n"
"\n"
" or\n"
"\n"
+, stdout);
+ fputs(
" curl -F \"name=daniel;type=text/foo\" example.com\n"
"\n"
-" You can also explicitly change the name field of a file upload\n"
+" 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"
-" If filename/path contains ',' or ';', it must be quoted by dou-\n"
+" If filename/path contains ',' or ';', it must be quoted by dou-\n"
" ble-quotes like:\n"
"\n"
-, stdout);
- fputs(
-" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
+" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
" ple.com\n"
"\n"
+, stdout);
+ fputs(
" or\n"
"\n"
" curl -F 'file=@\"localfile\";filename=\"nameinpost\"' example.com\n"
"\n"
-" Note that if a filename/path is quoted by double-quotes, any\n"
+" Note that if a filename/path is quoted by double-quotes, any\n"
" double-quote or backslash within the filename must be escaped by\n"
" backslash.\n"
"\n"
" See further examples and details in the MANUAL.\n"
"\n"
-, stdout);
- fputs(
" This option can be used multiple times.\n"
"\n"
" This option overrides -d, --data and -I, --head and --upload.\n"
"\n"
+, stdout);
+ fputs(
" --ftp-account <data>\n"
" (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"
+" and password has been provided, this data is sent off using the\n"
" ACCT command.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.13.0.\n"
"\n"
+" --ftp-alternative-to-user <command>\n"
+" (FTP) If authenticating with the USER and PASS commands fails,\n"
, stdout);
fputs(
-" --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"
-" \"SITE AUTH\" will tell the server to retrieve the username from\n"
+" 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"
"\n"
" --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(
-" (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"
" curl is to fail. Using this option, curl will instead attempt to\n"
" create missing directories.\n"
"\n"
" See also --create-dirs.\n"
"\n"
" --ftp-method <method>\n"
-" (FTP) Control what method curl should use to reach a file on an\n"
-, stdout);
- fputs(
-" FTP(S) server. The method argument should be one of the follow-\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"
" ing alternatives:\n"
"\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"
-" This is the default but the slowest behavior.\n"
-"\n"
+" curl does a single CWD operation for each path part in\n"
, stdout);
fputs(
-" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
+" 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"
" etc and give a full path to the server for all these com-\n"
" 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"
-" case). This is somewhat more standards compliant than\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"
" Added in 7.15.1.\n"
"\n"
" --ftp-pasv\n"
-" (FTP) Use passive mode for the data connection. Passive is the\n"
-" 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"
-" used. Undoing an enforced passive really isn't doable but you\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"
+" 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"
-" necting with FTP. This option makes curl use active mode. curl\n"
+" (FTP) Reverses the default initiator/listener roles when con-\n"
+" 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(
-" 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"
-" IP address and port for it to connect to. <address> should be\n"
+" IP address and port for it to connect to. <address> should be\n"
" one of:\n"
"\n"
" interface\n"
-" i.e \"eth0\" to specify which interface's IP address you\n"
+" i.e \"eth0\" to specify which interface's IP address you\n"
" want to use (Unix only)\n"
"\n"
" IP address\n"
-, stdout);
- fputs(
" i.e \"192.168.10.1\" to specify the exact IP address\n"
"\n"
" host name\n"
" i.e \"my.host.domain\" to specify the machine\n"
"\n"
-" - 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"
+" - 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"
+" 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"
+" Since 7.19.5, you can append \":[start]-[end]\" to the right of the\n"
+, stdout);
+ fputs(
+" 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"
"\n"
" See also --ftp-pasv and --disable-eprt.\n"
"\n"
+" --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(
-" --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"
-" command for directory listings as well as up and downloads in\n"
+" command for directory listings as well as up and downloads in\n"
" PASV mode.\n"
"\n"
" Added in 7.20.0.\n"
"\n"
" --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"
-, stdout);
- fputs(
-" connection. Instead curl will re-use the same IP address it\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\n"
" already uses for the control connection.\n"
"\n"
-" This option has no effect if PORT, EPRT or EPSV is used instead\n"
+, stdout);
+ fputs(
+" This option has no effect if PORT, EPRT or EPSV is used instead\n"
" of PASV.\n"
"\n"
" See also --ftp-pasv. Added in 7.14.2.\n"
"\n"
" --ftp-ssl-ccc-mode <active/passive>\n"
-" (FTP) Sets the CCC mode. The passive mode will not initiate the\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"
"\n"
" --ftp-ssl-ccc\n"
-" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
+" (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(
+" munication will be unencrypted. This allows NAT routers to fol-\n"
" 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"
-" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
-" Allows secure authentication, but non-encrypted data transfers\n"
-" for efficiency. Fails the transfer if the server doesn't sup-\n"
+" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
+" Allows secure authentication, but non-encrypted data transfers\n"
+" for efficiency. Fails the transfer if the server doesn't sup-\n"
" port SSL/TLS.\n"
"\n"
" 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"
+" --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"
+" If used in combination with -I, --head, the POST data will\n"
" instead 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"
+" 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"
" -g, --globoff\n"
" 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"
+" 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"
" -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>\n"
+" -H, --header <header/@file>\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
, stdout);
fputs(
-" (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"
+" 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"
+" to make even trickier stuff than curl would normally do. You\n"
+" should not replace internally set headers without knowing per-\n"
, stdout);
fputs(
-" 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"
+" 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"
+" 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"
+, stdout);
+ fputs(
" See also the -A, --user-agent and -e, --referer options.\n"
"\n"
" Starting in 7.37.0, you need --proxy-header to send custom head-\n"
" ers intended for a proxy.\n"
"\n"
-, stdout);
- fputs(
" Example:\n"
"\n"
" curl -H \"X-First-Name: Joe\" http://example.com/\n"
"\n"
-" 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"
-"\n"
+" WARNING: headers set with this option will be set in all\n"
+" requests - even after redirects are followed, like when told\n"
, stdout);
fputs(
-" This option can be used multiple times to add/replace/remove\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"
+"\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
" -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"
, stdout);
fputs(
+" (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"
" -0, --http1.0\n"
-" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
+" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
" internally preferred HTTP version.\n"
"\n"
+, stdout);
+ fputs(
" This option overrides --http1.1 and --http2.\n"
"\n"
" --http1.1\n"
" (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
-, stdout);
- fputs(
-" This option overrides -0, --http1.0 and --http2. Added in\n"
+" This option overrides -0, --http1.0 and --http2. Added in\n"
" 7.33.0.\n"
"\n"
" --http2-prior-knowledge\n"
-" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
-" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
-" that the server supports HTTP/2 straight away. HTTPS requests\n"
-" will still do HTTP/2 the standard way with negotiated protocol\n"
-" version in the TLS handshake.\n"
-"\n"
+" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
, stdout);
fputs(
+" that the server supports HTTP/2 straight away. HTTPS requests\n"
+" will still do HTTP/2 the standard way with negotiated protocol\n"
+" version in the TLS handshake.\n"
+"\n"
" --http2-prior-knowledge requires that the underlying libcurl was\n"
" built to support HTTP/2. This option overrides --http1.1 and -0,\n"
" --http1.0 and --http2. Added in 7.49.0.\n"
@@ -1278,46 +1280,53 @@ 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"
, stdout);
fputs(
+" 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"
"\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"
-" report incorrect Content-Length for files larger than 2 giga-\n"
+" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
+" particularly useful for servers running Apache 1.x, which will\n"
+, stdout);
+ fputs(
+" 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"
, stdout);
fputs(
-" -i, --include\n"
-" Include the HTTP-header in the output. The HTTP-header includes\n"
-" things like server-name, date of the document, HTTP-version and\n"
-" more...\n"
+" To view the request headers, consider the -v, --verbose option.\n"
"\n"
" See also -v, --verbose.\n"
"\n"
" -k, --insecure\n"
-" (TLS) This option explicitly allows curl to perform \"insecure\"\n"
-" SSL connections and transfers. All SSL connections are attempted\n"
-" to be made secure by using the CA certificate bundle installed\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"
+" for server connections otherwise considered insecure.\n"
+"\n"
+" The server connection is verified by making sure the server's\n"
, stdout);
fputs(
-" by default. This makes all connections considered \"insecure\"\n"
-" fail unless -k, --insecure is used.\n"
+" certificate contains the right name and verifies successfully\n"
+" using the cert store.\n"
"\n"
" See this online resource for further details:\n"
" https://curl.haxx.se/docs/sslcerts.html\n"
+" See also --proxy-insecure and --cacert.\n"
"\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"
+" 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"
, stdout);
@@ -1329,40 +1338,40 @@ void hugehelp(void)
" See also --dns-interface.\n"
"\n"
" -4, --ipv4\n"
-" 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"
, stdout);
fputs(
-" 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 -6,\n"
+" See also --http1.1 and --http2. This option overrides -6,\n"
" --ipv6.\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"
+" option will make it discard all \"session cookies\". This will\n"
+" basically have the same effect as if a new session is started.\n"
, stdout);
fputs(
-" Typical browsers always discard session cookies when they're\n"
+" Typical browsers always discard session cookies when they're\n"
" closed down.\n"
"\n"
" See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
" --keepalive-time <seconds>\n"
-" 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\n"
+" before sending keepalive probes and the time between individual\n"
" keepalive probes. It is currently effective on operating systems\n"
, stdout);
fputs(
" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
-" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
+" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
" effect if --no-keepalive is used.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -1371,17 +1380,17 @@ void hugehelp(void)
" Added in 7.18.0.\n"
"\n"
" --key-type <type>\n"
-" (TLS) Private key file type. Specify which type your --key pro-\n"
+" (TLS) Private key file type. Specify which type your --key pro-\n"
, stdout);
fputs(
-" vided private key is. DER, PEM, and ENG are supported. If not\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"
" --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"
+" vate key in this separate file. For SSH, if not specified, curl\n"
" tries the following candidates in order:\n"
"\n"
, stdout);
@@ -1389,23 +1398,23 @@ void hugehelp(void)
" 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"
+" (FTP) Enable Kerberos authentication and use. The level must be\n"
" 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'. 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"
+" --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"
-" will get a libcurl-using C source code written to the file that\n"
+" Append this option to any ordinary curl command line, and you\n"
+" 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"
+" If this option is used several times, the last given file name\n"
" will be used.\n"
"\n"
, stdout);
@@ -1413,19 +1422,19 @@ void hugehelp(void)
" Added in 7.16.1.\n"
"\n"
" --limit-rate <speed>\n"
-" Specify the maximum transfer rate you want curl to use - for\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"
" 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"
+" 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"
+" 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"
-" If you also use the -Y, --speed-limit option, that option will\n"
+" 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"
@@ -1434,92 +1443,92 @@ void hugehelp(void)
" 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"
-" wants to machine-parse the contents of an FTP directory since\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"
+" 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"
+" Note: Some FTP servers list only files in their response to\n"
" NLST; they do not include sub-directories and symbolic links.\n"
"\n"
-" (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"
+" (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"
+" 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"
-" unique identifier rather than it's message id to make the\n"
+" unique identifier rather than it's message id to make the\n"
" request.\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"
+" 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"
+" 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"
" connection setup failures.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --location-trusted\n"
-" (HTTP) Like -L, --location, but will allow sending the name +\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"
+" a site to which you'll send your authentication info (which is\n"
" plaintext in the case of HTTP Basic authentication).\n"
"\n"
" See also -u, --user.\n"
"\n"
" -L, --location\n"
-" (HTTP) If the server reports that the requested page has moved\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"
, stdout);
fputs(
-" 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"
-" authentication 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"
+" 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"
+" authentication 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"
+" 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"
+" When curl follows a redirect and the request is not a plain GET\n"
" (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"
+" code was any other 3xx code, curl will re-send the following\n"
, stdout);
fputs(
" request 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"
+" 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"
" that: --post301, --post302 and --post303.\n"
"\n"
" --login-options <options>\n"
-" (IMAP POP3 SMTP) Specify the login options to use during server\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"
+" You can use the login options to specify protocol specific\n"
, stdout);
fputs(
-" options 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"
+" options 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"
" If this option is used several times, the last one will be used.\n"
@@ -1529,14 +1538,14 @@ void hugehelp(void)
" --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"
+" (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"
" See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
" --mail-from <address>\n"
-" (SMTP) Specify a single address that the given mail should get\n"
+" (SMTP) Specify a single address that the given mail should get\n"
" sent from.\n"
"\n"
" See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
@@ -1546,17 +1555,17 @@ void hugehelp(void)
" --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"
-" When performing a mail transfer, the recipient should specify a\n"
+" 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\n"
+" recipient 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"
-" ient should be specified using the mailing list name, such as\n"
+" ient should be specified using the mailing list name, such as\n"
" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n"
"\n"
" Added in 7.20.0.\n"
@@ -1567,13 +1576,13 @@ void hugehelp(void)
" --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"
+" 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"
-" NOTE: The file size is not always known prior to download, and\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"
-" fer ends up being larger than this given limit. This concerns\n"
+" fer ends up being larger than this given limit. This concerns\n"
, stdout);
fputs(
" both FTP and HTTP transfers.\n"
@@ -1581,9 +1590,9 @@ void hugehelp(void)
" See also --limit-rate.\n"
"\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"
+" (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"
" to 50 redirections. Set this option to -1 to make it unlimited.\n"
"\n"
, stdout);
@@ -1591,9 +1600,9 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" -m, --max-time <time>\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"
+" 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"
" 7.32.0, this option accepts decimal values, but the actual time-\n"
, stdout);
fputs(
@@ -1605,14 +1614,14 @@ 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"
-" and make use of the mirrors listed within for failover if there\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"
+" and make use of the mirrors listed within for failover if there\n"
, stdout);
fputs(
-" 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"
+" 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"
" memory and not stored in the local file system.\n"
"\n"
" Example to use a remote Metalink file:\n"
@@ -1626,45 +1635,45 @@ void hugehelp(void)
"\n"
" 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"
-" --include will be ignored. This is because including headers in\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"
+" --include will be ignored. This is because including headers in\n"
, stdout);
fputs(
-" the response will break Metalink parser and if the headers are\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"
+" --metalink requires that the underlying libcurl was built to\n"
" support metalink. Added in 7.27.0.\n"
"\n"
" --negotiate\n"
" (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
"\n"
-" This option requires a library built with GSS-API or SSPI sup-\n"
+" This option requires a library built with GSS-API or SSPI sup-\n"
, stdout);
fputs(
-" port. Use -V, --version to see if your curl supports GSS-\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"
-" '-u :' is enough as the user name and password from the -u,\n"
+" When using this option, you must also provide a fake -u, --user\n"
+" option to activate the authentication code properly. Sending a\n"
+" '-u :' is enough as the user name and password from the -u,\n"
" --user option aren't actually used.\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"
, stdout);
fputs(
" used.\n"
"\n"
" See also --basic and --ntlm and --anyauth and --proxy-negotiate.\n"
"\n"
-" --netrc-file <filemame>\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"
+" --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"
-" If several --netrc-file options are provided, the last one will\n"
+" If several --netrc-file options are provided, the last one will\n"
" be used.\n"
"\n"
, stdout);
@@ -1674,47 +1683,47 @@ void hugehelp(void)
" This option overrides -n, --netrc. Added in 7.21.5.\n"
"\n"
" --netrc-optional\n"
-" Very similar to -n, --netrc, but this option makes the .netrc\n"
+" 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"
" -n, --netrc\n"
-" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
+" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
, stdout);
fputs(
" 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"
+" 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"
+" 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"
-" able). The environment variable \"HOME\" is used to find the home\n"
+" able). The environment variable \"HOME\" is used to find the home\n"
" directory.\n"
"\n"
, stdout);
fputs(
-" 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\n"
+" allow 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"
-" associated options. This allows you to send several URL\n"
+" associated options. This allows you to send several URL\n"
, stdout);
fputs(
-" requests, each with their own specific options, for example,\n"
+" requests, each with their own specific options, for example,\n"
" such 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, --verbose\n"
-" and --fail-early.\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"
+" bose, --trace, --trace-ascii and --fail-early.\n"
"\n"
, stdout);
fputs(
-" For example, you can do both a GET and a POST in a single com-\n"
+" For example, you can do both a GET and a POST in a single com-\n"
" mand line:\n"
"\n"
" curl www1.example.com --next -d postthis www2.example.com\n"
@@ -1722,125 +1731,129 @@ 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"
-" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
+" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by\n"
+" default 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"
, stdout);
fputs(
" ate HTTP/2 support with the server during https sessions.\n"
"\n"
-" See also --no-npn and --http2. --no-alpn requires that the\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"
"\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"
+" 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"
, stdout);
fputs(
-" necessarily exactly when the data arrives. Using this option\n"
+" necessarily exactly when the data arrives. Using this option\n"
" will disable that buffering.\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 --buffer to enforce the buffering.\n"
"\n"
" --no-keepalive\n"
-" Disables the use of keepalive messages on the TCP connection.\n"
-" curl otherwis enables them by default.\n"
+" Disables the use of keepalive messages on the TCP connection.\n"
+" curl otherwise enables them by default.\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"
, stdout);
fputs(
" 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"
-" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
+" if libcurl was built with an SSL library that supports NPN. NPN\n"
+" 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\n"
+" See also --no-alpn and --http2. --no-npn requires that the\n"
, stdout);
fputs(
" underlying libcurl was built to support TLS. Added in 7.36.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"
+" (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"
" require you to disable this in order for you to succeed.\n"
"\n"
, stdout);
fputs(
-" 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"
+" 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"
, stdout);
fputs(
-" 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"
+" 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"
+" that disable the proxy. If there's an environment variable dis-\n"
+, stdout);
+ fputs(
+" 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"
-, stdout);
- fputs(
+" the authentication to the separate binary ntlmauth application\n"
" that is executed when needed.\n"
"\n"
" See also --ntlm and --proxy-ntlm.\n"
"\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"
-" ple and implemented in curl based on their efforts. This kind of\n"
-" behavior should not be endorsed, you should encourage everyone\n"
+" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
, stdout);
fputs(
-" who uses NTLM to switch to a public and documented authentica-\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"
+" 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"
" tion method instead, such as Digest.\n"
"\n"
-" If you want to enable NTLM for your proxy authentication, then\n"
+, stdout);
+ fputs(
+" 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"
-, stdout);
- fputs(
-" libcurl was built to support TLS. This option overrides --basic\n"
+" See also --proxy-ntlm. --ntlm requires that the underlying\n"
+" libcurl was built to support TLS. This option overrides --basic\n"
" and --negotiated and --digest and --anyauth.\n"
"\n"
-" --oauth2-bearer\n"
-" (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
+" --oauth2-bearer <token>\n"
+, stdout);
+ fputs(
+" (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"
-, stdout);
- fputs(
-" The Bearer Token and user name are formatted according to RFC\n"
+" 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"
" -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"
, stdout);
fputs(
+" 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"
" with the current string for the URL being fetched. Like in:\n"
"\n"
" curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
@@ -1849,208 +1862,212 @@ void hugehelp(void)
"\n"
" 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"
-" line, you can use it like this:\n"
-"\n"
, stdout);
fputs(
+" 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"
+" 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"
, stdout);
fputs(
+" 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"
" will force the output to be done to stdout.\n"
"\n"
-" See also -O, --remote-name and --remote-name-all and -J,\n"
+" See also -O, --remote-name and --remote-name-all and -J,\n"
" --remote-header-name.\n"
"\n"
" --pass <phrase>\n"
" (SSH TLS) Passphrase for the private key\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
-" 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"
" 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"
-" (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"
+" (TLS) Tells curl to use the specified public key file (or\n"
, stdout);
fputs(
+" 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"
-" 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"
+" When negotiating a TLS or SSL connection, the server sends a\n"
+" certificate indicating its identity. A public key is extracted\n"
, stdout);
fputs(
+" 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.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.\n"
+, stdout);
+ fputs(
" 7.47.0: mbedtls\n"
" 7.49.0: PolarSSL Other SSL backends not supported.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --post301\n"
-, stdout);
- fputs(
" (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"
-" 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"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
, stdout);
fputs(
-" See also --post302 and --post303 and -L, --location. Added in\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"
" 7.17.1.\n"
"\n"
" --post302\n"
" (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"
, stdout);
fputs(
-" 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"
+" 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"
" tion.\n"
"\n"
-" See also --post301 and --post303 and -L, --location. Added in\n"
+" See also --post301 and --post303 and -L, --location. Added in\n"
+, stdout);
+ fputs(
" 7.19.1.\n"
"\n"
" --post303\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.4 and not convert POST\n"
" requests into GET requests when following a 303 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"
, stdout);
fputs(
-" 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"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post301 and -L, --location. Added in\n"
+" See also --post302 and --post301 and -L, --location. Added in\n"
" 7.26.0.\n"
"\n"
" --preproxy [protocol://]host[:port]\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"
, stdout);
fputs(
-" Use the specified proxy before connecting to the ordinary proxy.\n"
-" Hence pre proxy. A pre proxy must be a SOCKS speaking proxy.\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"
-" socks4a://, socks5:// or socks5h:// to request the specific\n"
-" SOCKS version to be used. No protocol specified will make curl\n"
-, stdout);
- fputs(
+" 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"
+, stdout);
+ fputs(
" 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"
+" 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"
"\n"
" Added in 7.52.0.\n"
"\n"
+" -#, --progress-bar\n"
+" Make curl display transfer progress as a simple progress bar\n"
, stdout);
fputs(
-" -#, --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"
+" 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, it will instead output one\n"
+" For transfers without a known size, it will instead output one\n"
" '#' character for every 1024 bytes transferred.\n"
"\n"
-, stdout);
- fputs(
" --proto-default <protocol>\n"
" Tells curl to use protocol for any URL missing a scheme name.\n"
"\n"
+, stdout);
+ fputs(
" Example:\n"
"\n"
" 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"
-, stdout);
- fputs(
+" Without this option curl would make a guess based on the host,\n"
" see --url for details.\n"
"\n"
" Added in 7.45.0.\n"
"\n"
" --proto-redir <protocols>\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"
+, 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"
" --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"
, stdout);
fputs(
-" By default curl will allow all protocols on redirect except sev-\n"
-" 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"
+" 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"
"\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"
+" Protocols are evaluated left to right, are comma separated, and\n"
" are each a protocol name or\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"
+" - 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(
-" = Permit only this protocol (ignoring the list already permit-\n"
-" ted), though subject to later modification by subsequent\n"
+" ted), though subject to later modification by subsequent\n"
" entries in the comma separated list.\n"
"\n"
" For example:\n"
@@ -2061,36 +2078,36 @@ void hugehelp(void)
" only enables http and https\n"
"\n"
" --proto =http,https\n"
-, stdout);
- fputs(
" 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"
" same as concatenating the protocols into one instance of the option.\n"
"\n"
-, stdout);
- fputs(
" See also --proto-redir and --proto-default. Added in 7.20.2.\n"
"\n"
" --proxy-anyauth\n"
-" Tells curl to pick a suitable authentication method when commu-\n"
-" nicating with the given HTTP proxy. This might cause an extra\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"
" 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"
+" 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(
-" with the given proxy. Use --basic for enabling HTTP Basic with a\n"
-" remote host. Basic is the default authentication method curl\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"
@@ -2098,15 +2115,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"
+" See also --proxy-capath and --cacert and --capath and -x,\n"
" --proxy. Added in 7.52.0.\n"
"\n"
-, stdout);
- fputs(
" --proxy-capath <dir>\n"
" Same as --capath but used in HTTPS proxy context.\n"
"\n"
-" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
+, stdout);
+ fputs(
+" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
" 7.52.0.\n"
"\n"
" --proxy-cert-type <type>\n"
@@ -2120,47 +2137,51 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-ciphers <list>\n"
-, stdout);
- fputs(
" Same as --ciphers but used in HTTPS proxy context.\n"
"\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"
" with the given proxy. Use --digest for enabling HTTP Digest with\n"
" a remote host.\n"
"\n"
-, stdout);
- fputs(
" See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
"\n"
-" --proxy-header <header>\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"
-" cation only like in CONNECT requests when you want a separate\n"
+" --proxy-header <header/@file>\n"
, stdout);
fputs(
-" header sent to the proxy to what is sent to the actual remote\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"
+" 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"
+" curl will make sure that each header you add/replace is sent\n"
+, stdout);
+ fputs(
" 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"
+" 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(
-" requests that curl knows will not be sent to a proxy.\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"
" Added in 7.37.0.\n"
@@ -2170,26 +2191,26 @@ 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"
"\n"
" --proxy-key <key>\n"
-, stdout);
- fputs(
" 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"
" 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"
-, stdout);
- fputs(
+" 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"
@@ -2201,14 +2222,14 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-service-name <name>\n"
-" This option allows you to change the service name for proxy\n"
+, stdout);
+ fputs(
+" This option allows you to change the service name for proxy\n"
" negotiation.\n"
"\n"
" Added in 7.43.0.\n"
"\n"
" --proxy-ssl-allow-beast\n"
-, stdout);
- fputs(
" Same as --ssl-allow-beast but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
@@ -2219,6 +2240,8 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-tlspassword <string>\n"
+, stdout);
+ fputs(
" Same as --tlspassword but used in HTTPS proxy context.\n"
"\n"
" Added in 7.52.0.\n"
@@ -2226,8 +2249,6 @@ void hugehelp(void)
" --proxy-tlsuser <name>\n"
" Same as --tlsuser but used in HTTPS proxy context.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.52.0.\n"
"\n"
" --proxy-tlsv1\n"
@@ -2236,13 +2257,13 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -U, --proxy-user <user:password>\n"
-" Specify the user name and password to use for proxy authentica-\n"
+" 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"
-" Negotiate or NTLM authentication then you can tell curl to\n"
, stdout);
fputs(
+" If you use a Windows SSPI-enabled curl binary and do either\n"
+" 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"
"\n"
@@ -2251,64 +2272,75 @@ void hugehelp(void)
" -x, --proxy [protocol://]host[:port]\n"
" Use the specified proxy.\n"
"\n"
-" The proxy string can be specified with a protocol:// prefix to\n"
-" specify alternative proxy protocols. Use socks4://, socks4a://,\n"
, stdout);
fputs(
-" socks5:// or socks5h:// to request the specific SOCKS version to\n"
-" be used. No protocol specified, http:// and all others will be\n"
-" treated as HTTP proxies. (The protocol support was added in curl\n"
-" 7.21.7)\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"
+" 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"
-" If the port number is not specified in the proxy string, it is\n"
+" HTTPS proxy support via https:// protocol prefix was added in\n"
+" 7.52.0 for OpenSSL, GnuTLS and NSS.\n"
+"\n"
+, stdout);
+ fputs(
+" Unrecognized and unsupported proxy protocols cause an error\n"
+" 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"
" assumed to be 1080.\n"
"\n"
-" This option overrides existing environment variables that set\n"
+" This option overrides existing environment variables that set\n"
+" the proxy to use. If there's an environment variable setting a\n"
, stdout);
fputs(
-" 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"
-" 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(
-" 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"
+" 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"
+" 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"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --proxy1.0 <host[:port]>\n"
-" Use the specified HTTP 1.0 proxy. If the port number is not\n"
+, stdout);
+ fputs(
+" 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"
+" 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"
, stdout);
fputs(
-" -p, --proxytunnel\n"
-" When an HTTP proxy is used -x, --proxy, this option will cause\n"
-" 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"
+" 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"
"\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"
"\n"
" --pubkey <key>\n"
@@ -2318,9 +2350,9 @@ void hugehelp(void)
" 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"
-" ally not required. Note that this public key extraction requires\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"
@@ -2328,18 +2360,18 @@ void hugehelp(void)
" (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"
-" exact). To make commands take place after a successful transfer,\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"
" 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"
-" entire operation will be aborted. You must send syntactically\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"
"\n"
@@ -2348,9 +2380,9 @@ void hugehelp(void)
" continue even if the command fails as by default curl will stop\n"
" at first failure.\n"
"\n"
-" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\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"
@@ -2358,9 +2390,9 @@ void hugehelp(void)
"\n"
" chgrp group file\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"
, stdout);
fputs(
+" 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"
@@ -2370,9 +2402,9 @@ void hugehelp(void)
"\n"
" chown user file\n"
" The chown command sets the owner of the file named by the\n"
-" file operand to the user ID specified by the user oper-\n"
, stdout);
fputs(
+" 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"
@@ -2382,10 +2414,10 @@ void hugehelp(void)
"\n"
" mkdir directory_name\n"
" The mkdir command creates the directory named by the\n"
-" directory_name operand.\n"
-"\n"
, stdout);
fputs(
+" directory_name operand.\n"
+"\n"
" pwd The pwd command returns the absolute pathname of the cur-\n"
" rent working directory.\n"
"\n"
@@ -2395,11 +2427,11 @@ void hugehelp(void)
" target operand.\n"
"\n"
" rm file\n"
+, stdout);
+ fputs(
" The rm command removes the file specified by the file op-\n"
" erand.\n"
"\n"
-, stdout);
- fputs(
" rmdir directory\n"
" The rmdir command removes the directory entry specified\n"
" by the directory operand, provided it is empty.\n"
@@ -2409,9 +2441,9 @@ void hugehelp(void)
"\n"
" --random-file <file>\n"
" Specify the path name to file containing what will be considered\n"
-" as random data. The data may be used to seed the random engine\n"
, stdout);
fputs(
+" 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"
@@ -2421,12 +2453,12 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 9500- specifies the bytes from offset 9500 and forward\n"
"\n"
" 0-0,-1 specifies the first and last byte only(*)(HTTP)\n"
@@ -2437,19 +2469,19 @@ void hugehelp(void)
" (*) = 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"
, 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"
-" you'll instead get the whole document.\n"
-"\n"
, stdout);
fputs(
+" 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"
" use depends on the extended FTP command SIZE.\n"
@@ -2457,11 +2489,11 @@ void hugehelp(void)
" 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"
"\n"
-, stdout);
- fputs(
" Added in 7.16.2.\n"
"\n"
" -e, --referer <URL>\n"
@@ -2469,9 +2501,9 @@ void hugehelp(void)
" 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"
, stdout);
fputs(
+" 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"
" If this option is used several times, the last one will be used.\n"
@@ -2481,21 +2513,21 @@ void hugehelp(void)
" -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"
-" extracting a filename from the URL.\n"
-"\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"
" 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(
" file name, so this option may provide you with rather unexpected\n"
" file names.\n"
"\n"
-, stdout);
- fputs(
" 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"
@@ -2503,9 +2535,9 @@ void hugehelp(void)
"\n"
" --remote-name-all\n"
" 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"
, stdout);
fputs(
+" 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"
" all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
@@ -2516,18 +2548,18 @@ void hugehelp(void)
" (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"
, 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"
" 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"
-" overwritten. If you want the server to be able to choose the\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"
" that name already exists it will not be overwritten.\n"
@@ -2536,9 +2568,9 @@ void hugehelp(void)
" other URL encoded parts of the name, they will end up as-is as\n"
" file name.\n"
"\n"
-" You may use this option as many times as the number of URLs you\n"
, stdout);
fputs(
+" You may use this option as many times as the number of URLs you\n"
" have.\n"
"\n"
" -R, --remote-time\n"
@@ -2546,6 +2578,15 @@ void hugehelp(void)
" stamp of the remote file, and if that is available make the\n"
" local file get that same timestamp.\n"
"\n"
+" --request-target\n"
+" (HTTP) Tells curl to use an alternative \"target\" (path) instead\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"
+" \"OPTIONS *\".\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"
@@ -2696,29 +2737,39 @@ void hugehelp(void)
" for, potentially even to the terminal/stdout unless you redirect\n"
" it.\n"
"\n"
+" Use -S, --show-error in addition to this option to disable\n"
+" progress meter but still show error messages.\n"
+"\n"
" See also -v, --verbose and --stderr.\n"
"\n"
" --socks4 <host[:port]>\n"
+, stdout);
+ fputs(
" 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"
+" 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"
" 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"
+, 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"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --socks4a <host[:port]>\n"
" Use the specified SOCKS4a proxy. If the port number is not spec-\n"
-, stdout);
- fputs(
" ified, 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"
@@ -2726,50 +2777,82 @@ void hugehelp(void)
" 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"
+, 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"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
-" --socks5-gssapi-nec\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"
, stdout);
fputs(
+" enabled by default. Use --socks5-gssapi to force GSS-API\n"
+" authentication to SOCKS5 proxies.\n"
+"\n"
+" Added in 7.55.0.\n"
+"\n"
+" --socks5-gssapi-nec\n"
" As part of the GSS-API negotiation a protection mode is negoti-\n"
" 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"
+, stdout);
+ fputs(
" --socks5-gssapi-nec allows the unprotected exchange of the pro-\n"
" tection mode negotiation.\n"
"\n"
" 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"
" Examples: --socks5 proxy-name --socks5-gssapi-service sockd\n"
" would use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
+, stdout);
+ fputs(
" service sockd/real-name would use sockd/real-name for cases\n"
" where the proxy-name does not match the principal name.\n"
"\n"
" Added in 7.19.4.\n"
"\n"
+" --socks5-gssapi\n"
+" 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"
, stdout);
fputs(
+" to force username/password authentication to SOCKS5 proxies.\n"
+"\n"
+" Added in 7.55.0.\n"
+"\n"
" --socks5-hostname <host[:port]>\n"
-" Use the specified SOCKS5 proxy (and let the proxy resolve the\n"
-" host name). If the port number is not specified, it is assumed\n"
+" Use the specified SOCKS5 proxy (and let the proxy resolve the\n"
+" host name). If the port number is not specified, it is assumed\n"
" at port 1080.\n"
"\n"
-" This option overrides any previous use of -x, --proxy, as they\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"
, stdout);
fputs(
+" Since 7.21.7, this option is superfluous since you can specify a\n"
" socks5 hostname proxy with -x, --proxy using a socks5h:// proto-\n"
" 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"
+" 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.18.0.\n"
@@ -2779,48 +2862,55 @@ void hugehelp(void)
" locally. If the port number is not specified, it is assumed at\n"
" 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"
" 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"
+" 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"
-" This option (as well as --socks4) does not work with IPV6, FTPS\n"
+" This option (as well as --socks4) does not work with IPV6, FTPS\n"
" or LDAP.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
-, stdout);
- fputs(
" -Y, --speed-limit <speed>\n"
" 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"
+" 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"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -y, --speed-time <seconds>\n"
" If a download is slower than speed-limit bytes per second during\n"
-, stdout);
- fputs(
" 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"
+" 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"
-" connects etc. If this is a concern for you, try the --connect-\n"
+" This option controls transfers and thus will not affect slow\n"
+, stdout);
+ fputs(
+" connects etc. If this is a concern for you, try the --connect-\n"
" timeout option.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\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"
+" used, the SSL layer may use workarounds known to cause interop-\n"
, stdout);
fputs(
-" 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"
-" 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"
" ask for exactly that.\n"
@@ -2828,80 +2918,93 @@ void hugehelp(void)
" Added in 7.25.0.\n"
"\n"
" --ssl-no-revoke\n"
-, stdout);
- fputs(
-" (WinSSL) This option tells curl to disable certificate revoca-\n"
+" (WinSSL) This option tells curl to disable certificate revoca-\n"
" 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"
"\n"
+, stdout);
+ fputs(
" --ssl-reqd\n"
" (FTP IMAP POP3 SMTP) Require SSL/TLS for the connection. Termi-\n"
" nates the connection if the server doesn't support SSL/TLS.\n"
"\n"
" This option was formerly known as --ftp-ssl-reqd.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.20.0.\n"
"\n"
-" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.\n"
+" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.\n"
" Reverts 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"
, stdout);
fputs(
+" 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"
"\n"
" Added in 7.20.0.\n"
"\n"
" -2, --sslv2\n"
-" (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"
+" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
, stdout);
fputs(
+" 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"
" rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" -3, --sslv3\n"
-" (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"
+" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
, stdout);
fputs(
+" 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"
" rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" --stderr\n"
-" Redirect all writes to stderr to the specified file instead. If\n"
+" Redirect all writes to stderr to the specified file instead. If\n"
+, stdout);
+ fputs(
" the file name is a plain '-', it is instead written to stdout.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -v, --verbose and -s, --silent.\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"
+, stdout);
+ fputs(
+" 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"
+" See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
+" nel.\n"
+"\n"
" --tcp-fastopen\n"
" Enable use of TCP Fast Open (RFC7413).\n"
"\n"
" Added in 7.49.0.\n"
"\n"
+" --tcp-nodelay\n"
+" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
, stdout);
fputs(
-" --tcp-nodelay\n"
-" 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"
-" explictitly switch it off if you don't want it on.\n"
+" 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"
"\n"
@@ -2910,10 +3013,10 @@ void hugehelp(void)
"\n"
" TTYPE=<term> Sets the terminal type.\n"
"\n"
-, stdout);
- fputs(
" XDISPLOC=<X display> Sets the X display location.\n"
"\n"
+, stdout);
+ fputs(
" NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
" --tftp-blksize <value>\n"
@@ -2925,82 +3028,99 @@ void hugehelp(void)
"\n"
" Added in 7.20.0.\n"
"\n"
+" --tftp-no-options\n"
, stdout);
fputs(
-" --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"
-" not acknowledge or properly implement TFTP options. When this\n"
+" 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"
" Added in 7.48.0.\n"
"\n"
" -z, --time-cond <time>\n"
-" (HTTP FTP) Request a file that has been modified later than the\n"
+" (HTTP FTP) Request a file that has been modified later than the\n"
, stdout);
fputs(
-" 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"
+" 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"
" 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"
+" 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"
"\n"
" Start the date expression with a dash (-) to make it request for\n"
, stdout);
fputs(
-" a document that is older than the given date/time, default is a\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"
" 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"
+"\n"
+" default\n"
+" Use up to recommended TLS version.\n"
+"\n"
+, stdout);
+ fputs(
+" 1.0 Use up to TLSv1.0.\n"
+" 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"
+" 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"
+"\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"
+" Set TLS authentication type. Currently, the only supported\n"
+" option is \"SRP\", for TLS-SRP (RFC 5054). If --tlsuser and\n"
, stdout);
fputs(
+" --tlspassword are specified but --tlsauthtype is not, then this\n"
" option defaults to \"SRP\".\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"
" Added in 7.21.4.\n"
" --tlsuser <name>\n"
-" Set username for use with the TLS authentication method speci-\n"
-" fied with --tlsauthtype. Requires that --tlspassword also is\n"
-" set.\n"
-"\n"
+" Set username for use with the TLS authentication method speci-\n"
, stdout);
fputs(
+" fied with --tlsauthtype. Requires that --tlspassword also is\n"
+" set.\n"
+"\n"
" Added in 7.21.4.\n"
"\n"
" --tlsv1.0\n"
-" (TLS) Forces curl to use TLS version 1.0 when connecting to a\n"
+" (TLS) Forces curl to use TLS version 1.0 when connecting to a\n"
" remote TLS server.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.1\n"
-" (TLS) Forces curl to use TLS version 1.1 when connecting to a\n"
+" (TLS) Forces curl to use TLS version 1.1 when connecting to a\n"
" remote TLS server.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.2\n"
-" (TLS) Forces curl to use TLS version 1.2 when connecting to a\n"
-" remote TLS server.\n"
-"\n"
, stdout);
fputs(
+" (TLS) Forces curl to use TLS version 1.2 when connecting to a\n"
+" remote TLS server.\n"
+"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.3\n"
-" (TLS) Forces curl to use TLS version 1.3 when connecting to a\n"
+" (TLS) Forces curl to use TLS version 1.3 when connecting to a\n"
" remote TLS server.\n"
"\n"
" Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
@@ -3009,33 +3129,33 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -1, --tlsv1\n"
-" (SSL) Tells curl to use TLS version 1.x when negotiating with a\n"
, stdout);
fputs(
+" (SSL) Tells curl to use TLS version 1.x when negotiating with a\n"
" remote TLS server. That means TLS version 1.0, 1.1 or 1.2.\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"
+" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
+" 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"
" (HTTP) Request a compressed Transfer-Encoding response using one\n"
-" of the algorithms curl supports, and uncompress the data while\n"
-" receiving it.\n"
-"\n"
, stdout);
fputs(
+" of the algorithms curl supports, and uncompress the data while\n"
+" receiving it.\n"
+"\n"
" Added in 7.21.6.\n"
"\n"
" --trace-ascii <file>\n"
-" Enables a full trace dump of all incoming and outgoing data,\n"
+" Enables a full trace dump of all incoming and outgoing data,\n"
" including 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"
-" only shows the ASCII part of the dump. It makes smaller output\n"
, stdout);
fputs(
+" only shows the ASCII part of the dump. It makes smaller output\n"
" that might be easier to read for untrained humans.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3043,17 +3163,17 @@ void hugehelp(void)
" This option overrides --trace and -v, --verbose.\n"
"\n"
" --trace-time\n"
-" Prepends a time stamp to each trace or verbose line that curl\n"
+" 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"
, stdout);
fputs(
+" Enables a full trace dump of all incoming and outgoing data,\n"
" including descriptive information, to the given output file. Use\n"
-" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
+" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
" filename to have the output sent to stderr.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3061,156 +3181,156 @@ void hugehelp(void)
" This option overrides -v, --verbose and --trace-ascii.\n"
"\n"
" --unix-socket <path>\n"
-" (HTTP) Connect through this Unix domain socket, instead of using\n"
, stdout);
fputs(
+" (HTTP) Connect through this Unix domain socket, instead of using\n"
" the network.\n"
"\n"
" Added in 7.40.0.\n"
"\n"
" -T, --upload-file <file>\n"
-" This transfers the specified local file to the remote URL. If\n"
+" This transfers the specified local file to the remote URL. If\n"
" there is no file part in the specified URL, curl will append the\n"
" local file name. NOTE that you must use a trailing / on the last\n"
-" directory to really prove to Curl that there is no file name or\n"
-" curl will think that your last directory name is the remote file\n"
+" directory to really prove to Curl that there is no file name or\n"
, stdout);
fputs(
+" curl will think that your last directory name is the remote file\n"
" name to use. That will most likely cause the upload operation to\n"
" fail. If this is used on an HTTP(S) server, the PUT command will\n"
" be used.\n"
"\n"
-" 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"
+" 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"
, stdout);
fputs(
+" mode to allow reading server output while stdin is being\n"
" uploaded.\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"
-" 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"
-" ported in the URL, like this:\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"
+" 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"
, stdout);
fputs(
+" ported in the URL, like this:\n"
+"\n"
" curl --upload-file \"{file1,file2}\" http://www.example.com\n"
"\n"
" or even\n"
"\n"
" curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
-" When uploading to an SMTP server: the uploaded data is assumed\n"
+" 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"
+" headers and mail body formatted correctly by the user as curl\n"
+, stdout);
+ fputs(
" will not transcode nor encode it further in any way.\n"
"\n"
" --url <url>\n"
-, stdout);
- fputs(
-" Specify a URL to fetch. This option is mostly handy when you\n"
+" Specify a URL to fetch. This option is mostly handy when you\n"
" want to specify URL(s) in a config file.\n"
"\n"
-" 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"
+" 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"
, stdout);
fputs(
+" 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"
" default protocol, see --proto-default for details.\n"
"\n"
-" 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"
+" 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"
, stdout);
fputs(
-" enforced by using an URL that ends with \";type=A\". This option\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"
" causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
" -A, --user-agent <name>\n"
" (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 can also be set with the -H, --header option\n"
-" of course.\n"
-"\n"
+" To encode blanks in the string, surround the string with single\n"
, stdout);
fputs(
+" quote marks. This can also be set with the -H, --header option\n"
+" of course.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" -u, --user <user:password>\n"
" Specify the user name and password to use for server authentica-\n"
" tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
-" If you simply specify the user name, curl will prompt for a\n"
+" If you simply specify the user name, curl will prompt for a\n"
" password.\n"
"\n"
-" The user name and passwords are split up on the first colon,\n"
, stdout);
fputs(
-" which makes it impossible to use a colon in the user name with\n"
+" The user name and passwords are split up on the first colon,\n"
+" which makes it impossible to use a colon in the user name with\n"
" this option. The password can, still.\n"
"\n"
-" 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 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"
, stdout);
fputs(
-" 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"
+" 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"
+" 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"
, stdout);
fputs(
-" 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"
" ronment by specifying a single colon with this option: \"-u :\".\n"
"\n"
" 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"
+" Makes curl verbose during the operation. Useful for debugging\n"
, stdout);
fputs(
-" with '>' means \"header data\" sent by curl, '<' means \"header\n"
-" data\" received by curl that is hidden in normal cases, and a\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"
" line starting with '*' means additional info provided by curl.\n"
"\n"
" 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"
, stdout);
fputs(
+" 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"
" --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"
-" other 3rd party libraries linked with the executable.\n"
-"\n"
+" The first line includes the full version of curl, libcurl and\n"
, stdout);
fputs(
-" The second line (starts with \"Protocols:\") shows all protocols\n"
+" other 3rd party libraries linked with the executable.\n"
+"\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"
@@ -3220,25 +3340,25 @@ void hugehelp(void)
"\n"
" krb4 Krb4 for FTP is supported.\n"
"\n"
-" SSL SSL versions of various protocols are supported, such as\n"
, stdout);
fputs(
+" 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"
-" 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"
, stdout);
fputs(
-" This curl uses asynchronous name resolves. Asynchronous\n"
-" name resolves can be done using either the c-ares or the\n"
+" AsynchDNS\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"
@@ -3249,15 +3369,15 @@ void hugehelp(void)
"\n"
" IDN This curl supports IDN - international domain names.\n"
"\n"
-" GSS-API\n"
, stdout);
fputs(
+" GSS-API\n"
" GSS-API is supported.\n"
"\n"
" 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"
" HTTP2 HTTP/2 support has been built-in.\n"
@@ -3271,52 +3391,52 @@ void hugehelp(void)
" Metalink\n"
, stdout);
fputs(
-" 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"
" 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"
, stdout);
fputs(
" -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"
-" 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"
, stdout);
fputs(
-" The variables present in the output format will be substituted\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"
+" The variables present in the output format will be substituted\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"
" NOTE: The %-symbol is a special symbol in the win32-environment,\n"
, stdout);
fputs(
-" where all occurrences of % must be doubled when using this\n"
+" where all occurrences of % must be doubled when using this\n"
" option.\n"
"\n"
" The variables available are:\n"
"\n"
-" content_type The Content-Type of the requested document, if\n"
+" 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"
-" This is only meaningful if curl is told to write\n"
+" The ultimate filename that curl writes out to.\n"
+" This is only meaningful if curl is told to write\n"
, stdout);
fputs(
-" to a file with the -O, --remote-name or -o,\n"
-" --output option. It's most useful in combination\n"
-" with the -J, --remote-header-name option. (Added\n"
+" to a file with the -O, --remote-name or -o,\n"
+" --output option. It's most useful in combination\n"
+" 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"
@@ -3325,12 +3445,12 @@ void hugehelp(void)
, stdout);
fputs(
" http_code The numerical response code that was found in the\n"
-" last retrieved HTTP(S) or FTP(s) transfer. In\n"
-" 7.18.2 the alias response_code was added to show\n"
+" last retrieved HTTP(S) or FTP(s) transfer. In\n"
+" 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"
+" 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"
"\n"
, stdout);
@@ -3338,115 +3458,119 @@ void hugehelp(void)
" http_version The http version that was effectively used.\n"
" (Added in 7.50.0)\n"
"\n"
-" 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\n"
+" recently done connection - can be either IPv4 or\n"
" IPv6 (Added in 7.29.0)\n"
"\n"
-" local_port The local port number of the most recently done\n"
+" local_port The local port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
, stdout);
fputs(
-" num_connects Number of new connects made in the recent trans-\n"
+" num_connects Number of new connects made in the recent trans-\n"
" fer. (Added in 7.12.3)\n"
"\n"
-" num_redirects Number of redirects that were followed in the\n"
+" num_redirects Number of redirects that were followed in the\n"
" request. (Added in 7.12.3)\n"
"\n"
-" redirect_url When an HTTP request was made without -L to fol-\n"
-" low redirects, this variable will show the actual\n"
+" proxy_ssl_verify_result\n"
+" The result of the HTTPS proxy's SSL peer certifi-\n"
+" cate verification that was requested. 0 means the\n"
, stdout);
fputs(
-" URL a redirect would take you to. (Added in\n"
-" 7.18.2)\n"
+" verification was successful. (Added in 7.52.0)\n"
"\n"
-" remote_ip The remote IP address of the most recently done\n"
+" redirect_url When an HTTP request was made without -L, --loca-\n"
+" tion to follow redirects (or when --max-redir is\n"
+" met), this variable will show the actual URL a\n"
+" redirect would have gone to. (Added in 7.18.2)\n"
+"\n"
+" remote_ip The remote IP address of the most recently done\n"
+, stdout);
+ fputs(
" connection - can be either IPv4 or IPv6 (Added in\n"
" 7.29.0)\n"
"\n"
-" remote_port The remote port number of the most recently done\n"
+" remote_port The remote port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-, stdout);
- fputs(
-" scheme The URL scheme (sometimes called protocol) that\n"
+" scheme The URL scheme (sometimes called protocol) that\n"
" was effectively used (Added in 7.52.0)\n"
"\n"
" size_download The total amount of bytes that were downloaded.\n"
"\n"
+, stdout);
+ fputs(
" size_header The total amount of bytes of the downloaded head-\n"
" ers.\n"
"\n"
-" size_request The total amount of bytes that were sent in the\n"
+" size_request The total amount of bytes that were sent in the\n"
" HTTP request.\n"
"\n"
-, stdout);
- fputs(
" size_upload The total amount of bytes that were uploaded.\n"
"\n"
" 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"
+, stdout);
+ fputs(
+" speed_upload The average upload speed that curl measured for\n"
" the complete upload. Bytes per second.\n"
"\n"
" ssl_verify_result\n"
-" The result of the SSL peer certificate verifica-\n"
-, stdout);
- fputs(
+" The result of the SSL peer certificate verifica-\n"
" tion that was requested. 0 means the verification\n"
" 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"
-" remote host was completed. (Added in 7.19.0)\n"
-"\n"
-" time_connect The time, in seconds, it took from the start\n"
, stdout);
fputs(
-" until the TCP connect to the remote host (or\n"
+" The time, in seconds, it took from the start\n"
+" until the SSL/SSH/etc connect/handshake to the\n"
+" remote 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"
"\n"
" time_namelookup\n"
-" The time, in seconds, it took from the start\n"
+, stdout);
+ fputs(
+" The time, in seconds, it took from the start\n"
" until the name resolving was completed.\n"
"\n"
" time_pretransfer\n"
-" The time, in seconds, it took from the start\n"
-" until the file transfer was just about to begin.\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"
+, stdout);
+ fputs(
" tocol(s) involved.\n"
"\n"
" time_redirect The time, in seconds, it took for all redirection\n"
-" steps include name lookup, connect, pretransfer\n"
-" and transfer before the final transaction was\n"
-, stdout);
- fputs(
-" started. time_redirect shows the complete execu-\n"
-" tion time for multiple redirections. (Added in\n"
+" 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"
" 7.12.3)\n"
"\n"
-" time_starttransfer\n"
-" The time, in seconds, it took from the start\n"
-" until the first byte was just about to be trans-\n"
-" ferred. This includes time_pretransfer and also\n"
, stdout);
fputs(
-" the time the server needed to calculate the\n"
+" time_starttransfer\n"
+" The time, in seconds, it took from the start\n"
+" 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"
"\n"
-" time_total The total time, in seconds, that the full opera-\n"
-" tion lasted. The time will be displayed with mil-\n"
-" lisecond resolution.\n"
+" time_total The total time, in seconds, that the full opera-\n"
+, stdout);
+ fputs(
+" tion lasted.\n"
"\n"
" url_effective The URL that was fetched last. This is most mean-\n"
" ingful if you've told curl to follow location:\n"
-, stdout);
- fputs(
" headers.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3454,10 +3578,10 @@ void hugehelp(void)
" --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"
-" the content type is stored in the mime_type attribute. If the\n"
, stdout);
fputs(
+" 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"
@@ -3467,12 +3591,12 @@ void hugehelp(void)
"\n"
"ENVIRONMENT\n"
" The environment variables can be specified in lower case or upper case.\n"
+, stdout);
+ fputs(
" The lower case version has precedence. http_proxy is an exception as it\n"
" is only available in lower case.\n"
"\n"
" Using an environment variable to set the proxy has the same effect as\n"
-, stdout);
- fputs(
" using the -x, --proxy option.\n"
"\n"
" http_proxy [protocol://]<host>[:port]\n"
@@ -3481,10 +3605,10 @@ void hugehelp(void)
" 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"
-" tocol is a protocol that curl supports and as specified in a\n"
, stdout);
fputs(
+" 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"
@@ -3493,18 +3617,30 @@ void hugehelp(void)
"\n"
" NO_PROXY <comma-separated list of hosts>\n"
" list of host names that shouldn't go through any proxy. If set\n"
+, stdout);
+ fputs(
" to a asterisk '*' only, it matches all hosts.\n"
"\n"
-"PROXY PROTOCOL PREFIXES\n"
-" Since curl version 7.21.7, the proxy string may be specified with a\n"
+" Since 7.53.0, this environment variable disable the proxy even\n"
+" if specify -x, --proxy option. That is NO_PROXY=direct.exam-\n"
+" ple.com curl -x http://proxy.example.com http://direct.exam-\n"
+" ple.com accesses the target URL directly, and\n"
+" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
, stdout);
fputs(
+" http://somewhere.example.com accesses the target URL through\n"
+" proxy.\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"
" proxy.\n"
"\n"
+, stdout);
+ fputs(
" The supported proxy protocol prefixes are as follows:\n"
"\n"
" socks4://\n"
@@ -3514,8 +3650,6 @@ void hugehelp(void)
" Makes it the equivalent of --socks4a\n"
"\n"
" socks5://\n"
-, stdout);
- fputs(
" Makes it the equivalent of --socks5\n"
"\n"
" socks5h://\n"
@@ -3523,6 +3657,8 @@ void hugehelp(void)
"\n"
"EXIT CODES\n"
" There are a bunch of different error codes and their corresponding\n"
+, stdout);
+ fputs(
" error messages that may appear during bad conditions. At the time of\n"
" this writing, the exit codes are:\n"
"\n"
@@ -3531,20 +3667,18 @@ void hugehelp(void)
"\n"
" 2 Failed to initialize.\n"
"\n"
-, stdout);
- fputs(
" 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"
+, stdout);
+ fputs(
" time. To make curl able to do this, you probably need another\n"
" build of libcurl!\n"
"\n"
" 5 Couldn't resolve proxy. The given proxy host could not be\n"
" resolved.\n"
"\n"
-, stdout);
- fputs(
" 6 Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
" 7 Failed to connect to host.\n"
@@ -3552,74 +3686,89 @@ void hugehelp(void)
" 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"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
+" 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"
+" the control connection or similar.\n"
+"\n"
" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
" PASS request.\n"
+, stdout);
+ fputs(
+"\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"
" 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(
-" 17 FTP couldn't set binary. Couldn't change transfer method to\n"
+" 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"
"\n"
" 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"
-" 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"
, stdout);
fputs(
-" returned another error with the HTTP error code being 400 or\n"
+" 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"
" 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"
+" 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"
+" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
-" 28 Operation timeout. The specified time-out period was reached\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"
+" 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"
"\n"
-" 31 FTP couldn't use REST. The REST command failed. This command is\n"
+, stdout);
+ fputs(
+" 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"
-, stdout);
- fputs(
" 34 HTTP post error. Internal post-request generation error.\n"
"\n"
" 35 SSL connect error. The SSL handshaking failed.\n"
"\n"
-" 36 FTP bad download resume. Couldn't continue an earlier aborted\n"
-" download.\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"
@@ -3628,30 +3777,30 @@ void hugehelp(void)
"\n"
" 41 Function not found. A required LDAP function was not found.\n"
"\n"
-, stdout);
- fputs(
" 42 Aborted by callback. An application told curl to abort the oper-\n"
" ation.\n"
"\n"
" 43 Internal error. A function was called with a bad parameter.\n"
"\n"
-" 45 Interface error. A specified outgoing interface could not be\n"
+, stdout);
+ fputs(
+" 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"
-, stdout);
- fputs(
-" 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"
" 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"
@@ -3660,15 +3809,15 @@ void hugehelp(void)
"\n"
" 55 Failed sending network data.\n"
"\n"
-, stdout);
- fputs(
" 56 Failure in receiving network data.\n"
"\n"
" 58 Problem with the local certificate.\n"
"\n"
" 59 Couldn't use specified SSL cipher.\n"
"\n"
-" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
+, stdout);
+ fputs(
+" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
" cates.\n"
"\n"
" 61 Unrecognized transfer encoding.\n"
@@ -3681,13 +3830,13 @@ void hugehelp(void)
"\n"
" 65 Sending the data requires a rewind that failed.\n"
"\n"
-, stdout);
- fputs(
" 66 Failed to initialise SSL Engine.\n"
"\n"
-" 67 The user name, password, or similar was not accepted and curl\n"
+" 67 The user name, password, or similar was not accepted and curl\n"
" failed to log in.\n"
"\n"
+, stdout);
+ fputs(
" 68 File not found on TFTP server.\n"
"\n"
" 69 Permission problem on TFTP server.\n"
@@ -3702,25 +3851,23 @@ void hugehelp(void)
"\n"
" 74 No such user (TFTP).\n"
"\n"
-, stdout);
- fputs(
" 75 Character conversion failed.\n"
"\n"
" 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"
-, stdout);
- fputs(
" 83 Issuer check failed (added in 7.19.0).\n"
"\n"
" 84 The FTP PRET command failed\n"
@@ -3729,6 +3876,8 @@ void hugehelp(void)
"\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"
@@ -3737,29 +3886,24 @@ void hugehelp(void)
"\n"
" 90 SSL public key does not matched pinned public key\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"
-" 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"
+, stdout);
+ fputs(
" is found in the separate THANKS file.\n"
"\n"
"WWW\n"
" https://curl.haxx.se\n"
"\n"
-"FTP\n"
-" ftp://ftp.sunet.se/pub/www/utilities/curl/\n"
-"\n"
"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"
-, stdout);
- fputs(
" from the curl web pages, located at:\n"
"\n"
" https://curl.haxx.se\n"
@@ -3774,6 +3918,8 @@ void hugehelp(void)
"\n"
" curl ftp://ftp.funet.fi/README\n"
"\n"
+, stdout);
+ fputs(
" Get a web page from a server using port 8000:\n"
"\n"
" curl http://www.weirdserver.com:8000/\n"
@@ -3782,8 +3928,6 @@ void hugehelp(void)
"\n"
" curl ftp://cool.haxx.se/\n"
"\n"
-, stdout);
- fputs(
" Get the definition of curl from a dictionary:\n"
"\n"
" curl dict://dict.org/m:curl\n"
@@ -3796,6 +3940,8 @@ void hugehelp(void)
"\n"
" curl ftps://files.are.secure.com/secrets.txt\n"
"\n"
+, stdout);
+ fputs(
" 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"
@@ -3804,8 +3950,6 @@ void hugehelp(void)
"\n"
" curl -u username sftp://example.com/etc/issue\n"
"\n"
-, stdout);
- fputs(
" Get a file from an SSH server using SCP using a private key\n"
" (not password-protected) to authenticate:\n"
"\n"
@@ -3813,6 +3957,8 @@ void hugehelp(void)
" scp://example.com/~/file.txt\n"
"\n"
" Get a file from an SSH server using SCP using a private key\n"
+, stdout);
+ fputs(
" (password-protected) to authenticate:\n"
"\n"
" curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \\\n"
@@ -3820,8 +3966,6 @@ void hugehelp(void)
"\n"
" Get the main page from an IPv6 web server:\n"
"\n"
-, stdout);
- fputs(
" curl \"http://[2001:1890:1112:1::20]/\"\n"
"\n"
" Get a file from an SMB server:\n"
@@ -3832,14 +3976,14 @@ void hugehelp(void)
"\n"
" Get a web page and store in a local file with a specific name:\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" curl -O http://www.netscape.com/index.html\n"
"\n"
" Fetch two files and store them with their remote names:\n"
@@ -3852,6 +3996,8 @@ void hugehelp(void)
"\n"
" To ftp files using name+passwd, include them in the URL like:\n"
"\n"
+, stdout);
+ fputs(
" curl ftp://name:passwd@machine.domain:port/full/path/to/file\n"
"\n"
" or specify them with the -u flag like\n"
@@ -3860,8 +4006,6 @@ void hugehelp(void)
"\n"
" FTPS\n"
"\n"
-, stdout);
- fputs(
" It is just like for FTP, but you may also want to specify and use\n"
" SSL-specific options for certificates etc.\n"
"\n"
@@ -3869,16 +4013,18 @@ void hugehelp(void)
" standards while the recommended \"explicit\" way is done by using FTP:// and\n"
" the --ftp-ssl option.\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" 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"
" key file, but in cases where curl does not have the proper library support,\n"
+, stdout);
+ fputs(
" a matching public key file must be specified using the --pubkey option.\n"
"\n"
" HTTP\n"
@@ -3886,8 +4032,6 @@ void hugehelp(void)
" Curl also supports user and password in HTTP URLs, thus you can pick a file\n"
" like:\n"
"\n"
-, stdout);
- fputs(
" curl http://name:passwd@machine.domain/full/path/to/file\n"
"\n"
" or specify user and password separately like in\n"
@@ -3895,16 +4039,18 @@ void hugehelp(void)
" curl -u name:passwd http://machine.domain/full/path/to/file\n"
"\n"
" HTTP offers many different methods of authentication and curl supports\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" 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"
" though curl allows it at other times. When using a proxy, you _must_ use\n"
+, stdout);
+ fputs(
" the -u style for user and password.\n"
"\n"
" HTTPS\n"
@@ -3914,13 +4060,13 @@ void hugehelp(void)
"PROXY\n"
"\n"
" curl supports both HTTP and SOCKS proxy servers, with optional authentication.\n"
-, stdout);
- fputs(
" 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"
" can also use both HTTP and SOCKS proxies to transfer files to and from FTP\n"
" servers.\n"
"\n"
+, stdout);
+ fputs(
" 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"
@@ -3928,22 +4074,20 @@ void hugehelp(void)
" Get a file from an HTTP server that requires user and password, using the\n"
" same proxy as above:\n"
"\n"
-, stdout);
- fputs(
" 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"
" curl -U user:passwd -x my-proxy:888 http://www.get.this/\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" 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"
@@ -3951,24 +4095,24 @@ void hugehelp(void)
" See also the environment variables Curl supports that offer further proxy\n"
" control.\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" 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"
" curl -u \"Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass\" \\\n"
+, stdout);
+ fputs(
" --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"
-, stdout);
- fputs(
"RANGES\n"
"\n"
" HTTP 1.1 introduced byte-ranges. Using this, a client can request\n"
@@ -3977,6 +4121,8 @@ void hugehelp(void)
"\n"
" Get the first 100 bytes of a document:\n"
"\n"
+, stdout);
+ fputs(
" curl -r 0-99 http://www.get.this/\n"
"\n"
" Get the last 500 bytes of a document:\n"
@@ -3986,8 +4132,6 @@ void hugehelp(void)
" Curl also supports simple ranges for FTP files as well. Then you can only\n"
" specify start and stop position.\n"
"\n"
-, stdout);
- fputs(
" Get the first 100 bytes of a document using FTP:\n"
"\n"
" curl -r 0-99 ftp://www.get.this/README\n"
@@ -4000,6 +4144,8 @@ void hugehelp(void)
"\n"
" curl -T - ftp://ftp.upload.com/myfile\n"
"\n"
+, stdout);
+ fputs(
" 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"
@@ -4007,8 +4153,6 @@ void hugehelp(void)
" Upload a local file to the remote site, and use the local file name at the remote\n"
" site too:\n"
"\n"
-, stdout);
- fputs(
" curl -T uploadfile -u user:passwd ftp://ftp.upload.com/\n"
"\n"
" Upload a local file to get appended to the remote file:\n"
@@ -4016,6 +4160,8 @@ void hugehelp(void)
" 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"
+, stdout);
+ fputs(
" configured to allow that kind of tunneling. If it does, you can run curl in\n"
" a fashion similar to:\n"
"\n"
@@ -4024,8 +4170,6 @@ void hugehelp(void)
"SMB / SMBS\n"
"\n"
" curl -T file.txt -u \"domain\\username:passwd\" \n"
-, stdout);
- fputs(
" smb://server.example.com/share/\n"
"\n"
" HTTP\n"
@@ -4037,20 +4181,22 @@ void hugehelp(void)
" Note that the HTTP server must have been configured to accept PUT before\n"
" this can be done successfully.\n"
"\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" fetching. Curl will output lots of info and what it sends and receives in\n"
" 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"
+, stdout);
+ fputs(
" 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"
@@ -4060,23 +4206,23 @@ void hugehelp(void)
"\n"
"DETAILED INFORMATION\n"
"\n"
-, stdout);
- fputs(
" Different protocols provide different ways of getting detailed information\n"
" 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"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" -D/--dump-header option when getting files from both FTP and HTTP, and it\n"
" 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"
+, stdout);
+ fputs(
" 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"
@@ -4085,14 +4231,14 @@ void hugehelp(void)
"\n"
"POST (HTTP)\n"
"\n"
-, stdout);
- fputs(
" 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"
" Post a simple \"name\" and \"phone\" guestbook.\n"
"\n"
" curl -d \"name=Rafael%20Sagula&phone=3320780\" \\\n"
+, stdout);
+ fputs(
" http://www.where.com/guest.cgi\n"
"\n"
" How to post a form with curl, lesson #1:\n"
@@ -4100,19 +4246,17 @@ void hugehelp(void)
" Dig out all the <input> tags in the form that you want to fill in. (There's\n"
" a perl program called formfind.pl on the curl site that helps with this).\n"
"\n"
-, stdout);
- fputs(
" 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"
" The 'variable' names are the names set with \"name=\" in the <input> tags, and\n"
+, stdout);
+ fputs(
" 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"
-, stdout);
- fputs(
" the letter's ASCII code.\n"
"\n"
" Example:\n"
@@ -4122,6 +4266,8 @@ void hugehelp(void)
" <form action=\"post.cgi\" method=\"post\">\n"
" <input name=user size=10>\n"
" <input name=pass type=password size=10>\n"
+, stdout);
+ fputs(
" <input name=id type=hidden value=\"blablabla\">\n"
" <input name=ding value=\"submit\">\n"
" </form>\n"
@@ -4130,49 +4276,47 @@ void hugehelp(void)
"\n"
" To post to this, you enter a curl command line like:\n"
"\n"
-, stdout);
- fputs(
" curl -d \"user=foobar&pass=12345&id=blablabla&ding=submit\" (continues)\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"
-, stdout);
- fputs(
" 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"
-, stdout);
- fputs(
" 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"
-, stdout);
- fputs(
" 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"
-, stdout);
- fputs(
" http://www.post.com/postit.cgi\n"
"\n"
" To send two files in one post you can do it in two ways:\n"
@@ -4181,14 +4325,14 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" -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"
@@ -4196,11 +4340,11 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" fool or trick stupid servers or CGI scripts that rely on that information\n"
" being available or contain certain data.\n"
"\n"
@@ -4210,11 +4354,11 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" scripts that only accept certain browsers.\n"
"\n"
" Example:\n"
@@ -4223,17 +4367,19 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
@@ -4241,21 +4387,21 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
-, stdout);
- fputs(
" 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"
@@ -4265,12 +4411,12 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
@@ -4281,10 +4427,10 @@ void hugehelp(void)
" save the incoming cookies using the well-known netscape cookie format like\n"
" this:\n"
"\n"
-, stdout);
- fputs(
" 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"
@@ -4293,9 +4439,9 @@ void hugehelp(void)
" 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(
-" as netscape's cookie file. Curl will determine what kind it is based on the\n"
" 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"
@@ -4304,12 +4450,12 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
@@ -4318,9 +4464,9 @@ void hugehelp(void)
" 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(
-" % - percentage completed of the whole transfer\n"
" Total - total size of the whole expected transfer\n"
" % - percentage completed of the download\n"
" Received - currently downloaded amount of bytes\n"
@@ -4330,9 +4476,9 @@ void hugehelp(void)
" 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 Total - expected time to complete the operation\n"
" 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"
@@ -4343,9 +4489,9 @@ void hugehelp(void)
"\n"
"SPEED LIMIT\n"
"\n"
+" Curl allows the user to set the transfer speed conditions that must be met\n"
, stdout);
fputs(
-" Curl allows the user to set the transfer speed conditions that must be met\n"
" 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"
@@ -4356,10 +4502,10 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
@@ -4369,14 +4515,14 @@ void hugehelp(void)
"\n"
" Make curl transfer data no faster than 10 kilobytes per second:\n"
"\n"
-, stdout);
- fputs(
" 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"
@@ -4384,24 +4530,24 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
-, stdout);
- fputs(
" 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"
@@ -4412,11 +4558,11 @@ void hugehelp(void)
" # We want a 30 minute timeout:\n"
" -m 1800\n"
" # ... and we use a proxy for all accesses:\n"
-, stdout);
- fputs(
" 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"
@@ -4428,11 +4574,11 @@ void hugehelp(void)
" without URL by making a config file similar to:\n"
"\n"
" # default url to get\n"
-, stdout);
- fputs(
" 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"
@@ -4442,11 +4588,11 @@ void hugehelp(void)
"EXTRA HEADERS\n"
"\n"
" When using curl in your own very special programs, you may end up needing\n"
-, stdout);
- fputs(
" 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"
@@ -4455,11 +4601,11 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
@@ -4471,12 +4617,12 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
@@ -4489,9 +4635,9 @@ void hugehelp(void)
"\n"
"FTP and firewalls\n"
"\n"
+" The FTP protocol requires one of the involved parties to open a second\n"
, stdout);
fputs(
-" The FTP protocol requires one of the involved parties to open a second\n"
" connection as soon as data is about to get transferred. There are two ways to\n"
" do this.\n"
"\n"
@@ -4502,9 +4648,9 @@ void hugehelp(void)
"\n"
" curl ftp.download.com\n"
"\n"
+" If the server, for example, is behind a firewall that doesn't allow connections\n"
, stdout);
fputs(
-" If the server, for example, is behind a firewall that doesn't allow connections\n"
" 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"
@@ -4512,10 +4658,10 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
@@ -4531,12 +4677,12 @@ void hugehelp(void)
"\n"
" Get a web page from a server using a specified port for the interface:\n"
"\n"
-, stdout);
- fputs(
" 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"
@@ -4550,17 +4696,17 @@ void hugehelp(void)
" 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(
-" from sites that require valid certificates. The only drawback is that the\n"
" 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(
-" formatted certificates to PEM formatted ones. This kind of converter is\n"
" 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"
@@ -4569,10 +4715,10 @@ void hugehelp(void)
" Example on how to automatically retrieve a document using a certificate with\n"
" a personal password:\n"
"\n"
-, stdout);
- fputs(
" 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"
@@ -4581,10 +4727,10 @@ void hugehelp(void)
" 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"
-, stdout);
- fputs(
" 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"
@@ -4702,15 +4848,19 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
@@ -4719,19 +4869,37 @@ void hugehelp(void)
" 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"
+, stdout);
+ fputs(
+" curl --ntlm \"ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*\"\n"
+"\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"
-, stdout);
- fputs(
" They should be set for protocol-specific proxies. General proxy should be\n"
" set with\n"
"\n"
" ALL_PROXY\n"
"\n"
+, stdout);
+ fputs(
" A comma-separated list of host names that shouldn't go through any proxy is\n"
" set in (only an asterisk, '*' matches all hosts)\n"
"\n"
@@ -4739,28 +4907,33 @@ void hugehelp(void)
"\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.\n"
-"\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 uses a\n"
+, stdout);
+ fputs(
+" proxy by setting NO_PROXY to \".example.com\". By including the full name you\n"
+" 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"
-, stdout);
- fputs(
" 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"
+, stdout);
+ fputs(
" that you don't have to type them in each time you visit those sites. You\n"
" 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"
-, stdout);
- fputs(
" 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"
+, stdout);
+ fputs(
" A very simple .netrc file could look something like:\n"
"\n"
" machine curl.haxx.se login iamdaniel password mysecret\n"
@@ -4769,13 +4942,13 @@ void hugehelp(void)
"\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"
-, stdout);
- fputs(
" 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"
+, stdout);
+ fputs(
" curl -w 'We downloaded %{size_download} bytes\\n' www.download.com\n"
"\n"
"KERBEROS FTP TRANSFER\n"
@@ -4785,12 +4958,12 @@ void hugehelp(void)
" available.\n"
"\n"
" First, get the krb-ticket the normal way, like with the kinit/kauth tool.\n"
-, stdout);
- fputs(
" Then use curl in way similar to:\n"
"\n"
" curl --krb private ftp://krb4site.com -u username:fakepwd\n"
"\n"
+, stdout);
+ fputs(
" 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"
@@ -4802,9 +4975,9 @@ void hugehelp(void)
"\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"
, stdout);
fputs(
-" 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"
@@ -4817,10 +4990,10 @@ void hugehelp(void)
"\n"
" Other interesting options for it -t include:\n"
"\n"
-, stdout);
- fputs(
" - XDISPLOC=<X display> Sets the X display location.\n"
"\n"
+, stdout);
+ fputs(
" - 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"
@@ -4831,10 +5004,10 @@ void hugehelp(void)
"PERSISTENT CONNECTIONS\n"
"\n"
" Specifying multiple files on a single command line will make curl transfer\n"
-, stdout);
- fputs(
" all of them, one after the other in the specified order.\n"
"\n"
+, stdout);
+ fputs(
" 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"
" already initiated and was left open in the previous transfer. This greatly\n"
@@ -4842,9 +5015,9 @@ void hugehelp(void)
" 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"
, stdout);
fputs(
-" 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"
" all transfers will be persistent.\n"
@@ -4853,9 +5026,9 @@ void hugehelp(void)
"\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"
, stdout);
fputs(
-" 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"
@@ -4870,9 +5043,9 @@ void hugehelp(void)
"\n"
"IPv6\n"
"\n"
+" curl will connect to a server with IPv6 when a host lookup returns an IPv6\n"
, stdout);
fputs(
-" 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"
" addresses can also be specified directly in URLs using the syntax:\n"
@@ -4969,7 +5142,7 @@ void hugehelp(void) {}
#else
/*
* NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Wed Dec 21 13:40:15 2016
+ * Generation time: Tue Aug 8 09:32:01 2017
*/
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
@@ -4977,4517 +5150,4671 @@ 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 shrunk from 182809
- to 54098 bytes. You can disable the use of compressed help
+ Thanks to this operation, the size of this data shrank from 190291
+ to 55946 bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xfd,
- 0x6b, 0x7b, 0xdc, 0x46, 0x92, 0x2d, 0x8c, 0x7e, 0xe7, 0xaf, 0xc0, 0x54,
- 0x9f, 0x1e, 0x92, 0xd3, 0x55, 0xc5, 0x8b, 0x2e, 0xb6, 0xd8, 0x92, 0xc7,
- 0x34, 0x45, 0xd9, 0x1c, 0x53, 0x22, 0x37, 0x8b, 0xb2, 0xdd, 0xaf, 0xed,
- 0x47, 0x0f, 0xaa, 0x0a, 0x24, 0xd1, 0xaa, 0x02, 0xaa, 0x01, 0x14, 0x29,
- 0xf6, 0xec, 0xde, 0xbf, 0xfd, 0x64, 0xac, 0x88, 0xc8, 0x4c, 0x20, 0xb3,
- 0x8a, 0xb4, 0xdb, 0xee, 0x3d, 0xe7, 0x79, 0x4f, 0xef, 0x3d, 0x96, 0x44,
- 0x02, 0x89, 0xbc, 0x46, 0xc6, 0x65, 0xc5, 0x8a, 0x24, 0x79, 0xe8, 0x7f,
- 0x1f, 0xf0, 0x7f, 0x1f, 0xcc, 0xff, 0xcc, 0x9f, 0x1b, 0x49, 0x72, 0x5e,
- 0x95, 0x7f, 0xcd, 0x26, 0x4d, 0xfc, 0xd9, 0x0f, 0x1f, 0xfe, 0x77, 0xc2,
- 0xff, 0xcf, 0xbc, 0xf3, 0x93, 0xf9, 0x73, 0x63, 0x6d, 0xdb, 0x3b, 0x89,
- 0x7b, 0xe1, 0x7f, 0x7f, 0xd8, 0x4e, 0x1e, 0x7a, 0xe1, 0x7f, 0x27, 0x5b,
- 0x78, 0xe1, 0x83, 0x7c, 0xe1, 0x25, 0xfd, 0xfd, 0xc3, 0x87, 0xf5, 0x1f,
- 0xf9, 0x89, 0x7a, 0x45, 0xff, 0xd9, 0xa1, 0xf7, 0x7e, 0xfa, 0x40, 0x7f,
- 0x35, 0x3f, 0xd9, 0xd8, 0x78, 0x77, 0xf8, 0xf6, 0x58, 0x5f, 0x9d, 0x2c,
- 0xab, 0x59, 0x32, 0x48, 0x9a, 0x2a, 0x2d, 0xea, 0xab, 0xac, 0x4a, 0xd2,
- 0xe4, 0xfd, 0xc5, 0xe9, 0xc6, 0xc6, 0xe8, 0x2f, 0xef, 0xce, 0xce, 0x47,
- 0x27, 0xa3, 0xd6, 0x63, 0x3f, 0x96, 0x8b, 0x26, 0x2f, 0x8b, 0xfa, 0xe7,
- 0xe4, 0x47, 0xf3, 0xd0, 0x70, 0x38, 0xfc, 0x79, 0x63, 0xe3, 0xf5, 0xf1,
- 0xe8, 0xe8, 0xe2, 0xe4, 0xfc, 0xf2, 0xe4, 0xec, 0x5d, 0xeb, 0xd9, 0x24,
- 0xaf, 0x13, 0xd3, 0x58, 0x53, 0x96, 0x33, 0xf3, 0x1f, 0xd7, 0xfe, 0x34,
- 0x6d, 0xd2, 0xe4, 0xaa, 0x2a, 0xe7, 0x49, 0x59, 0xd1, 0x2f, 0xd2, 0xa4,
- 0xce, 0xaa, 0xdb, 0xac, 0xea, 0x27, 0xcb, 0x3a, 0x2f, 0xae, 0x93, 0xb2,
- 0xc8, 0x92, 0xf2, 0x2a, 0x69, 0x6e, 0x32, 0x6d, 0xae, 0x5e, 0x2e, 0x16,
- 0x65, 0xd5, 0x64, 0xd3, 0x64, 0x51, 0x95, 0x4d, 0x39, 0x29, 0x67, 0x75,
- 0xb2, 0xf5, 0xfa, 0xe4, 0xe8, 0xb2, 0x9f, 0xbc, 0x39, 0x39, 0x3d, 0x36,
- 0xff, 0xbd, 0x3c, 0xc7, 0x7f, 0x46, 0xfd, 0xe4, 0xeb, 0xb3, 0xf3, 0x6f,
- 0x8e, 0x2f, 0xfa, 0xc9, 0x37, 0x97, 0xf4, 0x33, 0xfa, 0xaf, 0xf9, 0x61,
- 0x72, 0xf2, 0xf6, 0xf0, 0xbc, 0xaf, 0xcd, 0xd1, 0x3f, 0xe8, 0x87, 0xa7,
- 0xaf, 0xcd, 0x0f, 0xf9, 0x0f, 0xfa, 0xe7, 0xf9, 0xd9, 0xf9, 0x13, 0xf9,
- 0x83, 0xfe, 0x79, 0x71, 0xf9, 0xd6, 0xfc, 0xf6, 0xe2, 0x72, 0x64, 0xfe,
- 0x3b, 0x3a, 0xa2, 0xff, 0xe0, 0x2b, 0xa3, 0xb7, 0x5f, 0xe1, 0x3f, 0x23,
- 0xdb, 0xdc, 0xe8, 0x2d, 0xff, 0x1c, 0x5f, 0xba, 0x3c, 0x3e, 0x7d, 0x77,
- 0x7c, 0x99, 0xa4, 0xc5, 0x34, 0xb9, 0x34, 0xcf, 0x6f, 0x0f, 0x93, 0xcb,
- 0x9b, 0x2c, 0x99, 0x94, 0xf3, 0x39, 0xfd, 0xc8, 0xcc, 0xc8, 0x34, 0xab,
- 0xf3, 0xeb, 0xc2, 0x0c, 0xc5, 0x8c, 0xfc, 0xae, 0xac, 0x3e, 0x26, 0xc9,
- 0x5d, 0xde, 0xdc, 0x94, 0xcb, 0x46, 0x9b, 0x5b, 0x9a, 0xd9, 0x48, 0xf2,
- 0xa2, 0xc9, 0xaa, 0x74, 0x42, 0x73, 0x3d, 0xdc, 0x68, 0xcd, 0x6a, 0x79,
- 0x65, 0xe6, 0xb0, 0x36, 0x93, 0x36, 0x5e, 0xd6, 0xb3, 0x32, 0x9d, 0xd2,
- 0x54, 0x99, 0x57, 0xae, 0x96, 0x66, 0x92, 0xab, 0x7c, 0xf2, 0xb1, 0x4e,
- 0x66, 0xf9, 0xc7, 0x8c, 0x26, 0xea, 0xd3, 0xbd, 0x4e, 0x5c, 0x9f, 0x1b,
- 0x4d, 0x97, 0x66, 0x4e, 0x8b, 0x81, 0x36, 0xd7, 0xe4, 0x93, 0x94, 0x3e,
- 0x80, 0x99, 0x4b, 0x96, 0x0b, 0x6a, 0x8d, 0x67, 0x2c, 0x59, 0x94, 0xb5,
- 0x79, 0x69, 0x34, 0x3a, 0x35, 0x3d, 0x2f, 0x8a, 0x0c, 0xfd, 0xa8, 0xfb,
- 0xe6, 0x1f, 0xe5, 0xc7, 0x3c, 0x33, 0x7f, 0xb9, 0xca, 0x67, 0x59, 0xc2,
- 0x2b, 0x6a, 0x9b, 0xa3, 0xa5, 0x4d, 0xaa, 0xac, 0x5e, 0xce, 0x33, 0x33,
- 0x7b, 0x6f, 0xb3, 0x26, 0x9d, 0xe5, 0xc5, 0x47, 0xf3, 0x57, 0x1a, 0xf8,
- 0xbc, 0xac, 0xb2, 0x61, 0x72, 0x58, 0x27, 0xf7, 0xe5, 0xd2, 0x0c, 0x78,
- 0x36, 0x33, 0x6b, 0x9e, 0x25, 0xe3, 0x6c, 0x56, 0xde, 0xf5, 0x69, 0xa5,
- 0x93, 0x62, 0x39, 0x1f, 0x9b, 0x06, 0xca, 0x2b, 0xd7, 0x5c, 0xda, 0x2c,
- 0x4d, 0x73, 0xfc, 0xf4, 0x3c, 0x35, 0x63, 0x32, 0xef, 0x56, 0xc9, 0x4d,
- 0x66, 0xc6, 0x5c, 0x2f, 0xf2, 0xe2, 0xdf, 0xda, 0xf3, 0x62, 0xa6, 0x76,
- 0x51, 0xde, 0x65, 0x95, 0x99, 0xd9, 0xf1, 0x7d, 0x62, 0x26, 0x61, 0xcc,
- 0x9b, 0xf0, 0xca, 0x6c, 0xb2, 0x24, 0x35, 0x4d, 0xd8, 0x0d, 0x38, 0xa8,
- 0xb2, 0x59, 0x4a, 0x9b, 0xc9, 0x7e, 0x63, 0x68, 0x16, 0x31, 0xb3, 0xbb,
- 0x4d, 0x5e, 0xdd, 0x7a, 0xb2, 0x8d, 0x97, 0xa7, 0x66, 0x24, 0xf9, 0xac,
- 0x36, 0xcb, 0x40, 0xc7, 0x42, 0x9e, 0xa1, 0x45, 0xa5, 0x63, 0x62, 0xf6,
- 0xe6, 0x7d, 0xd1, 0xa4, 0x9f, 0xf0, 0x79, 0xd9, 0x9b, 0x83, 0x69, 0xb6,
- 0xc8, 0x8a, 0x69, 0x56, 0x34, 0xc3, 0xe4, 0x2f, 0xe5, 0x72, 0xd3, 0x7c,
- 0xfb, 0x2a, 0x37, 0x73, 0x90, 0x4a, 0x53, 0xe6, 0xcb, 0x66, 0x13, 0x4c,
- 0xaa, 0x7c, 0xe1, 0x2d, 0x45, 0x59, 0x98, 0x35, 0x4f, 0x2e, 0xde, 0x1c,
- 0x25, 0x4f, 0x5e, 0x7c, 0xfe, 0xdc, 0xad, 0xb9, 0x69, 0x20, 0x99, 0xa4,
- 0x85, 0x19, 0x71, 0x36, 0xc9, 0xaf, 0xee, 0x93, 0xf9, 0x72, 0xd6, 0xe4,
- 0x0b, 0x33, 0xfb, 0xe6, 0xe3, 0x35, 0x1d, 0xa0, 0x45, 0x5a, 0x35, 0x35,
- 0x6d, 0x02, 0xfc, 0x00, 0x63, 0xbf, 0xab, 0xf2, 0x86, 0x0e, 0x12, 0x7e,
- 0x67, 0x7a, 0x98, 0x35, 0xb5, 0x36, 0x47, 0x7b, 0xcd, 0x7c, 0x67, 0x6c,
- 0xf6, 0x96, 0x99, 0xda, 0xb4, 0x36, 0x1f, 0x3d, 0xd8, 0x70, 0x32, 0xe4,
- 0xa6, 0x69, 0x16, 0x07, 0x3b, 0x3b, 0x75, 0xde, 0x64, 0xc3, 0xff, 0x36,
- 0xe7, 0xb0, 0xdf, 0xdc, 0x95, 0xfd, 0xe6, 0xa6, 0xca, 0xb2, 0x7f, 0x0c,
- 0xcd, 0x1e, 0xb6, 0x4f, 0x9a, 0xef, 0xde, 0x4b, 0xc7, 0xae, 0xb3, 0xc6,
- 0x7c, 0xe1, 0x6f, 0xcb, 0xac, 0xa0, 0x16, 0x4d, 0x3f, 0xd2, 0xd9, 0xe2,
- 0x26, 0x35, 0xcb, 0x99, 0x99, 0xdd, 0x48, 0x27, 0xdb, 0x6c, 0x18, 0xea,
- 0x15, 0x9f, 0xed, 0x1f, 0x7f, 0x0e, 0x3f, 0x7a, 0x85, 0x6f, 0x9a, 0xff,
- 0x0e, 0xb3, 0x4f, 0xe9, 0xdc, 0x8c, 0x8d, 0x3e, 0xb5, 0x43, 0x5b, 0xec,
- 0xc7, 0xbd, 0xc1, 0xde, 0xee, 0xee, 0xcf, 0xc3, 0xe6, 0x53, 0xf3, 0xb8,
- 0xe7, 0x77, 0x77, 0xdd, 0x1b, 0xf4, 0xe8, 0x16, 0x8d, 0x37, 0x99, 0x99,
- 0x2d, 0x43, 0x1f, 0xff, 0x7b, 0x56, 0x95, 0xf5, 0xf6, 0xe3, 0x5a, 0x4a,
- 0x07, 0x7f, 0x6f, 0x7f, 0xf7, 0x5d, 0x56, 0x63, 0xcf, 0xb8, 0xb1, 0x26,
- 0x69, 0x65, 0xf6, 0x6d, 0xd9, 0x38, 0xf1, 0xd4, 0x37, 0x87, 0xb2, 0xb1,
- 0x33, 0x63, 0xce, 0x9c, 0x79, 0xda, 0x08, 0xb6, 0x74, 0x46, 0x32, 0xad,
- 0x4e, 0x8a, 0xec, 0x93, 0x3d, 0xe5, 0xe6, 0xf4, 0x67, 0xe9, 0xe4, 0x26,
- 0x29, 0xcd, 0xe6, 0xaf, 0x22, 0x4b, 0xe0, 0x77, 0x28, 0xad, 0x26, 0x37,
- 0xf9, 0xad, 0x99, 0x8d, 0x17, 0x2f, 0x9e, 0x0f, 0xcc, 0x7f, 0x5e, 0xfc,
- 0xbc, 0x73, 0x5b, 0xce, 0xcc, 0xe4, 0x3c, 0xfd, 0x79, 0x87, 0x96, 0xf8,
- 0xbf, 0xd3, 0xfe, 0xb8, 0x3f, 0xf9, 0xc7, 0xf0, 0xa6, 0x99, 0xcf, 0x56,
- 0x6e, 0x9c, 0xb4, 0x30, 0xff, 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, 0xcc,
- 0xf8, 0xcd, 0xe6, 0x49, 0x65, 0x0e, 0x9a, 0x3c, 0xa5, 0x83, 0x69, 0xe4,
- 0x03, 0xc9, 0x2b, 0x34, 0xc5, 0x1f, 0xcb, 0xcd, 0x73, 0x65, 0x35, 0xcd,
- 0xaa, 0xf6, 0x36, 0x46, 0x77, 0x5c, 0x7f, 0x12, 0x33, 0x9f, 0x0b, 0xf3,
- 0xf1, 0x25, 0x89, 0x3a, 0x9c, 0x34, 0x6a, 0xc1, 0x9c, 0xd1, 0x6b, 0x33,
- 0x55, 0x66, 0x7a, 0x68, 0x63, 0xd1, 0xec, 0xdd, 0x27, 0xef, 0xcc, 0x1a,
- 0xb2, 0x7c, 0xf0, 0xf6, 0xdf, 0x2c, 0x6b, 0x9a, 0x07, 0x67, 0xce, 0x6d,
- 0xa2, 0x83, 0xbd, 0x60, 0x1f, 0xad, 0x7a, 0xde, 0x2c, 0xfd, 0xc1, 0x7e,
- 0xfb, 0xe1, 0xef, 0x8d, 0xdc, 0x74, 0x3b, 0xd8, 0x7c, 0xfd, 0xbf, 0xff,
- 0xe1, 0x6d, 0x84, 0x3b, 0xfa, 0x6d, 0x5e, 0xdc, 0x96, 0x1f, 0xcd, 0xc0,
- 0x71, 0xb1, 0xa5, 0xad, 0x49, 0x4d, 0x48, 0x34, 0xcc, 0x17, 0x8d, 0xbd,
- 0x31, 0x68, 0x87, 0x98, 0x1f, 0x8d, 0xd3, 0xf1, 0xec, 0x3e, 0xb9, 0x49,
- 0x6f, 0x33, 0x1a, 0xef, 0xc2, 0x6c, 0x1d, 0x9a, 0x01, 0x23, 0xc9, 0x67,
- 0x10, 0x2d, 0x72, 0x56, 0xa7, 0xe5, 0x72, 0x6c, 0xce, 0xfb, 0xdf, 0x96,
- 0x65, 0xc3, 0x13, 0x93, 0xde, 0x96, 0xf9, 0xb4, 0x75, 0x3d, 0xde, 0x64,
- 0x24, 0x63, 0xe8, 0xc3, 0xb8, 0x37, 0x8c, 0x8c, 0xa3, 0x9e, 0x62, 0xef,
- 0xe7, 0x0d, 0xdd, 0x40, 0x46, 0x3a, 0xa5, 0xb3, 0xba, 0x4c, 0x92, 0xeb,
- 0x92, 0x36, 0x2e, 0x64, 0x22, 0x76, 0x9e, 0x59, 0x94, 0x9b, 0x94, 0x2e,
- 0x1a, 0x73, 0xa7, 0xd8, 0xad, 0x59, 0x65, 0x10, 0x8f, 0x58, 0xa9, 0x74,
- 0xd6, 0xe7, 0x0b, 0x85, 0xde, 0x91, 0xa9, 0x4a, 0x36, 0xff, 0x7d, 0xb3,
- 0x9f, 0x6c, 0xfe, 0xe7, 0x26, 0x44, 0xfb, 0xe6, 0x7f, 0x6c, 0xba, 0x75,
- 0x36, 0x1a, 0xd2, 0x6d, 0x3e, 0xa5, 0xbb, 0xc1, 0x8c, 0xe4, 0xe4, 0xfc,
- 0xf6, 0x79, 0xf2, 0x77, 0xba, 0xce, 0x8d, 0xf8, 0xcb, 0x3e, 0xe9, 0x26,
- 0xd1, 0xb1, 0x99, 0xb7, 0x13, 0x23, 0x07, 0xd3, 0x05, 0xdd, 0xeb, 0x59,
- 0x35, 0x31, 0x3b, 0x2a, 0xbd, 0x36, 0x7b, 0xc8, 0x5c, 0x8f, 0xda, 0x1c,
- 0xb5, 0x4f, 0xaf, 0xf0, 0xb0, 0x8c, 0xcc, 0x4a, 0x8a, 0x74, 0x6e, 0x36,
- 0xe9, 0x29, 0xf5, 0x28, 0x2f, 0xc2, 0xc5, 0xfc, 0xf1, 0x2a, 0xfb, 0x7c,
- 0xf7, 0xe0, 0xe0, 0xc9, 0x1f, 0xf7, 0x9f, 0x65, 0xcd, 0xcd, 0xee, 0xcf,
- 0x3b, 0xf6, 0x91, 0x93, 0x2b, 0x4c, 0xbb, 0x6e, 0x3f, 0xed, 0x84, 0xb9,
- 0x78, 0xad, 0xe0, 0x36, 0xef, 0x9b, 0xbf, 0x67, 0x57, 0xf9, 0xa7, 0xbe,
- 0xaa, 0x30, 0x7c, 0x0c, 0x52, 0xb3, 0xd5, 0xcc, 0xfa, 0xd1, 0xa9, 0xd5,
- 0xe6, 0xae, 0x97, 0x59, 0x6d, 0x66, 0xf2, 0xee, 0x26, 0x6d, 0x12, 0xdb,
- 0x00, 0xaf, 0xec, 0x3c, 0xbf, 0xbe, 0x69, 0x92, 0xbb, 0x94, 0xe4, 0xff,
- 0x49, 0xc3, 0x4d, 0xd0, 0xc5, 0x6b, 0xa4, 0xfe, 0x55, 0x6a, 0xc4, 0x37,
- 0xad, 0x21, 0x6e, 0xd9, 0xb1, 0xbb, 0xf4, 0x1b, 0xb3, 0xcd, 0x79, 0x41,
- 0x9c, 0x86, 0x33, 0x4e, 0x6b, 0x3a, 0x48, 0x85, 0x39, 0xaf, 0x8d, 0xb9,
- 0xb6, 0x97, 0xf4, 0xaf, 0x1b, 0x73, 0x31, 0x63, 0x0e, 0xa4, 0xa3, 0xb8,
- 0xbb, 0xde, 0xd0, 0x72, 0xd2, 0xda, 0xd8, 0xfb, 0xc4, 0x2c, 0x52, 0x5f,
- 0x96, 0xd9, 0xbe, 0x51, 0x9b, 0x03, 0x67, 0x84, 0x85, 0xdd, 0x19, 0x3d,
- 0x92, 0x7b, 0x3d, 0x1e, 0x27, 0xfa, 0x98, 0xd6, 0x74, 0x77, 0xf3, 0x0d,
- 0x6d, 0x3a, 0xef, 0x0d, 0xd6, 0x4c, 0x5a, 0xfa, 0x91, 0xb4, 0x84, 0x8e,
- 0x2e, 0x82, 0xd7, 0xa6, 0xa5, 0xd9, 0x64, 0xa6, 0xb7, 0x46, 0x3e, 0xd2,
- 0xc8, 0x48, 0xea, 0x61, 0x56, 0xb0, 0xc9, 0x4d, 0x9b, 0xf4, 0xc3, 0xbc,
- 0x21, 0xb1, 0x0f, 0xc5, 0xd2, 0xf4, 0xd7, 0x4c, 0x0a, 0x74, 0x43, 0x23,
- 0x3b, 0xbd, 0xf1, 0xe3, 0xc6, 0x32, 0xcf, 0x26, 0xb7, 0x46, 0x71, 0x30,
- 0x3a, 0x62, 0x66, 0xdf, 0xc2, 0x15, 0x3b, 0x21, 0x75, 0x65, 0x66, 0xce,
- 0xcb, 0xa4, 0xac, 0x2a, 0x52, 0xc2, 0x69, 0x05, 0xc7, 0x2c, 0xd7, 0xe6,
- 0x99, 0xb9, 0xd9, 0xfd, 0xe9, 0xcc, 0xe9, 0x8e, 0x31, 0xf2, 0xc5, 0xa8,
- 0x0a, 0x90, 0x20, 0xe6, 0x4a, 0x87, 0x18, 0xc6, 0xc0, 0xd1, 0x3b, 0x6a,
- 0x7b, 0x32, 0xc9, 0x16, 0x4d, 0x1d, 0x1b, 0x93, 0x2e, 0xb8, 0xe9, 0x4e,
- 0x95, 0xd1, 0xcc, 0xfb, 0x7a, 0x10, 0xe6, 0xd5, 0xde, 0xc3, 0x50, 0x85,
- 0x54, 0xb5, 0x30, 0xaa, 0x51, 0x6d, 0x67, 0xad, 0xc1, 0xde, 0x30, 0x62,
- 0x0c, 0x73, 0x3e, 0xa7, 0x8e, 0xd2, 0xc3, 0x35, 0x9f, 0x54, 0x88, 0x4b,
- 0x5a, 0x48, 0x56, 0x7e, 0xf9, 0xbb, 0x74, 0x9b, 0x98, 0xf9, 0xb4, 0x8d,
- 0x9b, 0xaf, 0xda, 0x35, 0xa5, 0xcf, 0xd7, 0xc6, 0x6c, 0x30, 0x97, 0xeb,
- 0xb4, 0xbe, 0x31, 0xfa, 0x50, 0x2d, 0x27, 0x3b, 0x9f, 0x9b, 0x3d, 0x73,
- 0x4b, 0xeb, 0xbb, 0xc8, 0xb2, 0xe9, 0x30, 0x39, 0xbb, 0x22, 0xa9, 0x5a,
- 0x99, 0x4e, 0x37, 0xf8, 0x35, 0x09, 0x7a, 0x33, 0x6f, 0x53, 0xe8, 0xd5,
- 0xf6, 0x68, 0x71, 0x57, 0x3c, 0x89, 0x4d, 0x3b, 0xcd, 0x4c, 0x76, 0x42,
- 0x52, 0x6e, 0xd6, 0xbe, 0x15, 0x70, 0x0e, 0x8d, 0xf4, 0xa6, 0xee, 0x8d,
- 0xb3, 0x04, 0x3b, 0x71, 0x9c, 0x35, 0x77, 0x59, 0x66, 0x9b, 0xab, 0x33,
- 0x73, 0x13, 0xd1, 0xa2, 0xb1, 0x32, 0x06, 0x61, 0x48, 0x53, 0x7b, 0x7e,
- 0x71, 0xf6, 0xf5, 0xc5, 0xf1, 0x68, 0x94, 0xbc, 0x3d, 0xbe, 0x3c, 0xbe,
- 0x68, 0xcd, 0x74, 0x51, 0x56, 0x73, 0xac, 0xe8, 0x34, 0xaf, 0x17, 0xb3,
- 0xf4, 0x9e, 0x96, 0xda, 0x8c, 0xe4, 0xba, 0xa2, 0x93, 0x35, 0xcf, 0xe8,
- 0x56, 0x98, 0x2e, 0x21, 0xc9, 0x92, 0xd2, 0xc8, 0x87, 0x54, 0x94, 0x50,
- 0x12, 0x26, 0xd0, 0x5c, 0x8b, 0x6b, 0x37, 0xd3, 0x46, 0xe2, 0xc8, 0xe5,
- 0x46, 0xb7, 0x9b, 0x5d, 0x0f, 0xd2, 0x06, 0x61, 0x6f, 0xf4, 0xdd, 0xcf,
- 0x78, 0x9a, 0x6a, 0x8c, 0xc9, 0xec, 0xd9, 0x7c, 0x0e, 0x61, 0x67, 0xfe,
- 0x74, 0x0a, 0x60, 0x76, 0x65, 0xb4, 0x5f, 0x73, 0xe1, 0xb1, 0xf2, 0xde,
- 0xed, 0x93, 0xf6, 0xd6, 0xaa, 0xac, 0x66, 0x1b, 0x92, 0x68, 0xa6, 0x06,
- 0xb9, 0x2b, 0xfc, 0x05, 0x2b, 0xc4, 0x8c, 0x9a, 0x40, 0xb2, 0x4f, 0x1e,
- 0x5b, 0x50, 0x17, 0x32, 0xb3, 0xb2, 0x53, 0x6e, 0xbe, 0x5e, 0x5e, 0xe1,
- 0x20, 0x27, 0x5b, 0x46, 0x59, 0x7e, 0x6b, 0x0c, 0x18, 0x63, 0x44, 0xf4,
- 0x93, 0xf3, 0x6d, 0xbc, 0xb7, 0xb7, 0xbb, 0xff, 0x94, 0x05, 0xc1, 0x50,
- 0x9b, 0x7b, 0xe3, 0x09, 0xe2, 0xbd, 0x8f, 0xb4, 0xbc, 0xfc, 0x10, 0x35,
- 0x3e, 0x4c, 0xf6, 0xde, 0xf2, 0x4f, 0x9e, 0x7e, 0xfe, 0xec, 0xb3, 0xe7,
- 0xf2, 0xc3, 0xf6, 0x06, 0xb7, 0xfd, 0xc7, 0xee, 0x80, 0x31, 0x46, 0xd6,
- 0x99, 0xe9, 0x89, 0x19, 0xdd, 0x3c, 0x2f, 0xcc, 0x31, 0x31, 0xc7, 0x4a,
- 0x64, 0x15, 0xed, 0x67, 0xd3, 0xf9, 0x2b, 0x96, 0x6c, 0xb2, 0xae, 0x6d,
- 0x2b, 0xcf, 0xbc, 0x6c, 0xb6, 0xac, 0x91, 0xe5, 0x76, 0x91, 0x30, 0x13,
- 0xe6, 0x80, 0xd1, 0xad, 0x33, 0x26, 0x01, 0x4b, 0xa6, 0x8e, 0xd1, 0x49,
- 0xb3, 0xe8, 0xd7, 0xec, 0xad, 0x68, 0xde, 0x30, 0x7d, 0x33, 0x77, 0x22,
- 0x5d, 0x73, 0xe1, 0xbc, 0x1b, 0x51, 0x00, 0x09, 0x79, 0x97, 0xd7, 0x10,
- 0x0d, 0x77, 0xe5, 0x72, 0x66, 0x0c, 0x0b, 0x7a, 0x60, 0xb9, 0xc0, 0x0b,
- 0xe6, 0x53, 0x0b, 0x27, 0x03, 0xe6, 0xf9, 0x27, 0xda, 0x3b, 0xdd, 0x56,
- 0x4c, 0xd7, 0xcc, 0x3f, 0x17, 0x66, 0x2b, 0x71, 0x77, 0x86, 0xdd, 0x1b,
- 0x02, 0xb2, 0x2f, 0xd8, 0x89, 0x74, 0xe6, 0x21, 0xb4, 0xcf, 0xcf, 0x46,
- 0x97, 0xa4, 0x01, 0x9c, 0xbf, 0xbf, 0x34, 0x0d, 0x19, 0x15, 0xa0, 0x6e,
- 0xcc, 0xa6, 0xa4, 0x17, 0x8b, 0x0c, 0x56, 0x9d, 0x36, 0x67, 0xf6, 0x5e,
- 0x0e, 0x41, 0x05, 0xb5, 0x46, 0x3f, 0xc9, 0x7d, 0x64, 0xb3, 0x97, 0x8e,
- 0xa0, 0x1a, 0xbd, 0x7c, 0x87, 0xbb, 0x97, 0x92, 0xad, 0x2f, 0xb6, 0xcd,
- 0xa6, 0x1d, 0xd8, 0xe6, 0x7e, 0xa4, 0xa7, 0xa1, 0x7b, 0xd4, 0xf9, 0x3c,
- 0x9f, 0xa5, 0x9e, 0x72, 0x25, 0xf2, 0x94, 0x4e, 0xa7, 0x95, 0x2a, 0x13,
- 0xb3, 0x67, 0xd0, 0x69, 0x67, 0xdb, 0xd1, 0x0c, 0x42, 0x26, 0xb9, 0x85,
- 0x9a, 0x92, 0x3a, 0x00, 0x15, 0x76, 0x91, 0xdb, 0x89, 0xa3, 0x15, 0x23,
- 0x61, 0xd5, 0x9a, 0xa6, 0xee, 0xaa, 0x05, 0xd3, 0x46, 0xf7, 0x11, 0x9c,
- 0x07, 0x76, 0xe2, 0x92, 0xde, 0x38, 0xad, 0x7a, 0x89, 0x95, 0xc4, 0x7c,
- 0x32, 0xe9, 0x7c, 0x54, 0xd9, 0xf5, 0xd2, 0x8c, 0x20, 0xe1, 0xb9, 0xa5,
- 0x61, 0xfe, 0xc1, 0xee, 0x82, 0xc1, 0x40, 0x1b, 0x18, 0x98, 0xd7, 0x69,
- 0x5c, 0x30, 0xfb, 0xae, 0x8c, 0x1d, 0x61, 0x4e, 0xcc, 0xc6, 0xc6, 0x19,
- 0x1c, 0x0d, 0xd6, 0x2b, 0x71, 0xc6, 0xfe, 0x88, 0x84, 0x2f, 0x37, 0x36,
- 0x70, 0x12, 0x76, 0x21, 0x18, 0x85, 0xf2, 0xce, 0xec, 0xcd, 0xd4, 0x4c,
- 0xad, 0x39, 0x18, 0x6f, 0x69, 0x48, 0xec, 0x56, 0x48, 0xc4, 0x89, 0x81,
- 0xf5, 0x33, 0xd3, 0x6d, 0x46, 0x6b, 0xcf, 0xea, 0x74, 0x9a, 0xd3, 0xef,
- 0xcc, 0x21, 0x30, 0xd7, 0xd0, 0x32, 0x83, 0xce, 0x2e, 0x63, 0x9f, 0xbb,
- 0x31, 0xe3, 0xdc, 0xde, 0x18, 0x9d, 0x3f, 0xe9, 0xb1, 0xb8, 0x1c, 0xd0,
- 0x67, 0x7a, 0x34, 0xe1, 0xf3, 0xce, 0x47, 0xfa, 0xc9, 0x60, 0x2a, 0x57,
- 0xb1, 0x9c, 0x5a, 0x33, 0xde, 0x79, 0x7a, 0xef, 0x2b, 0xd7, 0x10, 0xa8,
- 0xe8, 0x79, 0x59, 0x59, 0xad, 0xc4, 0xdc, 0x7b, 0x0b, 0xd2, 0x78, 0x44,
- 0xd0, 0xe2, 0xc6, 0xc2, 0xb9, 0xaa, 0xb9, 0x6b, 0x7d, 0xa3, 0xd2, 0xd1,
- 0x93, 0xd7, 0x37, 0xfa, 0xa8, 0x77, 0xfb, 0xa5, 0x66, 0x6c, 0x24, 0xc1,
- 0xc9, 0x0e, 0x9d, 0xaa, 0x70, 0x2e, 0x2b, 0x96, 0x38, 0xb3, 0xd2, 0x6c,
- 0xb8, 0x1e, 0xeb, 0x95, 0x5e, 0xc7, 0xa9, 0xa7, 0xe6, 0xff, 0x06, 0xec,
- 0x9f, 0x29, 0xad, 0xb2, 0x6d, 0xbb, 0x2d, 0xd3, 0x55, 0x3f, 0xd8, 0x35,
- 0x37, 0x51, 0x23, 0x4c, 0x92, 0xb9, 0xdf, 0x6a, 0xda, 0x6e, 0x3a, 0xef,
- 0xd8, 0x85, 0xe6, 0x3e, 0xda, 0x6c, 0xf8, 0xd0, 0xc0, 0x36, 0xe9, 0xcc,
- 0x7c, 0x0d, 0x73, 0x41, 0x6e, 0x1b, 0x3b, 0x32, 0x33, 0xa2, 0x69, 0x6e,
- 0x04, 0xb6, 0xb9, 0x35, 0x74, 0x65, 0x9c, 0x19, 0x15, 0xd1, 0x54, 0xef,
- 0x03, 0xbb, 0x83, 0x7c, 0x01, 0xfe, 0xbd, 0xa1, 0x7d, 0x1a, 0x9c, 0x99,
- 0xb1, 0x9f, 0x62, 0x1c, 0x83, 0xdb, 0x84, 0x4e, 0x89, 0xd1, 0xed, 0xe9,
- 0xc8, 0x0c, 0xce, 0x4e, 0x6f, 0xbd, 0xdd, 0x4e, 0x16, 0x6f, 0x41, 0xca,
- 0x44, 0x1f, 0x5e, 0x85, 0x71, 0x59, 0x1a, 0xf3, 0xd2, 0x0d, 0x8d, 0x84,
- 0x76, 0x56, 0x90, 0x10, 0x93, 0x15, 0x1d, 0x0c, 0xf8, 0x57, 0x68, 0xf9,
- 0xde, 0xd8, 0x34, 0xe9, 0x75, 0x9a, 0xdb, 0xfd, 0x26, 0x02, 0xcf, 0x3e,
- 0x5b, 0x94, 0xf2, 0x38, 0xad, 0x14, 0xa9, 0x29, 0x22, 0x5b, 0x96, 0xb8,
- 0xcd, 0x33, 0x1a, 0x97, 0x11, 0x0e, 0x38, 0xe1, 0xd2, 0x2c, 0x74, 0x3b,
- 0x6d, 0x6e, 0x0c, 0x6d, 0x96, 0x14, 0x43, 0x48, 0x48, 0xa8, 0x79, 0xa6,
- 0xc9, 0xde, 0x30, 0xf9, 0xa6, 0xbc, 0xcb, 0xe0, 0x63, 0x83, 0x12, 0x9e,
- 0x93, 0x97, 0xc8, 0xe8, 0x6b, 0x77, 0x59, 0x32, 0x37, 0xfa, 0xa1, 0x99,
- 0x4d, 0xa8, 0x08, 0xf8, 0x99, 0xe9, 0xa7, 0x33, 0x2c, 0xca, 0x3b, 0x7c,
- 0xd6, 0x0e, 0xc2, 0xae, 0xe4, 0x15, 0x9f, 0x88, 0x64, 0x0b, 0x2a, 0xc8,
- 0x84, 0x26, 0x6b, 0xd1, 0xb8, 0x51, 0xd8, 0xf9, 0x30, 0xe2, 0xb4, 0xf6,
- 0x0e, 0x17, 0xdd, 0xc7, 0x74, 0x15, 0x7e, 0x36, 0xdc, 0x7b, 0x31, 0xdc,
- 0x1d, 0x92, 0xc1, 0x90, 0xdd, 0xe6, 0xe5, 0xb2, 0x36, 0x5f, 0x47, 0x57,
- 0x12, 0xef, 0xcd, 0x8c, 0x2e, 0xce, 0xa6, 0xbc, 0xbe, 0x9e, 0xb1, 0x7a,
- 0xb2, 0x53, 0x5e, 0x5d, 0x79, 0x1a, 0x4c, 0x95, 0x2d, 0xd8, 0x50, 0xa1,
- 0xc9, 0x91, 0x43, 0xc7, 0xb2, 0xcf, 0x57, 0x5d, 0x64, 0x3a, 0x9d, 0xd9,
- 0x3f, 0x18, 0x98, 0xed, 0x46, 0xae, 0xb0, 0x8e, 0xeb, 0x74, 0x8b, 0xc4,
- 0xfb, 0x76, 0x72, 0x69, 0xe4, 0x70, 0xcd, 0x57, 0x9b, 0xd9, 0x5c, 0x57,
- 0xf9, 0xf5, 0xb2, 0xca, 0x58, 0x24, 0xc2, 0x7b, 0xa6, 0x4e, 0x33, 0x12,
- 0x5d, 0x37, 0x25, 0x7c, 0x4d, 0x66, 0xdb, 0x67, 0xb3, 0xab, 0x7e, 0xa7,
- 0x39, 0x68, 0x03, 0xd4, 0x33, 0xf4, 0x0b, 0x43, 0x33, 0xb7, 0x3e, 0x1a,
- 0x2b, 0x32, 0xb9, 0x13, 0xe6, 0xc6, 0xa4, 0x4b, 0xc8, 0xd9, 0x92, 0x4c,
- 0x66, 0x69, 0x3e, 0x87, 0xaa, 0x2c, 0xce, 0x84, 0x61, 0xa7, 0xb9, 0x4b,
- 0x51, 0xe5, 0xa0, 0xc5, 0x8d, 0x49, 0x93, 0xac, 0x6a, 0x3a, 0x43, 0x74,
- 0x77, 0xa4, 0x7a, 0x11, 0xb1, 0x9e, 0x76, 0x93, 0x4d, 0x3e, 0xd2, 0x8f,
- 0xfd, 0x7b, 0x67, 0xd0, 0x69, 0x8e, 0xbc, 0x68, 0x50, 0x57, 0xcd, 0x53,
- 0x4b, 0x33, 0xd7, 0x8b, 0xb2, 0xae, 0x73, 0xb2, 0x46, 0x49, 0xbb, 0x5a,
- 0x4e, 0xa0, 0x74, 0x91, 0x79, 0xf6, 0xc9, 0x68, 0x4d, 0xe6, 0xa4, 0x35,
- 0xf0, 0x54, 0x56, 0x46, 0xc1, 0x9a, 0x0e, 0x9a, 0x2a, 0x5f, 0xac, 0xea,
- 0x1d, 0x4b, 0xb2, 0xb6, 0xc4, 0xaf, 0x45, 0x01, 0x86, 0x6e, 0xc9, 0xda,
- 0xe6, 0x24, 0xe9, 0xcc, 0x66, 0xa7, 0x39, 0x9e, 0xdb, 0x3e, 0x99, 0x57,
- 0xb9, 0x39, 0xdc, 0xde, 0x29, 0x36, 0x9a, 0x86, 0xec, 0x31, 0xa3, 0x14,
- 0xe5, 0x13, 0x88, 0xab, 0xfc, 0x3a, 0x23, 0x6f, 0xa5, 0xd9, 0x76, 0xcd,
- 0xcc, 0x08, 0x31, 0x6f, 0xff, 0xda, 0x15, 0x2f, 0xb2, 0xeb, 0xb2, 0x21,
- 0xb9, 0x31, 0xdc, 0xe8, 0xfc, 0xee, 0x3d, 0x6e, 0x5f, 0xbb, 0x27, 0xf4,
- 0x1e, 0xf5, 0xa5, 0x67, 0xce, 0x17, 0x9c, 0xf9, 0x34, 0xdf, 0xa3, 0xa2,
- 0xc0, 0xd7, 0xcd, 0x34, 0x2f, 0xba, 0xab, 0x6e, 0x5a, 0x9b, 0x64, 0x50,
- 0x65, 0x20, 0xe3, 0xf5, 0x82, 0xd1, 0x1b, 0x74, 0x4c, 0xea, 0x3e, 0x99,
- 0x56, 0x77, 0xf9, 0x24, 0x53, 0xeb, 0x56, 0xbc, 0x30, 0x33, 0x73, 0xc1,
- 0x35, 0xdd, 0x89, 0x58, 0xd6, 0xd0, 0xb8, 0x49, 0x46, 0xb0, 0x31, 0x72,
- 0x97, 0x93, 0xde, 0x78, 0xc2, 0xbb, 0x1d, 0xc2, 0xd3, 0x1c, 0x52, 0x52,
- 0x84, 0xd2, 0x2a, 0x87, 0xe5, 0x65, 0x9a, 0x93, 0x7e, 0x7a, 0x0a, 0xb2,
- 0xea, 0xfc, 0xae, 0xdf, 0x78, 0x5f, 0xf4, 0x02, 0xa7, 0x0f, 0xc0, 0x08,
- 0xb9, 0x4a, 0xf3, 0x59, 0x64, 0x9e, 0xa0, 0xdc, 0x18, 0x6b, 0xe6, 0x26,
- 0xab, 0x64, 0x0d, 0x96, 0x34, 0xe9, 0xe4, 0x59, 0x0e, 0x9e, 0x1e, 0x65,
- 0x19, 0x3b, 0x1c, 0x70, 0x9b, 0x7f, 0xba, 0xb7, 0xd3, 0x0b, 0xf1, 0xca,
- 0x6b, 0x27, 0x7f, 0xe7, 0xe5, 0x73, 0x2d, 0x0c, 0x52, 0x6a, 0x35, 0x5d,
- 0x90, 0x0b, 0xb5, 0x7b, 0x42, 0x49, 0x97, 0x21, 0x2f, 0xfc, 0xb6, 0x3a,
- 0x64, 0xc4, 0x21, 0x55, 0x58, 0xef, 0x35, 0x44, 0x1b, 0x39, 0x8b, 0xe5,
- 0x08, 0x73, 0x3b, 0x72, 0x81, 0x77, 0x9a, 0x33, 0x0a, 0x03, 0xf9, 0x98,
- 0x60, 0xc0, 0xb5, 0x76, 0xac, 0x31, 0xa6, 0x2a, 0xeb, 0x43, 0x25, 0x07,
- 0x0a, 0xcd, 0xb7, 0x6a, 0x2e, 0x38, 0xb3, 0x78, 0xa9, 0xd3, 0x1c, 0xe9,
- 0x52, 0x74, 0xa3, 0x99, 0x43, 0x93, 0xd3, 0x7e, 0xc4, 0x26, 0x50, 0x37,
- 0x9a, 0xd9, 0xbe, 0xec, 0x55, 0x19, 0x92, 0x2b, 0x91, 0x9a, 0xc0, 0x1d,
- 0x88, 0xee, 0x5e, 0xcd, 0xd2, 0x6b, 0xb3, 0xef, 0x3a, 0xcd, 0xe5, 0xd7,
- 0xc6, 0x3e, 0x62, 0x67, 0x76, 0x5d, 0x1a, 0xa1, 0x46, 0xe3, 0x16, 0x5b,
- 0xd1, 0x98, 0x0a, 0x66, 0x9b, 0xcd, 0x96, 0x70, 0x6a, 0x9e, 0x99, 0x01,
- 0x8e, 0x46, 0xdf, 0x6c, 0x7b, 0x33, 0xc8, 0xf3, 0xfb, 0x18, 0xf1, 0x06,
- 0xf9, 0x04, 0xb5, 0x36, 0xf9, 0x0a, 0x6b, 0xd2, 0x95, 0x72, 0xa2, 0x4f,
- 0x85, 0x93, 0xa7, 0x13, 0x41, 0xee, 0x85, 0xa1, 0x08, 0x00, 0x48, 0x00,
- 0x4c, 0x93, 0x7a, 0x3a, 0x78, 0x87, 0x93, 0x05, 0xca, 0xd7, 0x87, 0xf9,
- 0xdb, 0xb2, 0x5e, 0x92, 0xd1, 0xd7, 0x69, 0x6e, 0x61, 0x04, 0x59, 0x63,
- 0x14, 0x7f, 0x23, 0x91, 0x96, 0x05, 0xfd, 0x69, 0x6f, 0xbd, 0x1c, 0x97,
- 0x3c, 0x2d, 0x49, 0x45, 0x8e, 0x25, 0xd2, 0x2f, 0xed, 0x8d, 0x61, 0x44,
- 0x8b, 0xb4, 0xdc, 0x5d, 0x5a, 0x98, 0xde, 0xe4, 0xf8, 0x86, 0xd8, 0x99,
- 0xe6, 0x14, 0x34, 0xa1, 0x83, 0xb7, 0x42, 0x8a, 0x6f, 0xd5, 0x4b, 0x23,
- 0x67, 0xe8, 0xb2, 0x67, 0x21, 0x12, 0x08, 0x10, 0x15, 0x32, 0x46, 0xb5,
- 0xf0, 0xa4, 0xc9, 0xf6, 0x6f, 0x7d, 0x4c, 0xb0, 0x70, 0xfe, 0x4a, 0x4e,
- 0x8c, 0x9a, 0x65, 0x14, 0xa8, 0x97, 0x47, 0x87, 0x09, 0xfd, 0x85, 0x64,
- 0xa7, 0xf9, 0xee, 0x17, 0xdd, 0xb5, 0xbd, 0x3c, 0x1d, 0xc5, 0x96, 0xb6,
- 0xed, 0x92, 0xf5, 0x1a, 0x10, 0xaf, 0x45, 0x49, 0xf7, 0xb9, 0x51, 0x8a,
- 0x82, 0xd9, 0x23, 0x97, 0x65, 0x66, 0x3a, 0x2c, 0x81, 0x0e, 0x0e, 0xf7,
- 0x90, 0x40, 0x33, 0x17, 0x7d, 0x63, 0xd4, 0x17, 0xe7, 0xa1, 0x68, 0x77,
- 0x0c, 0x2e, 0x89, 0xee, 0x56, 0xf1, 0x7e, 0xbf, 0x55, 0x6f, 0x5b, 0x99,
- 0x66, 0x5a, 0x39, 0x3f, 0x7e, 0x0b, 0xcd, 0x33, 0x35, 0x5b, 0xe8, 0x9d,
- 0x7a, 0x03, 0x34, 0x9a, 0x33, 0x5e, 0xe6, 0xb3, 0x96, 0xcb, 0xcd, 0x29,
- 0xcb, 0x08, 0xa5, 0xf0, 0x0e, 0x43, 0xd7, 0xd8, 0x79, 0x9c, 0xc3, 0xfb,
- 0xd2, 0xdd, 0x6f, 0xcd, 0xfd, 0x42, 0x1c, 0x47, 0xcb, 0xba, 0x65, 0x9f,
- 0xe9, 0x3d, 0x3d, 0x23, 0xf3, 0x8e, 0x35, 0x52, 0xaf, 0xcd, 0x60, 0xad,
- 0xd0, 0x2d, 0xba, 0x16, 0xae, 0x8b, 0xfc, 0xef, 0x62, 0xa1, 0x66, 0xc5,
- 0x6d, 0x5e, 0x95, 0xc5, 0x9c, 0x76, 0xd6, 0xad, 0x11, 0xc0, 0x10, 0xd3,
- 0xa4, 0x8f, 0x19, 0x41, 0xb2, 0x79, 0xf4, 0xfe, 0xe2, 0xf4, 0xc3, 0xd1,
- 0xe1, 0x87, 0xaf, 0xde, 0xbf, 0x7b, 0x7d, 0x7a, 0xbc, 0xd9, 0x3d, 0xde,
- 0x57, 0x2c, 0x20, 0xe8, 0xc8, 0x98, 0x7d, 0x2a, 0x61, 0x32, 0xd3, 0x45,
- 0x6e, 0xf9, 0x3a, 0xbf, 0x35, 0x02, 0x6e, 0x91, 0x36, 0x37, 0xec, 0x02,
- 0xc3, 0xdf, 0x60, 0x34, 0xca, 0x84, 0x77, 0x9a, 0x1b, 0x9b, 0x9b, 0xd9,
- 0x74, 0x9a, 0xcf, 0xa1, 0x0c, 0x5e, 0xcf, 0x8c, 0xe8, 0xdb, 0xda, 0xc1,
- 0x60, 0x64, 0xb4, 0xc4, 0x74, 0xad, 0x94, 0x77, 0xb5, 0xaf, 0xdf, 0x79,
- 0xde, 0xb0, 0x65, 0x53, 0x9a, 0x35, 0x92, 0x69, 0x34, 0xe6, 0x43, 0xf9,
- 0x51, 0xe3, 0x6a, 0x89, 0xe9, 0x4f, 0x64, 0xb9, 0x6b, 0x5e, 0x17, 0x9e,
- 0x8a, 0x4d, 0x6a, 0xc9, 0xec, 0xe4, 0x81, 0x74, 0x72, 0x52, 0x35, 0x9b,
- 0xfd, 0x24, 0xcb, 0x71, 0x44, 0x34, 0x70, 0x40, 0x7a, 0x1b, 0x4c, 0xdf,
- 0xae, 0xa6, 0x62, 0xac, 0x96, 0x7b, 0x9a, 0x03, 0x6a, 0x64, 0x98, 0x7d,
- 0xca, 0x70, 0x06, 0xe5, 0xad, 0xa3, 0x65, 0x85, 0x53, 0xfd, 0xbd, 0xd1,
- 0x4e, 0x48, 0x16, 0xbe, 0x86, 0xed, 0x6c, 0x5e, 0xd0, 0x87, 0xcc, 0xb5,
- 0xd3, 0xbd, 0x02, 0xcb, 0xd9, 0x94, 0xcc, 0x54, 0xd8, 0x40, 0xb0, 0x2c,
- 0xcf, 0x0f, 0x2f, 0xbf, 0x09, 0xe6, 0x84, 0x04, 0xbe, 0x0b, 0x62, 0xcb,
- 0x56, 0x84, 0xe6, 0x4e, 0x2a, 0x2a, 0x0e, 0xc8, 0xbb, 0xd1, 0x28, 0x41,
- 0x88, 0x74, 0x96, 0x8f, 0xab, 0x94, 0xbe, 0x49, 0x3f, 0xa6, 0x9f, 0x9a,
- 0x6d, 0xdd, 0x69, 0xee, 0xfc, 0xdb, 0xa3, 0xd1, 0x1f, 0xf6, 0xf6, 0x8c,
- 0x1a, 0x38, 0x5d, 0x9a, 0x79, 0xd9, 0x32, 0xaf, 0x14, 0xb5, 0x39, 0x99,
- 0xf3, 0x61, 0x5d, 0x6e, 0xe3, 0x1a, 0x87, 0xee, 0x87, 0x8b, 0x22, 0xbd,
- 0x35, 0xf7, 0x2f, 0x76, 0x12, 0xcf, 0x31, 0xed, 0xe7, 0x4e, 0x73, 0xb2,
- 0xc0, 0x1a, 0x41, 0x36, 0xb2, 0xc3, 0xdc, 0xe0, 0xb3, 0xfb, 0x60, 0x14,
- 0x5b, 0xf9, 0xd9, 0x48, 0xe2, 0xaf, 0xe9, 0xc4, 0xfc, 0x95, 0x94, 0xfc,
- 0x6d, 0x1a, 0x5b, 0xfb, 0x8c, 0xe9, 0xb8, 0x46, 0xac, 0x9f, 0x5e, 0x92,
- 0xa3, 0x0c, 0x61, 0xe3, 0x50, 0x2e, 0x14, 0xdd, 0xe3, 0xe5, 0x42, 0xf3,
- 0xe8, 0xec, 0x38, 0x9d, 0x7c, 0xbc, 0x4b, 0x2b, 0xb3, 0xff, 0x8d, 0xfe,
- 0x64, 0x36, 0x6d, 0x3e, 0xce, 0x67, 0x79, 0x73, 0xcf, 0xf7, 0x48, 0x77,
- 0x14, 0x1c, 0x80, 0xa0, 0x29, 0x34, 0x27, 0xe9, 0xda, 0x28, 0xeb, 0xa4,
- 0x8f, 0x92, 0x09, 0x63, 0x0e, 0x86, 0x68, 0x35, 0xe2, 0x71, 0x34, 0x27,
- 0xc4, 0x2a, 0x3d, 0xf6, 0xdb, 0x9d, 0xe6, 0xe0, 0xc6, 0xa0, 0x93, 0x84,
- 0x6e, 0xba, 0xdd, 0xab, 0x82, 0xd0, 0x17, 0x53, 0xba, 0x81, 0x92, 0xfa,
- 0xde, 0xdc, 0xfb, 0xf3, 0x24, 0xa2, 0x34, 0x22, 0x62, 0x9e, 0x7c, 0x9b,
- 0xdd, 0x4f, 0x6e, 0x48, 0xe0, 0x59, 0x59, 0xc9, 0xae, 0xa9, 0x8c, 0x4c,
- 0x29, 0xd6, 0x4e, 0x73, 0xf5, 0x56, 0x65, 0xe2, 0x70, 0xe4, 0x3b, 0xa5,
- 0x3b, 0xd8, 0x2b, 0x79, 0x5f, 0x35, 0x73, 0x6a, 0x62, 0xb3, 0x6e, 0x09,
- 0x65, 0x7c, 0x29, 0xb6, 0x15, 0x83, 0x2b, 0x14, 0x36, 0x3d, 0x47, 0x16,
- 0xc9, 0x71, 0x59, 0xf3, 0xde, 0x9b, 0xa5, 0x75, 0x03, 0xeb, 0x02, 0xe3,
- 0x16, 0xd3, 0xb9, 0x7d, 0x9b, 0x40, 0x8e, 0xbc, 0x34, 0x07, 0xed, 0x9f,
- 0xbf, 0x42, 0xf8, 0xb8, 0xe2, 0x78, 0x86, 0x52, 0x55, 0xe6, 0xaa, 0x75,
- 0x95, 0xbc, 0xd5, 0x3b, 0x83, 0x3a, 0x61, 0xcd, 0xfb, 0x05, 0x47, 0x8c,
- 0x58, 0xd1, 0x61, 0x3f, 0x45, 0xa8, 0xb8, 0x92, 0xad, 0x29, 0xe6, 0xec,
- 0x41, 0x2f, 0xd9, 0xca, 0x86, 0xd7, 0xa6, 0xbd, 0x1e, 0xb5, 0xb3, 0x77,
- 0x40, 0xff, 0xdd, 0xc7, 0x7f, 0x9f, 0xf4, 0x14, 0x6e, 0xe1, 0x2f, 0x35,
- 0xdd, 0x37, 0x5d, 0x69, 0x29, 0x0e, 0x59, 0xba, 0x7f, 0xe4, 0x02, 0x12,
- 0x01, 0x4c, 0x72, 0x39, 0x7e, 0x38, 0x58, 0xcf, 0x3a, 0xed, 0x47, 0x74,
- 0x21, 0x37, 0x11, 0xb8, 0xdb, 0x10, 0xd0, 0x1b, 0x93, 0x5f, 0xc4, 0x8c,
- 0x6d, 0x62, 0x74, 0x19, 0x98, 0xa8, 0x1c, 0xde, 0xa0, 0xe9, 0x98, 0x7c,
- 0xa8, 0xb2, 0x9b, 0xb4, 0x36, 0x6a, 0xd5, 0xb2, 0xc1, 0xe9, 0xe8, 0xda,
- 0x10, 0xe6, 0x48, 0xcd, 0xe0, 0x91, 0xc7, 0x88, 0xe5, 0xc3, 0x43, 0x6b,
- 0xaa, 0xc8, 0x2a, 0xd2, 0xfc, 0x19, 0x81, 0x6c, 0x2c, 0x74, 0x79, 0x62,
- 0x20, 0xf8, 0x87, 0xd8, 0xc5, 0x65, 0x56, 0x13, 0x10, 0x0a, 0x7a, 0xcc,
- 0x0f, 0x65, 0xcc, 0x49, 0xef, 0x21, 0x70, 0x86, 0x39, 0x82, 0x57, 0x66,
- 0xc6, 0xc8, 0x06, 0x99, 0x61, 0xdd, 0xc8, 0xda, 0x42, 0xaf, 0x03, 0x5d,
- 0x48, 0x74, 0x92, 0xfc, 0x4a, 0x5c, 0x03, 0xf2, 0x6f, 0x48, 0x7c, 0xd1,
- 0x0f, 0x6a, 0x0e, 0x77, 0x74, 0x95, 0x83, 0x87, 0xb7, 0xb6, 0x1e, 0x60,
- 0x7b, 0x17, 0xcb, 0x60, 0xd9, 0x19, 0xa7, 0xfb, 0x5a, 0x74, 0xe3, 0x98,
- 0xc9, 0x6d, 0x7a, 0xc5, 0x9e, 0xe7, 0x5f, 0x7f, 0x48, 0x4c, 0x8f, 0x07,
- 0x75, 0x93, 0x36, 0xcb, 0xfa, 0x11, 0x67, 0xc4, 0x13, 0x0a, 0xfc, 0x8e,
- 0xf5, 0x44, 0x70, 0x58, 0xc7, 0x9f, 0x80, 0xee, 0x2e, 0x54, 0x50, 0x04,
- 0xae, 0x32, 0xef, 0x64, 0x8d, 0xb8, 0xa1, 0x0b, 0x31, 0xea, 0xb7, 0xd2,
- 0x8f, 0xe9, 0x30, 0x39, 0x3b, 0x1a, 0x9d, 0xd3, 0x27, 0xcc, 0xd6, 0x28,
- 0xae, 0x4d, 0x2f, 0x4e, 0x47, 0x9d, 0xe6, 0x8c, 0xad, 0x9e, 0x15, 0x75,
- 0x0b, 0x30, 0xb4, 0x72, 0x9a, 0xd5, 0x43, 0xa5, 0xf1, 0x55, 0xe9, 0xac,
- 0xb1, 0x4d, 0x11, 0x18, 0x21, 0x3f, 0x3f, 0x05, 0xe1, 0x12, 0x3e, 0x6a,
- 0xc1, 0x87, 0x16, 0x66, 0xc3, 0x4f, 0xb7, 0xad, 0x73, 0xa1, 0xaf, 0x7b,
- 0xc1, 0x7a, 0x8c, 0xeb, 0xe5, 0x35, 0xe9, 0xcb, 0xb5, 0x5a, 0x39, 0xf6,
- 0x0b, 0x66, 0x36, 0x82, 0x0b, 0x5e, 0x87, 0x6d, 0xce, 0x04, 0x1f, 0x1b,
- 0xa3, 0xe0, 0x53, 0x28, 0x1d, 0x97, 0x78, 0x51, 0xba, 0x56, 0x49, 0xa7,
- 0x07, 0x92, 0x87, 0xee, 0x64, 0x73, 0xe4, 0x32, 0xa3, 0x24, 0x4d, 0x23,
- 0x97, 0x14, 0x2f, 0x8a, 0xaa, 0xf8, 0x57, 0x82, 0xde, 0x89, 0x78, 0x2c,
- 0xd0, 0xd0, 0x84, 0x95, 0x08, 0xda, 0xf5, 0x70, 0x82, 0xe5, 0xe4, 0x38,
- 0x24, 0x95, 0x8e, 0x8d, 0x4b, 0x6a, 0xcf, 0x9e, 0xfd, 0xaf, 0x8b, 0xa5,
- 0x99, 0xf8, 0xc8, 0x6d, 0x41, 0xd7, 0x3e, 0xdd, 0x7d, 0x34, 0x81, 0xc1,
- 0xb7, 0x0e, 0xe1, 0xf7, 0x32, 0x6d, 0x7d, 0x36, 0x7c, 0xba, 0x37, 0xdc,
- 0x0d, 0x36, 0x9b, 0x51, 0x51, 0xb3, 0xe4, 0x25, 0xfd, 0xf7, 0x41, 0xa9,
- 0x8c, 0xd8, 0xa5, 0x2f, 0x85, 0xf1, 0xae, 0x44, 0x4b, 0x58, 0x8e, 0xae,
- 0xd9, 0x71, 0x08, 0x8b, 0x0e, 0x49, 0xec, 0xf5, 0x93, 0xd7, 0xc7, 0x17,
- 0x58, 0xfe, 0xe3, 0x77, 0x5f, 0xc3, 0x69, 0x69, 0x55, 0xdb, 0x29, 0xda,
- 0xac, 0xd9, 0xea, 0xe5, 0xd8, 0x80, 0x88, 0xff, 0xee, 0x54, 0x93, 0xf8,
- 0x24, 0x5f, 0x33, 0xe2, 0xc6, 0xd3, 0xdf, 0xef, 0xe2, 0x0a, 0xac, 0xa5,
- 0xe3, 0xbe, 0x4c, 0x9d, 0xf8, 0x10, 0x3e, 0x66, 0xf7, 0xee, 0x6f, 0x98,
- 0x4e, 0x6f, 0x8e, 0xdd, 0xc3, 0x2f, 0xbd, 0x99, 0xf9, 0xf1, 0x80, 0x62,
- 0xd3, 0x46, 0x7d, 0x9a, 0xfe, 0xfc, 0xeb, 0xae, 0x42, 0x71, 0xd8, 0x24,
- 0xed, 0x3b, 0x31, 0xe2, 0x17, 0x80, 0x4b, 0x46, 0xa3, 0xc0, 0x1c, 0xf4,
- 0x61, 0xc1, 0x2e, 0xd8, 0x44, 0x82, 0x2d, 0xd2, 0x4e, 0x4f, 0x0b, 0x56,
- 0x88, 0x48, 0x44, 0x73, 0xe8, 0x1f, 0x50, 0x80, 0xee, 0x71, 0x99, 0x94,
- 0xb3, 0xe0, 0x92, 0x6b, 0xd9, 0x54, 0x50, 0x35, 0xf7, 0xe5, 0x5a, 0x83,
- 0x9d, 0x21, 0x97, 0x0f, 0xab, 0x77, 0xdd, 0x73, 0x60, 0x95, 0x3d, 0xa0,
- 0x6a, 0xfc, 0x2b, 0x31, 0xf1, 0x5e, 0x46, 0xf0, 0x04, 0xdd, 0x63, 0x4d,
- 0x6d, 0x28, 0xcb, 0x9b, 0x45, 0x35, 0x53, 0xb3, 0xba, 0x3a, 0xbb, 0x66,
- 0xd9, 0xc9, 0x29, 0xe2, 0xf6, 0x10, 0x3b, 0xa6, 0x79, 0x99, 0x8d, 0x7c,
- 0xab, 0x72, 0x51, 0x1d, 0x19, 0x8c, 0xd4, 0x3d, 0xcc, 0x1a, 0x6d, 0x12,
- 0xa7, 0x89, 0x18, 0xf6, 0xd8, 0x56, 0xba, 0xaf, 0x78, 0xfb, 0x91, 0x91,
- 0xd4, 0xf3, 0xa6, 0xa4, 0x17, 0x5b, 0x8a, 0x86, 0x5d, 0xea, 0x72, 0x5e,
- 0xf2, 0x5b, 0x9a, 0x3a, 0xdd, 0x3b, 0xce, 0x07, 0xd7, 0xd6, 0xc9, 0xca,
- 0x82, 0xfe, 0x2c, 0xc8, 0x77, 0xf3, 0x6f, 0x91, 0x0d, 0x19, 0xdd, 0x8b,
- 0xe4, 0xc6, 0x95, 0x70, 0x03, 0x34, 0x17, 0x82, 0xbf, 0x08, 0x24, 0x30,
- 0xa2, 0xa5, 0xc7, 0x6c, 0x0d, 0xd5, 0x3a, 0xd4, 0xa4, 0xf0, 0xec, 0x8c,
- 0x40, 0x0d, 0xef, 0x6e, 0x10, 0x23, 0xbf, 0x1b, 0x0a, 0x26, 0xf2, 0xde,
- 0x25, 0x37, 0x61, 0x3e, 0xf9, 0x08, 0xcc, 0x88, 0x5c, 0x4d, 0x2d, 0xf9,
- 0x21, 0x88, 0x0d, 0xc6, 0x1a, 0x45, 0x96, 0x00, 0x66, 0x0e, 0xf9, 0x2f,
- 0x69, 0x4f, 0xd2, 0xb5, 0x9c, 0x17, 0xac, 0xac, 0xad, 0x34, 0x80, 0x4d,
- 0x5f, 0x3f, 0xbc, 0x3e, 0xb9, 0x48, 0xb6, 0xcc, 0xaa, 0x8e, 0xbb, 0xca,
- 0x8d, 0xde, 0xeb, 0x3b, 0x59, 0x33, 0xd9, 0x59, 0x7c, 0xcc, 0x77, 0x8c,
- 0x1d, 0x34, 0x1d, 0x6f, 0x5b, 0xed, 0x1e, 0x9f, 0xc3, 0x26, 0x54, 0x9b,
- 0x49, 0x8d, 0x26, 0x58, 0x4d, 0xdd, 0xd3, 0xe0, 0x59, 0x51, 0x0c, 0x37,
- 0x76, 0xc6, 0x13, 0xa6, 0x89, 0x5d, 0x0c, 0x80, 0x3a, 0x90, 0xfb, 0x62,
- 0x4c, 0xc1, 0xaf, 0x74, 0x9a, 0xb1, 0x0b, 0xd5, 0x98, 0x7f, 0xdd, 0xb3,
- 0xca, 0xb8, 0x17, 0xf1, 0x31, 0xb0, 0x6f, 0x41, 0xc1, 0x1a, 0x72, 0x4f,
- 0x38, 0x6d, 0xaf, 0x4f, 0x30, 0x1b, 0x9a, 0x94, 0x05, 0xdd, 0x45, 0x53,
- 0x72, 0x55, 0x75, 0x9b, 0x83, 0xf3, 0xac, 0x37, 0xdc, 0xe9, 0x25, 0x16,
- 0x58, 0x64, 0x66, 0x19, 0xd8, 0x38, 0x87, 0xe4, 0x32, 0x5b, 0xec, 0x6a,
- 0x59, 0xb3, 0xfb, 0x95, 0xec, 0x7d, 0xbb, 0x5e, 0xc3, 0x98, 0x40, 0xf5,
- 0x96, 0xd3, 0x2a, 0x5b, 0x46, 0x29, 0xc6, 0xb9, 0xb2, 0x86, 0xe4, 0xd8,
- 0x76, 0x0a, 0x4b, 0xd5, 0xfb, 0xc9, 0x74, 0xa0, 0x2e, 0xa3, 0x4e, 0xb2,
- 0xdc, 0x05, 0x8f, 0xbd, 0x2b, 0xc0, 0x5c, 0xc5, 0xf6, 0x04, 0x4f, 0xb3,
- 0x59, 0x3e, 0xcf, 0x1b, 0xe8, 0xf0, 0x5e, 0x17, 0x82, 0xa5, 0x68, 0x77,
- 0xe9, 0xa7, 0xb0, 0x4b, 0x0a, 0xf6, 0x4a, 0xe9, 0xd7, 0xa6, 0x4b, 0x70,
- 0xd6, 0x30, 0x16, 0x27, 0x6e, 0xce, 0xb5, 0x3b, 0x64, 0xe1, 0x62, 0x0e,
- 0xb3, 0xf6, 0x2f, 0xb2, 0x78, 0xdb, 0x47, 0xa6, 0x6e, 0x00, 0x4a, 0xa1,
- 0x73, 0x26, 0x4e, 0x8c, 0x31, 0x5f, 0x0e, 0x7a, 0xc6, 0x52, 0x7d, 0x3c,
- 0x90, 0xdd, 0xe6, 0xf5, 0x1d, 0x15, 0x3c, 0x90, 0x3c, 0xea, 0xfe, 0x60,
- 0x33, 0xd4, 0x1c, 0x18, 0x98, 0x9d, 0x1f, 0xc5, 0xea, 0x84, 0x06, 0x04,
- 0x61, 0xc5, 0xee, 0x9f, 0xae, 0xbe, 0xab, 0xc2, 0x7e, 0x90, 0x15, 0x93,
- 0x72, 0xda, 0xb1, 0xcf, 0x68, 0x12, 0x3c, 0x21, 0x87, 0x1d, 0xcf, 0x91,
- 0x14, 0xec, 0xf2, 0xb8, 0x63, 0x8d, 0x3c, 0x3a, 0xec, 0xed, 0xfb, 0x45,
- 0xfb, 0x3e, 0x66, 0xde, 0x63, 0xdb, 0xff, 0xaa, 0x5d, 0xff, 0x2f, 0xd3,
- 0x23, 0x3c, 0xf5, 0xeb, 0x11, 0x8a, 0xc4, 0x60, 0x92, 0x2f, 0x6e, 0xc8,
- 0xfb, 0xfe, 0x12, 0x71, 0x52, 0x72, 0x91, 0xf1, 0x0f, 0xe2, 0x0a, 0xc4,
- 0x48, 0xae, 0xbc, 0x5a, 0xfc, 0x04, 0xfa, 0xb6, 0x88, 0x97, 0x5c, 0xc1,
- 0xb7, 0x6a, 0x8c, 0x49, 0x6c, 0x3e, 0x0f, 0xac, 0x55, 0x0a, 0x49, 0xe8,
- 0xcb, 0x7c, 0xd3, 0xbb, 0x60, 0x36, 0xab, 0xe9, 0xf2, 0xdb, 0xa1, 0x31,
- 0x19, 0xd2, 0x29, 0xa1, 0x61, 0xcc, 0x34, 0x01, 0xbc, 0x8f, 0x9f, 0x77,
- 0x9a, 0x43, 0xe7, 0x05, 0xd4, 0xce, 0xb7, 0xae, 0x99, 0xd1, 0xf7, 0x17,
- 0xa7, 0x07, 0xdd, 0x79, 0x02, 0xa6, 0xb2, 0x3e, 0xd8, 0xd9, 0xb9, 0xbb,
- 0xbb, 0x1b, 0x96, 0xe6, 0xfe, 0xaa, 0xeb, 0xd9, 0xb0, 0xac, 0xae, 0x77,
- 0xa6, 0xe5, 0xa4, 0xde, 0x49, 0x17, 0x8b, 0x7a, 0x47, 0x3f, 0xdc, 0x42,
- 0x1e, 0x7b, 0x17, 0x87, 0x76, 0x9b, 0x14, 0x4c, 0x44, 0x2e, 0xad, 0x27,
- 0x7e, 0x76, 0xcf, 0x36, 0xa6, 0xa8, 0xd6, 0x62, 0x7d, 0xb3, 0x7e, 0xcd,
- 0x6e, 0xe7, 0xae, 0xe3, 0x8e, 0x60, 0xb1, 0x89, 0xce, 0xbc, 0xdf, 0x78,
- 0x6e, 0xdd, 0x39, 0xe6, 0xa7, 0x47, 0xf8, 0xe1, 0x68, 0x49, 0x41, 0x55,
- 0xf3, 0x19, 0xf2, 0x1d, 0x36, 0x31, 0x17, 0xda, 0xda, 0x01, 0x5f, 0xe7,
- 0xcd, 0xf0, 0x2a, 0x9b, 0x96, 0x55, 0x1a, 0xc4, 0x4d, 0x4b, 0x42, 0x81,
- 0x63, 0x16, 0x26, 0xe6, 0xa9, 0x1d, 0x73, 0x37, 0x7d, 0x30, 0xf3, 0x32,
- 0xa4, 0xbf, 0x2f, 0x66, 0xe6, 0xc8, 0xf2, 0xe4, 0xe8, 0x8f, 0x69, 0x5e,
- 0xfe, 0xc0, 0x5e, 0x49, 0x63, 0xab, 0xd4, 0xbf, 0xa7, 0x6b, 0xa7, 0x9c,
- 0x2f, 0x2a, 0xf8, 0x1a, 0xe2, 0x71, 0x1f, 0x35, 0x26, 0x81, 0x4c, 0x96,
- 0x27, 0x9d, 0x65, 0xd5, 0x4d, 0xbc, 0x31, 0xe7, 0xe3, 0xba, 0xac, 0xcc,
- 0xb9, 0x9c, 0xd7, 0x31, 0x6f, 0x82, 0x38, 0xfd, 0x6a, 0x04, 0x5b, 0x93,
- 0x9a, 0xfc, 0x1d, 0xec, 0xda, 0x58, 0x16, 0x5e, 0xeb, 0x66, 0xc5, 0x27,
- 0xcb, 0x39, 0xd2, 0x20, 0x34, 0x82, 0xb6, 0xca, 0x93, 0xe9, 0xc5, 0x8e,
- 0x2d, 0x8a, 0xae, 0x6b, 0x93, 0x2e, 0x0b, 0xe7, 0x6b, 0x84, 0xbc, 0x33,
- 0x5d, 0xee, 0xc7, 0x7a, 0x87, 0x29, 0xaa, 0x32, 0x7a, 0x14, 0x77, 0x46,
- 0x55, 0x95, 0xde, 0x45, 0x31, 0xf8, 0x16, 0x0a, 0x9b, 0x91, 0x3e, 0xf9,
- 0x75, 0xf2, 0x92, 0x64, 0x5d, 0xf7, 0xf8, 0x8e, 0xe4, 0x70, 0xc9, 0xb1,
- 0xe5, 0x27, 0x35, 0x60, 0x52, 0xd1, 0x09, 0xe3, 0xd0, 0x62, 0x75, 0x8d,
- 0xd1, 0x71, 0x38, 0x98, 0x4f, 0x6f, 0x0b, 0xb0, 0x69, 0x81, 0x96, 0xd7,
- 0x2a, 0x53, 0x01, 0xcc, 0x69, 0x08, 0xb7, 0x22, 0x41, 0x47, 0xfb, 0x0d,
- 0x1f, 0x6b, 0x69, 0xdb, 0x65, 0x0f, 0x59, 0x57, 0xa7, 0x30, 0xcb, 0x62,
- 0xf4, 0x51, 0x79, 0x13, 0x17, 0x94, 0xbf, 0x27, 0x90, 0x5e, 0x81, 0x35,
- 0xbc, 0x67, 0x00, 0x85, 0x3e, 0x0f, 0x78, 0x67, 0xa8, 0xde, 0x99, 0x6b,
- 0x74, 0x69, 0xb6, 0x5a, 0x2b, 0x07, 0xa0, 0xbb, 0x4d, 0x2d, 0xc6, 0x4a,
- 0xf4, 0xe4, 0x1c, 0x59, 0x27, 0x29, 0xc0, 0x5b, 0xb5, 0xb5, 0x3d, 0x3c,
- 0xec, 0x7f, 0xe1, 0x63, 0x31, 0xa2, 0x13, 0x82, 0xf1, 0xd3, 0xc7, 0xfa,
- 0x16, 0x39, 0x0a, 0x4d, 0xc5, 0x8c, 0xaa, 0xc9, 0x00, 0x2e, 0xea, 0xc3,
- 0xd4, 0xa1, 0xec, 0xa4, 0x84, 0xbd, 0xe0, 0xe4, 0xa2, 0xfa, 0x9b, 0xe9,
- 0x6b, 0x1d, 0x84, 0xdc, 0xaf, 0x8d, 0xec, 0x4c, 0x4e, 0x4b, 0x06, 0x8a,
- 0x3a, 0x50, 0x0c, 0x4f, 0xa0, 0x5a, 0x24, 0x33, 0x68, 0x7f, 0x1c, 0x57,
- 0x71, 0xb2, 0xd7, 0xf4, 0x25, 0xe8, 0x9d, 0xd8, 0x67, 0xa5, 0xe0, 0xf1,
- 0xf3, 0x22, 0x47, 0xa6, 0x83, 0xe0, 0xf0, 0x19, 0x4f, 0xa6, 0xbe, 0xa6,
- 0xba, 0xec, 0x8b, 0x53, 0x8f, 0xfa, 0x4a, 0x5d, 0xed, 0x3a, 0x4b, 0xd0,
- 0x65, 0x1f, 0x66, 0x2f, 0x48, 0x06, 0x6f, 0xbd, 0x2c, 0x3c, 0xab, 0x7e,
- 0xd0, 0xc9, 0xed, 0x26, 0x99, 0xe1, 0x62, 0x5d, 0x9c, 0x1b, 0x00, 0x1d,
- 0xc0, 0xcd, 0xe8, 0x47, 0xc8, 0x83, 0xf2, 0x50, 0xef, 0x6c, 0xe7, 0x2c,
- 0xa2, 0xcb, 0xeb, 0x83, 0x22, 0xbb, 0xec, 0x92, 0xc7, 0x2f, 0xe8, 0xcc,
- 0x3d, 0x00, 0x13, 0xab, 0xb4, 0xb1, 0x42, 0x7f, 0x4d, 0xdb, 0xcf, 0xc9,
- 0xd6, 0xe9, 0x76, 0xaa, 0x98, 0xcc, 0x4a, 0x45, 0xc4, 0x99, 0xf7, 0x39,
- 0xf3, 0xc1, 0x2c, 0xf1, 0xf7, 0x62, 0xa4, 0xc8, 0x4a, 0xc8, 0x2f, 0xfa,
- 0xb2, 0x39, 0xae, 0x4a, 0x72, 0x86, 0x86, 0x0e, 0x4b, 0xd1, 0x19, 0xbb,
- 0x89, 0x3b, 0xce, 0x54, 0x38, 0x48, 0x92, 0x9f, 0x7e, 0xea, 0x27, 0xa4,
- 0xb0, 0xfe, 0x64, 0xcc, 0xe0, 0x9f, 0xcc, 0x96, 0xfb, 0x89, 0x81, 0xa2,
- 0x3f, 0xdd, 0x0e, 0x93, 0x6e, 0x78, 0x8b, 0xbc, 0x3c, 0xf5, 0x8c, 0xdc,
- 0xb7, 0xac, 0xfe, 0xb4, 0xad, 0x63, 0xce, 0x4a, 0xc1, 0x95, 0xc4, 0x3e,
- 0x4a, 0x1f, 0x3c, 0x00, 0xcc, 0x4e, 0x68, 0xce, 0x2f, 0xe7, 0x85, 0x68,
- 0x8d, 0x2c, 0x6a, 0x20, 0x05, 0x20, 0x2a, 0x36, 0xff, 0xb0, 0xe9, 0xd6,
- 0xa6, 0xaf, 0x2e, 0xb6, 0x46, 0x85, 0x34, 0x3d, 0x18, 0x58, 0x1c, 0x2c,
- 0x0a, 0x34, 0x87, 0x03, 0xc1, 0x43, 0x86, 0xb2, 0x18, 0x31, 0x7c, 0x46,
- 0xfe, 0x2d, 0x46, 0xe2, 0x96, 0x16, 0x1a, 0x05, 0x40, 0xf2, 0xe2, 0xe6,
- 0xbe, 0xa6, 0xf8, 0x5e, 0xa0, 0x2b, 0x14, 0x59, 0xfb, 0xb4, 0xc4, 0x83,
- 0xa3, 0x2a, 0x32, 0x75, 0x9c, 0xb3, 0x0c, 0xba, 0x30, 0xed, 0x82, 0x96,
- 0xbc, 0x35, 0xdd, 0xd9, 0x1c, 0x6c, 0x5a, 0x6f, 0xb4, 0xc4, 0x54, 0xd3,
- 0x69, 0xc4, 0x87, 0xe7, 0x8c, 0x2f, 0x00, 0x56, 0x82, 0x4f, 0x7a, 0x20,
- 0x8a, 0xd2, 0x87, 0xc8, 0xb8, 0xfc, 0x22, 0x4a, 0x10, 0xd0, 0x38, 0x8f,
- 0x7c, 0x5f, 0x20, 0xb7, 0x11, 0xcb, 0x0f, 0x50, 0x1a, 0xc4, 0xe0, 0xac,
- 0x6e, 0x45, 0x66, 0x89, 0x73, 0xd0, 0x0e, 0x06, 0xc8, 0xbe, 0x5c, 0x70,
- 0xc6, 0x24, 0xed, 0x0e, 0xc4, 0xa6, 0xee, 0x09, 0x8e, 0xbb, 0x08, 0xf0,
- 0x0c, 0x0a, 0x1f, 0xd1, 0x7c, 0x17, 0x3a, 0xcb, 0x94, 0xa6, 0x77, 0x57,
- 0x48, 0x9a, 0xd5, 0xa8, 0x84, 0x79, 0x34, 0x41, 0x94, 0x4b, 0x42, 0xaa,
- 0x02, 0xec, 0x8d, 0xa8, 0xe6, 0x74, 0x73, 0x06, 0xea, 0x0a, 0xf5, 0xe7,
- 0x55, 0xd2, 0x53, 0xa5, 0x05, 0x01, 0xd2, 0x9b, 0xf4, 0xd3, 0xa7, 0x61,
- 0x9d, 0xb1, 0x16, 0xd2, 0xeb, 0xbe, 0x01, 0xd4, 0x8c, 0xf3, 0x35, 0x48,
- 0xca, 0x12, 0x3a, 0x92, 0xce, 0xee, 0x08, 0x13, 0xbe, 0x25, 0xe8, 0x8b,
- 0xc1, 0xdf, 0x18, 0x5a, 0x05, 0x74, 0xa2, 0x2a, 0x26, 0xdb, 0xdd, 0xbd,
- 0x4b, 0x48, 0x33, 0x4e, 0x87, 0x70, 0x01, 0x79, 0xff, 0xbe, 0xb4, 0x20,
- 0xb8, 0x5a, 0xec, 0xcc, 0x2b, 0x3a, 0xa6, 0x4b, 0x42, 0x30, 0x45, 0x34,
- 0x3c, 0x6d, 0xa1, 0xb5, 0x58, 0xe8, 0x28, 0x3e, 0x24, 0x7e, 0x22, 0x59,
- 0x51, 0x7b, 0xda, 0x8d, 0x31, 0x82, 0x5c, 0xc6, 0xbc, 0x88, 0xcc, 0x19,
- 0x1b, 0x1d, 0xc1, 0xcc, 0xed, 0x6d, 0x8b, 0x73, 0x04, 0xc9, 0x89, 0x80,
- 0xf9, 0x89, 0x07, 0xa8, 0x77, 0x53, 0x72, 0x20, 0xba, 0x77, 0x40, 0xb0,
- 0x6a, 0x46, 0xd9, 0xe9, 0x40, 0x35, 0x1e, 0xdb, 0xed, 0x38, 0x22, 0xfd,
- 0xdf, 0x9c, 0xbd, 0x3d, 0x6e, 0x23, 0xba, 0xf0, 0x93, 0x98, 0x87, 0xc4,
- 0xc8, 0xb2, 0x37, 0x46, 0xf6, 0xf0, 0xfe, 0x48, 0x03, 0xa3, 0xd3, 0xcc,
- 0x14, 0xa6, 0xec, 0x3a, 0x6b, 0x16, 0x77, 0xcb, 0x7c, 0xba, 0xb5, 0x4d,
- 0xdb, 0xe7, 0x7d, 0x91, 0x7f, 0x1a, 0x00, 0xdf, 0xca, 0xc6, 0xa2, 0x59,
- 0x2b, 0x56, 0x01, 0xaa, 0xac, 0x59, 0x56, 0x05, 0x3b, 0xb5, 0x12, 0xea,
- 0x7e, 0x18, 0x9d, 0x4a, 0xe4, 0xde, 0xf3, 0xcd, 0x39, 0x49, 0x33, 0xe6,
- 0x18, 0x38, 0x37, 0xb9, 0x4d, 0x12, 0xc2, 0x48, 0x59, 0x40, 0x01, 0xb0,
- 0x2b, 0x68, 0x2c, 0xab, 0x17, 0x9d, 0x9a, 0x3b, 0x3c, 0x3f, 0x7f, 0x7d,
- 0x78, 0x79, 0x68, 0xc7, 0x06, 0x93, 0x15, 0x52, 0x07, 0x2a, 0xab, 0x11,
- 0x57, 0xa4, 0x86, 0xd1, 0x93, 0x9b, 0x7f, 0x7c, 0x3f, 0x3a, 0xbe, 0xe8,
- 0x2a, 0x03, 0xe7, 0x17, 0x67, 0x94, 0xc2, 0xfd, 0xc7, 0x9f, 0x0e, 0x29,
- 0xe8, 0x25, 0x2e, 0xfb, 0xd7, 0x69, 0x93, 0x6e, 0x06, 0x27, 0x7e, 0x7f,
- 0x3b, 0xa1, 0xfe, 0x29, 0x56, 0x41, 0xa3, 0x0e, 0x55, 0xc6, 0xfe, 0x8b,
- 0xe4, 0x03, 0xad, 0x69, 0x35, 0xb1, 0xba, 0x15, 0x7d, 0x54, 0x97, 0xb3,
- 0x1f, 0x3a, 0x67, 0xbc, 0x81, 0x94, 0x4e, 0xca, 0x29, 0x10, 0x41, 0xe7,
- 0x6a, 0x96, 0x64, 0x9f, 0xb2, 0xc9, 0xb2, 0xd1, 0x73, 0x80, 0xdd, 0x46,
- 0x49, 0x36, 0xdd, 0x79, 0x71, 0xeb, 0xa3, 0x0b, 0xc4, 0x10, 0x30, 0x4e,
- 0x76, 0x86, 0x8c, 0x40, 0x96, 0x97, 0xd9, 0x6d, 0x00, 0xdd, 0x0d, 0xb5,
- 0xb7, 0x62, 0x67, 0x07, 0x87, 0x81, 0x7d, 0x9f, 0xc8, 0xf9, 0xe2, 0x2e,
- 0x05, 0x13, 0xf2, 0x07, 0x73, 0x44, 0x07, 0xc9, 0xb1, 0x40, 0x9d, 0x31,
- 0x6c, 0xf3, 0x83, 0xe0, 0x21, 0xcd, 0x02, 0xb2, 0x17, 0x41, 0x5c, 0x8e,
- 0x78, 0x79, 0x90, 0xbd, 0xae, 0x96, 0xce, 0x49, 0x0b, 0xe6, 0x21, 0xea,
- 0x34, 0x4d, 0x39, 0x2c, 0x9b, 0x5e, 0x24, 0x64, 0x3e, 0x48, 0xaf, 0x69,
- 0x77, 0x99, 0x47, 0x8d, 0xb6, 0x6e, 0xac, 0x18, 0xfa, 0xd7, 0xce, 0xde,
- 0x70, 0xb7, 0x17, 0x76, 0x9e, 0x0e, 0x0b, 0xd2, 0x4a, 0xad, 0xeb, 0x9b,
- 0x24, 0x65, 0x53, 0x96, 0x0f, 0xf6, 0x4f, 0x8c, 0xac, 0xb4, 0x58, 0x98,
- 0xf6, 0xa3, 0x5d, 0x19, 0x9c, 0x05, 0x78, 0x35, 0xb2, 0x3b, 0x2b, 0x15,
- 0x98, 0x46, 0x5e, 0x16, 0xe5, 0x1d, 0x8d, 0xc4, 0x6c, 0xb5, 0xd9, 0xac,
- 0x95, 0xff, 0xdb, 0x8b, 0x4f, 0x73, 0x81, 0x54, 0xfb, 0xac, 0x3b, 0xdb,
- 0xb1, 0xb8, 0x92, 0x5c, 0xac, 0x1e, 0x80, 0xdd, 0x01, 0xa6, 0x60, 0xd4,
- 0xd9, 0x5d, 0xe0, 0x7e, 0xbe, 0x5a, 0x1b, 0xad, 0xdb, 0x76, 0x1e, 0xfc,
- 0x05, 0x03, 0x6a, 0x86, 0x34, 0xd4, 0x97, 0x9c, 0x4a, 0x14, 0xf8, 0x20,
- 0xde, 0xa6, 0x9f, 0xf2, 0xf9, 0x72, 0x9e, 0xe0, 0x7b, 0x1c, 0xed, 0x96,
- 0x27, 0xd5, 0xf1, 0x47, 0xae, 0x20, 0x8e, 0x1f, 0xd3, 0xa2, 0x6e, 0xd6,
- 0x9e, 0x2b, 0x22, 0x72, 0x01, 0x99, 0xeb, 0x5a, 0x61, 0x7e, 0x02, 0x15,
- 0x9f, 0xe7, 0x4d, 0xdd, 0x71, 0x61, 0x18, 0x35, 0x22, 0xa5, 0x70, 0xa0,
- 0xe6, 0x0c, 0xf1, 0x4d, 0x13, 0x31, 0x01, 0x38, 0x97, 0x4d, 0x15, 0x3c,
- 0x0f, 0xf0, 0x94, 0x55, 0x79, 0x39, 0xb5, 0xc7, 0x86, 0x34, 0xc8, 0xbc,
- 0x58, 0x9a, 0x89, 0xa6, 0xe6, 0xe8, 0xbe, 0x95, 0xdf, 0x04, 0x11, 0x49,
- 0xa0, 0x34, 0x47, 0x00, 0xdf, 0x2a, 0x84, 0xe9, 0xb3, 0xe1, 0x93, 0xfd,
- 0xe1, 0x6e, 0xbf, 0x65, 0x61, 0x4b, 0xca, 0x9f, 0x39, 0x5d, 0x93, 0x7c,
- 0x6e, 0x33, 0x0d, 0x86, 0xff, 0x32, 0x87, 0x13, 0xe5, 0x58, 0x0c, 0xe6,
- 0xe9, 0x27, 0x2c, 0x5f, 0x74, 0x59, 0xcb, 0xe4, 0xe5, 0x37, 0x67, 0xa3,
- 0xcb, 0xbd, 0x83, 0xf3, 0xb3, 0x0b, 0xf3, 0x5f, 0xfa, 0xfb, 0x3e, 0xfe,
- 0xbe, 0xff, 0x45, 0xb7, 0xd9, 0x37, 0xb8, 0x77, 0x15, 0xfa, 0x2d, 0xf9,
- 0x39, 0x3c, 0x8f, 0xf4, 0x1a, 0xde, 0x32, 0xca, 0x36, 0x09, 0x3f, 0x69,
- 0x9e, 0x15, 0x9c, 0xa3, 0xb3, 0x77, 0xef, 0x8e, 0x8f, 0x2e, 0xbb, 0x6b,
- 0x72, 0x79, 0x36, 0xc0, 0x6b, 0xfa, 0x6b, 0xf3, 0x6f, 0xb4, 0xa0, 0xd8,
- 0xd8, 0xa1, 0x8d, 0x9a, 0x7a, 0x46, 0x7b, 0xbd, 0xcc, 0x1b, 0xd1, 0xbc,
- 0xa2, 0xa0, 0x08, 0x9b, 0x22, 0x45, 0x6e, 0x98, 0xd4, 0xe1, 0xbf, 0x95,
- 0xf1, 0x03, 0x48, 0x8e, 0xf6, 0xaf, 0x26, 0x33, 0x63, 0x15, 0x04, 0x5e,
- 0xab, 0xa2, 0x9c, 0xca, 0x36, 0x4e, 0x13, 0x7d, 0x44, 0xf1, 0xe5, 0xc0,
- 0xc4, 0x0e, 0x3b, 0x87, 0x4f, 0x37, 0x6a, 0x1c, 0xf5, 0x67, 0xba, 0x64,
- 0xba, 0x9d, 0xd7, 0x37, 0x82, 0xa3, 0x66, 0x80, 0xbb, 0xef, 0x8c, 0x3b,
- 0x69, 0x38, 0x3b, 0xea, 0xdd, 0xd9, 0x65, 0x92, 0x5e, 0x5d, 0xf1, 0xec,
- 0xdd, 0x08, 0xe2, 0x35, 0xe6, 0xfb, 0xde, 0x81, 0xc3, 0xc1, 0xc6, 0x98,
- 0xf0, 0x5d, 0xba, 0x5c, 0x2e, 0x4f, 0x47, 0x3b, 0xe4, 0xe1, 0x62, 0xd4,
- 0xca, 0xe8, 0xdd, 0x49, 0xbf, 0xe5, 0xa6, 0xa5, 0x58, 0x75, 0x68, 0x21,
- 0xf3, 0x45, 0xb8, 0x4d, 0x97, 0xa9, 0xde, 0xb4, 0xa9, 0x77, 0x41, 0xda,
- 0x24, 0x61, 0x82, 0xc1, 0x50, 0x87, 0x7a, 0xa2, 0x6b, 0xf5, 0xa8, 0x13,
- 0x5d, 0x01, 0x26, 0xd9, 0x46, 0x1c, 0xb1, 0x99, 0x2f, 0x9a, 0x7b, 0x71,
- 0x61, 0xf7, 0x91, 0x38, 0x4b, 0x6a, 0x48, 0x8f, 0x2c, 0x18, 0x6a, 0x07,
- 0x83, 0xe8, 0x51, 0xab, 0x6e, 0x47, 0xc6, 0x7c, 0x60, 0x3d, 0x7c, 0xce,
- 0x7f, 0x08, 0x2f, 0xe2, 0x53, 0xd8, 0xea, 0xd1, 0xcf, 0xe1, 0x7b, 0xdd,
- 0xe6, 0xf0, 0x7d, 0x8d, 0xaf, 0xca, 0x76, 0xd9, 0x24, 0xcd, 0x2d, 0xbf,
- 0x46, 0x32, 0xa2, 0xd7, 0xad, 0x47, 0x0b, 0x5b, 0x1a, 0x8e, 0x15, 0xb4,
- 0xe9, 0x54, 0x7e, 0xa2, 0xa7, 0xa0, 0x5a, 0xce, 0x22, 0x60, 0x14, 0xcf,
- 0x2d, 0x4c, 0x5a, 0xcb, 0xec, 0x56, 0x9c, 0xc2, 0xdf, 0xd0, 0x99, 0xe5,
- 0x7c, 0x89, 0x61, 0x2b, 0x94, 0xff, 0xa2, 0x15, 0xca, 0x3f, 0x12, 0x33,
- 0x07, 0x02, 0x6b, 0x60, 0xf6, 0xc0, 0xcb, 0xf2, 0xea, 0xaa, 0xce, 0x9a,
- 0xae, 0x60, 0x3e, 0x92, 0x47, 0x76, 0x2e, 0x40, 0x95, 0x82, 0xfd, 0xac,
- 0x90, 0xe6, 0xa4, 0x9d, 0x4d, 0x9c, 0x08, 0x76, 0x82, 0xcf, 0x34, 0x37,
- 0x37, 0x8c, 0x80, 0x37, 0xfd, 0xdf, 0x6b, 0x78, 0x93, 0x13, 0x85, 0x34,
- 0x47, 0x15, 0x07, 0x85, 0xd3, 0x4f, 0x45, 0xfa, 0x77, 0xf9, 0x1d, 0xd4,
- 0xbf, 0xf0, 0x31, 0x5f, 0x2c, 0xc8, 0x24, 0x60, 0x62, 0x06, 0xc4, 0x8d,
- 0x6d, 0x24, 0x60, 0x9c, 0x99, 0x15, 0xc1, 0x7e, 0x51, 0x8c, 0x8b, 0xd1,
- 0x1d, 0x27, 0x72, 0x17, 0x8e, 0x33, 0xb3, 0x51, 0xb3, 0x50, 0x95, 0xa5,
- 0xfe, 0x78, 0xd9, 0xb8, 0x22, 0xa6, 0xa6, 0x94, 0x79, 0x5b, 0xa4, 0x7c,
- 0xd4, 0x48, 0xe0, 0xba, 0x14, 0x38, 0x49, 0xb2, 0x88, 0x01, 0xad, 0x1c,
- 0x04, 0xde, 0x3a, 0xac, 0x46, 0x27, 0xff, 0xcf, 0xb1, 0xcb, 0x9d, 0xb6,
- 0xc9, 0xc9, 0x0c, 0x23, 0x8e, 0xc1, 0xb3, 0xcd, 0xd6, 0x1e, 0x1c, 0x99,
- 0xf5, 0xea, 0xa1, 0x2b, 0x2e, 0x4e, 0x5a, 0x76, 0x60, 0xae, 0x30, 0x09,
- 0xe8, 0x86, 0x85, 0x96, 0xb0, 0x83, 0x4c, 0xa8, 0x32, 0x50, 0x2a, 0xb0,
- 0x84, 0xc8, 0x8b, 0x94, 0x31, 0x42, 0x70, 0x34, 0x92, 0x9d, 0xe0, 0x63,
- 0x79, 0x45, 0x89, 0xda, 0xc9, 0x0b, 0x52, 0xa5, 0xf8, 0x62, 0x0f, 0xa0,
- 0xae, 0x9a, 0x6f, 0xc4, 0x69, 0x9a, 0xcb, 0xe6, 0x5f, 0x18, 0x0b, 0xa9,
- 0x68, 0xff, 0x82, 0x7d, 0xc3, 0xdb, 0xd4, 0x13, 0xde, 0xd4, 0xc4, 0xfa,
- 0x33, 0xf8, 0xab, 0xb1, 0x4c, 0x5f, 0xaa, 0x69, 0xff, 0x45, 0xdc, 0xcb,
- 0x6c, 0x1d, 0x01, 0x04, 0x4d, 0x85, 0x75, 0x82, 0xbd, 0x61, 0xd3, 0x6a,
- 0x75, 0xaa, 0xd9, 0x07, 0x91, 0xe2, 0x8a, 0x07, 0xa5, 0x50, 0xd7, 0x2b,
- 0x79, 0x85, 0x5c, 0x5d, 0xf8, 0xaa, 0x67, 0x19, 0x39, 0x32, 0x6c, 0x8e,
- 0xca, 0x90, 0x50, 0xbf, 0x33, 0x6e, 0xa1, 0x66, 0x38, 0x90, 0xb4, 0x21,
- 0x3b, 0x95, 0x0c, 0xed, 0x40, 0xc4, 0x0c, 0xe6, 0xd9, 0x1c, 0x48, 0x45,
- 0x7e, 0xd6, 0x48, 0xa4, 0x92, 0x74, 0xd3, 0xf6, 0xad, 0x89, 0xbe, 0xca,
- 0x99, 0xcb, 0x58, 0xdd, 0xc3, 0x67, 0x43, 0xc4, 0x52, 0x59, 0xb0, 0xab,
- 0xae, 0x28, 0xed, 0xc7, 0xc9, 0xa7, 0xf4, 0xd1, 0xe8, 0x94, 0x45, 0x9f,
- 0x7e, 0x8a, 0x84, 0x1f, 0x2f, 0xfb, 0x43, 0xbc, 0xb0, 0xf1, 0xc8, 0x06,
- 0xcc, 0x5c, 0xfb, 0xac, 0x3a, 0x6c, 0x9d, 0xeb, 0xe1, 0x5d, 0xd6, 0x48,
- 0xdc, 0x93, 0x3b, 0xaf, 0x98, 0x77, 0xe0, 0xe6, 0x4f, 0xae, 0x3a, 0xcd,
- 0x81, 0xe5, 0x22, 0x6b, 0x9c, 0x13, 0x05, 0xae, 0x18, 0xe6, 0xd9, 0xe2,
- 0xd4, 0x7e, 0x72, 0x15, 0xf6, 0xcd, 0x31, 0xe8, 0xf5, 0x45, 0x7f, 0xe3,
- 0x11, 0xc8, 0x46, 0x59, 0xe1, 0x6f, 0x26, 0xd7, 0x4a, 0x33, 0x8d, 0xed,
- 0x49, 0x56, 0x0a, 0xf4, 0x40, 0x0a, 0xe3, 0x89, 0x6c, 0x50, 0xc6, 0x8f,
- 0x53, 0xf4, 0x03, 0x60, 0x03, 0xfb, 0x35, 0x81, 0x91, 0x60, 0xa3, 0x07,
- 0xb7, 0x95, 0xcd, 0xde, 0xa1, 0xf8, 0x6f, 0x35, 0x55, 0x64, 0xbc, 0x76,
- 0xd4, 0x48, 0x61, 0xb1, 0x17, 0xee, 0x52, 0xec, 0x34, 0xdb, 0x3e, 0xc4,
- 0x4d, 0x78, 0xa8, 0xf4, 0x72, 0x19, 0x8c, 0xdd, 0x76, 0xd6, 0xbc, 0xc0,
- 0x15, 0xbe, 0x4c, 0x79, 0x88, 0xf6, 0xbc, 0xb9, 0x58, 0x36, 0x21, 0x59,
- 0x24, 0x83, 0x07, 0x39, 0xba, 0x76, 0x52, 0x78, 0x0a, 0xef, 0x6e, 0xca,
- 0x19, 0x9b, 0x8b, 0x41, 0x7c, 0xc3, 0xa6, 0x56, 0x21, 0xdd, 0x95, 0xc0,
- 0x68, 0xd4, 0x40, 0x76, 0x0b, 0x9c, 0x5b, 0x2b, 0x46, 0x61, 0xd4, 0x9a,
- 0x2c, 0x25, 0x18, 0xb7, 0x20, 0x3d, 0x93, 0xc1, 0x6d, 0x98, 0x88, 0x62,
- 0xce, 0xf9, 0xb8, 0xac, 0xed, 0x7e, 0xa1, 0x04, 0x26, 0xba, 0x41, 0xee,
- 0xd2, 0x0a, 0x82, 0x59, 0x92, 0xfb, 0x95, 0x8a, 0xc8, 0x07, 0xbc, 0x90,
- 0x36, 0xd4, 0x45, 0xe9, 0xe6, 0x94, 0xf4, 0x67, 0xb6, 0x49, 0x96, 0x4d,
- 0xc9, 0xaf, 0x89, 0xbd, 0x43, 0x4d, 0x4a, 0xda, 0xfe, 0x0d, 0x48, 0xb5,
- 0x24, 0x33, 0xd0, 0x9c, 0xc3, 0x9b, 0x94, 0x4c, 0xd9, 0x66, 0x99, 0x36,
- 0x8f, 0x83, 0x19, 0xae, 0x92, 0x4d, 0x2c, 0x9c, 0x7c, 0x30, 0x55, 0x04,
- 0xac, 0x83, 0x6d, 0xbb, 0x22, 0xdc, 0xe5, 0x2f, 0xe4, 0x4b, 0x3a, 0x6b,
- 0x2b, 0xe4, 0xd1, 0x39, 0xf8, 0x47, 0x6e, 0xda, 0x29, 0xec, 0xc8, 0x77,
- 0x92, 0x6b, 0x44, 0x13, 0x09, 0xb8, 0x29, 0xbd, 0xe5, 0x4f, 0x9a, 0x10,
- 0x38, 0x87, 0xe0, 0x93, 0xe9, 0xc5, 0xec, 0xde, 0x35, 0xe8, 0xa5, 0x22,
- 0x29, 0x1c, 0xd1, 0x23, 0xf7, 0xb0, 0x5f, 0x48, 0xd2, 0x6e, 0x68, 0x7c,
- 0x94, 0x35, 0x03, 0xfe, 0xe6, 0x41, 0x4f, 0xdc, 0xac, 0x43, 0x4b, 0x2b,
- 0x26, 0xc2, 0x43, 0x10, 0xf0, 0x16, 0xac, 0x2c, 0x4e, 0x6e, 0x3a, 0xf5,
- 0xdd, 0xe6, 0x88, 0xcd, 0x6f, 0xef, 0xd5, 0x77, 0x87, 0xa7, 0xef, 0x8f,
- 0xf7, 0xfe, 0x9c, 0xd0, 0xbf, 0xf6, 0xf9, 0x5f, 0xfb, 0xbd, 0xd8, 0x2a,
- 0x19, 0xf9, 0xb4, 0xf9, 0x6a, 0x33, 0xa9, 0xef, 0xe7, 0xe3, 0x72, 0x66,
- 0xd7, 0x49, 0xa6, 0x42, 0xc3, 0x4f, 0x7d, 0xb9, 0xbc, 0x6d, 0x66, 0x9c,
- 0xb8, 0x94, 0xbb, 0x92, 0xba, 0x16, 0xa0, 0x8c, 0x4a, 0x19, 0x04, 0xc8,
- 0xfc, 0x1c, 0xad, 0x06, 0x69, 0x6c, 0x2a, 0xba, 0x24, 0x54, 0xb6, 0x0a,
- 0xbc, 0x84, 0xbb, 0x48, 0xcf, 0x73, 0x1d, 0x11, 0x18, 0x92, 0x11, 0xca,
- 0xbb, 0x1f, 0x4e, 0x64, 0xb1, 0x32, 0x59, 0x56, 0x04, 0x82, 0xdf, 0x88,
- 0x25, 0x9c, 0x25, 0x4b, 0x5d, 0xa7, 0x2d, 0xa8, 0x52, 0x4c, 0x74, 0x2a,
- 0xf7, 0x92, 0xe3, 0xb9, 0x59, 0x65, 0x56, 0xec, 0xe6, 0x11, 0x97, 0xa2,
- 0x69, 0x6c, 0x2c, 0x5a, 0x0b, 0xeb, 0x2a, 0x90, 0x2a, 0xa7, 0xb4, 0x19,
- 0x67, 0xa5, 0xa8, 0xe6, 0x9a, 0x7c, 0x53, 0x21, 0x59, 0xd5, 0xb3, 0xef,
- 0x3d, 0xf6, 0x38, 0x4b, 0x7a, 0x23, 0xac, 0x31, 0xad, 0x88, 0x19, 0x7b,
- 0x65, 0xa3, 0x59, 0x3a, 0x9e, 0xe0, 0x57, 0x15, 0xac, 0x1d, 0x97, 0x14,
- 0x49, 0xce, 0x6e, 0x73, 0xde, 0x3f, 0x04, 0x05, 0x9a, 0xa5, 0xc1, 0x50,
- 0x70, 0x08, 0x24, 0x0b, 0x38, 0xd9, 0x72, 0xfb, 0xd1, 0xac, 0xd7, 0xfd,
- 0x2c, 0xdb, 0x56, 0xe0, 0x89, 0xbd, 0x7b, 0x76, 0xde, 0x96, 0x7f, 0x37,
- 0x73, 0x9e, 0xea, 0x4c, 0xc6, 0xee, 0x30, 0xb9, 0x92, 0x62, 0x3d, 0x97,
- 0x4b, 0xae, 0x13, 0xbe, 0x6a, 0x9d, 0xe3, 0x96, 0xc1, 0x06, 0x92, 0x38,
- 0xa3, 0x28, 0x51, 0x5e, 0x58, 0xb0, 0x08, 0xad, 0xeb, 0xca, 0xbf, 0xa0,
- 0x74, 0x42, 0xcc, 0x0e, 0x2b, 0x79, 0xe3, 0x79, 0xeb, 0xae, 0xb9, 0xd8,
- 0x5d, 0x91, 0xda, 0xd5, 0x71, 0x56, 0x5c, 0x0c, 0xc7, 0x9f, 0xb2, 0x6a,
- 0x42, 0x29, 0xb6, 0xe6, 0x42, 0x58, 0x8a, 0xfd, 0xab, 0x80, 0x1a, 0xc4,
- 0x93, 0x2c, 0xc4, 0xdf, 0x73, 0x37, 0x14, 0xce, 0xf1, 0xb3, 0x72, 0xed,
- 0x69, 0x23, 0x96, 0x13, 0xb3, 0x89, 0x87, 0x96, 0x4b, 0x43, 0x2f, 0xac,
- 0xf6, 0xb9, 0xd6, 0x44, 0x05, 0x38, 0xc1, 0x03, 0x28, 0x90, 0xcc, 0xb0,
- 0xcd, 0x38, 0x4f, 0xbc, 0x35, 0x95, 0x2d, 0x43, 0xdd, 0x61, 0xd6, 0x05,
- 0x17, 0x24, 0x99, 0x1a, 0x95, 0x37, 0x4c, 0x63, 0x76, 0xb8, 0x27, 0xbb,
- 0x36, 0xc8, 0x5b, 0x86, 0xab, 0xbf, 0xb8, 0x97, 0xb7, 0x8c, 0x49, 0x4b,
- 0xd7, 0x18, 0x2b, 0x6b, 0xca, 0x5c, 0x02, 0x4d, 0x28, 0x4c, 0xba, 0x9a,
- 0x95, 0x77, 0x04, 0x19, 0xef, 0x30, 0x09, 0xcd, 0xcb, 0x29, 0x6f, 0x87,
- 0xf1, 0xbd, 0xa5, 0x01, 0x1d, 0x90, 0xf2, 0xc2, 0xdf, 0x1d, 0xc6, 0x41,
- 0xa6, 0x6d, 0x89, 0xd0, 0x81, 0xb3, 0xa7, 0x0e, 0x38, 0xd0, 0xb0, 0xcf,
- 0x93, 0xaf, 0xfb, 0x2b, 0x49, 0xf8, 0x49, 0xe7, 0xd1, 0x8b, 0x06, 0x23,
- 0x1e, 0x97, 0x44, 0x0f, 0x25, 0xfb, 0x0a, 0x03, 0xa6, 0x45, 0x4c, 0xae,
- 0x96, 0x0d, 0x94, 0x72, 0x35, 0xcb, 0x1a, 0xc1, 0xad, 0x89, 0x13, 0x23,
- 0x88, 0x99, 0x7d, 0x04, 0x3d, 0x45, 0xd9, 0x38, 0x1e, 0x2c, 0xe2, 0x2f,
- 0x2b, 0x00, 0x3b, 0xa4, 0x9d, 0x69, 0x0c, 0x52, 0x26, 0x48, 0x31, 0x1f,
- 0xad, 0x11, 0xe1, 0xa8, 0x97, 0x19, 0xe7, 0x01, 0x86, 0x77, 0x85, 0x4c,
- 0x35, 0xae, 0x00, 0x6f, 0x49, 0x93, 0x2d, 0xce, 0xfd, 0x47, 0x47, 0xd0,
- 0x65, 0x4e, 0x09, 0x26, 0xec, 0xfd, 0x58, 0x5e, 0xaa, 0xb7, 0xc3, 0x88,
- 0xaf, 0xdd, 0x5a, 0xaa, 0x53, 0xae, 0x38, 0xb4, 0xff, 0xb4, 0xa1, 0x11,
- 0x18, 0x5e, 0x55, 0xcd, 0x5c, 0x5c, 0x60, 0x33, 0xb3, 0x48, 0x4b, 0x4c,
- 0x79, 0x28, 0xbc, 0x04, 0x7c, 0x49, 0x0b, 0x0a, 0x4d, 0xbf, 0x3b, 0x8a,
- 0xc5, 0x94, 0x19, 0x3c, 0xad, 0xea, 0x0f, 0xf5, 0xc5, 0x63, 0xd5, 0xa9,
- 0x4b, 0x39, 0x90, 0xf8, 0x40, 0x4b, 0xd0, 0x44, 0x08, 0x02, 0xba, 0x32,
- 0x20, 0x2f, 0x56, 0xb0, 0x49, 0x80, 0xeb, 0x62, 0x3e, 0xf7, 0xe5, 0x83,
- 0x79, 0x11, 0x37, 0xe3, 0xc0, 0xec, 0xff, 0x3a, 0x16, 0x70, 0xd3, 0xdb,
- 0x75, 0x52, 0x16, 0x7f, 0x5d, 0x16, 0x93, 0xce, 0xed, 0x51, 0xd2, 0xa7,
- 0xc5, 0xc1, 0xae, 0xd1, 0x45, 0x0b, 0x63, 0xe9, 0x6e, 0x7c, 0x7c, 0x48,
- 0xce, 0x77, 0x91, 0x51, 0x6e, 0x11, 0x01, 0x82, 0xe9, 0xee, 0x99, 0x79,
- 0x59, 0x48, 0x37, 0xb9, 0x59, 0xa3, 0x6a, 0x72, 0x83, 0xbc, 0x49, 0x0a,
- 0x6c, 0x66, 0x53, 0xbe, 0x73, 0xe3, 0xe0, 0x1b, 0x6e, 0x55, 0xf4, 0xa4,
- 0x9c, 0x24, 0x12, 0x25, 0x48, 0x97, 0x85, 0x4a, 0xe9, 0xa0, 0x9b, 0xda,
- 0xcf, 0x10, 0xb1, 0x79, 0x03, 0x11, 0x98, 0xcd, 0xea, 0xcc, 0x8b, 0x7b,
- 0xdb, 0xf7, 0x9c, 0x35, 0x02, 0xdb, 0x98, 0xcc, 0xa4, 0xbc, 0x82, 0x38,
- 0xbb, 0x8a, 0x67, 0x55, 0xd5, 0xa4, 0x83, 0x48, 0x6f, 0xc8, 0xd6, 0xa3,
- 0x7d, 0x72, 0xaf, 0xf9, 0xf5, 0xf2, 0xba, 0xee, 0x3a, 0xcd, 0xaf, 0x0f,
- 0x6e, 0x9f, 0x52, 0xa7, 0x4d, 0x52, 0xd6, 0x75, 0x9e, 0x72, 0x65, 0x6e,
- 0xe4, 0x7d, 0x42, 0xbe, 0x05, 0xd3, 0x15, 0x26, 0xf9, 0xa5, 0x40, 0x8d,
- 0xe9, 0xf7, 0x55, 0xb3, 0x18, 0x44, 0x97, 0x00, 0x6b, 0xdd, 0xde, 0x02,
- 0xb3, 0x2b, 0xe6, 0x27, 0x00, 0x11, 0xf0, 0x36, 0xfc, 0x3c, 0xb7, 0x84,
- 0x0a, 0x4f, 0x4e, 0xdf, 0x88, 0xdb, 0xf5, 0x82, 0xfe, 0x96, 0x5b, 0x7a,
- 0x86, 0x21, 0x4e, 0x05, 0xf1, 0xf6, 0x42, 0xac, 0xbe, 0xfd, 0xae, 0x9b,
- 0xd0, 0xb3, 0x75, 0x36, 0xda, 0x79, 0xf2, 0x62, 0x37, 0x4c, 0x32, 0xdf,
- 0xa2, 0x4f, 0x08, 0x9b, 0x0a, 0xbb, 0xa2, 0x76, 0x87, 0xbb, 0xdb, 0x9d,
- 0xde, 0xd0, 0x5c, 0x47, 0xe1, 0x4d, 0x8c, 0x4e, 0x54, 0xa2, 0x46, 0x39,
- 0x68, 0x3c, 0x07, 0x2e, 0x1f, 0x5b, 0x41, 0x99, 0x7e, 0x5a, 0xd2, 0x45,
- 0x76, 0x6b, 0x36, 0x5a, 0xcc, 0x18, 0x4e, 0x4e, 0xf3, 0x5a, 0x8c, 0x0d,
- 0xba, 0xcd, 0xf4, 0x76, 0xa1, 0xbc, 0xbf, 0x76, 0x2e, 0x1e, 0x1e, 0xa1,
- 0xdb, 0x92, 0x63, 0xf6, 0x91, 0xc8, 0x40, 0x6d, 0x3a, 0x55, 0x01, 0x9a,
- 0x86, 0xd8, 0xf4, 0xef, 0xee, 0x00, 0xf1, 0x1c, 0x7a, 0x7b, 0x2f, 0x86,
- 0x9f, 0xf9, 0x6b, 0x4a, 0x6a, 0xf8, 0x20, 0xad, 0x27, 0x79, 0xbe, 0xd6,
- 0xc6, 0x50, 0xee, 0x93, 0xbf, 0x2e, 0x41, 0xc0, 0x62, 0xb6, 0x69, 0x9e,
- 0x72, 0x58, 0xd1, 0xd1, 0x29, 0x05, 0xcd, 0x92, 0x1a, 0x69, 0xf6, 0xd8,
- 0x83, 0xed, 0x12, 0x11, 0xb3, 0x90, 0xb4, 0xc1, 0xa3, 0x37, 0xc3, 0x99,
- 0xee, 0xa8, 0x51, 0x84, 0xf0, 0x61, 0xa6, 0x16, 0x72, 0x0c, 0x07, 0x3b,
- 0xd6, 0x48, 0x09, 0x90, 0x3e, 0x9a, 0xb9, 0xaf, 0x4b, 0x9a, 0xa7, 0x68,
- 0x06, 0x02, 0x14, 0x19, 0x21, 0xd1, 0xb2, 0x06, 0x8e, 0x3d, 0xff, 0x82,
- 0x6b, 0xf9, 0xd2, 0x03, 0xa1, 0x38, 0xfd, 0x32, 0x8d, 0x28, 0x83, 0xcc,
- 0xd3, 0x89, 0x48, 0x6e, 0x22, 0xe3, 0x50, 0xf6, 0x58, 0x87, 0x73, 0x10,
- 0xf2, 0x58, 0x1a, 0x12, 0x26, 0x4b, 0x66, 0x27, 0x42, 0xac, 0xd1, 0xa7,
- 0x11, 0x82, 0x62, 0x48, 0xfc, 0x97, 0x45, 0x76, 0x47, 0x02, 0xb9, 0x16,
- 0x85, 0xa2, 0xaa, 0x72, 0x72, 0xe7, 0x68, 0x2c, 0x9c, 0xb6, 0x18, 0xc1,
- 0x10, 0xe9, 0x82, 0x9e, 0x46, 0xb2, 0x04, 0x27, 0x38, 0x9c, 0xb5, 0x65,
- 0x6c, 0x2a, 0x68, 0x5a, 0x80, 0x50, 0xfd, 0x95, 0x1b, 0x8e, 0x45, 0x32,
- 0x58, 0x7e, 0x3d, 0x68, 0x42, 0x44, 0xaa, 0x31, 0xa2, 0x80, 0xdd, 0x22,
- 0xcc, 0x4d, 0x82, 0x89, 0x4e, 0x6b, 0xe1, 0x84, 0x1e, 0xf3, 0x2c, 0xad,
- 0xd9, 0x3a, 0x55, 0x7a, 0xb7, 0x76, 0xdf, 0x88, 0x3f, 0xc6, 0xdb, 0x39,
- 0x32, 0xdf, 0x33, 0x38, 0x4b, 0x3c, 0x8e, 0x2f, 0xf2, 0x10, 0x78, 0x48,
- 0xb7, 0x18, 0xd4, 0x2c, 0x9d, 0x31, 0xf7, 0xaa, 0x99, 0xcc, 0x46, 0xec,
- 0x1b, 0x56, 0xa4, 0xbe, 0x5c, 0x03, 0xc2, 0x77, 0x4e, 0x45, 0x37, 0x8a,
- 0x96, 0xe7, 0xfc, 0x49, 0x3b, 0x09, 0x0e, 0xc3, 0x32, 0x57, 0x1e, 0xa3,
- 0xd8, 0x7f, 0xc9, 0xa1, 0xe8, 0xdb, 0xbd, 0x24, 0xda, 0x3f, 0xfb, 0x85,
- 0xbc, 0x31, 0x2a, 0x9d, 0x54, 0x2c, 0x33, 0x83, 0xfd, 0xe4, 0xb4, 0xab,
- 0x10, 0xf3, 0xb4, 0x84, 0x2c, 0x8b, 0xac, 0x22, 0x29, 0x08, 0x54, 0xf4,
- 0x40, 0xa1, 0xa6, 0xb1, 0x8b, 0x05, 0xb6, 0xf9, 0xd1, 0xd7, 0x27, 0x40,
- 0xdf, 0x9a, 0x63, 0x4f, 0x56, 0x33, 0x5a, 0xe5, 0x21, 0x30, 0xff, 0xb6,
- 0x3d, 0x27, 0xd7, 0xb9, 0xc3, 0xba, 0x87, 0x5a, 0xa8, 0xea, 0xc8, 0xaa,
- 0x0a, 0x0b, 0x24, 0x50, 0x74, 0x5a, 0x0a, 0x2c, 0x90, 0x3e, 0xaa, 0x51,
- 0xb2, 0xd4, 0x21, 0xc6, 0xe3, 0xf3, 0x85, 0x4f, 0x6b, 0x8a, 0x75, 0x5a,
- 0x73, 0x10, 0x8c, 0x15, 0x8b, 0x00, 0xec, 0xeb, 0x36, 0x2c, 0x93, 0x99,
- 0x67, 0x21, 0xd6, 0x48, 0xbe, 0x1f, 0xaf, 0x36, 0xc0, 0x1b, 0xce, 0xf1,
- 0xb4, 0xe3, 0x2b, 0x76, 0xee, 0xd4, 0xed, 0xc7, 0x03, 0x40, 0x56, 0x02,
- 0x7b, 0x65, 0xd2, 0x15, 0xcd, 0xd1, 0xc0, 0xfe, 0x4b, 0x40, 0xa5, 0xe6,
- 0x64, 0xe3, 0x8a, 0xd4, 0x54, 0x11, 0xbf, 0x29, 0xc7, 0xb8, 0x23, 0x48,
- 0xc3, 0x78, 0x73, 0x64, 0xaf, 0x24, 0xaf, 0x18, 0x45, 0xfa, 0x65, 0x22,
- 0x5e, 0x0f, 0x82, 0x2e, 0xd7, 0x9e, 0xf2, 0x0c, 0xf5, 0x1f, 0x9d, 0xe7,
- 0x74, 0x0c, 0x9a, 0x86, 0x78, 0x73, 0xe6, 0x72, 0x9c, 0xdc, 0xf8, 0xb3,
- 0xc7, 0x5b, 0x8e, 0xf8, 0x16, 0x6b, 0x26, 0xb4, 0xff, 0xb7, 0xee, 0xe4,
- 0xbd, 0x7a, 0x78, 0xf6, 0x7e, 0xe1, 0xe4, 0x3d, 0x30, 0x7b, 0xcc, 0x5a,
- 0xaa, 0xe8, 0xc4, 0x57, 0x9e, 0xa7, 0x07, 0x31, 0x74, 0x36, 0x14, 0xac,
- 0xc7, 0xa7, 0x2d, 0x65, 0x3c, 0xa3, 0xe8, 0xd5, 0x6f, 0xb6, 0xea, 0xd8,
- 0x8d, 0xda, 0xfb, 0x78, 0x73, 0x1c, 0xf2, 0x28, 0x86, 0x2d, 0x76, 0x24,
- 0x51, 0x17, 0xf1, 0x3a, 0xd9, 0x79, 0x9f, 0xcc, 0xf6, 0x6f, 0x78, 0x2b,
- 0xe3, 0xec, 0xd1, 0xe7, 0xe2, 0xcd, 0x69, 0x46, 0x8c, 0x28, 0x8d, 0xc1,
- 0xf8, 0xbe, 0xd4, 0x4b, 0xea, 0xc1, 0xc1, 0xb5, 0xbc, 0x4c, 0x0c, 0xda,
- 0x60, 0xc9, 0xc2, 0xd1, 0x06, 0x08, 0x7e, 0x17, 0x3f, 0x88, 0x37, 0xe7,
- 0xf1, 0x35, 0xd1, 0x76, 0xd4, 0xcb, 0x6b, 0xbb, 0xdf, 0x9e, 0x30, 0xe2,
- 0xa0, 0x41, 0xd3, 0x70, 0xa4, 0xaf, 0x9e, 0xab, 0x1c, 0x86, 0xa9, 0x2c,
- 0x1f, 0x11, 0x92, 0x46, 0x97, 0xef, 0xff, 0xd7, 0x87, 0x08, 0xc4, 0xba,
- 0xf5, 0x7c, 0x62, 0x98, 0xe2, 0x4c, 0x72, 0x9b, 0xe2, 0x1a, 0x46, 0x7e,
- 0xc1, 0x40, 0xe6, 0x16, 0x75, 0x78, 0x47, 0x08, 0xe0, 0xae, 0x25, 0xb7,
- 0x38, 0xc5, 0xec, 0x66, 0x08, 0x6c, 0x9a, 0xa6, 0xb1, 0xcb, 0xed, 0xcd,
- 0x33, 0x1d, 0xd0, 0xf0, 0x06, 0xb2, 0x69, 0x79, 0x27, 0xae, 0xd9, 0xac,
- 0x76, 0x7b, 0x76, 0x76, 0xe6, 0x38, 0xf3, 0x86, 0xec, 0xed, 0xc0, 0xd5,
- 0xb7, 0xa3, 0x52, 0xa1, 0xc9, 0xf5, 0xde, 0xba, 0x2c, 0xf7, 0x3e, 0x6f,
- 0x5d, 0x96, 0xee, 0x9d, 0xb5, 0x3a, 0xc0, 0x28, 0x13, 0xa4, 0x4f, 0xcb,
- 0xe9, 0x86, 0xf7, 0xa0, 0x83, 0x81, 0xc5, 0xb6, 0x03, 0x1d, 0xa1, 0x57,
- 0xbb, 0x3a, 0x80, 0xc0, 0x34, 0x7c, 0x7b, 0x18, 0x41, 0x17, 0xe8, 0xf1,
- 0xc9, 0xb8, 0x2a, 0xef, 0x40, 0x93, 0x02, 0xa4, 0x84, 0x90, 0xcf, 0xa5,
- 0xca, 0x9d, 0x72, 0x93, 0xd6, 0xa1, 0x62, 0x38, 0x13, 0x06, 0x48, 0xb3,
- 0x66, 0xdf, 0x5c, 0xbe, 0x3d, 0x65, 0xc6, 0x54, 0x4e, 0x55, 0xa3, 0xac,
- 0x11, 0xb6, 0x42, 0xeb, 0xe5, 0x78, 0x6e, 0x36, 0x80, 0xd1, 0x4f, 0x1a,
- 0x16, 0x67, 0x22, 0x21, 0x83, 0x74, 0x3a, 0x44, 0x85, 0x24, 0xa6, 0xb8,
- 0x88, 0xf9, 0xfa, 0xc5, 0x17, 0xe4, 0x62, 0x69, 0xb2, 0xb8, 0xc8, 0xed,
- 0xda, 0x08, 0xf6, 0x88, 0x02, 0x2c, 0x76, 0x3e, 0x0d, 0xee, 0xee, 0xee,
- 0x06, 0xd4, 0x39, 0xa7, 0x98, 0x90, 0xc5, 0x76, 0x44, 0xac, 0x36, 0x6c,
- 0xbf, 0x0c, 0xde, 0xd0, 0x52, 0xd0, 0x23, 0xc1, 0xe9, 0xf3, 0x34, 0x35,
- 0x30, 0xef, 0x83, 0xfd, 0xd1, 0x4e, 0x20, 0xa9, 0x5d, 0x96, 0x78, 0x17,
- 0x64, 0x21, 0x69, 0x5b, 0xd9, 0xea, 0x8a, 0xb4, 0xb5, 0xca, 0x17, 0xe9,
- 0x21, 0xa4, 0x10, 0xc9, 0xb1, 0x5a, 0x2c, 0x2b, 0xf2, 0x3e, 0x25, 0x6c,
- 0x60, 0x44, 0xa1, 0xce, 0x1a, 0x58, 0x50, 0xcf, 0xbe, 0x0d, 0x8f, 0xb5,
- 0x4c, 0x13, 0xa5, 0x21, 0xa5, 0xf6, 0xdb, 0x52, 0xbd, 0x1b, 0x44, 0x02,
- 0x35, 0x07, 0x00, 0xec, 0x58, 0x4c, 0xb3, 0xd3, 0x4c, 0xeb, 0x20, 0xc2,
- 0x4f, 0xe1, 0xcd, 0x0d, 0x34, 0xbc, 0x98, 0x8e, 0xed, 0xd8, 0x79, 0x6b,
- 0xc7, 0xc9, 0xaa, 0xca, 0x36, 0x08, 0x4a, 0x90, 0x2e, 0x06, 0x52, 0x56,
- 0xdf, 0x5b, 0x4e, 0xee, 0x98, 0x41, 0x10, 0x41, 0xd4, 0x38, 0xa4, 0x2a,
- 0xe6, 0x32, 0x37, 0x39, 0xb9, 0x4c, 0x5a, 0xd6, 0x13, 0x5b, 0x86, 0xf3,
- 0xac, 0xba, 0xf6, 0x78, 0xdb, 0x62, 0xba, 0x62, 0xea, 0x91, 0xd3, 0x24,
- 0xc9, 0xbf, 0x0f, 0xf8, 0x4a, 0x85, 0x40, 0x5a, 0xb2, 0x77, 0x19, 0xbf,
- 0xd8, 0x24, 0xb2, 0x5f, 0x48, 0x95, 0x69, 0x5a, 0x98, 0x89, 0xa0, 0x13,
- 0x1b, 0x42, 0x2c, 0x66, 0xb3, 0x57, 0xb3, 0x72, 0x59, 0xdf, 0x6f, 0x26,
- 0xc2, 0x62, 0x2d, 0x9c, 0xb2, 0x8d, 0xc0, 0x41, 0x4a, 0x06, 0x1d, 0x2f,
- 0x8b, 0x8f, 0x6a, 0xee, 0x10, 0x40, 0xbc, 0x66, 0xdf, 0x62, 0xa7, 0xb9,
- 0x4d, 0xef, 0x6b, 0xff, 0xee, 0xb7, 0x1d, 0x9b, 0x65, 0xc4, 0x86, 0x61,
- 0xe3, 0x3d, 0xca, 0xc4, 0x6b, 0xc5, 0xa0, 0xd2, 0x68, 0xd8, 0xda, 0xe2,
- 0xfc, 0xe1, 0xc3, 0xb3, 0xad, 0xd2, 0xc5, 0xc1, 0x6c, 0x79, 0x4a, 0x9f,
- 0xd9, 0x8a, 0xff, 0xaf, 0xc0, 0xfc, 0xbb, 0xca, 0x50, 0x8c, 0xf9, 0x77,
- 0x94, 0x41, 0x9c, 0xc2, 0xcd, 0x94, 0x37, 0x8c, 0x2e, 0xb2, 0xab, 0x38,
- 0x4c, 0xce, 0x23, 0x88, 0x2c, 0xac, 0x86, 0x7f, 0x89, 0xa5, 0x7e, 0x8f,
- 0xa7, 0x49, 0xcb, 0xcd, 0x08, 0xd8, 0x2e, 0xa0, 0xd8, 0xd6, 0x94, 0x0c,
- 0x90, 0x1e, 0x62, 0x58, 0x12, 0xee, 0x5f, 0x4d, 0x4f, 0xeb, 0x29, 0x26,
- 0x4a, 0x54, 0x4a, 0x6c, 0xa6, 0xe8, 0xb8, 0x4e, 0x33, 0x3b, 0xda, 0xd9,
- 0xcd, 0x19, 0x9c, 0x99, 0x2f, 0xbd, 0x84, 0x20, 0xf6, 0x0e, 0x41, 0x0e,
- 0x58, 0x8a, 0xd4, 0xd0, 0xec, 0xf2, 0xce, 0x91, 0x11, 0x2b, 0xc1, 0x60,
- 0x19, 0xa1, 0xb7, 0x06, 0xd2, 0xe4, 0x1f, 0x6d, 0xef, 0xb6, 0x71, 0x56,
- 0x57, 0xf7, 0x0a, 0x5a, 0xed, 0x2f, 0x74, 0xbc, 0x72, 0x4e, 0x04, 0xf2,
- 0xeb, 0x27, 0x0a, 0x95, 0x92, 0xd6, 0xc4, 0xd1, 0xe5, 0x9b, 0x7a, 0xd9,
- 0x2c, 0xbb, 0xe6, 0x11, 0xbd, 0x3c, 0x3d, 0xfe, 0xee, 0xf8, 0x34, 0xb8,
- 0xc0, 0xbe, 0x1e, 0x8d, 0x76, 0x3e, 0x66, 0xd5, 0x18, 0xb5, 0x7a, 0xe0,
- 0xf2, 0x4e, 0x12, 0x3c, 0x69, 0xf1, 0x3a, 0x9e, 0x5c, 0xd7, 0x52, 0x0e,
- 0x90, 0xb2, 0x30, 0x9f, 0xc2, 0xe8, 0xbf, 0x7c, 0x52, 0xb8, 0x51, 0x91,
- 0x73, 0x21, 0xc0, 0x30, 0x5c, 0x53, 0x93, 0x2a, 0x9b, 0x72, 0x2d, 0x9b,
- 0x10, 0x12, 0x56, 0x90, 0x9a, 0x9f, 0x24, 0xaf, 0xb1, 0x94, 0x8c, 0x95,
- 0x45, 0xf4, 0xc3, 0x0e, 0x22, 0x78, 0x63, 0x51, 0x9a, 0x2b, 0xe4, 0x3e,
- 0x79, 0x2d, 0xdf, 0x44, 0x2e, 0x1e, 0xcd, 0x05, 0x33, 0xcb, 0xb0, 0xf4,
- 0x3e, 0xfb, 0x76, 0x70, 0x38, 0x1a, 0xbc, 0x3e, 0x3e, 0x3d, 0xfe, 0xfa,
- 0xf0, 0xf2, 0x98, 0xe9, 0x3f, 0x95, 0x07, 0x70, 0x85, 0x32, 0xa4, 0x4a,
- 0xd0, 0xb7, 0x32, 0x31, 0x7c, 0x33, 0x13, 0x87, 0x2c, 0x55, 0xf1, 0xfa,
- 0x08, 0xfe, 0x40, 0xcb, 0x46, 0x96, 0x92, 0x8d, 0xd2, 0xb4, 0x8a, 0x69,
- 0x75, 0x37, 0xb3, 0xb9, 0x92, 0xa4, 0xab, 0xc1, 0x08, 0x24, 0x11, 0xe4,
- 0x7d, 0x41, 0x60, 0xe1, 0xdc, 0xe6, 0xce, 0xf1, 0xe8, 0xbd, 0xa9, 0xf7,
- 0x66, 0xb6, 0xb5, 0xc0, 0x20, 0xca, 0x8c, 0x6b, 0x25, 0xc7, 0x05, 0x93,
- 0xfb, 0x23, 0xf6, 0xf8, 0x1a, 0x0f, 0x76, 0xf8, 0x38, 0x87, 0xd6, 0x9b,
- 0x46, 0xd9, 0x6b, 0xfa, 0xbb, 0x48, 0x1a, 0x3d, 0xe2, 0x6f, 0xf5, 0xe4,
- 0x26, 0x9b, 0x5b, 0x52, 0x10, 0x8a, 0x39, 0x23, 0x6d, 0x92, 0x73, 0xcc,
- 0x84, 0xbc, 0x00, 0xc7, 0x7c, 0x9c, 0xc1, 0xb8, 0x45, 0x40, 0xe7, 0x36,
- 0x90, 0xef, 0x00, 0x70, 0x10, 0x4b, 0x2f, 0xf9, 0xe8, 0x09, 0x82, 0x81,
- 0x14, 0xcd, 0x21, 0xc0, 0x62, 0x12, 0x07, 0x8e, 0x47, 0x7e, 0xa5, 0x82,
- 0x45, 0xf7, 0xf2, 0xb7, 0x7c, 0x9f, 0x1e, 0x4f, 0x1f, 0x85, 0x76, 0xf0,
- 0x23, 0xc8, 0x4b, 0xb5, 0x84, 0xa8, 0x87, 0x51, 0x67, 0x5c, 0xd3, 0xc5,
- 0xd9, 0x4a, 0x72, 0x6c, 0xc7, 0xeb, 0x84, 0x5d, 0xc5, 0x41, 0xcf, 0x4a,
- 0x9c, 0x9d, 0xc1, 0xa1, 0x7d, 0x00, 0xf6, 0xb5, 0x84, 0xd7, 0x8d, 0x15,
- 0x36, 0x5c, 0x9b, 0x4a, 0x45, 0xca, 0x0b, 0x69, 0x7f, 0x28, 0x04, 0xbe,
- 0x82, 0x01, 0x7f, 0x50, 0x30, 0xb4, 0x28, 0x7e, 0x89, 0x52, 0x55, 0xff,
- 0x1a, 0x12, 0x31, 0xdb, 0x34, 0xa3, 0x41, 0xb6, 0x08, 0x78, 0x2d, 0xb7,
- 0xde, 0x28, 0x69, 0xad, 0xbd, 0x3b, 0x34, 0x29, 0x09, 0x04, 0xc6, 0x8e,
- 0xf9, 0xfb, 0xf8, 0xfc, 0x82, 0xcb, 0xee, 0x9d, 0xd2, 0x5f, 0x24, 0x68,
- 0x53, 0xc7, 0xb8, 0x78, 0x84, 0x34, 0x1b, 0x29, 0xd9, 0x70, 0xfb, 0xdb,
- 0x58, 0xac, 0x62, 0xcb, 0x18, 0x4e, 0x28, 0x7c, 0xa4, 0x72, 0x20, 0x62,
- 0xc9, 0x7b, 0x5e, 0x5d, 0x20, 0x74, 0x85, 0xfa, 0x20, 0xfc, 0x83, 0xe8,
- 0x05, 0x63, 0x22, 0xd5, 0xb9, 0x7e, 0x46, 0xbf, 0x54, 0x9f, 0xdb, 0xea,
- 0x64, 0x68, 0xc7, 0x90, 0x43, 0x4d, 0x02, 0x82, 0x5d, 0xa1, 0xa2, 0x50,
- 0x6a, 0xfa, 0x31, 0x74, 0xe3, 0xe4, 0x4f, 0x70, 0xec, 0x19, 0xdc, 0x5f,
- 0xa1, 0x2b, 0x1d, 0x49, 0xbb, 0x74, 0xbb, 0xb0, 0x77, 0x52, 0x11, 0xb5,
- 0x18, 0xb4, 0xc5, 0x10, 0xf7, 0x85, 0x2e, 0x43, 0x42, 0x96, 0x84, 0x83,
- 0x2e, 0x0b, 0x9f, 0x25, 0xbf, 0x65, 0x0b, 0xd4, 0x0a, 0x2c, 0xca, 0xee,
- 0x25, 0xec, 0xca, 0xda, 0xd9, 0x95, 0x44, 0xb6, 0x52, 0xd0, 0x3d, 0xc2,
- 0xc6, 0x18, 0xb3, 0x42, 0x21, 0xf6, 0x42, 0x11, 0x39, 0x75, 0x66, 0xe2,
- 0x2d, 0xe9, 0x3f, 0x06, 0x2a, 0xcb, 0x16, 0x51, 0xa8, 0x69, 0x6f, 0xb4,
- 0x30, 0xbe, 0xc4, 0xfc, 0xff, 0x89, 0x14, 0xf6, 0x9c, 0x9c, 0xe2, 0xd2,
- 0x15, 0x9e, 0x1c, 0x22, 0xf7, 0xd0, 0xfd, 0x56, 0xc6, 0x76, 0x15, 0xcb,
- 0x17, 0xcf, 0x51, 0xdf, 0xda, 0x82, 0xab, 0x30, 0x61, 0x0a, 0xe8, 0xa9,
- 0x91, 0x46, 0xe0, 0xd1, 0xfa, 0x51, 0x9d, 0xab, 0x76, 0x9e, 0x01, 0x5b,
- 0xd5, 0x7c, 0xa7, 0x17, 0x01, 0xf6, 0x9c, 0xd1, 0xe4, 0xe6, 0xdb, 0xe8,
- 0x2e, 0x79, 0x65, 0x6c, 0x28, 0x8f, 0xf6, 0x4e, 0xf0, 0xfd, 0xd7, 0xe8,
- 0x1c, 0x34, 0x1a, 0xbc, 0x81, 0x63, 0x6f, 0xf4, 0x07, 0xae, 0x94, 0x46,
- 0x98, 0x1d, 0xde, 0xcb, 0xe3, 0xcc, 0x7c, 0x31, 0xa7, 0x2a, 0x0f, 0x7e,
- 0x29, 0x93, 0x00, 0xb5, 0x5a, 0x9b, 0xfd, 0x37, 0xb9, 0x51, 0x93, 0x89,
- 0x5e, 0x9c, 0x93, 0x02, 0xe0, 0x95, 0x30, 0xc1, 0x4e, 0x60, 0x28, 0xc1,
- 0xe0, 0xbc, 0xaf, 0x91, 0x30, 0xc6, 0xb7, 0x07, 0x11, 0x65, 0x33, 0x81,
- 0x13, 0xcb, 0x01, 0xa2, 0x8f, 0xa6, 0xf5, 0x6d, 0xfc, 0x84, 0xd7, 0xb7,
- 0xd1, 0x13, 0xae, 0x7f, 0xe0, 0xa4, 0x7b, 0x85, 0x65, 0x56, 0x9d, 0xf5,
- 0xd1, 0x77, 0xba, 0x57, 0x56, 0x9f, 0x70, 0x1d, 0x1d, 0x76, 0xbb, 0x77,
- 0xc6, 0xf9, 0x90, 0xcb, 0x1a, 0xd9, 0x63, 0x2e, 0xe7, 0x3c, 0xea, 0xae,
- 0xf7, 0xeb, 0x41, 0xf1, 0x39, 0x37, 0xdf, 0x97, 0xc3, 0x7d, 0x7e, 0x38,
- 0xfa, 0xae, 0x73, 0xac, 0xbd, 0x83, 0x1c, 0x4b, 0xcf, 0x45, 0x9d, 0x96,
- 0x4a, 0xc9, 0xff, 0xa8, 0xad, 0xe8, 0x7e, 0xaf, 0x6f, 0x1f, 0xb3, 0xdf,
- 0x4d, 0x47, 0x82, 0xfd, 0x1e, 0xcc, 0xf1, 0xba, 0xfd, 0xee, 0x2f, 0x54,
- 0xeb, 0x06, 0xca, 0x12, 0x7f, 0xc7, 0x17, 0x5c, 0xcd, 0xed, 0x06, 0x85,
- 0x41, 0x83, 0xad, 0x8e, 0x9d, 0x5e, 0x94, 0xb2, 0xb5, 0x43, 0x88, 0x18,
- 0xfa, 0xf9, 0x4b, 0x36, 0x3a, 0x5e, 0x08, 0xf6, 0xb9, 0xae, 0xe8, 0x2f,
- 0xde, 0xe8, 0x72, 0x40, 0x82, 0x7d, 0x0e, 0xad, 0xfa, 0xbc, 0xef, 0x6d,
- 0x70, 0x6f, 0xd7, 0xfa, 0x29, 0xb0, 0x91, 0x19, 0x12, 0xba, 0x8a, 0xda,
- 0xbb, 0x80, 0x5d, 0x66, 0x7b, 0xa4, 0xb4, 0x62, 0xdf, 0xa6, 0x14, 0x56,
- 0x93, 0xd0, 0xbb, 0x6e, 0x73, 0x66, 0x7d, 0x2c, 0x7b, 0xa5, 0xaa, 0x34,
- 0x2e, 0x71, 0xdc, 0xda, 0x30, 0xd4, 0xfd, 0x94, 0x6a, 0xbf, 0x52, 0x8b,
- 0xcb, 0x1d, 0x74, 0xe4, 0x2e, 0x59, 0x34, 0x33, 0xb7, 0xce, 0x08, 0x20,
- 0x00, 0x5e, 0xa1, 0xd6, 0x39, 0x2d, 0xea, 0x81, 0xab, 0xb5, 0xf7, 0xd2,
- 0xfe, 0x35, 0xd0, 0xd2, 0x5f, 0xbf, 0x1b, 0x85, 0xa7, 0xb5, 0xce, 0x18,
- 0x32, 0x7f, 0x8d, 0xe3, 0x67, 0x1e, 0x71, 0xd9, 0x3f, 0xcd, 0x4d, 0x85,
- 0x4a, 0x35, 0x2f, 0xa3, 0x0e, 0x0e, 0x7c, 0x62, 0xd8, 0x4d, 0xdf, 0x49,
- 0xb5, 0x38, 0x24, 0x3c, 0x7d, 0xe4, 0x71, 0xf1, 0xfa, 0xa6, 0xd9, 0xaf,
- 0xf0, 0xa4, 0x44, 0xa8, 0xa3, 0x6c, 0xce, 0x0e, 0xf5, 0x54, 0x0b, 0x6d,
- 0x09, 0xaf, 0xaa, 0x10, 0x38, 0xd9, 0xe2, 0x0a, 0x45, 0xa7, 0xbe, 0x60,
- 0x77, 0xb0, 0xd4, 0x1e, 0x9d, 0x1f, 0x86, 0xed, 0x6c, 0xaf, 0x35, 0xb3,
- 0x68, 0x02, 0x17, 0xb7, 0x4f, 0x07, 0xf4, 0xb0, 0x55, 0x9e, 0xe4, 0xa7,
- 0xcf, 0xf1, 0xd3, 0x61, 0x30, 0xd1, 0x81, 0xad, 0x29, 0x65, 0x76, 0x2c,
- 0xdb, 0x1d, 0x98, 0x55, 0xa6, 0x44, 0xf1, 0x8c, 0x4b, 0x40, 0x6b, 0xdb,
- 0xde, 0xa5, 0xca, 0x67, 0xe5, 0xea, 0x86, 0x24, 0x01, 0x81, 0x76, 0x8a,
- 0x02, 0xb7, 0x9e, 0x47, 0xf1, 0x49, 0x37, 0xfc, 0xd6, 0xea, 0xf3, 0x4b,
- 0x19, 0x66, 0x7c, 0xc9, 0x5b, 0x9a, 0xd8, 0x38, 0xe7, 0xd2, 0x0a, 0x2f,
- 0xf3, 0xc5, 0x40, 0xdf, 0x52, 0x2f, 0xe0, 0x3c, 0x05, 0x23, 0x37, 0x49,
- 0x8d, 0xa7, 0x58, 0x84, 0xc8, 0x20, 0xb9, 0x74, 0x56, 0x2b, 0xb6, 0xd3,
- 0xda, 0x34, 0xa2, 0xb0, 0x34, 0x96, 0x84, 0x8d, 0x36, 0x05, 0x7f, 0x27,
- 0x96, 0x06, 0xa3, 0xc8, 0x55, 0x3f, 0x32, 0xad, 0x90, 0x77, 0x74, 0xc3,
- 0xbe, 0xfb, 0xc0, 0xfa, 0xb9, 0x4d, 0xb6, 0x7e, 0xfd, 0x74, 0xce, 0xfe,
- 0x67, 0xac, 0xdf, 0xf3, 0xdf, 0x6b, 0xfd, 0x9e, 0xff, 0xcf, 0x58, 0xbf,
- 0xe7, 0xff, 0xf4, 0xfa, 0x3d, 0x0d, 0xd6, 0xef, 0xf9, 0xff, 0x94, 0xf5,
- 0xd3, 0xc2, 0x1e, 0xba, 0x7a, 0x59, 0xb0, 0x7e, 0x23, 0x49, 0xe9, 0x50,
- 0x06, 0x2c, 0x9a, 0x69, 0x7d, 0x8b, 0x83, 0x0e, 0x91, 0xda, 0x3b, 0x1e,
- 0xc7, 0x79, 0x9c, 0x6c, 0x41, 0x22, 0x2a, 0xda, 0xe8, 0xc9, 0x79, 0x62,
- 0x3b, 0xe0, 0x2d, 0x83, 0xa3, 0xe8, 0x81, 0x8e, 0x13, 0x75, 0xb9, 0xd6,
- 0xe4, 0x87, 0x33, 0xe3, 0xe7, 0x8c, 0xb3, 0xda, 0x65, 0x02, 0xc6, 0x08,
- 0x78, 0xcc, 0xc4, 0x1d, 0xbc, 0xa4, 0xe9, 0x1a, 0xf0, 0xe3, 0x5f, 0x44,
- 0xf3, 0x7f, 0x50, 0xd9, 0xcb, 0x75, 0x29, 0xe6, 0x66, 0xf7, 0xa6, 0xce,
- 0xad, 0x9b, 0xdd, 0x8d, 0xde, 0xa2, 0xc5, 0xd6, 0x2c, 0xc2, 0xbb, 0xcd,
- 0x2b, 0xf8, 0xd0, 0x92, 0xbd, 0x86, 0x66, 0xb0, 0x9c, 0x2f, 0x24, 0x2f,
- 0xf0, 0x81, 0xbc, 0xa8, 0x84, 0x4b, 0xd6, 0x20, 0xe7, 0x89, 0x7d, 0xab,
- 0x92, 0x2b, 0x60, 0xeb, 0xc6, 0x2a, 0x10, 0x5b, 0xa2, 0x16, 0xce, 0xb9,
- 0x19, 0xf1, 0xb9, 0xae, 0xc8, 0xbf, 0xf1, 0x9c, 0x05, 0x0c, 0x69, 0xb7,
- 0xb5, 0x58, 0xb3, 0xc2, 0xd7, 0x91, 0x04, 0x17, 0x0d, 0x72, 0x04, 0xfe,
- 0x6a, 0x8c, 0x16, 0x12, 0xe1, 0x19, 0x4a, 0x93, 0xa0, 0x3e, 0x33, 0x05,
- 0x97, 0x79, 0xd5, 0x34, 0x33, 0x94, 0x5c, 0x09, 0xaf, 0x8a, 0xa9, 0xed,
- 0x3d, 0xb3, 0x99, 0xc4, 0xa0, 0xc4, 0x70, 0x20, 0x43, 0x9b, 0xd1, 0x14,
- 0x5e, 0x4e, 0x46, 0xb7, 0x64, 0x24, 0xc5, 0xad, 0xe2, 0xe7, 0x5b, 0xac,
- 0xd8, 0x83, 0x71, 0x98, 0x01, 0xd3, 0xca, 0xdf, 0xf9, 0x37, 0x6c, 0xdf,
- 0x15, 0x18, 0x6e, 0x56, 0x22, 0x3c, 0x33, 0x34, 0xb2, 0xe6, 0x3e, 0x48,
- 0x7c, 0x18, 0xe7, 0x4b, 0xd1, 0x73, 0x95, 0x30, 0x34, 0xf0, 0x26, 0xf3,
- 0xf3, 0x10, 0x2d, 0x85, 0x9a, 0xa0, 0x91, 0xd0, 0x5a, 0x21, 0x28, 0xb6,
- 0x80, 0x76, 0x1e, 0xb9, 0xae, 0x32, 0x5d, 0x3d, 0x61, 0x0b, 0x59, 0xf2,
- 0x5b, 0xc4, 0xa2, 0x36, 0x65, 0x3e, 0x8b, 0x7f, 0x61, 0xd6, 0x9f, 0x07,
- 0xeb, 0xf4, 0x45, 0x52, 0x76, 0xcd, 0xb1, 0xd0, 0x75, 0x08, 0xc2, 0x91,
- 0x63, 0xb8, 0x65, 0x7e, 0x4a, 0x1b, 0x0a, 0xe0, 0x5d, 0x71, 0x5c, 0x34,
- 0x55, 0xb9, 0x30, 0x93, 0xfe, 0x75, 0x4a, 0xa3, 0x82, 0xe4, 0x7c, 0x9d,
- 0x66, 0xf3, 0x20, 0xe7, 0xa3, 0x2e, 0xc9, 0x83, 0xa9, 0xb1, 0x5d, 0xfe,
- 0x97, 0xe7, 0xf4, 0x82, 0x62, 0xc9, 0x53, 0x43, 0xd5, 0xc1, 0xa7, 0x66,
- 0xd7, 0x09, 0xf2, 0x9b, 0x4c, 0x99, 0xd1, 0xe8, 0x34, 0x54, 0xa6, 0x95,
- 0xde, 0x7e, 0x6d, 0x8e, 0x2f, 0x9a, 0x1a, 0xb4, 0x4f, 0x94, 0x19, 0x39,
- 0x37, 0xfd, 0x32, 0x7a, 0x98, 0x79, 0xdc, 0xd9, 0x4c, 0xab, 0x7a, 0x2a,
- 0x79, 0xe1, 0xa4, 0xba, 0x5f, 0x90, 0x7d, 0x26, 0x39, 0x6d, 0x7c, 0xf0,
- 0xa8, 0x77, 0x4c, 0x51, 0x98, 0xac, 0x4d, 0x23, 0x7c, 0x0f, 0xcf, 0xbe,
- 0xbc, 0x0b, 0x41, 0x4c, 0x96, 0xb9, 0x99, 0x2f, 0x8a, 0xb0, 0xaa, 0x60,
- 0x26, 0x91, 0x35, 0x05, 0x6b, 0x80, 0xab, 0xb8, 0x11, 0xd0, 0x66, 0xa1,
- 0x84, 0x86, 0x0f, 0xa0, 0x80, 0xe2, 0x6a, 0xf6, 0x01, 0x31, 0xf1, 0xc2,
- 0x99, 0xbd, 0xed, 0x5d, 0x0b, 0xf2, 0x7c, 0x50, 0x8c, 0x52, 0x45, 0xb0,
- 0x65, 0xd2, 0x4d, 0x29, 0x63, 0xba, 0x08, 0x28, 0x0b, 0x3c, 0x66, 0x9b,
- 0xf0, 0xaa, 0xe2, 0xba, 0x4b, 0x48, 0x27, 0x05, 0x6b, 0x46, 0x8c, 0x05,
- 0xa7, 0xef, 0x1d, 0x74, 0xe6, 0x6b, 0xc3, 0x91, 0xbf, 0x0b, 0x8f, 0x3c,
- 0x20, 0xe0, 0xb4, 0x4d, 0xf5, 0x04, 0x38, 0x02, 0x42, 0x32, 0xee, 0xe0,
- 0x9a, 0xce, 0xd2, 0x3a, 0xa7, 0x3b, 0x83, 0x70, 0x90, 0x13, 0x0d, 0x96,
- 0xd2, 0x42, 0x0c, 0x42, 0x22, 0x49, 0x73, 0x98, 0x19, 0xe6, 0x8a, 0x24,
- 0x0d, 0xdc, 0x35, 0x64, 0x50, 0x9a, 0xbe, 0x98, 0x81, 0xc6, 0x33, 0x87,
- 0x5b, 0xe3, 0xfd, 0xed, 0xee, 0x9a, 0x8b, 0x93, 0xd1, 0x51, 0x72, 0x36,
- 0x6a, 0xcd, 0x2b, 0xa0, 0x04, 0x7b, 0xbb, 0xbb, 0x0f, 0x72, 0x7c, 0x88,
- 0x5b, 0x5d, 0xa9, 0x3e, 0xb0, 0x3b, 0x8c, 0x98, 0x52, 0x9e, 0x8f, 0x46,
- 0xb3, 0x0f, 0x1c, 0xcb, 0x07, 0x72, 0x6f, 0xd3, 0x5c, 0x12, 0x39, 0xba,
- 0xac, 0x48, 0xe6, 0x93, 0x96, 0x71, 0xc3, 0x09, 0x36, 0xbe, 0x41, 0x98,
- 0x0a, 0x07, 0x9c, 0x1f, 0xe6, 0x6e, 0x38, 0x46, 0x1f, 0xeb, 0x83, 0xd6,
- 0x3b, 0xd1, 0x12, 0x83, 0xd4, 0x21, 0x7a, 0x49, 0x94, 0xc2, 0x61, 0xf2,
- 0xd5, 0xbd, 0x33, 0x48, 0x3d, 0x3f, 0x0c, 0x7a, 0x05, 0xc9, 0xa5, 0xc5,
- 0x91, 0xd7, 0xdd, 0x72, 0x71, 0x1e, 0x8f, 0x7f, 0x63, 0x81, 0xcd, 0x14,
- 0x95, 0x4d, 0xb9, 0xa8, 0xd1, 0x2a, 0x98, 0x07, 0xe2, 0x9e, 0x18, 0x3b,
- 0x5a, 0x4b, 0x9a, 0xe8, 0x86, 0xed, 0x55, 0x23, 0xe0, 0xdb, 0x7a, 0x2d,
- 0x8f, 0x6c, 0x9b, 0x95, 0xa5, 0x8d, 0x76, 0xfc, 0xac, 0xad, 0xee, 0x51,
- 0x0a, 0xe8, 0x00, 0x89, 0x9e, 0xdd, 0xec, 0x76, 0xca, 0x0d, 0x45, 0x55,
- 0xea, 0x4f, 0x0c, 0xf0, 0x91, 0x1a, 0x8f, 0x59, 0xc3, 0xd0, 0x92, 0x0e,
- 0x91, 0xa5, 0x7f, 0x47, 0x29, 0xbb, 0xb1, 0x0a, 0x4c, 0xbf, 0x86, 0x78,
- 0x90, 0x65, 0xd6, 0xca, 0xd4, 0x8d, 0x90, 0x4f, 0x85, 0x45, 0xef, 0x35,
- 0x8f, 0x15, 0xa1, 0x77, 0x68, 0x65, 0xac, 0xc6, 0xbd, 0xbf, 0x38, 0xed,
- 0x27, 0x52, 0x90, 0x92, 0xb0, 0xb3, 0x66, 0x71, 0xe3, 0x6a, 0xa6, 0xf3,
- 0x69, 0x33, 0x2d, 0x1e, 0x8f, 0xa5, 0x76, 0x0c, 0x4e, 0x74, 0x03, 0xc2,
- 0x8f, 0x6c, 0x9a, 0xac, 0x35, 0x63, 0x3e, 0xf4, 0xee, 0x79, 0xc9, 0xa3,
- 0xe6, 0xc1, 0x4d, 0x8a, 0x83, 0x2d, 0xe1, 0x8b, 0xd5, 0x4e, 0x5b, 0xda,
- 0x24, 0x15, 0x72, 0x9c, 0x58, 0x4b, 0x7e, 0x9f, 0x48, 0x76, 0xae, 0x44,
- 0x75, 0x89, 0x8d, 0x2d, 0xc1, 0x8a, 0x20, 0x3f, 0x77, 0x59, 0x79, 0xb1,
- 0xdd, 0xde, 0x4d, 0x6e, 0x96, 0xb2, 0xe8, 0xd1, 0x10, 0x09, 0x97, 0xc2,
- 0x2c, 0x82, 0x0d, 0x3e, 0x1c, 0x43, 0x5a, 0x93, 0x74, 0x71, 0xbe, 0xc6,
- 0x78, 0xb5, 0xc9, 0x56, 0x78, 0xa7, 0x9f, 0xb4, 0xce, 0x81, 0xaa, 0xef,
- 0xdc, 0x35, 0x97, 0x1b, 0x1c, 0xa5, 0xc7, 0xe7, 0x0d, 0xe2, 0x16, 0x18,
- 0x27, 0x1e, 0xf5, 0x2e, 0xfa, 0x3e, 0xe7, 0xbc, 0x2e, 0x7c, 0xab, 0x44,
- 0xfa, 0x3c, 0x64, 0x6b, 0xc0, 0xdc, 0x8b, 0xd1, 0x43, 0x0b, 0x22, 0xbc,
- 0x12, 0xa1, 0x2b, 0x4b, 0x21, 0x39, 0xe9, 0x3d, 0xd2, 0x30, 0xb4, 0x03,
- 0x81, 0x57, 0x47, 0xe6, 0xf2, 0xba, 0x84, 0x74, 0x94, 0x6d, 0x4c, 0x94,
- 0x79, 0x93, 0x2a, 0x5f, 0x34, 0x1c, 0x4d, 0x0f, 0xaa, 0x59, 0x47, 0xb8,
- 0x3d, 0x14, 0x2e, 0x4d, 0x0b, 0x44, 0x82, 0xcb, 0xfc, 0xcb, 0x6e, 0xc0,
- 0x9a, 0x73, 0xa9, 0x6d, 0x2e, 0x1e, 0x7b, 0xad, 0x0f, 0xfa, 0x91, 0x1a,
- 0xa0, 0x9f, 0x9a, 0x75, 0xf0, 0xff, 0x67, 0xfb, 0xad, 0x73, 0x7a, 0xd5,
- 0x97, 0xb3, 0xba, 0x02, 0x61, 0x85, 0xd3, 0x6a, 0x7a, 0x3f, 0x63, 0x32,
- 0xe3, 0x2d, 0xaa, 0x79, 0xcb, 0x69, 0x2e, 0x29, 0x2e, 0x5d, 0x90, 0xb6,
- 0x89, 0x92, 0xc8, 0xbb, 0x3d, 0x1a, 0x53, 0xa7, 0x72, 0x95, 0x5c, 0x81,
- 0x17, 0xfc, 0xc8, 0xb0, 0xe4, 0xa0, 0xaf, 0x8a, 0x87, 0x57, 0xa7, 0x2a,
- 0x6b, 0x26, 0xde, 0x2f, 0xa7, 0x59, 0x3a, 0x8b, 0xd6, 0xd4, 0xa2, 0x0e,
- 0xc3, 0x2d, 0xc9, 0x87, 0x17, 0x55, 0x3c, 0x0a, 0xf5, 0x72, 0x0b, 0x48,
- 0x15, 0xf2, 0xdc, 0x2a, 0xf8, 0xdc, 0x43, 0x6c, 0x9a, 0x08, 0x89, 0x4f,
- 0x36, 0xcb, 0x6f, 0xc1, 0xc4, 0xa0, 0x5c, 0xbe, 0x38, 0xc9, 0x16, 0x0e,
- 0x81, 0x30, 0x2d, 0x70, 0x5c, 0xf6, 0x01, 0x24, 0x11, 0x30, 0x4a, 0x26,
- 0x60, 0x9c, 0x57, 0x9f, 0x1d, 0xa7, 0x80, 0xb1, 0xf0, 0x54, 0xd8, 0x3b,
- 0xf5, 0x8b, 0xa1, 0x09, 0xb4, 0x33, 0xb7, 0x65, 0x8b, 0x21, 0x38, 0x8e,
- 0xe5, 0x5f, 0x54, 0xc1, 0x4d, 0x7e, 0x9b, 0x29, 0xa4, 0x04, 0xb6, 0x08,
- 0x4f, 0x7f, 0x63, 0xb3, 0xe2, 0xb8, 0xd4, 0x3b, 0x8e, 0x11, 0x9f, 0xa1,
- 0xfd, 0xfd, 0xf8, 0x2e, 0x93, 0x22, 0x90, 0x02, 0x8f, 0x85, 0x7c, 0xae,
- 0xd3, 0x2b, 0x5b, 0x9f, 0x55, 0xc4, 0x53, 0x39, 0x31, 0xd3, 0x87, 0x90,
- 0xda, 0x1d, 0x33, 0xac, 0x16, 0x91, 0xec, 0x15, 0x96, 0x46, 0x48, 0xea,
- 0x71, 0x17, 0x28, 0x89, 0x1f, 0x2b, 0xa1, 0xea, 0x59, 0xbe, 0x50, 0x77,
- 0x68, 0x3f, 0xc9, 0x04, 0xee, 0x41, 0xbc, 0x9c, 0x21, 0xd7, 0x5e, 0xa7,
- 0x58, 0xa5, 0x50, 0x36, 0xce, 0xc8, 0x50, 0xd8, 0xb2, 0xcd, 0x73, 0xeb,
- 0x4f, 0x77, 0xf7, 0xd0, 0xdf, 0xa7, 0xbb, 0x9f, 0x6d, 0xb7, 0x6f, 0x9b,
- 0x99, 0x51, 0x81, 0x80, 0xf9, 0x79, 0x64, 0x99, 0x13, 0xbc, 0x21, 0x28,
- 0xa1, 0xe9, 0xb2, 0x72, 0x75, 0xab, 0xa8, 0xf2, 0x0d, 0x6c, 0xcb, 0xfa,
- 0x86, 0xd8, 0xc0, 0x82, 0xdb, 0x8b, 0x5e, 0xd3, 0x0c, 0x92, 0x9c, 0x15,
- 0x40, 0x38, 0xdc, 0x65, 0xbe, 0x52, 0x34, 0x20, 0x25, 0x36, 0x98, 0x15,
- 0x0f, 0xcf, 0x92, 0x75, 0x19, 0xb2, 0xb6, 0xfa, 0x6c, 0x47, 0x9c, 0xac,
- 0xc0, 0xe1, 0x96, 0x76, 0x11, 0x35, 0xde, 0xbd, 0xe6, 0x1e, 0x78, 0x93,
- 0x17, 0x79, 0x7d, 0x83, 0xe2, 0x6b, 0x75, 0x9d, 0x5e, 0x67, 0x61, 0x42,
- 0xab, 0x31, 0xb3, 0x6a, 0xd6, 0xf1, 0x52, 0x2e, 0x64, 0x4c, 0xec, 0x8f,
- 0x0b, 0x3e, 0x0c, 0x02, 0xf8, 0x97, 0x02, 0x2d, 0x4b, 0x04, 0x34, 0xec,
- 0x30, 0x57, 0x15, 0x0e, 0x72, 0x75, 0x83, 0x56, 0x95, 0x0d, 0x22, 0x92,
- 0x72, 0x70, 0xd4, 0x78, 0x55, 0x06, 0x02, 0x6c, 0x1f, 0x69, 0x81, 0x5b,
- 0xb4, 0xb8, 0x67, 0x23, 0x23, 0x84, 0x76, 0x09, 0x33, 0x35, 0x4b, 0x41,
- 0xf7, 0x6a, 0xfe, 0x66, 0x7e, 0xf6, 0x83, 0xd1, 0xb1, 0x86, 0x2f, 0xec,
- 0x8f, 0xb7, 0x1f, 0x57, 0x66, 0x68, 0xbf, 0xa3, 0x73, 0x10, 0x90, 0x51,
- 0xdc, 0xde, 0x30, 0x6d, 0x5e, 0xf1, 0x3f, 0x56, 0x68, 0x94, 0x23, 0x97,
- 0x54, 0xe1, 0x41, 0x7c, 0x24, 0x01, 0xc7, 0x6a, 0xbc, 0x82, 0xfc, 0x53,
- 0x77, 0x7a, 0x24, 0x10, 0xa1, 0x9a, 0xfd, 0xb4, 0xcd, 0x0d, 0x0c, 0x2d,
- 0x65, 0x46, 0x15, 0x25, 0x68, 0xe3, 0x0f, 0x93, 0xd3, 0x0c, 0xc5, 0x8a,
- 0x93, 0xcd, 0x2f, 0x37, 0x31, 0x5f, 0x9b, 0x2f, 0x99, 0xf6, 0x76, 0x10,
- 0x72, 0x55, 0x23, 0x00, 0xad, 0xe5, 0x5a, 0x36, 0xff, 0x4c, 0x28, 0x4e,
- 0x62, 0x32, 0xe0, 0x1e, 0x28, 0xd9, 0xab, 0xf4, 0x4b, 0xc3, 0xaf, 0x16,
- 0x53, 0x15, 0x54, 0x99, 0x06, 0xf9, 0xd5, 0x50, 0x68, 0x81, 0xf8, 0x52,
- 0x26, 0xf7, 0x04, 0x97, 0xf2, 0x23, 0xae, 0xe0, 0xce, 0x0c, 0xa8, 0xba,
- 0xb2, 0x59, 0x47, 0x2a, 0x4b, 0x32, 0x51, 0x06, 0x97, 0x3b, 0x74, 0x65,
- 0xaf, 0xb8, 0x67, 0xdc, 0x23, 0xb8, 0xc4, 0x26, 0x93, 0x9c, 0xee, 0x64,
- 0x8e, 0x39, 0x9a, 0xdf, 0x5e, 0x5f, 0x67, 0x51, 0x52, 0x51, 0x9a, 0x0c,
- 0xb3, 0xe8, 0x34, 0x17, 0x57, 0x59, 0xda, 0xe0, 0x22, 0x35, 0xf7, 0xf6,
- 0x1a, 0xd4, 0xa9, 0xd3, 0x47, 0x23, 0xcf, 0x78, 0xa3, 0x78, 0xe9, 0x63,
- 0xfb, 0xd7, 0x27, 0x11, 0xcd, 0xc8, 0x92, 0x13, 0xd5, 0x7f, 0x39, 0x43,
- 0x55, 0x09, 0x01, 0xf1, 0x0e, 0xcc, 0x44, 0xf1, 0x9c, 0x28, 0x15, 0x79,
- 0x0a, 0x80, 0x4b, 0xd7, 0x08, 0xa0, 0x42, 0x22, 0xc2, 0x07, 0xbf, 0x0a,
- 0xd9, 0x0b, 0x18, 0x6f, 0xed, 0xc5, 0x91, 0x18, 0x9d, 0x9c, 0x44, 0x52,
- 0xc1, 0xfc, 0x32, 0x7a, 0x47, 0x82, 0xe4, 0xbd, 0xa4, 0xf2, 0x0d, 0xa2,
- 0xee, 0x1a, 0x79, 0xb2, 0x83, 0xbd, 0x2e, 0x18, 0xf3, 0x09, 0x71, 0x42,
- 0xf0, 0x2b, 0x65, 0x72, 0xf1, 0xe6, 0xa8, 0xcb, 0x28, 0xfa, 0xe4, 0xf3,
- 0xcf, 0xa5, 0x13, 0x99, 0x60, 0x93, 0x6c, 0xe9, 0x6c, 0x58, 0xdd, 0x8c,
- 0x97, 0x63, 0xf0, 0xa1, 0xb9, 0x81, 0x01, 0xb6, 0x95, 0x80, 0x77, 0x6c,
- 0xc9, 0x64, 0x4e, 0x37, 0x25, 0xfd, 0xc6, 0x95, 0xf4, 0x54, 0xe2, 0x61,
- 0x2e, 0x87, 0xd1, 0xa1, 0xe6, 0x61, 0x7c, 0x69, 0x91, 0x7c, 0x19, 0x25,
- 0x36, 0x37, 0x5f, 0x44, 0x66, 0xe1, 0x75, 0xd6, 0x84, 0x29, 0x15, 0x1e,
- 0x88, 0xb1, 0xd5, 0xf8, 0x4a, 0x3e, 0x15, 0x57, 0xcf, 0x59, 0x93, 0x42,
- 0x5e, 0x72, 0x70, 0x4c, 0x0b, 0x33, 0x4c, 0x32, 0xcb, 0x01, 0xfe, 0x25,
- 0x0e, 0xda, 0x4b, 0xe1, 0x8f, 0x89, 0x96, 0x58, 0xfe, 0x52, 0xd8, 0x7a,
- 0x04, 0x47, 0x09, 0xea, 0x98, 0xa6, 0x31, 0x06, 0x82, 0x13, 0x82, 0x00,
- 0xb3, 0x82, 0x25, 0x44, 0x19, 0x0a, 0xb8, 0x54, 0x77, 0x10, 0xb7, 0xcf,
- 0x67, 0xaa, 0xb4, 0xbf, 0x54, 0x12, 0x20, 0xc7, 0x96, 0x4f, 0x90, 0x62,
- 0xea, 0x4d, 0x6c, 0x2a, 0xea, 0xa8, 0xe4, 0xa1, 0x03, 0xe8, 0xde, 0xf5,
- 0x26, 0x2a, 0xc2, 0xec, 0x00, 0x4a, 0xcf, 0x03, 0x1b, 0xc2, 0xa4, 0x80,
- 0xe0, 0x5c, 0xd8, 0xa1, 0x52, 0x8b, 0x81, 0x97, 0x5b, 0x7f, 0x73, 0x51,
- 0x95, 0xd4, 0xcc, 0xa6, 0x2d, 0x77, 0x1d, 0x9b, 0x67, 0x9b, 0x59, 0x55,
- 0x91, 0x8b, 0x89, 0x7a, 0x60, 0x19, 0xb1, 0x48, 0xe2, 0x57, 0xc6, 0x2e,
- 0x1d, 0xfe, 0x75, 0x71, 0xed, 0xf8, 0xba, 0x41, 0x34, 0x6f, 0xd4, 0x97,
- 0xb0, 0x28, 0x05, 0x8e, 0xc5, 0xe0, 0x4d, 0x22, 0xdf, 0x7d, 0xf5, 0x65,
- 0xab, 0x01, 0x65, 0x7f, 0xf6, 0x09, 0x4c, 0x05, 0x76, 0x39, 0xb9, 0xce,
- 0x23, 0x39, 0x6b, 0x92, 0x6b, 0xcf, 0x9b, 0xc8, 0x61, 0x6d, 0xad, 0xe1,
- 0xc1, 0x40, 0x6e, 0x6c, 0x28, 0x44, 0xc7, 0x5d, 0x84, 0x7b, 0x96, 0xc5,
- 0x68, 0x0f, 0xe5, 0xfc, 0x5c, 0x13, 0xa0, 0x9d, 0x94, 0x73, 0xe4, 0xdb,
- 0xeb, 0xd6, 0x81, 0x2f, 0xb4, 0xa9, 0x96, 0x13, 0x68, 0xa2, 0xef, 0xc9,
- 0xeb, 0xd2, 0x2c, 0x29, 0x22, 0x34, 0x03, 0xbf, 0x76, 0x24, 0xd1, 0x53,
- 0xea, 0xb8, 0x8a, 0x7b, 0xa4, 0x92, 0x9b, 0xa1, 0x4d, 0x08, 0x9e, 0xea,
- 0xa5, 0x92, 0x2f, 0x40, 0x7f, 0x2f, 0x26, 0x44, 0x3f, 0xc4, 0x1d, 0xb8,
- 0x02, 0x44, 0xd4, 0xc0, 0x12, 0x4c, 0xbc, 0x7f, 0x57, 0xae, 0xba, 0x16,
- 0x6f, 0x1b, 0x2b, 0x23, 0xe1, 0xa5, 0xfa, 0x17, 0x63, 0x53, 0x58, 0xd8,
- 0x31, 0xe3, 0x4f, 0xd5, 0x5e, 0x83, 0x9d, 0xd4, 0x96, 0x42, 0x74, 0xe0,
- 0x61, 0x80, 0x90, 0xb5, 0x18, 0xab, 0x9e, 0xb9, 0xc9, 0x37, 0x56, 0x9f,
- 0x11, 0x52, 0x92, 0xff, 0xea, 0x72, 0x18, 0x57, 0xaf, 0x7e, 0xef, 0x2e,
- 0x1b, 0xbf, 0xfa, 0x92, 0x8c, 0xba, 0x4f, 0x20, 0xbc, 0xe5, 0xab, 0x8f,
- 0x76, 0xf8, 0x0e, 0xf8, 0x6f, 0x13, 0x6f, 0x03, 0x74, 0x1b, 0x31, 0xa7,
- 0x63, 0x65, 0xb3, 0x1e, 0x7a, 0xdc, 0x6b, 0xf2, 0xaa, 0x2c, 0xd7, 0xb6,
- 0x48, 0xb3, 0xc2, 0x15, 0x06, 0x30, 0x2f, 0x1e, 0x30, 0x85, 0xe1, 0x1a,
- 0x2e, 0x37, 0x86, 0x37, 0xbf, 0xdd, 0x54, 0x72, 0xfa, 0x63, 0xc9, 0x8a,
- 0xa8, 0xff, 0xca, 0xea, 0xbb, 0x46, 0x53, 0x5e, 0xf5, 0x15, 0x9a, 0x1d,
- 0xa1, 0x3f, 0x77, 0x63, 0xe0, 0x63, 0x01, 0x16, 0x04, 0xfa, 0xeb, 0x9f,
- 0xed, 0xeb, 0xf4, 0x1f, 0x73, 0xaa, 0xc0, 0x57, 0xb9, 0x66, 0x34, 0x27,
- 0x57, 0xf6, 0x8b, 0x3b, 0x5c, 0x5a, 0x55, 0xab, 0x58, 0x6d, 0xf6, 0xf9,
- 0x12, 0xfe, 0xf3, 0x26, 0xec, 0x1e, 0x45, 0x0c, 0xa0, 0xf0, 0x00, 0x2c,
- 0x59, 0xaa, 0x45, 0xd0, 0x3d, 0x15, 0x84, 0xab, 0xe1, 0xd2, 0x04, 0xe8,
- 0xfd, 0x8a, 0x8e, 0xd3, 0x95, 0x9c, 0x68, 0xdf, 0x7f, 0xea, 0xd9, 0xde,
- 0xff, 0xd4, 0x73, 0xfd, 0xff, 0xa9, 0xe7, 0x46, 0xf0, 0x53, 0xaf, 0x97,
- 0x60, 0x10, 0x81, 0x06, 0xf9, 0x8b, 0x17, 0x7d, 0x93, 0x3f, 0xea, 0xbe,
- 0xe9, 0x7d, 0xd2, 0xfb, 0x62, 0x6f, 0x73, 0xdd, 0xa4, 0x39, 0x2f, 0x73,
- 0x7e, 0xe5, 0x51, 0x40, 0xf1, 0x04, 0x92, 0x64, 0x94, 0x49, 0xd2, 0x59,
- 0x72, 0xb3, 0x82, 0x52, 0xbb, 0x81, 0xa3, 0xc8, 0x7b, 0x82, 0xa6, 0xdc,
- 0x95, 0x59, 0xf0, 0x48, 0x82, 0x2d, 0xcf, 0x94, 0x2e, 0x84, 0x56, 0x14,
- 0x0b, 0xca, 0xcc, 0xd9, 0xd7, 0xa3, 0x5a, 0xd2, 0xd5, 0xb2, 0xe2, 0x5a,
- 0x86, 0x3c, 0x3c, 0x76, 0x44, 0x28, 0x6a, 0x46, 0xbe, 0xf5, 0xf6, 0xf0,
- 0xdd, 0xfb, 0xc3, 0xd3, 0xe1, 0xaf, 0xe3, 0x77, 0x5e, 0xfb, 0x9a, 0x07,
- 0x93, 0xed, 0x64, 0x80, 0x3d, 0x8c, 0x9f, 0x27, 0x98, 0x12, 0x69, 0x35,
- 0xe4, 0xc6, 0x89, 0x27, 0x80, 0x71, 0xac, 0x51, 0x4c, 0x7c, 0x2f, 0x50,
- 0x95, 0xd6, 0x42, 0x76, 0xde, 0xd3, 0xf7, 0xe9, 0xf5, 0x9e, 0xb8, 0xbf,
- 0x2d, 0x36, 0x39, 0x92, 0x2c, 0xef, 0xc0, 0xd4, 0xd6, 0x27, 0xaa, 0xc5,
- 0x46, 0x05, 0x0a, 0x36, 0x95, 0x2c, 0x7f, 0x46, 0x58, 0x5f, 0x5d, 0x39,
- 0xc7, 0x7e, 0xd7, 0x44, 0x39, 0x3a, 0x5a, 0x0d, 0xf2, 0xfc, 0x3d, 0xa9,
- 0x1d, 0x3a, 0x21, 0x77, 0x4c, 0xe3, 0xcc, 0x0c, 0x9c, 0x20, 0xdd, 0xb7,
- 0x19, 0xf1, 0xd7, 0x62, 0x06, 0x5e, 0x4a, 0xdf, 0xe2, 0xb3, 0x4a, 0x69,
- 0x4a, 0x9e, 0x45, 0x4e, 0x9c, 0x0a, 0x0a, 0x05, 0x27, 0x6a, 0x7b, 0x4c,
- 0xd6, 0xf9, 0x21, 0x15, 0x30, 0x54, 0xf8, 0x71, 0x22, 0xde, 0xb8, 0x00,
- 0x4a, 0xcb, 0x45, 0x8e, 0x3c, 0xde, 0xc4, 0xa1, 0x0d, 0x37, 0x6a, 0xfc,
- 0x4a, 0xb4, 0xd6, 0xe4, 0x72, 0x39, 0x37, 0x27, 0xc3, 0x68, 0x64, 0x53,
- 0x63, 0x76, 0xac, 0xaf, 0xe1, 0xa9, 0x6b, 0x4d, 0x3b, 0x8c, 0xeb, 0x8a,
- 0x8a, 0xc2, 0x9c, 0x46, 0xcb, 0x95, 0xf6, 0xe3, 0x77, 0x54, 0x6f, 0x74,
- 0x72, 0x79, 0x6c, 0xa6, 0xef, 0xfd, 0xe5, 0x37, 0x3d, 0xf1, 0x5a, 0x74,
- 0xf3, 0x2e, 0x90, 0xc2, 0x43, 0xd5, 0x13, 0x6e, 0x2d, 0x36, 0xb3, 0x62,
- 0x71, 0x6f, 0xee, 0xe7, 0x88, 0x11, 0xe8, 0x7d, 0x74, 0xb8, 0x66, 0x95,
- 0x9e, 0x0d, 0x9f, 0x75, 0x57, 0x69, 0x35, 0xb7, 0x0e, 0xd8, 0x56, 0x46,
- 0xc1, 0x76, 0x17, 0x0e, 0x17, 0x72, 0x0d, 0xee, 0x38, 0xf6, 0x45, 0xb6,
- 0x30, 0x28, 0xb7, 0x2a, 0x65, 0xfd, 0x37, 0x8d, 0x29, 0x1f, 0x9c, 0x4c,
- 0x6e, 0xed, 0x7a, 0x10, 0xcd, 0xd8, 0x6c, 0x33, 0x51, 0x03, 0xa5, 0xd2,
- 0x73, 0x31, 0xa5, 0x2a, 0xf7, 0x0a, 0x44, 0x0c, 0x53, 0x2d, 0xd4, 0x23,
- 0x4f, 0x9c, 0xae, 0x66, 0x0b, 0x28, 0xa7, 0x63, 0x0b, 0x1e, 0xea, 0xaa,
- 0x55, 0xa9, 0xf2, 0xe5, 0x70, 0xa6, 0x71, 0xe6, 0x9f, 0x79, 0xce, 0x5c,
- 0x1e, 0x1e, 0x87, 0xcd, 0xda, 0xb0, 0x44, 0x9c, 0xac, 0x86, 0xe6, 0x55,
- 0x7c, 0x5e, 0x2f, 0xf9, 0xcf, 0xf8, 0x7e, 0x87, 0x72, 0x53, 0x95, 0x52,
- 0x75, 0x58, 0xde, 0xe0, 0xe8, 0x0a, 0x43, 0x43, 0x90, 0x39, 0x08, 0x95,
- 0x12, 0xf6, 0x1f, 0x2e, 0x78, 0xd0, 0x9e, 0x85, 0xbc, 0xbd, 0x5b, 0xa3,
- 0x6d, 0x99, 0x42, 0xb6, 0x37, 0xa4, 0xb5, 0x08, 0xe6, 0xc7, 0x4b, 0xad,
- 0x17, 0x66, 0x82, 0x58, 0x6e, 0x97, 0x77, 0x7a, 0x43, 0xd5, 0x00, 0xc2,
- 0x78, 0x72, 0x37, 0x8d, 0xa7, 0xbf, 0xf0, 0xf5, 0xcb, 0xca, 0x26, 0xd8,
- 0x48, 0x80, 0x30, 0x3a, 0xfa, 0xfe, 0xb5, 0xc7, 0xd6, 0x49, 0x82, 0x12,
- 0xa3, 0xc2, 0x7e, 0xe1, 0xfc, 0xf3, 0x62, 0x55, 0x2e, 0x70, 0xe6, 0xbc,
- 0xd1, 0x43, 0xb0, 0xb2, 0x4f, 0xb3, 0x6c, 0x61, 0x59, 0x98, 0x50, 0x62,
- 0x84, 0xdd, 0x8c, 0xe6, 0x98, 0x32, 0x07, 0x16, 0xf8, 0xa8, 0x57, 0xf4,
- 0x4e, 0x44, 0xc7, 0xd0, 0xaf, 0x51, 0x4d, 0xec, 0xc3, 0xc6, 0x7c, 0x4d,
- 0xf6, 0x3e, 0x7b, 0xf2, 0x79, 0x52, 0x53, 0x3a, 0x42, 0xee, 0x4f, 0x19,
- 0x13, 0x97, 0xac, 0xce, 0xf2, 0x16, 0x06, 0x50, 0x8d, 0xbb, 0x09, 0x80,
- 0x3f, 0xa9, 0x29, 0x63, 0x0a, 0x17, 0xa9, 0xc0, 0x69, 0xc3, 0xfc, 0x27,
- 0x33, 0x89, 0x32, 0x61, 0x92, 0xb1, 0x8a, 0x79, 0x62, 0x0f, 0xf7, 0xd0,
- 0xdb, 0xc0, 0x44, 0x75, 0x48, 0x54, 0xcc, 0x46, 0xa4, 0x5c, 0x1c, 0x5f,
- 0x5e, 0x98, 0x3f, 0x46, 0x97, 0x67, 0x17, 0x2b, 0x52, 0xf3, 0x1b, 0x4e,
- 0x0c, 0xa1, 0x49, 0x53, 0x7f, 0x9b, 0x14, 0xb8, 0xf4, 0x65, 0x8c, 0x7a,
- 0xfa, 0x39, 0x25, 0x34, 0x82, 0x39, 0xf2, 0xb2, 0x3d, 0xeb, 0x61, 0x6b,
- 0xa0, 0x57, 0xe6, 0x7e, 0x58, 0x3b, 0x30, 0x5e, 0xf3, 0xf5, 0x3b, 0x04,
- 0x03, 0xa6, 0xcd, 0x48, 0x23, 0xb6, 0x82, 0x1e, 0xbd, 0x35, 0xa6, 0x02,
- 0xd9, 0xa0, 0x8e, 0x71, 0x4b, 0xeb, 0xbe, 0xac, 0xa0, 0x64, 0xe0, 0xe0,
- 0x59, 0x6d, 0x6b, 0xb0, 0xa9, 0x29, 0xdc, 0x53, 0xf4, 0x79, 0x8f, 0x8a,
- 0xdb, 0x7e, 0xb4, 0x45, 0x48, 0x1e, 0xd8, 0xbf, 0x69, 0x6d, 0xfd, 0xe3,
- 0x74, 0xe9, 0x96, 0xf3, 0x8c, 0x6d, 0x11, 0x04, 0xd0, 0xac, 0x70, 0xe2,
- 0xbb, 0x85, 0x69, 0x49, 0x92, 0x58, 0x06, 0x86, 0x4d, 0x20, 0xa5, 0x55,
- 0xde, 0xec, 0xb2, 0xc1, 0xc8, 0xba, 0x18, 0x7d, 0x6b, 0xd6, 0x20, 0x35,
- 0x77, 0x53, 0x7b, 0xe5, 0x65, 0x96, 0xb6, 0x85, 0xf7, 0x5e, 0x57, 0xc8,
- 0x50, 0x1a, 0x40, 0x5c, 0xb2, 0xc0, 0xe3, 0xd6, 0x4a, 0x3f, 0x50, 0x9a,
- 0x7b, 0xe8, 0x12, 0x3e, 0x11, 0xff, 0xb9, 0x3c, 0xc5, 0x6b, 0x1b, 0x88,
- 0x02, 0x88, 0x81, 0x99, 0xdb, 0xdb, 0xb2, 0xe4, 0x0c, 0xc9, 0x5f, 0x76,
- 0x85, 0x6e, 0x4b, 0x67, 0x0b, 0xc5, 0xac, 0xaa, 0x66, 0x89, 0xe3, 0x76,
- 0xed, 0xe0, 0xc3, 0xd7, 0xf0, 0x06, 0xff, 0xe6, 0x59, 0x5b, 0xc6, 0x60,
- 0x96, 0x5c, 0xa5, 0x22, 0xc9, 0x0a, 0xb8, 0x9d, 0xa6, 0x76, 0xd2, 0x28,
- 0x89, 0x8f, 0xdc, 0xce, 0x7c, 0x69, 0x4d, 0x4b, 0x2e, 0x7a, 0x4c, 0x83,
- 0x8e, 0xa4, 0x7c, 0x43, 0x5f, 0x06, 0x12, 0x4b, 0x6f, 0x1a, 0x69, 0x4f,
- 0xfc, 0x28, 0x15, 0x6a, 0x35, 0x74, 0x46, 0x8a, 0xbc, 0x82, 0x60, 0xa0,
- 0xe7, 0xfe, 0xa2, 0xb1, 0x48, 0x83, 0x15, 0xe0, 0x64, 0x41, 0xc3, 0xf0,
- 0xfe, 0x56, 0x96, 0x86, 0x8c, 0x35, 0x1a, 0xd1, 0x2d, 0x24, 0x87, 0x42,
- 0x4b, 0x4f, 0xb5, 0x92, 0x13, 0x54, 0x0d, 0x1c, 0xae, 0xc1, 0x7c, 0xfa,
- 0xb9, 0x0c, 0xad, 0x2d, 0xb9, 0xd7, 0xd2, 0xfa, 0xda, 0xa3, 0x5b, 0x89,
- 0x93, 0x7d, 0xc3, 0xe5, 0x32, 0x09, 0x53, 0x98, 0xb5, 0xe5, 0x26, 0x57,
- 0x02, 0x34, 0x07, 0x7e, 0x87, 0x60, 0x39, 0x19, 0xa8, 0xab, 0xcc, 0xf5,
- 0xe8, 0xa8, 0x0f, 0x56, 0x54, 0x3a, 0x81, 0x0a, 0xc6, 0x8e, 0x37, 0xd3,
- 0x78, 0x1b, 0xe7, 0xee, 0xb1, 0x5d, 0xa3, 0xe8, 0xb4, 0x4b, 0x54, 0x18,
- 0xc6, 0x22, 0xd6, 0x4c, 0xcc, 0x89, 0x98, 0x4d, 0x5b, 0x1d, 0xd3, 0xda,
- 0x06, 0xca, 0x83, 0xe8, 0xca, 0x99, 0x23, 0x4a, 0xbe, 0x02, 0x4f, 0xa8,
- 0x4c, 0x94, 0x48, 0x48, 0x44, 0x11, 0x78, 0xf6, 0xc3, 0xb5, 0x4e, 0x26,
- 0x2c, 0x87, 0xf6, 0xd7, 0x8c, 0xa1, 0xbe, 0x5c, 0x84, 0xf7, 0xbc, 0xc3,
- 0x6a, 0xda, 0x16, 0xb9, 0x66, 0x57, 0xe3, 0x77, 0xb1, 0x29, 0xcd, 0xdd,
- 0xf6, 0xd2, 0x01, 0x8e, 0x5d, 0x92, 0x79, 0xf7, 0x34, 0x42, 0x13, 0x08,
- 0x6e, 0xf7, 0x55, 0xb8, 0x79, 0xfd, 0xf5, 0x90, 0x24, 0xab, 0x51, 0x2f,
- 0x76, 0x7b, 0xed, 0x82, 0x6e, 0x92, 0x20, 0xab, 0x6f, 0x9b, 0x79, 0xf1,
- 0xfa, 0x1b, 0x9e, 0x19, 0x75, 0x4c, 0x7a, 0x25, 0xc1, 0xb7, 0xa8, 0xc8,
- 0x13, 0xd7, 0x94, 0xde, 0x58, 0x39, 0xf4, 0xd5, 0xbd, 0xea, 0xed, 0xbd,
- 0xd8, 0x1f, 0xee, 0x3d, 0xff, 0x7c, 0xb8, 0xb7, 0x3b, 0xdc, 0xeb, 0x75,
- 0xaa, 0xc4, 0x4b, 0xc5, 0x06, 0xaf, 0x9d, 0x48, 0xd9, 0x8d, 0x64, 0x35,
- 0x9d, 0x0b, 0x3e, 0x30, 0xbf, 0x1f, 0xd2, 0x63, 0x43, 0xe6, 0xff, 0x0c,
- 0x3e, 0x31, 0x37, 0x1a, 0x0d, 0xd5, 0x0c, 0xec, 0xc6, 0xc6, 0xf5, 0x22,
- 0x55, 0x16, 0x9f, 0x45, 0x4e, 0x9b, 0x48, 0x29, 0x16, 0xbc, 0x59, 0x52,
- 0x3e, 0x71, 0xcb, 0xc5, 0x88, 0xb3, 0x19, 0xef, 0x90, 0x0a, 0xf4, 0x89,
- 0x28, 0x91, 0x4e, 0xa6, 0xdb, 0xef, 0x07, 0x42, 0xf3, 0x17, 0xdb, 0x7c,
- 0x94, 0x32, 0x64, 0x8f, 0x5c, 0x37, 0x55, 0x0c, 0x29, 0x85, 0xdd, 0xac,
- 0x34, 0x49, 0x32, 0xe2, 0x07, 0x5b, 0x18, 0x97, 0x2e, 0x41, 0x30, 0x72,
- 0xed, 0x1c, 0x5a, 0xc6, 0x07, 0x56, 0xa3, 0x65, 0x8b, 0x54, 0xed, 0xa4,
- 0x0f, 0xda, 0xb4, 0x3e, 0x16, 0xd1, 0xda, 0x1c, 0xbd, 0xf3, 0xa7, 0x3f,
- 0x39, 0x79, 0xc4, 0xd5, 0x8a, 0x40, 0x3b, 0xf8, 0xac, 0x0f, 0xec, 0x02,
- 0xfc, 0x8c, 0x4c, 0x0a, 0x97, 0xf4, 0x0e, 0x7e, 0x84, 0x47, 0xf2, 0xe7,
- 0xc1, 0x8f, 0xe6, 0xdf, 0x3f, 0xf7, 0x3c, 0x60, 0x25, 0x67, 0x83, 0x2a,
- 0x90, 0x6f, 0xa3, 0x7d, 0x94, 0xfb, 0x49, 0xbb, 0xae, 0x05, 0x34, 0x83,
- 0xcb, 0xa3, 0x73, 0x3e, 0x8c, 0x0c, 0xc8, 0xe3, 0xdd, 0x4c, 0x72, 0x08,
- 0x6a, 0x3d, 0x89, 0x70, 0x10, 0x43, 0x98, 0x9d, 0x62, 0xe7, 0x92, 0xd9,
- 0x81, 0xdd, 0x4b, 0x7d, 0x75, 0xbd, 0x92, 0xce, 0xc8, 0x65, 0xbc, 0xcd,
- 0x96, 0x34, 0x3d, 0x21, 0x21, 0xc8, 0x20, 0x6e, 0x73, 0xaa, 0x0f, 0xad,
- 0x3a, 0x2d, 0x3f, 0xd3, 0xe6, 0x28, 0xad, 0xb4, 0x86, 0x4b, 0xf6, 0xce,
- 0x74, 0xad, 0x2f, 0x1c, 0x28, 0xe4, 0xeb, 0xcd, 0x6c, 0x0d, 0x78, 0x33,
- 0x1f, 0x55, 0x96, 0xaa, 0xd0, 0xad, 0xf2, 0xfa, 0x23, 0x8d, 0x51, 0x50,
- 0x24, 0xd4, 0xae, 0x3b, 0xf1, 0x1c, 0x58, 0xa8, 0x1a, 0x9b, 0xb6, 0x4a,
- 0xb9, 0x02, 0x0a, 0x58, 0xf4, 0xa6, 0xd8, 0x5d, 0x12, 0xba, 0xfe, 0xca,
- 0x73, 0x10, 0xcd, 0xf7, 0x94, 0xc7, 0xaa, 0xec, 0x11, 0x69, 0xc8, 0x1c,
- 0x29, 0x48, 0xce, 0x8d, 0xba, 0x6b, 0xf7, 0x88, 0x97, 0x12, 0x68, 0xde,
- 0xc1, 0xae, 0xa1, 0x4b, 0x70, 0xbb, 0x7b, 0x79, 0x11, 0xab, 0x26, 0x48,
- 0x7d, 0x91, 0x9a, 0x68, 0x13, 0x6b, 0x13, 0x3a, 0xb4, 0x84, 0x04, 0xa9,
- 0x4c, 0x37, 0x40, 0x55, 0x04, 0x90, 0x21, 0x1f, 0x11, 0x42, 0x1b, 0xa8,
- 0x6a, 0xb7, 0x11, 0x35, 0x19, 0x70, 0xe2, 0x9c, 0x4e, 0x4a, 0x77, 0x94,
- 0x59, 0x8b, 0x5a, 0x27, 0x9d, 0xfe, 0x34, 0x42, 0x9b, 0x5d, 0x3a, 0xd3,
- 0xf2, 0xae, 0x40, 0x99, 0x95, 0x24, 0xb4, 0x6b, 0xd0, 0xfd, 0x79, 0x8c,
- 0xa7, 0xc5, 0xbb, 0x5b, 0xf7, 0x77, 0x43, 0x8f, 0x0a, 0x15, 0x8f, 0xc1,
- 0x24, 0x0f, 0xf2, 0xc5, 0xc3, 0x13, 0x48, 0xcb, 0xa6, 0xd4, 0x33, 0x2d,
- 0x11, 0xe3, 0x4a, 0x3f, 0x2f, 0xaf, 0xaf, 0x91, 0x48, 0x12, 0x74, 0x91,
- 0x11, 0x85, 0x02, 0x80, 0x10, 0x5e, 0x3b, 0x23, 0xcf, 0xd1, 0x73, 0x9d,
- 0x0d, 0x07, 0x5b, 0x14, 0xc9, 0x53, 0x3b, 0x2e, 0x98, 0x95, 0x90, 0x61,
- 0xe0, 0x65, 0xe4, 0x9c, 0xfb, 0xb0, 0xac, 0x2a, 0x1b, 0x58, 0x66, 0xed,
- 0xae, 0x50, 0x0c, 0xe2, 0x18, 0x2a, 0x1c, 0xe1, 0x74, 0x58, 0x2d, 0x06,
- 0xd7, 0x3a, 0x09, 0xc9, 0xd5, 0x66, 0x13, 0x2a, 0xc9, 0xc5, 0xca, 0xe9,
- 0xe3, 0x9c, 0xff, 0x5b, 0xd9, 0x84, 0xca, 0x56, 0xce, 0x47, 0x58, 0x37,
- 0x9e, 0x26, 0x64, 0x9d, 0x83, 0xc0, 0x49, 0x45, 0x5f, 0x6d, 0x7a, 0x3a,
- 0xdc, 0x0f, 0x96, 0xb6, 0x9e, 0x0d, 0x26, 0x93, 0xc9, 0x00, 0x0a, 0xc1,
- 0x4b, 0xd6, 0x52, 0x76, 0x44, 0x4b, 0x58, 0xe1, 0x3c, 0x00, 0x0a, 0x18,
- 0xc5, 0x15, 0x8e, 0x8e, 0x44, 0xa1, 0xb9, 0xbc, 0xe9, 0xa8, 0x16, 0x36,
- 0xd9, 0x51, 0x54, 0xab, 0x18, 0xbf, 0x50, 0x7d, 0xb3, 0x6c, 0xa6, 0xa8,
- 0xab, 0x42, 0x42, 0x43, 0xa5, 0xb0, 0x45, 0xb1, 0x76, 0x28, 0x29, 0x4a,
- 0xb3, 0x1c, 0x8c, 0x10, 0xd0, 0xb6, 0x03, 0xcc, 0xdf, 0x82, 0x89, 0x30,
- 0xf1, 0xa2, 0xb4, 0xdd, 0xad, 0xda, 0xc0, 0x5d, 0xf5, 0xb3, 0x46, 0xb5,
- 0x83, 0x75, 0xc4, 0xbb, 0x65, 0x5b, 0xc1, 0x67, 0xd3, 0xbc, 0xd1, 0x9a,
- 0xa8, 0xfc, 0xad, 0x6e, 0xdb, 0x0f, 0xac, 0x87, 0x4c, 0x75, 0x7b, 0x49,
- 0x9e, 0xaf, 0x5c, 0x92, 0xe8, 0xe4, 0x93, 0x79, 0x45, 0xd3, 0xbe, 0x75,
- 0x04, 0x3e, 0x8b, 0x23, 0x39, 0x12, 0x47, 0x37, 0x14, 0x70, 0x9a, 0xd1,
- 0xe2, 0x98, 0x2e, 0xd7, 0x2c, 0x06, 0x94, 0x2e, 0x7e, 0x74, 0xba, 0x73,
- 0x79, 0xda, 0x4d, 0xf3, 0xa2, 0x5a, 0x22, 0x95, 0x96, 0xe3, 0x69, 0xf9,
- 0x3e, 0x79, 0x8a, 0xfc, 0x72, 0xc4, 0x76, 0x87, 0xf3, 0x57, 0xa2, 0x69,
- 0x42, 0xcb, 0x42, 0x41, 0x3d, 0xf6, 0x1a, 0x2f, 0xb2, 0x02, 0xf8, 0x79,
- 0x25, 0xa9, 0x66, 0xb8, 0x72, 0x9d, 0xbc, 0x3b, 0xbc, 0x24, 0xa0, 0x4e,
- 0x23, 0x79, 0x31, 0xe4, 0x0b, 0xea, 0x36, 0xa7, 0x94, 0x24, 0x96, 0xc4,
- 0x21, 0x9d, 0x38, 0x5e, 0x4c, 0xd5, 0xda, 0x79, 0xf9, 0x6a, 0xdd, 0x78,
- 0xeb, 0xa6, 0xdf, 0x4c, 0xa9, 0xdc, 0x0f, 0xdd, 0x3d, 0xdf, 0x5d, 0x8d,
- 0xbd, 0xe8, 0x6a, 0xf0, 0x04, 0xc4, 0x8f, 0xc3, 0x85, 0x08, 0x73, 0x9d,
- 0x68, 0x57, 0x4d, 0x16, 0xdd, 0x9f, 0x95, 0xd7, 0x39, 0xb9, 0x04, 0xb1,
- 0x5e, 0xd8, 0xd7, 0x5a, 0x50, 0xaa, 0x2b, 0x83, 0x79, 0x76, 0x6a, 0xc6,
- 0x14, 0xb5, 0x11, 0x62, 0x7c, 0x44, 0xe8, 0xa6, 0xb0, 0x73, 0xaa, 0x24,
- 0x48, 0x16, 0x24, 0x1a, 0x66, 0xef, 0x83, 0x91, 0x20, 0x9f, 0x18, 0x5b,
- 0x61, 0x72, 0x3f, 0x14, 0x1c, 0x72, 0xdd, 0x0e, 0x8e, 0xe6, 0x2d, 0x06,
- 0x04, 0x75, 0x95, 0xd6, 0xcb, 0x45, 0x14, 0xce, 0x24, 0x23, 0x5c, 0xeb,
- 0x90, 0x7f, 0xde, 0xba, 0x3e, 0xbe, 0x26, 0xd3, 0xec, 0x3a, 0xb8, 0x76,
- 0x2d, 0x7d, 0x7a, 0x24, 0xe5, 0x1c, 0xda, 0x2a, 0xca, 0x3f, 0x49, 0xb9,
- 0x14, 0x57, 0x4c, 0x86, 0x4d, 0xad, 0xc1, 0xb4, 0x1f, 0xa5, 0x65, 0xeb,
- 0x77, 0x49, 0x98, 0x39, 0x21, 0xbe, 0xcd, 0x86, 0xe4, 0x65, 0xd4, 0xe5,
- 0x16, 0x2c, 0xd9, 0x69, 0xee, 0xeb, 0x63, 0x47, 0xa1, 0xe7, 0x45, 0xcf,
- 0x95, 0x93, 0xd1, 0xd1, 0xeb, 0x81, 0xd9, 0x92, 0x02, 0x4e, 0x77, 0x54,
- 0x3f, 0xe2, 0x6e, 0x85, 0xb5, 0xc3, 0xfa, 0xec, 0xa5, 0xe3, 0xe5, 0xe2,
- 0xf3, 0xa1, 0xcc, 0x85, 0x2a, 0xb2, 0xa8, 0x46, 0xaa, 0x30, 0x92, 0x6d,
- 0xfe, 0xe7, 0xa6, 0x23, 0x8a, 0x1d, 0xae, 0x4c, 0x51, 0xcf, 0x8b, 0x76,
- 0xe5, 0x12, 0x9d, 0x9f, 0x13, 0xcc, 0x04, 0x85, 0x9b, 0xfa, 0xae, 0xd3,
- 0xf6, 0xdb, 0x71, 0x8a, 0xa9, 0x07, 0x7a, 0xf4, 0xcd, 0xf1, 0xe1, 0x6b,
- 0x0b, 0xf5, 0xff, 0x95, 0x4c, 0xca, 0x70, 0x8f, 0x78, 0x05, 0xd3, 0x25,
- 0x2b, 0x60, 0x85, 0x8b, 0xc4, 0xba, 0xc1, 0xc6, 0x19, 0xd3, 0x01, 0x2e,
- 0xd5, 0x67, 0x82, 0xf5, 0xd1, 0xad, 0x8a, 0xdd, 0x62, 0x54, 0x36, 0xaa,
- 0x4e, 0x4a, 0x67, 0x64, 0x25, 0x2b, 0xde, 0x4a, 0x27, 0x89, 0xe7, 0x70,
- 0x56, 0xe7, 0x35, 0x29, 0xcd, 0x8c, 0x15, 0xf3, 0xb6, 0xf2, 0x35, 0xb6,
- 0xf2, 0xac, 0x1c, 0x97, 0x57, 0x57, 0x6b, 0xee, 0x77, 0xe6, 0x26, 0x00,
- 0xa6, 0x8b, 0xb7, 0x4c, 0x8f, 0xa6, 0x91, 0xde, 0x1b, 0x33, 0x77, 0x45,
- 0x65, 0x0e, 0x5b, 0x6f, 0xc8, 0x47, 0x40, 0x4a, 0x7a, 0xc5, 0x0a, 0x5c,
- 0xdb, 0x60, 0x82, 0x1a, 0x10, 0x6a, 0xef, 0x01, 0x1a, 0xcd, 0x9e, 0x19,
- 0x8e, 0x66, 0x7b, 0x24, 0x6f, 0x75, 0xf2, 0xdf, 0xff, 0xf8, 0xf1, 0xe7,
- 0x08, 0xcd, 0x1d, 0xf9, 0xfe, 0x24, 0x13, 0xc6, 0x3c, 0xad, 0xc4, 0x49,
- 0x96, 0x8a, 0xcc, 0x55, 0xd6, 0x23, 0x0d, 0x2c, 0x9b, 0x5d, 0x49, 0xb2,
- 0x51, 0x2c, 0x9e, 0x22, 0xb5, 0x2d, 0xf4, 0x83, 0x60, 0xd9, 0x2e, 0x1b,
- 0x45, 0x22, 0x13, 0x71, 0x14, 0xd8, 0x62, 0x1d, 0x88, 0xc7, 0xd2, 0xca,
- 0xf0, 0x4a, 0x04, 0xb9, 0x73, 0x8e, 0xd2, 0xd5, 0xa2, 0xba, 0xec, 0x06,
- 0x3c, 0xb1, 0x5e, 0x4f, 0x6f, 0x25, 0x6c, 0x34, 0x75, 0x55, 0x4e, 0x66,
- 0x42, 0x95, 0xa7, 0xb7, 0x93, 0x37, 0xa8, 0x41, 0xec, 0x25, 0x44, 0x62,
- 0x0b, 0xfe, 0x1b, 0x8e, 0xbc, 0xcd, 0x2e, 0x15, 0x0c, 0x5e, 0xb4, 0x1a,
- 0x89, 0x18, 0x88, 0xd8, 0xfc, 0xec, 0x64, 0xc0, 0xd2, 0x70, 0x01, 0xc0,
- 0x12, 0x70, 0x25, 0xad, 0x8d, 0xa0, 0xae, 0x77, 0x49, 0x8e, 0x21, 0x5c,
- 0x44, 0x10, 0x87, 0x62, 0x1c, 0xf5, 0xd0, 0x2b, 0x1e, 0x51, 0xfa, 0xd1,
- 0x2d, 0xea, 0xb4, 0xd6, 0xb1, 0x97, 0x50, 0x06, 0x17, 0xfd, 0xaa, 0xe3,
- 0x7c, 0xe3, 0x04, 0x22, 0x27, 0xd0, 0x0b, 0xc0, 0xfb, 0x64, 0x44, 0x73,
- 0xd1, 0x15, 0xb9, 0x86, 0x91, 0x34, 0x44, 0xe3, 0xf5, 0x26, 0xce, 0xab,
- 0x78, 0x99, 0xbc, 0xe4, 0x3f, 0x57, 0xc1, 0x04, 0x8f, 0x41, 0x3b, 0x2f,
- 0xcf, 0x9a, 0xb1, 0x6a, 0x11, 0x12, 0xd9, 0x6e, 0x2a, 0x02, 0xa1, 0x8b,
- 0x0b, 0xd0, 0x37, 0x26, 0x4a, 0x3d, 0xa0, 0xd5, 0x10, 0xe0, 0x12, 0xbf,
- 0x8c, 0x00, 0xe8, 0x64, 0xb9, 0x8e, 0x25, 0x0a, 0x30, 0x83, 0xe8, 0x5e,
- 0x96, 0x6a, 0x98, 0xc4, 0x58, 0x5a, 0x15, 0x96, 0x80, 0x73, 0xc3, 0xe7,
- 0x9a, 0x8a, 0x80, 0xa6, 0x66, 0xbe, 0xea, 0xc6, 0x28, 0x63, 0xda, 0x5f,
- 0x7a, 0xec, 0x46, 0xf0, 0x4d, 0xd0, 0xea, 0x99, 0x9d, 0xab, 0x8e, 0xfa,
- 0xa1, 0x04, 0xa3, 0x25, 0xfe, 0x66, 0x50, 0xbd, 0xb3, 0x85, 0xcd, 0xf2,
- 0x7c, 0x49, 0xa2, 0x85, 0xab, 0xa9, 0x83, 0x8e, 0xa9, 0xe2, 0x94, 0xe7,
- 0xc8, 0xb9, 0x95, 0xaf, 0xfb, 0x7e, 0x8c, 0xee, 0xfd, 0xe1, 0x7f, 0xa6,
- 0xad, 0x15, 0x85, 0x82, 0xcb, 0xcc, 0x1d, 0xa4, 0x1b, 0xd2, 0x20, 0x9a,
- 0x2a, 0x9f, 0x7c, 0xcc, 0x01, 0x67, 0x5a, 0x42, 0xb0, 0xa4, 0x85, 0xda,
- 0x31, 0xdc, 0x4d, 0xc7, 0x77, 0x33, 0x25, 0x37, 0xdc, 0x5f, 0x56, 0xb2,
- 0x83, 0x82, 0x44, 0x83, 0x14, 0x58, 0x4a, 0xa4, 0xd7, 0xfe, 0xcc, 0x80,
- 0xd1, 0xb1, 0xe7, 0x44, 0x45, 0x06, 0xd5, 0x3d, 0x84, 0xd4, 0x8a, 0x50,
- 0x7b, 0x64, 0x28, 0x5a, 0x00, 0x03, 0x54, 0xcb, 0xe1, 0x50, 0x99, 0x2d,
- 0x08, 0xe9, 0xa1, 0xd1, 0x8a, 0xe6, 0xe5, 0xad, 0xa3, 0xe0, 0x40, 0xbd,
- 0x57, 0x9e, 0x1e, 0x23, 0x68, 0xae, 0xf3, 0xdb, 0x28, 0xad, 0x63, 0x6a,
- 0x3b, 0xc6, 0x09, 0x07, 0xda, 0x0d, 0xc7, 0x0c, 0xae, 0x71, 0x16, 0x76,
- 0x95, 0x50, 0x36, 0xae, 0xcc, 0x6c, 0x70, 0x76, 0x67, 0x24, 0x3b, 0x51,
- 0x6d, 0xea, 0xc0, 0x6c, 0xfc, 0xa4, 0xf7, 0x4d, 0x59, 0x37, 0x07, 0x3d,
- 0x4b, 0x2c, 0x03, 0x2b, 0x9f, 0x79, 0x5b, 0xfc, 0x9d, 0x23, 0x65, 0x17,
- 0x06, 0x51, 0x2a, 0x54, 0xb9, 0x43, 0x8c, 0x48, 0x93, 0xa7, 0x15, 0xad,
- 0xc2, 0xa9, 0x49, 0x2e, 0x8f, 0x9e, 0xb6, 0xfc, 0x3c, 0x97, 0x3e, 0xd4,
- 0xcb, 0xc9, 0x4d, 0x08, 0x60, 0xa3, 0x2e, 0xfd, 0x30, 0x38, 0xc2, 0xc7,
- 0x07, 0xdf, 0xa0, 0xb9, 0x3f, 0xf7, 0xac, 0xfb, 0xa1, 0xfb, 0xab, 0x83,
- 0xb0, 0xdc, 0x9b, 0x73, 0xcb, 0xf3, 0x15, 0x68, 0xab, 0x8b, 0x22, 0xba,
- 0x29, 0x1d, 0x94, 0x2a, 0x56, 0xd3, 0xe9, 0x8e, 0x2e, 0xb8, 0xf0, 0x11,
- 0x16, 0xcd, 0x2a, 0xde, 0xfc, 0x45, 0x45, 0x51, 0x2d, 0x2a, 0x93, 0x39,
- 0x28, 0xaf, 0x06, 0xa8, 0x8d, 0x33, 0x4f, 0xab, 0x8f, 0x14, 0x21, 0xf7,
- 0x4e, 0x1d, 0x60, 0xf7, 0xc8, 0x42, 0x9d, 0x4e, 0x63, 0x97, 0x04, 0x70,
- 0xa1, 0x88, 0xae, 0xca, 0xc6, 0x97, 0x0e, 0xc9, 0x42, 0x1e, 0x88, 0x8f,
- 0x08, 0xaf, 0x5b, 0xda, 0x4d, 0x4a, 0xe8, 0x5a, 0xcb, 0xd2, 0xd9, 0xe7,
- 0x7b, 0x04, 0xa3, 0x86, 0x36, 0x31, 0x67, 0xc7, 0x02, 0xbc, 0x21, 0xcb,
- 0x05, 0x74, 0x5e, 0x4a, 0x65, 0x5f, 0x69, 0x09, 0x20, 0x0f, 0xf5, 0x50,
- 0x69, 0xfc, 0xa4, 0xa4, 0x3d, 0x0c, 0x83, 0x0c, 0x55, 0x52, 0xa5, 0x96,
- 0xbc, 0xd0, 0xd4, 0x86, 0xed, 0x90, 0xe3, 0x4e, 0x00, 0xe9, 0x9f, 0x0d,
- 0x9f, 0x7c, 0x46, 0x55, 0xc8, 0x2d, 0xeb, 0x90, 0xf2, 0xeb, 0x39, 0x99,
- 0x89, 0xa5, 0xf4, 0xf6, 0x57, 0x77, 0x57, 0xd1, 0x49, 0xd3, 0x02, 0x52,
- 0x62, 0x58, 0xa2, 0x89, 0x95, 0x40, 0xd6, 0x15, 0xc0, 0x2f, 0x6c, 0xa5,
- 0x37, 0xa4, 0x52, 0x0d, 0xde, 0x19, 0x39, 0x77, 0x90, 0xfc, 0x57, 0x99,
- 0xf5, 0x00, 0x20, 0xed, 0xe0, 0x47, 0x83, 0x14, 0xc3, 0xc3, 0x8b, 0x77,
- 0x27, 0xef, 0xbe, 0x3e, 0xb0, 0xe7, 0x1e, 0x85, 0xaa, 0x14, 0x49, 0xec,
- 0xc7, 0xbc, 0x5c, 0xc1, 0x53, 0x3c, 0x82, 0x5c, 0xff, 0xd9, 0x6c, 0x05,
- 0x75, 0x08, 0x1c, 0xcf, 0x19, 0x67, 0xfa, 0xc1, 0xc0, 0x6c, 0xd7, 0x10,
- 0xb3, 0x15, 0x11, 0x04, 0x04, 0x88, 0x3b, 0xa4, 0x29, 0x03, 0xcd, 0x80,
- 0x1d, 0xbc, 0xad, 0x22, 0x7c, 0x16, 0x58, 0x5e, 0x18, 0x45, 0x23, 0xb5,
- 0x8a, 0xaa, 0x4a, 0x96, 0x8c, 0xb3, 0x93, 0x20, 0x29, 0xc2, 0x10, 0x20,
- 0x90, 0x61, 0xf0, 0xb6, 0xd7, 0x2c, 0x3f, 0x41, 0xf2, 0xef, 0x57, 0xa3,
- 0x46, 0x75, 0x29, 0x52, 0x26, 0x73, 0x68, 0x83, 0x76, 0x56, 0x56, 0xe8,
- 0x2d, 0xae, 0xb4, 0xb1, 0x56, 0x8e, 0x63, 0x6d, 0x5c, 0x7f, 0xea, 0xca,
- 0x2f, 0xd8, 0xf1, 0x3f, 0x1a, 0x76, 0xe6, 0xd5, 0x17, 0xe4, 0x7a, 0xd7,
- 0x30, 0x95, 0xbd, 0x93, 0xbc, 0x53, 0x41, 0xc2, 0xc6, 0x00, 0x12, 0xf4,
- 0x96, 0x5e, 0xa3, 0xee, 0xf2, 0xbf, 0xe1, 0xcb, 0x7f, 0xb6, 0x08, 0x52,
- 0x17, 0x09, 0x11, 0x9d, 0xd0, 0x6f, 0x54, 0xeb, 0x26, 0x0f, 0x23, 0x97,
- 0xe0, 0x15, 0xcc, 0x4c, 0xbb, 0x56, 0x96, 0xb2, 0x38, 0xb3, 0xac, 0x0b,
- 0xaf, 0x19, 0xca, 0x2f, 0xca, 0x38, 0xbf, 0x0d, 0xde, 0x30, 0x6b, 0xa5,
- 0xd1, 0x1c, 0x2f, 0x96, 0xe3, 0xf9, 0xf4, 0x59, 0xf2, 0xd2, 0xfc, 0x27,
- 0xd0, 0x3d, 0x80, 0xef, 0x19, 0x1d, 0x69, 0x7d, 0xcf, 0x54, 0xb3, 0x2c,
- 0x44, 0xd1, 0xa5, 0xbf, 0x3e, 0xd9, 0x37, 0x3d, 0xfd, 0x94, 0x6a, 0x7e,
- 0xb0, 0x51, 0x91, 0xae, 0xf3, 0xa6, 0x8e, 0x96, 0xdf, 0xd5, 0xf4, 0x15,
- 0x8f, 0xeb, 0x98, 0x56, 0x7c, 0x6f, 0xff, 0xf3, 0x64, 0x9c, 0x37, 0xc9,
- 0xdb, 0xd7, 0xcf, 0x12, 0xa3, 0xa8, 0x4f, 0x3e, 0xd6, 0xcb, 0xb9, 0x4a,
- 0x29, 0xa9, 0x24, 0x45, 0xfd, 0xdc, 0xec, 0x2a, 0x0b, 0xa6, 0xe3, 0xb3,
- 0x7c, 0x92, 0x7c, 0xcc, 0xee, 0x7d, 0x80, 0x0f, 0x55, 0xb1, 0xa8, 0x6d,
- 0x4d, 0x04, 0x71, 0x00, 0x3a, 0x69, 0x8a, 0xd8, 0x0e, 0xc7, 0x3f, 0x23,
- 0xfe, 0x25, 0x33, 0x07, 0xe6, 0xe3, 0x35, 0x97, 0x9e, 0x58, 0x6b, 0x55,
- 0x7f, 0xd6, 0x72, 0x4c, 0xec, 0x62, 0x29, 0xcd, 0xf9, 0xde, 0x1b, 0xee,
- 0xae, 0x4a, 0xf3, 0x40, 0x28, 0xb1, 0x95, 0xff, 0x05, 0xed, 0x58, 0xaa,
- 0xe3, 0x24, 0xe6, 0x4d, 0x5f, 0x37, 0xe1, 0x78, 0x47, 0xac, 0xc0, 0xb2,
- 0xd5, 0x0f, 0xd8, 0x20, 0xa2, 0x12, 0x4e, 0x7e, 0x43, 0x8f, 0x05, 0x44,
- 0x4a, 0x77, 0xf7, 0xc4, 0x0d, 0x43, 0xff, 0x6a, 0x39, 0xbe, 0xe4, 0xd7,
- 0x2b, 0x8a, 0xc3, 0x04, 0xb9, 0x6c, 0x9d, 0xb1, 0xec, 0xad, 0xed, 0x86,
- 0xd7, 0x0f, 0xcc, 0x9d, 0x9b, 0x3c, 0x4b, 0x24, 0xc4, 0xfd, 0xd1, 0x39,
- 0x0f, 0xfd, 0xd2, 0x21, 0xb9, 0x0f, 0xde, 0x30, 0x22, 0x3f, 0x2f, 0xab,
- 0x01, 0xa9, 0x49, 0xb3, 0x6c, 0x1a, 0x5c, 0x5b, 0xb1, 0xc5, 0xc0, 0x39,
- 0x46, 0x61, 0x40, 0xf6, 0x76, 0xc3, 0xab, 0x43, 0x6e, 0x23, 0x0c, 0xc9,
- 0x8a, 0xd0, 0x18, 0x7e, 0x8f, 0x9e, 0xd8, 0xd9, 0xb7, 0x5a, 0x11, 0xfe,
- 0x49, 0x53, 0xfa, 0x7e, 0x71, 0x5d, 0xa5, 0x53, 0x54, 0x66, 0xf3, 0x19,
- 0x0c, 0x12, 0x74, 0x2e, 0x49, 0x56, 0xf5, 0xce, 0x23, 0x41, 0x12, 0xff,
- 0x8f, 0xa5, 0x5f, 0xd0, 0x4f, 0xd5, 0x94, 0x8f, 0xe0, 0x28, 0x4a, 0xe9,
- 0xa7, 0x8e, 0x06, 0x2a, 0x96, 0x78, 0x5f, 0x37, 0x02, 0x1a, 0x92, 0x06,
- 0x5a, 0xa0, 0x3a, 0x62, 0x6a, 0xe1, 0xcb, 0xc5, 0xb2, 0xc5, 0x4e, 0x1d,
- 0x5d, 0x69, 0x90, 0x03, 0xca, 0x8b, 0x2b, 0x06, 0x07, 0xcd, 0xd0, 0xea,
- 0xdc, 0xbd, 0x15, 0xcb, 0xf1, 0x68, 0x36, 0x87, 0xae, 0x6c, 0xef, 0x72,
- 0x3f, 0xf1, 0x68, 0x86, 0x8f, 0xdb, 0xdc, 0xbb, 0xfd, 0x68, 0xef, 0x68,
- 0xbb, 0xf9, 0x9b, 0xbf, 0x95, 0xd6, 0xf7, 0x22, 0xb2, 0xb9, 0x7e, 0xd5,
- 0x59, 0xd8, 0x5f, 0xe7, 0x06, 0x35, 0x8a, 0x6d, 0x3a, 0x5b, 0x98, 0x5b,
- 0x54, 0xbe, 0xf0, 0xa8, 0xf9, 0xe9, 0x2e, 0x73, 0x8c, 0x1b, 0xeb, 0x17,
- 0xcc, 0x4f, 0x77, 0x6e, 0x7c, 0x59, 0xe6, 0xcf, 0x4f, 0x77, 0x2d, 0xd7,
- 0x32, 0x6d, 0x31, 0xf9, 0x80, 0x16, 0xf8, 0x18, 0xcc, 0xb2, 0xe2, 0x3a,
- 0xc8, 0xa0, 0xe6, 0x22, 0x7e, 0x9a, 0xe4, 0x6d, 0x0e, 0x06, 0xfd, 0xb5,
- 0x9f, 0x9c, 0x30, 0x6f, 0x01, 0x17, 0x8b, 0xe6, 0xd7, 0x4f, 0xf1, 0xba,
- 0x2d, 0x1a, 0x2d, 0x8e, 0xa8, 0x48, 0x6a, 0x43, 0x3e, 0x59, 0x72, 0xf9,
- 0xad, 0x25, 0xd7, 0xfb, 0x23, 0x1d, 0x4e, 0xfd, 0x0a, 0xd5, 0xb2, 0xc0,
- 0x85, 0x75, 0xb8, 0xa0, 0xac, 0x29, 0x23, 0xa3, 0x3e, 0xb9, 0x12, 0xc5,
- 0x11, 0x37, 0x9c, 0x94, 0x0c, 0x47, 0x61, 0x63, 0x06, 0xed, 0x74, 0xbb,
- 0x83, 0xd6, 0x39, 0x63, 0x6d, 0x46, 0x30, 0xb5, 0x8a, 0x95, 0x98, 0x7d,
- 0x63, 0x4d, 0x5d, 0x07, 0x14, 0x34, 0xe3, 0xfb, 0x26, 0x82, 0x20, 0xa5,
- 0x51, 0xd3, 0x2c, 0x6c, 0xd5, 0x12, 0xa2, 0x7e, 0xfa, 0x7c, 0xb8, 0xbb,
- 0xdd, 0xa7, 0xca, 0x05, 0x0b, 0xcc, 0x00, 0x41, 0xfc, 0xec, 0x5d, 0x4f,
- 0x08, 0xd7, 0xfc, 0x9a, 0xec, 0x0a, 0xd8, 0x60, 0x91, 0x00, 0x8e, 0x97,
- 0x72, 0xa3, 0x71, 0x47, 0x49, 0xb5, 0x6d, 0x93, 0xef, 0xe4, 0x7d, 0x50,
- 0x3c, 0xc2, 0x83, 0xd0, 0xf5, 0x1d, 0x8a, 0x5f, 0xc1, 0x16, 0x2a, 0x19,
- 0x38, 0x7a, 0x11, 0xe8, 0x67, 0x4c, 0x61, 0x04, 0xf7, 0x69, 0xfb, 0xd7,
- 0x78, 0x2f, 0xbc, 0x55, 0x61, 0x0b, 0x40, 0xaf, 0x94, 0xaa, 0xb3, 0x64,
- 0xfa, 0xf7, 0xc9, 0xfd, 0x69, 0x6d, 0x7d, 0x97, 0xf2, 0x8e, 0x16, 0xf5,
- 0xe8, 0x44, 0x76, 0x27, 0x01, 0xef, 0x86, 0xc3, 0x35, 0x47, 0xea, 0xb6,
- 0xef, 0x4a, 0xb7, 0x7b, 0x03, 0xfe, 0xc8, 0x03, 0xae, 0x63, 0xa0, 0x6e,
- 0x4e, 0xcf, 0x6e, 0xd3, 0x9e, 0x78, 0x79, 0x36, 0xe2, 0x0e, 0xb0, 0xc5,
- 0x4f, 0x38, 0x83, 0x39, 0xe9, 0x69, 0x6b, 0xbd, 0x6e, 0x5f, 0x46, 0xa7,
- 0x3e, 0x33, 0x12, 0x23, 0x16, 0x1d, 0x27, 0xee, 0xa1, 0x11, 0xc7, 0xc1,
- 0x23, 0x95, 0x05, 0x48, 0xc4, 0x78, 0xf5, 0xa1, 0xe6, 0xcf, 0x53, 0xaa,
- 0x38, 0xcb, 0xb1, 0x88, 0x16, 0x73, 0xd7, 0xd1, 0xa1, 0x0f, 0xfa, 0x36,
- 0xa2, 0xa0, 0x98, 0xce, 0x32, 0xa8, 0x12, 0x29, 0xa5, 0x8f, 0x06, 0xfb,
- 0xd0, 0x11, 0xd2, 0x71, 0x4a, 0xbe, 0xe4, 0xff, 0x21, 0xdd, 0xca, 0xeb,
- 0x93, 0x47, 0xae, 0x95, 0xac, 0x1e, 0x2c, 0x61, 0x06, 0x2c, 0x9c, 0xac,
- 0x35, 0xc9, 0x0e, 0x4e, 0x16, 0x59, 0x2b, 0xf6, 0x4e, 0x17, 0x50, 0x5e,
- 0x8d, 0xb4, 0x2b, 0x97, 0xe4, 0xfb, 0xc5, 0x71, 0x92, 0x7c, 0x11, 0x49,
- 0x11, 0x39, 0xe8, 0xda, 0x57, 0x9a, 0x84, 0x07, 0xe6, 0xa0, 0x9b, 0xf4,
- 0xd3, 0xa7, 0x61, 0x9d, 0xed, 0x98, 0xed, 0x53, 0xef, 0xd4, 0xf5, 0x8c,
- 0xa6, 0xa1, 0x46, 0xce, 0x96, 0x2f, 0x89, 0x1c, 0xc9, 0x2a, 0x33, 0x4d,
- 0x75, 0x63, 0xf0, 0xb2, 0x9e, 0xe4, 0x19, 0xf1, 0x51, 0xec, 0x7c, 0x6e,
- 0x5c, 0xac, 0xc3, 0xb6, 0x33, 0xb4, 0x99, 0x6a, 0x94, 0x82, 0x5e, 0xad,
- 0x82, 0x4c, 0x25, 0xbc, 0xcd, 0xbd, 0xe8, 0xb5, 0x19, 0x9e, 0x45, 0x16,
- 0x99, 0x7d, 0x50, 0x68, 0x52, 0x8c, 0xb0, 0xb9, 0x71, 0xe9, 0x91, 0x48,
- 0x89, 0xe3, 0x55, 0x56, 0xa6, 0x37, 0x34, 0xc2, 0x60, 0x1d, 0xec, 0xd9,
- 0xd9, 0xb9, 0xbb, 0xbb, 0x1b, 0xae, 0x33, 0x33, 0x7f, 0x3f, 0x96, 0xb3,
- 0x36, 0x2d, 0xa4, 0x77, 0x00, 0x9f, 0x62, 0x6f, 0x2c, 0x6e, 0x9f, 0xae,
- 0x23, 0x1b, 0x6a, 0x5a, 0x57, 0x29, 0x6d, 0x8c, 0xd9, 0xad, 0x65, 0xac,
- 0x2a, 0x5b, 0xd4, 0xa2, 0x19, 0xfb, 0x8e, 0xfb, 0x91, 0x2c, 0x1a, 0x50,
- 0x4b, 0x94, 0x36, 0xe7, 0x08, 0x28, 0x49, 0x62, 0xb5, 0x5c, 0xdd, 0x6d,
- 0xef, 0x42, 0xec, 0xea, 0x9f, 0x6d, 0xca, 0x3f, 0x5f, 0x6f, 0x7d, 0x1e,
- 0x6a, 0x15, 0xc4, 0x73, 0xe9, 0x8d, 0xf9, 0xb9, 0x8c, 0xf9, 0xf9, 0x3f,
- 0x37, 0xe6, 0xe7, 0xbf, 0x7e, 0xcc, 0x4f, 0xff, 0xe5, 0x63, 0xfe, 0x2b,
- 0x8d, 0xf9, 0xaf, 0xcb, 0xe2, 0xe3, 0xa0, 0xa6, 0x6a, 0xa8, 0x46, 0x95,
- 0x16, 0xca, 0xbf, 0xb8, 0xf2, 0xd4, 0xe2, 0x54, 0x22, 0x97, 0x83, 0x2d,
- 0x70, 0xd3, 0x29, 0x52, 0xed, 0x8a, 0xa2, 0xf5, 0x57, 0x13, 0xfa, 0x7b,
- 0xee, 0xb7, 0x9c, 0x40, 0xe3, 0xf5, 0x84, 0xb4, 0x5c, 0x88, 0xb6, 0x9e,
- 0x74, 0xc7, 0x16, 0xb2, 0xee, 0x0d, 0xfd, 0xc2, 0x6c, 0x41, 0x52, 0x5b,
- 0x6d, 0xa4, 0x29, 0x9c, 0xb7, 0xcc, 0x6d, 0x60, 0xfd, 0xd6, 0x8e, 0x52,
- 0x1e, 0xc9, 0x78, 0x45, 0x76, 0x97, 0x68, 0xcb, 0x84, 0x10, 0x27, 0x7f,
- 0x54, 0x08, 0xa1, 0xbd, 0xbc, 0x5f, 0x50, 0x73, 0x5a, 0xc5, 0xab, 0xd6,
- 0x4a, 0x07, 0xda, 0xc3, 0xa4, 0xdb, 0x39, 0x85, 0xb9, 0x92, 0x77, 0x6d,
- 0x33, 0xb8, 0xb0, 0x26, 0xb3, 0x92, 0x8e, 0x2b, 0xdd, 0xf0, 0x6b, 0x8e,
- 0x62, 0xa7, 0x10, 0x77, 0x40, 0xdd, 0xe8, 0xab, 0x6b, 0x1f, 0xb3, 0x6c,
- 0x91, 0xce, 0x90, 0x9f, 0x45, 0x51, 0x8a, 0x55, 0x34, 0x68, 0xed, 0x8d,
- 0x81, 0xb2, 0xef, 0x6c, 0xae, 0xe0, 0xad, 0xc4, 0x47, 0x93, 0x6b, 0x36,
- 0x30, 0xad, 0x26, 0xca, 0xaa, 0xe7, 0xd3, 0x20, 0x4f, 0x5e, 0x34, 0x15,
- 0x8d, 0x56, 0xd8, 0x4e, 0x90, 0x05, 0x32, 0x96, 0x5c, 0x41, 0x04, 0xc7,
- 0xa9, 0x75, 0xcd, 0x95, 0x27, 0xba, 0xa5, 0xfc, 0x36, 0x9f, 0x2e, 0x03,
- 0x96, 0x89, 0xee, 0xfb, 0x43, 0xb2, 0xbe, 0x5a, 0xf4, 0x21, 0xbc, 0x78,
- 0xf4, 0x44, 0x69, 0x85, 0x3d, 0x6a, 0x71, 0x12, 0x6d, 0x6b, 0xb0, 0xa5,
- 0x28, 0x4d, 0xdf, 0xe3, 0x64, 0x39, 0x3a, 0xff, 0xf0, 0xed, 0xf1, 0xf1,
- 0xf9, 0xc9, 0xeb, 0xd3, 0x63, 0x39, 0x31, 0xf6, 0x47, 0xef, 0x2e, 0xbf,
- 0x3b, 0x75, 0x7c, 0x8a, 0xf1, 0x3a, 0xa8, 0x5b, 0x42, 0x82, 0x91, 0x24,
- 0xa7, 0x79, 0xb1, 0xfc, 0xd4, 0x07, 0xdb, 0x59, 0xd1, 0x24, 0x87, 0x27,
- 0x3f, 0x18, 0xb5, 0xe7, 0x7c, 0xf0, 0xfe, 0x87, 0x80, 0x92, 0xa7, 0x05,
- 0x50, 0x8a, 0x97, 0x36, 0x30, 0x9b, 0x10, 0x56, 0x84, 0x1b, 0xfb, 0xaa,
- 0x6b, 0xf7, 0x37, 0x2e, 0x33, 0x6f, 0x9a, 0x5b, 0x16, 0xf6, 0x76, 0xe4,
- 0x17, 0xa5, 0x69, 0xd1, 0x2f, 0xb0, 0xf8, 0xcf, 0x77, 0x95, 0x24, 0x6f,
- 0xad, 0x37, 0xa5, 0x5d, 0x79, 0xcf, 0x8c, 0xe6, 0x1e, 0x65, 0xe3, 0x92,
- 0x97, 0xf4, 0xdf, 0x38, 0x39, 0x64, 0x72, 0x5e, 0xe5, 0xb7, 0xa4, 0xf0,
- 0x98, 0x87, 0x39, 0xf6, 0x46, 0xcf, 0x0e, 0x2d, 0x59, 0xa6, 0x84, 0x07,
- 0xa9, 0x15, 0x84, 0x8a, 0xd0, 0x6a, 0xac, 0x6a, 0x33, 0xd2, 0x2b, 0xc9,
- 0x34, 0xb7, 0xad, 0xe5, 0x66, 0xeb, 0xbc, 0x3e, 0xbe, 0xe8, 0x53, 0x95,
- 0x6e, 0x46, 0x38, 0x1d, 0xbf, 0xfb, 0x9a, 0xcb, 0x7f, 0x58, 0x4a, 0x48,
- 0xa9, 0xba, 0x1e, 0xa2, 0x9e, 0xbc, 0x39, 0xa1, 0x22, 0xdf, 0x14, 0x4f,
- 0xaa, 0x6b, 0xa3, 0xdd, 0xfe, 0x8e, 0x59, 0x98, 0x3c, 0xb4, 0x97, 0xe6,
- 0x3f, 0xb1, 0xa9, 0x32, 0xda, 0xe6, 0x37, 0xdb, 0xe1, 0x6c, 0x89, 0x16,
- 0x62, 0x63, 0x5d, 0xcc, 0x85, 0xc9, 0xa5, 0xca, 0x31, 0x61, 0x66, 0x46,
- 0xc2, 0xa8, 0x8b, 0xce, 0x50, 0xc1, 0x5d, 0x57, 0xba, 0x62, 0xb6, 0x2f,
- 0x60, 0xce, 0x98, 0xaf, 0xf5, 0x69, 0x5b, 0x82, 0x5c, 0xc0, 0xcd, 0x45,
- 0x14, 0x62, 0x5f, 0xe5, 0x02, 0x41, 0x75, 0x8e, 0x59, 0xa3, 0x57, 0x4d,
- 0xf3, 0x29, 0x17, 0x74, 0x32, 0x67, 0xb4, 0xa2, 0x58, 0xcb, 0xef, 0x39,
- 0x71, 0xd5, 0x38, 0x79, 0x39, 0x33, 0x2f, 0xce, 0x56, 0x60, 0xeb, 0xb8,
- 0x92, 0x92, 0x2b, 0x07, 0xd5, 0x21, 0x8a, 0x92, 0x92, 0x01, 0x6c, 0x0e,
- 0xa1, 0x1d, 0x8d, 0x41, 0x05, 0x9c, 0xa1, 0x0d, 0x54, 0x69, 0x10, 0xb1,
- 0x75, 0x33, 0xf0, 0x36, 0x01, 0x46, 0xda, 0xec, 0x27, 0x9b, 0xc4, 0x86,
- 0x45, 0x7f, 0xa2, 0x82, 0x80, 0x54, 0xcb, 0xda, 0xec, 0x87, 0xa5, 0x40,
- 0x36, 0x65, 0xbf, 0x6e, 0x0e, 0x09, 0x61, 0xc6, 0xea, 0xa3, 0x23, 0x65,
- 0x4b, 0x13, 0xe9, 0x8b, 0xa2, 0xc8, 0x69, 0x31, 0x5c, 0x6c, 0xb5, 0x0e,
- 0x48, 0x9b, 0x6c, 0x73, 0xed, 0x24, 0xc9, 0x55, 0xfa, 0xde, 0x6f, 0x2c,
- 0x4b, 0x78, 0x19, 0x7e, 0x31, 0xd1, 0xa7, 0x3d, 0x8d, 0x9d, 0xe6, 0x74,
- 0xad, 0xfc, 0x75, 0xd6, 0xf7, 0xa3, 0x2c, 0xbb, 0x87, 0x82, 0x04, 0x6f,
- 0x47, 0x58, 0x28, 0x52, 0x4e, 0xa5, 0x12, 0x09, 0x00, 0x41, 0xe0, 0x25,
- 0x01, 0xb8, 0xfa, 0x65, 0x26, 0xe8, 0x6f, 0x61, 0x98, 0x18, 0x43, 0x05,
- 0x41, 0x8b, 0x76, 0x7b, 0xc0, 0xe6, 0xc4, 0x51, 0x22, 0x96, 0x0e, 0x80,
- 0x4f, 0x44, 0xb5, 0xda, 0x20, 0xd0, 0xe2, 0x48, 0x37, 0x56, 0xa5, 0xcb,
- 0x72, 0xda, 0x82, 0x99, 0x9f, 0xdb, 0x74, 0xc6, 0x99, 0xdf, 0x36, 0xc4,
- 0x5b, 0x69, 0x9f, 0x06, 0x12, 0x0a, 0x50, 0x13, 0x86, 0xde, 0xfb, 0xb7,
- 0x07, 0x93, 0xa7, 0x1e, 0x5a, 0x3b, 0xa7, 0x77, 0xc5, 0x32, 0x22, 0x1e,
- 0x9d, 0x15, 0xde, 0xc1, 0xf1, 0xcd, 0xf2, 0x79, 0xde, 0x0c, 0x20, 0x39,
- 0x5e, 0x1a, 0x21, 0x91, 0x05, 0x69, 0xb1, 0xa3, 0x56, 0x2e, 0x85, 0xb0,
- 0xae, 0x2a, 0x46, 0x0e, 0xef, 0xb5, 0x2b, 0x1d, 0xba, 0xb4, 0x82, 0x41,
- 0x8c, 0x1e, 0x0b, 0x54, 0x29, 0x0e, 0x89, 0x8d, 0x53, 0x8b, 0x8c, 0x7f,
- 0x4d, 0x67, 0x54, 0xd0, 0x09, 0x4f, 0x07, 0x88, 0x6b, 0x39, 0x2c, 0xcd,
- 0x55, 0x43, 0x03, 0xab, 0xcc, 0x74, 0x5f, 0x69, 0x51, 0x64, 0x13, 0x6c,
- 0x4e, 0xd9, 0xc9, 0x81, 0x25, 0xb1, 0x5d, 0x45, 0x05, 0x1a, 0xf6, 0x0a,
- 0xe2, 0x17, 0x74, 0xa2, 0x03, 0x7d, 0x6e, 0x6c, 0x9a, 0xb8, 0xcb, 0xa7,
- 0x54, 0xf3, 0xeb, 0xb2, 0xb4, 0xea, 0x6b, 0x2d, 0xf8, 0x7f, 0xf2, 0x29,
- 0xe5, 0x21, 0xac, 0x6d, 0x1c, 0x23, 0x4c, 0xb3, 0xd5, 0x83, 0x31, 0xa9,
- 0x09, 0xa7, 0xc2, 0x52, 0x24, 0x1a, 0xeb, 0x00, 0x1f, 0xd4, 0x0e, 0xdf,
- 0xc7, 0x36, 0x09, 0xcc, 0xd8, 0xb8, 0xcb, 0x2b, 0x62, 0x33, 0x0a, 0x74,
- 0x6a, 0x45, 0x9f, 0x0d, 0xf5, 0x84, 0x80, 0x39, 0xec, 0x23, 0xf3, 0x74,
- 0x7c, 0xbb, 0xa9, 0xc4, 0xae, 0xcb, 0x42, 0x0a, 0xf4, 0x32, 0x70, 0x84,
- 0x54, 0xe3, 0xe4, 0x63, 0x3e, 0x2b, 0xa3, 0x1e, 0x30, 0x73, 0x11, 0x6c,
- 0xce, 0x37, 0x51, 0x22, 0xfc, 0xed, 0xa6, 0xf8, 0x1e, 0x88, 0xee, 0x23,
- 0xbb, 0x4e, 0xe5, 0xf7, 0x9c, 0x16, 0xb5, 0x79, 0xcd, 0x9f, 0xf9, 0xda,
- 0x3d, 0xd4, 0x69, 0x8e, 0x9c, 0x6c, 0xec, 0x54, 0xd3, 0x68, 0x6c, 0x7d,
- 0x90, 0xec, 0xef, 0xee, 0x7e, 0xdb, 0x4f, 0x9e, 0x70, 0x0d, 0xb4, 0xbd,
- 0xaf, 0x57, 0x15, 0xe6, 0x84, 0x82, 0x6c, 0x8b, 0xb1, 0xfe, 0x85, 0xf4,
- 0x62, 0x4c, 0x18, 0xef, 0x4b, 0x0b, 0xf4, 0x62, 0x7f, 0xbc, 0x1f, 0x71,
- 0xed, 0x5e, 0x60, 0xb4, 0x54, 0x5c, 0xfe, 0x1b, 0x7c, 0x4e, 0x50, 0xe0,
- 0xe0, 0x9e, 0xa7, 0x58, 0xdb, 0x42, 0x52, 0x5f, 0x68, 0xbb, 0x72, 0xcb,
- 0x50, 0x36, 0x67, 0xf4, 0x80, 0xb1, 0xe2, 0xc2, 0x80, 0x28, 0x45, 0xfc,
- 0xa0, 0xc5, 0x5a, 0xd2, 0x3d, 0xaf, 0x53, 0x04, 0x5b, 0x9d, 0x20, 0xbb,
- 0x83, 0xe0, 0x1c, 0xbf, 0xdf, 0x95, 0x38, 0x43, 0x78, 0x37, 0xaf, 0x9b,
- 0x01, 0xd9, 0x9a, 0x31, 0x97, 0xed, 0xf9, 0xd9, 0xf9, 0x93, 0x6d, 0x9f,
- 0xfe, 0x42, 0xf2, 0x1f, 0x98, 0xa3, 0x12, 0x4e, 0x5d, 0x9b, 0x1b, 0xd1,
- 0x57, 0x71, 0xc3, 0x28, 0xbc, 0x58, 0x41, 0x2b, 0xce, 0x0d, 0x27, 0xe1,
- 0x82, 0x2f, 0x1a, 0x7d, 0x2c, 0xbb, 0x73, 0x39, 0xb7, 0x1e, 0x6d, 0xa3,
- 0x3b, 0x98, 0x4a, 0x84, 0xb0, 0x11, 0x26, 0x90, 0xd5, 0x8c, 0xd2, 0x41,
- 0xf6, 0xd5, 0x00, 0xd8, 0xbe, 0x36, 0x81, 0x15, 0xe1, 0xc0, 0x82, 0x5e,
- 0x26, 0xed, 0x9c, 0x17, 0x9f, 0x53, 0x8f, 0x41, 0x74, 0xee, 0x49, 0xea,
- 0x9d, 0xc5, 0x3a, 0x22, 0x8f, 0xd0, 0x85, 0x53, 0xc8, 0x7f, 0x43, 0xbb,
- 0x96, 0x19, 0xaf, 0x87, 0xab, 0x20, 0xb6, 0x8e, 0x69, 0xa7, 0xa5, 0x36,
- 0x0b, 0x39, 0x5b, 0x9a, 0xbc, 0x3b, 0x1d, 0x5d, 0xfa, 0x3e, 0x5f, 0x94,
- 0x85, 0x08, 0xf0, 0x21, 0xed, 0x14, 0x6e, 0x2f, 0x72, 0x78, 0x7a, 0x12,
- 0xa9, 0x52, 0x4e, 0xd0, 0xad, 0x03, 0x23, 0x56, 0x4b, 0xb2, 0xd3, 0xfc,
- 0x5c, 0x98, 0x84, 0x89, 0xcf, 0x19, 0xbd, 0xc1, 0xce, 0x6c, 0x76, 0xf4,
- 0xe6, 0x95, 0x9f, 0xf7, 0xd1, 0x6d, 0xce, 0x74, 0xf1, 0xcf, 0x8c, 0xfd,
- 0x10, 0xdc, 0x88, 0xc2, 0xd1, 0xea, 0xe5, 0x78, 0xe0, 0x71, 0x26, 0xb0,
- 0xbe, 0x03, 0xfe, 0x33, 0xb3, 0x7b, 0xcd, 0x0d, 0xf5, 0x31, 0x34, 0x04,
- 0xb6, 0x78, 0x43, 0x61, 0x7e, 0x84, 0xeb, 0xa2, 0xe5, 0x7c, 0x9b, 0x24,
- 0x64, 0x41, 0x0a, 0xf5, 0x28, 0x3d, 0xfb, 0xe8, 0x4d, 0x45, 0x53, 0xd1,
- 0x99, 0x49, 0x71, 0xdf, 0xb6, 0x81, 0x60, 0xe4, 0x65, 0xff, 0x25, 0x61,
- 0x05, 0x6f, 0x0b, 0xba, 0x4d, 0x57, 0x1b, 0xcb, 0x1b, 0x3e, 0x01, 0xdb,
- 0x6d, 0x42, 0xc3, 0x04, 0xbc, 0xa5, 0x14, 0xdb, 0xcf, 0xa7, 0xcc, 0x78,
- 0x51, 0xb7, 0x29, 0x2f, 0x38, 0xab, 0x81, 0x84, 0x0e, 0x1c, 0xf9, 0xa8,
- 0xb6, 0xba, 0x6a, 0x25, 0xd9, 0x71, 0xd2, 0x42, 0x37, 0x0c, 0x7e, 0x60,
- 0xc8, 0x0c, 0x82, 0x81, 0xfd, 0x55, 0xb9, 0xd8, 0xe1, 0x36, 0x52, 0x26,
- 0xb6, 0xf7, 0xc6, 0xb4, 0xb5, 0xb3, 0x25, 0xb3, 0xd3, 0x4f, 0x04, 0xa4,
- 0x83, 0xb1, 0x6a, 0x99, 0x69, 0x68, 0x23, 0xb4, 0x26, 0x41, 0x4c, 0x7e,
- 0x59, 0xe4, 0x7f, 0x43, 0x20, 0x15, 0xba, 0xeb, 0x55, 0x0e, 0xac, 0x49,
- 0xca, 0x40, 0x0f, 0xdc, 0x64, 0x66, 0x54, 0x94, 0x26, 0x2b, 0xe4, 0xa1,
- 0xf4, 0xa0, 0xc3, 0xd5, 0x85, 0x01, 0x8d, 0x55, 0x00, 0x67, 0x3f, 0x3d,
- 0x6a, 0xaf, 0x4d, 0x65, 0x02, 0xaa, 0x25, 0x49, 0x3c, 0x36, 0x57, 0xd2,
- 0x0e, 0x72, 0xea, 0x62, 0x25, 0x5e, 0x52, 0x2f, 0x80, 0x2e, 0xa9, 0x74,
- 0x8a, 0x7d, 0xac, 0x24, 0x7d, 0x6f, 0xeb, 0xcd, 0xc5, 0xd9, 0xdb, 0xc1,
- 0xe5, 0xd9, 0x36, 0x52, 0x00, 0xd1, 0x32, 0x03, 0xef, 0xbb, 0xa9, 0xc7,
- 0x52, 0x89, 0xc5, 0xab, 0x47, 0xd0, 0xc6, 0x1f, 0x6c, 0xd5, 0xdb, 0x43,
- 0x9f, 0xc8, 0x69, 0xe1, 0xd7, 0x6f, 0x09, 0x28, 0x95, 0x0a, 0xd6, 0x45,
- 0x10, 0x15, 0x48, 0xc8, 0x43, 0x34, 0xf1, 0xbc, 0xe4, 0x78, 0x5f, 0x65,
- 0xf7, 0x78, 0x59, 0xdf, 0x13, 0x47, 0x04, 0x23, 0x52, 0xc8, 0xab, 0x57,
- 0x67, 0x4d, 0x58, 0xfd, 0xc0, 0x32, 0x61, 0xdb, 0xac, 0x44, 0xa2, 0x32,
- 0x60, 0x9c, 0x6c, 0x53, 0x9a, 0x03, 0x9c, 0x56, 0x55, 0x79, 0xa7, 0x57,
- 0x97, 0x80, 0xbb, 0x6d, 0x05, 0xb9, 0x95, 0x29, 0x5c, 0x92, 0x9c, 0xac,
- 0xec, 0xd3, 0x6b, 0x15, 0xc0, 0x67, 0xed, 0xb4, 0x1a, 0xc5, 0x0f, 0x0d,
- 0x9a, 0xca, 0x98, 0x4b, 0xd9, 0x34, 0xee, 0x1d, 0x3c, 0x25, 0x41, 0xd9,
- 0x06, 0x1c, 0x69, 0x01, 0x40, 0xca, 0xb2, 0x03, 0xd9, 0xbe, 0x7a, 0x8f,
- 0xa4, 0x4e, 0x2c, 0xa8, 0x17, 0xff, 0x14, 0x9c, 0x61, 0xa1, 0x55, 0xe2,
- 0x1a, 0x06, 0x0e, 0x72, 0x24, 0xec, 0x1c, 0x54, 0x7a, 0x85, 0xf6, 0xb6,
- 0xa2, 0x82, 0x90, 0x38, 0x2d, 0xd1, 0x91, 0xfb, 0xd0, 0xf8, 0xd2, 0x54,
- 0xc8, 0x9c, 0x92, 0x50, 0xa6, 0xcb, 0x09, 0x96, 0x89, 0x82, 0x1e, 0x44,
- 0x48, 0x3a, 0x66, 0x8e, 0x16, 0xcd, 0xe3, 0xa0, 0xa6, 0x1d, 0xd8, 0x8a,
- 0xed, 0xec, 0xae, 0x9e, 0x95, 0xf0, 0x63, 0x8e, 0xb8, 0x90, 0xd4, 0x49,
- 0x8a, 0xdd, 0x67, 0xac, 0x5a, 0x56, 0x01, 0x3d, 0x71, 0x71, 0x55, 0x2a,
- 0xc5, 0x73, 0x28, 0xb0, 0x66, 0x29, 0x39, 0xe0, 0x3f, 0x35, 0x1a, 0xb1,
- 0x23, 0x16, 0x0b, 0xda, 0xc0, 0x08, 0x4b, 0x7f, 0xc5, 0xd5, 0x62, 0x5b,
- 0xed, 0x6d, 0xaf, 0xaf, 0x5a, 0xcb, 0xd8, 0x3c, 0x6f, 0xf5, 0x5a, 0x0b,
- 0x12, 0x5f, 0xb9, 0x76, 0x21, 0x4f, 0x8e, 0xa5, 0x7a, 0x33, 0x2e, 0xe7,
- 0x1a, 0x24, 0x0b, 0xc0, 0x3a, 0x91, 0xd2, 0x48, 0xe8, 0xa9, 0x69, 0x0c,
- 0xae, 0xac, 0x8c, 0x99, 0x4d, 0xa2, 0x1f, 0x4d, 0xb6, 0xc8, 0x0b, 0x38,
- 0xf1, 0x01, 0x9e, 0xa7, 0xf2, 0x2b, 0xc5, 0xce, 0x41, 0x98, 0x76, 0x15,
- 0xf7, 0x27, 0x3f, 0xfc, 0x90, 0xb4, 0xe8, 0x9c, 0xb7, 0x57, 0xe5, 0xbb,
- 0xc0, 0xaa, 0x30, 0x0b, 0x27, 0x65, 0x82, 0xa4, 0xc3, 0x01, 0x5c, 0x59,
- 0xb7, 0x9d, 0x51, 0x0a, 0x12, 0xa0, 0xc0, 0xd8, 0x2f, 0x24, 0xd5, 0x01,
- 0xb8, 0xc8, 0xbd, 0x48, 0x67, 0x3f, 0xe6, 0x8a, 0x4c, 0x98, 0x93, 0x08,
- 0x2c, 0x01, 0x22, 0x57, 0x61, 0x6e, 0xec, 0xfa, 0x06, 0xa6, 0xc9, 0x9f,
- 0xae, 0xba, 0x85, 0xfe, 0xbb, 0x21, 0x2f, 0x30, 0xdf, 0x07, 0xeb, 0x39,
- 0xad, 0x2d, 0x4d, 0x86, 0xa0, 0xa5, 0x70, 0xe3, 0x73, 0xc1, 0x21, 0x82,
- 0xbd, 0x78, 0xd5, 0xb9, 0x45, 0xb7, 0x08, 0x22, 0x5b, 0x94, 0x97, 0xc7,
- 0x87, 0x07, 0xa8, 0xdd, 0xd4, 0x3b, 0x2f, 0x8e, 0x5b, 0xa1, 0xb3, 0x62,
- 0x02, 0xe3, 0x8b, 0x94, 0x85, 0x40, 0xa9, 0x6f, 0x26, 0x6d, 0x45, 0x92,
- 0x78, 0xc9, 0xb1, 0x33, 0x61, 0x3e, 0xe6, 0x1b, 0xe7, 0x4f, 0xb6, 0x76,
- 0xb3, 0x1f, 0x63, 0xa2, 0x5d, 0x10, 0x2b, 0xf1, 0xa2, 0xc2, 0x84, 0xd6,
- 0x85, 0x78, 0x7c, 0x28, 0x5d, 0x55, 0x49, 0x12, 0xc9, 0xa7, 0xa7, 0x71,
- 0x3b, 0x56, 0xa8, 0x91, 0x6a, 0x62, 0x69, 0xfa, 0x83, 0x8b, 0x47, 0x8f,
- 0x2c, 0x05, 0xdd, 0xe1, 0x9d, 0xea, 0xd4, 0x4b, 0x1a, 0x18, 0xb3, 0x74,
- 0x80, 0xc7, 0xea, 0x55, 0x4c, 0x25, 0xc2, 0x32, 0x06, 0xda, 0xf4, 0x92,
- 0x1d, 0x6d, 0xde, 0x9c, 0xa9, 0x77, 0xdb, 0x26, 0x36, 0x09, 0x7e, 0x97,
- 0x0f, 0x30, 0xe5, 0xd4, 0x74, 0x8f, 0x96, 0x1f, 0xe0, 0x41, 0x0a, 0x91,
- 0xf9, 0xf7, 0xf9, 0xfb, 0xcb, 0x6d, 0x57, 0xf3, 0x41, 0xb6, 0xab, 0x8f,
- 0x73, 0x94, 0xb4, 0x80, 0x90, 0xc0, 0x9e, 0xd3, 0x76, 0x44, 0x4e, 0x09,
- 0xd6, 0x49, 0x4e, 0x06, 0x79, 0x59, 0x9e, 0xec, 0xee, 0x19, 0x4b, 0x6a,
- 0x77, 0x1f, 0xec, 0xd8, 0x4f, 0x76, 0x9f, 0x0c, 0xf5, 0x4c, 0xeb, 0x53,
- 0xc1, 0xb5, 0x30, 0xe5, 0x17, 0xe1, 0x34, 0xc1, 0xbe, 0x7f, 0xf2, 0xe9,
- 0x13, 0x7e, 0xdc, 0xef, 0x26, 0xf8, 0x2a, 0x2b, 0x9b, 0xe5, 0x9d, 0x0a,
- 0xa1, 0x55, 0xda, 0x71, 0x37, 0xe3, 0x08, 0xbf, 0x2c, 0x0b, 0xce, 0xa9,
- 0x00, 0xff, 0x38, 0xa5, 0x06, 0x0d, 0x57, 0x13, 0x66, 0x7a, 0x14, 0xa2,
- 0x92, 0x04, 0xed, 0x53, 0x66, 0x9a, 0xed, 0xe2, 0xa7, 0x95, 0x49, 0xa2,
- 0x51, 0x20, 0x9c, 0xe9, 0x19, 0x49, 0xca, 0x34, 0xb3, 0xf0, 0xc9, 0xcd,
- 0x91, 0xe5, 0x1d, 0x95, 0x81, 0x98, 0xab, 0x4e, 0x04, 0x92, 0x85, 0x63,
- 0xae, 0x60, 0xcb, 0x3d, 0x20, 0x64, 0xb2, 0x39, 0x15, 0x98, 0x61, 0xfd,
- 0xeb, 0xbe, 0x40, 0x6d, 0xf8, 0x5f, 0x4f, 0xda, 0x77, 0xe5, 0x75, 0x5e,
- 0x0c, 0xb4, 0xd1, 0x97, 0xf2, 0x97, 0xc0, 0x5f, 0x79, 0xf2, 0xf6, 0xf0,
- 0x3c, 0x81, 0x7e, 0x9c, 0x8c, 0xde, 0x82, 0x5b, 0xdc, 0xf3, 0xa1, 0xa0,
- 0x0d, 0xdb, 0x31, 0xd1, 0x53, 0x84, 0x73, 0x9e, 0x85, 0xf4, 0x5a, 0xe1,
- 0xb1, 0x92, 0xac, 0x55, 0xb5, 0x41, 0xf9, 0x80, 0x1b, 0xba, 0x4f, 0x07,
- 0xe2, 0xaa, 0xaf, 0x59, 0xdd, 0x38, 0x1a, 0xbe, 0xd3, 0x92, 0x18, 0x74,
- 0xbf, 0x2a, 0xec, 0x56, 0xfa, 0xd8, 0x2d, 0x5e, 0x7f, 0xd8, 0x80, 0xec,
- 0x9a, 0x4b, 0x6e, 0x04, 0x66, 0x2a, 0x4d, 0x45, 0x9f, 0xa7, 0x02, 0xac,
- 0xf0, 0x6f, 0x89, 0x9c, 0x51, 0x90, 0x51, 0xad, 0x99, 0x60, 0x97, 0x35,
- 0xb3, 0x39, 0x79, 0x95, 0x8a, 0xba, 0x73, 0x31, 0x56, 0xbc, 0x4d, 0xd2,
- 0x99, 0x48, 0x73, 0x12, 0xe9, 0x72, 0x25, 0xd5, 0x9f, 0x48, 0xc3, 0xf6,
- 0x9f, 0x7c, 0xfe, 0xb4, 0x8f, 0xbf, 0x3d, 0xdb, 0x7d, 0xc1, 0x2b, 0x7a,
- 0x72, 0x7c, 0xf9, 0xa6, 0xeb, 0xd0, 0xab, 0xcc, 0x86, 0xe2, 0xff, 0x52,
- 0x75, 0x9a, 0x1b, 0x63, 0x60, 0x50, 0x3e, 0xe4, 0xa0, 0x9e, 0x37, 0x8b,
- 0xc1, 0xee, 0xee, 0xb0, 0xf9, 0xd4, 0xfc, 0x0b, 0x09, 0x1b, 0x9f, 0x3c,
- 0x6d, 0xc7, 0x5e, 0x48, 0xad, 0x1f, 0xd0, 0x74, 0xaf, 0xe6, 0xed, 0x69,
- 0x6f, 0x2f, 0x5b, 0x39, 0x52, 0x8b, 0x07, 0x4a, 0xc9, 0x12, 0xf9, 0xbe,
- 0x25, 0x80, 0xb2, 0xfb, 0x21, 0x56, 0x69, 0xa6, 0x7b, 0x57, 0x29, 0x66,
- 0xc2, 0x5c, 0xf4, 0xb8, 0x95, 0x9a, 0x7b, 0x2e, 0xa8, 0x95, 0x0a, 0xaf,
- 0x79, 0xe3, 0x0a, 0x10, 0x44, 0x33, 0x92, 0x6a, 0xc1, 0x9e, 0x57, 0x19,
- 0xe5, 0x55, 0xb3, 0xe2, 0x57, 0xb0, 0x54, 0x7a, 0x38, 0x37, 0x1c, 0x53,
- 0x50, 0x4d, 0x16, 0x92, 0x89, 0xc0, 0xff, 0xa6, 0xcb, 0xb8, 0x05, 0x79,
- 0xdb, 0x7f, 0x16, 0x99, 0x38, 0x5c, 0xd9, 0xbf, 0x72, 0xe2, 0x9c, 0x7a,
- 0xc4, 0x3e, 0xbc, 0x39, 0xd7, 0x3d, 0x11, 0xef, 0x7e, 0x98, 0xb3, 0x5b,
- 0x2b, 0xaf, 0xf4, 0x2f, 0x1e, 0x0b, 0xcd, 0xf6, 0x70, 0x1d, 0xc7, 0x84,
- 0x7b, 0xeb, 0x57, 0x8e, 0xa5, 0xef, 0x78, 0x4e, 0xe9, 0xfe, 0xa0, 0xf6,
- 0xd8, 0x8d, 0xaf, 0xf8, 0x97, 0x4e, 0x73, 0x17, 0xd9, 0x22, 0xc3, 0xe0,
- 0xbd, 0xbc, 0x4d, 0x7f, 0x73, 0x5b, 0x3b, 0xb5, 0xf1, 0xea, 0x2d, 0x99,
- 0x6b, 0x34, 0x5f, 0x10, 0xf1, 0x52, 0x1d, 0xf5, 0xb5, 0xb4, 0x6a, 0x4d,
- 0x60, 0x32, 0xd5, 0x2d, 0xdb, 0xd7, 0xe2, 0x90, 0xfc, 0xba, 0xce, 0xb1,
- 0x95, 0x57, 0x69, 0x98, 0x6d, 0x44, 0x26, 0x3b, 0xda, 0xb0, 0x8b, 0x55,
- 0xba, 0x94, 0x25, 0x6e, 0xbc, 0x5c, 0xa1, 0x00, 0x78, 0xfd, 0x80, 0xef,
- 0xc9, 0xee, 0x6d, 0x54, 0xd8, 0xb0, 0x5b, 0x7e, 0xeb, 0xbb, 0x8b, 0x37,
- 0x7f, 0x51, 0xfb, 0x1b, 0x7a, 0x69, 0x68, 0x0d, 0x77, 0x3a, 0x3c, 0xce,
- 0x3c, 0x80, 0x92, 0x64, 0xd7, 0xb5, 0xe6, 0xdd, 0xfd, 0x23, 0x82, 0xa5,
- 0x63, 0xea, 0xa2, 0x64, 0x8b, 0x0a, 0x07, 0x98, 0xc7, 0x46, 0x62, 0xd4,
- 0x3d, 0x19, 0x3e, 0x83, 0x4f, 0xe4, 0xcd, 0xd1, 0xb3, 0x27, 0xfb, 0x7b,
- 0xc6, 0x6e, 0xdd, 0xea, 0x48, 0x8b, 0xed, 0x8d, 0x47, 0xcd, 0xb6, 0x5d,
- 0xef, 0xec, 0xd3, 0x82, 0xf6, 0xde, 0xd6, 0xf1, 0x0f, 0xe7, 0xef, 0xda,
- 0xe3, 0xe3, 0x11, 0x05, 0x99, 0x67, 0xab, 0x46, 0xe8, 0x74, 0x81, 0x56,
- 0xfb, 0x82, 0xb4, 0x42, 0x5e, 0x57, 0x12, 0xe6, 0x14, 0xf6, 0xde, 0x54,
- 0x39, 0x69, 0xb9, 0x3d, 0x9a, 0x90, 0xde, 0x69, 0x59, 0x4c, 0xcd, 0xd5,
- 0x7f, 0x46, 0x79, 0xf8, 0x19, 0x61, 0x40, 0x1e, 0x1c, 0xdd, 0xea, 0x63,
- 0xf2, 0xb6, 0x8f, 0xa3, 0x52, 0x84, 0x50, 0x84, 0xb7, 0xf8, 0x21, 0x18,
- 0x90, 0x28, 0x5f, 0x94, 0x33, 0x0f, 0x96, 0xd7, 0x19, 0xbb, 0x78, 0x9b,
- 0x56, 0x7d, 0x24, 0xd6, 0x24, 0xe1, 0x7a, 0x23, 0xaf, 0xcf, 0x4b, 0x38,
- 0xb5, 0x57, 0xc5, 0x43, 0x58, 0x5a, 0x6a, 0x44, 0x84, 0xfd, 0x44, 0x5b,
- 0xea, 0xda, 0xdf, 0xf6, 0xd8, 0xbf, 0xc1, 0xd0, 0xc1, 0xf1, 0x0e, 0xd2,
- 0xdc, 0x22, 0x32, 0x17, 0x8f, 0x39, 0xcb, 0x22, 0x6f, 0xa3, 0x58, 0x71,
- 0x12, 0x91, 0x65, 0xd7, 0x6f, 0x13, 0x14, 0xc4, 0xfc, 0xe0, 0x88, 0xf5,
- 0xa2, 0xc4, 0x4c, 0x5a, 0x4c, 0x5b, 0xb9, 0x18, 0xa8, 0x09, 0x04, 0xfb,
- 0x07, 0xa5, 0xd6, 0xa0, 0x24, 0x3e, 0x7f, 0x12, 0x3a, 0xb5, 0xce, 0x2e,
- 0x8f, 0x0f, 0x24, 0x80, 0xe1, 0xf2, 0x68, 0x55, 0x23, 0x66, 0xb0, 0x0c,
- 0x01, 0x8f, 0x0b, 0x81, 0xd0, 0x7b, 0xa3, 0xeb, 0x47, 0x76, 0x36, 0x60,
- 0xbf, 0xb4, 0x1b, 0xd8, 0xa1, 0xd9, 0xac, 0x64, 0x7b, 0xd1, 0x82, 0x56,
- 0x76, 0x3e, 0x9a, 0x58, 0xe5, 0x18, 0x0c, 0x1b, 0x86, 0x12, 0x68, 0x7d,
- 0xf8, 0x66, 0x09, 0x26, 0x8b, 0x85, 0x36, 0x6c, 0x0b, 0xcd, 0x8a, 0x2a,
- 0x8b, 0x49, 0x56, 0x05, 0x48, 0x10, 0x04, 0xa3, 0xc8, 0x07, 0x4b, 0x93,
- 0x05, 0xc5, 0x7b, 0x75, 0x19, 0x33, 0xdf, 0xea, 0xb1, 0x31, 0xb3, 0xee,
- 0xde, 0x11, 0x2b, 0x84, 0xdc, 0x5d, 0xab, 0xca, 0xcc, 0x64, 0x8d, 0xdb,
- 0x34, 0x1a, 0xa8, 0x21, 0x9f, 0x96, 0x5a, 0x23, 0x64, 0x3d, 0x59, 0x55,
- 0x9c, 0xe1, 0xa0, 0x94, 0x10, 0x16, 0x95, 0xab, 0x70, 0x00, 0x78, 0x1e,
- 0x00, 0x55, 0x47, 0xfa, 0x7e, 0x5d, 0x3c, 0x22, 0x75, 0x6c, 0x17, 0x8d,
- 0x8a, 0xb3, 0x8a, 0xf8, 0xc9, 0x58, 0x50, 0xa9, 0x7a, 0xc4, 0x02, 0x31,
- 0xae, 0x97, 0xd5, 0x74, 0x39, 0xef, 0xf9, 0x45, 0x0c, 0x45, 0xbf, 0x81,
- 0xed, 0xc6, 0x39, 0x93, 0x11, 0x97, 0xf8, 0xb3, 0xdd, 0x56, 0x6b, 0x43,
- 0x29, 0xe6, 0xec, 0xd6, 0x9f, 0xca, 0xcc, 0xec, 0x59, 0x8f, 0x63, 0x8e,
- 0x5c, 0x20, 0x8e, 0xe6, 0xfd, 0x8e, 0x31, 0x95, 0x79, 0x5f, 0x56, 0x8a,
- 0xd1, 0x55, 0xf4, 0xdf, 0x2f, 0x02, 0x89, 0x21, 0xab, 0xc3, 0x50, 0xaa,
- 0xbc, 0x48, 0x56, 0x55, 0x97, 0xa4, 0x0f, 0xde, 0xdd, 0x94, 0x33, 0x3f,
- 0xd6, 0x1b, 0x98, 0x2d, 0x64, 0x90, 0x7b, 0x94, 0x0d, 0x1e, 0x1c, 0x5e,
- 0x16, 0x86, 0xe6, 0x1d, 0xae, 0xa5, 0x31, 0xa5, 0x3a, 0x25, 0x7f, 0x2d,
- 0xc7, 0xe2, 0x6f, 0xa0, 0xa4, 0x8e, 0xeb, 0x68, 0x32, 0x30, 0x08, 0x4c,
- 0x8c, 0x58, 0x36, 0x5b, 0x6d, 0xba, 0x64, 0x2f, 0x22, 0xf5, 0xa7, 0xc8,
- 0x1a, 0xe6, 0x1c, 0xa3, 0xc2, 0x49, 0xe4, 0xe0, 0x4f, 0xae, 0x41, 0x0b,
- 0x31, 0x65, 0xc7, 0xc4, 0x28, 0x12, 0x59, 0x31, 0x92, 0x76, 0x9f, 0x52,
- 0x35, 0xfd, 0xe9, 0x8d, 0x17, 0x9a, 0xec, 0xdb, 0x3c, 0xfe, 0x74, 0xd2,
- 0x2c, 0x65, 0xd6, 0xbb, 0xbd, 0x2b, 0xd5, 0x23, 0x68, 0xde, 0x05, 0xaf,
- 0x19, 0x98, 0x44, 0x26, 0x66, 0xeb, 0xa5, 0x93, 0x7b, 0xbd, 0x17, 0xdd,
- 0x35, 0xa2, 0xc5, 0x3e, 0x2d, 0x0b, 0x5a, 0x30, 0x58, 0xdb, 0x09, 0x8a,
- 0xed, 0xe5, 0xf5, 0x0a, 0x16, 0xd2, 0xdf, 0x0b, 0x42, 0xdb, 0x2d, 0x71,
- 0xe9, 0x9f, 0xf6, 0xac, 0x49, 0x69, 0x8e, 0x1f, 0xc8, 0x59, 0x6c, 0x7c,
- 0xf6, 0x2f, 0x0e, 0x82, 0x81, 0x25, 0xb2, 0x2a, 0x27, 0x1c, 0xf2, 0xd5,
- 0xba, 0x8f, 0xc4, 0xe7, 0x10, 0xde, 0x98, 0x6f, 0xe5, 0x2b, 0x4a, 0x9e,
- 0xbb, 0x05, 0x89, 0x65, 0x33, 0x5a, 0xd8, 0xa8, 0x7a, 0x9a, 0x6c, 0xc1,
- 0xd0, 0xf9, 0xfc, 0xd9, 0xd3, 0x6d, 0x2e, 0xab, 0xac, 0xd0, 0xa8, 0xed,
- 0x08, 0x3e, 0x15, 0xa7, 0x4d, 0xc8, 0x02, 0x71, 0x81, 0xe7, 0x5c, 0x96,
- 0x12, 0xf4, 0x9e, 0x53, 0xad, 0x3c, 0x00, 0x04, 0xb8, 0xb9, 0xda, 0xc1,
- 0xaa, 0x9e, 0x33, 0xeb, 0x5e, 0x10, 0x2d, 0x07, 0x0e, 0x4b, 0xaa, 0x5a,
- 0x6e, 0x41, 0xca, 0x7b, 0x75, 0x53, 0x12, 0x9b, 0xf0, 0x21, 0x64, 0x75,
- 0xd0, 0x47, 0x94, 0xaf, 0x6e, 0x9b, 0x20, 0x81, 0x31, 0x08, 0x03, 0x66,
- 0x9e, 0x0b, 0x9e, 0xf1, 0x5d, 0x4d, 0xe5, 0x10, 0x4a, 0xef, 0x5e, 0x90,
- 0xb4, 0x59, 0xb6, 0xf4, 0xe5, 0xe6, 0x49, 0x62, 0xbc, 0x4b, 0x46, 0x2f,
- 0x45, 0x4c, 0x1a, 0x77, 0x99, 0x9d, 0x48, 0xb4, 0xc1, 0x44, 0x1e, 0xb4,
- 0x55, 0xb4, 0x05, 0xc1, 0x03, 0xc9, 0xba, 0x40, 0xcb, 0x08, 0x2a, 0x67,
- 0xcd, 0x95, 0xf5, 0x98, 0x2f, 0xd9, 0xb2, 0x72, 0x05, 0x7f, 0x38, 0x20,
- 0xc1, 0xf7, 0x25, 0x20, 0x8c, 0xab, 0xf2, 0x94, 0xd5, 0xe0, 0x4f, 0x35,
- 0x9f, 0xb2, 0xd5, 0xb1, 0x95, 0xf8, 0x72, 0xdd, 0x6d, 0x9a, 0xb9, 0xdc,
- 0x85, 0x95, 0xeb, 0xdf, 0xed, 0xae, 0x0c, 0x6b, 0xe0, 0xf0, 0x57, 0x3b,
- 0xf3, 0xb0, 0xa2, 0xf7, 0x5c, 0x06, 0x07, 0xa4, 0x1b, 0x70, 0x18, 0x0c,
- 0x42, 0x0a, 0x81, 0x64, 0x0b, 0x1d, 0xde, 0xd9, 0xd9, 0x7e, 0xb8, 0xd3,
- 0xf2, 0xe4, 0x43, 0x9d, 0x3c, 0x67, 0x13, 0x9e, 0x09, 0x12, 0x2d, 0x9f,
- 0x85, 0xeb, 0x05, 0x7d, 0x35, 0x07, 0x54, 0x97, 0x76, 0x10, 0x23, 0x1d,
- 0x2b, 0xd1, 0x4d, 0x28, 0x81, 0x2e, 0xbc, 0x83, 0x78, 0xcc, 0x3c, 0xbc,
- 0xf6, 0xc8, 0xc5, 0xbc, 0x63, 0x26, 0x10, 0x11, 0x20, 0xc0, 0x01, 0x71,
- 0x71, 0xb4, 0xc3, 0x59, 0x50, 0xc7, 0xd1, 0xeb, 0x15, 0x0e, 0x84, 0x37,
- 0x3e, 0x36, 0xe8, 0x5a, 0x5e, 0x65, 0x3a, 0x1a, 0x2d, 0xd7, 0x73, 0x04,
- 0xae, 0x2d, 0x8f, 0xaa, 0x30, 0xe2, 0x44, 0xad, 0xe9, 0x30, 0x60, 0xf7,
- 0xe1, 0x07, 0xe9, 0xf8, 0xd8, 0xa2, 0xf3, 0x79, 0x11, 0x33, 0xdd, 0xbd,
- 0xf2, 0xc5, 0x68, 0xd3, 0xc8, 0xd4, 0x8f, 0x6e, 0xdc, 0x4c, 0xaf, 0x83,
- 0xbe, 0xe6, 0x57, 0x2d, 0xea, 0x97, 0xb4, 0x0a, 0x3d, 0xcc, 0xe8, 0x9b,
- 0xdd, 0xdf, 0x98, 0x33, 0xad, 0x5a, 0x89, 0x9f, 0xb6, 0xa6, 0xb3, 0xcf,
- 0xc7, 0x14, 0x29, 0xc3, 0x31, 0xad, 0x14, 0xd5, 0x00, 0xc2, 0xc4, 0x44,
- 0x37, 0x81, 0x2e, 0x31, 0xd3, 0xcb, 0xbc, 0xfc, 0x75, 0xd5, 0xa5, 0xb5,
- 0xd1, 0xb6, 0x55, 0xdd, 0xa9, 0x47, 0x6c, 0x93, 0x2c, 0xe3, 0x4a, 0xda,
- 0xb1, 0x14, 0x46, 0x7b, 0xa7, 0x8f, 0x19, 0x23, 0xfb, 0xfc, 0xdd, 0xf1,
- 0xd7, 0x67, 0xdb, 0x0f, 0x79, 0xe3, 0x7c, 0xf9, 0x6f, 0x07, 0x05, 0xf4,
- 0x59, 0x45, 0xc8, 0x35, 0xee, 0x3b, 0xb4, 0xf0, 0xaf, 0x47, 0xa3, 0xc1,
- 0xe1, 0xf9, 0x09, 0x89, 0xc9, 0x64, 0x34, 0x32, 0x7f, 0x59, 0x45, 0x2d,
- 0xa6, 0xb5, 0xfa, 0x06, 0xdf, 0x41, 0xd7, 0xb3, 0x29, 0x59, 0xf0, 0xe3,
- 0x64, 0x59, 0xa2, 0x65, 0x60, 0x2b, 0x29, 0x53, 0xa0, 0x79, 0xaa, 0xf4,
- 0x81, 0xae, 0x01, 0x75, 0x7e, 0xb2, 0x83, 0x6f, 0x11, 0x3a, 0x14, 0x03,
- 0x8a, 0x1b, 0xca, 0xcb, 0xb0, 0x6e, 0x03, 0x69, 0x3d, 0xc0, 0x53, 0x42,
- 0x40, 0x2b, 0x3c, 0xd5, 0x98, 0x38, 0x74, 0x9d, 0x50, 0x6c, 0x4a, 0x82,
- 0x53, 0xf1, 0x6c, 0x00, 0xce, 0xd0, 0x27, 0xc0, 0xb7, 0xf0, 0x1d, 0x76,
- 0xdd, 0x4c, 0x30, 0x47, 0x98, 0x5f, 0x83, 0xaa, 0x23, 0x8e, 0x24, 0x94,
- 0xd8, 0x35, 0xff, 0x37, 0x07, 0xcb, 0xe4, 0x60, 0x13, 0x68, 0x94, 0x82,
- 0x8a, 0x89, 0x86, 0xa6, 0x76, 0xa7, 0x7a, 0x8b, 0x68, 0x52, 0xd8, 0x4f,
- 0xa6, 0x97, 0xc1, 0x16, 0xc4, 0x8b, 0xaa, 0xf7, 0x54, 0x19, 0x05, 0x42,
- 0x58, 0xbd, 0x61, 0x88, 0xc1, 0xf4, 0x5f, 0xc2, 0x79, 0xbe, 0x46, 0x03,
- 0x19, 0x73, 0x90, 0x10, 0x0e, 0xa3, 0xa2, 0x99, 0xcd, 0xe5, 0xaf, 0x69,
- 0x71, 0x0f, 0xc7, 0xa0, 0x78, 0xaa, 0x41, 0xae, 0x61, 0xf7, 0x74, 0x7b,
- 0xa3, 0x37, 0xd5, 0x04, 0x26, 0x2d, 0x03, 0x2e, 0xe7, 0x69, 0xa8, 0xf0,
- 0x5e, 0xb6, 0xb5, 0xa7, 0xda, 0x2b, 0x84, 0x59, 0xf4, 0xb5, 0x8d, 0x7e,
- 0xab, 0x14, 0x26, 0x23, 0x5c, 0x65, 0x17, 0xc4, 0x44, 0x11, 0x97, 0x1c,
- 0xd9, 0x32, 0xe6, 0x43, 0x39, 0x5b, 0x92, 0xe0, 0x2c, 0x41, 0x75, 0x31,
- 0x03, 0x97, 0xd8, 0xb6, 0xc5, 0xcc, 0xa0, 0x69, 0xb1, 0xf7, 0xa8, 0xdd,
- 0xa3, 0x10, 0x9a, 0xec, 0xca, 0x6e, 0x0c, 0x9d, 0xb3, 0x9b, 0x23, 0x66,
- 0x62, 0x89, 0xd3, 0xc4, 0x7a, 0x0d, 0x2d, 0x00, 0xc2, 0xb9, 0x55, 0x5a,
- 0x8c, 0xc8, 0xfa, 0xe9, 0x3a, 0xb5, 0xa6, 0x47, 0x1d, 0xc9, 0x24, 0xb9,
- 0xfd, 0x52, 0x3f, 0x1d, 0xb5, 0x31, 0x4e, 0x75, 0x11, 0x6e, 0x13, 0x8d,
- 0x8c, 0x8f, 0xe9, 0x98, 0x8c, 0xef, 0xed, 0xb7, 0xf8, 0x33, 0x29, 0x90,
- 0x2b, 0x56, 0x11, 0x7e, 0x2c, 0x53, 0x80, 0x5b, 0x8e, 0xe1, 0x3a, 0xe0,
- 0x45, 0xfb, 0x4b, 0x9d, 0xa6, 0xbf, 0xa3, 0x5a, 0x1c, 0xab, 0xd6, 0x98,
- 0x55, 0x7c, 0x8f, 0x1e, 0x40, 0x72, 0x12, 0xb1, 0xa6, 0x43, 0x3c, 0x14,
- 0x6c, 0x60, 0x0a, 0x1b, 0xdb, 0x51, 0xa9, 0x7a, 0x44, 0x9e, 0xa5, 0x94,
- 0xcb, 0x44, 0xf0, 0x09, 0xf5, 0x3e, 0x63, 0xb3, 0x13, 0xca, 0xf5, 0x95,
- 0x5c, 0xdc, 0xe2, 0x0c, 0x1f, 0x31, 0x21, 0x6e, 0xfc, 0xee, 0x87, 0x81,
- 0x65, 0xf7, 0xd1, 0xd5, 0xdc, 0xac, 0x39, 0x32, 0xe5, 0x06, 0x66, 0xb6,
- 0xeb, 0x07, 0xf9, 0x8b, 0xf9, 0xc8, 0xf7, 0x79, 0x61, 0x74, 0xc3, 0x7a,
- 0xdb, 0x57, 0x94, 0xc2, 0xb3, 0x4b, 0x65, 0x78, 0x6f, 0x08, 0xc9, 0xe5,
- 0x60, 0x69, 0xa4, 0x39, 0x73, 0x68, 0x82, 0x89, 0xb5, 0x8a, 0x69, 0xe2,
- 0x42, 0xa7, 0xb6, 0x60, 0xc7, 0xfd, 0x22, 0x80, 0xf4, 0x4b, 0x96, 0x13,
- 0x44, 0xc9, 0x95, 0x64, 0x23, 0x9b, 0x8e, 0x10, 0xfd, 0xfa, 0xd0, 0x46,
- 0xb2, 0x71, 0x75, 0x70, 0x76, 0xb6, 0x73, 0xee, 0x70, 0x1d, 0xcf, 0x48,
- 0xef, 0x82, 0x60, 0x0d, 0xcd, 0x2e, 0xc6, 0xb8, 0xf5, 0xcc, 0x8c, 0xac,
- 0x59, 0x6c, 0xed, 0x6d, 0x33, 0x83, 0xb2, 0xd4, 0x01, 0x2b, 0xdd, 0x75,
- 0x1f, 0x3a, 0x72, 0x08, 0x49, 0x97, 0xe0, 0x88, 0x6a, 0x00, 0x11, 0x7c,
- 0x59, 0x28, 0xb8, 0x81, 0xbc, 0xa2, 0x2b, 0x29, 0xc6, 0x0e, 0x65, 0x41,
- 0x80, 0x79, 0x40, 0xed, 0x46, 0x1c, 0xa8, 0x00, 0xb8, 0x2c, 0x88, 0x1c,
- 0xaa, 0xe6, 0x02, 0xd3, 0x5b, 0xae, 0xba, 0x8b, 0x90, 0x5b, 0x67, 0x39,
- 0xc7, 0xec, 0xcb, 0x6a, 0x36, 0x1d, 0x90, 0x00, 0xb9, 0xae, 0x4a, 0x73,
- 0x45, 0x56, 0x11, 0xba, 0x20, 0x31, 0x29, 0xa0, 0xea, 0x67, 0xc5, 0x6d,
- 0x5e, 0x95, 0x05, 0x68, 0xb2, 0x6e, 0xd3, 0x2a, 0x47, 0x4c, 0xbb, 0xf7,
- 0xcd, 0xd9, 0xdb, 0xe3, 0x9e, 0xef, 0x16, 0xb9, 0xca, 0xc5, 0x65, 0x4c,
- 0xeb, 0xd7, 0xf5, 0xc7, 0xea, 0x6a, 0x86, 0xe1, 0x9a, 0xc4, 0xdc, 0xe9,
- 0x46, 0xc9, 0xa1, 0x65, 0xbd, 0x95, 0x93, 0x44, 0x6a, 0xbd, 0x06, 0x83,
- 0x8d, 0x2e, 0x49, 0xf1, 0x6e, 0xb9, 0x9c, 0x1b, 0x70, 0x4f, 0xbb, 0x0d,
- 0x16, 0x02, 0x4e, 0xe0, 0x47, 0xb0, 0x06, 0x22, 0x38, 0x5d, 0x4b, 0x9f,
- 0xb6, 0x3e, 0xf1, 0xa8, 0xed, 0x49, 0xd3, 0xe7, 0x0d, 0xb0, 0xaa, 0x72,
- 0xd9, 0xe6, 0xfc, 0x9e, 0x0c, 0x9b, 0xcd, 0xd6, 0xae, 0x4b, 0x36, 0x6b,
- 0x32, 0xc6, 0x9b, 0x4d, 0x9d, 0x5e, 0x80, 0x23, 0xd7, 0xd4, 0x5f, 0x5c,
- 0xf5, 0x69, 0xde, 0xd5, 0xfc, 0x09, 0xd7, 0x3a, 0x37, 0xee, 0x4e, 0xdf,
- 0x41, 0x5f, 0xea, 0xce, 0x77, 0x45, 0x5a, 0x40, 0xce, 0x90, 0xba, 0xa4,
- 0x95, 0x76, 0x11, 0xa2, 0x76, 0xe0, 0x9c, 0x08, 0x13, 0x43, 0xc7, 0xa2,
- 0xf9, 0x7c, 0x39, 0x11, 0x9a, 0x0c, 0x17, 0x43, 0x94, 0xbc, 0x38, 0x49,
- 0x14, 0xe7, 0x5b, 0x8a, 0x97, 0xa2, 0xf0, 0xee, 0x67, 0x6a, 0x72, 0x05,
- 0x3f, 0x53, 0x9f, 0x39, 0xc2, 0x94, 0xa4, 0x26, 0x37, 0xca, 0x01, 0xb1,
- 0x05, 0x3b, 0x20, 0xa1, 0x7c, 0xaa, 0xaf, 0x2c, 0xb2, 0xbc, 0xee, 0xfd,
- 0xb0, 0x26, 0x3a, 0x74, 0x13, 0x87, 0xbe, 0xb0, 0x4b, 0xc6, 0x5c, 0x5e,
- 0xcc, 0x7c, 0x65, 0x29, 0x4d, 0xb4, 0xf4, 0x52, 0xa8, 0x24, 0x1f, 0xf4,
- 0x13, 0x99, 0x4f, 0x17, 0xb5, 0x07, 0xcf, 0x14, 0xa1, 0x51, 0xd8, 0xb2,
- 0xb1, 0x37, 0x57, 0x31, 0xe5, 0x8b, 0x91, 0x18, 0x35, 0x85, 0xae, 0x2f,
- 0x66, 0x62, 0xeb, 0x91, 0x34, 0x83, 0x63, 0xd7, 0x0e, 0x31, 0xa4, 0xdd,
- 0x22, 0x17, 0x4f, 0x18, 0xa5, 0x21, 0x15, 0xdd, 0x9a, 0xac, 0x84, 0x06,
- 0x40, 0xb0, 0xdb, 0x05, 0x07, 0x52, 0x91, 0xea, 0x9e, 0x42, 0xd4, 0x7c,
- 0x2d, 0x9d, 0x90, 0xce, 0xa9, 0xb5, 0xd3, 0xa2, 0x05, 0x88, 0xb8, 0x27,
- 0xa8, 0x7a, 0x7b, 0x3e, 0xa3, 0x68, 0xec, 0xec, 0x3e, 0x4a, 0xd2, 0xa0,
- 0x33, 0x6e, 0xc9, 0x3f, 0xa7, 0x25, 0xfb, 0x71, 0x19, 0x45, 0x91, 0x32,
- 0x43, 0x3d, 0x61, 0x32, 0x50, 0x6e, 0xd4, 0x72, 0xf3, 0xc7, 0x98, 0x99,
- 0x35, 0x7f, 0x64, 0x85, 0x09, 0x6b, 0xac, 0xec, 0x3d, 0xdf, 0xcc, 0xd6,
- 0x71, 0x0e, 0xa6, 0xa8, 0xf0, 0x8b, 0x8b, 0xd2, 0x3c, 0xb3, 0x3f, 0x5c,
- 0x53, 0x32, 0xd2, 0x8f, 0x69, 0x3c, 0xef, 0x18, 0x21, 0x4c, 0x39, 0x12,
- 0x33, 0x41, 0x28, 0xab, 0x4e, 0x6b, 0x36, 0xf0, 0x6a, 0x1c, 0x9e, 0x9e,
- 0xbf, 0x93, 0x72, 0xf4, 0xc4, 0xb4, 0x58, 0xd4, 0x4c, 0xdc, 0x8e, 0x1f,
- 0xdb, 0x52, 0xce, 0x91, 0xa2, 0x90, 0xb6, 0x8e, 0xcb, 0x55, 0xc4, 0x88,
- 0xd2, 0x2a, 0xcc, 0xc4, 0x82, 0xa0, 0x26, 0x8a, 0x28, 0x78, 0x6a, 0x46,
- 0x74, 0x87, 0x63, 0xbe, 0xe7, 0x7d, 0x16, 0xc2, 0x74, 0x7c, 0xef, 0xf2,
- 0x6b, 0xf8, 0xed, 0x2e, 0x57, 0x0e, 0x81, 0x3e, 0xa0, 0x9d, 0x06, 0x72,
- 0xbb, 0xc9, 0x2c, 0x9f, 0x8e, 0xd8, 0x6f, 0x96, 0x1f, 0x4a, 0x89, 0x97,
- 0x19, 0x76, 0x80, 0x84, 0x7a, 0xcd, 0xce, 0xad, 0x1f, 0x60, 0x72, 0x29,
- 0x16, 0x45, 0x90, 0x4a, 0x6d, 0xe7, 0x3b, 0x6a, 0x6d, 0x06, 0xe0, 0xd9,
- 0xf5, 0xf9, 0x4e, 0xda, 0x59, 0x62, 0x7c, 0x5e, 0xb3, 0xc4, 0xef, 0xfa,
- 0xfc, 0xd9, 0xf1, 0x92, 0xc4, 0x40, 0xe7, 0x1b, 0xb2, 0xbe, 0xac, 0x1e,
- 0xf1, 0x13, 0x52, 0x82, 0xdb, 0x91, 0x7b, 0x10, 0xcb, 0x50, 0x96, 0xce,
- 0xcd, 0xfd, 0x5f, 0x28, 0x00, 0x9e, 0x3c, 0xbc, 0x84, 0x52, 0xec, 0x4e,
- 0xe5, 0x32, 0x15, 0xc1, 0xe4, 0xf4, 0x82, 0x0e, 0x28, 0x9e, 0xbf, 0x01,
- 0x58, 0x0c, 0x37, 0x2e, 0xad, 0x47, 0x73, 0x9d, 0x5a, 0x92, 0x42, 0x83,
- 0x34, 0x5a, 0xb5, 0x82, 0x59, 0x06, 0xb9, 0x11, 0x5b, 0xbf, 0xca, 0x4c,
- 0xc0, 0xe4, 0x66, 0x59, 0x7c, 0x34, 0x5d, 0x08, 0x73, 0x31, 0x15, 0xc2,
- 0x9a, 0xa3, 0xc4, 0x60, 0xca, 0xfc, 0x98, 0x20, 0xb7, 0xd3, 0xd7, 0x89,
- 0xdd, 0xf0, 0x16, 0xfe, 0x3a, 0x29, 0x1b, 0xd8, 0x32, 0xb3, 0x62, 0xbd,
- 0x9b, 0xda, 0xa2, 0x26, 0x69, 0xe3, 0x26, 0x30, 0x0a, 0xd3, 0x76, 0x2b,
- 0x2d, 0xd5, 0xe5, 0xd8, 0xf8, 0xb8, 0xc6, 0xfd, 0x21, 0x6a, 0x25, 0xd4,
- 0x35, 0xe5, 0x3f, 0x21, 0x3f, 0x8c, 0x18, 0x1b, 0x81, 0xcc, 0x5b, 0xd6,
- 0x5c, 0x25, 0x5a, 0x96, 0x95, 0xf6, 0x83, 0x4f, 0x9a, 0x1c, 0xe9, 0x49,
- 0x3b, 0x31, 0x78, 0xdd, 0x3e, 0x10, 0xc7, 0xac, 0x4b, 0x22, 0x16, 0x68,
- 0x45, 0xed, 0x10, 0x8e, 0x54, 0xd8, 0xa4, 0x55, 0x51, 0x21, 0x22, 0xb9,
- 0x34, 0x45, 0xc9, 0x96, 0x78, 0x67, 0x66, 0x63, 0xc7, 0x38, 0xf2, 0xaf,
- 0x9b, 0x24, 0x37, 0x14, 0x6f, 0x9e, 0xec, 0x0f, 0x3b, 0x73, 0x54, 0xac,
- 0x14, 0x87, 0x7e, 0x05, 0x9b, 0x77, 0x46, 0xf8, 0x90, 0x24, 0xf4, 0x04,
- 0xe1, 0xbb, 0xae, 0x18, 0xd4, 0x91, 0x76, 0x1d, 0x5b, 0x84, 0x1e, 0x7f,
- 0x94, 0x1c, 0x6c, 0x0b, 0xb2, 0x77, 0x24, 0xf6, 0xcc, 0x7f, 0xba, 0xcd,
- 0x3d, 0x5a, 0x04, 0x42, 0x0d, 0xb1, 0x26, 0xba, 0x12, 0x96, 0xad, 0xf0,
- 0x61, 0xfd, 0x7a, 0x19, 0x68, 0x19, 0x25, 0xac, 0xb0, 0x8b, 0x89, 0xc1,
- 0xa2, 0x25, 0x05, 0x15, 0xec, 0xf2, 0xfb, 0xc8, 0x40, 0xfa, 0x9e, 0x74,
- 0x39, 0x9f, 0x46, 0xf3, 0xc7, 0x75, 0x69, 0xa5, 0xa0, 0x89, 0x1c, 0x01,
- 0x5a, 0x0b, 0x25, 0xae, 0x38, 0x79, 0x6d, 0xf6, 0x18, 0x29, 0xa5, 0xe4,
- 0x9b, 0xfd, 0xea, 0x3e, 0x59, 0xb1, 0xb8, 0xa0, 0x97, 0xb0, 0x11, 0x5c,
- 0x58, 0xf2, 0x54, 0x25, 0xd2, 0x43, 0x2b, 0x50, 0x2b, 0xd9, 0xd0, 0x83,
- 0xff, 0x73, 0x8e, 0x9b, 0x30, 0x55, 0xc7, 0x3d, 0x0f, 0xa4, 0x34, 0x22,
- 0x89, 0xf4, 0x66, 0xc9, 0x15, 0xbb, 0x85, 0x1f, 0xc8, 0x16, 0xab, 0xad,
- 0x32, 0xa4, 0x3b, 0x52, 0x87, 0xbd, 0x1e, 0x07, 0x05, 0x70, 0xd9, 0x5b,
- 0x5d, 0x67, 0xe6, 0x20, 0x72, 0x02, 0xcc, 0xb8, 0x2a, 0x3f, 0x66, 0xbc,
- 0xe9, 0x60, 0x44, 0xd0, 0x91, 0x4a, 0x55, 0x5b, 0xe2, 0xe0, 0x62, 0x3e,
- 0x9b, 0x5a, 0x20, 0x5e, 0x44, 0x63, 0xa5, 0xda, 0x0a, 0x92, 0x30, 0xee,
- 0x84, 0x61, 0xee, 0xf2, 0xb5, 0x95, 0xf5, 0x95, 0x97, 0x6b, 0x32, 0xc9,
- 0x22, 0xae, 0x06, 0x37, 0x17, 0x8d, 0x57, 0x4d, 0x32, 0x76, 0xec, 0x5b,
- 0xe7, 0xde, 0xa2, 0x3b, 0x57, 0x9f, 0x7c, 0xbb, 0xea, 0xfe, 0xc9, 0x8f,
- 0x2c, 0xe9, 0xe3, 0x4b, 0x26, 0x98, 0xbd, 0x04, 0x5f, 0x57, 0xf2, 0xd2,
- 0x6c, 0x2a, 0xf6, 0x7a, 0x51, 0xd8, 0xaa, 0xeb, 0xd0, 0x42, 0xe9, 0x8f,
- 0x81, 0x1a, 0x17, 0x53, 0x9b, 0x58, 0x75, 0x25, 0xe9, 0x06, 0x0c, 0xd7,
- 0x9f, 0xba, 0x72, 0x3c, 0x42, 0x2e, 0x8b, 0x6c, 0x79, 0xb3, 0x61, 0xc2,
- 0x43, 0xee, 0x3c, 0x35, 0x6c, 0x63, 0x42, 0xcd, 0xa6, 0xd5, 0x01, 0x69,
- 0x48, 0x5e, 0x3b, 0xd4, 0xd5, 0x7f, 0x10, 0xb4, 0xb5, 0x32, 0x17, 0x1c,
- 0x61, 0x9b, 0xf8, 0x4b, 0x81, 0xd6, 0xc9, 0x24, 0xf8, 0x36, 0xfd, 0x81,
- 0xb3, 0x97, 0x2d, 0x23, 0x06, 0x15, 0x43, 0xf2, 0xaf, 0x04, 0xe6, 0xbd,
- 0x4d, 0x8e, 0xc9, 0x2e, 0x89, 0xd8, 0x7c, 0x4a, 0x00, 0x80, 0x31, 0xe6,
- 0x42, 0x98, 0xc9, 0x20, 0x24, 0x31, 0xa0, 0x53, 0xc5, 0x17, 0x29, 0xc7,
- 0x9a, 0x2d, 0xf5, 0x1e, 0x39, 0xf5, 0xd4, 0x23, 0x41, 0xf1, 0x68, 0xa9,
- 0x0e, 0xfd, 0x91, 0xe5, 0xbf, 0x6f, 0xa9, 0xe1, 0xb0, 0x41, 0xd8, 0x34,
- 0x8d, 0x50, 0xc1, 0xa2, 0x37, 0x89, 0x7b, 0xa8, 0xef, 0xfd, 0xfd, 0xe0,
- 0xf3, 0xdd, 0xbe, 0xc8, 0x27, 0x8a, 0x67, 0xf9, 0xcf, 0xa0, 0xa4, 0x63,
- 0x44, 0x8d, 0xa0, 0xe7, 0xcc, 0x4f, 0xed, 0xa3, 0x6b, 0xf7, 0xce, 0x8b,
- 0xe1, 0xd3, 0xd6, 0xde, 0x69, 0x66, 0xf3, 0xc1, 0xdd, 0xf8, 0x01, 0x8f,
- 0xff, 0xe5, 0xe9, 0xdb, 0x64, 0xbe, 0x44, 0xcd, 0x3c, 0x61, 0x68, 0xbc,
- 0x9f, 0x65, 0xea, 0x7c, 0x25, 0xa7, 0x06, 0x3b, 0xc9, 0x6e, 0x60, 0x6c,
- 0x85, 0x60, 0xdd, 0x88, 0x6b, 0xdb, 0xa6, 0x07, 0x8a, 0xad, 0x2b, 0x15,
- 0x38, 0x12, 0x6a, 0x11, 0x4e, 0x5c, 0x4a, 0xef, 0x9d, 0xe5, 0xd1, 0x1c,
- 0x0e, 0x85, 0x50, 0x66, 0x9f, 0xb2, 0xc9, 0x12, 0xe1, 0x59, 0xd2, 0x99,
- 0x88, 0xd0, 0x65, 0xbd, 0xdb, 0xd8, 0x73, 0x15, 0x8b, 0x73, 0xd8, 0xfc,
- 0xa0, 0x3b, 0x19, 0x8e, 0xd0, 0x5e, 0x06, 0xcf, 0xa3, 0x0f, 0x9c, 0x46,
- 0x0c, 0x06, 0xc2, 0xef, 0xda, 0xbf, 0x0a, 0x22, 0xa4, 0x00, 0x6e, 0xd3,
- 0x25, 0x31, 0xcd, 0xea, 0xfc, 0xba, 0xe0, 0x8b, 0xf1, 0x6d, 0x3e, 0xa9,
- 0xca, 0xba, 0xbc, 0x62, 0x48, 0x92, 0x77, 0x63, 0x9e, 0x9c, 0x8c, 0x92,
- 0xbb, 0x6c, 0xac, 0xf9, 0x8f, 0xc3, 0xd0, 0x85, 0xca, 0x27, 0x8b, 0xc2,
- 0x02, 0x55, 0x9e, 0x35, 0x34, 0x6b, 0x1a, 0x08, 0x24, 0xd2, 0x16, 0x54,
- 0xab, 0x1c, 0x64, 0xc5, 0xb5, 0xb1, 0xe0, 0xa0, 0xd7, 0x52, 0x9d, 0x86,
- 0x19, 0xc4, 0xf5, 0x22, 0x2b, 0x23, 0xe1, 0x60, 0xee, 0x80, 0x8a, 0x5a,
- 0xde, 0x27, 0xb8, 0xd7, 0xc6, 0xa9, 0x54, 0x1c, 0x60, 0xab, 0xd8, 0x1c,
- 0x45, 0xba, 0xba, 0xc5, 0x5d, 0xf7, 0x91, 0x1c, 0x45, 0x41, 0x5a, 0x82,
- 0xad, 0x82, 0xdd, 0x22, 0x8f, 0x47, 0xc5, 0x86, 0x69, 0x59, 0x01, 0x83,
- 0xe3, 0x71, 0x82, 0x53, 0x19, 0x87, 0x65, 0x45, 0x9e, 0x52, 0xea, 0xde,
- 0x7d, 0x28, 0x63, 0xee, 0x6e, 0x4a, 0xae, 0x9d, 0x80, 0x69, 0x26, 0x71,
- 0x8d, 0x84, 0x4a, 0xce, 0xe1, 0x10, 0x7a, 0x5d, 0x29, 0x62, 0xa6, 0x32,
- 0xd8, 0x5f, 0xa8, 0x58, 0x0e, 0x86, 0xae, 0x87, 0xcb, 0x1f, 0x14, 0xa7,
- 0xc4, 0xeb, 0xfc, 0x7a, 0x45, 0xa9, 0x12, 0x76, 0x98, 0x68, 0xf5, 0x47,
- 0x56, 0xa6, 0xb8, 0x47, 0x72, 0x91, 0x54, 0x2c, 0x8d, 0x82, 0x12, 0x3c,
- 0x91, 0x3a, 0xc0, 0x7c, 0x07, 0xc4, 0x76, 0xdf, 0x2f, 0xc2, 0x6d, 0xfc,
- 0xb2, 0xd2, 0x28, 0x6b, 0x55, 0x22, 0xaf, 0x2f, 0xf6, 0x08, 0x44, 0x23,
- 0x8f, 0x4e, 0xf3, 0x09, 0xd8, 0x06, 0x1e, 0xd2, 0x83, 0xe2, 0x7e, 0x6a,
- 0x0d, 0xe4, 0x44, 0xfd, 0x1d, 0x1e, 0xe1, 0xab, 0xd6, 0xe9, 0xa3, 0xf5,
- 0x69, 0x47, 0x7a, 0xfc, 0xb3, 0x5b, 0xd2, 0x0f, 0xf6, 0x07, 0xe3, 0xcc,
- 0x28, 0x38, 0xd5, 0x9a, 0xdc, 0x83, 0x48, 0xf2, 0xc1, 0x57, 0x78, 0x27,
- 0xb9, 0x84, 0xe2, 0x41, 0x6b, 0x7a, 0x46, 0x15, 0xef, 0x93, 0xfd, 0xe1,
- 0xee, 0xa3, 0x72, 0x0f, 0x20, 0x09, 0x5a, 0x6d, 0xe8, 0xaa, 0xd1, 0x49,
- 0x2a, 0x8b, 0xbf, 0x2e, 0x8b, 0x36, 0xc9, 0x73, 0xcc, 0x27, 0x2d, 0xca,
- 0x84, 0xde, 0x45, 0xe4, 0x85, 0xef, 0xa2, 0x67, 0x7d, 0x76, 0xfc, 0xc1,
- 0x00, 0x06, 0x4d, 0xf5, 0x50, 0xf8, 0xae, 0x8e, 0x92, 0x30, 0xb4, 0x3a,
- 0x2b, 0x14, 0x31, 0x12, 0x29, 0x64, 0xba, 0x75, 0xf2, 0x6a, 0xf3, 0x61,
- 0xb2, 0x15, 0x56, 0xa0, 0xd4, 0x5d, 0xbc, 0x39, 0xea, 0x34, 0xf7, 0xfc,
- 0xb3, 0x67, 0xbb, 0xbf, 0x23, 0x32, 0xad, 0x24, 0x5f, 0x81, 0xd8, 0xd4,
- 0x51, 0x6e, 0x94, 0xef, 0x2b, 0x4a, 0x4d, 0x54, 0xab, 0xbb, 0x94, 0x87,
- 0xfc, 0xe4, 0xe9, 0xba, 0x99, 0x12, 0x4a, 0xc9, 0x72, 0x2b, 0x54, 0xaa,
- 0xfa, 0xfe, 0xf7, 0x3f, 0xc2, 0xd4, 0xc9, 0x1f, 0x7f, 0x86, 0x17, 0x1c,
- 0x75, 0x60, 0x2c, 0x8e, 0x5b, 0xa5, 0x4b, 0xed, 0xdc, 0x6b, 0x74, 0x8e,
- 0x37, 0xff, 0xb0, 0x99, 0x58, 0x6a, 0x7a, 0x30, 0x57, 0x06, 0x91, 0x59,
- 0x85, 0x32, 0xe6, 0x62, 0xa6, 0x4a, 0xef, 0x74, 0x59, 0x2b, 0xa9, 0xbc,
- 0x69, 0x1d, 0xf2, 0x3a, 0x0b, 0x42, 0xd9, 0x3e, 0x5d, 0x55, 0x73, 0x41,
- 0x59, 0xd6, 0x85, 0xb1, 0x5c, 0xdd, 0xc3, 0xe4, 0x14, 0x66, 0x48, 0x11,
- 0x46, 0x40, 0x8a, 0xd9, 0x29, 0x17, 0x13, 0x5f, 0xe1, 0xcb, 0x13, 0xe0,
- 0xcc, 0x7f, 0x9b, 0x15, 0xe8, 0x37, 0x77, 0xe5, 0x3f, 0xda, 0x7e, 0xbd,
- 0x32, 0xe9, 0x51, 0x7f, 0x3f, 0xfc, 0x61, 0x8f, 0x72, 0x3e, 0x7a, 0xdd,
- 0x26, 0x18, 0xbf, 0x6d, 0x57, 0x55, 0x07, 0x51, 0xaf, 0x23, 0x85, 0xd4,
- 0x0f, 0x52, 0x42, 0x69, 0x9f, 0x54, 0xa8, 0x7f, 0xa0, 0x4c, 0xed, 0x8f,
- 0x7b, 0x83, 0x67, 0x3f, 0xdb, 0x8f, 0xfe, 0x61, 0xef, 0xc3, 0x1f, 0xf6,
- 0x7b, 0xb1, 0x94, 0x1e, 0x97, 0xe0, 0xed, 0x01, 0xf3, 0x48, 0xbb, 0x2b,
- 0xee, 0x05, 0x87, 0x2f, 0x81, 0x35, 0x57, 0x25, 0x06, 0xd5, 0x8f, 0x22,
- 0x2c, 0x38, 0xe4, 0xc5, 0x19, 0xb2, 0xf3, 0xd4, 0xa9, 0x6d, 0x5a, 0x29,
- 0x46, 0x85, 0xc3, 0x5d, 0xc9, 0xef, 0x6b, 0x1a, 0x3c, 0x9d, 0x10, 0x41,
- 0x88, 0x07, 0x42, 0xb0, 0xc8, 0xda, 0xdb, 0x83, 0x38, 0x31, 0x94, 0x48,
- 0x21, 0x9c, 0x0d, 0x81, 0x03, 0x99, 0x8b, 0x2c, 0x4d, 0x3a, 0x93, 0x3e,
- 0x1e, 0xdb, 0x9f, 0x14, 0x59, 0x90, 0x6a, 0xa3, 0x69, 0x79, 0x6c, 0xca,
- 0xa8, 0x38, 0x28, 0x5b, 0xfe, 0x6e, 0xbe, 0x18, 0x78, 0xe4, 0x1a, 0x72,
- 0x4a, 0x70, 0xa4, 0x03, 0xc4, 0xcd, 0x5f, 0x09, 0xbd, 0xe0, 0xe3, 0x4b,
- 0xf8, 0x3a, 0x31, 0x0d, 0xe6, 0xae, 0x62, 0x25, 0xff, 0x4c, 0x42, 0x0e,
- 0x94, 0xc6, 0x8d, 0x32, 0x25, 0xb1, 0x24, 0xcc, 0x74, 0x4c, 0x45, 0x5c,
- 0x5a, 0xe4, 0xff, 0xa8, 0x65, 0x4b, 0x97, 0xcd, 0xd8, 0x71, 0x0a, 0xa5,
- 0xf5, 0x8a, 0x09, 0xf1, 0xa7, 0xc2, 0x9b, 0x04, 0x99, 0x28, 0x4c, 0xce,
- 0xfa, 0x5a, 0x1d, 0x03, 0xc2, 0x4c, 0x36, 0xd9, 0xc0, 0xcb, 0x7b, 0x44,
- 0x9e, 0x25, 0x7e, 0xaa, 0x29, 0x52, 0x13, 0x2e, 0x04, 0x80, 0x70, 0xd6,
- 0x20, 0x88, 0xc1, 0xd1, 0xd5, 0x34, 0xbd, 0x37, 0xd2, 0x90, 0x29, 0x16,
- 0x87, 0x16, 0xdd, 0xae, 0xf6, 0xb2, 0x48, 0x1b, 0xb3, 0xd5, 0x36, 0x07,
- 0x9b, 0xc9, 0x96, 0xb5, 0x72, 0xa6, 0x69, 0x7d, 0xb3, 0x1d, 0xf3, 0xc9,
- 0x39, 0x37, 0x98, 0x13, 0x54, 0x63, 0x31, 0xc3, 0xe9, 0xae, 0x64, 0x09,
- 0xb5, 0xee, 0x9a, 0x3e, 0x43, 0xc0, 0x83, 0xd1, 0x71, 0x03, 0x0f, 0xd2,
- 0xd1, 0xfa, 0xd9, 0x00, 0xa6, 0x3e, 0x7e, 0x9e, 0x0c, 0xfe, 0x2b, 0xbc,
- 0x17, 0xe4, 0x51, 0x06, 0x38, 0x0d, 0x38, 0xcd, 0xc5, 0x5d, 0xa0, 0x14,
- 0xbb, 0x4a, 0x5e, 0x2e, 0x6e, 0x2a, 0xa3, 0xf6, 0x85, 0xd9, 0x34, 0xa3,
- 0x6f, 0x12, 0xb8, 0x25, 0xa8, 0xce, 0x02, 0x3f, 0x63, 0x77, 0x87, 0x47,
- 0x4d, 0xf7, 0x3b, 0x32, 0xa1, 0x11, 0x76, 0x62, 0x90, 0xd6, 0x83, 0x40,
- 0xc5, 0xb9, 0x74, 0x69, 0x94, 0xec, 0x4e, 0x2a, 0xd9, 0x10, 0x21, 0xdc,
- 0x1e, 0x45, 0x92, 0x8a, 0x09, 0x6a, 0xab, 0x25, 0x3b, 0xc3, 0xe1, 0x0e,
- 0xc9, 0xac, 0x1d, 0xf3, 0x87, 0x98, 0x31, 0x40, 0x99, 0x76, 0xab, 0x5b,
- 0x98, 0x5d, 0x4e, 0xdf, 0x22, 0x7f, 0x88, 0x14, 0x48, 0x72, 0xbe, 0xe3,
- 0xfa, 0x6f, 0x4b, 0x20, 0x2f, 0x2b, 0xa3, 0x46, 0x56, 0x9c, 0xa9, 0x39,
- 0xef, 0x5c, 0x92, 0x41, 0x4d, 0x09, 0xf6, 0x33, 0xd7, 0xc2, 0x0b, 0xd0,
- 0xdc, 0x74, 0x92, 0x88, 0x18, 0x3a, 0x0d, 0x44, 0x6c, 0xde, 0x28, 0x1f,
- 0x13, 0xf2, 0x64, 0xd3, 0xb5, 0xbc, 0x12, 0x4f, 0xf7, 0xdb, 0x4e, 0x80,
- 0x45, 0x5e, 0x18, 0xd3, 0xc2, 0x28, 0xc5, 0xe0, 0xda, 0x23, 0xe4, 0x59,
- 0x98, 0xa5, 0xa1, 0x4c, 0xd2, 0xdd, 0xea, 0x02, 0xb6, 0xa0, 0xad, 0x5f,
- 0x3b, 0xd1, 0x95, 0xaf, 0xe0, 0xd8, 0xf5, 0x56, 0x70, 0x59, 0xf2, 0x47,
- 0xb6, 0xa9, 0x09, 0x0f, 0x9b, 0xba, 0xc8, 0x2c, 0x07, 0xba, 0xd0, 0x7a,
- 0xa4, 0x0c, 0x7c, 0xe1, 0x4a, 0xd1, 0x0c, 0xd9, 0x8d, 0xb9, 0x00, 0xac,
- 0x01, 0x6e, 0x0f, 0x94, 0xd7, 0x05, 0x33, 0x66, 0xa2, 0x2b, 0x34, 0x33,
- 0xff, 0xfa, 0xf8, 0x42, 0x34, 0x14, 0xa4, 0xfe, 0xba, 0x9a, 0x60, 0x61,
- 0xd1, 0x5b, 0xb2, 0x60, 0x9e, 0x3f, 0xb5, 0xe5, 0xe2, 0xea, 0x9b, 0x74,
- 0xff, 0xd9, 0x73, 0xe9, 0xb6, 0xf2, 0x22, 0xc1, 0x40, 0xda, 0xe4, 0x5f,
- 0xed, 0xec, 0x70, 0x90, 0x98, 0xac, 0xd2, 0x40, 0x2e, 0xa4, 0x52, 0xf4,
- 0x6e, 0xf3, 0xcf, 0x9b, 0xf1, 0x3c, 0x2a, 0x55, 0x59, 0xb5, 0x32, 0x15,
- 0xc2, 0x52, 0x60, 0x1c, 0xf4, 0xd9, 0xb4, 0xfb, 0xad, 0xba, 0xc6, 0xc8,
- 0xda, 0x08, 0x8a, 0x10, 0x7b, 0x74, 0xd9, 0xc2, 0x23, 0x20, 0xc5, 0x36,
- 0x12, 0xcd, 0x36, 0x1c, 0x26, 0x87, 0xfe, 0xec, 0x00, 0x6e, 0x85, 0x7a,
- 0x68, 0x93, 0x90, 0xac, 0x42, 0xc1, 0x5e, 0xb4, 0x20, 0x5e, 0xcb, 0x02,
- 0x79, 0x24, 0x22, 0x5a, 0x62, 0x70, 0xa3, 0x9d, 0xa7, 0x31, 0x08, 0xf6,
- 0x4f, 0x60, 0x31, 0x97, 0xe3, 0x20, 0x29, 0x42, 0xbe, 0xa9, 0x70, 0x20,
- 0x36, 0xe5, 0x3d, 0x50, 0x9c, 0x3b, 0x2e, 0xe6, 0x36, 0xa8, 0x38, 0x16,
- 0xe2, 0xd7, 0x7c, 0x5f, 0x4b, 0xb2, 0x4a, 0xdc, 0x26, 0x66, 0x5d, 0x72,
- 0xa6, 0xd8, 0x31, 0x6b, 0x4b, 0x61, 0x90, 0xe0, 0x1c, 0x98, 0xad, 0xb0,
- 0x43, 0xfb, 0x40, 0xac, 0x8c, 0x80, 0x86, 0x9b, 0x1c, 0xae, 0x2f, 0x86,
- 0xbb, 0x07, 0xc9, 0xd9, 0x22, 0x2b, 0xcc, 0xfc, 0xf7, 0x93, 0xaf, 0x8b,
- 0x25, 0xad, 0x07, 0x0d, 0xfa, 0xeb, 0xd1, 0xb7, 0x41, 0xb6, 0x3f, 0xbd,
- 0xf1, 0xf4, 0x09, 0xbd, 0xf1, 0x6e, 0xc4, 0x4f, 0xdd, 0x95, 0xb3, 0x2b,
- 0x2a, 0x5f, 0x7a, 0x74, 0x9f, 0x9a, 0x3f, 0x62, 0x8f, 0x7f, 0x46, 0x8f,
- 0x9b, 0x8d, 0x37, 0x6d, 0x66, 0x75, 0xec, 0xf7, 0xe8, 0xc0, 0x79, 0x39,
- 0x4b, 0x2b, 0x78, 0x6d, 0x79, 0xf3, 0xad, 0xe9, 0xf1, 0xd3, 0xa7, 0x91,
- 0x1e, 0xf7, 0x57, 0x74, 0x68, 0xf8, 0xcf, 0xf7, 0xe8, 0x0c, 0x7e, 0x30,
- 0xfa, 0xdb, 0x38, 0x9d, 0x7c, 0xc4, 0x4e, 0x04, 0x86, 0xdb, 0x52, 0x88,
- 0xfe, 0x9e, 0xd2, 0x9c, 0xf3, 0xcb, 0x1f, 0x53, 0xb1, 0xa2, 0x02, 0xc5,
- 0x56, 0x83, 0xb4, 0xe5, 0xcf, 0xf6, 0x9f, 0xec, 0xed, 0x3c, 0x1f, 0x3e,
- 0x1d, 0xee, 0x5b, 0x4c, 0x95, 0xd9, 0x58, 0xe6, 0xf3, 0x0d, 0x82, 0xdb,
- 0xab, 0xca, 0x4b, 0xe5, 0x85, 0x69, 0xc7, 0xcb, 0xa6, 0xaf, 0xd9, 0x63,
- 0xe4, 0xd0, 0x14, 0x94, 0x3b, 0xbf, 0xe7, 0x67, 0xe6, 0x0c, 0x23, 0xe5,
- 0x81, 0x28, 0x25, 0x9f, 0x3a, 0xa1, 0x5e, 0x0e, 0xaa, 0xef, 0x07, 0x98,
- 0xe3, 0x38, 0x37, 0xd6, 0x72, 0x53, 0x2e, 0xe1, 0x62, 0x26, 0xdf, 0x8d,
- 0xf2, 0x28, 0x43, 0x49, 0xc2, 0x38, 0xe8, 0x88, 0x45, 0x9c, 0x62, 0xdc,
- 0x79, 0x20, 0x57, 0x5d, 0x70, 0x86, 0xb3, 0x7f, 0x72, 0x2e, 0xd5, 0xc9,
- 0x34, 0xf7, 0xc6, 0x98, 0xe1, 0x92, 0xbc, 0xdf, 0x18, 0x5b, 0xe3, 0x16,
- 0x4e, 0xd4, 0xa0, 0x8c, 0x92, 0x54, 0x64, 0x21, 0x15, 0xd9, 0xba, 0xc1,
- 0x35, 0xe8, 0xef, 0x68, 0x8e, 0xe5, 0x07, 0x9c, 0x2f, 0xc0, 0xbe, 0x0f,
- 0x8c, 0x7b, 0x10, 0xe6, 0x72, 0x7a, 0xf5, 0xb3, 0xdc, 0x8a, 0x0b, 0x4b,
- 0x30, 0x65, 0xeb, 0xb0, 0xbb, 0xd7, 0x21, 0x63, 0xfd, 0xbc, 0xab, 0x98,
- 0xeb, 0xe5, 0x01, 0x3f, 0x84, 0xd0, 0x0c, 0xb4, 0x79, 0x06, 0xf8, 0x5f,
- 0x9d, 0x92, 0x5e, 0x7a, 0x0b, 0x06, 0x59, 0x3b, 0x9d, 0xaa, 0x47, 0xda,
- 0xe6, 0xaf, 0xde, 0x65, 0x4f, 0x7e, 0xfb, 0x5d, 0xb6, 0xff, 0xd8, 0x5d,
- 0xe6, 0x36, 0x19, 0x9d, 0xb3, 0x35, 0x5b, 0x0c, 0xb4, 0x4a, 0x52, 0xfe,
- 0x33, 0xbe, 0xcb, 0xfc, 0x6d, 0x06, 0x33, 0x35, 0xb6, 0xd1, 0x5a, 0xfb,
- 0xcc, 0x6e, 0xb3, 0x15, 0xbb, 0x8c, 0xc9, 0x88, 0x78, 0x8f, 0xad, 0xdf,
- 0x62, 0x9a, 0xf5, 0x9a, 0xac, 0xdf, 0x65, 0x6d, 0xea, 0xee, 0xf5, 0xfb,
- 0xcc, 0x6d, 0x87, 0x47, 0xef, 0x32, 0x71, 0x00, 0x8b, 0xd4, 0x59, 0xb1,
- 0xc5, 0x5a, 0x7b, 0x6c, 0x4d, 0x61, 0xa7, 0xbd, 0x17, 0xb1, 0x5d, 0xf6,
- 0xe4, 0x57, 0xef, 0xb2, 0xa7, 0xbf, 0xfd, 0x2e, 0x7b, 0xf2, 0xff, 0x97,
- 0x65, 0xff, 0xe3, 0x64, 0xd9, 0xde, 0x2f, 0x93, 0x65, 0xfb, 0x9d, 0x20,
- 0x9f, 0x51, 0x57, 0xd9, 0xcb, 0xfc, 0xa3, 0x7a, 0xfb, 0x0f, 0x76, 0x76,
- 0x7e, 0x86, 0xf3, 0xe4, 0x80, 0xee, 0xeb, 0x9f, 0x83, 0x2a, 0x7d, 0x59,
- 0x27, 0xaf, 0x90, 0x5f, 0x17, 0x7d, 0x4b, 0xf5, 0x31, 0x57, 0x3b, 0xd9,
- 0x12, 0x09, 0x4b, 0x49, 0xc9, 0x76, 0x73, 0xdf, 0x80, 0x40, 0x74, 0x51,
- 0xd9, 0xc8, 0xdb, 0xa1, 0xfb, 0x87, 0x2d, 0x6b, 0x9a, 0x26, 0xa3, 0xb3,
- 0xa3, 0x6f, 0x47, 0xf4, 0xcd, 0xf4, 0x23, 0xca, 0xc0, 0x46, 0xab, 0x53,
- 0x5e, 0xde, 0x78, 0x2d, 0xa9, 0x0f, 0x2b, 0x96, 0x50, 0x2f, 0xd4, 0x59,
- 0xde, 0x80, 0xe9, 0xbd, 0x20, 0xfd, 0x39, 0xff, 0xd4, 0xa6, 0x73, 0xf1,
- 0x0b, 0x74, 0xcb, 0x47, 0x6c, 0x1b, 0xb5, 0x26, 0x8e, 0x10, 0x1b, 0x7e,
- 0xfd, 0xd4, 0x34, 0x19, 0xa0, 0x14, 0xf1, 0x8b, 0x94, 0x7e, 0x23, 0xff,
- 0x78, 0x46, 0x1f, 0x46, 0xe0, 0x8f, 0xff, 0x79, 0x83, 0x7f, 0x73, 0x90,
- 0x5b, 0x0b, 0xbb, 0x67, 0xab, 0xa8, 0x63, 0x78, 0x46, 0xf4, 0x64, 0xb8,
- 0x6a, 0xf2, 0x64, 0x5f, 0xba, 0x0c, 0x2e, 0x7f, 0xcc, 0x64, 0xce, 0x22,
- 0x1f, 0x31, 0xc6, 0x49, 0xee, 0x9d, 0x2b, 0xb4, 0xfc, 0x74, 0x45, 0x2e,
- 0x46, 0x96, 0xf8, 0x24, 0x7e, 0x9a, 0xaa, 0xee, 0x97, 0x8b, 0x71, 0x61,
- 0x54, 0x59, 0x82, 0x3e, 0x33, 0x3a, 0x86, 0x90, 0x52, 0x62, 0x87, 0x97,
- 0x9e, 0xef, 0xed, 0x7e, 0x1e, 0xba, 0x7b, 0xdf, 0x6b, 0x06, 0x95, 0xe3,
- 0xb1, 0x43, 0x74, 0x1e, 0x68, 0xe6, 0xb1, 0x4b, 0x1c, 0x88, 0x7d, 0x34,
- 0x92, 0x66, 0x45, 0x16, 0x38, 0x65, 0xb8, 0x96, 0x53, 0x57, 0x65, 0x3c,
- 0x28, 0x7d, 0xcc, 0x99, 0xa3, 0x35, 0xc4, 0x94, 0x50, 0xb0, 0x4a, 0x8c,
- 0x39, 0x38, 0xae, 0xa8, 0xc8, 0x29, 0x51, 0x9e, 0x2f, 0x1d, 0x4b, 0xd6,
- 0x1f, 0x9f, 0xee, 0xd2, 0x9a, 0x6a, 0x23, 0x29, 0x97, 0x00, 0xe6, 0x3d,
- 0xf7, 0xc7, 0x27, 0xe9, 0xf0, 0x5f, 0xc8, 0x71, 0xf3, 0xac, 0x6d, 0xcb,
- 0xff, 0xa1, 0xcf, 0x71, 0x99, 0x6b, 0xa2, 0xe1, 0x18, 0x8c, 0xd3, 0x2a,
- 0x82, 0xd8, 0x17, 0x51, 0xac, 0xfc, 0x0d, 0xca, 0x7e, 0xa0, 0x6f, 0x81,
- 0xe5, 0x18, 0x38, 0x4f, 0xae, 0xe0, 0x63, 0x7f, 0x9e, 0x84, 0xcd, 0x75,
- 0x2a, 0x4e, 0xab, 0xc7, 0xa2, 0xcf, 0xbc, 0x43, 0x1e, 0xed, 0x50, 0x3a,
- 0xeb, 0x53, 0xf8, 0x2c, 0x42, 0x4e, 0xc3, 0xb7, 0x77, 0xeb, 0x23, 0x44,
- 0x20, 0x74, 0xe7, 0xd9, 0xf2, 0xcc, 0xfe, 0x7d, 0x05, 0xaf, 0xb9, 0x05,
- 0x03, 0x98, 0xdf, 0x53, 0x18, 0x34, 0x76, 0x9d, 0xd4, 0x93, 0x2a, 0x93,
- 0xe8, 0x04, 0x71, 0xc8, 0x21, 0xe4, 0x49, 0xec, 0x6b, 0xe6, 0x2a, 0xb9,
- 0xce, 0x34, 0x57, 0xcf, 0x8e, 0x5b, 0xf9, 0x18, 0x40, 0xc2, 0x30, 0x8c,
- 0x00, 0x64, 0x3d, 0x04, 0x8c, 0xad, 0x87, 0x98, 0x0a, 0x67, 0x03, 0xbd,
- 0xec, 0x38, 0xca, 0xec, 0x74, 0xb0, 0xab, 0x2e, 0x8c, 0x4a, 0xb6, 0x46,
- 0xc0, 0x20, 0x65, 0x80, 0xde, 0xf7, 0x76, 0xf7, 0x9f, 0x32, 0xd1, 0x85,
- 0xfd, 0x58, 0xd5, 0xb1, 0x7a, 0x90, 0x36, 0xaa, 0x47, 0xf8, 0xa5, 0x9e,
- 0xfe, 0x2f, 0x1e, 0x04, 0x85, 0x5b, 0x39, 0x71, 0x25, 0x1e, 0x0f, 0x3a,
- 0x23, 0x48, 0x12, 0x60, 0x22, 0xda, 0xc9, 0x4d, 0x26, 0x35, 0xcb, 0x7f,
- 0x69, 0x29, 0xe0, 0x4e, 0x9f, 0x18, 0x4c, 0x75, 0xd5, 0x2c, 0x86, 0xf3,
- 0xf2, 0xef, 0x66, 0x36, 0xd2, 0x61, 0x59, 0x5d, 0x07, 0x3b, 0xd7, 0xdc,
- 0x92, 0x05, 0x4f, 0x1d, 0xc5, 0x00, 0x0a, 0x6b, 0x31, 0xfa, 0x4c, 0x5a,
- 0x42, 0x17, 0xcc, 0x99, 0xd0, 0x49, 0x72, 0x64, 0x7a, 0x7c, 0xfc, 0xe1,
- 0xfd, 0xbb, 0xd1, 0xfb, 0xf3, 0xee, 0x01, 0x3d, 0x3f, 0xbb, 0xb8, 0x3c,
- 0x7e, 0xfd, 0xe1, 0xfc, 0xe2, 0xec, 0xf2, 0xec, 0xe8, 0xec, 0x34, 0xd9,
- 0xda, 0xdb, 0x5e, 0x9b, 0xfa, 0x63, 0xdd, 0x15, 0x1e, 0x5d, 0x9a, 0xf6,
- 0x9f, 0x45, 0x8b, 0xed, 0xc5, 0x16, 0x8d, 0x27, 0x6c, 0xed, 0x7b, 0x2d,
- 0x13, 0xde, 0xca, 0x59, 0xf3, 0x6a, 0xb8, 0x43, 0xfc, 0xa6, 0xc9, 0xf5,
- 0x92, 0x76, 0xb3, 0x1f, 0x07, 0x67, 0xba, 0xc0, 0x40, 0x5d, 0xd1, 0x80,
- 0x9c, 0x97, 0x35, 0xb2, 0xd6, 0x77, 0xf7, 0xac, 0x7b, 0xb7, 0xd3, 0x1a,
- 0x40, 0x65, 0x73, 0xbb, 0xa2, 0x5e, 0xbf, 0x2d, 0x98, 0x68, 0x02, 0x6c,
- 0xbc, 0xf6, 0x0d, 0x50, 0x95, 0x4b, 0x88, 0x04, 0xa9, 0x96, 0xac, 0x03,
- 0x0e, 0xa9, 0x18, 0x49, 0xe0, 0xe8, 0x96, 0x57, 0x4c, 0x7f, 0x8b, 0x9c,
- 0x05, 0xad, 0x74, 0x04, 0x21, 0x32, 0x54, 0x64, 0xe0, 0x50, 0xad, 0x79,
- 0x80, 0x7e, 0xeb, 0x09, 0x3f, 0xa4, 0xcc, 0x04, 0xee, 0x65, 0x7e, 0xf9,
- 0x0a, 0x65, 0xc4, 0xee, 0xbc, 0x4e, 0x51, 0x73, 0xa4, 0xbc, 0x80, 0x0e,
- 0x2d, 0x22, 0x08, 0x8f, 0x35, 0xfa, 0xc2, 0x79, 0x1f, 0x50, 0xc5, 0x40,
- 0x3b, 0xa2, 0xfc, 0x23, 0x23, 0x7f, 0x30, 0x0f, 0x6c, 0x64, 0x9e, 0x44,
- 0xf2, 0x84, 0xf7, 0x69, 0xed, 0xfb, 0xbc, 0xa1, 0xc3, 0xd2, 0xd6, 0xdd,
- 0x56, 0x1c, 0x8f, 0x87, 0xef, 0xbf, 0x42, 0x87, 0xc8, 0xab, 0xee, 0x46,
- 0xe3, 0x75, 0x45, 0x93, 0xff, 0xcc, 0x15, 0x10, 0x56, 0xea, 0xe6, 0x10,
- 0x03, 0x27, 0x65, 0x4b, 0x5a, 0x84, 0xe5, 0x60, 0x25, 0x5a, 0x07, 0xa3,
- 0x0a, 0x1f, 0x30, 0xf9, 0x84, 0xa0, 0x72, 0x38, 0xa7, 0x1b, 0x7c, 0x70,
- 0x47, 0xe7, 0x11, 0x4e, 0x01, 0x97, 0xe1, 0x0d, 0x99, 0xa8, 0x05, 0x19,
- 0x77, 0x87, 0xbb, 0xc9, 0xe8, 0xed, 0x57, 0x42, 0x24, 0xf7, 0xd5, 0x88,
- 0xf9, 0x07, 0x58, 0x13, 0xd5, 0x57, 0x86, 0x71, 0xb6, 0x1e, 0x76, 0x54,
- 0x92, 0xba, 0x41, 0xbd, 0xfb, 0x13, 0xfe, 0xa6, 0xd0, 0x58, 0xfe, 0xb9,
- 0x1b, 0xb6, 0x3f, 0xee, 0x7e, 0x34, 0x2f, 0x9a, 0xa3, 0x23, 0x65, 0xed,
- 0x7a, 0x2a, 0xe5, 0x2d, 0x79, 0xd0, 0xc3, 0xf5, 0xbc, 0x45, 0xfb, 0xc1,
- 0x79, 0xf8, 0xcd, 0x4e, 0x82, 0x06, 0x5f, 0xad, 0x54, 0xee, 0x4e, 0xc7,
- 0xb9, 0x1b, 0x25, 0x4d, 0x5e, 0x46, 0xf9, 0x1f, 0xf0, 0xf6, 0xce, 0xb2,
- 0x2b, 0x68, 0x5a, 0xc8, 0xcb, 0xea, 0xe3, 0x97, 0x08, 0x6d, 0x59, 0xd8,
- 0x52, 0x94, 0xdd, 0x07, 0x6d, 0xa4, 0x13, 0x5f, 0x73, 0x55, 0xc2, 0xab,
- 0xee, 0x1c, 0xfc, 0x09, 0xf5, 0xfd, 0x98, 0xed, 0x33, 0xaf, 0xbd, 0x84,
- 0xfe, 0x82, 0x58, 0xb8, 0x72, 0x8d, 0x5e, 0x79, 0x67, 0x69, 0x46, 0x89,
- 0x5e, 0xf7, 0x9c, 0x23, 0x16, 0xa0, 0xdd, 0xa1, 0xed, 0x4c, 0x93, 0x2d,
- 0x1f, 0xb3, 0xe8, 0xa5, 0x3a, 0x14, 0xc6, 0x16, 0x63, 0x76, 0xca, 0x4a,
- 0xd5, 0x97, 0x50, 0x36, 0x0e, 0x92, 0xe4, 0x75, 0x56, 0xdc, 0xab, 0x6c,
- 0x74, 0xd0, 0x22, 0x70, 0x33, 0xdc, 0xb2, 0x23, 0x9a, 0x7d, 0xca, 0xcc,
- 0x77, 0x53, 0x03, 0x94, 0x60, 0xbb, 0x18, 0x76, 0xa9, 0xdd, 0xe7, 0x98,
- 0x04, 0x78, 0x65, 0xa7, 0x41, 0xb2, 0x83, 0xfd, 0xb9, 0xd8, 0x02, 0x05,
- 0x80, 0xc6, 0xde, 0xf0, 0x3d, 0x6d, 0x71, 0xed, 0x34, 0x6c, 0x83, 0x86,
- 0x1d, 0xf9, 0xd0, 0x44, 0xca, 0xf7, 0x57, 0x94, 0x48, 0x25, 0xa5, 0x7d,
- 0x96, 0xc2, 0x31, 0xc1, 0x53, 0x21, 0x70, 0x34, 0x23, 0xdf, 0xcc, 0x33,
- 0x1c, 0x2f, 0x0a, 0x7d, 0xc3, 0x54, 0x16, 0x03, 0x71, 0x41, 0x65, 0x2c,
- 0x6e, 0x6f, 0x02, 0x74, 0x6a, 0x5d, 0x5a, 0xce, 0xc1, 0xc6, 0x0a, 0x61,
- 0x39, 0xb8, 0x22, 0xe9, 0xc4, 0x18, 0xa7, 0xce, 0x35, 0xc6, 0xb3, 0xc9,
- 0xb8, 0x3a, 0x8b, 0x7c, 0xa4, 0xc7, 0x57, 0xb6, 0xa5, 0x32, 0xaf, 0xee,
- 0xff, 0x89, 0xfe, 0x08, 0x47, 0xd1, 0xa6, 0x06, 0xa6, 0x9c, 0x03, 0x39,
- 0xec, 0xf4, 0x38, 0x04, 0x08, 0x5e, 0x5f, 0xf5, 0x81, 0x57, 0x4e, 0xa0,
- 0xae, 0x6f, 0x1b, 0xc2, 0xe7, 0x31, 0x1f, 0x78, 0x5f, 0x28, 0x69, 0x96,
- 0xee, 0xef, 0x85, 0x25, 0xac, 0xbe, 0x4b, 0xab, 0x02, 0xd0, 0x66, 0x5f,
- 0xf1, 0xe7, 0x1a, 0xf1, 0x4c, 0x6e, 0x97, 0x5e, 0x11, 0x28, 0xb4, 0xca,
- 0x1c, 0xbb, 0x26, 0xad, 0x23, 0x13, 0xaa, 0x08, 0x61, 0xaf, 0xc2, 0x7f,
- 0x17, 0x65, 0xc3, 0xd4, 0xc1, 0x84, 0x22, 0x25, 0x9d, 0xa1, 0x22, 0x07,
- 0x87, 0x37, 0xc9, 0xaa, 0x11, 0x52, 0x6b, 0x76, 0x37, 0x51, 0x4b, 0xcb,
- 0x05, 0x05, 0xe9, 0x04, 0xcb, 0xc4, 0x01, 0x4f, 0x4f, 0xcc, 0xc8, 0xe7,
- 0x18, 0xf4, 0x04, 0xc7, 0x8c, 0x8b, 0xa9, 0xa5, 0xb7, 0x25, 0x71, 0xc7,
- 0x3b, 0x28, 0x30, 0x14, 0x21, 0xb7, 0x4b, 0x2e, 0xe3, 0xf4, 0xf7, 0x0e,
- 0x75, 0x22, 0x06, 0x05, 0xb9, 0x61, 0x00, 0x0a, 0x02, 0x4d, 0xb6, 0x97,
- 0x76, 0xc2, 0xe7, 0x5b, 0x9b, 0x03, 0x34, 0x21, 0x65, 0x4e, 0x2f, 0xb3,
- 0x27, 0x0b, 0x0e, 0x19, 0x89, 0xb5, 0xa5, 0x32, 0x91, 0x7a, 0x88, 0x84,
- 0x7b, 0x2a, 0xbe, 0x4a, 0xf7, 0x87, 0xa6, 0xd5, 0x74, 0xf8, 0x81, 0x7d,
- 0x97, 0x99, 0x77, 0xab, 0x5a, 0xe8, 0xa4, 0x53, 0x18, 0x87, 0x0f, 0x88,
- 0xf1, 0x4f, 0xf7, 0x8a, 0xd5, 0x5a, 0x2b, 0xc2, 0x17, 0xc8, 0x1e, 0x35,
- 0x13, 0x9d, 0x37, 0x58, 0xb0, 0x0e, 0x58, 0x54, 0x31, 0x94, 0xcc, 0x57,
- 0x6c, 0x0e, 0xdf, 0xb2, 0x7b, 0xe4, 0x0b, 0x0d, 0x92, 0x49, 0xbd, 0xf0,
- 0xc6, 0x95, 0x9a, 0x81, 0x2a, 0x21, 0x4e, 0x0b, 0xe6, 0x4c, 0xf7, 0x68,
- 0xe4, 0xa9, 0x4a, 0x2a, 0x85, 0xcd, 0xe2, 0xde, 0xb6, 0x1d, 0xcb, 0x1d,
- 0x62, 0x36, 0x4c, 0x31, 0x1d, 0x18, 0x21, 0xb0, 0x58, 0xe3, 0x5f, 0xfc,
- 0xd4, 0xd7, 0x41, 0xb7, 0x50, 0xa6, 0x3e, 0x5b, 0x01, 0xff, 0x84, 0xb1,
- 0x6c, 0x32, 0x77, 0x21, 0x72, 0xd9, 0xe8, 0x03, 0x4f, 0x62, 0x33, 0x19,
- 0x43, 0xcb, 0x75, 0x63, 0xb9, 0xb6, 0xbe, 0x77, 0x8c, 0x48, 0x9d, 0x67,
- 0x10, 0x13, 0xa8, 0x13, 0xb6, 0x0a, 0x61, 0xc4, 0x73, 0x27, 0xd3, 0xf6,
- 0x9e, 0x13, 0x7b, 0xd0, 0x22, 0xec, 0x1d, 0x3a, 0xd6, 0x34, 0xdb, 0xde,
- 0x97, 0xd8, 0x57, 0x13, 0xcc, 0x23, 0xe8, 0x7c, 0x84, 0x93, 0x5b, 0x9e,
- 0x84, 0xa3, 0xd1, 0x97, 0x76, 0xf1, 0xd5, 0x8e, 0x38, 0x3f, 0x20, 0x27,
- 0xf1, 0x21, 0xea, 0x58, 0xbe, 0x36, 0x51, 0x7e, 0xc5, 0x62, 0xc4, 0x38,
- 0x22, 0xa6, 0x1d, 0xe8, 0xa7, 0xfe, 0x7c, 0x92, 0x52, 0xbc, 0x34, 0x8e,
- 0x3b, 0x1b, 0xc9, 0x79, 0x1b, 0xe8, 0x53, 0x24, 0xa7, 0x15, 0xf4, 0xc7,
- 0x4a, 0x2b, 0x7f, 0x1c, 0x95, 0x5d, 0x3e, 0x35, 0x6b, 0x0b, 0x9d, 0xea,
- 0xe7, 0x98, 0x1f, 0x42, 0x80, 0x1d, 0xd2, 0xae, 0xfb, 0xa7, 0xff, 0xdb,
- 0x4f, 0xfd, 0x98, 0x90, 0x86, 0x5f, 0x6e, 0xa5, 0x5b, 0xa1, 0xfd, 0x99,
- 0x97, 0xe6, 0x44, 0xaf, 0x1b, 0x14, 0x1e, 0xfa, 0x35, 0x83, 0x0a, 0x46,
- 0x85, 0x61, 0x60, 0xbe, 0x83, 0x35, 0xe1, 0xcf, 0xac, 0xf1, 0x82, 0xae,
- 0x18, 0x82, 0x69, 0x71, 0x4d, 0x01, 0x46, 0x6f, 0x18, 0xf6, 0xc1, 0x5f,
- 0x3a, 0x92, 0x87, 0xa7, 0x11, 0x5b, 0x83, 0xfe, 0xfb, 0xe3, 0x01, 0xfc,
- 0x5e, 0xd3, 0x9f, 0x57, 0xf6, 0xe3, 0xb8, 0x2f, 0x7d, 0xf9, 0x1d, 0xba,
- 0x91, 0x2f, 0x6e, 0xc8, 0xa9, 0xf1, 0x32, 0x96, 0xf2, 0xe1, 0x4d, 0x84,
- 0x3c, 0xf6, 0xdb, 0x7f, 0xbf, 0x9a, 0x39, 0x1e, 0x95, 0x35, 0xdf, 0x97,
- 0xc7, 0x7e, 0xf3, 0xef, 0xf3, 0xd9, 0x7d, 0xd0, 0x81, 0x02, 0x41, 0xf5,
- 0x5a, 0x20, 0xc4, 0x11, 0x99, 0xf8, 0xab, 0x85, 0xa2, 0xc0, 0x92, 0x43,
- 0xa9, 0x28, 0x1f, 0x8b, 0x12, 0xdb, 0x8b, 0x58, 0x84, 0x54, 0xfc, 0x4d,
- 0x24, 0x18, 0x44, 0x73, 0x38, 0x39, 0x52, 0x69, 0xe2, 0x25, 0xff, 0xb9,
- 0x82, 0x7b, 0xf3, 0x98, 0xee, 0x3f, 0x2d, 0x4a, 0x81, 0x2a, 0x07, 0x9c,
- 0x93, 0x2e, 0xba, 0xae, 0x65, 0xe8, 0xa7, 0x69, 0xb2, 0xc5, 0x4c, 0xe8,
- 0xd5, 0x58, 0x29, 0x0c, 0x99, 0x1b, 0xc5, 0x6a, 0xaa, 0x4b, 0xde, 0x81,
- 0x74, 0x48, 0xe5, 0xc8, 0xbc, 0x2f, 0xd6, 0xab, 0xea, 0x1a, 0x75, 0x2b,
- 0x0a, 0x3a, 0x7a, 0xcc, 0x6f, 0xfa, 0x52, 0x89, 0xc2, 0xb4, 0x46, 0xfb,
- 0x49, 0x80, 0x8a, 0xe2, 0xe8, 0x97, 0x85, 0x0c, 0x79, 0x44, 0xa4, 0x5a,
- 0x34, 0x80, 0xf3, 0x00, 0x66, 0xd2, 0x08, 0x8f, 0xce, 0xde, 0xbd, 0x3b,
- 0x3e, 0xea, 0x06, 0xd3, 0x6c, 0xed, 0x3e, 0xa7, 0xe4, 0x07, 0xa5, 0xd0,
- 0xf0, 0x79, 0x50, 0x5c, 0x4b, 0xfc, 0x84, 0xbf, 0x8f, 0x1a, 0x29, 0x9c,
- 0x9e, 0xa2, 0xbf, 0x14, 0x06, 0x71, 0xe6, 0x87, 0x94, 0xb5, 0x8f, 0xe4,
- 0x17, 0x05, 0x3b, 0xc1, 0x2f, 0x4a, 0xc0, 0xf1, 0x00, 0xaa, 0x94, 0x27,
- 0x60, 0x4d, 0x18, 0x98, 0xd2, 0x0b, 0xc0, 0x9a, 0xa7, 0xd3, 0x1d, 0x41,
- 0x0d, 0xeb, 0xb7, 0x57, 0xed, 0x62, 0x26, 0x94, 0xa2, 0x94, 0x8c, 0x41,
- 0x79, 0xc5, 0x55, 0x19, 0xe7, 0x69, 0xf5, 0x91, 0x22, 0x71, 0x5e, 0x72,
- 0x06, 0x52, 0xd6, 0x40, 0x6f, 0x3b, 0x9d, 0xc6, 0x52, 0xa1, 0x53, 0x78,
- 0x64, 0x3d, 0x48, 0xba, 0x74, 0x46, 0x2a, 0x99, 0x1d, 0x68, 0x26, 0x19,
- 0xbd, 0x5e, 0x64, 0x77, 0xf4, 0x19, 0x26, 0x79, 0xa0, 0x94, 0xe6, 0x90,
- 0x16, 0x9d, 0xa9, 0x78, 0xd9, 0x81, 0x7e, 0x2f, 0xa9, 0xd4, 0xb4, 0x54,
- 0x73, 0x26, 0x1e, 0x07, 0xeb, 0x2b, 0xd5, 0xf2, 0xe1, 0x8c, 0x8b, 0x60,
- 0xae, 0xbe, 0x11, 0xd2, 0xb6, 0x4e, 0xec, 0xa8, 0xcd, 0x49, 0xe5, 0xd1,
- 0xb3, 0x8c, 0x33, 0x8f, 0xce, 0x2d, 0xbc, 0x78, 0xec, 0x76, 0xc0, 0x5c,
- 0x63, 0x21, 0xc8, 0x52, 0x11, 0xd6, 0x78, 0xc9, 0x69, 0xd1, 0xf5, 0x4d,
- 0x57, 0x86, 0xb9, 0xfc, 0x8f, 0x2b, 0xa4, 0x3f, 0xa6, 0xe5, 0xa3, 0x15,
- 0xb7, 0x80, 0x3b, 0xb0, 0xb4, 0xbb, 0x33, 0x64, 0x5f, 0xd1, 0x83, 0xb3,
- 0x8e, 0x54, 0x01, 0xcc, 0x6e, 0x1d, 0x69, 0x60, 0xb4, 0x7e, 0xf2, 0xc5,
- 0x64, 0xab, 0x84, 0xf4, 0x47, 0xa6, 0xea, 0xe3, 0x87, 0x7e, 0x7b, 0x49,
- 0xbd, 0xbe, 0x68, 0xb2, 0xbb, 0x2a, 0xec, 0x73, 0xbf, 0x47, 0x0f, 0xa2,
- 0x55, 0x88, 0x5b, 0xdf, 0x7e, 0xfc, 0x67, 0x03, 0x8a, 0xb1, 0xc7, 0xdd,
- 0x42, 0x8e, 0x3e, 0xcf, 0xf1, 0xe7, 0x05, 0xf5, 0x05, 0xee, 0xc2, 0xd4,
- 0xa1, 0xd6, 0x0d, 0xb5, 0xf6, 0x4e, 0x72, 0x09, 0xd5, 0xfe, 0xb5, 0xd4,
- 0x3d, 0x31, 0xed, 0xbe, 0xd8, 0xae, 0x48, 0xcc, 0xf5, 0x71, 0x57, 0xd4,
- 0x83, 0x57, 0x52, 0x2b, 0xf5, 0xb0, 0x8b, 0xce, 0xb1, 0x99, 0x47, 0x8f,
- 0x9c, 0xb8, 0x48, 0x1e, 0x5e, 0xf2, 0x4f, 0x5e, 0xdf, 0x48, 0x77, 0x6a,
- 0x5d, 0xde, 0xf8, 0x4a, 0x6b, 0x12, 0x1e, 0x23, 0xab, 0x83, 0x29, 0x71,
- 0x6b, 0x10, 0xb9, 0xbb, 0xc3, 0x59, 0x58, 0x07, 0xbe, 0x76, 0xdb, 0x13,
- 0x4f, 0xfd, 0xe6, 0xc7, 0x82, 0xd0, 0x16, 0xf9, 0x44, 0x60, 0xe5, 0x2f,
- 0x8b, 0x07, 0xb8, 0xf0, 0xda, 0x21, 0x58, 0x09, 0xc1, 0x08, 0x78, 0x98,
- 0x1b, 0xd2, 0x5c, 0x26, 0xf8, 0xbc, 0xf1, 0x89, 0x80, 0xf6, 0x42, 0x80,
- 0xb2, 0x11, 0x1c, 0x85, 0x1f, 0x25, 0x79, 0x12, 0xed, 0x6d, 0x3d, 0x1b,
- 0xa0, 0x0f, 0x94, 0xea, 0x15, 0x68, 0x7e, 0x6e, 0xae, 0x3a, 0xcf, 0xfd,
- 0xf6, 0xd3, 0xd6, 0xcc, 0x6a, 0x5a, 0xcb, 0xc7, 0x88, 0x34, 0xff, 0xd1,
- 0xdf, 0xa3, 0x1f, 0x36, 0xee, 0xfe, 0x92, 0x83, 0xea, 0x6b, 0x7b, 0x62,
- 0x1f, 0xfe, 0x3d, 0x7a, 0x82, 0x44, 0xb2, 0xe8, 0x1e, 0x6a, 0xf5, 0x01,
- 0x8f, 0xfd, 0x1e, 0xdf, 0xbf, 0xdd, 0x5b, 0xf5, 0x59, 0xd4, 0x32, 0xc2,
- 0x13, 0xbf, 0xe1, 0x87, 0xdf, 0x5b, 0x15, 0x9d, 0x93, 0xee, 0x5e, 0xd2,
- 0x7f, 0x0f, 0x74, 0x86, 0xd7, 0x16, 0x49, 0xf0, 0x52, 0xee, 0x5a, 0xc8,
- 0x09, 0x57, 0xa2, 0xb1, 0x9b, 0x54, 0xfa, 0x28, 0x1c, 0x92, 0x64, 0xb9,
- 0x71, 0xfe, 0xbe, 0xd0, 0xf5, 0x81, 0x49, 0x75, 0xa0, 0x2c, 0x20, 0xa2,
- 0x57, 0x6a, 0xc2, 0xb5, 0xe4, 0xcf, 0x26, 0x92, 0x17, 0xdf, 0xe5, 0x41,
- 0x70, 0x97, 0x15, 0x9d, 0xe6, 0xb8, 0x08, 0x6e, 0x20, 0x82, 0xef, 0xb5,
- 0xb0, 0x95, 0xcf, 0xee, 0x1d, 0x44, 0x4a, 0x67, 0xcc, 0x98, 0xb3, 0x72,
- 0xfc, 0x08, 0x2c, 0x48, 0x29, 0x6a, 0xc7, 0x58, 0x37, 0x66, 0x53, 0x22,
- 0xa0, 0x7d, 0xe7, 0x18, 0x96, 0xc5, 0x18, 0x78, 0x08, 0x0e, 0x2f, 0x5a,
- 0x79, 0x90, 0xf4, 0x06, 0xef, 0x93, 0x83, 0xde, 0xef, 0x88, 0x67, 0xf6,
- 0x4c, 0xb5, 0x7f, 0x0e, 0x9e, 0x15, 0xaf, 0x99, 0x2d, 0xa6, 0x8d, 0x20,
- 0x66, 0xc4, 0x5b, 0xfc, 0x10, 0x4c, 0x8a, 0x61, 0x51, 0xdd, 0x05, 0x50,
- 0x83, 0xcc, 0x83, 0x48, 0xb5, 0x63, 0xe6, 0x35, 0x5f, 0x8d, 0x0e, 0x1e,
- 0xd5, 0x42, 0x44, 0xc5, 0xb0, 0x52, 0x80, 0x47, 0x51, 0xa4, 0xcf, 0x81,
- 0xa3, 0x80, 0xd1, 0x0b, 0xa1, 0x51, 0x01, 0x18, 0x6a, 0x05, 0x6f, 0x68,
- 0x1c, 0x1a, 0xd5, 0xd7, 0x30, 0x2e, 0xd3, 0x99, 0xcd, 0x84, 0xd0, 0xc7,
- 0x2b, 0x37, 0xd8, 0x3d, 0x20, 0x48, 0xfa, 0x42, 0xee, 0xac, 0x75, 0x02,
- 0x93, 0xd3, 0x30, 0xd9, 0xba, 0xf4, 0xfc, 0xe2, 0x8e, 0x5f, 0x86, 0x4c,
- 0x1a, 0x3d, 0xea, 0x11, 0xef, 0x23, 0x28, 0x45, 0x3f, 0xdb, 0x8e, 0xee,
- 0xa2, 0xec, 0x57, 0xa0, 0xad, 0x28, 0x8e, 0xf6, 0xab, 0xf0, 0x56, 0x6d,
- 0xc3, 0xc2, 0x4b, 0xa8, 0x46, 0xd1, 0x5e, 0xda, 0x22, 0x31, 0xb6, 0x47,
- 0x31, 0x66, 0x22, 0x65, 0x29, 0x7c, 0xe3, 0x15, 0x8c, 0xb2, 0x3c, 0xa4,
- 0x2a, 0xdb, 0xac, 0xe1, 0x20, 0x8f, 0x51, 0x47, 0x52, 0x3b, 0x92, 0xe9,
- 0xd2, 0xa5, 0x14, 0x60, 0xd2, 0x10, 0x4d, 0x85, 0xa4, 0x0c, 0x27, 0xdb,
- 0x7a, 0xaf, 0x47, 0xff, 0xd5, 0x1e, 0x9b, 0x09, 0x08, 0x65, 0x2d, 0x2d,
- 0xab, 0x72, 0xec, 0x49, 0x97, 0x41, 0x3e, 0x6b, 0xeb, 0x22, 0x97, 0x5c,
- 0x89, 0xd8, 0xf3, 0xeb, 0xf3, 0xfa, 0x47, 0x4b, 0xa3, 0x2c, 0x88, 0xbe,
- 0x98, 0x52, 0x5a, 0xc6, 0x0a, 0x50, 0x6d, 0x78, 0x6e, 0xe9, 0x6d, 0x62,
- 0xdb, 0x07, 0x08, 0xd4, 0xe6, 0xb9, 0x93, 0x8f, 0x0e, 0x48, 0x55, 0xdd,
- 0x1c, 0xd1, 0xe3, 0x93, 0x4f, 0xfc, 0x2e, 0x72, 0x38, 0x41, 0x6c, 0x42,
- 0x4b, 0xe5, 0xef, 0x58, 0x4d, 0x91, 0xd2, 0x25, 0x65, 0x4e, 0x43, 0xde,
- 0x25, 0x9d, 0xa6, 0x86, 0x0a, 0xda, 0x12, 0x4b, 0x52, 0x85, 0x88, 0xa5,
- 0x5d, 0x93, 0x3e, 0xed, 0x5e, 0x96, 0x3c, 0xa2, 0xc5, 0x0e, 0x16, 0x2a,
- 0x6c, 0xba, 0x83, 0xbd, 0x97, 0x46, 0x56, 0x94, 0x7b, 0xfc, 0x1d, 0x60,
- 0x7a, 0xbf, 0x06, 0xa5, 0xf7, 0x3b, 0xc3, 0xf4, 0x3c, 0x81, 0x49, 0xd2,
- 0x37, 0x94, 0x96, 0x70, 0x2c, 0x51, 0xa2, 0x13, 0xc7, 0xcc, 0xee, 0x52,
- 0xcb, 0xc6, 0x1b, 0xd3, 0x55, 0xa3, 0x27, 0xa9, 0xdf, 0x82, 0x3c, 0x78,
- 0xa2, 0x44, 0xe5, 0x2e, 0x03, 0x8f, 0xa8, 0x0e, 0xc0, 0x8a, 0xec, 0xdd,
- 0x8c, 0xb2, 0x74, 0xa6, 0x99, 0x64, 0xde, 0xff, 0xc9, 0x91, 0xe1, 0xfe,
- 0x9e, 0x39, 0x37, 0x34, 0xbc, 0xbd, 0xe1, 0x6e, 0xf2, 0xd2, 0xbb, 0x96,
- 0xbe, 0x88, 0xdc, 0x4b, 0x41, 0x2a, 0x20, 0x8e, 0x5a, 0x42, 0xaf, 0xaa,
- 0xf5, 0xb4, 0x52, 0xe8, 0xc5, 0x0f, 0x0c, 0x8a, 0xef, 0xc0, 0x29, 0xa6,
- 0xe2, 0x4d, 0x8b, 0x4c, 0xaf, 0x10, 0x70, 0x42, 0x26, 0xa4, 0x4c, 0xa1,
- 0xc6, 0xa8, 0x18, 0x67, 0xcd, 0x5d, 0x96, 0x09, 0xad, 0x8f, 0x4e, 0xa3,
- 0x27, 0x03, 0xac, 0x3c, 0x5c, 0x19, 0x1b, 0xe9, 0x0b, 0x7d, 0x1b, 0x49,
- 0x14, 0x26, 0xab, 0xb2, 0x95, 0x26, 0xd5, 0x0d, 0x18, 0x1c, 0xbf, 0x18,
- 0xbb, 0xb5, 0x73, 0x6a, 0xf2, 0xf7, 0x69, 0x5e, 0x3c, 0xe4, 0x46, 0x0b,
- 0x4c, 0xa9, 0x21, 0x2e, 0x79, 0xd0, 0xb7, 0x7f, 0xed, 0x31, 0x96, 0x63,
- 0x1b, 0xcb, 0x29, 0x6c, 0x8b, 0x39, 0x5d, 0x7c, 0x4f, 0xdd, 0x68, 0xd7,
- 0xa8, 0x91, 0x8b, 0x10, 0xa1, 0xcd, 0x08, 0xe0, 0x9f, 0x97, 0xd1, 0xc3,
- 0xf4, 0x20, 0x4e, 0xcd, 0x53, 0xc1, 0xff, 0x10, 0x01, 0x62, 0xe7, 0x61,
- 0xe5, 0xb1, 0xf0, 0x86, 0x39, 0xcf, 0x28, 0x6a, 0x2e, 0xa7, 0x35, 0xd7,
- 0xf4, 0x55, 0xfa, 0xd6, 0x00, 0x6e, 0x56, 0x27, 0x2a, 0x99, 0x29, 0x83,
- 0x3e, 0x12, 0x84, 0x6f, 0xe9, 0xa3, 0xe9, 0xc2, 0x7c, 0x89, 0xdc, 0x9a,
- 0x08, 0x10, 0xce, 0xd3, 0x69, 0xe6, 0xd9, 0xee, 0xde, 0x34, 0x74, 0x7c,
- 0xb6, 0x11, 0x04, 0x4e, 0x40, 0xe2, 0xa6, 0xba, 0x34, 0x0b, 0x26, 0x41,
- 0x6f, 0x09, 0x04, 0x5e, 0xfd, 0xb7, 0xe2, 0xf1, 0x58, 0x59, 0x3e, 0x5d,
- 0x70, 0x61, 0x69, 0xc1, 0xdb, 0xa6, 0x2b, 0xb0, 0xcb, 0x47, 0x79, 0xf2,
- 0x5b, 0xe7, 0x51, 0x72, 0x75, 0x23, 0x1e, 0xa9, 0xad, 0x11, 0x91, 0x1e,
- 0x8f, 0x8e, 0xce, 0xb7, 0x93, 0xf3, 0x4e, 0x1a, 0x2e, 0x40, 0x9e, 0x74,
- 0x4d, 0xfa, 0x22, 0x56, 0x0a, 0x0f, 0x30, 0x17, 0xcd, 0xea, 0x94, 0x4d,
- 0x65, 0xc5, 0xb2, 0xac, 0x4b, 0xa0, 0x11, 0xff, 0xcd, 0x45, 0x4e, 0x67,
- 0x2c, 0x87, 0x48, 0xbf, 0xe6, 0x8c, 0x4c, 0xc9, 0x0e, 0xf5, 0xcf, 0x9f,
- 0xb1, 0x26, 0x4a, 0xc2, 0x17, 0x33, 0xd3, 0xb7, 0x24, 0xb1, 0x6a, 0xf2,
- 0xe9, 0x2c, 0x08, 0x78, 0x23, 0xdd, 0xd5, 0xc2, 0x8f, 0xbc, 0xdc, 0x73,
- 0xa9, 0xb9, 0x51, 0xf3, 0x8d, 0xd3, 0x29, 0xd5, 0x40, 0xa3, 0xb8, 0xce,
- 0x8a, 0xac, 0x1a, 0x84, 0xec, 0x78, 0x5c, 0x2c, 0x5d, 0xf6, 0xcc, 0x74,
- 0xd8, 0xe5, 0x7e, 0xf3, 0xd2, 0x6c, 0xa5, 0x73, 0x7e, 0x19, 0x8b, 0x15,
- 0x5c, 0x38, 0x38, 0x4d, 0x63, 0xa0, 0x9e, 0x3f, 0x92, 0xb4, 0xbb, 0xa6,
- 0xc4, 0xe6, 0x06, 0xb7, 0xd7, 0xe2, 0x9e, 0xa6, 0xc3, 0x3c, 0x58, 0xd7,
- 0x37, 0xfb, 0x46, 0x26, 0xec, 0x0f, 0x3f, 0xa7, 0x0b, 0xee, 0xc6, 0x5c,
- 0xc3, 0x59, 0xb5, 0x82, 0xe9, 0x4a, 0x4a, 0xf3, 0x74, 0x5a, 0x93, 0x54,
- 0xd1, 0xa1, 0x53, 0x49, 0x07, 0xff, 0x8b, 0x76, 0xda, 0xdf, 0x96, 0xa1,
- 0xd7, 0x6a, 0x0b, 0x1b, 0xea, 0x0d, 0x17, 0x5b, 0x23, 0xf5, 0x99, 0x2a,
- 0x3b, 0x8c, 0xf3, 0x06, 0xac, 0x8e, 0xca, 0xd7, 0xd0, 0x3e, 0x09, 0xf4,
- 0x06, 0x17, 0xe2, 0x78, 0x13, 0x04, 0x7b, 0xa4, 0x48, 0x69, 0x92, 0xfc,
- 0x2f, 0xfa, 0x96, 0x36, 0xc0, 0x58, 0x4f, 0xf8, 0xc5, 0xbf, 0x3a, 0x7e,
- 0x73, 0x76, 0x71, 0xdc, 0x06, 0x69, 0x73, 0x15, 0x6e, 0xb8, 0xb8, 0xbb,
- 0xbd, 0x03, 0x0d, 0x05, 0x27, 0xf2, 0xd0, 0x2b, 0x5a, 0xcb, 0xfb, 0xfc,
- 0xfb, 0xd7, 0xb6, 0x73, 0x39, 0xc4, 0x21, 0x3a, 0xe5, 0xea, 0x64, 0xca,
- 0x3c, 0x77, 0x2f, 0x6d, 0xba, 0xde, 0xb7, 0x87, 0x54, 0xe0, 0x87, 0x8b,
- 0xa5, 0x6b, 0xf7, 0xa8, 0x07, 0xdc, 0x01, 0x5b, 0x34, 0x19, 0x0c, 0x80,
- 0x75, 0x4d, 0x49, 0x40, 0xb6, 0xd9, 0x40, 0xa3, 0x65, 0x63, 0x8a, 0x92,
- 0xfd, 0xc5, 0xd6, 0x22, 0xaa, 0x07, 0x62, 0x7f, 0x18, 0x26, 0xf6, 0x23,
- 0xee, 0x2b, 0x5c, 0xf8, 0x1c, 0xd5, 0xc5, 0xf1, 0x95, 0x58, 0x5c, 0x87,
- 0xea, 0xfc, 0xb1, 0xf3, 0x8c, 0x6f, 0x32, 0x22, 0xb0, 0x45, 0x55, 0x32,
- 0x25, 0x59, 0xef, 0x33, 0x35, 0x87, 0xa4, 0xeb, 0xf8, 0xf3, 0x18, 0xf1,
- 0x0b, 0x9b, 0xcf, 0x6e, 0xd5, 0xdb, 0x7d, 0xaf, 0xa7, 0x76, 0xda, 0xa4,
- 0xc3, 0x9b, 0x7f, 0xda, 0x4c, 0x04, 0x18, 0x08, 0xf1, 0xca, 0x71, 0xb0,
- 0x15, 0xc5, 0x55, 0x1c, 0xd7, 0xfe, 0xf6, 0x43, 0xb1, 0x3c, 0x1d, 0xf4,
- 0xea, 0x34, 0x14, 0x4d, 0xe6, 0x92, 0x08, 0x0f, 0xd7, 0xbd, 0x41, 0x20,
- 0x0b, 0x0e, 0xc2, 0xb2, 0xb0, 0x30, 0x24, 0x6d, 0x2b, 0x56, 0x5b, 0x94,
- 0xfc, 0x0d, 0x95, 0x4f, 0x89, 0xae, 0x22, 0x07, 0x39, 0xe6, 0xca, 0xb9,
- 0xca, 0x99, 0x48, 0x4a, 0x6c, 0x7e, 0x5f, 0x34, 0x74, 0x5a, 0x21, 0x58,
- 0x82, 0x49, 0xab, 0x70, 0x07, 0xf0, 0x7e, 0x72, 0xdb, 0xb7, 0x46, 0x6a,
- 0xde, 0x8b, 0x67, 0x2f, 0xe8, 0xe6, 0x46, 0xc8, 0x4a, 0x08, 0xe8, 0x85,
- 0x8e, 0x0d, 0x94, 0x03, 0x61, 0x4a, 0x40, 0x67, 0x00, 0x5a, 0x36, 0x6c,
- 0x9c, 0xcd, 0xb8, 0xcc, 0xfb, 0xc8, 0x6b, 0x62, 0x2d, 0xb6, 0x7d, 0x35,
- 0x12, 0x6c, 0xc8, 0x1a, 0x81, 0x4d, 0xad, 0x42, 0xc5, 0x60, 0xf4, 0x3f,
- 0x7a, 0x34, 0xfb, 0x4e, 0x17, 0x95, 0x14, 0x50, 0xde, 0x0e, 0x96, 0xd5,
- 0xd5, 0x88, 0xee, 0xac, 0xca, 0xeb, 0x8f, 0xc9, 0xd6, 0x7f, 0x6c, 0xdb,
- 0x7a, 0x83, 0x11, 0xab, 0x97, 0x9c, 0x62, 0x79, 0xb1, 0xcc, 0x5a, 0xb5,
- 0x28, 0xb5, 0xb5, 0x2b, 0xd4, 0x47, 0x20, 0xde, 0xaf, 0x18, 0x7c, 0x9a,
- 0xca, 0x81, 0x2d, 0x02, 0x6e, 0x6b, 0x61, 0x93, 0x91, 0x5d, 0x10, 0xde,
- 0x9a, 0x58, 0x11, 0x50, 0xdc, 0x8d, 0x6d, 0x3e, 0x1a, 0x14, 0x96, 0x61,
- 0xf2, 0xbe, 0x80, 0x46, 0x21, 0x7b, 0x53, 0xee, 0x92, 0xbc, 0x30, 0x03,
- 0x31, 0x63, 0x35, 0xb7, 0x49, 0x44, 0x50, 0xfd, 0xad, 0x2d, 0x9f, 0x44,
- 0x90, 0x76, 0x48, 0x07, 0x70, 0xb2, 0x95, 0xe1, 0xdd, 0x8a, 0xb6, 0xe4,
- 0x4d, 0x58, 0xf0, 0x81, 0xb9, 0xea, 0xa5, 0x00, 0x38, 0xda, 0xa6, 0xf4,
- 0x94, 0x6c, 0x36, 0x1b, 0x30, 0x25, 0x22, 0x11, 0xc4, 0x91, 0x6a, 0x6f,
- 0xd6, 0x29, 0x9d, 0x70, 0xc0, 0xd3, 0xcf, 0x4e, 0x0a, 0x6e, 0x1f, 0x24,
- 0xc1, 0x80, 0x86, 0x48, 0xd3, 0x37, 0x05, 0xb6, 0xab, 0xb8, 0x5a, 0x72,
- 0x73, 0xb8, 0xfc, 0x0a, 0x4c, 0x0e, 0x0f, 0x69, 0x15, 0x75, 0x7b, 0xc8,
- 0x35, 0x34, 0xb9, 0xb9, 0xae, 0x16, 0x5c, 0x26, 0x22, 0x56, 0xc3, 0xc2,
- 0xb7, 0x9b, 0xf8, 0x51, 0x5d, 0xdd, 0x3a, 0x6b, 0xb8, 0x33, 0xfc, 0xee,
- 0xc9, 0xeb, 0x56, 0xc9, 0x39, 0x9a, 0x8a, 0x08, 0xb5, 0xba, 0xe7, 0x54,
- 0x90, 0x0a, 0x32, 0xe6, 0xc4, 0xba, 0xbb, 0xc5, 0x36, 0xe5, 0xcc, 0x8b,
- 0xb1, 0x32, 0xd9, 0xe1, 0x77, 0xf1, 0xe6, 0xa4, 0x15, 0xd6, 0x20, 0xb9,
- 0x0d, 0x6d, 0x18, 0x5b, 0x45, 0x0b, 0x22, 0xd2, 0x66, 0xa0, 0xb2, 0xa7,
- 0xfa, 0x99, 0x30, 0xa8, 0x7e, 0x33, 0x2f, 0xa7, 0x84, 0xfd, 0xcd, 0x1e,
- 0x9e, 0x0b, 0x7a, 0xd2, 0x1d, 0x1c, 0x81, 0x4e, 0xd7, 0x96, 0x27, 0xc9,
- 0x0c, 0x0e, 0xed, 0x8c, 0x89, 0x98, 0x83, 0x67, 0x26, 0xde, 0x9c, 0x1b,
- 0xaa, 0x96, 0x6d, 0x91, 0x37, 0xfd, 0x21, 0x14, 0x49, 0x39, 0x69, 0xbc,
- 0x11, 0xd0, 0x03, 0xf1, 0xe6, 0x58, 0xf8, 0x46, 0x46, 0x46, 0x50, 0x5a,
- 0xd8, 0x93, 0xeb, 0x47, 0xc6, 0x0f, 0x06, 0x8b, 0x6c, 0x7e, 0xe8, 0x08,
- 0xa5, 0x5a, 0x2b, 0xbc, 0x7a, 0x64, 0xb1, 0x15, 0x46, 0x0f, 0xba, 0x0b,
- 0xcc, 0xa5, 0xcb, 0x40, 0x74, 0x47, 0x8f, 0x0f, 0xe2, 0xcd, 0xd9, 0x15,
- 0x16, 0x06, 0xbb, 0x35, 0x0b, 0x2c, 0x5f, 0x09, 0x66, 0x61, 0x66, 0x44,
- 0xa4, 0xd1, 0x82, 0x27, 0xd9, 0x07, 0xae, 0x9f, 0x44, 0x55, 0x70, 0x9b,
- 0x0f, 0xeb, 0x27, 0x64, 0x26, 0x69, 0x66, 0xf7, 0x73, 0xd4, 0x5d, 0xb3,
- 0xc2, 0x42, 0x48, 0xa3, 0x52, 0xfa, 0xcd, 0xb8, 0x24, 0x25, 0x10, 0xbf,
- 0x8f, 0xf2, 0x42, 0xeb, 0xb6, 0x77, 0xdf, 0x4b, 0x6c, 0xfd, 0xd9, 0x45,
- 0x99, 0x17, 0x9a, 0x69, 0x2b, 0x32, 0xc6, 0xeb, 0x62, 0x12, 0xcb, 0x31,
- 0x5e, 0xe7, 0xe2, 0x9f, 0x7f, 0x24, 0x30, 0xae, 0x55, 0x14, 0x3e, 0x44,
- 0xe8, 0x6f, 0xfd, 0x7d, 0xcc, 0x8f, 0xbb, 0x7d, 0xcc, 0xa3, 0xd2, 0x6d,
- 0xec, 0x4a, 0xf4, 0x3c, 0xbc, 0xda, 0xed, 0x4f, 0xda, 0x33, 0xd9, 0xed,
- 0xdf, 0xe2, 0x6e, 0x6a, 0xb3, 0x7c, 0xcd, 0x5f, 0xf5, 0xc3, 0x7a, 0xff,
- 0x83, 0x0c, 0x56, 0x2b, 0x60, 0x11, 0xfc, 0x8f, 0x1b, 0xbb, 0x52, 0x62,
- 0xbb, 0x15, 0x53, 0x01, 0xbe, 0xbb, 0x40, 0x4b, 0x0a, 0x3e, 0x6e, 0x1e,
- 0xa3, 0xe6, 0x78, 0x82, 0x65, 0x39, 0x56, 0x4f, 0x8e, 0x3c, 0xed, 0xba,
- 0xc8, 0xf2, 0xdd, 0xaf, 0xd6, 0x19, 0x4e, 0xd0, 0x6a, 0x81, 0x27, 0x5f,
- 0xed, 0x1c, 0x88, 0x69, 0x46, 0x4e, 0x59, 0xd9, 0x0a, 0x84, 0xaa, 0xe4,
- 0x86, 0x54, 0xee, 0xad, 0xdb, 0x48, 0x2b, 0xe7, 0xb8, 0x9a, 0x3f, 0x70,
- 0xc8, 0xcd, 0x03, 0x6e, 0x54, 0x84, 0x26, 0xf1, 0x46, 0x15, 0x9c, 0x4c,
- 0x39, 0xc6, 0x2b, 0x66, 0x7e, 0x55, 0x0f, 0x5a, 0xbb, 0x70, 0x5d, 0x4f,
- 0xe8, 0xc1, 0x58, 0x67, 0xdc, 0xd4, 0x22, 0xc1, 0xe2, 0xde, 0x93, 0x94,
- 0xf1, 0xe6, 0xa4, 0xbb, 0xee, 0x3d, 0x99, 0x9e, 0xbe, 0xe7, 0xbb, 0x64,
- 0x66, 0x60, 0x63, 0x5c, 0x86, 0x7b, 0x43, 0x0f, 0xf8, 0x2f, 0x12, 0x10,
- 0x64, 0xc5, 0xcf, 0x0a, 0xdf, 0x6e, 0xa7, 0x2f, 0x9a, 0xbb, 0x77, 0x0d,
- 0xec, 0xd1, 0xe3, 0x16, 0xb5, 0x0b, 0xce, 0xd5, 0x95, 0x10, 0xa4, 0x02,
- 0x1b, 0x02, 0x40, 0x1c, 0x20, 0x5b, 0x17, 0x45, 0x16, 0xe4, 0x08, 0x53,
- 0xa2, 0xec, 0x0d, 0x91, 0x56, 0xfc, 0x49, 0xe6, 0x42, 0xc2, 0xa4, 0xa2,
- 0x38, 0x84, 0xa8, 0x21, 0x5a, 0xbb, 0xa9, 0xce, 0xc4, 0x96, 0xd0, 0xc7,
- 0x13, 0x66, 0x01, 0x8e, 0x14, 0x1f, 0x6f, 0x53, 0x52, 0x91, 0x02, 0xd2,
- 0x61, 0xd1, 0xcb, 0xae, 0xa7, 0x7e, 0x01, 0x38, 0x6f, 0xf8, 0x55, 0x9f,
- 0xa7, 0xe0, 0xda, 0x0c, 0x1e, 0x7f, 0x44, 0x61, 0x85, 0xac, 0x58, 0x43,
- 0x5d, 0xa1, 0xb4, 0xb6, 0xed, 0xe4, 0x22, 0xa3, 0x0c, 0x9a, 0x5b, 0x92,
- 0xa6, 0x94, 0x22, 0x9b, 0x70, 0x0b, 0x5b, 0xf9, 0x30, 0x13, 0x18, 0x19,
- 0xa9, 0x48, 0x44, 0xb4, 0x19, 0xe8, 0x34, 0x66, 0x6b, 0x6c, 0xb3, 0xc1,
- 0x9f, 0x72, 0x7d, 0x80, 0xbd, 0xe1, 0x5e, 0x9f, 0xeb, 0x80, 0x55, 0xaa,
- 0x2e, 0xaa, 0x8d, 0x41, 0x3f, 0x49, 0x2d, 0xc3, 0x1f, 0x7d, 0xb9, 0xeb,
- 0x8d, 0xb8, 0xa0, 0xef, 0xd6, 0xa1, 0x57, 0x18, 0xae, 0x65, 0x67, 0xd6,
- 0x50, 0x45, 0xf7, 0x60, 0xff, 0xec, 0x0e, 0x9e, 0xbe, 0x78, 0xd1, 0xba,
- 0xd1, 0x6b, 0x8f, 0x1e, 0xf1, 0xd9, 0xee, 0x2e, 0x67, 0xff, 0x76, 0x5f,
- 0x33, 0xbf, 0x18, 0xbc, 0xc0, 0x8b, 0xed, 0xd7, 0xb8, 0x7e, 0xf6, 0xea,
- 0xf7, 0x06, 0xf4, 0x9b, 0xc8, 0xe7, 0xe0, 0x75, 0x59, 0xf9, 0xd6, 0x0b,
- 0xfa, 0x5c, 0xe4, 0x2d, 0x4e, 0x4c, 0xc6, 0x3c, 0x96, 0x57, 0x57, 0x14,
- 0x95, 0xa1, 0x27, 0x71, 0xf1, 0x99, 0x1d, 0x71, 0x97, 0x56, 0xd3, 0x70,
- 0xb8, 0xbb, 0xfd, 0xc1, 0xde, 0xaa, 0xe1, 0x82, 0xdf, 0x11, 0xc0, 0x0a,
- 0x5a, 0x4e, 0x32, 0x27, 0x8d, 0x21, 0xc1, 0x90, 0xd2, 0x6e, 0x43, 0x7b,
- 0xa6, 0x47, 0x7b, 0x2f, 0x5e, 0xf4, 0xa9, 0x67, 0xcf, 0x5e, 0xbc, 0x58,
- 0x99, 0x3c, 0xe4, 0x7d, 0xe6, 0xae, 0x74, 0x4e, 0x2a, 0x7a, 0xdd, 0xed,
- 0x99, 0x9a, 0xec, 0x95, 0xf8, 0x77, 0xe8, 0x37, 0xc9, 0xab, 0xe4, 0xdd,
- 0xd9, 0xe5, 0xb1, 0xe7, 0xbf, 0xc1, 0xf9, 0xe2, 0x6c, 0x0f, 0x8f, 0x79,
- 0x0d, 0x11, 0xca, 0x05, 0xf8, 0xea, 0x61, 0x1f, 0x1b, 0x63, 0x2b, 0x8c,
- 0xaf, 0x03, 0xde, 0xa8, 0x39, 0x20, 0xff, 0xd6, 0xfd, 0xdc, 0x19, 0x7b,
- 0xa8, 0xaf, 0xf3, 0xc6, 0x4f, 0x68, 0xdf, 0x32, 0x8b, 0xcd, 0x05, 0xa7,
- 0x6f, 0xd3, 0x59, 0x6e, 0x83, 0x29, 0x9b, 0xb5, 0x91, 0x34, 0x0d, 0xd3,
- 0xcb, 0xd1, 0x3f, 0xca, 0xc5, 0x66, 0x40, 0x63, 0x91, 0xcd, 0xc8, 0x79,
- 0x20, 0x37, 0x21, 0xbf, 0x30, 0xc0, 0x93, 0x72, 0x5a, 0x60, 0xd0, 0x72,
- 0xd9, 0xbb, 0x14, 0x0e, 0x5d, 0xff, 0xe3, 0x91, 0x78, 0x0a, 0x9c, 0x5e,
- 0xc0, 0x3c, 0x29, 0x96, 0x97, 0x9a, 0xf1, 0x09, 0xe8, 0x36, 0x6b, 0x57,
- 0x1e, 0xd7, 0xfa, 0xf0, 0x8a, 0x78, 0xa8, 0x1d, 0x4e, 0xfc, 0x69, 0xb6,
- 0x50, 0xa2, 0xb6, 0xa2, 0xdd, 0x8e, 0xd9, 0xcb, 0x57, 0xf9, 0xf5, 0xb2,
- 0x8a, 0xc3, 0x7a, 0x60, 0x9c, 0x0b, 0xb2, 0x54, 0xc9, 0x40, 0xd3, 0xbb,
- 0xb4, 0xca, 0xb4, 0x90, 0x43, 0x71, 0x6f, 0x0f, 0xb7, 0x1a, 0xca, 0x8a,
- 0x20, 0x25, 0xa6, 0xd6, 0xc0, 0x2f, 0x46, 0xa0, 0x5f, 0xa3, 0xc7, 0x90,
- 0x1f, 0x41, 0x80, 0x0d, 0xc2, 0x48, 0x9a, 0x36, 0x0e, 0xc3, 0xab, 0xbe,
- 0x6d, 0xb3, 0xd8, 0xd7, 0xa8, 0x0e, 0x96, 0xc8, 0x14, 0x74, 0x03, 0x67,
- 0xe5, 0x72, 0xd3, 0xcb, 0xfc, 0xa7, 0x67, 0x5d, 0x15, 0x7b, 0x65, 0xff,
- 0x0d, 0x13, 0xfc, 0x48, 0xf2, 0x60, 0x3d, 0x59, 0x08, 0xf1, 0x22, 0xd9,
- 0xe2, 0xd9, 0xb5, 0xd4, 0xe3, 0x94, 0xe8, 0x32, 0x26, 0x8b, 0xd9, 0x18,
- 0x64, 0x69, 0x03, 0xa6, 0x48, 0x5a, 0x69, 0x5e, 0xe3, 0x64, 0x4b, 0x6b,
- 0x47, 0xea, 0x0e, 0xf5, 0xdc, 0x24, 0x2c, 0xa5, 0x68, 0xa7, 0x70, 0x3a,
- 0x25, 0x95, 0xf8, 0x0b, 0x0d, 0x5f, 0xda, 0xef, 0xbc, 0x5a, 0x96, 0xbe,
- 0x16, 0x95, 0x61, 0xe8, 0x92, 0xa4, 0xee, 0xea, 0x85, 0x3c, 0x3a, 0xf9,
- 0x7f, 0x8e, 0x7f, 0xcf, 0xa8, 0x53, 0x95, 0xde, 0x59, 0xa8, 0xb9, 0x94,
- 0xd1, 0x95, 0x68, 0x90, 0xcd, 0x6a, 0x4c, 0x67, 0x62, 0xc5, 0x53, 0xad,
- 0x4c, 0xdc, 0x1e, 0x88, 0x2b, 0x4a, 0xdd, 0x27, 0xb3, 0xb1, 0xc2, 0xbd,
- 0x4d, 0x88, 0xf0, 0xca, 0x79, 0x16, 0xc1, 0xf0, 0x08, 0x8c, 0x30, 0xd6,
- 0x43, 0x17, 0xd2, 0x2b, 0xd4, 0x39, 0xe7, 0xf2, 0xb7, 0xa8, 0xf3, 0x14,
- 0x90, 0xb2, 0x17, 0x80, 0x43, 0x50, 0xb7, 0x4c, 0x6f, 0x1f, 0xa8, 0xbc,
- 0xe1, 0xe7, 0x65, 0x65, 0xb8, 0x0b, 0x33, 0x0a, 0x51, 0x55, 0xc9, 0xcb,
- 0xf7, 0x17, 0xa7, 0x2b, 0x20, 0xf6, 0x23, 0xac, 0x02, 0x4d, 0x57, 0xef,
- 0x22, 0x03, 0x2d, 0x44, 0x95, 0x9c, 0xa7, 0xd7, 0x59, 0xcf, 0x67, 0xd7,
- 0x50, 0x75, 0x11, 0x13, 0x20, 0x4e, 0x88, 0x98, 0xa7, 0xc8, 0xe7, 0xd3,
- 0x25, 0x31, 0xee, 0x02, 0xc3, 0x3e, 0x30, 0xfe, 0x6a, 0x96, 0xca, 0xec,
- 0x2d, 0x2b, 0x14, 0x89, 0xfd, 0x3e, 0x4a, 0x46, 0xaf, 0x0e, 0xa1, 0x2e,
- 0x01, 0x96, 0x07, 0xe7, 0xa1, 0xb8, 0x0c, 0xf9, 0xd3, 0x7a, 0x7f, 0x26,
- 0x4f, 0x7d, 0x4f, 0xbb, 0x39, 0xc8, 0x62, 0x04, 0xb3, 0x3c, 0x15, 0x14,
- 0x1a, 0xf6, 0x5d, 0x4a, 0x1d, 0x1f, 0x3f, 0x2a, 0xf5, 0x31, 0x45, 0x4d,
- 0x95, 0x11, 0xf9, 0x54, 0x1d, 0x2b, 0x3e, 0xc8, 0xc0, 0x4e, 0xc2, 0x48,
- 0x30, 0xb7, 0x15, 0x08, 0x4d, 0x4e, 0xa5, 0x7f, 0x07, 0x82, 0x82, 0x66,
- 0x6d, 0x48, 0xbb, 0xd6, 0x02, 0xc8, 0xc4, 0x06, 0x9b, 0xce, 0x88, 0xe9,
- 0xda, 0xba, 0xb2, 0x68, 0x8c, 0xd3, 0x92, 0xd8, 0x91, 0xa9, 0x4b, 0x69,
- 0x61, 0xfd, 0xce, 0xad, 0x95, 0xfd, 0xdd, 0x99, 0x60, 0x5c, 0xa0, 0xe8,
- 0xb0, 0x2f, 0xf4, 0xed, 0x03, 0xb3, 0x3b, 0x0a, 0xc9, 0x9a, 0xf2, 0x96,
- 0xd5, 0xdb, 0x7b, 0xff, 0xd5, 0x8f, 0x32, 0xfa, 0xae, 0x60, 0x21, 0xf3,
- 0xba, 0xdb, 0x00, 0x5d, 0x8b, 0x25, 0x3c, 0xeb, 0x77, 0x48, 0x85, 0x5d,
- 0x96, 0x85, 0x5c, 0x97, 0x51, 0xdf, 0xe2, 0xc0, 0x0b, 0x0d, 0x27, 0x47,
- 0x8c, 0xf7, 0x1f, 0xbc, 0xce, 0xcd, 0x3d, 0x52, 0x73, 0xca, 0x3a, 0x3b,
- 0x06, 0x18, 0x05, 0xea, 0x0e, 0x63, 0x58, 0x2e, 0x42, 0xe3, 0x29, 0xc0,
- 0x70, 0xd9, 0x57, 0x6c, 0x70, 0xc7, 0xec, 0x89, 0xe1, 0x0a, 0xb4, 0x8d,
- 0xf2, 0xa7, 0x5a, 0x8d, 0x21, 0x75, 0x2e, 0x0b, 0xa9, 0x76, 0x28, 0x44,
- 0xb3, 0x92, 0x0e, 0x4a, 0xe8, 0x8e, 0xc8, 0xfc, 0xd8, 0x4c, 0x72, 0x40,
- 0x67, 0xea, 0xc4, 0x66, 0x78, 0x0b, 0xc1, 0x7a, 0x60, 0x70, 0x5a, 0x9a,
- 0x18, 0x06, 0x7c, 0x74, 0xfd, 0xc0, 0xa6, 0x53, 0x96, 0xe3, 0x9a, 0xa3,
- 0x2c, 0xcc, 0x7f, 0xc2, 0x09, 0x0d, 0x13, 0xd3, 0xec, 0xb0, 0x33, 0x04,
- 0xe5, 0xe7, 0x5e, 0x81, 0x6f, 0x6b, 0x0d, 0xac, 0xb9, 0xd1, 0x00, 0xb8,
- 0x2c, 0x14, 0x45, 0x11, 0x8a, 0x52, 0x32, 0x82, 0x63, 0x61, 0x74, 0x60,
- 0x78, 0xe8, 0x11, 0xff, 0x2e, 0x64, 0xd4, 0x46, 0xf2, 0xc7, 0x81, 0xe3,
- 0x47, 0xde, 0xba, 0xcf, 0x8c, 0x96, 0xed, 0x80, 0x1f, 0x30, 0xa6, 0x36,
- 0x22, 0xce, 0x1e, 0xae, 0x82, 0x53, 0xb7, 0x28, 0x5f, 0x61, 0x88, 0x78,
- 0x31, 0x48, 0x9e, 0x74, 0xa3, 0x09, 0x10, 0xbf, 0xe8, 0xb2, 0xc8, 0x3e,
- 0x11, 0xe7, 0xdd, 0xea, 0xe6, 0x42, 0x45, 0xfb, 0xfb, 0xc3, 0x8b, 0x77,
- 0x27, 0xef, 0xbe, 0x3e, 0x20, 0x6e, 0x90, 0xac, 0x9a, 0xe4, 0x84, 0x49,
- 0xf8, 0xeb, 0x72, 0x9a, 0x4f, 0x58, 0x56, 0x48, 0x2d, 0xac, 0x16, 0xe9,
- 0x6c, 0x26, 0x6e, 0xd6, 0xd9, 0x7d, 0x28, 0xdf, 0x05, 0x06, 0x49, 0x9c,
- 0x65, 0x55, 0x79, 0xbd, 0xb4, 0x53, 0x3f, 0x81, 0x3a, 0x82, 0x60, 0x01,
- 0x02, 0xa9, 0x37, 0x16, 0xba, 0x6c, 0x5a, 0x27, 0x65, 0xe1, 0xf5, 0xe9,
- 0x69, 0x12, 0xd6, 0x08, 0x00, 0xea, 0x4c, 0x89, 0x8c, 0x39, 0x41, 0x04,
- 0x0d, 0x99, 0xed, 0x5f, 0xe7, 0x63, 0xc6, 0x1a, 0x91, 0x02, 0x40, 0xf2,
- 0xa6, 0x25, 0xf7, 0x8c, 0xf9, 0x6a, 0xba, 0xd2, 0x5d, 0x64, 0x20, 0x34,
- 0x01, 0x9f, 0xc3, 0x0a, 0xe7, 0xd5, 0x14, 0xf6, 0x90, 0x11, 0x93, 0xe5,
- 0x55, 0x43, 0x2a, 0x52, 0xeb, 0x36, 0x6d, 0xb3, 0x7d, 0xaf, 0x8b, 0x24,
- 0xdc, 0xb0, 0xa5, 0xd3, 0x4a, 0xb4, 0x9d, 0xd8, 0x6a, 0xb2, 0x74, 0xe7,
- 0xb2, 0x6e, 0x08, 0x9a, 0xf8, 0x68, 0x18, 0x6d, 0x9a, 0xa5, 0xb6, 0x0c,
- 0x5c, 0x4d, 0xf2, 0x32, 0x14, 0x18, 0x77, 0x59, 0x95, 0xb9, 0xe2, 0xcc,
- 0x48, 0x4a, 0x32, 0xe2, 0x6e, 0x98, 0x8c, 0x4a, 0xf3, 0x7c, 0xa8, 0x65,
- 0xd9, 0x2a, 0x2a, 0xad, 0x2a, 0x85, 0xe8, 0x8f, 0xc3, 0x56, 0x81, 0x67,
- 0x1e, 0xd1, 0xb9, 0xf6, 0x78, 0x23, 0x75, 0xcd, 0x68, 0xff, 0x8f, 0x33,
- 0xab, 0x54, 0xd0, 0x17, 0x10, 0x01, 0xa2, 0x1d, 0xd2, 0x1b, 0x18, 0x81,
- 0xda, 0x43, 0x8d, 0x0c, 0xaa, 0xb6, 0xe6, 0xb5, 0xf4, 0x40, 0x7d, 0x24,
- 0x1f, 0xe0, 0xdb, 0x1d, 0x70, 0xb4, 0xfa, 0x84, 0xc7, 0xea, 0x9e, 0x8a,
- 0xed, 0xe9, 0xf9, 0x4f, 0xa5, 0x08, 0x80, 0x0d, 0xab, 0xe2, 0x57, 0x77,
- 0x19, 0x69, 0x99, 0x41, 0xa8, 0xfc, 0x8c, 0xe9, 0x2f, 0xe4, 0x21, 0x3f,
- 0xbb, 0xca, 0x7f, 0x59, 0x2e, 0x9c, 0xbe, 0x73, 0x30, 0xe4, 0x48, 0x01,
- 0x6f, 0x82, 0xa8, 0xd4, 0xd5, 0x70, 0x3b, 0x8a, 0x8f, 0xe2, 0x3e, 0xc8,
- 0x9d, 0x54, 0x1b, 0xfd, 0x7a, 0xfa, 0xa0, 0xe0, 0xd3, 0x02, 0x1a, 0xdd,
- 0x5b, 0x1a, 0x0b, 0x6a, 0x3d, 0x4b, 0xda, 0x54, 0x9a, 0x78, 0x55, 0x7e,
- 0xfd, 0xa0, 0x66, 0x2b, 0x93, 0x2d, 0x6c, 0xae, 0x95, 0x4f, 0xb0, 0x5a,
- 0x08, 0x4b, 0xfc, 0x86, 0x0a, 0xda, 0xe3, 0x37, 0x12, 0x73, 0x0a, 0x52,
- 0x2d, 0x7d, 0xce, 0xa2, 0xd8, 0x44, 0xf8, 0xb3, 0xaa, 0x4e, 0x1a, 0x85,
- 0x5f, 0x9b, 0xb1, 0x00, 0xdf, 0xd8, 0xa2, 0xd6, 0x76, 0x6c, 0xda, 0xdd,
- 0xad, 0xc0, 0x87, 0x89, 0x36, 0x6f, 0x3f, 0xd1, 0xd2, 0x79, 0xe6, 0xc5,
- 0x59, 0x9d, 0x49, 0x39, 0x2f, 0xe6, 0xda, 0xd6, 0x0b, 0x47, 0xee, 0x9b,
- 0xdc, 0xfa, 0x7f, 0x56, 0xdf, 0x24, 0xb6, 0x74, 0x89, 0x9d, 0x6b, 0x67,
- 0xc3, 0x52, 0xa4, 0x59, 0xea, 0xe1, 0x96, 0x08, 0x01, 0x94, 0x82, 0xdf,
- 0x5a, 0x25, 0x6c, 0x13, 0x28, 0x35, 0xc8, 0xa3, 0x5c, 0xa1, 0x41, 0x58,
- 0xba, 0x09, 0x17, 0x89, 0x0c, 0xf2, 0xe3, 0x7c, 0x72, 0x9a, 0x16, 0x2f,
- 0x54, 0xfb, 0x6e, 0xe3, 0xfe, 0xd8, 0xcb, 0x39, 0xb1, 0x85, 0x0b, 0x62,
- 0x30, 0x07, 0xbe, 0xba, 0xe3, 0xd3, 0x23, 0xe8, 0x4a, 0x7f, 0x52, 0xa2,
- 0x97, 0x1d, 0x83, 0xd0, 0x1c, 0x34, 0x11, 0xbb, 0x06, 0xa6, 0x53, 0xd1,
- 0x0e, 0x6b, 0xa0, 0xa7, 0x79, 0x03, 0x01, 0xf2, 0xc7, 0xfd, 0xdd, 0x55,
- 0x42, 0x9e, 0x1a, 0x52, 0xf6, 0x78, 0x3a, 0x8d, 0xb5, 0xb5, 0xc1, 0x70,
- 0x0d, 0xba, 0x5c, 0x45, 0xba, 0x43, 0x50, 0xd6, 0x9c, 0x0a, 0x14, 0xd0,
- 0x1f, 0xab, 0xe6, 0x3f, 0x6e, 0x19, 0xff, 0xda, 0xba, 0x26, 0x2b, 0xca,
- 0x9a, 0x38, 0xf9, 0x75, 0xe1, 0xad, 0x31, 0x35, 0x14, 0x03, 0x99, 0xa9,
- 0x2c, 0x51, 0x5f, 0x89, 0xa7, 0xb6, 0x3b, 0x9d, 0x01, 0xb6, 0x3d, 0xea,
- 0x57, 0x28, 0x99, 0x52, 0x1e, 0x8a, 0x64, 0x63, 0xd7, 0xce, 0x17, 0x7c,
- 0x7b, 0xb2, 0x1f, 0x52, 0xe8, 0x1f, 0x18, 0x99, 0xa3, 0xa7, 0x40, 0x41,
- 0x2d, 0x16, 0x2b, 0xcb, 0x5f, 0x0c, 0x37, 0xad, 0x27, 0x4a, 0xd9, 0x24,
- 0x4f, 0x05, 0xb3, 0x89, 0x29, 0xa1, 0x6f, 0x79, 0x23, 0xfd, 0x81, 0x47,
- 0xca, 0x90, 0xb0, 0x97, 0x62, 0xdd, 0xae, 0xb2, 0xc7, 0x3c, 0xb5, 0xb1,
- 0x5d, 0x74, 0x5c, 0xc9, 0x27, 0x44, 0x0e, 0x74, 0xf8, 0x32, 0x02, 0xfd,
- 0xcc, 0x12, 0x8e, 0x74, 0x0d, 0x37, 0x16, 0x2f, 0x4e, 0x4f, 0xee, 0x34,
- 0x1f, 0x3f, 0xf3, 0x72, 0xd6, 0x5a, 0x00, 0x42, 0x79, 0x41, 0x4b, 0xd7,
- 0x6a, 0xfe, 0x68, 0xb2, 0x25, 0x95, 0xa2, 0xe4, 0x6a, 0xaf, 0x23, 0xa5,
- 0x27, 0xbe, 0x3e, 0xbe, 0x24, 0xd7, 0xc0, 0x05, 0x94, 0x6f, 0xdb, 0x41,
- 0x38, 0x58, 0xe4, 0xaa, 0x75, 0xc5, 0xe5, 0x85, 0xb4, 0x8e, 0x6b, 0x2e,
- 0x7e, 0x5a, 0xcc, 0xd2, 0x22, 0x9a, 0x6e, 0x62, 0x74, 0x28, 0x2a, 0x23,
- 0x59, 0x3a, 0x7a, 0x2a, 0xb5, 0xd8, 0x3d, 0x7e, 0x62, 0x4e, 0x1f, 0x3f,
- 0x7f, 0x7f, 0x29, 0xde, 0x91, 0xd7, 0xc7, 0xa7, 0xc7, 0x97, 0xc7, 0x5d,
- 0x6b, 0x71, 0xcc, 0x74, 0x3b, 0x00, 0xe8, 0x37, 0xd9, 0xe4, 0xa6, 0x28,
- 0x67, 0xe5, 0x75, 0x2e, 0xd5, 0x83, 0x92, 0xef, 0xb3, 0xf1, 0xeb, 0xc3,
- 0xef, 0xe8, 0x06, 0x23, 0x4f, 0xc7, 0xf9, 0xc5, 0xd9, 0xf9, 0x9b, 0x93,
- 0x77, 0xaf, 0xfb, 0xc9, 0xd1, 0xd9, 0xf9, 0x5f, 0xfa, 0xc9, 0xdb, 0xb3,
- 0xef, 0x8e, 0x23, 0xc0, 0x5a, 0xe2, 0xab, 0x8c, 0x54, 0xf2, 0x94, 0x2a,
- 0x1e, 0xce, 0xd8, 0x2b, 0xd8, 0x51, 0xee, 0x89, 0xad, 0x43, 0xa0, 0x15,
- 0x50, 0x99, 0x16, 0xbb, 0xd7, 0x4c, 0x9d, 0xd9, 0xaf, 0xdf, 0x1c, 0x1f,
- 0xbe, 0xee, 0x07, 0x64, 0x85, 0x23, 0x2e, 0xa7, 0x4e, 0xe3, 0xb3, 0x83,
- 0x06, 0xc5, 0x1d, 0xeb, 0xbb, 0xb8, 0x93, 0x38, 0xb4, 0xc2, 0x90, 0x48,
- 0x23, 0x3b, 0x50, 0x70, 0x61, 0xba, 0xb6, 0xd8, 0xfa, 0x9a, 0x7a, 0x5d,
- 0x5e, 0xed, 0x34, 0x52, 0x0f, 0x54, 0xb1, 0x6b, 0xa7, 0x95, 0x03, 0xcf,
- 0x2d, 0x7b, 0xc3, 0x12, 0x9e, 0x45, 0xb2, 0xf4, 0xa5, 0xcb, 0x9c, 0x7d,
- 0x60, 0x99, 0x14, 0xe1, 0xff, 0x60, 0x9f, 0x57, 0x2a, 0xf5, 0x4e, 0x40,
- 0x0c, 0x4d, 0xb0, 0x93, 0x11, 0x73, 0xfa, 0x09, 0x95, 0x55, 0x1c, 0xc1,
- 0xae, 0x6a, 0x9d, 0xf0, 0x26, 0x4a, 0x86, 0x39, 0xcd, 0x9f, 0xfb, 0xa0,
- 0x12, 0x2b, 0xff, 0xc0, 0x13, 0x9b, 0xc4, 0xa0, 0xb5, 0x5c, 0x7f, 0xe0,
- 0xca, 0x6c, 0xcd, 0x8c, 0x01, 0x3d, 0xbc, 0x54, 0xd6, 0x1c, 0x4d, 0x06,
- 0x27, 0x6a, 0x0c, 0xaf, 0xbb, 0xd6, 0xf5, 0xd4, 0xa8, 0x43, 0x80, 0xf3,
- 0xda, 0xd5, 0x57, 0xd2, 0x16, 0x15, 0xbe, 0x65, 0x4e, 0x03, 0x8d, 0x68,
- 0x99, 0xba, 0xcc, 0x7d, 0xb9, 0x1a, 0x65, 0xd0, 0xde, 0xac, 0x70, 0x05,
- 0x95, 0xc0, 0x87, 0x12, 0xd6, 0xa7, 0x65, 0x3f, 0xb4, 0x31, 0x8a, 0xc8,
- 0xdf, 0x05, 0x5f, 0x5c, 0x42, 0x41, 0x9f, 0x01, 0x5b, 0x70, 0x42, 0x3f,
- 0x60, 0x59, 0xb6, 0x69, 0xb3, 0x8a, 0x46, 0x24, 0x7d, 0x88, 0x17, 0x97,
- 0x74, 0x05, 0x68, 0x7c, 0x1f, 0xd2, 0x93, 0xdd, 0x4f, 0xce, 0xbb, 0x4b,
- 0x77, 0x58, 0x9d, 0x0c, 0x84, 0x3b, 0x70, 0x6e, 0x04, 0x6f, 0xe8, 0xd7,
- 0xd8, 0x7a, 0xb3, 0x42, 0x38, 0xfa, 0xfe, 0x42, 0x59, 0x0c, 0x4f, 0x4c,
- 0x9d, 0x9e, 0x98, 0x23, 0x11, 0x49, 0x58, 0x9e, 0x96, 0xa8, 0x44, 0x86,
- 0x50, 0x38, 0x6e, 0x73, 0xcc, 0xbe, 0x69, 0x2b, 0xfc, 0x30, 0x55, 0xe6,
- 0x8b, 0x7e, 0x19, 0x25, 0xfb, 0x1e, 0xf8, 0x74, 0xb0, 0x66, 0x17, 0xc7,
- 0x97, 0x17, 0xc3, 0x64, 0xcb, 0x67, 0xa6, 0x7a, 0x3e, 0xdc, 0x0d, 0xc3,
- 0x05, 0x54, 0x15, 0x30, 0xfa, 0x55, 0x94, 0x0b, 0x5c, 0xf1, 0x55, 0xc8,
- 0x07, 0xfa, 0x6e, 0x88, 0x73, 0xf5, 0xf2, 0xef, 0x77, 0x63, 0xdf, 0xf3,
- 0x2b, 0x0f, 0xb6, 0xbe, 0x47, 0xbf, 0x58, 0x33, 0xca, 0x6f, 0x8e, 0x4f,
- 0xcf, 0xc3, 0x51, 0x7e, 0x77, 0xf1, 0xe6, 0x2f, 0xed, 0x51, 0x3e, 0x79,
- 0x1a, 0xf9, 0xea, 0x6f, 0xe9, 0xca, 0xcd, 0xea, 0x72, 0x76, 0x9b, 0x71,
- 0xfe, 0x00, 0xd2, 0x07, 0x0e, 0xcc, 0x35, 0x40, 0x8c, 0xbf, 0x5f, 0x84,
- 0x8c, 0x8a, 0x70, 0x06, 0xd8, 0x11, 0xca, 0x73, 0x62, 0xea, 0x39, 0x5b,
- 0x8f, 0x73, 0x34, 0xf8, 0x9e, 0x80, 0x9b, 0xdc, 0xa8, 0x59, 0x79, 0xe0,
- 0xf7, 0x7c, 0xcf, 0xa2, 0x83, 0xc6, 0xd1, 0xf7, 0x3c, 0x93, 0xaa, 0x36,
- 0xf0, 0x81, 0xd1, 0x53, 0xba, 0x55, 0x6f, 0x4b, 0xfa, 0xe3, 0xaa, 0x68,
- 0xb2, 0x76, 0x06, 0xb9, 0x30, 0x54, 0x31, 0x55, 0xd4, 0x6a, 0x77, 0xc9,
- 0x16, 0x7a, 0x69, 0xc8, 0x90, 0xa7, 0xee, 0xa5, 0x68, 0xd6, 0x9a, 0xa4,
- 0xad, 0x91, 0x33, 0x0c, 0x31, 0x5c, 0x68, 0xfa, 0xb8, 0x50, 0x50, 0x79,
- 0x2a, 0x6b, 0x26, 0x3b, 0x5c, 0x64, 0xb9, 0x93, 0x77, 0x17, 0x73, 0xb3,
- 0x94, 0x45, 0x0b, 0x62, 0x47, 0x97, 0x03, 0x7b, 0x39, 0xfd, 0x64, 0x0b,
- 0xc7, 0x96, 0xce, 0x5e, 0x0b, 0xa9, 0x33, 0x48, 0xdd, 0x88, 0x84, 0x7b,
- 0x5b, 0x09, 0x1d, 0x13, 0x8f, 0xa5, 0x57, 0x19, 0x6d, 0x03, 0x29, 0xe8,
- 0x52, 0xa3, 0x22, 0x46, 0x3c, 0x84, 0xb2, 0x6e, 0x20, 0x4b, 0x8d, 0xd8,
- 0xbe, 0x09, 0xd4, 0x1d, 0xe4, 0x2f, 0x7c, 0xcc, 0xa1, 0x48, 0xea, 0x1c,
- 0x7a, 0xc0, 0x3c, 0x87, 0x6a, 0x32, 0xa2, 0x4a, 0xfc, 0x0a, 0xe2, 0x78,
- 0x89, 0xf4, 0x6b, 0xcb, 0x24, 0xd7, 0xdb, 0xf4, 0xb4, 0xed, 0xd1, 0xa8,
- 0xb3, 0x77, 0xf0, 0x34, 0x74, 0x58, 0xe7, 0x8b, 0xdb, 0xa7, 0xf0, 0x10,
- 0x3c, 0xef, 0xf3, 0xbf, 0x9e, 0x33, 0x79, 0x4a, 0xd3, 0x76, 0x5f, 0x33,
- 0x53, 0x1c, 0x9b, 0x04, 0x27, 0xe7, 0x9a, 0xbf, 0x38, 0x7c, 0x2c, 0x8e,
- 0xd3, 0x69, 0xf1, 0xcc, 0xf3, 0x91, 0xf0, 0x8f, 0x64, 0xef, 0x33, 0xe4,
- 0x24, 0xdc, 0x56, 0xb2, 0xf5, 0xd6, 0xf2, 0xa6, 0xee, 0x0d, 0x9f, 0xb4,
- 0x0f, 0x68, 0x53, 0xdd, 0x0f, 0x28, 0xb0, 0x6f, 0xac, 0xbc, 0xc8, 0x5e,
- 0x38, 0x29, 0xba, 0xa6, 0x9b, 0x6c, 0x7a, 0x0a, 0xb2, 0xf0, 0x8f, 0xcd,
- 0x01, 0x53, 0x20, 0x42, 0x72, 0x4c, 0x99, 0x16, 0x17, 0xc7, 0x6f, 0xde,
- 0x8f, 0x8e, 0x5f, 0x83, 0xef, 0x25, 0xc8, 0xaf, 0x34, 0xfb, 0x23, 0xa7,
- 0xe5, 0x62, 0x27, 0x67, 0x53, 0xb2, 0xaa, 0x20, 0x1d, 0x69, 0xd7, 0x5b,
- 0xe0, 0xf2, 0x12, 0xd0, 0x4f, 0x9a, 0xd2, 0xa8, 0xf3, 0x21, 0xd8, 0x9d,
- 0x2f, 0x67, 0x79, 0xf7, 0x17, 0x24, 0x7f, 0xf3, 0xa8, 0xa7, 0x19, 0x11,
- 0xa1, 0xbf, 0xe4, 0xa0, 0x7a, 0x20, 0x90, 0xde, 0x5a, 0x3e, 0x7d, 0xb3,
- 0xe7, 0x66, 0x59, 0xb6, 0x50, 0x7e, 0xd3, 0x74, 0x5e, 0x2e, 0x0b, 0xf6,
- 0xb2, 0x98, 0x15, 0x52, 0xc7, 0x02, 0x1c, 0x59, 0x68, 0x97, 0x6f, 0xe4,
- 0xe8, 0xc8, 0xc9, 0x8e, 0x26, 0xfb, 0x91, 0x90, 0xac, 0x9a, 0x85, 0x4b,
- 0xc2, 0xcd, 0x4d, 0x8b, 0x92, 0x5f, 0x6f, 0x51, 0x14, 0xc3, 0xd7, 0xdb,
- 0x56, 0x90, 0xfa, 0xa3, 0x10, 0x93, 0xd1, 0x79, 0xb9, 0x2f, 0xe9, 0xec,
- 0xba, 0x34, 0xc6, 0xee, 0xcd, 0xdc, 0xe6, 0x3e, 0x55, 0x00, 0x51, 0xd4,
- 0xdb, 0xdd, 0x4a, 0x16, 0x1b, 0x11, 0x6e, 0x4f, 0x04, 0xd4, 0x32, 0x4e,
- 0x07, 0xa5, 0xdd, 0xcf, 0xd3, 0x04, 0xbb, 0x8b, 0x42, 0x0d, 0x2c, 0xb0,
- 0x46, 0x92, 0xc4, 0x89, 0xb9, 0xe0, 0x19, 0x0c, 0x37, 0xe2, 0xdf, 0xb3,
- 0xaa, 0xec, 0x5a, 0x86, 0xaa, 0x8f, 0x69, 0xcf, 0xfd, 0x8e, 0xff, 0x2b,
- 0x99, 0xf3, 0xf7, 0xf6, 0x63, 0x27, 0x60, 0x9e, 0x7e, 0x82, 0xb5, 0xbb,
- 0x72, 0x3b, 0x5c, 0xb2, 0x75, 0x0a, 0xcc, 0x11, 0x3d, 0x28, 0xd5, 0x4f,
- 0x88, 0xa2, 0xba, 0x49, 0x7c, 0xcc, 0x3d, 0x63, 0x1d, 0xec, 0x72, 0x8b,
- 0x41, 0x1c, 0x80, 0x4a, 0x78, 0x5d, 0x6c, 0xaf, 0xe1, 0x72, 0x48, 0x69,
- 0x98, 0xa4, 0x9b, 0x6f, 0x31, 0x3f, 0x38, 0x3e, 0xb7, 0x4d, 0x3f, 0x9e,
- 0x95, 0x14, 0xf0, 0x60, 0x83, 0x1e, 0x5f, 0x0f, 0xeb, 0xea, 0x91, 0xe6,
- 0x57, 0xd1, 0x2e, 0x54, 0x4b, 0x85, 0xdd, 0x4b, 0xa0, 0x3a, 0x46, 0x86,
- 0x4a, 0x3e, 0x11, 0xe7, 0xa9, 0x32, 0xe1, 0x63, 0x14, 0xfc, 0x66, 0x20,
- 0x48, 0xb4, 0x9d, 0x8c, 0x1b, 0xe8, 0xb7, 0x89, 0xbd, 0xa4, 0xd3, 0x48,
- 0xb8, 0x62, 0x88, 0xf8, 0x0d, 0xbc, 0x35, 0x92, 0x72, 0x1b, 0x31, 0x7a,
- 0xd9, 0x7a, 0x20, 0xa7, 0x05, 0x12, 0x2a, 0x68, 0x3c, 0x30, 0x1f, 0xd2,
- 0xc2, 0xef, 0x2c, 0x56, 0xc0, 0x34, 0x92, 0x97, 0x53, 0xa4, 0x62, 0x30,
- 0x4f, 0x73, 0x50, 0xeb, 0x85, 0x53, 0xf7, 0xa5, 0x37, 0x9b, 0xe4, 0xf4,
- 0xf8, 0x94, 0xcf, 0x97, 0x73, 0xbc, 0xde, 0x17, 0xc5, 0x7a, 0x0e, 0xc5,
- 0x5a, 0x97, 0x75, 0x88, 0x98, 0x99, 0xd0, 0xb7, 0x77, 0xf7, 0xbe, 0x8d,
- 0x60, 0x61, 0xdb, 0x36, 0x0c, 0x21, 0xa0, 0xb7, 0x98, 0xdf, 0x15, 0x0b,
- 0xf5, 0x7f, 0x7d, 0x87, 0x26, 0x2f, 0xcd, 0x8d, 0xfd, 0x45, 0x24, 0x63,
- 0x22, 0x26, 0x3e, 0xf2, 0x5a, 0xb0, 0x93, 0x5a, 0xe9, 0x9e, 0xb9, 0x15,
- 0xb0, 0xe3, 0xe8, 0xa6, 0xe5, 0x65, 0x5a, 0x29, 0xa3, 0x5c, 0x65, 0x03,
- 0xfe, 0x34, 0x06, 0xea, 0xfc, 0x48, 0x7c, 0x31, 0xc9, 0x96, 0xa7, 0x95,
- 0x83, 0xaa, 0xb5, 0x5c, 0x04, 0x9c, 0xe1, 0x9a, 0xef, 0xed, 0x2b, 0x1c,
- 0xe6, 0xf3, 0xbb, 0x12, 0x64, 0x17, 0xa3, 0x85, 0xdc, 0x6f, 0x32, 0xcb,
- 0xea, 0xa3, 0x68, 0x13, 0xd5, 0xb6, 0x45, 0x1e, 0x89, 0xb2, 0xce, 0x2d,
- 0xc2, 0x09, 0xd9, 0xcc, 0x46, 0x71, 0x60, 0x26, 0x44, 0xd6, 0x0e, 0xfe,
- 0x23, 0x01, 0x5d, 0x3c, 0xfd, 0xf4, 0x29, 0xbc, 0x2c, 0x9d, 0x9d, 0xc3,
- 0x65, 0x21, 0xd9, 0x08, 0x7a, 0xf6, 0xa9, 0x63, 0x04, 0x0d, 0xe3, 0xc5,
- 0x1b, 0xf9, 0x6a, 0x20, 0xe9, 0x38, 0x2e, 0xd9, 0x95, 0xcf, 0xb3, 0x95,
- 0x46, 0xe6, 0x91, 0x85, 0xc2, 0x5d, 0x9a, 0xc7, 0xaa, 0x43, 0x08, 0xaa,
- 0x4b, 0x32, 0x54, 0x5d, 0xb0, 0xc5, 0xfc, 0xd9, 0xdc, 0x18, 0xa5, 0x8e,
- 0xe6, 0x50, 0x27, 0x48, 0x1b, 0x34, 0xf3, 0xb6, 0x64, 0x27, 0x6e, 0x30,
- 0x4f, 0xf4, 0x15, 0x9e, 0x76, 0x3a, 0x4d, 0xe6, 0xaa, 0xca, 0x51, 0x27,
- 0x94, 0xcf, 0x74, 0x9d, 0xec, 0x99, 0xe9, 0xcf, 0x8b, 0x25, 0x41, 0xbb,
- 0x78, 0xb2, 0xf1, 0x4d, 0xdd, 0x9b, 0xb1, 0x69, 0x9f, 0x01, 0x34, 0xa8,
- 0xb9, 0xb4, 0x74, 0xf0, 0x6a, 0x2f, 0xc8, 0xc0, 0xc7, 0x03, 0x74, 0xf8,
- 0xd6, 0x60, 0xf7, 0x2f, 0xd8, 0x88, 0x36, 0x68, 0x69, 0xe6, 0xf5, 0x4a,
- 0xcd, 0x3e, 0x99, 0xd9, 0x66, 0xbe, 0x65, 0x77, 0xa3, 0xb9, 0xdb, 0x6c,
- 0xe8, 0xd1, 0x84, 0x46, 0x10, 0x04, 0x2d, 0xf9, 0x6d, 0xd9, 0xdd, 0x21,
- 0xe2, 0xca, 0x46, 0xce, 0x22, 0x27, 0x72, 0x4a, 0xd0, 0xe9, 0x7f, 0xc0,
- 0x99, 0xae, 0xd3, 0x7a, 0x36, 0xc8, 0xbb, 0x62, 0xfc, 0x18, 0xb8, 0x24,
- 0x8b, 0x29, 0xb0, 0xbb, 0xd0, 0x34, 0x31, 0x3a, 0x1c, 0x9d, 0x76, 0xcb,
- 0xc8, 0xaf, 0xa3, 0x73, 0xdb, 0x6b, 0x6b, 0x3c, 0xbf, 0x01, 0x63, 0x93,
- 0x7a, 0xe9, 0xe9, 0x1e, 0xe1, 0xa8, 0x3b, 0xc1, 0x42, 0xc1, 0x01, 0xb6,
- 0xaa, 0x40, 0x43, 0x7d, 0x80, 0x8f, 0x3b, 0x66, 0xab, 0xa0, 0x2b, 0x4c,
- 0x08, 0x02, 0xf4, 0x37, 0xd7, 0xd1, 0x60, 0xa7, 0x66, 0x84, 0x34, 0x64,
- 0xba, 0x23, 0x50, 0x82, 0x87, 0xe2, 0x71, 0x4c, 0x02, 0xa5, 0x23, 0x1f,
- 0x91, 0x9a, 0x4e, 0xe5, 0x60, 0x06, 0x90, 0x15, 0xab, 0xbc, 0xd9, 0xa2,
- 0x4a, 0xd6, 0x78, 0x9a, 0x60, 0x05, 0x4d, 0x9f, 0x2f, 0x2c, 0x2b, 0xa8,
- 0xa8, 0x0d, 0x17, 0x9d, 0x27, 0x92, 0xc1, 0x90, 0x92, 0x90, 0x03, 0x36,
- 0x57, 0x5c, 0xcc, 0x43, 0x7b, 0xe0, 0xb5, 0xd9, 0x15, 0x90, 0xf9, 0x4c,
- 0x60, 0x49, 0x7f, 0x5b, 0xe6, 0xe6, 0x76, 0xa2, 0x04, 0x8e, 0x61, 0xf2,
- 0x9a, 0xe1, 0x25, 0x52, 0x11, 0x83, 0xcb, 0xe3, 0xa0, 0x86, 0x0e, 0x83,
- 0x55, 0x45, 0x41, 0x34, 0x1d, 0x08, 0x7c, 0xe9, 0xa6, 0x43, 0x74, 0x12,
- 0xa1, 0xba, 0x9a, 0x53, 0x75, 0x44, 0xdd, 0x9e, 0x9b, 0x93, 0x0e, 0xd3,
- 0x8c, 0xab, 0x11, 0x37, 0x40, 0x15, 0x48, 0xf0, 0x51, 0x51, 0xc1, 0x00,
- 0xbe, 0xd5, 0x1f, 0x43, 0x33, 0xb0, 0xdf, 0xe2, 0x41, 0x87, 0x59, 0x24,
- 0x36, 0x40, 0x43, 0x34, 0xfa, 0x45, 0x3a, 0xdb, 0xe1, 0x4a, 0xd4, 0x46,
- 0xcc, 0xcc, 0xa8, 0x9f, 0xd4, 0x92, 0xd6, 0x7c, 0xe8, 0xce, 0xcd, 0x3a,
- 0x0a, 0xb4, 0x5b, 0x9a, 0x23, 0xb3, 0xb8, 0xe3, 0xb2, 0x56, 0xfa, 0x33,
- 0xd3, 0xb0, 0x19, 0x6a, 0x6b, 0x0f, 0x83, 0x54, 0xe6, 0x41, 0x2e, 0x82,
- 0x36, 0x47, 0x0e, 0x97, 0xbc, 0x7a, 0x90, 0x84, 0x80, 0xdf, 0x08, 0xeb,
- 0x84, 0xfd, 0x62, 0x1a, 0x02, 0xcf, 0xf5, 0x6a, 0x59, 0x56, 0xc8, 0x74,
- 0xb3, 0xb8, 0x25, 0x81, 0x22, 0xb4, 0x32, 0xf2, 0x51, 0x7b, 0x89, 0x42,
- 0x43, 0x91, 0xba, 0x10, 0x66, 0x01, 0x97, 0x92, 0xe7, 0x3c, 0x99, 0x19,
- 0x01, 0x1b, 0xb1, 0xef, 0xb4, 0x26, 0x08, 0x91, 0xcd, 0xf4, 0xbb, 0x22,
- 0xac, 0x5e, 0xd2, 0x75, 0x3f, 0x5b, 0xd2, 0xb7, 0xb9, 0x04, 0x88, 0xe5,
- 0x59, 0xd1, 0xf4, 0xcc, 0x68, 0x39, 0x33, 0xcb, 0x66, 0x40, 0xe7, 0xc2,
- 0x63, 0x2b, 0x5a, 0x6a, 0x05, 0x21, 0xa5, 0xfb, 0x71, 0xbe, 0x01, 0x4e,
- 0x1f, 0x1c, 0xfe, 0x0b, 0xa5, 0xea, 0xb3, 0x36, 0xe9, 0xb9, 0xd0, 0x0e,
- 0xfd, 0xaa, 0x2d, 0x92, 0x3e, 0x6e, 0x8f, 0xac, 0x40, 0xb9, 0xfe, 0xd2,
- 0x3d, 0x12, 0xe1, 0xe2, 0x79, 0x70, 0x97, 0xb0, 0xfe, 0xff, 0x3f, 0x69,
- 0x8f, 0xa4, 0xc9, 0xe3, 0x76, 0x49, 0xda, 0xdd, 0x26, 0x91, 0x82, 0x7c,
- 0xff, 0xd2, 0xdb, 0xf8, 0xf3, 0xce, 0xed, 0x08, 0x1e, 0xaa, 0xc1, 0xb5,
- 0x91, 0xe9, 0x8b, 0xdc, 0x5c, 0x57, 0x5d, 0x06, 0x81, 0xc3, 0xba, 0x85,
- 0xac, 0xf8, 0x7a, 0x34, 0x1a, 0x1c, 0x9e, 0x9f, 0xf8, 0xac, 0x84, 0x42,
- 0xa6, 0xc5, 0xd9, 0x11, 0x9c, 0xaa, 0x47, 0xab, 0xcc, 0x4f, 0x04, 0x38,
- 0x14, 0x64, 0x1f, 0x23, 0x6f, 0x38, 0xd9, 0x7b, 0xf1, 0x7c, 0xcf, 0x48,
- 0xee, 0x7b, 0x26, 0xbc, 0x91, 0xf7, 0x9f, 0x0e, 0x9f, 0xec, 0x50, 0x95,
- 0xcf, 0xbc, 0xf1, 0xdc, 0x76, 0xd2, 0xbe, 0xd9, 0x6d, 0x91, 0xb8, 0x18,
- 0x75, 0xeb, 0xdd, 0xf1, 0x51, 0xc2, 0xc1, 0x7a, 0xd0, 0x9f, 0x24, 0x80,
- 0x0e, 0x13, 0x0e, 0x59, 0x62, 0x0b, 0x88, 0xdd, 0xd0, 0x46, 0x1e, 0xaa,
- 0x3d, 0xcb, 0x53, 0x1b, 0xa8, 0x54, 0xc1, 0x74, 0x24, 0xaa, 0x11, 0x20,
- 0x5b, 0xaf, 0xb0, 0x3d, 0xa1, 0xfd, 0xc6, 0xca, 0x81, 0xcc, 0xcc, 0x22,
- 0x52, 0x34, 0xca, 0x9f, 0x93, 0x47, 0xf2, 0x38, 0x52, 0x71, 0xa3, 0xd5,
- 0xeb, 0xa3, 0x4a, 0xc8, 0x0a, 0x35, 0xc6, 0xb9, 0x18, 0x02, 0x6d, 0x45,
- 0xf6, 0xa3, 0x82, 0x0d, 0xc8, 0x4c, 0x9a, 0xcc, 0xad, 0x62, 0x71, 0xf5,
- 0xb7, 0xe9, 0x5a, 0x0f, 0x5d, 0x54, 0x2b, 0x8a, 0x5c, 0x6b, 0x6d, 0xe5,
- 0x87, 0xfb, 0x2e, 0x07, 0x45, 0x94, 0x9e, 0x55, 0x23, 0x62, 0x45, 0xa7,
- 0xab, 0xcf, 0x63, 0x03, 0x2c, 0x85, 0x61, 0x6d, 0xba, 0xe3, 0x35, 0x64,
- 0x5b, 0x5f, 0xd7, 0x78, 0x04, 0x90, 0xe9, 0xbe, 0xb5, 0x63, 0xcc, 0x82,
- 0x99, 0xbc, 0x28, 0x0a, 0xd8, 0xb2, 0x8e, 0xfd, 0xf2, 0x0a, 0x44, 0xcc,
- 0x75, 0x40, 0x5f, 0x71, 0x07, 0x10, 0x85, 0x25, 0x4c, 0xe1, 0xa7, 0x6d,
- 0x94, 0xd0, 0x2b, 0x0b, 0x5f, 0x19, 0xb9, 0x92, 0x2f, 0xd2, 0x59, 0xf2,
- 0x08, 0x3c, 0x55, 0x6c, 0xf1, 0x49, 0xa4, 0xb3, 0xf6, 0xfa, 0xcb, 0x85,
- 0xbb, 0x4c, 0x50, 0xb2, 0x05, 0xf7, 0xb8, 0x60, 0xf5, 0x95, 0x05, 0x48,
- 0x63, 0x14, 0x11, 0xdb, 0xc7, 0xb9, 0x5b, 0x29, 0x2c, 0xfe, 0x08, 0xda,
- 0xb6, 0xce, 0x45, 0x10, 0x66, 0xb2, 0xff, 0xbf, 0x41, 0x75, 0x78, 0x96,
- 0xd8, 0xb5, 0x7a, 0xcc, 0xed, 0xc0, 0xfc, 0x7f, 0x5c, 0x23, 0x26, 0x60,
- 0x12, 0x70, 0x4a, 0xc5, 0xff, 0xed, 0xdb, 0xe1, 0x97, 0x73, 0x60, 0xc9,
- 0xd6, 0xd3, 0x7d, 0x36, 0x50, 0x04, 0x03, 0x6f, 0x37, 0x1b, 0x48, 0x89,
- 0x80, 0x04, 0x01, 0x63, 0x99, 0x3d, 0xac, 0xaf, 0xfa, 0x5b, 0xce, 0x2a,
- 0x1f, 0x49, 0x40, 0xbc, 0xfe, 0xff, 0x06, 0x5d, 0xe4, 0xd9, 0xe3, 0xf6,
- 0xda, 0xbf, 0x42, 0x5f, 0x5d, 0x33, 0xc5, 0x5b, 0x66, 0xde, 0xee, 0x88,
- 0xec, 0x94, 0x09, 0x87, 0xa1, 0x1c, 0x6d, 0x3b, 0x71, 0x49, 0xb0, 0x45,
- 0x1e, 0xc1, 0xc9, 0xf9, 0x77, 0xcf, 0x91, 0xb2, 0x38, 0xea, 0x7a, 0x2b,
- 0xab, 0xe4, 0xf4, 0xf5, 0xe1, 0xf9, 0x2f, 0xd8, 0xbf, 0x7f, 0x81, 0xfd,
- 0xb9, 0xc8, 0xb2, 0xe9, 0x80, 0x3d, 0x23, 0x2f, 0xf1, 0x8f, 0x88, 0x2f,
- 0x31, 0xb5, 0x99, 0x48, 0x58, 0x08, 0x72, 0x98, 0x84, 0x3e, 0x5a, 0xbc,
- 0x9c, 0x6c, 0xe5, 0x85, 0xe4, 0x07, 0x2e, 0x50, 0xd4, 0x20, 0xd0, 0x8b,
- 0xcb, 0x62, 0xba, 0xad, 0x45, 0x0c, 0xf1, 0x6d, 0x78, 0x61, 0xc4, 0xb9,
- 0x4e, 0x5b, 0xf6, 0x9a, 0x58, 0x04, 0x2c, 0x15, 0x8b, 0xf7, 0x0c, 0x87,
- 0xd3, 0xa2, 0x91, 0x9e, 0x7b, 0x37, 0x14, 0x76, 0xea, 0x70, 0xae, 0xff,
- 0x93, 0x5d, 0xae, 0x55, 0x87, 0xa4, 0x8c, 0xdf, 0x31, 0x33, 0xa9, 0xfb,
- 0xf9, 0x55, 0xb1, 0x82, 0xb5, 0x53, 0xe9, 0xaf, 0x44, 0x6b, 0x06, 0xc9,
- 0x07, 0x38, 0x5d, 0x56, 0x21, 0x1b, 0x79, 0xea, 0xcf, 0x0e, 0x7b, 0xc7,
- 0xb9, 0xbf, 0xf6, 0x13, 0xed, 0xb9, 0x34, 0x9f, 0x6f, 0x4d, 0x67, 0x04,
- 0x33, 0xd6, 0x6f, 0x85, 0x62, 0xfc, 0x2e, 0xe9, 0xd0, 0x93, 0xbd, 0x44,
- 0x8d, 0x7a, 0xce, 0xbe, 0x91, 0xa4, 0x9f, 0xbf, 0x84, 0x21, 0x51, 0xef,
- 0xf5, 0x87, 0x2a, 0x1a, 0x94, 0x45, 0x53, 0x31, 0x8f, 0x9c, 0xab, 0xad,
- 0xcb, 0x7e, 0xcf, 0xa5, 0x57, 0x29, 0x21, 0xe5, 0x72, 0x65, 0x34, 0x6b,
- 0x21, 0xb5, 0x4c, 0x01, 0xd4, 0x4b, 0xd6, 0x4c, 0x86, 0x76, 0x65, 0x41,
- 0xf7, 0x40, 0x65, 0xcc, 0xb2, 0xaa, 0xd0, 0x7a, 0x0f, 0x66, 0x84, 0x95,
- 0xb2, 0x84, 0x0c, 0x06, 0xf2, 0x5e, 0x08, 0x50, 0x63, 0x27, 0xff, 0x0a,
- 0x60, 0xd0, 0x6f, 0x08, 0x84, 0x58, 0xcf, 0x41, 0x1e, 0x26, 0xdb, 0x28,
- 0x95, 0xbd, 0x95, 0x0a, 0x29, 0xea, 0x89, 0xa1, 0xbc, 0x88, 0x94, 0x04,
- 0xbd, 0x9a, 0xa5, 0x77, 0x82, 0xc1, 0xee, 0xca, 0xd7, 0xd1, 0xe9, 0x13,
- 0x4c, 0xeb, 0xe5, 0xe9, 0xc8, 0xa7, 0x1a, 0x94, 0x62, 0xc7, 0x24, 0x7c,
- 0xbe, 0x3a, 0x3e, 0x1c, 0x5d, 0x0e, 0x83, 0x21, 0x9a, 0x31, 0x86, 0xd1,
- 0x20, 0xde, 0x30, 0x18, 0x27, 0x65, 0x81, 0xcf, 0xd2, 0x7b, 0x22, 0x1b,
- 0x11, 0xfc, 0x29, 0x75, 0x8e, 0xfb, 0xa6, 0xad, 0x93, 0x6e, 0x9c, 0x32,
- 0x1e, 0xa5, 0xc9, 0xaa, 0x90, 0x23, 0xc0, 0xcc, 0xdd, 0x38, 0x9f, 0xd1,
- 0x08, 0x4c, 0xbf, 0xc6, 0xc6, 0x42, 0x11, 0x98, 0x0f, 0xb2, 0x19, 0xca,
- 0x19, 0x85, 0x91, 0xe9, 0x33, 0x6d, 0xeb, 0x85, 0xc8, 0x8c, 0x24, 0xc5,
- 0x63, 0x35, 0x60, 0xdb, 0xdc, 0x9b, 0x65, 0x9d, 0x09, 0x61, 0x04, 0xb5,
- 0xa1, 0x73, 0xc5, 0x05, 0x50, 0x2d, 0xbe, 0x8e, 0x73, 0x41, 0x29, 0xdd,
- 0x2d, 0x44, 0xc3, 0xa6, 0xf5, 0x47, 0x85, 0x69, 0x4d, 0x1a, 0x40, 0xeb,
- 0xd3, 0xb5, 0xf4, 0xde, 0xfb, 0x9d, 0xc2, 0xbc, 0xb4, 0xd0, 0xc8, 0x1d,
- 0x20, 0x4c, 0x5f, 0x17, 0xce, 0xf3, 0x7d, 0x4e, 0xec, 0x6b, 0xdb, 0x6b,
- 0xd6, 0xdb, 0x3a, 0xc6, 0x89, 0x57, 0x96, 0x01, 0x97, 0x88, 0x3b, 0xde,
- 0x96, 0x71, 0x36, 0x6f, 0x63, 0x86, 0x64, 0xe6, 0x12, 0x19, 0x7a, 0x19,
- 0x30, 0x8f, 0x9e, 0x90, 0x8d, 0x80, 0x2a, 0x21, 0x32, 0x3d, 0xbf, 0x78,
- 0x42, 0x9e, 0x3e, 0x0d, 0x27, 0xa4, 0xca, 0xfe, 0x36, 0x8d, 0xb1, 0xcb,
- 0x01, 0x35, 0x05, 0xc0, 0x16, 0x03, 0x9d, 0x2e, 0x98, 0x22, 0x8f, 0xba,
- 0xba, 0x63, 0xf6, 0xae, 0x94, 0x4f, 0xcc, 0x3c, 0xe2, 0x01, 0x82, 0xc9,
- 0x92, 0xeb, 0x31, 0xa0, 0x83, 0x04, 0x41, 0x49, 0xfb, 0x59, 0x0d, 0x74,
- 0x76, 0xd3, 0xa6, 0x24, 0xbd, 0x56, 0x3e, 0xb2, 0x56, 0x11, 0x27, 0x82,
- 0x67, 0x90, 0x08, 0x57, 0x66, 0xe4, 0xf6, 0xf0, 0x0c, 0xa8, 0x08, 0xa7,
- 0x1d, 0xd8, 0x03, 0x65, 0x6a, 0xbb, 0x93, 0x21, 0x43, 0xe7, 0xb1, 0xf3,
- 0xe0, 0x65, 0xf4, 0xc9, 0x25, 0x24, 0x16, 0x83, 0xb9, 0xd6, 0x4c, 0x41,
- 0x10, 0x4a, 0x26, 0x8e, 0x62, 0x46, 0x8a, 0x20, 0xc7, 0x5b, 0xca, 0xb1,
- 0x3c, 0x76, 0x22, 0x42, 0xe1, 0x81, 0x69, 0x69, 0xf9, 0x67, 0xed, 0x80,
- 0x45, 0x82, 0xab, 0x8f, 0x56, 0xa6, 0x80, 0x01, 0xc1, 0x80, 0xe2, 0x0c,
- 0x42, 0x16, 0x36, 0x63, 0x71, 0xdd, 0x66, 0x33, 0x00, 0xe1, 0xb3, 0x62,
- 0x52, 0xdd, 0x2f, 0x7c, 0x3a, 0xc4, 0xe9, 0x3f, 0x33, 0xff, 0x8a, 0x65,
- 0x03, 0x7e, 0xd5, 0x28, 0x3e, 0x46, 0xd8, 0x6d, 0x87, 0xfa, 0x17, 0x25,
- 0xf2, 0xa9, 0x7c, 0x63, 0x63, 0x16, 0x49, 0xaa, 0xec, 0x0b, 0xb7, 0x98,
- 0x1b, 0xd2, 0xcd, 0x55, 0x7a, 0x33, 0xe5, 0x08, 0xa7, 0xa5, 0x74, 0x3d,
- 0x55, 0x4b, 0x64, 0x90, 0x5b, 0x40, 0xcf, 0xa3, 0xd7, 0x7e, 0xbf, 0xcf,
- 0x13, 0x76, 0xbb, 0x1f, 0x80, 0xfc, 0x48, 0x24, 0xbc, 0x29, 0xab, 0x49,
- 0xd6, 0x2e, 0x61, 0x42, 0x07, 0x56, 0x89, 0xcf, 0xf7, 0x39, 0x8e, 0x6b,
- 0xfd, 0x27, 0xae, 0x6e, 0xe5, 0xaa, 0x02, 0x8a, 0xf4, 0xb6, 0xc3, 0x96,
- 0x8f, 0x8c, 0x70, 0xe5, 0xb8, 0x2d, 0x33, 0xa0, 0xd5, 0x52, 0x82, 0x54,
- 0xcb, 0x98, 0x9a, 0xa7, 0x6f, 0xf7, 0x57, 0x91, 0xfb, 0x0d, 0xe5, 0xd7,
- 0x80, 0xfb, 0x4f, 0x89, 0xba, 0xd5, 0x31, 0x8f, 0x24, 0xb6, 0xfc, 0x0f,
- 0x40, 0x0b, 0xe4, 0xd3, 0x7a, 0xbe, 0xf7, 0xd9, 0xf3, 0xed, 0x75, 0xf5,
- 0x4e, 0x88, 0xe9, 0x98, 0x40, 0xe5, 0xbc, 0x89, 0xe8, 0x5f, 0xfb, 0x43,
- 0x7f, 0x82, 0x3c, 0x3a, 0x56, 0xc9, 0xc3, 0x0c, 0xef, 0x38, 0x73, 0xe1,
- 0xd0, 0xa6, 0xc0, 0x44, 0x58, 0x0a, 0x4d, 0xda, 0x2e, 0x3c, 0x2e, 0x22,
- 0x37, 0x91, 0x73, 0x8e, 0xcd, 0xdc, 0xb5, 0xae, 0xbb, 0xc3, 0x64, 0xb3,
- 0x67, 0xf0, 0x44, 0xfb, 0xc0, 0xf7, 0xa7, 0x5f, 0x02, 0x82, 0x3b, 0x8b,
- 0xbf, 0x0f, 0xdb, 0xff, 0xf2, 0x5d, 0xd0, 0xae, 0x81, 0x5f, 0xb3, 0xca,
- 0x4f, 0xfe, 0x05, 0xab, 0xfc, 0x64, 0xfd, 0x2a, 0x3f, 0x79, 0xec, 0x2a,
- 0x7f, 0xf6, 0xec, 0xf9, 0xe7, 0xbf, 0x62, 0x95, 0xbd, 0x19, 0xfe, 0xbf,
- 0xb6, 0xca, 0xde, 0x4e, 0xfb, 0x75, 0xab, 0x2c, 0xc1, 0xa9, 0x40, 0x10,
- 0x0b, 0x4d, 0x30, 0x05, 0xef, 0x29, 0xe9, 0x88, 0xd1, 0x16, 0xfc, 0xac,
- 0x06, 0xce, 0xda, 0xcc, 0x6e, 0x8a, 0xd9, 0x85, 0x26, 0xb6, 0xb1, 0x82,
- 0x0f, 0x0f, 0x32, 0x0b, 0x3a, 0xee, 0x62, 0x46, 0x54, 0xf3, 0x9b, 0x83,
- 0x4d, 0x35, 0xfa, 0x15, 0xf2, 0xab, 0x19, 0xc4, 0xfc, 0x39, 0xb3, 0xd4,
- 0xff, 0xc2, 0x0c, 0xf4, 0x30, 0x76, 0xe7, 0x45, 0x3c, 0xfd, 0x49, 0x6b,
- 0x26, 0x8b, 0xc1, 0x55, 0x4a, 0xa4, 0x15, 0x01, 0xf0, 0x5b, 0x02, 0xdf,
- 0xe2, 0x69, 0xb8, 0x3c, 0x3a, 0x4f, 0xde, 0xa4, 0x42, 0x57, 0x9b, 0x6c,
- 0x99, 0xdd, 0xf6, 0xd9, 0xd3, 0xbd, 0x27, 0xdb, 0x6b, 0xb5, 0x8e, 0x76,
- 0x12, 0x26, 0xbe, 0x55, 0x94, 0x31, 0x00, 0xc2, 0xe5, 0xb2, 0x2a, 0x2c,
- 0x64, 0xd6, 0x7c, 0xe9, 0xc3, 0xbb, 0xb3, 0xd7, 0xc7, 0xa7, 0x87, 0x7f,
- 0xb1, 0x99, 0x1d, 0x34, 0x32, 0x85, 0x08, 0x7f, 0x30, 0xca, 0xfa, 0xfd,
- 0x07, 0x63, 0xff, 0x98, 0x5f, 0x6e, 0x3d, 0xd9, 0x26, 0x14, 0x66, 0x50,
- 0x2e, 0xe0, 0x3a, 0x6b, 0xe7, 0xc3, 0x30, 0x1a, 0x64, 0x4d, 0x1a, 0xa1,
- 0xba, 0x3f, 0x9e, 0xed, 0x0e, 0xf7, 0x85, 0x91, 0x52, 0x28, 0xf5, 0xdc,
- 0xfa, 0x78, 0xec, 0x98, 0xa9, 0x24, 0x1b, 0x33, 0x88, 0x36, 0x04, 0xdb,
- 0x51, 0xf2, 0x4d, 0x6e, 0xee, 0x79, 0x52, 0xce, 0x6a, 0x73, 0xd2, 0x09,
- 0x3f, 0x43, 0xa1, 0x8a, 0xab, 0x36, 0x5f, 0x01, 0x60, 0xb6, 0xc0, 0x9f,
- 0xac, 0xf5, 0x1d, 0xb4, 0x37, 0x7a, 0x83, 0x93, 0x91, 0xcd, 0x8a, 0xac,
- 0x19, 0x48, 0xcf, 0x5e, 0x9a, 0x3f, 0x5f, 0xdd, 0xa6, 0xb3, 0x00, 0xc0,
- 0x4d, 0x74, 0xfb, 0x92, 0x92, 0xe2, 0xa2, 0xc4, 0xf4, 0xa6, 0x47, 0xc7,
- 0x39, 0xb2, 0xbc, 0x94, 0xfa, 0x64, 0x5a, 0x85, 0xb5, 0xce, 0x2f, 0x2f,
- 0xff, 0x72, 0x7e, 0xfc, 0xea, 0x25, 0xc5, 0x98, 0xbf, 0x20, 0x14, 0x51,
- 0xdd, 0x0a, 0x39, 0x27, 0x54, 0x14, 0x29, 0x18, 0xc3, 0x0f, 0xaf, 0x4f,
- 0x46, 0xe7, 0xa7, 0x67, 0x47, 0xaf, 0x5e, 0xfe, 0x40, 0x4a, 0xb4, 0x39,
- 0x29, 0xf7, 0xde, 0xbb, 0xf6, 0x67, 0x96, 0x62, 0x2f, 0xcc, 0xfa, 0x39,
- 0xfe, 0xfe, 0xc3, 0xf1, 0xbb, 0xef, 0x5e, 0xbd, 0xbc, 0x4d, 0xab, 0x3e,
- 0x8d, 0x8f, 0xdf, 0x5e, 0x51, 0xcd, 0xa2, 0xb5, 0xd7, 0x48, 0x1b, 0x19,
- 0xcf, 0x3e, 0xd6, 0xf9, 0xdf, 0xb3, 0xc4, 0xbc, 0x3e, 0x5b, 0x86, 0x0c,
- 0x57, 0x97, 0xc2, 0xa3, 0x6c, 0x04, 0x15, 0x69, 0x7f, 0x5f, 0x9d, 0x7e,
- 0x4b, 0x2c, 0x2a, 0xd6, 0x2d, 0x34, 0x67, 0xe2, 0xde, 0xe4, 0x8b, 0x67,
- 0x7b, 0xfb, 0xdb, 0xae, 0x10, 0x04, 0x58, 0x98, 0x4c, 0x8f, 0x3f, 0x06,
- 0x08, 0xb8, 0xbf, 0x67, 0x5e, 0xa1, 0x41, 0x29, 0x66, 0x71, 0xdf, 0xca,
- 0x41, 0x53, 0x0b, 0x1b, 0xe9, 0x2c, 0x08, 0xf3, 0x53, 0x1d, 0x8d, 0x0a,
- 0xd9, 0xa8, 0x81, 0x83, 0xe1, 0xf2, 0x8d, 0x97, 0x88, 0xf6, 0x95, 0xdb,
- 0x7b, 0xa6, 0x3b, 0xe2, 0xa4, 0x58, 0x2b, 0x0c, 0x7e, 0x47, 0x67, 0x6c,
- 0x57, 0x83, 0xc6, 0x64, 0x1b, 0x03, 0x4b, 0xf6, 0x4f, 0x7c, 0x9e, 0xbd,
- 0x72, 0x70, 0xc0, 0xf2, 0x95, 0x9c, 0xb2, 0x8f, 0x51, 0xea, 0xc6, 0x53,
- 0xf0, 0xff, 0x03, 0x2e, 0x0b, 0x63, 0x86, 0x56, 0xa0, 0x9f, 0x53, 0x73,
- 0xd6, 0x33, 0x56, 0x67, 0xd9, 0x75, 0x3a, 0xb9, 0xb7, 0xe4, 0x43, 0x58,
- 0x90, 0x69, 0x19, 0x49, 0x50, 0x4a, 0x27, 0xa4, 0xbb, 0xce, 0xb2, 0xe9,
- 0x35, 0x90, 0x66, 0x9c, 0xec, 0x44, 0x88, 0x5b, 0xb5, 0x71, 0xb9, 0x6b,
- 0x36, 0xa3, 0x4b, 0x21, 0x66, 0xab, 0xd1, 0x8a, 0x96, 0xd8, 0xbf, 0xbd,
- 0xfb, 0x68, 0xdb, 0x5c, 0x17, 0x65, 0xb5, 0x7e, 0x4e, 0x9f, 0xb6, 0x1d,
- 0x84, 0x7f, 0xc7, 0x21, 0xa7, 0xe4, 0x4c, 0xf8, 0xa0, 0x5e, 0xd2, 0x5f,
- 0x57, 0x53, 0xb4, 0xb1, 0x95, 0x06, 0x16, 0x7d, 0xbe, 0x9e, 0x30, 0x6c,
- 0x9b, 0x56, 0x2f, 0x9c, 0xa7, 0xc4, 0xf4, 0xd5, 0x38, 0xef, 0x61, 0x3c,
- 0xf5, 0xd9, 0xfa, 0xf0, 0xcc, 0xf6, 0xcc, 0x94, 0x27, 0x79, 0x55, 0x7b,
- 0x16, 0x70, 0x18, 0xa9, 0x2c, 0x2a, 0x10, 0x4f, 0x8a, 0xfd, 0xbd, 0xa4,
- 0xb6, 0x48, 0x26, 0x12, 0x6e, 0xc6, 0xcc, 0xd4, 0x17, 0x0a, 0xac, 0x07,
- 0x2d, 0x6e, 0x29, 0x09, 0xb9, 0x78, 0x88, 0x53, 0xbd, 0xea, 0x30, 0x4f,
- 0x86, 0x61, 0x3c, 0x6a, 0x26, 0x71, 0x0c, 0x8b, 0x3c, 0xe2, 0x96, 0x71,
- 0xc8, 0x74, 0xb3, 0xd6, 0x2b, 0x98, 0xf0, 0xac, 0x05, 0xd7, 0x36, 0x55,
- 0x3e, 0x92, 0x48, 0xa2, 0xa1, 0x80, 0x2f, 0x91, 0x73, 0x7d, 0x6d, 0xc9,
- 0x6c, 0x78, 0x70, 0x9a, 0xfb, 0x85, 0x4e, 0x6d, 0xcd, 0x69, 0x30, 0x42,
- 0x5f, 0x17, 0xe5, 0x0a, 0xb4, 0x2a, 0x43, 0xeb, 0xa2, 0x32, 0x8d, 0xd2,
- 0xfb, 0x72, 0x49, 0xe1, 0x5a, 0x92, 0x14, 0x0a, 0x34, 0xeb, 0xcd, 0x48,
- 0x80, 0xef, 0x6b, 0x18, 0xaf, 0xd4, 0xbd, 0xa5, 0x88, 0x71, 0x4a, 0x31,
- 0x42, 0xfe, 0x8c, 0xb6, 0x08, 0xcd, 0xb7, 0x06, 0x8e, 0x0a, 0x3a, 0x6f,
- 0x2c, 0x42, 0x38, 0x92, 0x15, 0x67, 0x59, 0xb1, 0x6c, 0x36, 0x2f, 0xfb,
- 0x7a, 0x74, 0x87, 0xc8, 0x9e, 0xa0, 0x8f, 0xed, 0x30, 0x90, 0x57, 0x85,
- 0x10, 0x82, 0x1b, 0x41, 0xa6, 0x58, 0xa7, 0xb1, 0x22, 0xbb, 0xf3, 0x1b,
- 0x73, 0x6a, 0x96, 0x6d, 0xf0, 0xf7, 0x74, 0xef, 0x3d, 0x5c, 0xd9, 0x8f,
- 0xd6, 0x9c, 0xec, 0xf9, 0xb0, 0x14, 0x1a, 0xdd, 0x66, 0x00, 0x6b, 0x71,
- 0xdd, 0x21, 0xf1, 0xb4, 0xb5, 0xa8, 0xc0, 0xc2, 0x8c, 0x1f, 0xdb, 0xe5,
- 0xde, 0xe8, 0xe2, 0xbc, 0xd7, 0x17, 0x4f, 0xbb, 0xf9, 0xc0, 0xc0, 0xfc,
- 0x3b, 0x81, 0xce, 0x44, 0x34, 0x82, 0xcf, 0x9e, 0x4a, 0xe0, 0xd2, 0x2b,
- 0xa2, 0x17, 0x71, 0xfd, 0xb4, 0xab, 0xfc, 0x31, 0x25, 0xbf, 0x63, 0xfc,
- 0x34, 0xea, 0x4c, 0x7b, 0x84, 0x1c, 0x82, 0xea, 0x3b, 0x72, 0x99, 0x78,
- 0xef, 0x6c, 0xa2, 0x31, 0x95, 0x71, 0xa2, 0x6e, 0x3e, 0x90, 0x98, 0xf2,
- 0xb4, 0x33, 0xa3, 0xda, 0xa1, 0xc8, 0x54, 0xba, 0xe2, 0x6f, 0x65, 0xc5,
- 0x57, 0x9e, 0xa6, 0x54, 0xd3, 0x1c, 0x77, 0xa7, 0xd8, 0xe6, 0x76, 0xae,
- 0xc2, 0x78, 0x69, 0x22, 0x89, 0x37, 0xc8, 0xa1, 0x3a, 0xa3, 0x44, 0xae,
- 0xbb, 0xf9, 0xf3, 0x98, 0xb4, 0x1e, 0x1e, 0x90, 0x3f, 0x9e, 0x35, 0x95,
- 0x0e, 0x69, 0x77, 0xd0, 0xaf, 0x5d, 0xac, 0xfd, 0xa1, 0x41, 0xc9, 0x98,
- 0x7e, 0xe5, 0x90, 0xc4, 0xe0, 0xea, 0xae, 0x3b, 0x8d, 0x2c, 0x0c, 0x18,
- 0x3c, 0x6a, 0xa0, 0xad, 0x91, 0x1a, 0x73, 0x69, 0x37, 0xb8, 0x99, 0x4f,
- 0x47, 0xdb, 0x89, 0x1a, 0xc0, 0x89, 0x2d, 0x79, 0x41, 0xe3, 0xa4, 0xe1,
- 0xa9, 0x09, 0x4c, 0xfe, 0x6a, 0xc9, 0xa1, 0x67, 0xf7, 0x95, 0x10, 0xd7,
- 0xc7, 0xed, 0x5f, 0x7a, 0x53, 0x89, 0xcf, 0xd6, 0x80, 0x61, 0x3b, 0x2e,
- 0x49, 0x31, 0xef, 0xa2, 0x3d, 0x8c, 0x58, 0xe8, 0xed, 0xee, 0xed, 0xd9,
- 0xfa, 0xb1, 0xb6, 0x7f, 0x5c, 0x15, 0xe7, 0xb7, 0xef, 0xe1, 0xfe, 0xaf,
- 0x9e, 0xc3, 0xfd, 0x7f, 0xd1, 0x1c, 0x3e, 0xf9, 0x75, 0x73, 0xf8, 0xe4,
- 0x37, 0x9b, 0x43, 0x57, 0x79, 0x85, 0x1e, 0xa2, 0x96, 0xf3, 0xba, 0x23,
- 0x3a, 0xc9, 0x96, 0xa2, 0xa2, 0x1d, 0x63, 0x0a, 0x63, 0x91, 0x75, 0x69,
- 0x1e, 0x24, 0x8c, 0x79, 0x86, 0x1a, 0x14, 0x9d, 0x01, 0x37, 0x36, 0x35,
- 0x06, 0x9c, 0xae, 0x55, 0x6e, 0x93, 0x9d, 0x48, 0xdc, 0xc1, 0xc2, 0x35,
- 0xc2, 0xf1, 0xab, 0x92, 0x34, 0x07, 0xf2, 0xbd, 0xd0, 0xdd, 0xfe, 0x6e,
- 0x34, 0xc2, 0x27, 0x7f, 0x41, 0x06, 0x9a, 0xf3, 0x38, 0x44, 0xdd, 0x44,
- 0x61, 0x39, 0xe3, 0xf6, 0xfc, 0x7d, 0x0a, 0xfd, 0x44, 0x6b, 0xdd, 0x44,
- 0xde, 0x04, 0xb2, 0x3f, 0x94, 0x33, 0x26, 0x3a, 0xe7, 0xae, 0x8f, 0xdd,
- 0x6d, 0x64, 0x4f, 0xcb, 0x06, 0xf4, 0xec, 0x7d, 0x11, 0x10, 0xce, 0xb5,
- 0xd3, 0xf1, 0xed, 0x78, 0x7e, 0x94, 0xa0, 0x9e, 0xd2, 0x6a, 0xc7, 0x8e,
- 0xfa, 0x75, 0x1e, 0x70, 0xeb, 0xb4, 0x50, 0x0a, 0x2b, 0x1c, 0x3b, 0x71,
- 0xc7, 0x4d, 0xeb, 0x5f, 0x2d, 0x14, 0x7e, 0x53, 0x0d, 0x94, 0x07, 0x32,
- 0x4e, 0xfb, 0xe1, 0x54, 0xdd, 0x49, 0x39, 0x87, 0x02, 0x64, 0x16, 0xf4,
- 0x52, 0x2c, 0xab, 0xc1, 0xb1, 0xbc, 0xeb, 0x80, 0xfa, 0x1c, 0x40, 0x59,
- 0x59, 0xed, 0xc3, 0x66, 0x34, 0x28, 0xa6, 0x9c, 0x47, 0x59, 0x73, 0x7c,
- 0x6a, 0x59, 0xe8, 0x47, 0x84, 0x68, 0x9d, 0x8c, 0x36, 0x4e, 0xad, 0x0a,
- 0x96, 0x75, 0x92, 0x71, 0xda, 0x4d, 0xfe, 0x90, 0x68, 0x7e, 0xde, 0x1e,
- 0x6f, 0x3a, 0xc9, 0x06, 0x69, 0x3d, 0xc9, 0xf3, 0xb8, 0x6e, 0xc9, 0x7e,
- 0x18, 0xf0, 0x26, 0x26, 0x57, 0x4b, 0x72, 0x8f, 0xe3, 0x15, 0xd3, 0x97,
- 0xe5, 0x7c, 0xa1, 0xc5, 0x25, 0xf2, 0x42, 0x92, 0x52, 0xa8, 0xd3, 0xe5,
- 0xb2, 0xb9, 0x2e, 0xd5, 0xc4, 0xec, 0x07, 0xaa, 0xaa, 0xd6, 0xbc, 0x33,
- 0xcb, 0x33, 0xa9, 0xf2, 0x05, 0xb2, 0x98, 0x3d, 0x06, 0xcb, 0xbe, 0x2d,
- 0xf2, 0x00, 0xe5, 0x4f, 0x80, 0xe9, 0x5c, 0xf3, 0xe0, 0x7d, 0x90, 0x06,
- 0xd0, 0x1b, 0xf4, 0x48, 0xd1, 0xb6, 0xb4, 0x7f, 0xe6, 0x5d, 0x62, 0x9c,
- 0xe0, 0xa4, 0x54, 0x7e, 0x15, 0x35, 0x74, 0x56, 0x7b, 0xc1, 0xd4, 0xb0,
- 0x36, 0x5b, 0xe8, 0x5e, 0x49, 0x0d, 0xc0, 0x6c, 0xc4, 0x53, 0xd3, 0x87,
- 0xb2, 0x33, 0xcb, 0x88, 0xc6, 0x22, 0x29, 0x05, 0x56, 0x79, 0x93, 0x7d,
- 0x62, 0xf4, 0x67, 0xa8, 0x37, 0xb1, 0xa0, 0xb9, 0x51, 0x64, 0xe4, 0xe1,
- 0xe8, 0xe8, 0xe4, 0xa4, 0x85, 0x14, 0xa5, 0x69, 0xe3, 0xc4, 0x68, 0x86,
- 0xe4, 0xd7, 0x94, 0x23, 0x0e, 0x24, 0x3f, 0xba, 0x1b, 0x23, 0x35, 0xb2,
- 0xc5, 0x15, 0xb3, 0xb4, 0xce, 0x95, 0x76, 0x38, 0x15, 0x4d, 0xa7, 0x30,
- 0xdd, 0xcc, 0x29, 0xab, 0xeb, 0x66, 0x69, 0xb4, 0xfc, 0xdf, 0x3f, 0x83,
- 0x25, 0x0e, 0x4a, 0x93, 0xd9, 0xe2, 0x73, 0xe5, 0xbb, 0xff, 0xc2, 0xbd,
- 0x16, 0x61, 0x10, 0x3a, 0xaf, 0x84, 0x63, 0x16, 0xa9, 0x6b, 0x24, 0x69,
- 0x85, 0x05, 0x88, 0x2a, 0xa1, 0x50, 0x16, 0x2d, 0x37, 0x6e, 0x86, 0xab,
- 0x4e, 0x45, 0xb0, 0x9d, 0x58, 0x77, 0x47, 0xd7, 0x12, 0x60, 0xc7, 0x4e,
- 0xbd, 0xd6, 0xab, 0xd5, 0xbd, 0xbc, 0xf0, 0x85, 0xb5, 0x27, 0x20, 0xe5,
- 0xfd, 0xcf, 0x4f, 0xfa, 0xbb, 0xdf, 0x6d, 0x7f, 0x36, 0xec, 0xec, 0x01,
- 0xf8, 0x9f, 0x79, 0x02, 0x04, 0x9b, 0xd6, 0xfb, 0x63, 0x6f, 0x05, 0xc7,
- 0xd4, 0x23, 0xda, 0x69, 0xe5, 0x61, 0xfc, 0x6b, 0x77, 0x5a, 0x24, 0x31,
- 0xc4, 0x13, 0x62, 0xfe, 0x9a, 0x2e, 0x8b, 0xfc, 0x13, 0x10, 0x55, 0xe6,
- 0x96, 0x7f, 0x49, 0x14, 0x77, 0x2b, 0x98, 0x9c, 0x8e, 0xb4, 0x86, 0x9f,
- 0x2d, 0xdc, 0x68, 0x3e, 0xfc, 0xde, 0xbc, 0x6c, 0x6c, 0xca, 0x39, 0xb9,
- 0xd7, 0xb9, 0x8d, 0xbe, 0x4f, 0xa7, 0x01, 0xb1, 0x1e, 0x71, 0xcf, 0x17,
- 0x59, 0x43, 0xf8, 0x87, 0xb5, 0xbe, 0x96, 0xb6, 0xff, 0xea, 0x12, 0x74,
- 0xad, 0x0b, 0x42, 0xed, 0xac, 0x29, 0x07, 0x80, 0xc9, 0x70, 0x10, 0x99,
- 0xb6, 0x41, 0xeb, 0x71, 0x5c, 0x69, 0x01, 0x22, 0x8d, 0x06, 0x11, 0xfd,
- 0x69, 0x3c, 0x92, 0x60, 0x89, 0xce, 0x1c, 0x4d, 0x60, 0xde, 0xb5, 0x94,
- 0x41, 0x44, 0xe7, 0x1c, 0x8a, 0x42, 0xe2, 0xbb, 0x96, 0x64, 0x8b, 0x89,
- 0xd1, 0x1c, 0x7d, 0x7a, 0x8b, 0x4e, 0x11, 0x89, 0x90, 0xf9, 0x8c, 0x36,
- 0xff, 0x8e, 0x3a, 0xdc, 0x67, 0x21, 0xf8, 0xc5, 0xab, 0xe9, 0xc0, 0xb2,
- 0x8e, 0xc0, 0x83, 0x70, 0xba, 0xd1, 0xbf, 0x91, 0xc4, 0xa4, 0x4a, 0x44,
- 0x7b, 0x14, 0xcc, 0x3f, 0x1b, 0xad, 0x95, 0xc6, 0x1e, 0xd1, 0x1b, 0x2a,
- 0xdd, 0xa0, 0xfd, 0xaa, 0x78, 0x23, 0xb6, 0x8b, 0x73, 0xa8, 0x93, 0xd5,
- 0x63, 0xf5, 0x8b, 0x94, 0x6f, 0xb2, 0x55, 0x8e, 0x2f, 0x6d, 0xf5, 0x85,
- 0x39, 0x21, 0x37, 0x89, 0x77, 0x8a, 0xc2, 0x64, 0x96, 0x29, 0x9e, 0x17,
- 0xd6, 0x2b, 0x39, 0x16, 0x38, 0xeb, 0x29, 0x37, 0xac, 0x05, 0x5c, 0xc2,
- 0xa9, 0x29, 0x6d, 0xdd, 0xce, 0x2d, 0xa3, 0x3e, 0x6b, 0x39, 0x2e, 0x6a,
- 0x91, 0x38, 0xa3, 0x5c, 0x5d, 0xb6, 0x80, 0xfd, 0x68, 0xd5, 0x69, 0xb2,
- 0x78, 0x54, 0x37, 0x51, 0x24, 0x3a, 0xb6, 0x6c, 0xdd, 0x73, 0x72, 0xde,
- 0x6c, 0xab, 0x72, 0x69, 0x8e, 0x78, 0x5e, 0xf8, 0xfb, 0x3d, 0x8d, 0xba,
- 0xeb, 0x58, 0x28, 0x25, 0x87, 0x42, 0x48, 0x92, 0xcd, 0xee, 0xfb, 0xdd,
- 0x6f, 0x0c, 0x8d, 0x94, 0xd9, 0x4a, 0x6d, 0x8a, 0xb6, 0xa0, 0xd5, 0xb6,
- 0x03, 0x0a, 0xab, 0x7b, 0xa9, 0x78, 0xe7, 0xc0, 0xb2, 0x3e, 0x59, 0x0e,
- 0x75, 0xb5, 0xd3, 0x35, 0x00, 0x1b, 0xe0, 0x0a, 0x0f, 0x4f, 0x22, 0x32,
- 0x0b, 0x60, 0x3e, 0x10, 0xc0, 0x0a, 0xd9, 0xeb, 0x90, 0xb8, 0xae, 0xc6,
- 0x03, 0x4b, 0x34, 0xcd, 0x52, 0xe7, 0x36, 0xe1, 0x56, 0x1a, 0x67, 0x61,
- 0x73, 0xbc, 0x88, 0x91, 0x49, 0xfd, 0x8b, 0xe5, 0xb7, 0x56, 0x24, 0x2a,
- 0x49, 0xb5, 0xf0, 0x48, 0x5b, 0x5e, 0x53, 0xe2, 0x02, 0x74, 0xdc, 0x2c,
- 0x2b, 0x89, 0xbc, 0x86, 0xc9, 0x31, 0x3d, 0x1d, 0x36, 0xf4, 0x27, 0xb4,
- 0x40, 0xf4, 0x36, 0x1e, 0x6d, 0x31, 0x97, 0x00, 0x09, 0x77, 0x96, 0xec,
- 0x3d, 0xf1, 0x36, 0x96, 0x82, 0xcc, 0x1f, 0x0a, 0x2d, 0x1f, 0x29, 0xee,
- 0xaa, 0x6d, 0x26, 0xbd, 0xeb, 0x59, 0x39, 0x1e, 0x9b, 0x91, 0xf7, 0x54,
- 0x4f, 0x31, 0xdf, 0x0e, 0x5c, 0x42, 0x7e, 0x4f, 0xd2, 0xea, 0x1a, 0xee,
- 0xb6, 0x3e, 0x2c, 0x07, 0x36, 0x89, 0xa8, 0x17, 0x8e, 0xf2, 0x5b, 0x3f,
- 0xaf, 0x25, 0xe8, 0x22, 0x37, 0x0d, 0xbb, 0x3f, 0xed, 0x16, 0xa4, 0xb1,
- 0x79, 0x98, 0xa3, 0x8c, 0x99, 0x5d, 0xe8, 0xa7, 0xda, 0xbd, 0x84, 0x2b,
- 0xa4, 0xad, 0x2e, 0x39, 0x28, 0x22, 0x0c, 0x82, 0x4b, 0x48, 0x53, 0xf3,
- 0xb0, 0x9a, 0x19, 0x4f, 0x41, 0x7b, 0x40, 0xbd, 0xff, 0xa6, 0x3f, 0xf6,
- 0xfa, 0xf4, 0xdf, 0xfd, 0x7f, 0xf4, 0xb4, 0x4e, 0xfc, 0xdd, 0xdd, 0xdd,
- 0x50, 0x08, 0xba, 0x86, 0x66, 0xc9, 0x36, 0x42, 0xf0, 0x2d, 0x25, 0x41,
- 0xae, 0xf8, 0xc0, 0x65, 0xd2, 0xcb, 0xe7, 0xd7, 0x3f, 0xee, 0x0d, 0xf6,
- 0x76, 0x77, 0x77, 0x7f, 0x1e, 0x2e, 0x68, 0x7e, 0xaf, 0xd0, 0xac, 0xf9,
- 0xaf, 0xdf, 0xec, 0x0e, 0xf7, 0x64, 0x27, 0x9a, 0x57, 0xce, 0xbf, 0x73,
- 0xf5, 0xfa, 0xc0, 0xf4, 0xc4, 0x3b, 0xf9, 0xc0, 0x13, 0x32, 0xec, 0xd9,
- 0x4c, 0x13, 0x1f, 0xfa, 0xdd, 0x15, 0xfb, 0x70, 0x53, 0x91, 0x27, 0xf0,
- 0xd9, 0x93, 0xfd, 0xfd, 0x84, 0x55, 0x0e, 0x46, 0x88, 0xb2, 0x83, 0x9d,
- 0x48, 0x1a, 0xa5, 0x22, 0x02, 0xdf, 0x66, 0x54, 0xd6, 0x92, 0xea, 0xe7,
- 0xb1, 0xa5, 0xdc, 0x4d, 0x86, 0x00, 0xe1, 0x27, 0x73, 0x20, 0x99, 0x8b,
- 0xd2, 0x5c, 0xe5, 0xe5, 0xf4, 0xde, 0xb5, 0xaa, 0x05, 0x12, 0x99, 0xb5,
- 0xd8, 0xab, 0xde, 0x95, 0x8a, 0xab, 0x22, 0x40, 0xf4, 0x0a, 0xda, 0x13,
- 0xf7, 0x1c, 0x92, 0xf0, 0x8b, 0x52, 0x78, 0xf9, 0xe1, 0x4b, 0xbe, 0x5a,
- 0x56, 0x42, 0x8f, 0x07, 0xe7, 0xfb, 0x5d, 0xda, 0x2a, 0x85, 0x4b, 0x33,
- 0xfe, 0xd2, 0xfc, 0x67, 0x55, 0x25, 0x1d, 0x52, 0x2e, 0x69, 0x2f, 0xe1,
- 0x28, 0x5c, 0x65, 0xcd, 0xe4, 0xa6, 0x4b, 0x81, 0x02, 0x19, 0x6e, 0x7a,
- 0x7b, 0x63, 0x06, 0x74, 0x6f, 0x2b, 0x40, 0x44, 0xc9, 0x6a, 0x4b, 0x7b,
- 0xe2, 0x4d, 0x93, 0xc4, 0x16, 0x25, 0x65, 0xc5, 0xa9, 0x7e, 0xc5, 0x9a,
- 0x8a, 0xb8, 0x99, 0xe3, 0x4b, 0xc6, 0xf7, 0xf2, 0x5a, 0xb1, 0xe8, 0x93,
- 0x9b, 0x6c, 0x2e, 0x32, 0x73, 0x4b, 0x2b, 0x98, 0xf7, 0x64, 0x0f, 0xf6,
- 0x22, 0x04, 0xd2, 0xbd, 0x2b, 0xfd, 0x95, 0x19, 0xc9, 0x36, 0x3b, 0x5e,
- 0xdd, 0x45, 0x27, 0x1c, 0x7a, 0xd7, 0x4b, 0x32, 0x1d, 0xc7, 0xa9, 0xdc,
- 0x28, 0x9a, 0x60, 0x30, 0x8c, 0x43, 0x0b, 0x8c, 0x50, 0xcc, 0x2a, 0x5c,
- 0x63, 0xf5, 0x72, 0x3c, 0x10, 0xdd, 0x07, 0x3d, 0x42, 0xc0, 0x83, 0x4e,
- 0xeb, 0xeb, 0x93, 0x23, 0x22, 0x35, 0x44, 0xe1, 0x44, 0xe0, 0xd5, 0xcc,
- 0x1f, 0x04, 0x3e, 0x0f, 0x19, 0x0e, 0x09, 0xc4, 0x86, 0xda, 0x3a, 0x6f,
- 0x51, 0x6c, 0x55, 0x82, 0x57, 0xa9, 0x0b, 0xfd, 0xb6, 0x94, 0xbf, 0xbe,
- 0xc7, 0x9b, 0x15, 0x21, 0x1c, 0x6c, 0xe9, 0x89, 0x36, 0x5a, 0xfe, 0xf4,
- 0xd9, 0x70, 0x97, 0x87, 0xe8, 0x08, 0xfb, 0x15, 0x2e, 0x09, 0x1f, 0x4f,
- 0x2d, 0x74, 0x13, 0xe9, 0x0a, 0xaa, 0x1c, 0xed, 0x4a, 0x3f, 0x61, 0x76,
- 0x15, 0xce, 0x38, 0xd1, 0xdf, 0x7a, 0x21, 0xfc, 0x07, 0x22, 0x82, 0x7a,
- 0x7b, 0x71, 0x79, 0x80, 0x56, 0x69, 0x53, 0x29, 0xbb, 0x79, 0x59, 0x2a,
- 0xd2, 0x99, 0x85, 0x70, 0x0c, 0xb1, 0x2a, 0x7b, 0x42, 0x80, 0x1b, 0x7d,
- 0x47, 0x57, 0x58, 0xd2, 0x2d, 0x20, 0x37, 0x96, 0x60, 0xff, 0x40, 0x2a,
- 0xed, 0x58, 0x59, 0x63, 0x1a, 0x4a, 0xc0, 0x05, 0x39, 0xf8, 0x4a, 0x0a,
- 0x03, 0xb0, 0xa6, 0x1c, 0x43, 0x5f, 0x62, 0x2d, 0xb7, 0x2d, 0xf8, 0x42,
- 0xcc, 0x57, 0xab, 0x77, 0xa2, 0xc6, 0xa4, 0x94, 0xcd, 0x6c, 0x3a, 0x65,
- 0x24, 0x02, 0x90, 0xdf, 0x15, 0xb9, 0xfc, 0x3c, 0x88, 0x6d, 0xca, 0xbb,
- 0x1e, 0x7b, 0x00, 0xc6, 0x1e, 0xfc, 0x53, 0xbd, 0x3f, 0x93, 0x1f, 0xfa,
- 0xd5, 0x61, 0x6f, 0xd8, 0x9e, 0xd4, 0x18, 0xe5, 0x61, 0xcd, 0xf2, 0xad,
- 0x6d, 0xce, 0x88, 0x4c, 0x23, 0xb9, 0x9f, 0x7d, 0x6a, 0xa4, 0x28, 0x23,
- 0xc8, 0xf2, 0x8b, 0x27, 0xfb, 0x49, 0x7d, 0x6f, 0x74, 0x88, 0xb9, 0x3f,
- 0x09, 0xdd, 0xea, 0x08, 0x51, 0xef, 0x7b, 0x8b, 0xe2, 0x95, 0x45, 0xd7,
- 0x7b, 0x7a, 0xe5, 0x10, 0xaf, 0x08, 0x21, 0xa4, 0xc6, 0x90, 0x1f, 0x51,
- 0x72, 0xa3, 0x54, 0x21, 0x36, 0x9e, 0xa5, 0xc5, 0xc7, 0xda, 0x2a, 0xda,
- 0x68, 0xa8, 0x4f, 0x44, 0xd6, 0x8c, 0xe5, 0x76, 0x3f, 0x14, 0xef, 0x1d,
- 0x5f, 0x8c, 0xd1, 0x72, 0xa4, 0x66, 0xd7, 0x55, 0x80, 0xf9, 0xfe, 0x82,
- 0x82, 0x1e, 0xd1, 0xb9, 0x75, 0x05, 0x3e, 0x7e, 0xbf, 0x70, 0xd8, 0x52,
- 0x67, 0xdd, 0x48, 0x68, 0xf3, 0xdf, 0x03, 0x8d, 0x30, 0xac, 0xab, 0x7a,
- 0x86, 0xc7, 0x6d, 0x2d, 0x06, 0x1b, 0x93, 0xf0, 0xd9, 0xb5, 0x59, 0x9b,
- 0x73, 0x71, 0x90, 0x18, 0x1e, 0x7a, 0x98, 0x9c, 0x39, 0xe3, 0xb1, 0xe8,
- 0x83, 0x7c, 0xa2, 0xa9, 0x26, 0x62, 0x3a, 0xe2, 0xef, 0x03, 0x2d, 0x94,
- 0x13, 0x2d, 0x40, 0x0c, 0x8d, 0x06, 0x55, 0x77, 0xee, 0x9d, 0x9e, 0xe7,
- 0x5d, 0x67, 0x4c, 0xe3, 0xec, 0x64, 0xaf, 0x91, 0x22, 0xc4, 0x77, 0x8c,
- 0xec, 0xd2, 0x00, 0x1a, 0xc4, 0x83, 0x88, 0x92, 0xd2, 0xc5, 0xc7, 0x2b,
- 0xe5, 0xb0, 0x17, 0x33, 0x73, 0xff, 0x11, 0x39, 0x74, 0x59, 0xd8, 0xda,
- 0xa1, 0x44, 0x20, 0x43, 0x09, 0x71, 0x65, 0xd1, 0x0f, 0x52, 0x30, 0xc1,
- 0xeb, 0x2b, 0x2e, 0x26, 0x8a, 0x4a, 0xcf, 0xa5, 0xb0, 0x80, 0x65, 0x27,
- 0x4f, 0xf9, 0x4d, 0xdd, 0x8a, 0xee, 0xe3, 0x0f, 0x30, 0xa0, 0x33, 0x7f,
- 0x9e, 0x2e, 0x86, 0xd9, 0x76, 0x7d, 0x86, 0xcd, 0xc6, 0x29, 0x71, 0xf8,
- 0xe8, 0x7f, 0x6b, 0xac, 0xf5, 0xac, 0x2a, 0xeb, 0xe4, 0xbb, 0x67, 0x1a,
- 0x2a, 0x96, 0x72, 0x0a, 0x72, 0x37, 0x59, 0xbd, 0xfc, 0xde, 0x95, 0x78,
- 0x8a, 0xba, 0x4d, 0x34, 0xa7, 0x4e, 0x5f, 0xf7, 0x2f, 0xa9, 0xee, 0x48,
- 0xc8, 0x5e, 0x37, 0xf2, 0x12, 0x85, 0x6c, 0xca, 0x2a, 0x72, 0xdf, 0x39,
- 0x06, 0x74, 0x57, 0xbf, 0x9b, 0x4a, 0x3f, 0x8c, 0xa9, 0xb4, 0x1e, 0xd4,
- 0x05, 0xdb, 0xf1, 0xe4, 0x32, 0x27, 0x17, 0xc0, 0xd0, 0xee, 0x88, 0x20,
- 0xf8, 0x4c, 0xb8, 0x00, 0x89, 0x7e, 0x3a, 0xba, 0x96, 0x4e, 0x84, 0x8e,
- 0xf4, 0x8a, 0xfa, 0x86, 0xae, 0x66, 0xba, 0x31, 0x60, 0xf8, 0xc5, 0x89,
- 0x84, 0x84, 0x35, 0xe7, 0xdd, 0xe5, 0xe9, 0x5b, 0x09, 0xfe, 0xba, 0xf5,
- 0x09, 0xaa, 0xce, 0xc9, 0xd6, 0x4c, 0x63, 0x0c, 0x49, 0xde, 0x64, 0x28,
- 0xe2, 0x93, 0xd3, 0x84, 0x68, 0xda, 0xfa, 0x82, 0x02, 0xaf, 0x04, 0x4b,
- 0xa8, 0x26, 0x9a, 0x4c, 0x6a, 0xc4, 0xbb, 0x49, 0x70, 0x8b, 0x1a, 0x7e,
- 0x02, 0x98, 0xcf, 0x46, 0xd0, 0x50, 0x39, 0x60, 0x47, 0x61, 0x1b, 0xee,
- 0xeb, 0xb2, 0x73, 0x64, 0xfc, 0x05, 0xa3, 0x6d, 0xc8, 0x14, 0x4d, 0xc9,
- 0xeb, 0xf2, 0xae, 0x18, 0x9c, 0x12, 0x28, 0x3c, 0x39, 0x2d, 0xaf, 0xcd,
- 0x54, 0xbd, 0x8b, 0x5a, 0xf2, 0xef, 0xcf, 0xdf, 0x25, 0x5b, 0x24, 0x89,
- 0x93, 0x73, 0x9b, 0x3c, 0x4c, 0x4f, 0x6e, 0x8b, 0xd2, 0x69, 0xc4, 0xe1,
- 0x1b, 0xd7, 0x9b, 0x7e, 0x72, 0xfc, 0xc3, 0xe1, 0xdb, 0xf3, 0xd3, 0xe3,
- 0x9f, 0x38, 0x4a, 0x1b, 0x0c, 0x87, 0x7e, 0xfc, 0xa5, 0xa7, 0x85, 0xc3,
- 0x6b, 0x4f, 0xd1, 0x27, 0xd3, 0x8f, 0xfb, 0xd5, 0xb2, 0x80, 0x8f, 0x8f,
- 0x6e, 0xc1, 0xd1, 0xe8, 0xfc, 0x64, 0x20, 0xe5, 0xc3, 0x84, 0xf5, 0x98,
- 0x4b, 0x4e, 0xe3, 0x14, 0x0b, 0xaf, 0xd6, 0xb7, 0x61, 0x80, 0x42, 0x4f,
- 0x44, 0x3f, 0x79, 0xa7, 0x64, 0x38, 0x7d, 0xac, 0x38, 0xdd, 0xf1, 0xaf,
- 0xf3, 0x6b, 0x04, 0x19, 0xda, 0xfb, 0xa7, 0xd1, 0x9a, 0x64, 0xb4, 0x09,
- 0x82, 0xa4, 0x7a, 0xf2, 0x44, 0xda, 0x00, 0x60, 0x9d, 0xcd, 0xd8, 0xa5,
- 0xb5, 0x52, 0x8e, 0x02, 0x4e, 0x82, 0x65, 0x24, 0x34, 0x5b, 0x10, 0x3e,
- 0x11, 0x74, 0xdb, 0xd8, 0xd6, 0x6c, 0x17, 0x3d, 0x95, 0xf7, 0x08, 0xcb,
- 0x0e, 0xb9, 0x64, 0xac, 0x70, 0x38, 0x30, 0x76, 0xfa, 0x32, 0x39, 0xe8,
- 0xfd, 0x8e, 0x17, 0x89, 0xef, 0xfd, 0x8b, 0xd0, 0x33, 0x4a, 0x14, 0x45,
- 0xdd, 0x83, 0x9c, 0x3c, 0xc7, 0xca, 0xad, 0x7a, 0x60, 0xd8, 0xff, 0x69,
- 0x8e, 0xba, 0x20, 0x24, 0xa6, 0xd9, 0x78, 0x79, 0x7d, 0x1d, 0xc9, 0xb1,
- 0x43, 0xf9, 0xf7, 0x2c, 0x63, 0xc8, 0xb5, 0xd1, 0x5a, 0xa8, 0x08, 0x8e,
- 0xf8, 0x75, 0xcd, 0x18, 0x7a, 0x88, 0x57, 0x89, 0x4a, 0x5d, 0x4e, 0x7b,
- 0x54, 0x18, 0x06, 0x5e, 0x69, 0xd4, 0x65, 0x0b, 0x9b, 0xc3, 0x5c, 0x6d,
- 0x7e, 0xb1, 0x29, 0x81, 0xb6, 0x9e, 0xdc, 0xc8, 0xa4, 0xd1, 0xf4, 0x58,
- 0xa5, 0xa1, 0x52, 0xae, 0xd4, 0x7b, 0x73, 0xe2, 0x37, 0x5f, 0x6e, 0x26,
- 0xf2, 0xa0, 0x3e, 0xd9, 0x15, 0x38, 0x78, 0x4f, 0xc2, 0x3e, 0x5a, 0x08,
- 0x56, 0x56, 0x5f, 0xf0, 0x2f, 0x37, 0xf9, 0x74, 0x9a, 0x89, 0xa7, 0x84,
- 0x98, 0x68, 0x39, 0x59, 0x9f, 0x03, 0x4b, 0xdd, 0x8b, 0xa9, 0xd5, 0x73,
- 0xe9, 0xeb, 0x7f, 0x68, 0x5f, 0x3d, 0x9a, 0x76, 0x72, 0x53, 0x3b, 0xf6,
- 0xd4, 0x31, 0xd3, 0x7c, 0xc7, 0x96, 0x9b, 0x76, 0x29, 0x62, 0x21, 0x30,
- 0x97, 0xa0, 0x1b, 0xa9, 0xb5, 0x28, 0x72, 0x9a, 0x15, 0x5a, 0xb3, 0x9c,
- 0x39, 0x68, 0x53, 0x45, 0xbc, 0x23, 0xd6, 0x11, 0xba, 0xb4, 0x78, 0x05,
- 0xb1, 0x79, 0xa8, 0xce, 0x5e, 0x45, 0x7c, 0x81, 0x5c, 0xb5, 0x83, 0x78,
- 0x66, 0x57, 0x9d, 0x54, 0x75, 0xf7, 0xb9, 0x9d, 0xc7, 0x19, 0x1e, 0x8a,
- 0xe3, 0x22, 0x5b, 0x0c, 0x0f, 0x66, 0x05, 0x1c, 0xbf, 0xa2, 0xed, 0xf7,
- 0xc3, 0x14, 0x43, 0xe6, 0x32, 0x65, 0xb1, 0xac, 0xc1, 0x02, 0x90, 0x94,
- 0xfa, 0xf1, 0x33, 0x85, 0x61, 0xc5, 0x5c, 0x6f, 0x3e, 0x02, 0xba, 0xcd,
- 0x0b, 0x2b, 0xee, 0x4d, 0xf0, 0x3d, 0xad, 0xc6, 0x54, 0x63, 0x9a, 0xdc,
- 0x3c, 0x0d, 0x57, 0x27, 0x6a, 0xdb, 0xfe, 0xc5, 0x51, 0x3d, 0x51, 0x57,
- 0xf9, 0x77, 0x72, 0xaa, 0x22, 0x60, 0xb0, 0xd7, 0x12, 0x4c, 0x69, 0x55,
- 0x99, 0x63, 0x44, 0x33, 0xfb, 0x91, 0x0a, 0x25, 0x85, 0x1c, 0xeb, 0xd1,
- 0x43, 0xf4, 0x38, 0x87, 0xc7, 0xb7, 0x1e, 0xc6, 0x2b, 0xc7, 0x40, 0x75,
- 0xc1, 0xa6, 0xd3, 0x8b, 0x5d, 0xca, 0x82, 0x52, 0x84, 0x45, 0x9b, 0x20,
- 0xc5, 0x14, 0xe7, 0x41, 0xdb, 0x8e, 0x84, 0xdb, 0x70, 0x7b, 0x3c, 0xb1,
- 0xe5, 0x8e, 0xcc, 0x93, 0x55, 0x5a, 0x71, 0x05, 0x80, 0xe2, 0xa3, 0x62,
- 0x5e, 0xb8, 0x6e, 0x61, 0x36, 0x59, 0x36, 0x6d, 0xa0, 0xae, 0xd7, 0x27,
- 0xc9, 0xb6, 0x45, 0x97, 0xb6, 0x70, 0x10, 0xd4, 0x40, 0x39, 0xd7, 0x54,
- 0xc9, 0x83, 0xde, 0xb6, 0x44, 0xf6, 0x38, 0xea, 0x63, 0x73, 0x28, 0x63,
- 0x31, 0x3b, 0xed, 0x72, 0x95, 0xb1, 0x83, 0xcd, 0x05, 0xb0, 0xa3, 0x9f,
- 0xe7, 0x92, 0x4d, 0x91, 0xaf, 0xbf, 0x61, 0x6f, 0x8c, 0xf7, 0x71, 0xcb,
- 0xc0, 0x2c, 0x8e, 0x9a, 0x3a, 0x38, 0xca, 0xc1, 0x97, 0x51, 0x01, 0xc1,
- 0x08, 0x28, 0x5b, 0x2b, 0x43, 0x5f, 0xd5, 0xc9, 0x0f, 0x1c, 0x64, 0x27,
- 0xe7, 0xb7, 0xcf, 0xc5, 0xbf, 0x49, 0xfa, 0x06, 0xdd, 0x78, 0xf8, 0x91,
- 0x95, 0xf8, 0xc1, 0x28, 0x3e, 0x56, 0xe3, 0xa7, 0xe6, 0x8f, 0x6f, 0xe9,
- 0x8f, 0x2b, 0x36, 0x12, 0x25, 0x77, 0x9f, 0x3d, 0x73, 0xe1, 0xd6, 0xa6,
- 0x3c, 0x95, 0xc4, 0x4f, 0x76, 0x01, 0x0e, 0x93, 0xe0, 0xd4, 0x94, 0xe8,
- 0xef, 0x32, 0x54, 0xa1, 0xff, 0x6a, 0x33, 0x64, 0x2c, 0x91, 0x6a, 0x1b,
- 0x04, 0xae, 0xe4, 0x7f, 0x24, 0x69, 0x46, 0x9c, 0x26, 0xdf, 0x87, 0x17,
- 0x62, 0xc4, 0x6c, 0xf5, 0x65, 0x0c, 0xe5, 0x6e, 0xa6, 0xea, 0xef, 0x14,
- 0x9b, 0xd1, 0x02, 0x5b, 0x09, 0x0a, 0xbe, 0xcc, 0x2d, 0xac, 0x11, 0x96,
- 0x91, 0x0d, 0xf2, 0xb3, 0xc3, 0x92, 0x0e, 0x1a, 0xcb, 0xb3, 0x7c, 0x45,
- 0x17, 0x56, 0x0f, 0x19, 0xb7, 0xbb, 0xfc, 0xd1, 0xb9, 0xda, 0xd7, 0x4e,
- 0xd5, 0x6b, 0xba, 0xa2, 0xd4, 0xd0, 0x13, 0xe6, 0x5c, 0x52, 0xd8, 0x74,
- 0xa9, 0x5d, 0x4a, 0x0f, 0x3f, 0x6a, 0xa5, 0x03, 0xab, 0x25, 0x2b, 0xfa,
- 0x39, 0x07, 0x76, 0x16, 0xe4, 0x71, 0x10, 0x0b, 0x1f, 0x6d, 0x04, 0x73,
- 0x9e, 0xcd, 0x29, 0x1c, 0x62, 0x6f, 0x46, 0xce, 0xad, 0x26, 0xcd, 0x8a,
- 0x3e, 0xb7, 0xa2, 0xc2, 0xf7, 0x94, 0xb4, 0x37, 0xba, 0x65, 0x19, 0x6d,
- 0x13, 0x54, 0xba, 0x3d, 0xac, 0xef, 0x8b, 0xc9, 0xcd, 0xeb, 0x77, 0xa3,
- 0x55, 0x55, 0xbe, 0xdb, 0x83, 0xc3, 0xd3, 0x46, 0x0b, 0xa1, 0xbd, 0xc0,
- 0x18, 0x38, 0xa1, 0xc9, 0x20, 0x93, 0xf7, 0xd0, 0xfb, 0x6d, 0xbc, 0xb9,
- 0xf6, 0x2b, 0xd6, 0x39, 0x44, 0x9a, 0x05, 0x4b, 0x71, 0x51, 0x3c, 0xe1,
- 0x89, 0x1f, 0xa4, 0x74, 0x16, 0xd8, 0xb5, 0xb2, 0xaa, 0x30, 0x3b, 0x85,
- 0x10, 0x50, 0x83, 0x05, 0x2d, 0x56, 0x1e, 0x5e, 0xa8, 0xbb, 0xaf, 0xc1,
- 0x7f, 0xa8, 0x7f, 0xfc, 0x92, 0x65, 0x3e, 0xa5, 0x32, 0xe2, 0xeb, 0x2a,
- 0xb2, 0xe7, 0x1d, 0x90, 0x88, 0x17, 0x10, 0x34, 0x5b, 0x75, 0x46, 0xaf,
- 0xf3, 0x2e, 0xed, 0xcb, 0x66, 0xc5, 0x8f, 0xaa, 0x55, 0x43, 0x32, 0x73,
- 0xb2, 0xff, 0xf5, 0x57, 0xe1, 0xed, 0xf9, 0xfa, 0xdd, 0x8a, 0xcf, 0xd1,
- 0x6f, 0x06, 0x8a, 0x79, 0x16, 0x8d, 0xc0, 0x53, 0xe8, 0xc3, 0xb9, 0x10,
- 0x5a, 0xac, 0x78, 0x07, 0x94, 0x33, 0xeb, 0x01, 0x29, 0x61, 0x9e, 0x90,
- 0x3f, 0xd6, 0x3e, 0x28, 0x40, 0xd7, 0x15, 0xf5, 0xd7, 0x81, 0x80, 0x1d,
- 0x71, 0xbe, 0xda, 0x05, 0x47, 0xf6, 0xce, 0x45, 0x11, 0xde, 0x5e, 0xb7,
- 0x46, 0xf1, 0xe6, 0x48, 0xbe, 0xc5, 0xf2, 0x84, 0x49, 0x2c, 0xec, 0xf3,
- 0x1f, 0x3b, 0xfb, 0x16, 0xb0, 0x64, 0x81, 0xeb, 0x38, 0xa6, 0xe6, 0x06,
- 0x0f, 0x15, 0x84, 0x22, 0xff, 0x34, 0x42, 0x8c, 0x79, 0xc5, 0x6e, 0x46,
- 0x30, 0x9a, 0xa3, 0xd0, 0xb6, 0x73, 0xd4, 0x4f, 0xd5, 0xc4, 0xa2, 0x3d,
- 0x19, 0x31, 0xdd, 0xc9, 0x43, 0x9b, 0x29, 0x8f, 0x60, 0xac, 0xf0, 0xba,
- 0xb0, 0xdf, 0x75, 0x9b, 0x7e, 0x6b, 0x94, 0x24, 0xba, 0x5c, 0x1f, 0xbd,
- 0x49, 0xf5, 0x85, 0x64, 0x6b, 0x6c, 0xae, 0x6b, 0x2f, 0xb3, 0x91, 0x55,
- 0xec, 0xa7, 0x8c, 0x4d, 0x8e, 0x37, 0xf7, 0xec, 0xf3, 0x67, 0x4f, 0xb7,
- 0xb7, 0xfb, 0xd6, 0xa3, 0xc1, 0x90, 0x89, 0x31, 0xa9, 0x39, 0xf3, 0x9c,
- 0x24, 0x17, 0x07, 0x1f, 0xcc, 0x14, 0xdf, 0x40, 0x30, 0x58, 0x2f, 0x4c,
- 0xbc, 0x39, 0xba, 0xc7, 0xf4, 0x3d, 0x5a, 0x44, 0x32, 0xc1, 0x21, 0xd0,
- 0xad, 0x21, 0x4c, 0x97, 0x4d, 0xc6, 0x0f, 0x58, 0x37, 0xfc, 0x4a, 0xa9,
- 0xc0, 0xc5, 0xed, 0xad, 0x1f, 0x8a, 0x0b, 0x8c, 0xc1, 0x4e, 0xd2, 0x9b,
- 0x36, 0xcc, 0x50, 0x3b, 0xe7, 0x6b, 0x0f, 0x7f, 0x90, 0x88, 0x36, 0x97,
- 0x7a, 0xc5, 0xce, 0xa2, 0xf3, 0xe5, 0x78, 0x66, 0xee, 0xa0, 0x11, 0x95,
- 0xae, 0xf9, 0x94, 0x9c, 0xe6, 0x52, 0x1f, 0x9d, 0x75, 0x70, 0x5b, 0x8a,
- 0x3c, 0xde, 0x13, 0x8c, 0xbb, 0xbd, 0xd1, 0xc4, 0x83, 0xe8, 0xd2, 0x4c,
- 0x44, 0x6b, 0x4b, 0x7a, 0x0b, 0xfe, 0x10, 0x15, 0xc9, 0x19, 0xac, 0x1a,
- 0xd8, 0xa7, 0xac, 0xf6, 0xcc, 0xb8, 0xc1, 0x1d, 0x29, 0x88, 0x48, 0x60,
- 0x24, 0x47, 0x74, 0xf2, 0x92, 0x55, 0xc1, 0x28, 0x41, 0x3e, 0x73, 0x38,
- 0x4b, 0x6e, 0x95, 0xaf, 0x34, 0x42, 0xfd, 0x86, 0xcb, 0x96, 0x0b, 0x33,
- 0x32, 0x82, 0x6e, 0x96, 0xa1, 0x78, 0x13, 0x09, 0xb2, 0x00, 0xb4, 0xac,
- 0xa5, 0x79, 0xb9, 0x0d, 0x71, 0x52, 0x88, 0xf3, 0x95, 0x2b, 0x7e, 0x23,
- 0x23, 0x95, 0xdd, 0x35, 0x9c, 0x09, 0xc9, 0x5e, 0x60, 0xb3, 0xc8, 0x9f,
- 0x82, 0xc3, 0x2b, 0x78, 0x48, 0x2a, 0x9a, 0xe0, 0xfc, 0xf3, 0x9a, 0xbd,
- 0x55, 0xb7, 0xbe, 0x14, 0xf8, 0x58, 0x22, 0x85, 0x0b, 0x66, 0x66, 0x32,
- 0xc8, 0x78, 0xed, 0x71, 0x8f, 0x7a, 0xc8, 0x56, 0x51, 0x62, 0x22, 0x40,
- 0x67, 0x54, 0xbd, 0x9f, 0x8a, 0xc3, 0x8e, 0xdb, 0x96, 0xe2, 0x7f, 0x69,
- 0xac, 0xb8, 0x9b, 0xf4, 0xb1, 0xf7, 0xa5, 0xc2, 0x70, 0x7a, 0x89, 0x54,
- 0x73, 0x81, 0x79, 0xaf, 0xf0, 0x4f, 0xdb, 0xa6, 0x34, 0x19, 0x49, 0xe0,
- 0xe2, 0x88, 0x36, 0x8a, 0x69, 0xa0, 0xbc, 0x64, 0xef, 0xcb, 0x41, 0x2f,
- 0xaa, 0x79, 0xda, 0x09, 0x20, 0xee, 0x23, 0xd8, 0xa1, 0x2d, 0xfb, 0x4c,
- 0x3f, 0x71, 0xa7, 0x99, 0xf1, 0x80, 0xcd, 0x36, 0x79, 0xb3, 0x0c, 0xa5,
- 0xe3, 0x58, 0xdd, 0xa2, 0x48, 0x78, 0xc3, 0x7d, 0x4a, 0x8b, 0xe1, 0xb2,
- 0xd2, 0x60, 0x8f, 0x11, 0x56, 0xa9, 0x01, 0x5d, 0x94, 0x1e, 0x66, 0xe2,
- 0x32, 0x9c, 0x95, 0x77, 0x01, 0xf2, 0x96, 0x4c, 0x01, 0xdb, 0xbb, 0x76,
- 0x06, 0x02, 0x55, 0xdc, 0xfb, 0x6f, 0xfd, 0xe5, 0x07, 0x9a, 0xa9, 0x7f,
- 0xe8, 0x4c, 0x69, 0x68, 0x3f, 0x0d, 0xb2, 0xae, 0x60, 0x04, 0x27, 0x7f,
- 0xc4, 0xac, 0xfc, 0x95, 0x20, 0x29, 0x3c, 0x35, 0x28, 0xec, 0x4d, 0x0d,
- 0xfe, 0x71, 0x68, 0x15, 0x5e, 0x69, 0x24, 0xa5, 0x24, 0x12, 0x68, 0xe5,
- 0xe3, 0xfb, 0xc0, 0x77, 0x44, 0xdb, 0xf0, 0xa7, 0xa2, 0x4f, 0xfb, 0x38,
- 0x35, 0xb6, 0x57, 0x8a, 0x02, 0x4b, 0x44, 0xb1, 0xce, 0xab, 0xf8, 0x53,
- 0x25, 0x35, 0x84, 0x8d, 0xd1, 0x61, 0x7a, 0x4e, 0x16, 0x19, 0xff, 0x3c,
- 0xb4, 0x00, 0x08, 0x2d, 0x73, 0x80, 0xd5, 0xf8, 0xe3, 0xa0, 0xbe, 0x9f,
- 0x8f, 0xcb, 0x99, 0xec, 0x75, 0x2e, 0x47, 0x9b, 0xe8, 0xcf, 0x78, 0x61,
- 0x10, 0xd9, 0x18, 0x78, 0x29, 0x88, 0xfd, 0x28, 0x01, 0x1f, 0x1b, 0x29,
- 0x28, 0x17, 0x5c, 0x71, 0x7d, 0x5e, 0x54, 0x1d, 0xfa, 0x63, 0xc2, 0x70,
- 0x1c, 0x56, 0x87, 0x96, 0xf0, 0x5a, 0xdd, 0x39, 0x57, 0xed, 0xca, 0xdc,
- 0x8d, 0x07, 0x36, 0x8f, 0xab, 0xc3, 0x17, 0x4b, 0xdf, 0x9c, 0x70, 0x7d,
- 0xe7, 0x0f, 0xc8, 0x15, 0xe1, 0x57, 0xb5, 0xe4, 0xf3, 0x25, 0xfd, 0x48,
- 0x30, 0x07, 0x9a, 0x2c, 0x44, 0xfe, 0x0c, 0x4d, 0xe7, 0xa1, 0x32, 0x01,
- 0x57, 0x71, 0x29, 0xd5, 0x06, 0x33, 0x11, 0x58, 0xd8, 0x1c, 0xee, 0xa0,
- 0x9f, 0x7a, 0x94, 0x3e, 0x70, 0x79, 0x2c, 0x63, 0xf2, 0xaf, 0x6f, 0x0d,
- 0x16, 0x2a, 0x41, 0x16, 0xe6, 0xa9, 0x96, 0x1d, 0x64, 0x65, 0xd2, 0xcb,
- 0xae, 0xe4, 0x4c, 0x6e, 0x8e, 0x3e, 0x0d, 0x1f, 0x6a, 0x8e, 0x51, 0x3d,
- 0x70, 0x86, 0x08, 0x54, 0x82, 0x9c, 0x4f, 0xf9, 0x95, 0xbd, 0x7e, 0x9b,
- 0x72, 0x36, 0x65, 0x7c, 0x06, 0xb5, 0xfb, 0xc0, 0x58, 0x4b, 0x46, 0xe2,
- 0xb6, 0xea, 0x52, 0x07, 0xf1, 0x40, 0xc1, 0x41, 0x51, 0xe8, 0x70, 0x7d,
- 0x73, 0x2e, 0xae, 0xa8, 0xb5, 0x37, 0x51, 0x3d, 0xa1, 0x64, 0xbc, 0x16,
- 0xfa, 0x09, 0x50, 0xfe, 0x9c, 0x7c, 0x9a, 0x91, 0xd8, 0x51, 0x12, 0x13,
- 0xb1, 0x08, 0x3b, 0xad, 0x2a, 0x0c, 0xaa, 0x1f, 0x62, 0x9e, 0x8e, 0xf5,
- 0xcd, 0xad, 0x2e, 0xbb, 0x75, 0xd5, 0x2c, 0x3e, 0x50, 0xd1, 0xa0, 0xfb,
- 0x0f, 0x28, 0x5d, 0x7b, 0xe9, 0xf9, 0xdc, 0xf1, 0x03, 0x4c, 0x2d, 0xd7,
- 0x46, 0x5b, 0x2e, 0xa8, 0x1d, 0x6c, 0xf1, 0x59, 0xc9, 0xe6, 0xcc, 0x43,
- 0xc3, 0x90, 0x88, 0x9e, 0x40, 0xc0, 0xfc, 0x44, 0xd8, 0xad, 0x36, 0xd5,
- 0xf0, 0xd3, 0xa0, 0x63, 0x14, 0xb1, 0xff, 0x80, 0x50, 0x9f, 0xdd, 0x4c,
- 0xe6, 0xb2, 0xc9, 0x2a, 0xaa, 0xde, 0xdc, 0x29, 0x30, 0x80, 0xfd, 0xc4,
- 0x74, 0x26, 0x14, 0xfb, 0x8b, 0xf2, 0x36, 0x75, 0xfe, 0x07, 0xef, 0x28,
- 0x73, 0xd5, 0x93, 0xd3, 0x4f, 0xe1, 0x61, 0x08, 0xb4, 0x9b, 0x6e, 0x12,
- 0x0e, 0xc1, 0x0f, 0xd6, 0x9e, 0x3c, 0x30, 0x4e, 0x10, 0xc3, 0xed, 0x27,
- 0x02, 0x44, 0xcf, 0xd3, 0xda, 0xf6, 0x90, 0x87, 0x80, 0x23, 0x85, 0x01,
- 0x93, 0x6e, 0x78, 0x13, 0x70, 0x6f, 0x25, 0x91, 0x98, 0x0a, 0x47, 0x62,
- 0xae, 0xca, 0xe1, 0x8a, 0x99, 0x61, 0xa8, 0x65, 0x77, 0x66, 0xda, 0x13,
- 0x22, 0x33, 0xe2, 0x6a, 0x10, 0x46, 0x30, 0x82, 0x49, 0x17, 0xff, 0x2e,
- 0x53, 0x6b, 0xb4, 0x49, 0xb9, 0x60, 0x85, 0x66, 0x71, 0xdb, 0x1e, 0x1a,
- 0x76, 0x8f, 0x52, 0x3d, 0xa2, 0xe3, 0xa3, 0xcb, 0x87, 0x9a, 0x83, 0x20,
- 0xea, 0x2c, 0xf8, 0xfe, 0xaa, 0x05, 0x57, 0x9d, 0x56, 0xa4, 0x07, 0xfd,
- 0x2c, 0xb1, 0x8a, 0xae, 0x00, 0xa3, 0x30, 0x30, 0x2b, 0x83, 0x66, 0xf7,
- 0x49, 0x94, 0x1b, 0xb0, 0xf3, 0x3f, 0xff, 0xf3, 0xcf, 0x62, 0xf5, 0xe0,
- 0x80, 0xbc, 0xfc, 0x90, 0x2f, 0x7c, 0xe1, 0x75, 0x72, 0xee, 0x55, 0x1a,
- 0xb3, 0x75, 0x54, 0x19, 0xa3, 0x89, 0x22, 0xb3, 0x5a, 0x16, 0xb4, 0x7c,
- 0x78, 0x56, 0x27, 0xc8, 0x40, 0x64, 0xc3, 0xd9, 0xa3, 0x0f, 0x1a, 0xa8,
- 0x8a, 0x24, 0x66, 0xf4, 0xc9, 0xf9, 0xed, 0xd3, 0x08, 0x48, 0x25, 0x89,
- 0x78, 0x95, 0x5a, 0x25, 0xf5, 0x5e, 0xac, 0x1c, 0x12, 0x17, 0x72, 0xd3,
- 0x21, 0x49, 0xe7, 0x7d, 0xd6, 0x4b, 0x6f, 0x10, 0xed, 0x7e, 0xae, 0xef,
- 0x83, 0x37, 0x88, 0x07, 0x7b, 0x62, 0xbe, 0xf4, 0xc1, 0xf2, 0xcb, 0x99,
- 0x6b, 0xda, 0x7e, 0xd8, 0x68, 0x05, 0x8e, 0x78, 0x0e, 0x35, 0x6f, 0x72,
- 0x2d, 0x84, 0x31, 0x41, 0xd1, 0x95, 0xa8, 0x3e, 0x9b, 0x44, 0xd4, 0xdb,
- 0xce, 0xfe, 0x7a, 0x12, 0xed, 0x83, 0xf2, 0xe7, 0xd7, 0xb6, 0x0f, 0x58,
- 0x56, 0xef, 0xc7, 0xb2, 0xc5, 0xe8, 0x1e, 0xbc, 0x2a, 0xa5, 0xae, 0xc5,
- 0x63, 0x04, 0xca, 0xaa, 0x7d, 0x1e, 0xf6, 0x43, 0x3f, 0xf6, 0x01, 0x87,
- 0x88, 0xe3, 0x94, 0x5a, 0x1f, 0xc5, 0x56, 0x01, 0x4a, 0x65, 0x36, 0x34,
- 0xd6, 0x38, 0x38, 0x65, 0xb0, 0x55, 0x39, 0x7b, 0x60, 0x2e, 0x08, 0xa5,
- 0x69, 0x87, 0x23, 0xe0, 0x12, 0x55, 0x2e, 0xa4, 0x4e, 0x01, 0x55, 0x3f,
- 0x80, 0xa0, 0x42, 0xb1, 0xd2, 0xf5, 0xcd, 0xa1, 0xfa, 0xbb, 0x6d, 0xd0,
- 0xf2, 0x18, 0xa3, 0xd0, 0x10, 0x07, 0xd0, 0xcc, 0xbd, 0x9d, 0x78, 0x5c,
- 0x51, 0x8f, 0x91, 0x93, 0x91, 0x29, 0xa1, 0xfb, 0xc1, 0x1e, 0xbe, 0x4b,
- 0x1f, 0x77, 0x6d, 0xce, 0xa0, 0x1e, 0xc1, 0x7f, 0x7e, 0xa3, 0x46, 0x4f,
- 0x5b, 0x59, 0x75, 0xce, 0xd3, 0x43, 0x63, 0x88, 0x6e, 0x71, 0x19, 0x83,
- 0x9e, 0x36, 0x7f, 0x0c, 0xff, 0xe2, 0xc3, 0x26, 0x08, 0x38, 0x5f, 0x0d,
- 0xa3, 0x65, 0x94, 0x1f, 0x6f, 0xd5, 0x8e, 0xc8, 0x88, 0x12, 0x66, 0xa6,
- 0xce, 0xff, 0xbe, 0x1d, 0x25, 0x00, 0xe8, 0x6a, 0x26, 0x66, 0x6b, 0xfa,
- 0xc2, 0x17, 0xf1, 0xc7, 0xad, 0x4e, 0x3a, 0x5e, 0xd8, 0xa7, 0xfc, 0xef,
- 0xd9, 0x07, 0xcb, 0xa9, 0xc9, 0x9e, 0x7a, 0x14, 0x90, 0x71, 0x15, 0xdf,
- 0x98, 0x0b, 0x83, 0xaf, 0x2e, 0x3a, 0x7e, 0xfa, 0x74, 0xc4, 0x29, 0x83,
- 0xd6, 0x24, 0xee, 0x97, 0xac, 0x6b, 0x4d, 0x53, 0x85, 0x6c, 0x53, 0x88,
- 0x9d, 0x3d, 0x70, 0x84, 0xcc, 0x6d, 0x13, 0xff, 0xa2, 0x9e, 0xce, 0xc7,
- 0xf5, 0x1f, 0x26, 0xa0, 0xde, 0xbc, 0xeb, 0xbf, 0xe8, 0x9f, 0xfd, 0xf8,
- 0xa7, 0x15, 0x02, 0xfc, 0xb8, 0x4f, 0xaf, 0x84, 0x59, 0x83, 0x4e, 0xd4,
- 0xad, 0x03, 0xb5, 0x95, 0x52, 0xe4, 0xf8, 0xda, 0x23, 0x3c, 0x65, 0x12,
- 0x5a, 0xa7, 0xa3, 0x1b, 0x55, 0xbb, 0x5e, 0x56, 0xd1, 0x72, 0xbc, 0x11,
- 0xb5, 0x45, 0x3d, 0x11, 0xb6, 0x3d, 0xe2, 0x3c, 0x69, 0x33, 0xb1, 0xae,
- 0xe8, 0x95, 0x1d, 0xa2, 0xdf, 0x2b, 0xf9, 0x61, 0xb7, 0x4f, 0xae, 0x53,
- 0xbf, 0xb0, 0x57, 0xdc, 0xde, 0x63, 0xfa, 0x54, 0xcf, 0x48, 0x19, 0xc9,
- 0xaf, 0xee, 0xcd, 0xb2, 0xd7, 0xc6, 0x8a, 0x79, 0x84, 0xad, 0xc3, 0x0f,
- 0xea, 0xa6, 0xa3, 0x78, 0x8c, 0xe9, 0x76, 0xd5, 0xa2, 0x9b, 0x44, 0x93,
- 0x11, 0x7c, 0x55, 0x12, 0xc2, 0xad, 0x9c, 0x16, 0x67, 0x8d, 0xb9, 0x21,
- 0xd5, 0xf7, 0x12, 0x2f, 0x96, 0x6b, 0xeb, 0x11, 0xd6, 0x44, 0x5a, 0x7b,
- 0xc8, 0x9c, 0xce, 0x1d, 0x15, 0x13, 0x21, 0x24, 0x1f, 0x3e, 0xa4, 0x8b,
- 0x85, 0x88, 0x9d, 0x47, 0x8c, 0x9d, 0x69, 0x25, 0xb0, 0xdd, 0x85, 0xb9,
- 0x97, 0xcb, 0xd2, 0x51, 0x19, 0xca, 0x8f, 0xec, 0xa9, 0x61, 0x4c, 0x5e,
- 0x5a, 0x3d, 0xd0, 0x1c, 0x57, 0xd5, 0x92, 0x19, 0xdc, 0x19, 0x8d, 0xbe,
- 0xa1, 0x82, 0xad, 0x56, 0x02, 0xee, 0x38, 0xe8, 0x0f, 0x6e, 0xc4, 0x47,
- 0x5c, 0xcc, 0x90, 0xc1, 0x5c, 0x57, 0xd5, 0xcc, 0x83, 0x75, 0x95, 0x3d,
- 0x76, 0x1a, 0xda, 0x9a, 0xf6, 0xef, 0x32, 0x50, 0x22, 0xe5, 0xb2, 0x9f,
- 0x91, 0x51, 0xb9, 0x1b, 0x90, 0x99, 0xf2, 0xb7, 0x1e, 0xda, 0xe7, 0xa2,
- 0xa3, 0xb7, 0xc7, 0x18, 0x1d, 0x11, 0x99, 0x8f, 0x14, 0xf5, 0x5f, 0x2e,
- 0xfe, 0x2f, 0x2d, 0x2c, 0xec, 0x57, 0x0e, 0x00, 0x01, 0x25, 0xf1, 0x70,
- 0x97, 0x17, 0x64, 0xab, 0xb1, 0x39, 0xf6, 0x70, 0x9f, 0xb9, 0xcb, 0x5c,
- 0xf3, 0xa3, 0xdb, 0x61, 0x71, 0x1a, 0x32, 0x9f, 0xfc, 0x63, 0xfb, 0xec,
- 0x52, 0x71, 0x6c, 0xed, 0x49, 0xea, 0x33, 0x5c, 0x5f, 0xb6, 0x42, 0xdd,
- 0x38, 0xbb, 0xce, 0x8b, 0x47, 0xf9, 0x30, 0x34, 0x4e, 0x9f, 0xce, 0xb8,
- 0x60, 0x8b, 0x6d, 0x54, 0xb2, 0x91, 0xd8, 0x15, 0x4f, 0x19, 0xe8, 0x0f,
- 0x8a, 0x89, 0x54, 0x38, 0xc1, 0x48, 0x54, 0x78, 0x8e, 0xbd, 0x89, 0x5a,
- 0xde, 0x14, 0xcc, 0xcf, 0x27, 0x4b, 0x4a, 0xc5, 0x8d, 0xd4, 0x0f, 0x09,
- 0xac, 0x75, 0xa3, 0x04, 0x30, 0x04, 0xff, 0x16, 0x75, 0x96, 0xe3, 0x6b,
- 0xe1, 0xb4, 0xc1, 0xf8, 0x64, 0x53, 0x81, 0x38, 0xec, 0x0d, 0xa9, 0xb5,
- 0xa7, 0xcf, 0x3f, 0x28, 0xa6, 0x8c, 0x88, 0x5b, 0xd4, 0x1e, 0x40, 0x11,
- 0xdb, 0x84, 0x37, 0x6a, 0x5f, 0xcf, 0x47, 0x3f, 0x79, 0xf4, 0x56, 0x80,
- 0x1b, 0x53, 0xa7, 0xd6, 0x31, 0x1c, 0xc1, 0x15, 0x45, 0x01, 0x37, 0xfe,
- 0x65, 0xca, 0x5a, 0x15, 0x2d, 0xe8, 0x43, 0xbd, 0x4b, 0x99, 0x03, 0xbc,
- 0x33, 0x0b, 0x2e, 0x47, 0xd9, 0xde, 0x32, 0x80, 0x48, 0x3c, 0x4a, 0xc4,
- 0xe7, 0x52, 0x3d, 0x45, 0x53, 0x7b, 0x12, 0x7f, 0xb6, 0xea, 0x5f, 0xa6,
- 0x59, 0xc7, 0x8c, 0x0d, 0x74, 0x15, 0x3d, 0x7f, 0xfc, 0xf1, 0xf9, 0x5d,
- 0x8e, 0x3c, 0x23, 0x55, 0x48, 0x51, 0x89, 0x1e, 0x9d, 0x47, 0x1b, 0x7a,
- 0x15, 0x56, 0x80, 0x83, 0xf2, 0x0e, 0xf0, 0xd2, 0x11, 0x11, 0xec, 0x2f,
- 0x0e, 0x2b, 0x1a, 0x46, 0x34, 0x03, 0x4e, 0x92, 0x66, 0x71, 0x20, 0xd0,
- 0x59, 0xe2, 0x02, 0xcc, 0x24, 0xd1, 0xcb, 0xa8, 0xc8, 0x74, 0x7a, 0x9a,
- 0xec, 0x51, 0x37, 0x0d, 0x5d, 0xff, 0xf1, 0x33, 0xc3, 0x1a, 0x9b, 0x9b,
- 0x61, 0x5b, 0x3c, 0xb1, 0x7d, 0x74, 0x34, 0x19, 0x93, 0xe1, 0x3b, 0x40,
- 0xda, 0x3d, 0x66, 0x1b, 0x91, 0x57, 0x87, 0xe6, 0x45, 0xcf, 0xa3, 0x2b,
- 0x7d, 0xcb, 0xd1, 0x23, 0x85, 0xef, 0xcc, 0xf3, 0x07, 0xcd, 0xc7, 0x5c,
- 0xf0, 0x3b, 0x90, 0xce, 0xcb, 0xa8, 0xbf, 0x1a, 0xdc, 0x8d, 0x6a, 0x01,
- 0x38, 0xfb, 0xc2, 0x79, 0xe1, 0x28, 0x23, 0x08, 0x2c, 0x65, 0x64, 0x0f,
- 0xab, 0xdb, 0x16, 0x16, 0x0f, 0x29, 0x2f, 0x83, 0x87, 0x5c, 0x95, 0xea,
- 0xd5, 0x25, 0x7c, 0x1a, 0x12, 0x55, 0x67, 0x53, 0x07, 0xc7, 0x14, 0xab,
- 0x3c, 0xb1, 0x64, 0x83, 0x07, 0xeb, 0x9b, 0x13, 0xac, 0xdc, 0xef, 0x49,
- 0x50, 0xf5, 0x29, 0x35, 0x87, 0x2b, 0x8a, 0x3e, 0xae, 0x53, 0xae, 0xdf,
- 0xaa, 0x91, 0x14, 0xa4, 0xe8, 0xd1, 0x3d, 0xd2, 0xae, 0xcc, 0xd1, 0xa6,
- 0x29, 0xaf, 0x9b, 0x32, 0x48, 0x6b, 0x21, 0x15, 0x92, 0x82, 0x72, 0xb8,
- 0x83, 0x8c, 0xf9, 0x96, 0x22, 0x7f, 0xc3, 0xfc, 0x20, 0xfb, 0xd4, 0xb0,
- 0x73, 0x56, 0x1c, 0xd9, 0xd4, 0x95, 0x7c, 0x4c, 0x15, 0x48, 0x5b, 0xbc,
- 0x57, 0x11, 0xcc, 0xb6, 0x24, 0xc9, 0xe0, 0x6b, 0x36, 0xdb, 0xef, 0xd3,
- 0xf4, 0x7a, 0x58, 0x56, 0x39, 0x5d, 0x64, 0x80, 0x89, 0x69, 0x6b, 0x74,
- 0xa0, 0xfa, 0x10, 0x54, 0x64, 0xaa, 0xc4, 0x9a, 0x93, 0xc0, 0x44, 0xa2,
- 0x24, 0x56, 0xed, 0x76, 0xe7, 0x38, 0x03, 0x88, 0x59, 0xd8, 0x36, 0x05,
- 0x02, 0x1e, 0x1e, 0x2b, 0x1e, 0x09, 0x27, 0x9c, 0x24, 0xae, 0x80, 0x87,
- 0x86, 0xd4, 0xed, 0x90, 0xdd, 0x58, 0x29, 0x74, 0x74, 0x97, 0x56, 0x48,
- 0x9e, 0x0c, 0xa2, 0x2e, 0x79, 0x5d, 0x2f, 0xb1, 0x60, 0x6f, 0x4e, 0x4e,
- 0x8f, 0x2d, 0x66, 0xe6, 0xff, 0xec, 0x0c, 0x69, 0xc2, 0xab, 0x49, 0x80,
- 0x10, 0xe2, 0x9c, 0x25, 0x2f, 0x01, 0x4d, 0x92, 0x9a, 0xbe, 0xed, 0x73,
- 0xb1, 0x03, 0xfc, 0xb8, 0x95, 0xd1, 0x74, 0xfc, 0xee, 0xbb, 0x93, 0x8b,
- 0xb3, 0x77, 0x6f, 0x8f, 0xdf, 0x59, 0x67, 0x28, 0x1d, 0x8a, 0x18, 0xb7,
- 0x65, 0x1d, 0x46, 0x44, 0x73, 0x72, 0xa7, 0x13, 0xc1, 0x1a, 0xa1, 0x4a,
- 0xc9, 0x19, 0x61, 0xc6, 0x29, 0xff, 0x1a, 0xfa, 0xcd, 0x79, 0x0f, 0xa9,
- 0x43, 0x94, 0xe2, 0xd4, 0x0b, 0xf2, 0x22, 0x4c, 0x29, 0x2e, 0x35, 0x64,
- 0x17, 0x2a, 0x97, 0x66, 0xc9, 0x99, 0x5e, 0xf3, 0xd3, 0x24, 0x93, 0x02,
- 0x5b, 0x54, 0x18, 0x64, 0xc3, 0x4e, 0x09, 0x47, 0x51, 0x5c, 0xac, 0xa9,
- 0xd5, 0x09, 0xb7, 0xb9, 0xdf, 0x6b, 0xc2, 0x51, 0x6c, 0x2c, 0x8c, 0x8e,
- 0x6e, 0x5c, 0x81, 0x2a, 0x4e, 0x7c, 0x54, 0xdf, 0xb5, 0x78, 0x09, 0x7c,
- 0x84, 0x99, 0xcb, 0x47, 0xf5, 0xab, 0xc8, 0x74, 0xc3, 0x62, 0xde, 0x28,
- 0x7e, 0x54, 0xd7, 0xc4, 0xc1, 0xce, 0xce, 0xcf, 0x28, 0x12, 0xf4, 0x85,
- 0x54, 0x09, 0x0a, 0x59, 0xbe, 0x6a, 0xaf, 0x23, 0x2e, 0x21, 0x41, 0x33,
- 0x5c, 0x68, 0xdf, 0xda, 0xe9, 0x04, 0x2a, 0xe3, 0xc3, 0xf9, 0xc5, 0xd9,
- 0x0f, 0x7f, 0xf9, 0x8d, 0x3f, 0xe1, 0x41, 0x59, 0x7e, 0x24, 0x84, 0x97,
- 0x36, 0xfe, 0xf3, 0xaf, 0xfa, 0xda, 0xda, 0xcf, 0xb5, 0xdb, 0xef, 0xb7,
- 0xab, 0x85, 0x05, 0xf9, 0x3b, 0x48, 0x14, 0x64, 0xa2, 0x63, 0x4d, 0x1b,
- 0x74, 0xe6, 0xb4, 0x45, 0x98, 0x00, 0x47, 0x42, 0xee, 0xf5, 0x56, 0xf6,
- 0x78, 0x18, 0x02, 0x06, 0x19, 0x02, 0xb2, 0xd7, 0x1c, 0x3e, 0xb0, 0x2f,
- 0x69, 0x8c, 0x94, 0xa7, 0xd8, 0x47, 0xfe, 0x1b, 0xd0, 0x6e, 0x76, 0x3e,
- 0x0e, 0x4f, 0x4f, 0x7f, 0xfd, 0x24, 0x68, 0xa1, 0xa7, 0xf6, 0x34, 0xa0,
- 0x32, 0x8d, 0x1d, 0xd0, 0xc0, 0x2a, 0xbf, 0x7a, 0x04, 0xd6, 0x91, 0xad,
- 0xbd, 0x3b, 0x93, 0xde, 0xbc, 0x84, 0xd6, 0x3d, 0xa8, 0x33, 0xa3, 0x2b,
- 0x53, 0xf5, 0x40, 0xba, 0x03, 0x61, 0xc4, 0x53, 0xc7, 0x82, 0xfa, 0x33,
- 0xfe, 0x2f, 0x19, 0xab, 0xc5, 0xf3, 0xc8, 0xa9, 0x36, 0xc0, 0x42, 0x97,
- 0x96, 0xff, 0x82, 0x4b, 0x3d, 0xa1, 0xf2, 0x25, 0x64, 0x5d, 0x58, 0x7b,
- 0x07, 0x37, 0x02, 0xdd, 0xde, 0x55, 0x5e, 0x7f, 0x04, 0x52, 0x9c, 0x0e,
- 0xa6, 0xd4, 0xc7, 0xe5, 0x54, 0x51, 0x52, 0xa1, 0xd1, 0x15, 0xd3, 0x77,
- 0xee, 0xb1, 0xf9, 0xef, 0xe5, 0xd9, 0xd1, 0xd9, 0xa9, 0xf9, 0xcb, 0xf1,
- 0x9b, 0x93, 0x1f, 0x9c, 0x50, 0xe3, 0x7c, 0x4e, 0xb9, 0x2c, 0x6d, 0xd4,
- 0x44, 0x8b, 0x41, 0xf9, 0xbb, 0x89, 0xb1, 0x1f, 0x73, 0x54, 0x9f, 0xf6,
- 0x16, 0x9b, 0x73, 0x8a, 0x36, 0x9c, 0x45, 0xa9, 0xcb, 0x24, 0xf5, 0x9c,
- 0xfc, 0x74, 0xdd, 0x54, 0xb8, 0x0a, 0x48, 0x09, 0xe0, 0x56, 0x2d, 0xd2,
- 0xd4, 0xcd, 0xf2, 0x49, 0x6b, 0x85, 0x70, 0x31, 0xf8, 0x82, 0xaf, 0xbd,
- 0xb6, 0xdc, 0x29, 0xc4, 0xe0, 0xf2, 0x2b, 0x6b, 0xa3, 0xf9, 0x55, 0x7b,
- 0x14, 0x6f, 0x2e, 0xc4, 0xa1, 0x14, 0x8b, 0x72, 0x5c, 0x64, 0x74, 0x49,
- 0xf7, 0xbd, 0x41, 0xda, 0xba, 0xdb, 0x55, 0x86, 0x75, 0x45, 0x58, 0xbb,
- 0x95, 0x14, 0xdb, 0xc1, 0x65, 0x01, 0xbe, 0x6c, 0x9b, 0x6b, 0x8f, 0x49,
- 0x26, 0x40, 0xf0, 0x13, 0x88, 0x35, 0xa2, 0x64, 0xa1, 0x8b, 0xd0, 0xdb,
- 0xa2, 0xad, 0xd1, 0x6c, 0x0a, 0xa9, 0x9a, 0x4d, 0xd4, 0x5d, 0xb7, 0x29,
- 0x97, 0x26, 0xbe, 0xb2, 0x65, 0xaa, 0x3a, 0x6d, 0xa4, 0xbf, 0xaa, 0x91,
- 0xb4, 0xdd, 0xca, 0xb3, 0x5f, 0xd3, 0xc8, 0xb3, 0x4e, 0x1b, 0x37, 0xbf,
- 0xaa, 0x11, 0x5b, 0x4f, 0xd0, 0x5c, 0x8d, 0x3f, 0x9c, 0x5c, 0x26, 0x47,
- 0x67, 0xaf, 0xdd, 0x1e, 0xbd, 0xb4, 0xe8, 0xb0, 0x34, 0x19, 0x2f, 0x0b,
- 0xb3, 0x8a, 0xc4, 0x19, 0x8b, 0xfa, 0x16, 0x70, 0x98, 0x4a, 0x0d, 0x66,
- 0x8a, 0x63, 0xd6, 0xca, 0xb8, 0x70, 0x93, 0xe5, 0xf8, 0x51, 0xc5, 0xc1,
- 0x49, 0x9f, 0x53, 0xcc, 0x95, 0x6c, 0x46, 0x89, 0x66, 0x0d, 0xe0, 0xd0,
- 0xce, 0x26, 0x92, 0x15, 0x63, 0xf7, 0x4a, 0xea, 0xca, 0x38, 0xa5, 0x34,
- 0xfa, 0x82, 0x13, 0x30, 0x8c, 0x76, 0xd4, 0xa6, 0xa3, 0xdb, 0xf0, 0x13,
- 0xf4, 0x84, 0x9a, 0xae, 0x2f, 0x70, 0xf7, 0xbc, 0x91, 0xde, 0xb4, 0x00,
- 0x19, 0x7b, 0x0a, 0x28, 0x6c, 0xed, 0x18, 0xe1, 0xe2, 0x86, 0xd2, 0x4b,
- 0xe0, 0xb1, 0xa9, 0x62, 0xef, 0x71, 0x37, 0x16, 0x0e, 0x18, 0xc8, 0xb5,
- 0x47, 0x02, 0x11, 0x65, 0x9b, 0xb0, 0xdf, 0xd9, 0xe7, 0x3f, 0xde, 0x98,
- 0x9b, 0x9a, 0xc3, 0xc7, 0x12, 0x9e, 0xcf, 0xff, 0xee, 0xdd, 0xd3, 0x4f,
- 0x5c, 0xb4, 0x66, 0x9e, 0xce, 0x50, 0xd5, 0x43, 0xcc, 0x81, 0xfa, 0xbe,
- 0x68, 0xd2, 0x4f, 0xd0, 0xcb, 0x49, 0x89, 0x12, 0x22, 0x01, 0xf7, 0xe6,
- 0x53, 0x11, 0xce, 0x89, 0xa5, 0x2b, 0xc0, 0xf9, 0xd3, 0x6c, 0x08, 0x2f,
- 0xe2, 0x2a, 0x66, 0x91, 0xe9, 0x81, 0xe6, 0x62, 0x71, 0x9d, 0xab, 0x9a,
- 0x2a, 0x8d, 0x6c, 0x44, 0xa3, 0x61, 0xf6, 0xb3, 0x9a, 0xd5, 0x55, 0x56,
- 0x12, 0xbd, 0x05, 0xaf, 0x3a, 0x68, 0xd5, 0x5d, 0x9e, 0x39, 0xd5, 0x70,
- 0xe4, 0x49, 0x1b, 0xac, 0xe0, 0x20, 0x2e, 0x39, 0x13, 0x53, 0x24, 0x9c,
- 0xea, 0x20, 0xd3, 0x52, 0x48, 0x04, 0x29, 0x1e, 0x45, 0x75, 0x8f, 0xcc,
- 0x2f, 0xee, 0x99, 0xd1, 0x3d, 0x2d, 0x90, 0xd7, 0x10, 0x14, 0x75, 0x95,
- 0x85, 0x11, 0xd8, 0xb7, 0x43, 0x58, 0x3f, 0xe3, 0x3f, 0x8e, 0x54, 0x96,
- 0x6b, 0x41, 0x41, 0x15, 0xe2, 0x30, 0xde, 0x98, 0x78, 0x40, 0xa5, 0x16,
- 0x7b, 0xe7, 0x26, 0x1c, 0x17, 0xa3, 0xb1, 0x86, 0x29, 0xdc, 0xd2, 0x8a,
- 0x67, 0x34, 0x3c, 0x5f, 0xf1, 0x1d, 0xe6, 0x14, 0xb8, 0xb4, 0xec, 0x06,
- 0x5d, 0xe7, 0x25, 0xb5, 0x1f, 0xb6, 0xf6, 0x59, 0x77, 0x8b, 0xa8, 0x2f,
- 0x91, 0xa8, 0xa7, 0x4a, 0x3f, 0xa4, 0xf0, 0xb9, 0x58, 0x27, 0x19, 0x25,
- 0x49, 0xc8, 0x5d, 0x5a, 0x65, 0x0b, 0x2a, 0x87, 0x78, 0xe9, 0xf2, 0x38,
- 0x11, 0xb9, 0x80, 0x85, 0x81, 0x79, 0x9e, 0x68, 0x2f, 0xcd, 0x05, 0xe9,
- 0x2b, 0x87, 0x2f, 0xe4, 0xb3, 0x94, 0xee, 0x9e, 0xc2, 0xb9, 0x4c, 0xb0,
- 0xd2, 0x22, 0xb7, 0x5b, 0x4f, 0x4a, 0xe2, 0xe0, 0x47, 0x04, 0x19, 0x41,
- 0x16, 0xa9, 0xfe, 0x5b, 0xde, 0x08, 0xb8, 0x56, 0x3a, 0x5e, 0x2b, 0x1a,
- 0xed, 0xb2, 0xe2, 0x24, 0x21, 0xc7, 0x2f, 0x04, 0x38, 0x5e, 0x5a, 0x34,
- 0x3c, 0x5c, 0x82, 0xf1, 0x11, 0x07, 0x45, 0xf2, 0x36, 0x8c, 0xc3, 0x97,
- 0x57, 0x54, 0xbb, 0x41, 0x42, 0x95, 0x55, 0x2e, 0xf3, 0xc3, 0xf5, 0x65,
- 0x71, 0xf9, 0xba, 0x46, 0x85, 0x63, 0x9c, 0x6f, 0x18, 0x73, 0xec, 0x61,
- 0xf6, 0xad, 0xcc, 0x76, 0x75, 0xf3, 0xb0, 0xb7, 0x67, 0xe7, 0xe1, 0x0e,
- 0x13, 0x7b, 0x7e, 0x38, 0x1a, 0xe9, 0xb4, 0x1e, 0x85, 0x33, 0x28, 0xf1,
- 0x6d, 0x4a, 0x35, 0xd5, 0x0c, 0xfc, 0x88, 0x15, 0x24, 0x8d, 0x74, 0x62,
- 0x42, 0x7b, 0x4f, 0xdc, 0x9c, 0xdb, 0x8f, 0x7d, 0xc7, 0xad, 0xf5, 0x1f,
- 0xf9, 0xb1, 0xe8, 0xb7, 0xbe, 0x8b, 0x7c, 0xeb, 0x69, 0x67, 0x5c, 0xfb,
- 0xfb, 0x9f, 0x09, 0x8a, 0x91, 0x8d, 0xcb, 0x59, 0xe2, 0x3e, 0x26, 0x5f,
- 0xe3, 0x4b, 0xdb, 0x3c, 0x38, 0xe0, 0x9c, 0xa4, 0xf0, 0x5b, 0xde, 0x1e,
- 0xf3, 0x3e, 0xf5, 0xcc, 0x0d, 0xcb, 0x18, 0x48, 0xd4, 0x1e, 0x31, 0x79,
- 0xf3, 0x71, 0x08, 0x4e, 0x89, 0x2d, 0xef, 0x79, 0x42, 0x3d, 0x33, 0x0a,
- 0x57, 0x13, 0x0f, 0xd1, 0x6b, 0x37, 0xbc, 0xef, 0x7c, 0x66, 0xbf, 0x63,
- 0x7b, 0x4e, 0x26, 0x0c, 0x27, 0x9a, 0x0e, 0xbd, 0x13, 0xa9, 0x7b, 0xc4,
- 0x79, 0x10, 0x2d, 0xd5, 0x71, 0xb0, 0x65, 0xe5, 0x6d, 0xf7, 0x15, 0x3e,
- 0x66, 0xe7, 0xb4, 0x8b, 0x85, 0xcd, 0x6b, 0x98, 0x9c, 0xc1, 0xe0, 0x6a,
- 0x31, 0x18, 0xc2, 0xd0, 0xa5, 0x63, 0x6d, 0xeb, 0x09, 0xf8, 0xa7, 0x7a,
- 0xef, 0x85, 0x37, 0x27, 0xda, 0x2d, 0x8d, 0xaa, 0xed, 0xe8, 0xf1, 0xb1,
- 0xa2, 0x42, 0xdd, 0x0a, 0x59, 0x72, 0x71, 0x7c, 0x79, 0x41, 0xe1, 0x02,
- 0x90, 0x30, 0x76, 0x45, 0xa9, 0x39, 0x53, 0xdb, 0x96, 0xf5, 0xea, 0x0a,
- 0x12, 0xc3, 0xbb, 0x6b, 0xdc, 0x4e, 0x66, 0x6a, 0x04, 0xdc, 0xae, 0x94,
- 0x90, 0xc9, 0xff, 0xd4, 0xf7, 0x18, 0x9d, 0x49, 0x35, 0xaa, 0x71, 0xfb,
- 0x3a, 0x8f, 0x60, 0x9b, 0xb4, 0x61, 0x7f, 0xdf, 0x45, 0x37, 0x51, 0xcb,
- 0x83, 0xc5, 0x97, 0x80, 0xae, 0x58, 0x48, 0x78, 0x40, 0x45, 0x5b, 0x80,
- 0x86, 0xc5, 0xa8, 0x40, 0x97, 0x82, 0xb0, 0x87, 0xfd, 0xb8, 0x4a, 0x77,
- 0xab, 0x04, 0x38, 0xd0, 0x1c, 0x3e, 0xc9, 0x3f, 0x65, 0xb6, 0x08, 0x80,
- 0xc9, 0x9f, 0xee, 0xee, 0x86, 0xcd, 0xa5, 0xe3, 0xf2, 0x36, 0x93, 0x1b,
- 0x5b, 0x50, 0xa7, 0x78, 0x85, 0x0d, 0x64, 0xa8, 0x10, 0x35, 0xa9, 0xa3,
- 0x83, 0x2b, 0xb2, 0x58, 0x69, 0xc6, 0xd4, 0x59, 0xe4, 0xcd, 0x1b, 0x9f,
- 0xca, 0xef, 0x81, 0x82, 0x95, 0x39, 0x6b, 0x9f, 0x45, 0x06, 0xc8, 0x6a,
- 0xa9, 0x88, 0x54, 0x61, 0x38, 0x48, 0x2e, 0x11, 0x47, 0x47, 0xd0, 0x33,
- 0xe1, 0xd0, 0xf4, 0x3e, 0xf3, 0x2c, 0xb2, 0x23, 0x92, 0xd1, 0xe5, 0xd9,
- 0x45, 0x22, 0x9b, 0x2c, 0x14, 0xbb, 0x88, 0xa3, 0xd1, 0x13, 0x36, 0x6d,
- 0xb7, 0x1f, 0x29, 0x41, 0x68, 0x13, 0xcd, 0x2c, 0x43, 0x92, 0xf7, 0x55,
- 0xbe, 0xac, 0x2e, 0x08, 0x2a, 0x2d, 0x63, 0xfb, 0x4e, 0x52, 0xcb, 0x94,
- 0x0d, 0x4c, 0x8b, 0x0d, 0x7a, 0x2f, 0xf1, 0x41, 0x3b, 0x5b, 0x62, 0xb3,
- 0x73, 0x1a, 0x14, 0xed, 0x23, 0x49, 0x88, 0x22, 0x36, 0x31, 0x49, 0x12,
- 0xb1, 0xb4, 0xf6, 0xdd, 0xbd, 0xc8, 0x87, 0xe8, 0xcc, 0xf1, 0xbd, 0x71,
- 0x41, 0x49, 0x19, 0xa4, 0xb3, 0x4f, 0x51, 0x5d, 0x01, 0x78, 0x7c, 0x66,
- 0x44, 0x93, 0x3d, 0x84, 0x3b, 0x21, 0x2c, 0x13, 0x3d, 0x31, 0x1a, 0x90,
- 0x32, 0x40, 0x89, 0xdf, 0x4a, 0x55, 0x42, 0xa7, 0x4d, 0xed, 0xba, 0x79,
- 0x3e, 0x3f, 0xbb, 0xb8, 0x4c, 0xb4, 0x73, 0xac, 0x00, 0xe0, 0x47, 0x9d,
- 0x23, 0x44, 0x64, 0xc9, 0xb0, 0xd4, 0x1c, 0xc6, 0x31, 0xb0, 0x3e, 0x45,
- 0xf3, 0x6b, 0xb4, 0x09, 0x6d, 0x83, 0x2c, 0x33, 0x62, 0xe8, 0x9b, 0x72,
- 0x4a, 0x74, 0xea, 0xcb, 0x1c, 0xe1, 0x2f, 0x20, 0x01, 0x1d, 0x2f, 0x55,
- 0xe0, 0x74, 0x97, 0x27, 0x7b, 0x91, 0xdd, 0x41, 0x56, 0xf2, 0xc5, 0x31,
- 0x95, 0xa3, 0xbc, 0xbc, 0xe1, 0xbf, 0x05, 0x3d, 0xe7, 0x44, 0x13, 0xf9,
- 0x61, 0xb4, 0xa2, 0x29, 0x76, 0x07, 0x79, 0xb7, 0xa9, 0x04, 0x32, 0xb5,
- 0x6f, 0xb3, 0xa5, 0xbc, 0x39, 0x7b, 0xe2, 0x21, 0x19, 0x20, 0x39, 0x65,
- 0xaf, 0xe0, 0x90, 0xe3, 0x07, 0x3d, 0xf9, 0x48, 0xcf, 0xdc, 0xb9, 0x7c,
- 0x28, 0x5a, 0xfc, 0x8e, 0x4f, 0x9e, 0x7a, 0xd2, 0x82, 0xa4, 0xbb, 0x34,
- 0x70, 0xa2, 0x95, 0x21, 0xe8, 0x87, 0x03, 0xdd, 0x2e, 0xd7, 0x59, 0xa1,
- 0x1b, 0x83, 0x9f, 0x73, 0xed, 0x3c, 0xb3, 0x59, 0x91, 0xaa, 0x07, 0x79,
- 0x5d, 0xa1, 0x1f, 0x6b, 0x08, 0x19, 0x59, 0xcf, 0x9d, 0x6d, 0xf7, 0xe4,
- 0xb9, 0x9d, 0x45, 0xb2, 0x18, 0x2c, 0x2a, 0x82, 0x87, 0xef, 0x5d, 0x46,
- 0xe4, 0xf0, 0xcc, 0x8b, 0x25, 0xb2, 0x83, 0x8d, 0x04, 0x4a, 0xab, 0x59,
- 0x0e, 0x46, 0xae, 0x71, 0x2c, 0xdd, 0xc9, 0x82, 0x21, 0xdc, 0x77, 0xe4,
- 0x26, 0x3a, 0x39, 0x3d, 0x76, 0xab, 0xc5, 0x64, 0xb4, 0x38, 0xc9, 0x4e,
- 0x99, 0xa3, 0x92, 0x4e, 0xf6, 0xba, 0x18, 0x26, 0xe7, 0x54, 0xaa, 0x07,
- 0x59, 0x95, 0xf5, 0x7f, 0xba, 0xd6, 0xf8, 0xb0, 0xc0, 0xe9, 0x62, 0xee,
- 0x4f, 0xe4, 0xcf, 0xe4, 0x85, 0x59, 0x5c, 0xfc, 0x84, 0xfe, 0xea, 0x11,
- 0x27, 0x06, 0x43, 0x7e, 0xe1, 0x5e, 0xae, 0xcd, 0x40, 0x8c, 0x49, 0xd6,
- 0x7d, 0xe4, 0xa9, 0xec, 0x2d, 0x63, 0xaf, 0xa1, 0x09, 0xfa, 0x00, 0xe4,
- 0x33, 0x9d, 0x69, 0xad, 0x36, 0xc8, 0x2d, 0x5c, 0xe9, 0x33, 0xaa, 0xaf,
- 0xf2, 0x73, 0xae, 0x29, 0xbe, 0x14, 0x0e, 0xc7, 0x96, 0x40, 0x9c, 0x60,
- 0x48, 0x94, 0x04, 0x68, 0xda, 0x2a, 0x48, 0xe2, 0xce, 0x2c, 0x4b, 0x83,
- 0xf5, 0xfc, 0x93, 0xcc, 0x1c, 0xeb, 0xe1, 0xa1, 0x91, 0x0c, 0x82, 0xf2,
- 0xef, 0x2d, 0x17, 0xe2, 0x53, 0xde, 0x8d, 0x76, 0xeb, 0xd8, 0x7b, 0xac,
- 0xd5, 0x3b, 0xc1, 0x3f, 0x09, 0x91, 0x0a, 0x2d, 0x37, 0xb9, 0x80, 0xcc,
- 0x35, 0xef, 0x6b, 0x77, 0x4f, 0x9f, 0xb9, 0xa6, 0xae, 0x28, 0xf7, 0xc0,
- 0xb6, 0xe5, 0x64, 0x90, 0xe3, 0xa9, 0xcd, 0xed, 0x63, 0xeb, 0x4d, 0x82,
- 0xf6, 0xfd, 0xf1, 0xf4, 0x33, 0xe1, 0xf8, 0xa0, 0x74, 0xf6, 0xe2, 0xde,
- 0x01, 0xf8, 0x86, 0x1c, 0x48, 0x60, 0x5f, 0x03, 0xb3, 0x61, 0x5b, 0x68,
- 0x1f, 0x5b, 0x95, 0x62, 0x88, 0xcf, 0xd3, 0x4f, 0xc1, 0x55, 0x3f, 0x5f,
- 0xce, 0x05, 0x23, 0xe4, 0x7d, 0xe9, 0x73, 0xb1, 0x5a, 0xb9, 0xe0, 0xa3,
- 0x26, 0xf3, 0xdb, 0x91, 0x98, 0x89, 0x16, 0xa3, 0xc8, 0x8b, 0xb2, 0x4d,
- 0x81, 0x5d, 0xb1, 0xb6, 0x75, 0x48, 0xda, 0x42, 0x54, 0x18, 0xb8, 0x90,
- 0x45, 0x51, 0xd4, 0xb8, 0x46, 0xa9, 0xd9, 0x2a, 0x12, 0x19, 0x92, 0xe7,
- 0xf8, 0x57, 0xab, 0x73, 0xd1, 0xab, 0xec, 0xaf, 0x66, 0x88, 0x24, 0x9b,
- 0x70, 0xe9, 0x30, 0xee, 0x9c, 0x47, 0x59, 0x2c, 0x53, 0xcf, 0x5c, 0x7b,
- 0xfa, 0x42, 0x5c, 0x12, 0x62, 0xf2, 0x6a, 0x51, 0xac, 0xae, 0x47, 0xf9,
- 0xd9, 0x9e, 0xf5, 0xef, 0x10, 0x22, 0x67, 0xb3, 0x66, 0xe9, 0xe0, 0xe1,
- 0x72, 0x4a, 0x2a, 0x8c, 0xfb, 0x4d, 0xf2, 0xf6, 0xf5, 0x33, 0x0a, 0x0e,
- 0x5f, 0x67, 0xd5, 0xa2, 0x32, 0x4b, 0x69, 0xf7, 0xf0, 0xd9, 0xb7, 0x5e,
- 0x63, 0xfb, 0x5e, 0xae, 0x3b, 0x5f, 0xb5, 0xb9, 0x9c, 0x5e, 0xb0, 0xc7,
- 0x14, 0xf7, 0x94, 0x9d, 0x73, 0xdd, 0x97, 0x4c, 0x3b, 0x4e, 0x21, 0xa1,
- 0x89, 0xf4, 0x4a, 0xfe, 0x25, 0x01, 0xeb, 0x48, 0x47, 0x88, 0x3d, 0x7b,
- 0xe2, 0x84, 0x18, 0x55, 0xf5, 0x24, 0xde, 0xab, 0x6b, 0xd2, 0xa8, 0x23,
- 0x27, 0xea, 0x19, 0x0b, 0xce, 0x23, 0x3e, 0xf7, 0xa4, 0xce, 0x86, 0xaf,
- 0x21, 0x49, 0x08, 0x91, 0x0d, 0xef, 0xbd, 0x67, 0xbe, 0xd9, 0x48, 0x0c,
- 0x5c, 0xb4, 0xc3, 0x84, 0x77, 0x17, 0xba, 0x8a, 0xf7, 0xec, 0x73, 0xfb,
- 0x2c, 0xf9, 0x08, 0xf2, 0xc2, 0xe3, 0x49, 0x5f, 0xf1, 0x86, 0x28, 0xc1,
- 0xac, 0x1a, 0x38, 0xfa, 0x00, 0xd6, 0x7c, 0xbc, 0xb9, 0xf7, 0x5e, 0x79,
- 0xd1, 0xb6, 0x8a, 0x41, 0x52, 0x6a, 0xb7, 0x26, 0x06, 0x95, 0x2f, 0x6e,
- 0xfc, 0xc3, 0xf9, 0x9c, 0x6f, 0xea, 0x73, 0x82, 0x59, 0xb5, 0xd6, 0x53,
- 0x85, 0x60, 0xe6, 0xe7, 0xa4, 0xea, 0x59, 0xe7, 0xbd, 0x7f, 0x74, 0xa8,
- 0x6f, 0x0c, 0x02, 0x8e, 0xb4, 0xc6, 0x4f, 0xc1, 0x7d, 0xbe, 0x27, 0x67,
- 0xc6, 0x0c, 0xb9, 0xbc, 0x2e, 0xf2, 0xbf, 0x67, 0x1e, 0xae, 0x40, 0x39,
- 0xee, 0xbd, 0xc7, 0xf7, 0x45, 0x60, 0xdc, 0xa6, 0xb3, 0x5c, 0x84, 0x22,
- 0xf9, 0xcb, 0xdd, 0x03, 0x4f, 0x64, 0xd7, 0x7e, 0xca, 0xe9, 0x88, 0xc2,
- 0x0a, 0x40, 0x85, 0x29, 0x8a, 0xd6, 0x64, 0x2d, 0xd8, 0xde, 0xf3, 0xa7,
- 0xa2, 0x7b, 0xa9, 0x92, 0x4c, 0xf7, 0x12, 0x0a, 0x45, 0x83, 0xe1, 0xa7,
- 0x2b, 0xa6, 0x9f, 0xcb, 0xd5, 0x27, 0x4b, 0x29, 0x05, 0x86, 0x52, 0x57,
- 0x31, 0x80, 0xfe, 0x7a, 0x97, 0x17, 0x02, 0xa5, 0x0b, 0x5e, 0x7f, 0xbe,
- 0xc2, 0xd5, 0x24, 0xa5, 0x34, 0x8f, 0xb1, 0x97, 0xbc, 0xe7, 0x3f, 0xb3,
- 0x27, 0xc1, 0xa3, 0x47, 0x52, 0x5e, 0x1c, 0xa4, 0xf1, 0x29, 0x0f, 0xbc,
- 0x1e, 0x24, 0x98, 0xfd, 0x8b, 0x26, 0x53, 0x32, 0xd5, 0x08, 0x79, 0xe5,
- 0x95, 0xfd, 0xfc, 0xac, 0xbc, 0x4e, 0xfc, 0x24, 0xdf, 0xe7, 0xbc, 0xa5,
- 0xde, 0x80, 0x13, 0x57, 0xcf, 0x01, 0x49, 0x13, 0xbf, 0xc4, 0x9a, 0x7b,
- 0xfa, 0x85, 0xec, 0x0d, 0xbd, 0x2f, 0x55, 0x4d, 0x5d, 0xf9, 0xc6, 0x67,
- 0xbb, 0xbe, 0xd2, 0x3a, 0x25, 0x8f, 0x3c, 0xa7, 0x9b, 0xad, 0x7c, 0x81,
- 0x77, 0xc6, 0xc9, 0x8c, 0xaa, 0x95, 0xcd, 0xb4, 0x06, 0x9a, 0xd2, 0xe3,
- 0xb8, 0xc7, 0xf6, 0x5b, 0x42, 0xf7, 0xd2, 0x57, 0xa1, 0x92, 0x93, 0xd7,
- 0xde, 0x83, 0x4f, 0xdc, 0x00, 0xd3, 0x19, 0x69, 0x03, 0xf7, 0xec, 0x88,
- 0xa8, 0xa5, 0xfa, 0x9a, 0xf7, 0x28, 0xef, 0x8c, 0x77, 0x25, 0xd3, 0x38,
- 0x60, 0xfe, 0x83, 0x67, 0x78, 0x3b, 0x1c, 0xdd, 0x98, 0x5b, 0x6d, 0xd2,
- 0x00, 0x5f, 0x54, 0x68, 0x54, 0xa0, 0xbb, 0xf6, 0x9f, 0x3d, 0x5f, 0xf3,
- 0xac, 0x5c, 0x9a, 0x75, 0xa4, 0xb0, 0xf0, 0x67, 0x9f, 0x85, 0xc7, 0x5c,
- 0xcd, 0x02, 0x45, 0x41, 0xca, 0x49, 0x4b, 0xb6, 0x28, 0xa3, 0xe8, 0x3f,
- 0xd5, 0xf3, 0x53, 0x11, 0x41, 0x4d, 0xfd, 0x9f, 0x7e, 0x7f, 0x3f, 0xb7,
- 0xfb, 0xc9, 0xba, 0x7d, 0xaa, 0x0c, 0x8e, 0xe1, 0x49, 0x8b, 0x91, 0xd6,
- 0x05, 0x85, 0x31, 0x3b, 0x5e, 0x0b, 0xbc, 0xe6, 0x46, 0x8f, 0x58, 0x16,
- 0x4e, 0x72, 0xb0, 0x21, 0x28, 0x09, 0x7c, 0x53, 0x9f, 0xcb, 0x88, 0x64,
- 0x7e, 0xcd, 0x1c, 0x15, 0x9e, 0x93, 0x6c, 0xb7, 0x73, 0x0c, 0xea, 0x9b,
- 0x25, 0x5b, 0xde, 0x76, 0x44, 0x7e, 0xc5, 0x68, 0xfb, 0xda, 0xbe, 0x93,
- 0x5e, 0x72, 0xed, 0x33, 0xa0, 0xf5, 0x88, 0xa8, 0x52, 0xd9, 0x3c, 0xb7,
- 0x3c, 0xa5, 0xf0, 0x84, 0x56, 0x25, 0xd3, 0xee, 0x50, 0x5a, 0xe8, 0x56,
- 0x1a, 0x07, 0x9f, 0x0b, 0x32, 0xd1, 0xfb, 0x8c, 0xa8, 0x36, 0x14, 0xd5,
- 0xae, 0xb8, 0x44, 0xb9, 0x1e, 0x19, 0xdb, 0x46, 0xe4, 0xad, 0xa7, 0x76,
- 0x6a, 0x69, 0xf7, 0x9d, 0x5f, 0x1c, 0x77, 0x0d, 0x01, 0xf7, 0x28, 0xef,
- 0x9a, 0x8b, 0xcb, 0xd1, 0xf9, 0x01, 0xf5, 0x97, 0x43, 0x2d, 0xe6, 0x40,
- 0x1c, 0x8d, 0xb2, 0xbf, 0x09, 0x8c, 0xbd, 0x76, 0x4f, 0x3f, 0x5f, 0xf1,
- 0xf4, 0x48, 0xa8, 0x3f, 0x4e, 0xa6, 0x24, 0x7d, 0xcd, 0x3a, 0xf8, 0x2f,
- 0x7d, 0x26, 0xe8, 0x20, 0x75, 0xe1, 0xb2, 0xf3, 0x88, 0x7a, 0x06, 0x69,
- 0x48, 0x41, 0x36, 0xf7, 0xf0, 0xe7, 0xce, 0x67, 0x73, 0xb3, 0x2c, 0x3e,
- 0x5a, 0x7d, 0x51, 0x88, 0x59, 0x74, 0x81, 0xdd, 0x0b, 0x2f, 0xf4, 0x68,
- 0x78, 0xa8, 0x79, 0x1b, 0xea, 0xee, 0x8b, 0xa7, 0x42, 0xeb, 0xad, 0x71,
- 0x8c, 0xc8, 0xc8, 0xd7, 0xa5, 0x37, 0x07, 0x2f, 0x76, 0xed, 0xf5, 0x2b,
- 0x39, 0xde, 0x1f, 0xb3, 0x7b, 0xb7, 0xeb, 0x38, 0x34, 0x67, 0xd4, 0xc5,
- 0xbc, 0x20, 0x47, 0x84, 0x7b, 0xc4, 0x36, 0xf0, 0xc3, 0x0f, 0x2c, 0xe3,
- 0x4b, 0xcd, 0x82, 0x97, 0x10, 0x82, 0x65, 0x7f, 0x37, 0x32, 0x91, 0xf9,
- 0xe2, 0x0a, 0x2d, 0x7b, 0x5d, 0x65, 0xb3, 0x8c, 0x78, 0xa5, 0xd8, 0x4e,
- 0xc1, 0xc6, 0x1e, 0x04, 0x36, 0x1f, 0x0a, 0xa0, 0x70, 0x0c, 0x8a, 0xb0,
- 0x34, 0xf0, 0xe7, 0x15, 0x84, 0x59, 0x11, 0x7f, 0x95, 0x59, 0xf1, 0xc3,
- 0xf7, 0x97, 0xdf, 0x9c, 0x5d, 0x8c, 0x92, 0x1d, 0x4a, 0xd0, 0xba, 0xbc,
- 0x38, 0xf9, 0xea, 0xbd, 0x31, 0xff, 0x6d, 0xf8, 0xe5, 0x75, 0x5a, 0xe4,
- 0xe6, 0xe6, 0x48, 0x46, 0x4d, 0x56, 0x98, 0x85, 0xbc, 0x56, 0x96, 0x76,
- 0x70, 0x4f, 0xd0, 0x5d, 0x59, 0x56, 0x5c, 0xa9, 0x03, 0x09, 0xb2, 0x37,
- 0xa5, 0xac, 0x06, 0x33, 0xb8, 0x14, 0x0c, 0xb8, 0x28, 0x9d, 0x6d, 0x9b,
- 0xb7, 0x93, 0xee, 0x12, 0x8d, 0xa2, 0x26, 0x97, 0xdf, 0x1c, 0xbe, 0xfb,
- 0x76, 0xa4, 0x04, 0xbe, 0xdf, 0x7f, 0xff, 0xbd, 0x1f, 0xdd, 0xaf, 0x0f,
- 0x76, 0x76, 0xa0, 0x63, 0xde, 0xa4, 0x9f, 0x3e, 0x0d, 0xeb, 0x6c, 0x63,
- 0xe3, 0x8d, 0x0b, 0xca, 0x39, 0x5a, 0xe7, 0x7a, 0x69, 0x54, 0x0b, 0xf3,
- 0xeb, 0x1d, 0x33, 0xc1, 0x44, 0x1f, 0xbd, 0xb3, 0x6c, 0xf2, 0x99, 0xb9,
- 0x91, 0xb2, 0x1a, 0x6f, 0xef, 0x6c, 0x6c, 0x8c, 0x8e, 0x8f, 0x93, 0xc3,
- 0xd3, 0xd1, 0x99, 0xf7, 0xee, 0xd6, 0xde, 0xb6, 0x51, 0xbd, 0xae, 0xb3,
- 0xc6, 0xfc, 0x65, 0x63, 0xe3, 0xf4, 0xf0, 0x92, 0x6c, 0xde, 0xef, 0x8e,
- 0x2f, 0x46, 0x27, 0x67, 0xef, 0x68, 0x79, 0x28, 0x31, 0x39, 0x9d, 0xdd,
- 0x11, 0x11, 0xd3, 0x55, 0x0e, 0x98, 0xe5, 0x9d, 0x16, 0x96, 0x15, 0x6e,
- 0x32, 0x56, 0xe5, 0x19, 0x33, 0x71, 0x47, 0xd9, 0xe2, 0x82, 0x6a, 0x20,
- 0x18, 0x98, 0x99, 0x09, 0xe5, 0xd8, 0xd9, 0x48, 0x9c, 0xe3, 0x8b, 0x93,
- 0x59, 0xb3, 0x31, 0xd7, 0x06, 0xec, 0x33, 0x38, 0x09, 0x10, 0x15, 0x2f,
- 0x83, 0x37, 0x3e, 0xf2, 0xd1, 0x09, 0x11, 0xeb, 0x25, 0xef, 0x47, 0x87,
- 0x5f, 0x1f, 0xd3, 0xb3, 0x5f, 0x67, 0x8d, 0x5b, 0x10, 0xae, 0x80, 0x4b,
- 0x5f, 0x79, 0x97, 0x35, 0xf5, 0x24, 0x5d, 0x64, 0x9b, 0xd4, 0xa7, 0xf1,
- 0x40, 0x48, 0xab, 0x5d, 0xe3, 0x6c, 0x0d, 0x38, 0xa6, 0xed, 0x42, 0x9e,
- 0x07, 0x27, 0xb6, 0xdf, 0xee, 0xc5, 0xf1, 0xe1, 0xeb, 0xb7, 0xc7, 0x5a,
- 0x5e, 0x92, 0x6f, 0x6e, 0xd3, 0xe8, 0x0d, 0x15, 0xdd, 0x74, 0xbe, 0x70,
- 0xd2, 0x0e, 0x68, 0xf6, 0xcd, 0x6f, 0x50, 0x0f, 0x3e, 0xfa, 0x39, 0xb7,
- 0x52, 0x78, 0x76, 0x78, 0x95, 0xef, 0x70, 0xeb, 0xfa, 0xbd, 0xd4, 0xce,
- 0x09, 0x0f, 0x22, 0x55, 0x8d, 0x99, 0xdd, 0x1a, 0x70, 0x87, 0x7c, 0xbe,
- 0xbb, 0xbb, 0xbb, 0x66, 0x1c, 0x30, 0x28, 0xe4, 0xde, 0x35, 0x43, 0x39,
- 0xa0, 0xc7, 0x77, 0x5c, 0xfb, 0xae, 0xc7, 0xb4, 0x4b, 0xb1, 0x6e, 0x57,
- 0x64, 0x90, 0xe3, 0xb6, 0xce, 0x9b, 0x2c, 0xde, 0xe5, 0x49, 0x59, 0xda,
- 0x15, 0x68, 0x4d, 0x8e, 0xd1, 0x91, 0xa1, 0xf3, 0x38, 0xce, 0x2c, 0xed,
- 0xf8, 0x34, 0x87, 0x1c, 0x49, 0xab, 0xfb, 0x6e, 0x93, 0xf4, 0x1b, 0xd3,
- 0x26, 0xfd, 0x31, 0x2c, 0xab, 0xeb, 0x9d, 0xf9, 0x01, 0x94, 0x1a, 0xf3,
- 0xd0, 0x1b, 0x02, 0xc2, 0x25, 0x46, 0x39, 0xb6, 0x39, 0xd8, 0x35, 0x4d,
- 0x6c, 0x69, 0x6e, 0xb3, 0x47, 0xf4, 0xeb, 0x17, 0xcc, 0x02, 0xd3, 0x67,
- 0x5c, 0xe9, 0xc8, 0xb5, 0x20, 0x55, 0xe4, 0x23, 0xb4, 0xff, 0xe0, 0x74,
- 0x1c, 0x1a, 0x11, 0x32, 0xe4, 0xba, 0xe3, 0xd8, 0x22, 0xe6, 0xaf, 0x95,
- 0xd9, 0x32, 0xc3, 0xe6, 0x13, 0x24, 0xaf, 0x54, 0xc9, 0xe3, 0x54, 0x25,
- 0x8a, 0xd5, 0x2e, 0xa8, 0xb0, 0x6a, 0x45, 0xdc, 0x8a, 0xfc, 0x05, 0x73,
- 0x80, 0x48, 0xf6, 0x5c, 0xcb, 0xc4, 0x01, 0xf1, 0x43, 0x0d, 0x77, 0xbf,
- 0x39, 0x18, 0x60, 0xff, 0xd4, 0x76, 0xb7, 0x3c, 0xe2, 0xe3, 0xde, 0xa0,
- 0x78, 0xf6, 0x0b, 0xb9, 0xa8, 0xbd, 0xbd, 0x33, 0x32, 0xbd, 0x08, 0xbe,
- 0xb5, 0x74, 0x85, 0xfe, 0x6a, 0xfe, 0x9c, 0xcf, 0x0c, 0x6f, 0x56, 0x63,
- 0x07, 0x60, 0xb0, 0x47, 0x7f, 0xe3, 0xe8, 0x5c, 0x29, 0x97, 0x8d, 0xee,
- 0x98, 0xdf, 0xd2, 0xe0, 0x49, 0xc8, 0x27, 0xc9, 0x16, 0xdd, 0x02, 0xaa,
- 0xe8, 0x02, 0x84, 0x03, 0x83, 0x15, 0x55, 0x1f, 0x7c, 0x83, 0x63, 0x4d,
- 0x0f, 0x0f, 0xcc, 0xd4, 0xd0, 0xa5, 0xf2, 0x7f, 0x76, 0x86, 0x75, 0x7d,
- 0xb3, 0x93, 0x4f, 0x3f, 0x54, 0x75, 0x9a, 0xfc, 0xb4, 0xd1, 0x49, 0xe5,
- 0xea, 0x0e, 0xe2, 0xff, 0x60, 0x06, 0x7f, 0xd1, 0x4c, 0xad, 0x1e, 0xc5,
- 0xef, 0x31, 0x82, 0xc1, 0x80, 0x5a, 0xd5, 0x2f, 0x7d, 0x30, 0x0f, 0x7c,
- 0xb0, 0x4c, 0x99, 0xbf, 0x62, 0x74, 0x11, 0x51, 0x68, 0x06, 0xc9, 0x14,
- 0x6a, 0x46, 0xb6, 0xc4, 0x37, 0xba, 0xd2, 0xbd, 0xff, 0xb8, 0xbf, 0xbb,
- 0xbb, 0x77, 0xb0, 0xf7, 0xf9, 0x8b, 0xdd, 0x83, 0xbd, 0xbd, 0xbd, 0xfd,
- 0x83, 0xbd, 0x83, 0x83, 0xfd, 0xdd, 0x9f, 0x77, 0x7a, 0xab, 0xa6, 0xee,
- 0xed, 0x57, 0x2b, 0x1a, 0x34, 0xa3, 0xee, 0x31, 0x3f, 0xd3, 0x4f, 0x76,
- 0xf4, 0x18, 0xd5, 0xb4, 0x97, 0xd4, 0xf3, 0xb1, 0xf9, 0x94, 0x1c, 0x4e,
- 0x7f, 0x30, 0xb5, 0xd1, 0xa5, 0x33, 0x6f, 0x40, 0xaf, 0xcf, 0xbe, 0x7f,
- 0x77, 0x7a, 0x76, 0xf8, 0x3a, 0xb9, 0x3c, 0x4b, 0x0e, 0xe1, 0xf9, 0x8b,
- 0xc8, 0x49, 0x70, 0xac, 0x11, 0x76, 0x92, 0x79, 0xf0, 0xbd, 0x7a, 0x30,
- 0xe2, 0xa6, 0xb2, 0x20, 0x27, 0x74, 0xa2, 0xdb, 0xcf, 0x12, 0x96, 0x1d,
- 0xb5, 0x34, 0xbc, 0x69, 0xe6, 0x0f, 0xdf, 0x08, 0x8f, 0xf9, 0x72, 0x9f,
- 0x83, 0xee, 0xce, 0x78, 0x47, 0x77, 0xf4, 0xe4, 0x4b, 0x51, 0x5e, 0x09,
- 0x69, 0x49, 0xc0, 0xda, 0x96, 0x90, 0xdd, 0x62, 0x88, 0x96, 0x2b, 0x63,
- 0xc2, 0xe5, 0x71, 0x3a, 0x30, 0x20, 0x5b, 0x68, 0x42, 0x10, 0x11, 0xd0,
- 0x92, 0x48, 0x2d, 0xdd, 0x0e, 0x06, 0x78, 0xb6, 0x72, 0x48, 0xe6, 0x32,
- 0xcf, 0x3e, 0x61, 0xd4, 0x6d, 0xd9, 0xcb, 0x04, 0x5e, 0x6e, 0x74, 0x60,
- 0x29, 0x51, 0x77, 0x44, 0x5e, 0x69, 0x97, 0x81, 0xe5, 0x8a, 0x7c, 0x8e,
- 0xbe, 0xa3, 0x22, 0xd9, 0x7d, 0x82, 0x7e, 0xe3, 0xdf, 0xe3, 0x3b, 0xd6,
- 0xc3, 0xcb, 0x1d, 0x78, 0x3f, 0x3a, 0x79, 0xf7, 0x35, 0x62, 0xb8, 0xdf,
- 0x9f, 0x5d, 0xbc, 0x1e, 0x99, 0x66, 0x49, 0xc3, 0xd9, 0x80, 0x93, 0x8f,
- 0x24, 0xa1, 0xf4, 0x8a, 0xcf, 0x25, 0x7d, 0xfa, 0x4f, 0xbc, 0x9d, 0xfa,
- 0x36, 0xfb, 0x01, 0xdd, 0xf4, 0x4c, 0x1e, 0xaa, 0xc1, 0x11, 0xbf, 0x35,
- 0xbc, 0xdd, 0xf8, 0xe5, 0x3c, 0x9d, 0xdc, 0x90, 0x8d, 0xce, 0x9b, 0x15,
- 0xa0, 0xba, 0x1d, 0xc2, 0x92, 0xef, 0x90, 0xe9, 0xb5, 0xd3, 0x94, 0xd8,
- 0x8e, 0x68, 0xa5, 0xac, 0x2c, 0x92, 0xab, 0x35, 0x23, 0xb4, 0xd7, 0xaf,
- 0x66, 0xe9, 0x35, 0x3e, 0x18, 0x1e, 0x03, 0xef, 0x63, 0xf2, 0xf9, 0xc7,
- 0x7e, 0x92, 0xae, 0x0d, 0xb4, 0x77, 0x82, 0x0d, 0x80, 0x0c, 0x00, 0x14,
- 0x16, 0xb9, 0x52, 0x26, 0x7c, 0x52, 0x3b, 0x51, 0xe5, 0x88, 0xc0, 0x3b,
- 0xc4, 0xd5, 0xd9, 0xad, 0x10, 0x81, 0x4a, 0x7e, 0x4c, 0x57, 0x6b, 0x54,
- 0x73, 0x87, 0xf7, 0xd3, 0xba, 0xe3, 0xd4, 0x92, 0xe7, 0x05, 0xaa, 0x1d,
- 0x00, 0xd1, 0xd5, 0xb2, 0xe4, 0x29, 0xa7, 0xce, 0x10, 0xac, 0x8d, 0x01,
- 0xb4, 0x84, 0x6c, 0x13, 0x3d, 0xb8, 0x47, 0x1c, 0xd0, 0x04, 0x4d, 0xe9,
- 0xe1, 0x8a, 0x6b, 0x91, 0xeb, 0xb8, 0x20, 0x73, 0xdd, 0x98, 0xae, 0xa4,
- 0xc4, 0x29, 0xce, 0x75, 0x6f, 0x24, 0x63, 0xdd, 0x18, 0x54, 0x0c, 0x4d,
- 0xee, 0x29, 0xc0, 0x85, 0x5b, 0xc9, 0x6b, 0xce, 0xfb, 0xb7, 0x14, 0xfe,
- 0x74, 0x79, 0xd1, 0xd7, 0xd9, 0xf5, 0x89, 0x59, 0xb7, 0xf7, 0xa4, 0x73,
- 0x5e, 0xd2, 0x1d, 0x67, 0xd4, 0x78, 0x23, 0xc0, 0x79, 0xe7, 0x08, 0x92,
- 0xde, 0xab, 0xad, 0xd7, 0x9a, 0x36, 0xe5, 0x97, 0xe4, 0xe6, 0x48, 0x32,
- 0x3b, 0x3f, 0xac, 0x9d, 0xc1, 0x0d, 0x80, 0x8c, 0xec, 0x2d, 0x60, 0x91,
- 0x94, 0x5e, 0x81, 0x22, 0x47, 0xae, 0xee, 0x4d, 0x1b, 0xc3, 0xea, 0xdc,
- 0x7b, 0x66, 0x8d, 0xa8, 0xa9, 0xbc, 0xa9, 0xb3, 0xd9, 0x15, 0x59, 0x50,
- 0xf6, 0x0a, 0xe1, 0x9a, 0xa0, 0x8e, 0x65, 0x5e, 0x48, 0x74, 0x97, 0x85,
- 0x31, 0x70, 0x52, 0x41, 0x6c, 0xb0, 0x2c, 0xb9, 0x86, 0x58, 0x77, 0x85,
- 0x88, 0xdb, 0x32, 0x84, 0xe3, 0xa2, 0x7f, 0x66, 0x48, 0x96, 0x6d, 0xae,
- 0x25, 0x3a, 0x3c, 0x3c, 0x31, 0xdf, 0x3a, 0x3a, 0x77, 0x34, 0x5b, 0xf7,
- 0x0b, 0x22, 0xc4, 0x20, 0x58, 0x84, 0x57, 0x77, 0x4b, 0x09, 0x2a, 0xc1,
- 0x14, 0x9b, 0x7d, 0x22, 0xb6, 0x46, 0x19, 0x9b, 0x33, 0xf3, 0xac, 0x56,
- 0x2f, 0xe3, 0xa5, 0xd6, 0xf0, 0x73, 0xc8, 0x42, 0x9a, 0x6d, 0xd3, 0x6f,
- 0x50, 0x00, 0x0b, 0xe6, 0x96, 0xd5, 0x40, 0x35, 0x0e, 0x6d, 0xb1, 0x37,
- 0x2e, 0x45, 0x2f, 0x4c, 0xaa, 0xb6, 0x68, 0x2a, 0xc2, 0xaf, 0x29, 0x9b,
- 0x90, 0x50, 0x82, 0xbd, 0x0f, 0x03, 0xdd, 0x4f, 0xe7, 0xa2, 0x05, 0xca,
- 0x6c, 0x8d, 0x72, 0x39, 0x76, 0x0b, 0x4b, 0x7b, 0x04, 0x70, 0x46, 0x6a,
- 0xf2, 0x28, 0xac, 0x45, 0xa4, 0x64, 0xdd, 0xde, 0xec, 0x09, 0xcf, 0x80,
- 0x11, 0x28, 0xc8, 0x6e, 0x58, 0xd6, 0x76, 0xe7, 0x98, 0xd9, 0xfa, 0x28,
- 0x17, 0xe2, 0x06, 0x70, 0xae, 0xa1, 0xb8, 0x11, 0xc9, 0xbb, 0x5a, 0xde,
- 0x3c, 0x2c, 0x6a, 0xc2, 0x2e, 0xa9, 0xc5, 0x38, 0xbb, 0x67, 0x69, 0x90,
- 0x17, 0xeb, 0x85, 0x8e, 0x74, 0xe2, 0x51, 0x1f, 0xc6, 0x58, 0xc1, 0xd9,
- 0x5a, 0x73, 0x60, 0xc5, 0xe1, 0x0c, 0x19, 0xcc, 0x81, 0x0c, 0xf1, 0x0e,
- 0x6b, 0x21, 0xf5, 0xae, 0x85, 0x8a, 0xc6, 0x81, 0xe7, 0xbc, 0x90, 0x83,
- 0xe4, 0xab, 0xb4, 0xce, 0x27, 0x7d, 0xa1, 0x15, 0x17, 0x9a, 0x71, 0x14,
- 0xaa, 0x55, 0xea, 0xf1, 0x64, 0x8b, 0x09, 0x2b, 0xb7, 0x87, 0xc9, 0xf7,
- 0x4a, 0x14, 0x6f, 0x8c, 0x48, 0xe4, 0x39, 0x52, 0x40, 0x80, 0x5a, 0x13,
- 0x24, 0x09, 0x9f, 0x3d, 0xd9, 0x9f, 0x7e, 0x45, 0x6f, 0x7c, 0xc4, 0x71,
- 0x68, 0x61, 0x55, 0xd3, 0xfa, 0xa3, 0x8d, 0x85, 0x61, 0xad, 0x44, 0x14,
- 0x71, 0x99, 0x19, 0x26, 0x64, 0x84, 0x6f, 0xa0, 0x5c, 0x5a, 0x80, 0x09,
- 0xfe, 0x6d, 0x8f, 0xaf, 0x16, 0x79, 0x80, 0x07, 0xb6, 0x16, 0x04, 0xa2,
- 0x57, 0x47, 0x07, 0x3b, 0xd3, 0x8a, 0xa8, 0xc1, 0xc0, 0x4c, 0x18, 0x4d,
- 0x8d, 0x08, 0xd0, 0xb3, 0xcb, 0xe3, 0x7f, 0x4b, 0x0e, 0xbb, 0xe1, 0x73,
- 0x10, 0x0b, 0x88, 0x18, 0x96, 0x9a, 0x8b, 0x76, 0x83, 0xa1, 0xef, 0x0c,
- 0x3a, 0x64, 0x66, 0xb9, 0x14, 0xcb, 0xbf, 0x21, 0xa9, 0x79, 0xce, 0x4f,
- 0x5c, 0x97, 0x82, 0xa1, 0x46, 0x49, 0x2a, 0x5b, 0xbc, 0x08, 0x41, 0x05,
- 0x8f, 0x51, 0x8b, 0x59, 0x91, 0xf3, 0x94, 0x31, 0xec, 0x9f, 0xcc, 0xc1,
- 0x46, 0xc1, 0x28, 0x08, 0x50, 0xc0, 0xad, 0xa5, 0x1c, 0x17, 0xc1, 0x72,
- 0x09, 0xa0, 0x4a, 0xa6, 0x16, 0x53, 0x93, 0x72, 0xe9, 0x18, 0xaf, 0x8e,
- 0x82, 0x6d, 0x81, 0x76, 0xff, 0x07, 0x3a, 0x72, 0x1f, 0xf4, 0x62, 0x91,
- 0x2b, 0x90, 0xfb, 0x22, 0xd5, 0xc2, 0xdb, 0x5b, 0x56, 0x8f, 0x1d, 0xdf,
- 0x66, 0xe7, 0x0a, 0x38, 0xc4, 0x42, 0xd0, 0x15, 0x00, 0xe4, 0x08, 0xe2,
- 0xe6, 0xb8, 0x53, 0x55, 0x6a, 0xfa, 0x17, 0x13, 0x58, 0xdb, 0xe8, 0x8e,
- 0xe0, 0x8a, 0xa3, 0xc2, 0xda, 0xc6, 0xf0, 0x6e, 0xd3, 0x6a, 0x1b, 0x94,
- 0x0f, 0xb2, 0x47, 0xcc, 0x2a, 0xf5, 0x62, 0x74, 0x76, 0xf4, 0xed, 0xa8,
- 0x95, 0x14, 0x50, 0x73, 0x49, 0x82, 0x44, 0x6b, 0x6f, 0x74, 0x36, 0xb4,
- 0x91, 0x86, 0x27, 0x4d, 0x47, 0x3c, 0x59, 0x3e, 0x34, 0x0f, 0x8d, 0x4a,
- 0x97, 0x4d, 0xab, 0x59, 0xa2, 0xa8, 0x9f, 0x64, 0x1e, 0x9d, 0x63, 0x51,
- 0x6e, 0x78, 0x37, 0x1f, 0xef, 0x9f, 0xb2, 0x56, 0x99, 0xc8, 0x64, 0x7f,
- 0xcc, 0x0b, 0x3e, 0xce, 0x98, 0xbe, 0xc4, 0xec, 0x12, 0x5e, 0x45, 0x64,
- 0x9f, 0xd1, 0x09, 0xe4, 0x9d, 0x39, 0xc7, 0xe6, 0xde, 0x70, 0xbb, 0x9b,
- 0xee, 0xa0, 0x55, 0xe3, 0x24, 0x12, 0x6a, 0xda, 0x6e, 0xea, 0x31, 0x67,
- 0xd5, 0x09, 0x15, 0xbc, 0x84, 0x7c, 0x1f, 0xde, 0x23, 0xe9, 0x35, 0xad,
- 0x0e, 0x34, 0xdb, 0xc2, 0xea, 0x59, 0xae, 0x6e, 0x0e, 0x83, 0x0b, 0x30,
- 0x48, 0x92, 0x29, 0xd3, 0x64, 0x7e, 0x2f, 0x49, 0x28, 0xa2, 0x1b, 0x10,
- 0x29, 0x00, 0xbc, 0x12, 0x9f, 0x7f, 0x1e, 0xe8, 0x82, 0x9f, 0xec, 0xd3,
- 0x07, 0xe6, 0xd7, 0x9e, 0xf7, 0x63, 0x46, 0x50, 0x13, 0xf2, 0x36, 0x40,
- 0x0f, 0xb5, 0x2e, 0x90, 0x88, 0x85, 0xe1, 0x95, 0xb6, 0xe1, 0x2f, 0xda,
- 0xc8, 0x4c, 0xb0, 0xcb, 0xfa, 0x4e, 0xee, 0x6f, 0xb0, 0x79, 0xcd, 0x1d,
- 0x4d, 0x6b, 0x86, 0x2c, 0xad, 0x30, 0xcc, 0x54, 0x4c, 0x76, 0x7b, 0xeb,
- 0x69, 0xcd, 0x46, 0x73, 0x1f, 0xd2, 0xa5, 0x4a, 0x46, 0xc0, 0xa8, 0x94,
- 0x86, 0x69, 0x92, 0xa5, 0x33, 0x76, 0x77, 0x74, 0xf6, 0x91, 0xad, 0x29,
- 0xe3, 0x64, 0xc4, 0xfb, 0xd5, 0xdd, 0x79, 0xff, 0x6b, 0xba, 0x73, 0x98,
- 0xac, 0x4d, 0xc6, 0xc0, 0x04, 0xb1, 0xc4, 0xaf, 0x25, 0xbc, 0x3a, 0x2d,
- 0xb1, 0xab, 0x55, 0xef, 0xe1, 0x39, 0x42, 0x51, 0x87, 0x0e, 0xed, 0x64,
- 0xe8, 0x98, 0x28, 0x4a, 0x7e, 0x1a, 0x46, 0x0d, 0xb5, 0xdf, 0xd7, 0xae,
- 0x3c, 0xb6, 0xbb, 0x52, 0x89, 0xcc, 0x66, 0x5c, 0x75, 0x12, 0x29, 0x24,
- 0xc1, 0x69, 0x6f, 0xb8, 0xeb, 0xeb, 0x57, 0x36, 0xed, 0xa9, 0x42, 0x16,
- 0x14, 0x4d, 0xf1, 0x86, 0xa7, 0xa2, 0x2c, 0xa5, 0x70, 0xd7, 0x4e, 0xe7,
- 0x35, 0xf9, 0xd9, 0x1e, 0xa7, 0x55, 0x9b, 0x93, 0x24, 0xf4, 0x5b, 0x94,
- 0x06, 0x97, 0xcd, 0x17, 0x48, 0x0f, 0x89, 0x15, 0x24, 0xc4, 0x39, 0x7a,
- 0xea, 0x8e, 0xd4, 0x33, 0xbb, 0xdc, 0xd2, 0x47, 0xce, 0x1e, 0x90, 0x2a,
- 0x3e, 0x0c, 0xe0, 0x87, 0xf2, 0xa9, 0x84, 0xf9, 0xcd, 0xca, 0x54, 0xb6,
- 0xa3, 0x36, 0x85, 0x32, 0xed, 0x67, 0x5c, 0xb6, 0xb6, 0xbc, 0x9c, 0xd0,
- 0xe6, 0x4a, 0xc1, 0x2e, 0x6a, 0x95, 0x10, 0xba, 0x11, 0x49, 0x83, 0xd4,
- 0xf5, 0x0c, 0x75, 0x79, 0xe8, 0x5c, 0xb3, 0x7f, 0x9c, 0xb6, 0x96, 0x92,
- 0x4d, 0xba, 0xe8, 0x9b, 0x55, 0xcf, 0x4c, 0xbb, 0xb3, 0xdc, 0x74, 0x68,
- 0x13, 0x3c, 0x1e, 0x5a, 0x6e, 0x44, 0x64, 0xa1, 0x6e, 0x61, 0x9b, 0x51,
- 0xdf, 0xae, 0xe4, 0x11, 0x12, 0xd2, 0x75, 0x85, 0x2e, 0x5f, 0x03, 0xfd,
- 0x64, 0xf0, 0xbf, 0x64, 0x66, 0x48, 0x3d, 0x27, 0xf4, 0x18, 0x28, 0x57,
- 0x16, 0x5e, 0xda, 0xbd, 0x24, 0xf4, 0x41, 0xe0, 0x13, 0x34, 0x54, 0xc7,
- 0xe1, 0x95, 0x98, 0xe5, 0x6c, 0x20, 0xc8, 0x3f, 0x1d, 0x7b, 0x9e, 0x75,
- 0x4b, 0xac, 0x88, 0xa8, 0xe0, 0xe6, 0x36, 0x5c, 0x29, 0x42, 0xe0, 0x05,
- 0x83, 0x0e, 0xdb, 0x8b, 0xec, 0x2b, 0x62, 0x08, 0x3d, 0x2a, 0x53, 0x7f,
- 0x5a, 0xd5, 0x96, 0xdb, 0xd0, 0x9e, 0xf2, 0xe6, 0xb7, 0xae, 0x0c, 0x26,
- 0x6e, 0x1e, 0x98, 0x17, 0x06, 0xef, 0xc5, 0x9d, 0xf1, 0x25, 0x7f, 0x61,
- 0x08, 0xbf, 0x3b, 0x7f, 0xe1, 0x9c, 0xda, 0xb2, 0x0f, 0x1c, 0xc8, 0x4b,
- 0xc4, 0xf6, 0xdc, 0x13, 0x4f, 0x4e, 0x7b, 0x56, 0xf8, 0x79, 0x65, 0x83,
- 0xee, 0x14, 0x85, 0xc4, 0x21, 0xe3, 0xbf, 0xf2, 0xbb, 0x62, 0x3c, 0xde,
- 0x53, 0x13, 0x43, 0xc6, 0xd7, 0x8b, 0xef, 0x65, 0x7f, 0x6f, 0x87, 0x3b,
- 0xa3, 0xb5, 0x1c, 0xa1, 0xd7, 0xc9, 0x96, 0x74, 0x30, 0x10, 0x1c, 0x04,
- 0x94, 0x5d, 0x71, 0x03, 0xa7, 0x6c, 0x00, 0x82, 0xef, 0xcc, 0xb9, 0xaa,
- 0x35, 0xf3, 0xba, 0xd2, 0xd5, 0x64, 0xee, 0x5a, 0xf0, 0x7b, 0x49, 0xca,
- 0x22, 0x31, 0x5f, 0xd8, 0x05, 0xea, 0x5b, 0x95, 0x6f, 0x93, 0xaa, 0x22,
- 0xfb, 0x56, 0x53, 0x46, 0x81, 0x98, 0x14, 0x85, 0x17, 0xef, 0x6c, 0xb6,
- 0x1c, 0x1d, 0x74, 0x8e, 0xb0, 0x9b, 0x1d, 0x7d, 0x71, 0xf8, 0xee, 0xeb,
- 0x63, 0x68, 0x02, 0x90, 0xed, 0x74, 0x40, 0x73, 0xda, 0xed, 0xd3, 0x25,
- 0xd7, 0x6c, 0x33, 0x33, 0x06, 0xf4, 0x5b, 0x3d, 0x94, 0x64, 0x4a, 0x4e,
- 0x55, 0x48, 0x65, 0xf3, 0x62, 0xb9, 0x05, 0xd3, 0xb6, 0x91, 0xa8, 0x47,
- 0x15, 0x1a, 0x04, 0x19, 0x8c, 0xc4, 0x0c, 0x50, 0x82, 0xb5, 0x7f, 0xbc,
- 0x40, 0x2d, 0x03, 0xd8, 0x67, 0x4e, 0xcc, 0xa8, 0x9f, 0x65, 0xd8, 0x3e,
- 0x8b, 0x1b, 0x9a, 0xc8, 0x62, 0x6d, 0xfa, 0x0a, 0x36, 0xfd, 0xd0, 0xf7,
- 0xaa, 0x71, 0x46, 0xfe, 0xde, 0xee, 0xae, 0xe3, 0x4a, 0x4a, 0x6d, 0x83,
- 0x81, 0xb4, 0xac, 0x92, 0xdd, 0xc1, 0x8b, 0x17, 0xab, 0x04, 0xa1, 0x6d,
- 0x14, 0xc9, 0xd2, 0xcf, 0x1e, 0xdd, 0xe6, 0x80, 0x1e, 0x5d, 0xd5, 0x66,
- 0xc4, 0xa2, 0x41, 0x85, 0x26, 0xc1, 0x13, 0xd6, 0x56, 0x6b, 0x11, 0x0f,
- 0x0f, 0x47, 0x6b, 0x10, 0x3e, 0x2b, 0xac, 0x59, 0x43, 0x53, 0xb9, 0xe1,
- 0x4a, 0x27, 0x81, 0xb3, 0x40, 0x9d, 0x41, 0x0b, 0x82, 0x14, 0xe6, 0x36,
- 0x8a, 0xfb, 0xa8, 0x89, 0xf1, 0x0c, 0xf8, 0x15, 0x53, 0x74, 0x15, 0x8e,
- 0x46, 0x55, 0x82, 0xf7, 0xe7, 0xe4, 0xff, 0x3b, 0x79, 0xf7, 0x35, 0xbb,
- 0x43, 0x8c, 0x6d, 0x0f, 0x5f, 0xfa, 0x4e, 0xc7, 0xd2, 0x7f, 0xcf, 0xa4,
- 0x47, 0x04, 0x27, 0x05, 0x7c, 0x83, 0xf9, 0x9e, 0xf3, 0x42, 0x4a, 0xbc,
- 0xba, 0x7a, 0x55, 0x71, 0x5f, 0xe5, 0x65, 0x32, 0xf0, 0x94, 0x13, 0x61,
- 0x3c, 0x22, 0xcd, 0x64, 0x7e, 0xaf, 0x96, 0x91, 0x7c, 0x01, 0xad, 0x6b,
- 0x64, 0xc6, 0x36, 0xcb, 0x76, 0x2e, 0x9b, 0xe7, 0xd8, 0x41, 0x81, 0x6e,
- 0x12, 0xf9, 0x24, 0x7f, 0x06, 0xe7, 0xbb, 0xa3, 0x89, 0x3c, 0xae, 0x2b,
- 0x69, 0xa4, 0xf6, 0xb6, 0x3a, 0x02, 0x72, 0x2a, 0xe8, 0x24, 0xbe, 0x9f,
- 0xae, 0x1b, 0x92, 0xcb, 0x31, 0xf9, 0x52, 0x9d, 0x56, 0x1b, 0x6c, 0xc4,
- 0x65, 0xf9, 0xcf, 0xf7, 0x73, 0x4d, 0x0f, 0xe9, 0xa0, 0x72, 0x1d, 0x6f,
- 0xe7, 0xd3, 0xf0, 0x6a, 0x5d, 0x47, 0xbe, 0x8d, 0xf7, 0xf9, 0xd3, 0x69,
- 0xfc, 0x73, 0xfc, 0xbe, 0x4e, 0x4d, 0xe4, 0x00, 0x90, 0x4a, 0x2b, 0x9c,
- 0x58, 0x36, 0xc9, 0x54, 0x6d, 0x19, 0xd2, 0xc2, 0x21, 0x39, 0xf2, 0xb6,
- 0x5a, 0xb2, 0x91, 0x48, 0x36, 0x3b, 0x08, 0xb3, 0x68, 0x0f, 0x81, 0x41,
- 0x01, 0x97, 0xd7, 0xc7, 0x5c, 0x58, 0x2c, 0x97, 0x45, 0x91, 0x91, 0x91,
- 0x8a, 0x02, 0xda, 0x39, 0xdb, 0x0b, 0x7d, 0x7b, 0x8a, 0xaa, 0xa5, 0xd4,
- 0x44, 0x05, 0x3e, 0xc1, 0x74, 0x3e, 0xad, 0x6f, 0x00, 0x1c, 0xb4, 0xae,
- 0xa8, 0x50, 0xbd, 0xc2, 0xe7, 0xb9, 0x5d, 0xd2, 0xa7, 0x58, 0x99, 0x82,
- 0x72, 0xdd, 0x9a, 0x8a, 0xf6, 0x0c, 0x6c, 0x6c, 0x90, 0x13, 0x7e, 0x87,
- 0x5c, 0xf1, 0xa3, 0x70, 0x02, 0xd5, 0x97, 0xbe, 0xd6, 0x1f, 0xef, 0x62,
- 0x0c, 0x0f, 0x78, 0xe6, 0x3d, 0xef, 0xc9, 0x63, 0x4f, 0x1c, 0xeb, 0xef,
- 0x91, 0xb8, 0x22, 0x0e, 0x9d, 0x27, 0xc8, 0xa2, 0x5b, 0xbd, 0xed, 0x4d,
- 0xf3, 0x6d, 0x01, 0x38, 0x7d, 0x60, 0x99, 0x81, 0x76, 0xbe, 0xb3, 0x5c,
- 0x30, 0xd8, 0x51, 0xae, 0x9c, 0x59, 0x6c, 0x54, 0xbc, 0xfb, 0xb5, 0x38,
- 0xfc, 0xc2, 0x7b, 0x90, 0x66, 0xa4, 0x5b, 0xb0, 0xf9, 0x8b, 0x58, 0x37,
- 0xe7, 0xc9, 0xe1, 0x9b, 0x18, 0x21, 0x77, 0x90, 0xa9, 0x0d, 0x18, 0x91,
- 0x3e, 0xba, 0x24, 0x37, 0x02, 0xae, 0x3e, 0xb5, 0x47, 0xbf, 0x3b, 0xbe,
- 0xf8, 0xea, 0x6c, 0x74, 0x6c, 0xd6, 0xe3, 0xf5, 0xf1, 0x57, 0xef, 0x49,
- 0x6a, 0xd1, 0xee, 0x60, 0xd7, 0x33, 0x71, 0x1f, 0x88, 0xff, 0x8b, 0xca,
- 0x22, 0x22, 0x69, 0x0a, 0xdb, 0x94, 0xf5, 0x20, 0x2d, 0x89, 0x67, 0x55,
- 0x3c, 0x2e, 0xec, 0x37, 0xcb, 0xd8, 0x57, 0x99, 0x23, 0x0d, 0x81, 0x49,
- 0x3e, 0x24, 0xe3, 0x07, 0x65, 0xc0, 0x60, 0x5e, 0xca, 0x51, 0x62, 0x1e,
- 0xda, 0xfa, 0xc0, 0x39, 0x35, 0x6f, 0xd9, 0x33, 0x2d, 0x87, 0xcf, 0x15,
- 0x2f, 0x03, 0xe3, 0x08, 0x36, 0xef, 0x91, 0xd5, 0xa3, 0x85, 0x73, 0x63,
- 0x56, 0xf2, 0xad, 0x89, 0x7a, 0x5b, 0xa8, 0xf4, 0x0e, 0x7f, 0x64, 0x83,
- 0x2b, 0x9c, 0x0d, 0x0a, 0x29, 0xfd, 0x55, 0xf3, 0xe6, 0xe6, 0x3a, 0x87,
- 0x84, 0x3e, 0xcb, 0xbc, 0xaa, 0x6f, 0x35, 0xb4, 0xe1, 0x99, 0xdc, 0xda,
- 0x12, 0x0f, 0x67, 0xb4, 0xaf, 0x10, 0x08, 0x6d, 0x89, 0x11, 0x7c, 0x87,
- 0x71, 0x0a, 0xc7, 0x2f, 0xd7, 0xce, 0x52, 0xaa, 0x4d, 0xcc, 0xbc, 0x5f,
- 0xc8, 0x80, 0xb7, 0xce, 0xed, 0x6a, 0xd1, 0x73, 0xc9, 0x23, 0x25, 0x3f,
- 0x07, 0x2b, 0x02, 0x42, 0x3a, 0x81, 0x7e, 0x77, 0x4a, 0x02, 0x38, 0x05,
- 0x85, 0xcf, 0x2e, 0xe5, 0x14, 0x78, 0x26, 0xe4, 0xea, 0x6a, 0x5b, 0xaa,
- 0xcd, 0x4a, 0x80, 0xc9, 0xa5, 0x13, 0xb1, 0x70, 0x15, 0x20, 0x1e, 0x2d,
- 0x29, 0x42, 0x02, 0x49, 0xb7, 0x12, 0xb8, 0x9c, 0x77, 0x6e, 0x1d, 0xff,
- 0xc5, 0x19, 0xf5, 0x02, 0x27, 0x1b, 0x1b, 0x1b, 0xaf, 0x8f, 0x2f, 0x0f,
- 0x4f, 0x4e, 0x8f, 0x5f, 0x27, 0x27, 0xef, 0xde, 0x9c, 0x5d, 0xbc, 0x3d,
- 0xbc, 0x14, 0x38, 0xc6, 0x6b, 0xeb, 0x91, 0x73, 0x75, 0x8a, 0xa4, 0x18,
- 0x87, 0xe7, 0xad, 0xc3, 0x16, 0x36, 0xab, 0x78, 0x2d, 0x75, 0x88, 0x79,
- 0x1a, 0xb2, 0xd6, 0x1c, 0x6c, 0x68, 0x5d, 0x06, 0x57, 0xd7, 0x89, 0xf4,
- 0x82, 0x1d, 0x1b, 0x7b, 0x1f, 0xea, 0x74, 0x5a, 0xa6, 0x15, 0x62, 0x42,
- 0x5d, 0xdb, 0x94, 0x2d, 0xd3, 0xc7, 0x77, 0x22, 0x2d, 0x27, 0x27, 0xfa,
- 0x63, 0x4f, 0x0e, 0x4e, 0x76, 0xb8, 0x20, 0xac, 0x47, 0xfa, 0xad, 0x94,
- 0x3b, 0xc8, 0xdb, 0xa7, 0x76, 0x3c, 0x8a, 0x8d, 0xab, 0x12, 0xa8, 0x12,
- 0xbf, 0x4d, 0x4b, 0x1c, 0x81, 0x15, 0x35, 0x5a, 0x00, 0xa3, 0x7f, 0xb8,
- 0x2c, 0x92, 0xb7, 0xbe, 0x39, 0x97, 0x4d, 0x98, 0x11, 0xf8, 0x08, 0x98,
- 0x22, 0x22, 0x41, 0xa9, 0xcd, 0x4a, 0xd9, 0xb3, 0x0e, 0x62, 0x16, 0x2b,
- 0xb0, 0x35, 0x3a, 0x27, 0x24, 0x99, 0x7e, 0x53, 0x5b, 0x36, 0x5e, 0x6f,
- 0x34, 0xa6, 0xc1, 0x89, 0x50, 0xba, 0xd2, 0x5c, 0x6c, 0x6f, 0xa0, 0x8a,
- 0xc6, 0x5d, 0xa1, 0x6c, 0x59, 0x16, 0x40, 0xea, 0x2c, 0xfe, 0x7c, 0xc7,
- 0x2b, 0x9d, 0x86, 0xd3, 0xe6, 0xce, 0xad, 0x16, 0xf8, 0x18, 0xbc, 0x36,
- 0x0f, 0x4d, 0x97, 0xf3, 0x45, 0xbb, 0x5a, 0x2e, 0xfb, 0xf2, 0x74, 0x09,
- 0x59, 0x69, 0x83, 0xf2, 0x01, 0xc7, 0xcf, 0x1b, 0x99, 0x03, 0x1e, 0x07,
- 0xf6, 0x77, 0xa3, 0xa1, 0x40, 0x94, 0x6b, 0xb4, 0xd1, 0xbb, 0x6e, 0xfd,
- 0xbb, 0xb6, 0xe6, 0x82, 0x09, 0x19, 0xd9, 0x67, 0xbb, 0x05, 0xf3, 0x52,
- 0x07, 0x51, 0xc2, 0xfc, 0x6f, 0x29, 0x41, 0x10, 0x6d, 0x59, 0x69, 0x50,
- 0xae, 0x8a, 0x30, 0xf8, 0xd8, 0x1a, 0x94, 0xff, 0x62, 0x1b, 0xd2, 0xe3,
- 0x4b, 0x7a, 0xfd, 0xb4, 0xe3, 0xc3, 0xe9, 0xf6, 0x40, 0xa4, 0xb8, 0x91,
- 0x27, 0xf7, 0x4a, 0x15, 0x4f, 0x64, 0x6e, 0x80, 0x1b, 0x91, 0xb3, 0x14,
- 0x19, 0xea, 0x22, 0x29, 0x11, 0x10, 0xd3, 0xed, 0xbb, 0x04, 0xff, 0x79,
- 0xf9, 0x91, 0x6c, 0x79, 0xad, 0x7b, 0xe8, 0x65, 0xe1, 0x31, 0xf8, 0x4c,
- 0x38, 0xb6, 0x20, 0xf4, 0x8a, 0x0d, 0xe5, 0xea, 0xd1, 0x97, 0x14, 0xc2,
- 0x08, 0xe9, 0xcf, 0xb5, 0x9a, 0x21, 0xe4, 0xc9, 0xa8, 0xce, 0xd2, 0x1a,
- 0x06, 0x15, 0x72, 0x71, 0xf8, 0xce, 0xb0, 0x6e, 0x58, 0x47, 0xeb, 0xe4,
- 0x15, 0x82, 0x82, 0x88, 0x9e, 0x26, 0x2f, 0xe9, 0x59, 0xa2, 0xcd, 0xd0,
- 0x43, 0xc1, 0xb8, 0x7b, 0xdb, 0x8a, 0x06, 0x38, 0x4c, 0x33, 0x5c, 0xcb,
- 0x99, 0xd1, 0xa4, 0xe7, 0xf4, 0x40, 0xaa, 0x1a, 0x7e, 0xcf, 0xd5, 0xec,
- 0xe8, 0x2d, 0x6e, 0xcc, 0x37, 0x7a, 0xa8, 0x4f, 0xde, 0x8c, 0x4d, 0xd7,
- 0x03, 0x01, 0x3a, 0xe5, 0xc7, 0x5f, 0x5d, 0xa4, 0x57, 0x69, 0x36, 0xfb,
- 0xe3, 0xfe, 0xee, 0x28, 0xbd, 0x5e, 0xce, 0xd2, 0x7f, 0xc7, 0x8b, 0xaf,
- 0x9e, 0x3c, 0xd9, 0xdf, 0xfd, 0xec, 0xf3, 0xdd, 0x5e, 0x17, 0x7d, 0x20,
- 0x88, 0x2c, 0x45, 0xd8, 0xd0, 0x4d, 0x06, 0xb9, 0x8b, 0xef, 0x0c, 0x27,
- 0xd7, 0x39, 0x8c, 0x3a, 0x52, 0x94, 0x64, 0x0e, 0x52, 0xb6, 0x26, 0x21,
- 0x26, 0xa5, 0x9c, 0x9e, 0xb9, 0x71, 0xcd, 0xbe, 0xfe, 0xc3, 0xde, 0x01,
- 0x8b, 0xb2, 0x6b, 0x38, 0xdf, 0x53, 0xde, 0xb1, 0xc9, 0xcb, 0xbc, 0x30,
- 0x37, 0xd0, 0x17, 0x49, 0x93, 0x5e, 0xdb, 0xbd, 0x2a, 0x79, 0xf3, 0x69,
- 0xe3, 0x96, 0xb3, 0x41, 0x88, 0x9a, 0x54, 0xab, 0x61, 0xb2, 0x05, 0x76,
- 0x84, 0xcd, 0x1a, 0x4a, 0xd6, 0x22, 0xab, 0x50, 0x03, 0xf9, 0xba, 0x4a,
- 0xe7, 0x9a, 0xab, 0x42, 0xef, 0x13, 0x6c, 0x6d, 0xb8, 0x98, 0x69, 0x1d,
- 0x7a, 0xf6, 0x5b, 0xe4, 0x6e, 0xc3, 0xcd, 0x16, 0xb5, 0x2b, 0x2f, 0xc7,
- 0xd7, 0xcd, 0x89, 0x54, 0xe5, 0xd9, 0x24, 0x97, 0x4a, 0x8f, 0x7d, 0x2a,
- 0x3d, 0x8c, 0x8a, 0x45, 0x06, 0xa4, 0xd9, 0x54, 0x47, 0x3a, 0xc4, 0xdf,
- 0xc1, 0xf3, 0x90, 0x32, 0x13, 0x59, 0x6f, 0xc1, 0x99, 0xd5, 0xb6, 0x42,
- 0x0b, 0x3b, 0xdf, 0xf2, 0xd6, 0xb8, 0x52, 0x87, 0xd9, 0x4c, 0x5e, 0xaa,
- 0x97, 0x68, 0xef, 0x8b, 0x57, 0xd8, 0x10, 0x7b, 0x5f, 0xfc, 0xbb, 0xfd,
- 0xd9, 0xbe, 0xfc, 0x6c, 0xff, 0x8b, 0x7f, 0x1f, 0x0e, 0xd1, 0x3f, 0xda,
- 0x21, 0x9b, 0xfa, 0xeb, 0x4d, 0xe1, 0x55, 0x49, 0xe5, 0x08, 0xf3, 0xbf,
- 0x6c, 0x2d, 0x6e, 0x5e, 0xeb, 0x9e, 0x7e, 0xd9, 0x9f, 0xe5, 0xbe, 0x44,
- 0x54, 0xad, 0xdc, 0xca, 0x6b, 0x9f, 0x9c, 0xaa, 0x8e, 0x4d, 0xba, 0x8d,
- 0x83, 0xa0, 0x1d, 0x41, 0x5f, 0xe2, 0xe5, 0xff, 0xa0, 0x9d, 0xfa, 0x1f,
- 0x1b, 0x89, 0x44, 0x37, 0x69, 0x39, 0xee, 0x11, 0xf0, 0xd0, 0x6d, 0x6b,
- 0x1e, 0x4d, 0x1b, 0x21, 0x64, 0xa5, 0x96, 0x29, 0x01, 0x84, 0xee, 0x40,
- 0xaf, 0x46, 0xc9, 0x9f, 0xa4, 0xac, 0x23, 0x2f, 0xf8, 0x46, 0x62, 0x9f,
- 0xe1, 0x44, 0x19, 0xa3, 0x63, 0x34, 0x24, 0x1d, 0xf0, 0xec, 0x1f, 0x7f,
- 0xf8, 0x41, 0x14, 0x2a, 0xf3, 0x17, 0xe9, 0xf9, 0x8d, 0x91, 0x45, 0x53,
- 0x23, 0xde, 0xe6, 0x28, 0x7a, 0x20, 0x85, 0x65, 0xe4, 0xca, 0xbf, 0x92,
- 0x91, 0x72, 0x23, 0x66, 0x69, 0xb9, 0xc8, 0x3c, 0xf5, 0x0d, 0x93, 0x7a,
- 0xcc, 0x62, 0x0c, 0x7b, 0x73, 0x0b, 0x10, 0x0f, 0x07, 0x4b, 0xf4, 0xb7,
- 0x3e, 0xad, 0x1d, 0x96, 0x1d, 0xbb, 0xdf, 0x34, 0xa6, 0x06, 0xb8, 0x2c,
- 0x25, 0xf6, 0x2c, 0x6b, 0x39, 0xaf, 0x7a, 0xfc, 0xe0, 0x75, 0xde, 0x93,
- 0x20, 0x16, 0xff, 0xa4, 0xe7, 0x68, 0x72, 0x78, 0x3d, 0xb0, 0x68, 0xaf,
- 0x58, 0x75, 0xca, 0xff, 0x9e, 0xbd, 0xda, 0xdb, 0x8d, 0x3f, 0x81, 0xa8,
- 0x2d, 0x0a, 0xd7, 0xbb, 0x80, 0xe0, 0xba, 0xe7, 0xf3, 0x29, 0x3f, 0x2d,
- 0x25, 0x59, 0x51, 0x1f, 0xe7, 0x55, 0x6f, 0x4c, 0x37, 0x2c, 0xfd, 0xff,
- 0x15, 0xfd, 0x40, 0xc4, 0x4a, 0x9e, 0xad, 0x97, 0xe3, 0x79, 0xde, 0xea,
- 0xf0, 0x0e, 0x0d, 0xf0, 0x0b, 0x1a, 0xf0, 0xf7, 0x99, 0xdd, 0x1d, 0x19,
- 0xa9, 0x76, 0xac, 0xfb, 0x6d, 0x5e, 0x95, 0xe5, 0x38, 0xad, 0x36, 0x25,
- 0x9c, 0xa3, 0xfd, 0xdc, 0xdc, 0xdb, 0x7f, 0xf2, 0xf4, 0xd9, 0xe6, 0x50,
- 0xf4, 0x34, 0x88, 0x88, 0xc6, 0xa7, 0xa2, 0xe0, 0x26, 0x2c, 0x89, 0x02,
- 0x83, 0xad, 0x91, 0x16, 0x1f, 0x0b, 0xae, 0x92, 0x14, 0xa3, 0xcf, 0xbd,
- 0xe2, 0xaf, 0xfd, 0x3b, 0x7d, 0xe7, 0x15, 0x3e, 0xf1, 0xef, 0xf9, 0xf4,
- 0x95, 0x1d, 0xe1, 0xbf, 0xd3, 0x58, 0x5e, 0xc9, 0x20, 0xcc, 0xba, 0x6a,
- 0x1a, 0x62, 0xbd, 0xbd, 0x11, 0x95, 0x6b, 0xd1, 0xc5, 0xd5, 0x45, 0xdc,
- 0xc0, 0xa0, 0x81, 0x60, 0x18, 0x4c, 0x39, 0xfa, 0x01, 0x6d, 0xd5, 0xe5,
- 0xe0, 0xed, 0x7c, 0x1a, 0x98, 0x56, 0x06, 0xd4, 0xca, 0xc0, 0x09, 0x6c,
- 0xf0, 0xb9, 0x0d, 0x68, 0x21, 0xfa, 0x92, 0x88, 0x39, 0x83, 0x97, 0x45,
- 0x54, 0x81, 0xb2, 0x04, 0x08, 0xe0, 0xe8, 0xeb, 0x93, 0x4d, 0x01, 0xde,
- 0xb0, 0x99, 0xd8, 0x8f, 0xf9, 0xa7, 0x2d, 0xc4, 0x70, 0x92, 0x2e, 0xe8,
- 0xf4, 0x6f, 0x24, 0x42, 0x86, 0x99, 0x12, 0x8e, 0x84, 0xbe, 0xcb, 0x59,
- 0xd3, 0xe6, 0x63, 0x72, 0xeb, 0xcc, 0xc8, 0xe3, 0x5d, 0x31, 0xd3, 0x9c,
- 0xd7, 0x8c, 0x99, 0x97, 0x5a, 0x00, 0x25, 0x88, 0xf9, 0x2c, 0x6c, 0xc2,
- 0xe5, 0xe0, 0x8d, 0x0d, 0x7a, 0xda, 0x04, 0x3f, 0x79, 0xd4, 0xfc, 0x8a,
- 0xe5, 0x89, 0x8a, 0x88, 0xde, 0x50, 0x8b, 0xee, 0xf2, 0x4e, 0xf0, 0xa5,
- 0x07, 0x12, 0xff, 0xc7, 0x99, 0xa4, 0x69, 0xb2, 0xdb, 0x84, 0x15, 0x43,
- 0x92, 0x9f, 0x2f, 0x6d, 0xad, 0xa9, 0x2f, 0x12, 0x10, 0xda, 0xf2, 0x5b,
- 0x12, 0x77, 0x6c, 0xd5, 0x7e, 0xc6, 0x4b, 0x62, 0x1e, 0xd8, 0x10, 0x98,
- 0x87, 0xc6, 0x11, 0xc5, 0xc0, 0xa7, 0xd4, 0x1b, 0xdf, 0x8b, 0xb3, 0x81,
- 0x5a, 0xd8, 0xfc, 0x33, 0x0e, 0xc1, 0x4b, 0x5a, 0x06, 0xfc, 0xfa, 0x8b,
- 0xcd, 0x0d, 0x5b, 0x6c, 0xc5, 0x6a, 0xee, 0x9d, 0x00, 0x32, 0x6f, 0x50,
- 0x7f, 0x3c, 0x46, 0xa1, 0x56, 0xbe, 0x43, 0xd6, 0xc6, 0x88, 0xa0, 0x03,
- 0x4c, 0xf4, 0x46, 0x9b, 0x9a, 0x51, 0xba, 0x73, 0xcb, 0x41, 0xcd, 0x8d,
- 0x9b, 0x5f, 0xb0, 0x5d, 0xb0, 0x49, 0x68, 0x55, 0xbc, 0xb7, 0x69, 0xe9,
- 0x13, 0xe1, 0x33, 0x85, 0xc0, 0xab, 0x32, 0xad, 0xa0, 0xb8, 0x21, 0x89,
- 0xf9, 0x4e, 0x9b, 0xf7, 0x07, 0x56, 0x7b, 0xca, 0x83, 0x4b, 0x73, 0x64,
- 0xd6, 0x9a, 0xe0, 0x88, 0xbc, 0xa1, 0x1c, 0x62, 0xf9, 0xe8, 0x2b, 0x9a,
- 0xee, 0xbd, 0xe1, 0x75, 0x7e, 0xc5, 0x93, 0x61, 0x44, 0xe4, 0x75, 0xb6,
- 0x63, 0xfe, 0xd9, 0x37, 0x3f, 0xdf, 0x27, 0xad, 0x8c, 0xfe, 0xf2, 0x04,
- 0x78, 0x2c, 0xff, 0xee, 0xf7, 0xce, 0x86, 0x3d, 0x17, 0xf4, 0x97, 0xdc,
- 0xde, 0xf9, 0x12, 0xd5, 0x91, 0x5e, 0x0e, 0x94, 0xd1, 0x10, 0xc9, 0x75,
- 0xaa, 0x6a, 0xfa, 0xa0, 0x12, 0x32, 0xb4, 0xc8, 0x24, 0x5d, 0x52, 0x56,
- 0x8b, 0x05, 0x8f, 0x08, 0x90, 0x42, 0x14, 0x75, 0xd2, 0xbb, 0x73, 0x71,
- 0xcf, 0x50, 0x16, 0x10, 0x6e, 0xd6, 0xec, 0x6e, 0xbb, 0xef, 0x23, 0x6d,
- 0x8d, 0x78, 0xbf, 0xa5, 0xbc, 0xfa, 0xd9, 0xbd, 0x9f, 0x91, 0x49, 0x9f,
- 0xdf, 0x92, 0xc2, 0x64, 0xc4, 0xc4, 0x27, 0x99, 0xc6, 0x58, 0xe6, 0xbc,
- 0xbb, 0x82, 0xed, 0xe2, 0x5e, 0x0c, 0xe4, 0xcb, 0xeb, 0x66, 0x9b, 0x3e,
- 0x93, 0xcd, 0x6a, 0xd8, 0xea, 0x52, 0xd5, 0x4f, 0xbf, 0x2a, 0xc0, 0x03,
- 0xfe, 0xd0, 0xa6, 0x7f, 0xf6, 0xcb, 0x49, 0x93, 0x19, 0x5b, 0x97, 0xf8,
- 0xb3, 0xe6, 0x2c, 0xe7, 0x8e, 0xe7, 0x4c, 0x86, 0x8a, 0x2d, 0x3c, 0x1b,
- 0xf0, 0xed, 0x29, 0x2a, 0xd1, 0xe0, 0xcd, 0x30, 0x39, 0x05, 0x62, 0xbc,
- 0x4e, 0x99, 0xa1, 0x45, 0x6f, 0x58, 0xdd, 0x0d, 0x66, 0xeb, 0xb0, 0x0e,
- 0xbe, 0xc1, 0x35, 0xdc, 0x88, 0x14, 0x43, 0xb7, 0x14, 0xa8, 0xe9, 0x9c,
- 0xd1, 0xc9, 0xfa, 0x85, 0xe8, 0x23, 0x7d, 0xf8, 0xc2, 0xed, 0x73, 0xf0,
- 0xf9, 0xdb, 0x32, 0xec, 0xde, 0x86, 0xf5, 0x1a, 0x61, 0xd0, 0x96, 0x28,
- 0xa0, 0x9e, 0x58, 0xb7, 0x87, 0x80, 0x21, 0x95, 0x19, 0x3b, 0x5d, 0x88,
- 0x9d, 0x81, 0x68, 0x62, 0x10, 0x13, 0x36, 0xad, 0x61, 0x97, 0x51, 0xc9,
- 0x35, 0xda, 0x46, 0x3d, 0xd8, 0x8d, 0xb3, 0xcc, 0x1a, 0xd7, 0xbc, 0x56,
- 0xa5, 0x85, 0x9b, 0xc3, 0x17, 0x23, 0x84, 0x9c, 0x36, 0x5c, 0x47, 0x9d,
- 0xa4, 0x7e, 0xa5, 0xb7, 0xe6, 0x2f, 0xa4, 0x9c, 0x8d, 0x2b, 0xb3, 0xea,
- 0x59, 0xc5, 0x57, 0x03, 0x63, 0x84, 0xbc, 0xfa, 0x73, 0xdf, 0x5c, 0xbe,
- 0x3d, 0x4d, 0x94, 0xe9, 0xe6, 0xca, 0xa9, 0x8a, 0x8a, 0xcc, 0xc4, 0x10,
- 0xc5, 0x33, 0xc2, 0xfa, 0x90, 0x3c, 0xc5, 0xb7, 0x1c, 0xcf, 0x2d, 0xe5,
- 0xca, 0x27, 0xa8, 0x43, 0xef, 0x1f, 0x59, 0xef, 0x09, 0x7e, 0x95, 0xf6,
- 0x91, 0xd9, 0x26, 0x9b, 0x34, 0x05, 0x9b, 0xfd, 0x64, 0x93, 0xba, 0x4a,
- 0xbf, 0xd8, 0xc4, 0x7c, 0xe2, 0xc7, 0xde, 0xf4, 0x6d, 0x0e, 0x23, 0xa7,
- 0x90, 0x9e, 0x79, 0xf5, 0x65, 0x6b, 0x96, 0xf0, 0x73, 0x6d, 0xea, 0x15,
- 0xa7, 0x99, 0x04, 0x3a, 0xb7, 0xbe, 0xeb, 0xb5, 0xff, 0xea, 0xa8, 0x24,
- 0x2e, 0x42, 0xaa, 0x6f, 0xe7, 0x60, 0xae, 0x13, 0xfb, 0xb3, 0x1c, 0x39,
- 0xb3, 0x41, 0x43, 0x0f, 0x9f, 0xe2, 0x4b, 0x15, 0x45, 0x16, 0x02, 0xca,
- 0xd2, 0x8d, 0xb7, 0x80, 0x4a, 0x5e, 0xb3, 0x9a, 0x39, 0xdb, 0x7d, 0x77,
- 0x25, 0xbc, 0x0c, 0x90, 0x39, 0x7b, 0x43, 0xe4, 0x50, 0x3a, 0x56, 0x66,
- 0xdb, 0x80, 0x35, 0xde, 0x7b, 0x98, 0xd0, 0x9e, 0x45, 0xe5, 0xaa, 0x49,
- 0xaf, 0xb3, 0x1c, 0x93, 0x5d, 0x8b, 0x7c, 0x82, 0x62, 0xd1, 0xaf, 0xbe,
- 0x9c, 0x96, 0xd7, 0x24, 0xb9, 0xfa, 0xe6, 0xa0, 0xd1, 0x9f, 0x00, 0x24,
- 0xef, 0xcb, 0x47, 0xb9, 0xc3, 0x38, 0x2b, 0xac, 0xc5, 0xeb, 0xbf, 0x57,
- 0x40, 0x54, 0xdf, 0x90, 0x2b, 0x74, 0x22, 0x6d, 0xdb, 0xa6, 0x79, 0x3d,
- 0x4c, 0xfb, 0xf6, 0x17, 0xfe, 0xb7, 0x74, 0x72, 0x52, 0x69, 0x99, 0xeb,
- 0x0c, 0x4a, 0x21, 0xc6, 0xd9, 0xbd, 0x2d, 0x3b, 0x03, 0x07, 0x17, 0x11,
- 0x2b, 0xf3, 0xbd, 0x35, 0x93, 0xc4, 0xbe, 0xcd, 0x2f, 0x37, 0x39, 0x47,
- 0x60, 0xf3, 0xe5, 0x26, 0x24, 0x18, 0xc9, 0xa5, 0xf9, 0x38, 0x43, 0xfa,
- 0x99, 0x5c, 0x4e, 0x9b, 0x7c, 0x2b, 0x0e, 0x58, 0x77, 0x10, 0x6e, 0x3f,
- 0x77, 0x40, 0x70, 0x2d, 0x3b, 0x33, 0xd2, 0x07, 0x4f, 0xc2, 0x4d, 0x80,
- 0x02, 0x07, 0xe8, 0x15, 0x91, 0x95, 0x8e, 0x1b, 0x06, 0xca, 0xc8, 0xa5,
- 0x0b, 0xb5, 0x0c, 0x7c, 0x29, 0x54, 0xcc, 0x44, 0xdc, 0x9c, 0xcb, 0x62,
- 0x41, 0xd9, 0xf1, 0x13, 0x94, 0x26, 0x97, 0xb3, 0x34, 0x4c, 0xde, 0x17,
- 0x53, 0x2e, 0x4e, 0x4c, 0xc6, 0x72, 0x5e, 0x4d, 0x96, 0x73, 0x72, 0x55,
- 0x4c, 0xc8, 0x41, 0x86, 0x8b, 0x87, 0xd5, 0x83, 0x56, 0x78, 0xde, 0xef,
- 0x30, 0x3b, 0x47, 0xd8, 0x61, 0x2e, 0xdf, 0x05, 0x14, 0x85, 0x00, 0x58,
- 0xe2, 0x10, 0x87, 0x56, 0x60, 0x79, 0x53, 0x44, 0x00, 0x51, 0x64, 0xf0,
- 0xf8, 0xcd, 0xf1, 0xc5, 0xc5, 0xf1, 0x05, 0xcd, 0xf7, 0x61, 0xa7, 0xbe,
- 0x8f, 0x12, 0xa5, 0xba, 0x50, 0xa3, 0xc2, 0x7e, 0xc3, 0xe2, 0xf0, 0x2c,
- 0x0a, 0xa5, 0x06, 0x0e, 0x2c, 0x08, 0x66, 0x0a, 0x62, 0x9e, 0x75, 0xdf,
- 0xbd, 0x08, 0xd8, 0xb7, 0x0d, 0x1b, 0x00, 0x06, 0x05, 0x07, 0x64, 0x4b,
- 0xb7, 0x70, 0x2d, 0x54, 0x42, 0xbd, 0xbd, 0xd4, 0x9c, 0xfc, 0x9b, 0xac,
- 0xa5, 0xa6, 0x0e, 0x05, 0xa9, 0x9b, 0x49, 0x30, 0x7d, 0x66, 0xfd, 0x13,
- 0x18, 0xf2, 0x15, 0x9d, 0x51, 0xb2, 0x9d, 0x30, 0x19, 0x75, 0xb3, 0x5c,
- 0xe4, 0x53, 0xeb, 0xed, 0x35, 0x3f, 0x37, 0xea, 0x5f, 0xc2, 0xa7, 0xbc,
- 0x56, 0xac, 0x0b, 0xa2, 0x9a, 0xea, 0x8c, 0xf0, 0xbd, 0x6d, 0x9d, 0x62,
- 0xaf, 0x09, 0xf2, 0xe5, 0x18, 0x34, 0xa6, 0xd4, 0xc7, 0xed, 0xec, 0x72,
- 0xd9, 0xfb, 0x19, 0xbc, 0x8c, 0x24, 0x2d, 0x14, 0x7e, 0xe3, 0x4b, 0x06,
- 0xf2, 0x65, 0xcd, 0x1d, 0xde, 0xdd, 0x15, 0x87, 0xbc, 0x40, 0x52, 0x69,
- 0x75, 0x90, 0xfc, 0x58, 0xe7, 0x93, 0x9f, 0xdd, 0xe5, 0x81, 0xf4, 0x1f,
- 0x07, 0x49, 0x67, 0x0f, 0xbd, 0x19, 0xbc, 0x4c, 0x94, 0x18, 0xc3, 0x9c,
- 0xcc, 0xfd, 0x7e, 0x74, 0x7c, 0x91, 0x1c, 0x7e, 0x4d, 0x9c, 0xbf, 0xff,
- 0xe4, 0x02, 0xd3, 0x73, 0x72, 0x3b, 0x6c, 0x08, 0xc7, 0x82, 0xb0, 0x9b,
- 0x64, 0xea, 0x0a, 0x97, 0xda, 0x52, 0x47, 0x6d, 0x80, 0x1b, 0xf7, 0xca,
- 0xa3, 0xa1, 0x68, 0xad, 0x21, 0xb9, 0x0b, 0x1f, 0x58, 0xc5, 0xc7, 0xac,
- 0x21, 0x1d, 0x32, 0x7f, 0x15, 0x99, 0x17, 0x89, 0x43, 0x12, 0xba, 0x36,
- 0xd2, 0xfb, 0x3a, 0x30, 0x3b, 0x79, 0x95, 0x0e, 0x93, 0xcd, 0xb7, 0xe5,
- 0xdf, 0x8d, 0x32, 0x90, 0xee, 0x3c, 0x19, 0xee, 0x26, 0x5b, 0xdf, 0xe7,
- 0xc5, 0x8b, 0x67, 0x7f, 0x4e, 0x4e, 0xb6, 0x37, 0x5b, 0x60, 0x7e, 0xae,
- 0x65, 0x30, 0x4e, 0x8b, 0x8f, 0x76, 0xc9, 0xce, 0x70, 0xb2, 0x19, 0x54,
- 0x27, 0xce, 0x87, 0x9a, 0x09, 0xbf, 0x57, 0xb6, 0x88, 0xd4, 0x4f, 0xc9,
- 0x0b, 0x48, 0xbe, 0xb3, 0x25, 0x92, 0xc9, 0xca, 0x37, 0x4f, 0x4d, 0x69,
- 0xea, 0x5e, 0x3c, 0x0b, 0x9a, 0x78, 0x6a, 0xdb, 0x78, 0xcf, 0x6d, 0xfc,
- 0xc2, 0x26, 0xf6, 0x87, 0xbb, 0xfb, 0xc9, 0xd6, 0xd9, 0x68, 0x67, 0xdf,
- 0xb6, 0x10, 0x36, 0xb1, 0x8f, 0x26, 0xe8, 0xa1, 0xf6, 0xcb, 0x4f, 0xe9,
- 0xfb, 0x3f, 0x66, 0xc5, 0xcf, 0xc9, 0xd6, 0x0f, 0x7b, 0x7b, 0xa6, 0x81,
- 0x3f, 0x27, 0x87, 0x27, 0x3f, 0x24, 0x4f, 0x87, 0xa6, 0xb1, 0x77, 0xe9,
- 0xad, 0x34, 0x27, 0xb4, 0xb5, 0x23, 0x34, 0x62, 0x7e, 0x1f, 0xb4, 0xf1,
- 0xac, 0xd3, 0xc6, 0xa9, 0xb1, 0x0b, 0x3f, 0x99, 0x6b, 0x65, 0x77, 0xf8,
- 0x64, 0x3f, 0xc9, 0x9f, 0x7d, 0xfe, 0x5c, 0x1b, 0x92, 0x36, 0xf0, 0xfb,
- 0xb6, 0xb7, 0x92, 0x09, 0x53, 0x8c, 0xaa, 0x73, 0xfc, 0xc9, 0x08, 0x34,
- 0x88, 0x88, 0x8a, 0x3c, 0x85, 0x37, 0x69, 0x35, 0x95, 0xed, 0x46, 0x45,
- 0x0e, 0xcc, 0x4a, 0x09, 0x69, 0x74, 0x06, 0xb7, 0xa5, 0xb9, 0x38, 0x0f,
- 0x82, 0xee, 0x90, 0x6d, 0xaa, 0x8f, 0xfe, 0x39, 0x79, 0x3b, 0x3a, 0x39,
- 0x36, 0x23, 0xda, 0x35, 0x5d, 0x73, 0x73, 0xc8, 0x1d, 0xc2, 0xaf, 0x30,
- 0xb9, 0x2f, 0xc0, 0x3f, 0x2a, 0x6d, 0xa8, 0xce, 0xcd, 0x40, 0x56, 0xb3,
- 0xe9, 0xcc, 0xc5, 0x5d, 0xe3, 0xbb, 0x04, 0x49, 0x19, 0x1c, 0x5e, 0x93,
- 0x09, 0xc1, 0x57, 0x2d, 0x3e, 0xfd, 0x6d, 0x59, 0x98, 0x63, 0x52, 0x95,
- 0x15, 0x21, 0xa7, 0x36, 0x5b, 0xda, 0xc2, 0xb7, 0xaf, 0x8f, 0x39, 0xa9,
- 0xfe, 0x6d, 0x5a, 0x18, 0x19, 0x49, 0xe4, 0x58, 0xf5, 0x47, 0x8a, 0xff,
- 0x73, 0x38, 0x87, 0xdf, 0x3f, 0xbd, 0x2f, 0x3e, 0x99, 0x75, 0xfc, 0x6c,
- 0xb8, 0x47, 0x90, 0x6d, 0xb2, 0x7a, 0xdf, 0xbc, 0x35, 0xff, 0xde, 0x7b,
- 0xba, 0x99, 0xd0, 0xaf, 0xda, 0x16, 0xbc, 0x9e, 0xd7, 0x8d, 0xa3, 0xb3,
- 0xb3, 0x6f, 0x4f, 0x18, 0x00, 0x72, 0x24, 0x6e, 0x55, 0x52, 0xae, 0xac,
- 0x55, 0xcc, 0xd2, 0xd5, 0x58, 0x6f, 0x2e, 0x5b, 0x09, 0xc1, 0xb8, 0x8f,
- 0x59, 0xb6, 0x20, 0x34, 0x42, 0xd3, 0x91, 0x08, 0x8d, 0xc8, 0x68, 0x8b,
- 0x6d, 0x22, 0xf5, 0xa7, 0xc3, 0xce, 0xd8, 0xd4, 0xd6, 0x85, 0x3b, 0xbe,
- 0xb7, 0xc4, 0x1d, 0xa9, 0x2b, 0xdd, 0x88, 0x2e, 0xda, 0x6c, 0x05, 0x75,
- 0x41, 0x63, 0x85, 0xa9, 0x9c, 0x86, 0xd8, 0xbe, 0x9b, 0x23, 0xa3, 0xdd,
- 0x73, 0xa7, 0x0f, 0xc4, 0x6b, 0xbb, 0xe9, 0xb1, 0x48, 0x43, 0xa3, 0x45,
- 0xba, 0x0e, 0x43, 0xd4, 0xc8, 0x40, 0x10, 0xe0, 0xbc, 0xc8, 0x66, 0x54,
- 0xd6, 0xcd, 0x00, 0xcf, 0x7b, 0x77, 0xf8, 0xf6, 0xf8, 0xd5, 0x77, 0x87,
- 0xa7, 0xef, 0x8f, 0xcd, 0x2b, 0x39, 0x6a, 0x7e, 0x5b, 0x08, 0x1f, 0xfa,
- 0x38, 0xcf, 0x27, 0xe5, 0x8c, 0xa2, 0x4c, 0x9b, 0x7f, 0xde, 0xdc, 0x60,
- 0x78, 0x79, 0xd2, 0xa3, 0xb7, 0xf6, 0xf8, 0x35, 0xb3, 0x2f, 0xe8, 0x5f,
- 0xfb, 0xfc, 0xaf, 0xfd, 0x3f, 0xf7, 0xb6, 0x5b, 0x83, 0x0e, 0xac, 0x64,
- 0xda, 0x2f, 0x77, 0x5c, 0xac, 0x0c, 0x75, 0x4a, 0x91, 0xbb, 0xc1, 0xb3,
- 0xd2, 0xd3, 0x18, 0x8d, 0xde, 0x6d, 0xf4, 0xec, 0xd6, 0xf8, 0xde, 0xb7,
- 0xc1, 0x7b, 0xf4, 0xd2, 0x2b, 0x28, 0x18, 0xbd, 0xed, 0xbe, 0x55, 0x39,
- 0x10, 0x2a, 0xa7, 0x36, 0xb4, 0x89, 0xec, 0xd3, 0x82, 0x10, 0x91, 0x5b,
- 0x3d, 0xfe, 0xcb, 0xab, 0xd7, 0x87, 0x97, 0xc7, 0xf4, 0x82, 0x7e, 0x5e,
- 0xd0, 0x88, 0x36, 0x8d, 0x82, 0xfa, 0xb3, 0x25, 0xa1, 0xe9, 0x57, 0x34,
- 0xa0, 0xde, 0x36, 0xc7, 0x32, 0x10, 0x54, 0xef, 0xf4, 0xab, 0x2c, 0x14,
- 0xb8, 0xed, 0x12, 0xd5, 0x6b, 0x45, 0xac, 0x6c, 0xf5, 0xf8, 0x77, 0x3d,
- 0xeb, 0xc1, 0x95, 0x7a, 0x08, 0x12, 0xae, 0x9c, 0x22, 0xc9, 0x22, 0xc8,
- 0xac, 0x65, 0x48, 0x9a, 0x5b, 0x1f, 0x09, 0x56, 0xb0, 0xc7, 0xc9, 0xe3,
- 0xd5, 0xb6, 0x0b, 0x2f, 0x99, 0xf0, 0xe4, 0x63, 0x2a, 0xcb, 0xbd, 0xfd,
- 0x27, 0x7f, 0xc6, 0x7c, 0xbe, 0xea, 0xed, 0x98, 0xbb, 0xa1, 0xf7, 0x67,
- 0xfa, 0x74, 0xde, 0x78, 0x45, 0xa7, 0xe4, 0x33, 0x64, 0x4f, 0xc9, 0x8e,
- 0x62, 0xb8, 0x0c, 0xad, 0xba, 0xc7, 0xef, 0x83, 0x09, 0xbd, 0xe3, 0x2c,
- 0x31, 0x65, 0xc4, 0x51, 0xf0, 0x00, 0xd6, 0x0b, 0xd5, 0x72, 0x40, 0xd8,
- 0xcf, 0x4e, 0x5d, 0x7c, 0xce, 0xbf, 0x3f, 0xfa, 0xfc, 0x2e, 0x8f, 0x51,
- 0x18, 0x84, 0xe8, 0x9b, 0xf3, 0x7b, 0x4d, 0x24, 0xc3, 0xb7, 0xa0, 0x93,
- 0xf3, 0x9a, 0x05, 0x9a, 0xf1, 0x58, 0x7c, 0x3b, 0x6a, 0x8c, 0x40, 0x27,
- 0x30, 0xa2, 0xe5, 0x1e, 0x8a, 0x12, 0xd0, 0x06, 0x3e, 0xc8, 0x42, 0xef,
- 0xec, 0x74, 0x4c, 0x59, 0xe6, 0x36, 0x35, 0xc6, 0xb3, 0xca, 0xed, 0xd4,
- 0xeb, 0xf1, 0xcb, 0x3d, 0x6e, 0x26, 0xba, 0x28, 0x79, 0x2e, 0x6b, 0xeb,
- 0x43, 0x42, 0xb4, 0x51, 0x9e, 0x6d, 0xaf, 0x53, 0x27, 0x1f, 0x0d, 0xc3,
- 0x60, 0x93, 0x9e, 0xed, 0x63, 0x23, 0x6a, 0x8a, 0xac, 0x5a, 0x0b, 0xb0,
- 0x88, 0x04, 0xa3, 0x30, 0x44, 0x0f, 0xe9, 0x40, 0xef, 0x0c, 0x87, 0x43,
- 0x6b, 0xee, 0x20, 0x90, 0x26, 0x31, 0x28, 0x94, 0xf9, 0xf0, 0x98, 0x62,
- 0x31, 0xc7, 0x5b, 0x50, 0xe6, 0xa1, 0x50, 0x6f, 0x0b, 0xf0, 0x46, 0xfc,
- 0x04, 0xf6, 0x68, 0x78, 0x3e, 0x8e, 0x4d, 0xf9, 0xec, 0xa6, 0xd2, 0x36,
- 0x7c, 0x8c, 0x2d, 0xc2, 0x9a, 0xbe, 0xb1, 0xef, 0x51, 0xca, 0x64, 0x58,
- 0x39, 0x55, 0xda, 0xb9, 0xa0, 0x1d, 0x4c, 0x00, 0x72, 0xae, 0x12, 0x75,
- 0x6f, 0xcb, 0x63, 0x68, 0x57, 0xfa, 0x8c, 0x3d, 0x20, 0x21, 0x57, 0xde,
- 0x81, 0x06, 0x01, 0x64, 0x0b, 0x84, 0x3d, 0x29, 0xd8, 0x3d, 0xa0, 0x37,
- 0xc8, 0xc2, 0xaa, 0xcd, 0xd2, 0x8e, 0xb0, 0x06, 0x93, 0xcd, 0x0c, 0xdd,
- 0x5f, 0xb2, 0x1c, 0x85, 0x90, 0xa6, 0xd6, 0x24, 0x1e, 0xa3, 0xb6, 0x95,
- 0x73, 0x84, 0xbd, 0x64, 0xf0, 0xce, 0x5d, 0x45, 0x68, 0xb3, 0x01, 0x53,
- 0xba, 0x68, 0x22, 0xa2, 0x4a, 0x0f, 0x21, 0xf5, 0x58, 0x17, 0x2f, 0x9f,
- 0x68, 0x8b, 0x36, 0x58, 0xde, 0x99, 0x1b, 0x77, 0x2b, 0xb7, 0x45, 0x97,
- 0x99, 0x51, 0xf6, 0x2e, 0x33, 0x79, 0x86, 0x93, 0x7b, 0x49, 0x7a, 0x67,
- 0xae, 0x9e, 0x22, 0x23, 0x7c, 0x26, 0x90, 0x0e, 0xf0, 0xca, 0x9c, 0x7a,
- 0x7e, 0x46, 0x3b, 0x42, 0xad, 0xa2, 0x92, 0xba, 0x32, 0x2a, 0xc9, 0x16,
- 0x1b, 0x1a, 0x4c, 0x98, 0xab, 0x0e, 0x3d, 0x52, 0xc0, 0x5b, 0x35, 0xab,
- 0xd5, 0x3c, 0xa7, 0x9e, 0x1b, 0x11, 0x3d, 0x92, 0x7d, 0x93, 0x03, 0x97,
- 0x48, 0x7e, 0x0e, 0xc6, 0x55, 0xe8, 0x6c, 0x71, 0xe1, 0x76, 0xfd, 0x88,
- 0x8d, 0x4f, 0x8b, 0xfb, 0x89, 0xe0, 0xbd, 0xc5, 0x00, 0x54, 0x17, 0x1a,
- 0x12, 0x16, 0xf3, 0xea, 0xfa, 0x9a, 0xad, 0xb6, 0xa4, 0x3b, 0xb4, 0xf8,
- 0x26, 0x3b, 0xa5, 0x59, 0x21, 0x14, 0xf4, 0xfd, 0xaa, 0xd9, 0xbc, 0xb4,
- 0x15, 0xbc, 0xc4, 0xeb, 0xd2, 0xda, 0xcc, 0x1a, 0x93, 0xe4, 0x75, 0x6b,
- 0x6c, 0xd2, 0x15, 0x12, 0x34, 0xda, 0x31, 0xe4, 0xb3, 0x8b, 0x0d, 0x94,
- 0x48, 0x28, 0x1c, 0x21, 0x83, 0x2e, 0x3a, 0xf8, 0xf9, 0x1c, 0x02, 0xc5,
- 0x21, 0x51, 0xef, 0x2c, 0xd4, 0x0a, 0xdb, 0x35, 0x19, 0xa7, 0xce, 0xe4,
- 0xda, 0x48, 0x5a, 0xde, 0xde, 0x1a, 0xd5, 0xa6, 0x45, 0x0e, 0x95, 0xb7,
- 0x99, 0x23, 0x89, 0x74, 0x0e, 0x47, 0x47, 0xec, 0x2b, 0xa7, 0xdf, 0x0a,
- 0x93, 0x4e, 0x80, 0xd7, 0xca, 0x2b, 0x0c, 0xb2, 0x33, 0x2b, 0xc3, 0xc4,
- 0x6b, 0x92, 0x5d, 0x25, 0xa5, 0x2f, 0xe2, 0xb9, 0x6f, 0x12, 0xb7, 0xd6,
- 0x16, 0x79, 0x8f, 0x30, 0xc9, 0x8b, 0x67, 0x9a, 0x70, 0x79, 0x11, 0xe5,
- 0xc4, 0xb7, 0x18, 0x3d, 0x17, 0xff, 0xd5, 0x51, 0xf6, 0xec, 0x22, 0xf5,
- 0xb4, 0xfa, 0x00, 0x36, 0x01, 0xf6, 0x00, 0x29, 0x74, 0x36, 0x84, 0x7f,
- 0x29, 0xeb, 0x84, 0x9d, 0x0c, 0x0f, 0x5a, 0x47, 0x90, 0x06, 0x67, 0xce,
- 0x42, 0x34, 0x90, 0x87, 0x42, 0xac, 0xbe, 0x84, 0x2b, 0x18, 0x8c, 0x37,
- 0x38, 0xdf, 0x68, 0x30, 0x51, 0x89, 0xbe, 0x9e, 0xb0, 0x60, 0xdc, 0x3a,
- 0x98, 0x0f, 0x9d, 0xd3, 0xf3, 0x8b, 0xb3, 0xaf, 0x2f, 0x8e, 0x47, 0xa3,
- 0xe4, 0xed, 0xf1, 0x25, 0xdb, 0xfa, 0x97, 0x0c, 0xbd, 0xbb, 0x46, 0xc9,
- 0x5a, 0xc4, 0x1a, 0x94, 0xc3, 0x49, 0x21, 0x27, 0xea, 0x48, 0x40, 0xce,
- 0x13, 0x55, 0x63, 0xc5, 0xed, 0xc8, 0x46, 0xfc, 0x4c, 0x10, 0x7b, 0x37,
- 0xf0, 0xf6, 0x03, 0xd3, 0x84, 0x80, 0xa4, 0x75, 0x9e, 0x3b, 0x37, 0x2a,
- 0x14, 0x63, 0x46, 0x39, 0xd9, 0x9c, 0x43, 0xe7, 0x42, 0xa7, 0x2b, 0xdb,
- 0xfc, 0x89, 0xe1, 0xfd, 0xd1, 0xcc, 0xa6, 0xd4, 0x9f, 0xfa, 0xa3, 0x31,
- 0x7e, 0x65, 0x53, 0xfc, 0x31, 0xf9, 0xc1, 0xb4, 0x39, 0x35, 0xc6, 0xab,
- 0x14, 0xdb, 0x1c, 0xa1, 0xca, 0xa6, 0xab, 0x05, 0x96, 0x7b, 0x55, 0x64,
- 0x13, 0x4e, 0x31, 0xac, 0x1e, 0x28, 0x70, 0x07, 0x8a, 0x19, 0xa6, 0x3d,
- 0x12, 0x4c, 0x9d, 0xfd, 0xb2, 0x54, 0x23, 0x4a, 0x92, 0xd3, 0xec, 0x0a,
- 0x25, 0x72, 0xf1, 0x39, 0xd3, 0xdc, 0x2e, 0xf1, 0x3f, 0xef, 0xbd, 0xa5,
- 0x1f, 0xed, 0x26, 0x4f, 0x3e, 0x7f, 0xbe, 0xfb, 0x39, 0xff, 0x55, 0xff,
- 0xfb, 0xe2, 0xe9, 0xae, 0xf0, 0xa5, 0x9b, 0x7f, 0x3d, 0x3d, 0x78, 0xba,
- 0x77, 0x40, 0xf4, 0x8e, 0xbb, 0x07, 0xbb, 0xe6, 0xff, 0x3f, 0x95, 0x9f,
- 0x10, 0x87, 0xe5, 0x8b, 0xfd, 0xcf, 0x3f, 0x03, 0x1a, 0x86, 0xf6, 0xc7,
- 0xcc, 0x7c, 0x64, 0xd0, 0x94, 0x03, 0xb0, 0x4c, 0x41, 0xf3, 0xf9, 0x63,
- 0xdb, 0x13, 0x49, 0xe1, 0x75, 0x2a, 0xbf, 0x4b, 0x03, 0xb7, 0xc5, 0x07,
- 0xd5, 0xab, 0xca, 0xc4, 0x37, 0x7e, 0xc9, 0x34, 0x3b, 0x0c, 0x79, 0x9b,
- 0x2b, 0x78, 0x81, 0xb6, 0xad, 0xf5, 0x0e, 0x03, 0xcd, 0x3d, 0x86, 0xb8,
- 0x5f, 0xfa, 0x69, 0x4d, 0x24, 0xdf, 0x00, 0xef, 0x9b, 0x2c, 0x95, 0xbc,
- 0x37, 0xd1, 0x82, 0x4e, 0x7e, 0x45, 0xdb, 0x4e, 0x19, 0xd8, 0x5f, 0xfa,
- 0x3d, 0xf6, 0x5c, 0xd1, 0x5b, 0xb2, 0x1b, 0x92, 0xf0, 0x6b, 0x36, 0x17,
- 0x21, 0xf2, 0xad, 0xd6, 0xe6, 0xd9, 0x70, 0xcb, 0xef, 0x66, 0xca, 0x2b,
- 0xe7, 0x6a, 0x73, 0xb8, 0xb8, 0xa0, 0x6b, 0x64, 0xc8, 0x41, 0x73, 0xef,
- 0x17, 0x7e, 0x7b, 0x8f, 0x69, 0xce, 0x8d, 0x08, 0x3b, 0xd8, 0xae, 0xdc,
- 0xc0, 0x5b, 0x9c, 0x9c, 0x81, 0x6d, 0xb6, 0x62, 0x9f, 0xf2, 0x8a, 0xda,
- 0x62, 0xaa, 0x78, 0xd5, 0x6e, 0xd9, 0x01, 0xbf, 0x21, 0x3a, 0xa7, 0xcd,
- 0x8b, 0x43, 0xa1, 0x44, 0x5c, 0xf1, 0xfc, 0xbc, 0xee, 0xec, 0xe0, 0x53,
- 0xb4, 0x1b, 0xbd, 0xef, 0xc9, 0x37, 0x70, 0x9e, 0xec, 0xa1, 0x5b, 0x3b,
- 0x34, 0x87, 0xad, 0xd7, 0x62, 0x71, 0x8c, 0xe3, 0x82, 0xf2, 0x1d, 0x3b,
- 0x92, 0xee, 0x39, 0xc0, 0xd7, 0x6d, 0x73, 0xfe, 0xed, 0x33, 0x03, 0x83,
- 0x38, 0x17, 0xc0, 0x20, 0xba, 0x52, 0x62, 0xf7, 0xdf, 0x56, 0x11, 0x36,
- 0xf8, 0x83, 0x85, 0x6d, 0xe1, 0x32, 0x63, 0x58, 0x1b, 0x35, 0x45, 0xf3,
- 0x39, 0xf3, 0x73, 0x69, 0xad, 0xb4, 0x1b, 0xa7, 0x55, 0x8b, 0x45, 0x7f,
- 0x83, 0xab, 0x46, 0x98, 0xeb, 0xd5, 0x5c, 0x17, 0x48, 0x77, 0x64, 0x3d,
- 0xe2, 0xdf, 0x36, 0x36, 0x46, 0xe7, 0xc7, 0xc7, 0xaf, 0x93, 0xd3, 0x93,
- 0xb7, 0x27, 0x97, 0x9e, 0x16, 0x6e, 0x6f, 0x0f, 0xf5, 0xb4, 0x6a, 0x7d,
- 0xa9, 0xce, 0x74, 0x38, 0xd6, 0x66, 0xfe, 0x9e, 0xde, 0xdf, 0xf3, 0x4c,
- 0xb2, 0x28, 0x66, 0xdd, 0xf7, 0x60, 0x6f, 0x83, 0xd9, 0x89, 0x8a, 0xff,
- 0x7a, 0x5a, 0x5c, 0x6d, 0x34, 0x1a, 0xd3, 0xbb, 0x01, 0xb3, 0x0b, 0x0c,
- 0xfe, 0x22, 0x38, 0x8d, 0xb6, 0xba, 0x24, 0xe4, 0xb3, 0x36, 0xa5, 0x47,
- 0xb0, 0xad, 0x9d, 0x5e, 0xd1, 0xdc, 0x66, 0x33, 0xa9, 0xae, 0x6e, 0xdd,
- 0x72, 0x80, 0xed, 0xdd, 0x65, 0x60, 0x3b, 0x98, 0xe7, 0x9c, 0x6b, 0xe9,
- 0x63, 0x8a, 0x51, 0xdc, 0x42, 0x6e, 0x3c, 0xc8, 0x71, 0xff, 0x8b, 0xde,
- 0xe9, 0xb0, 0x80, 0x5a, 0xfd, 0x56, 0xcd, 0x15, 0xbb, 0xcc, 0x04, 0x14,
- 0xc9, 0x93, 0x5d, 0x9b, 0xae, 0xb0, 0x80, 0xcc, 0x11, 0xfd, 0x9e, 0x3e,
- 0xb6, 0x97, 0x18, 0x25, 0x64, 0x49, 0xaa, 0x7c, 0xb5, 0x2c, 0x82, 0xeb,
- 0xee, 0x2f, 0xfc, 0xae, 0x19, 0xff, 0xf3, 0x5d, 0x5c, 0x6f, 0x57, 0x69,
- 0x35, 0x30, 0xea, 0xd6, 0xfd, 0x40, 0x5d, 0xaa, 0xbc, 0x23, 0x04, 0x6f,
- 0xcc, 0xfe, 0x9e, 0xcc, 0x55, 0xc2, 0xeb, 0xa8, 0x88, 0x2e, 0xe7, 0xa4,
- 0x44, 0x5c, 0x72, 0x26, 0x07, 0x80, 0x86, 0x4e, 0x99, 0xbe, 0xea, 0xe1,
- 0x74, 0x0a, 0x8e, 0x23, 0x26, 0xd6, 0x55, 0x74, 0x32, 0x8a, 0x32, 0x10,
- 0x20, 0x56, 0xa9, 0xd5, 0x9c, 0x86, 0x29, 0x63, 0x09, 0xf5, 0xe9, 0x79,
- 0xb2, 0xf7, 0x39, 0x8d, 0xe3, 0x71, 0xe3, 0x79, 0x53, 0x56, 0x13, 0x9b,
- 0x53, 0x0c, 0x1b, 0xc1, 0x4b, 0x30, 0xe5, 0xb4, 0x08, 0x54, 0x65, 0xe2,
- 0xd9, 0x55, 0x50, 0x2c, 0x40, 0x7b, 0x64, 0x94, 0x48, 0x3c, 0x1d, 0xee,
- 0x28, 0x04, 0xb8, 0x59, 0x2d, 0xa2, 0xbb, 0x46, 0xe6, 0xc5, 0xab, 0x61,
- 0x58, 0xd9, 0x04, 0x54, 0x9e, 0x06, 0x72, 0x89, 0x98, 0xbd, 0x76, 0x97,
- 0x4f, 0xa1, 0x4a, 0x3b, 0x8a, 0x3a, 0xb3, 0x5e, 0xbc, 0xf9, 0x18, 0x2b,
- 0x8d, 0x98, 0x25, 0x82, 0x9d, 0xb6, 0x67, 0xa2, 0xc0, 0xd0, 0xb4, 0x96,
- 0xf0, 0x28, 0x78, 0xd5, 0xdc, 0xad, 0x81, 0x43, 0xf6, 0x13, 0x89, 0xe6,
- 0x9e, 0xfb, 0x0a, 0xe5, 0x0a, 0x34, 0xcd, 0x4c, 0x9d, 0x09, 0x6f, 0xed,
- 0xc6, 0x6e, 0x8f, 0x99, 0x98, 0x5a, 0xbc, 0x61, 0xef, 0xed, 0x1a, 0xa5,
- 0x75, 0x56, 0x8e, 0x3b, 0xb5, 0xb2, 0x43, 0x4b, 0x14, 0xc3, 0x1a, 0x60,
- 0x76, 0xf6, 0x76, 0xbf, 0x5d, 0x3d, 0xeb, 0x20, 0xb9, 0x5f, 0xfb, 0xf2,
- 0xfe, 0xd3, 0x35, 0x8b, 0x76, 0x56, 0xc1, 0x18, 0xcf, 0x14, 0x03, 0x09,
- 0x45, 0xd0, 0x45, 0x5e, 0x82, 0x65, 0x33, 0x1b, 0x3f, 0xbb, 0x4e, 0x51,
- 0x73, 0x74, 0x4d, 0xef, 0x35, 0x27, 0xa4, 0xd3, 0x95, 0xb7, 0x82, 0xca,
- 0xe6, 0x5f, 0xd6, 0xe4, 0x16, 0x5b, 0x80, 0xa0, 0xcf, 0xd9, 0xae, 0x36,
- 0x9d, 0x9c, 0xb9, 0x19, 0xbc, 0xb7, 0x59, 0x72, 0xf6, 0xdb, 0x42, 0x42,
- 0x77, 0x4f, 0x95, 0x5d, 0x2f, 0x99, 0x09, 0xa3, 0x64, 0x5b, 0x9f, 0xf8,
- 0xac, 0xe5, 0xbc, 0x1a, 0xd9, 0x4c, 0xf0, 0x21, 0xde, 0x4f, 0x10, 0xbc,
- 0x93, 0x54, 0x55, 0x56, 0x29, 0x1a, 0xda, 0xb9, 0x18, 0xc8, 0x29, 0x3b,
- 0x29, 0xe7, 0x52, 0x1f, 0x90, 0x8f, 0x57, 0xe1, 0x25, 0xf6, 0x33, 0x61,
- 0xe3, 0x10, 0x99, 0xbe, 0xbc, 0x51, 0xac, 0xb0, 0xa7, 0xb4, 0x32, 0x8a,
- 0x86, 0x35, 0x1c, 0x16, 0x40, 0x03, 0x7d, 0xd9, 0xb5, 0x68, 0xc9, 0x7e,
- 0x8a, 0x24, 0x7e, 0xad, 0xc4, 0x99, 0x4c, 0xb3, 0x4f, 0xce, 0xfe, 0xa3,
- 0xb3, 0x77, 0x6f, 0x4e, 0xbe, 0xb6, 0x54, 0x46, 0x2c, 0xc4, 0x5b, 0x14,
- 0x1b, 0xec, 0x3e, 0xf6, 0x23, 0xdd, 0x52, 0x76, 0x51, 0xd0, 0xb7, 0x46,
- 0x3c, 0x7d, 0xf0, 0x7f, 0x00, 0x01, 0x52, 0x3c, 0x21, 0x07, 0x39, 0xf3,
- 0x7f, 0xd4, 0xdb, 0xce, 0xdd, 0xd0, 0xa1, 0xaa, 0xe3, 0x2c, 0x8d, 0xb4,
- 0x6a, 0x96, 0x0b, 0x0b, 0x22, 0xf4, 0xca, 0x36, 0x0a, 0x01, 0xb7, 0xa6,
- 0xa2, 0x2f, 0x17, 0x2c, 0x9a, 0x24, 0xa1, 0xb4, 0xe5, 0xcd, 0xe5, 0x3b,
- 0x80, 0xdc, 0x09, 0xc2, 0xa5, 0x22, 0x17, 0x40, 0x80, 0xcb, 0x99, 0x11,
- 0x63, 0xa7, 0x8f, 0x97, 0xd7, 0xf8, 0xcd, 0x34, 0xad, 0x6f, 0x78, 0xa0,
- 0xb8, 0x34, 0x72, 0x86, 0x69, 0x23, 0xd6, 0x96, 0x4e, 0xc9, 0x50, 0x77,
- 0x60, 0x1c, 0x8b, 0xfe, 0x75, 0xf1, 0xa1, 0x3a, 0xd1, 0xac, 0x07, 0x8b,
- 0x4f, 0xd2, 0x34, 0xd6, 0x14, 0xa1, 0x4a, 0xc4, 0x3a, 0xf1, 0x93, 0x57,
- 0x14, 0x96, 0x39, 0x20, 0x1e, 0xfa, 0x39, 0x13, 0xca, 0xf9, 0xe9, 0xa7,
- 0x22, 0x25, 0x1d, 0x59, 0xfc, 0xc9, 0x95, 0x97, 0xd1, 0xc6, 0x38, 0x41,
- 0xdd, 0x74, 0xec, 0x23, 0x26, 0x07, 0xcb, 0xe6, 0x1f, 0x36, 0x07, 0xf5,
- 0xfd, 0x7c, 0x5c, 0xce, 0x34, 0xf1, 0xc2, 0x12, 0x48, 0xe8, 0x43, 0x7e,
- 0x09, 0xb5, 0x84, 0x23, 0xb5, 0x8d, 0xe7, 0x96, 0x74, 0x58, 0x29, 0xd7,
- 0x7f, 0x2e, 0x43, 0x84, 0xf0, 0x90, 0x8e, 0x02, 0xdc, 0x3e, 0x24, 0xe3,
- 0xb3, 0x62, 0x32, 0x2b, 0x65, 0x57, 0x53, 0x82, 0x39, 0x66, 0xaa, 0x3d,
- 0x74, 0x8a, 0xf8, 0x95, 0x4b, 0xf2, 0x70, 0xa0, 0xf4, 0x88, 0x51, 0x77,
- 0x7a, 0xc2, 0xa8, 0x81, 0x01, 0xd2, 0xdb, 0xfc, 0x0b, 0x41, 0xe5, 0x7b,
- 0xfc, 0x36, 0x5c, 0xab, 0xc4, 0x74, 0xf5, 0x27, 0x76, 0x28, 0x72, 0xdc,
- 0xef, 0x2f, 0xfa, 0x71, 0x7d, 0xb4, 0x33, 0xf5, 0x66, 0x3f, 0xa5, 0xd5,
- 0xb5, 0xb0, 0xf4, 0x49, 0x24, 0x0d, 0x46, 0xa2, 0xad, 0x20, 0x63, 0x1d,
- 0x93, 0xa4, 0x94, 0x58, 0xd4, 0x0c, 0xd4, 0xa7, 0x25, 0xe7, 0x14, 0x4a,
- 0xc6, 0x15, 0xbb, 0x24, 0xed, 0x46, 0xf4, 0x24, 0xce, 0x1f, 0x2c, 0x16,
- 0x25, 0x75, 0x77, 0x99, 0x56, 0xb6, 0x70, 0xfe, 0x59, 0xb9, 0xcc, 0xbc,
- 0xd7, 0xc8, 0x89, 0x07, 0x4b, 0x38, 0x13, 0xc7, 0x09, 0x7f, 0x4a, 0x4b,
- 0x6c, 0x33, 0xa5, 0x6e, 0x56, 0xbb, 0x26, 0xf8, 0xf7, 0xaf, 0xa4, 0x72,
- 0x95, 0x39, 0xcf, 0xc2, 0x94, 0x22, 0xf4, 0x81, 0x9f, 0xef, 0x8a, 0xfb,
- 0xad, 0x11, 0xb8, 0x6a, 0x9d, 0x1c, 0x5e, 0x1c, 0x1b, 0xcd, 0xf6, 0xba,
- 0x00, 0x47, 0x45, 0xd1, 0x68, 0x52, 0x5d, 0x56, 0x48, 0xa9, 0xac, 0x42,
- 0xcf, 0x07, 0x7d, 0xf0, 0xce, 0x7b, 0x93, 0x36, 0x93, 0x00, 0x03, 0x38,
- 0x7f, 0xdb, 0x6d, 0xb9, 0x89, 0xd2, 0x09, 0x43, 0xea, 0x10, 0x4d, 0x02,
- 0x6f, 0x29, 0x0a, 0x91, 0x98, 0x4f, 0x95, 0x4a, 0x25, 0x7c, 0x1e, 0x88,
- 0x75, 0x9f, 0x43, 0x58, 0xe7, 0x1a, 0xa7, 0xda, 0xa5, 0x22, 0xfc, 0x4d,
- 0x89, 0x39, 0xe5, 0x5b, 0xad, 0xb0, 0xa7, 0xdb, 0x4e, 0xfd, 0xb8, 0xcb,
- 0xe8, 0x6f, 0xb8, 0x67, 0x48, 0x17, 0xe9, 0xea, 0x05, 0x99, 0x45, 0xd8,
- 0xb3, 0xf7, 0x7a, 0xea, 0x29, 0xbf, 0x9c, 0x02, 0x48, 0x18, 0x6b, 0x76,
- 0x4c, 0x0b, 0x13, 0x90, 0xf8, 0x75, 0xd8, 0x1c, 0x98, 0xca, 0x59, 0xa5,
- 0x5d, 0x41, 0x70, 0xe1, 0x31, 0xb1, 0x25, 0x7d, 0x64, 0x05, 0xc0, 0x97,
- 0x4f, 0x51, 0xdf, 0xee, 0x1f, 0xec, 0x68, 0x5d, 0x1f, 0x36, 0xbc, 0xca,
- 0xcb, 0x66, 0x49, 0x95, 0xdd, 0x8e, 0x7a, 0x31, 0xa4, 0x0f, 0x41, 0xa4,
- 0x22, 0x66, 0x4a, 0x7f, 0xc1, 0x8f, 0x81, 0x7a, 0x53, 0xba, 0x53, 0x48,
- 0x1d, 0x4b, 0xa1, 0x55, 0x4a, 0x4c, 0xd5, 0x75, 0x84, 0x03, 0x7b, 0x90,
- 0xd0, 0x63, 0x5f, 0x35, 0x1e, 0x7c, 0xbb, 0xa3, 0x15, 0x6f, 0xc9, 0x7f,
- 0x43, 0x09, 0xc4, 0x7a, 0xe0, 0xeb, 0xac, 0x55, 0x22, 0xd7, 0x66, 0x0a,
- 0xf5, 0x06, 0x3d, 0x33, 0x17, 0x9b, 0xa8, 0xfa, 0x2e, 0x02, 0x5f, 0x1f,
- 0xa3, 0x55, 0x45, 0x52, 0x9d, 0x53, 0x98, 0x44, 0x76, 0x51, 0x3d, 0x8e,
- 0xfb, 0x56, 0x8a, 0x03, 0x15, 0x2e, 0xa3, 0x0c, 0x20, 0x4b, 0xec, 0x85,
- 0x34, 0x11, 0x80, 0x04, 0x6e, 0xf3, 0x5a, 0x83, 0x8f, 0x66, 0x6f, 0x4f,
- 0x18, 0x13, 0xd1, 0x30, 0x21, 0x41, 0xd6, 0x4c, 0xbc, 0xa9, 0xcc, 0x26,
- 0x37, 0x25, 0x63, 0x6a, 0xcd, 0xa4, 0x79, 0x99, 0x9e, 0xbd, 0xe4, 0x7f,
- 0xcb, 0x1e, 0xf8, 0xd6, 0x25, 0xed, 0xd1, 0x46, 0x18, 0x32, 0x0f, 0xe5,
- 0xd0, 0x6d, 0x88, 0xe3, 0x1f, 0x2e, 0x2f, 0x0e, 0x93, 0x6f, 0x8e, 0x0f,
- 0x5f, 0x1f, 0x5f, 0x8c, 0x3a, 0x97, 0xbe, 0xc0, 0x3f, 0x58, 0x43, 0x23,
- 0x27, 0x30, 0x54, 0x63, 0x25, 0x1e, 0x10, 0xdc, 0xbe, 0x4a, 0x3d, 0xb3,
- 0x79, 0xe8, 0x20, 0x99, 0xf3, 0x41, 0x06, 0x11, 0x47, 0x0b, 0xc0, 0x7b,
- 0x5c, 0x43, 0xd8, 0xd8, 0x36, 0x26, 0x46, 0x42, 0x11, 0x88, 0x41, 0x5d,
- 0xe6, 0x7e, 0xc6, 0x8c, 0xe3, 0xea, 0x73, 0x97, 0xc9, 0xb4, 0xd4, 0x64,
- 0xc0, 0xf6, 0xca, 0x7d, 0xe3, 0xf2, 0xbd, 0x3d, 0xb1, 0x25, 0x97, 0x8c,
- 0x78, 0x0d, 0x7b, 0x3f, 0x0c, 0xcc, 0x77, 0x07, 0x66, 0xf2, 0x07, 0x44,
- 0xe6, 0x78, 0x9f, 0xd5, 0xbd, 0x8e, 0x0b, 0xb0, 0xfd, 0x79, 0xc8, 0xe8,
- 0xeb, 0xf0, 0x24, 0x7d, 0x13, 0x6d, 0x89, 0x4e, 0xd7, 0x8c, 0x4a, 0x2b,
- 0x75, 0x2d, 0x08, 0x5c, 0xaa, 0x9e, 0x92, 0x2c, 0x27, 0x28, 0x48, 0x6f,
- 0x11, 0x80, 0x92, 0x33, 0x33, 0x05, 0x0f, 0x86, 0x8e, 0xc8, 0x10, 0xa0,
- 0xeb, 0x98, 0xb3, 0xc7, 0x97, 0xfa, 0x8c, 0x29, 0x9a, 0xd9, 0x63, 0x66,
- 0xba, 0x25, 0x0f, 0xf9, 0xf7, 0x03, 0x02, 0x20, 0x82, 0xc1, 0xaf, 0x5b,
- 0xf1, 0x51, 0x71, 0x86, 0x42, 0x67, 0xb0, 0xcd, 0x51, 0x1f, 0xec, 0x9e,
- 0x57, 0xe8, 0x3e, 0x7d, 0x52, 0x0b, 0x8b, 0xc8, 0xbb, 0x8c, 0x02, 0x23,
- 0xa3, 0x1e, 0xfe, 0x4d, 0xae, 0x44, 0xca, 0xe5, 0x08, 0x59, 0xb0, 0x79,
- 0xb9, 0x40, 0xfe, 0x66, 0x46, 0x15, 0x34, 0xa0, 0xc7, 0xed, 0x73, 0x59,
- 0xf2, 0x4d, 0x59, 0xe3, 0x2e, 0x08, 0x1f, 0xa7, 0x4b, 0x3e, 0x36, 0xfd,
- 0x78, 0x43, 0xe2, 0x5b, 0x96, 0x24, 0x16, 0xa4, 0xca, 0x10, 0x5f, 0xe7,
- 0x87, 0x97, 0xdf, 0x20, 0xba, 0x8a, 0x2d, 0xfc, 0x1a, 0x8c, 0x29, 0x1a,
- 0x53, 0x0b, 0x53, 0xb2, 0xac, 0x01, 0xc7, 0xfa, 0xaf, 0x12, 0x33, 0xaa,
- 0x3e, 0x89, 0xe8, 0x5d, 0xce, 0x40, 0xa4, 0x19, 0x57, 0x7f, 0x85, 0x8c,
- 0x6e, 0xd5, 0xe6, 0x03, 0xf4, 0xdd, 0xe6, 0xdb, 0x59, 0xbc, 0xe5, 0x26,
- 0x27, 0xc2, 0x6f, 0xf2, 0x98, 0xb0, 0xe9, 0x49, 0x99, 0x23, 0x8b, 0xc7,
- 0x67, 0x1e, 0xc6, 0x2f, 0x28, 0xd3, 0x99, 0x03, 0x50, 0xd3, 0x32, 0xce,
- 0x7b, 0xe8, 0x1d, 0xe9, 0x2f, 0xe7, 0xf7, 0xc3, 0x90, 0x80, 0x27, 0xf9,
- 0x6a, 0xd9, 0xb4, 0xc5, 0x4a, 0x87, 0xff, 0xd8, 0x6a, 0x96, 0x55, 0x59,
- 0x36, 0x5e, 0x1f, 0xa0, 0xfd, 0xa4, 0x8d, 0x9c, 0x68, 0x26, 0xb8, 0xe4,
- 0xbe, 0x50, 0x53, 0x85, 0xe8, 0xdd, 0xbe, 0x62, 0x98, 0x8e, 0xeb, 0x72,
- 0xb6, 0x6c, 0x3c, 0xf4, 0xf5, 0x2f, 0xeb, 0xb3, 0xd7, 0xe9, 0xad, 0x93,
- 0xa1, 0x92, 0x7d, 0x16, 0x4c, 0x51, 0x67, 0x2c, 0x7d, 0xa3, 0x5e, 0x22,
- 0xd8, 0x58, 0x95, 0x45, 0xbb, 0x7c, 0x1c, 0x80, 0xde, 0xdb, 0x1b, 0x1b,
- 0x23, 0x5d, 0x6c, 0xa2, 0x7b, 0x0d, 0x17, 0xfd, 0x7b, 0x68, 0x93, 0xd4,
- 0x07, 0x0e, 0x16, 0x4c, 0xcc, 0x5f, 0x94, 0x04, 0x2e, 0xe3, 0x35, 0x85,
- 0x08, 0xe7, 0x35, 0xce, 0xeb, 0xf6, 0xa0, 0xf0, 0x2b, 0x1b, 0xae, 0xd0,
- 0xfc, 0xb2, 0xcb, 0x52, 0xa9, 0xfc, 0x25, 0x5c, 0xe7, 0x36, 0x44, 0x2b,
- 0x1b, 0x3e, 0xca, 0x30, 0x4d, 0x97, 0x80, 0xd6, 0x14, 0xb6, 0x70, 0x5c,
- 0xea, 0xe4, 0xce, 0xff, 0xd9, 0x49, 0xfa, 0x5c, 0xd4, 0x20, 0x42, 0xda,
- 0xb3, 0x4c, 0xfe, 0x3f, 0x00, 0x5e, 0x09, 0xbd, 0x2f, 0xb5, 0x39, 0x6c,
- 0x13, 0xc8, 0x0e, 0x8d, 0x09, 0x75, 0x53, 0x4d, 0xdc, 0xee, 0x37, 0xda,
- 0x41, 0x76, 0x47, 0xf6, 0x8b, 0xda, 0x08, 0x42, 0x17, 0xc2, 0x65, 0x7d,
- 0x2d, 0x01, 0x13, 0xe8, 0x36, 0xae, 0xac, 0x57, 0x8f, 0x2a, 0x6c, 0x72,
- 0x1d, 0x4a, 0x56, 0xeb, 0x51, 0x85, 0x49, 0xc3, 0xa6, 0x9c, 0x51, 0x6f,
- 0xed, 0xf6, 0x3a, 0xa9, 0x4b, 0xfe, 0x53, 0x93, 0x8e, 0x04, 0xd8, 0x25,
- 0xdb, 0xdf, 0xab, 0xee, 0xe7, 0x95, 0xbf, 0x55, 0xc4, 0x29, 0xa3, 0xe9,
- 0x34, 0x1c, 0xa9, 0x9d, 0x54, 0x2d, 0x80, 0xa2, 0x95, 0xa0, 0xb5, 0x14,
- 0xe6, 0x11, 0x42, 0x92, 0x11, 0x87, 0x31, 0x27, 0x6d, 0x53, 0xdd, 0x46,
- 0xb5, 0x64, 0xf4, 0x4a, 0xd5, 0x34, 0x8e, 0x0d, 0xbf, 0x5a, 0x36, 0x77,
- 0x5f, 0xee, 0x7e, 0x24, 0xe1, 0x23, 0x32, 0x77, 0x97, 0x12, 0x4f, 0x9a,
- 0x53, 0x09, 0x74, 0x48, 0x52, 0xe1, 0x95, 0xc1, 0x1b, 0x3e, 0x20, 0xc5,
- 0x21, 0x36, 0xaf, 0x29, 0xcb, 0x43, 0x5c, 0x52, 0xc2, 0x65, 0x02, 0xff,
- 0xd7, 0x4d, 0x2e, 0xb8, 0x52, 0x9e, 0xf5, 0x76, 0x55, 0x4d, 0x78, 0xf8,
- 0x08, 0x52, 0xe0, 0xa2, 0xaa, 0x16, 0xf8, 0x30, 0x0c, 0x0f, 0xcc, 0xd0,
- 0xb2, 0xaa, 0xca, 0x25, 0x72, 0xe2, 0xe7, 0x94, 0x33, 0x0a, 0xc3, 0x62,
- 0x9d, 0x1f, 0xf9, 0x75, 0xff, 0x93, 0x04, 0x62, 0x2d, 0x12, 0x4e, 0x20,
- 0x11, 0xaa, 0x38, 0xba, 0x50, 0xf6, 0xf7, 0x60, 0x98, 0x32, 0x66, 0x03,
- 0x3c, 0xa5, 0xda, 0x42, 0xab, 0x86, 0x9b, 0x37, 0xf9, 0xdb, 0x7d, 0x99,
- 0x25, 0x9b, 0x71, 0x2f, 0x21, 0x66, 0xd6, 0x0b, 0xbd, 0xb8, 0x53, 0xab,
- 0x78, 0x1c, 0x67, 0x71, 0xd7, 0x4d, 0xb5, 0x9c, 0xb4, 0x28, 0xfa, 0xb0,
- 0x23, 0x5a, 0xa1, 0x79, 0x3b, 0xc7, 0xa5, 0x6f, 0xdb, 0x9f, 0x9c, 0x8b,
- 0x79, 0xcf, 0xd6, 0x07, 0xf5, 0x6c, 0x2b, 0x6d, 0x25, 0xb9, 0xd8, 0x72,
- 0x9f, 0xfe, 0x77, 0xb7, 0xed, 0x2e, 0x1b, 0x9c, 0xdb, 0x8c, 0xfa, 0x4e,
- 0x21, 0x78, 0xca, 0x4e, 0xf0, 0xee, 0x5e, 0x51, 0xc4, 0xa0, 0x78, 0x54,
- 0x89, 0x90, 0x2f, 0x42, 0xad, 0x21, 0x97, 0xe5, 0x86, 0x25, 0x48, 0x34,
- 0x5d, 0x1a, 0x08, 0x54, 0x95, 0xa3, 0xbf, 0x3b, 0x66, 0x22, 0xb5, 0x40,
- 0x90, 0x2d, 0x8e, 0x55, 0x3b, 0x92, 0xc5, 0x0e, 0x4e, 0x15, 0x14, 0x4d,
- 0x56, 0x3f, 0x14, 0xb2, 0x38, 0x99, 0xbf, 0x61, 0xf2, 0x5a, 0x0e, 0x85,
- 0x7c, 0xa1, 0xab, 0x4e, 0x84, 0x77, 0xe3, 0x39, 0x53, 0xa1, 0x04, 0xfb,
- 0xe8, 0xb5, 0xfa, 0x54, 0x21, 0x72, 0x30, 0x37, 0x64, 0xd9, 0xe8, 0x22,
- 0x99, 0x79, 0xd5, 0x4f, 0x98, 0x2e, 0xd0, 0x88, 0x37, 0x67, 0xd9, 0xee,
- 0xa6, 0x57, 0xdd, 0x6b, 0x8b, 0x41, 0xff, 0x25, 0xac, 0x1f, 0x4b, 0x56,
- 0xc8, 0xde, 0x0b, 0x02, 0xb7, 0x6d, 0x47, 0xba, 0x62, 0x9a, 0xf8, 0xa5,
- 0x9d, 0xd9, 0x7b, 0xb1, 0x3f, 0xdc, 0x7b, 0xfe, 0xf9, 0x70, 0x77, 0xb8,
- 0xb7, 0x4b, 0xf2, 0x85, 0xba, 0xe2, 0x75, 0x8e, 0xe7, 0x25, 0xf2, 0xa9,
- 0xd6, 0x7b, 0xe1, 0x37, 0xdf, 0x1d, 0x5f, 0x7e, 0x7f, 0x76, 0xf1, 0x6d,
- 0x72, 0xf2, 0xee, 0xf2, 0xf8, 0xe2, 0xcd, 0xe1, 0xd1, 0x63, 0x09, 0xfb,
- 0x7d, 0xb7, 0xb5, 0x57, 0xc5, 0x3a, 0x73, 0x13, 0x13, 0xfa, 0x06, 0xdd,
- 0x9c, 0x65, 0xcd, 0xcd, 0xee, 0xc1, 0xde, 0x5a, 0x4a, 0xea, 0x88, 0x7b,
- 0xd0, 0xbd, 0xaf, 0x83, 0xda, 0xa3, 0x41, 0xad, 0x6e, 0xc5, 0x52, 0x33,
- 0x8e, 0x18, 0x5b, 0x65, 0x71, 0xb9, 0x10, 0xf3, 0x28, 0x9e, 0x04, 0x46,
- 0x56, 0x11, 0xec, 0x63, 0x26, 0xbf, 0xe5, 0xf4, 0x5a, 0x21, 0x99, 0x11,
- 0x0c, 0xba, 0xc8, 0xdc, 0x0d, 0xae, 0x18, 0xdd, 0x88, 0x3b, 0x85, 0xe9,
- 0x6c, 0xa7, 0x50, 0xf1, 0x54, 0x2a, 0x4b, 0xee, 0x1a, 0xed, 0x16, 0xa9,
- 0x6f, 0xca, 0x84, 0x83, 0x53, 0x9b, 0x27, 0x62, 0x59, 0x08, 0x36, 0x12,
- 0x4f, 0x4f, 0x47, 0x5f, 0xdb, 0x45, 0xbf, 0x7d, 0xf8, 0x6c, 0x87, 0x7b,
- 0xb5, 0x56, 0x5c, 0x33, 0x06, 0xd6, 0x72, 0x8d, 0x1e, 0x49, 0x47, 0x70,
- 0x1a, 0xbc, 0xde, 0xf0, 0xa7, 0xa0, 0x50, 0x11, 0x49, 0x1a, 0xe8, 0x21,
- 0x5b, 0x0c, 0xc9, 0x7c, 0x47, 0x21, 0x77, 0x82, 0xf5, 0x3f, 0x2d, 0x6b,
- 0x41, 0xad, 0xd7, 0x2d, 0x92, 0xc2, 0x84, 0x0b, 0x5a, 0xf9, 0xaf, 0xb3,
- 0xaa, 0x0d, 0x74, 0xe6, 0xb4, 0x4a, 0xef, 0x50, 0x95, 0x25, 0x77, 0x94,
- 0xa3, 0x1b, 0xed, 0xa2, 0x5c, 0xa4, 0x38, 0xb9, 0x39, 0x4f, 0xce, 0x8f,
- 0xdf, 0x0e, 0xb4, 0x9c, 0xb0, 0xf9, 0x3b, 0x3b, 0xa3, 0x94, 0x5f, 0x92,
- 0x73, 0x7b, 0x16, 0x59, 0xa1, 0x58, 0x1a, 0xc8, 0x44, 0x01, 0xff, 0xf8,
- 0x03, 0xa0, 0x43, 0x63, 0x19, 0x28, 0x05, 0x32, 0xaa, 0x98, 0x4b, 0xce,
- 0x2d, 0xec, 0xd2, 0x72, 0xd2, 0x7a, 0x0a, 0x60, 0x39, 0xd9, 0xb2, 0x20,
- 0x5d, 0xfa, 0x1e, 0x90, 0xa8, 0x40, 0x0d, 0x58, 0x98, 0x40, 0xa9, 0x99,
- 0xd7, 0xe7, 0xdf, 0x1e, 0x8d, 0xfe, 0xb0, 0xb7, 0x2f, 0xdd, 0xd9, 0x56,
- 0xab, 0x80, 0x64, 0x55, 0x37, 0x29, 0x1f, 0xe2, 0xda, 0xef, 0xa3, 0xa6,
- 0x58, 0xe3, 0x80, 0x63, 0x31, 0xb6, 0x6c, 0x62, 0xd0, 0x76, 0x2b, 0x33,
- 0x68, 0x83, 0x4b, 0xd7, 0xab, 0x8a, 0x69, 0xcb, 0xfd, 0x52, 0x48, 0x04,
- 0x55, 0xa1, 0xa4, 0x2e, 0x53, 0x63, 0xa1, 0x7e, 0x69, 0xa1, 0x3f, 0xe2,
- 0x96, 0xa5, 0x35, 0xe4, 0x90, 0x3b, 0x38, 0x4b, 0x77, 0xcd, 0x69, 0xbe,
- 0xdd, 0x6f, 0x89, 0x27, 0x56, 0x6e, 0x76, 0x25, 0x04, 0x72, 0x9f, 0xc1,
- 0x01, 0x10, 0xf4, 0xfa, 0x54, 0x2b, 0xbf, 0x15, 0xae, 0x0e, 0x0a, 0x3d,
- 0x7d, 0x66, 0x16, 0xca, 0x9c, 0x2c, 0xe6, 0x6d, 0x20, 0xa1, 0x50, 0xce,
- 0xc8, 0x74, 0xb1, 0x8f, 0xbc, 0xae, 0xa8, 0xe0, 0xcc, 0x82, 0x71, 0xa4,
- 0xef, 0x86, 0xc9, 0x37, 0x59, 0x41, 0x89, 0xf3, 0x84, 0xb8, 0xd3, 0xdc,
- 0x2b, 0xe0, 0x02, 0xa9, 0xf4, 0x24, 0x4a, 0xf1, 0x9d, 0x66, 0xa9, 0x70,
- 0x72, 0x1a, 0x59, 0x57, 0xb3, 0x85, 0xab, 0x65, 0xa8, 0x52, 0x42, 0xe7,
- 0x09, 0x81, 0xa8, 0x25, 0xbb, 0x60, 0x92, 0x68, 0x6a, 0x60, 0xab, 0x4d,
- 0xac, 0x89, 0x92, 0x08, 0x68, 0x4e, 0x8e, 0x39, 0x62, 0x4d, 0xe2, 0x55,
- 0xbe, 0x01, 0x9d, 0x36, 0x79, 0x0b, 0xd9, 0xe2, 0x72, 0x42, 0x65, 0x5a,
- 0xdd, 0x90, 0xeb, 0xa3, 0x36, 0xd7, 0x4d, 0x5a, 0x4c, 0xee, 0x87, 0x53,
- 0xa3, 0xcb, 0x92, 0xf3, 0x6c, 0xb8, 0xfc, 0xb8, 0xe3, 0x1d, 0x53, 0x12,
- 0xf9, 0x37, 0xcc, 0x11, 0xd0, 0x76, 0x7c, 0x6b, 0x99, 0xe3, 0x90, 0x3a,
- 0x2c, 0x6d, 0x9d, 0x09, 0xda, 0x12, 0x9a, 0xed, 0xcf, 0xc7, 0x73, 0x25,
- 0xc9, 0xd6, 0x71, 0x62, 0x19, 0x8e, 0xa9, 0x85, 0xe1, 0x22, 0x9b, 0x1f,
- 0xd8, 0x6c, 0x64, 0x95, 0x0f, 0x52, 0x55, 0xc3, 0x1a, 0x16, 0x9e, 0x93,
- 0xb6, 0xc8, 0xae, 0x67, 0xa2, 0x50, 0xf8, 0xa6, 0x8b, 0x6d, 0x22, 0x92,
- 0x02, 0xc2, 0x06, 0x8f, 0x14, 0x49, 0x82, 0xc6, 0x6e, 0xf6, 0x61, 0x23,
- 0x90, 0x5a, 0x7e, 0xb8, 0x22, 0x85, 0xde, 0x35, 0x22, 0xcc, 0x21, 0x20,
- 0x5b, 0x46, 0x05, 0x79, 0x76, 0xf1, 0x28, 0x12, 0x49, 0xc2, 0x4f, 0x44,
- 0x04, 0x8b, 0x1d, 0x02, 0x1a, 0x77, 0x41, 0x45, 0x23, 0xf8, 0xa9, 0xa5,
- 0x84, 0xf9, 0xac, 0x98, 0x5f, 0xdf, 0x3e, 0x21, 0x8f, 0xf7, 0xe5, 0xe9,
- 0x48, 0xa3, 0x22, 0x45, 0x76, 0xe7, 0x6d, 0x2d, 0x2e, 0x3d, 0x20, 0xfb,
- 0x8f, 0x1c, 0x40, 0x4c, 0xa9, 0x0c, 0xb6, 0x03, 0xf4, 0x84, 0xa5, 0x82,
- 0x0b, 0x93, 0xb9, 0xe4, 0x07, 0x9d, 0x04, 0x81, 0x11, 0x53, 0x57, 0xb4,
- 0xe2, 0x19, 0x2b, 0x43, 0x96, 0xe9, 0x85, 0xb8, 0xfb, 0x8c, 0xb2, 0xf4,
- 0xa4, 0x9f, 0x0c, 0xf6, 0xc1, 0x9f, 0xb3, 0xd7, 0x9e, 0xc4, 0xb4, 0x61,
- 0x9a, 0x40, 0x6a, 0xc3, 0xb4, 0xa4, 0xad, 0x88, 0x38, 0xd8, 0x92, 0x2d,
- 0x7d, 0x6b, 0xde, 0xa7, 0x3f, 0xf6, 0x65, 0x40, 0xb7, 0x7b, 0x40, 0x6c,
- 0x33, 0x6f, 0xe5, 0xec, 0x3e, 0x54, 0x19, 0xf6, 0xd7, 0xae, 0x2a, 0x72,
- 0x23, 0xee, 0x72, 0x4b, 0x20, 0xcd, 0x45, 0x13, 0xe0, 0x0a, 0x15, 0x4a,
- 0x50, 0xed, 0x80, 0x99, 0x42, 0x71, 0x72, 0x17, 0xc9, 0xed, 0xbe, 0xc6,
- 0x9a, 0xe9, 0x37, 0x3a, 0x6f, 0xec, 0xac, 0x77, 0x42, 0x24, 0x48, 0x5b,
- 0x24, 0x94, 0x9b, 0xb7, 0x6b, 0x29, 0xeb, 0xc9, 0xec, 0x59, 0x23, 0x45,
- 0x5a, 0x52, 0xa6, 0x2c, 0xc4, 0xad, 0xc0, 0x29, 0xef, 0xcc, 0x47, 0x4f,
- 0x06, 0xbc, 0x07, 0x73, 0x02, 0xf2, 0xdb, 0x43, 0x44, 0x9e, 0x14, 0x36,
- 0x51, 0x42, 0x5c, 0xf9, 0xa0, 0xe8, 0xc3, 0xf2, 0xdf, 0xe4, 0xec, 0x98,
- 0x00, 0xd6, 0x14, 0xd7, 0xb9, 0x39, 0xf9, 0x9b, 0x89, 0x39, 0x4c, 0x4b,
- 0x92, 0xf8, 0x8d, 0x2d, 0xbf, 0x36, 0x62, 0x6a, 0xcf, 0x4d, 0x5f, 0xcc,
- 0x0d, 0xbe, 0xa0, 0xa1, 0xd4, 0x9b, 0x6e, 0xec, 0x42, 0x71, 0xde, 0x1e,
- 0x88, 0xc4, 0x39, 0xb4, 0xe0, 0xd8, 0x79, 0xa5, 0x65, 0xd5, 0x37, 0x8f,
- 0x3f, 0x91, 0x8e, 0xb3, 0x29, 0x5f, 0xe2, 0x5f, 0x73, 0x4e, 0x3f, 0xe6,
- 0xe8, 0xfc, 0xe4, 0x1d, 0x57, 0x0a, 0xb7, 0x67, 0x21, 0x23, 0xea, 0xc5,
- 0x0d, 0x2e, 0x72, 0x8f, 0xfe, 0xa4, 0xca, 0x01, 0xcf, 0x8e, 0x23, 0xda,
- 0x33, 0xb4, 0xc7, 0x73, 0xf9, 0xd6, 0xc5, 0x92, 0xbf, 0xbe, 0x49, 0xf7,
- 0x5c, 0x5d, 0xcf, 0x36, 0x3b, 0xd5, 0x6f, 0xed, 0x9a, 0x74, 0x2e, 0x14,
- 0xeb, 0x91, 0x9a, 0x4c, 0x9d, 0x82, 0x9f, 0x24, 0xd2, 0x4a, 0x4b, 0xce,
- 0xf5, 0x3b, 0x99, 0x8e, 0xbe, 0x2b, 0xfc, 0x0f, 0xc9, 0x70, 0xc7, 0x7c,
- 0xb0, 0xde, 0xd1, 0x17, 0x17, 0x1f, 0x27, 0xb5, 0xb9, 0xe1, 0x28, 0xad,
- 0xf7, 0x47, 0x18, 0xe4, 0x58, 0x0e, 0xd3, 0xe3, 0xe9, 0xcf, 0xc9, 0x60,
- 0x32, 0xc3, 0xf8, 0x12, 0x94, 0xda, 0xfe, 0xd1, 0xac, 0x3c, 0x3d, 0xf1,
- 0xb3, 0x5d, 0xc3, 0x37, 0x39, 0x9d, 0xb7, 0x4f, 0x7d, 0x1d, 0xfa, 0x19,
- 0x1b, 0x0c, 0xcc, 0x6f, 0x9b, 0x1c, 0x4e, 0x6f, 0x29, 0xe9, 0x6e, 0x2a,
- 0xff, 0xa4, 0xf1, 0x1c, 0x17, 0xa8, 0x50, 0x8a, 0x91, 0xa6, 0x63, 0x2e,
- 0x4a, 0xfe, 0x5d, 0x6e, 0x8c, 0x8e, 0xa3, 0x8e, 0x7e, 0x41, 0xf9, 0x7f,
- 0xd4, 0x41, 0xbc, 0xe5, 0xfd, 0x52, 0x93, 0x39, 0xfa, 0x92, 0xb3, 0xe0,
- 0xa0, 0xa5, 0x24, 0x9d, 0x69, 0xe9, 0x86, 0xc9, 0x57, 0x14, 0xe3, 0xac,
- 0x32, 0x8f, 0xfd, 0x55, 0x2e, 0x3e, 0xae, 0xe4, 0x47, 0x8b, 0x91, 0x32,
- 0xff, 0xc4, 0xd0, 0x8e, 0x24, 0xc8, 0x81, 0xb1, 0x63, 0xb2, 0xbf, 0x69,
- 0x0f, 0x0e, 0xfd, 0xd2, 0x94, 0x76, 0x33, 0x14, 0xcd, 0x97, 0x48, 0x82,
- 0xa1, 0x78, 0xbc, 0x94, 0xdc, 0x43, 0xbe, 0x30, 0xa7, 0x99, 0x26, 0xf6,
- 0x97, 0x3e, 0x9b, 0x8a, 0x7a, 0x8e, 0xd1, 0x94, 0x6a, 0x04, 0x76, 0x4b,
- 0xe0, 0x0e, 0x77, 0xbd, 0x3e, 0xba, 0x31, 0xa2, 0x39, 0xb3, 0x5d, 0x1d,
- 0xb1, 0x4b, 0x4f, 0xbb, 0x38, 0xa2, 0x3b, 0x4a, 0x17, 0xc1, 0xfe, 0x52,
- 0xb3, 0x23, 0xa1, 0x85, 0xee, 0xb0, 0xec, 0xb2, 0x7b, 0x97, 0x67, 0xb7,
- 0x3d, 0x04, 0x4a, 0x6a, 0x1c, 0xbd, 0x7f, 0x4b, 0xa5, 0x4d, 0x50, 0xb8,
- 0xfa, 0xf2, 0xe2, 0xf0, 0xdd, 0xe8, 0x0d, 0xbb, 0xc6, 0x2f, 0x4b, 0x57,
- 0x12, 0x5b, 0xfc, 0x41, 0x36, 0x7e, 0x6c, 0x69, 0xe2, 0xee, 0xb8, 0xde,
- 0x86, 0xe2, 0xe9, 0xa5, 0x58, 0x76, 0xbf, 0xcb, 0xb7, 0xcf, 0xc5, 0xb6,
- 0x69, 0x36, 0xa8, 0x6b, 0x5b, 0xa3, 0x6d, 0xab, 0x08, 0xd5, 0x7e, 0x51,
- 0x36, 0x57, 0xb0, 0x5e, 0x99, 0xa1, 0xe5, 0x21, 0x9a, 0x96, 0x23, 0xed,
- 0x8c, 0xfe, 0x94, 0xef, 0xde, 0x95, 0x64, 0xa4, 0x47, 0xc6, 0x54, 0x1c,
- 0x48, 0xa5, 0x1a, 0xaf, 0x04, 0x9d, 0x75, 0xa7, 0xf2, 0xdd, 0x2b, 0x54,
- 0x7e, 0xb6, 0x71, 0x3f, 0xef, 0x53, 0x9b, 0xde, 0xfa, 0x8f, 0xbd, 0xed,
- 0x78, 0xf3, 0x97, 0xbf, 0xb4, 0xf9, 0x78, 0xdf, 0xd5, 0x36, 0x73, 0x29,
- 0x45, 0x5b, 0xff, 0xb1, 0xbf, 0xbd, 0x76, 0x44, 0x7e, 0x56, 0xa4, 0xfb,
- 0xa6, 0x79, 0x83, 0x3a, 0x9b, 0xbc, 0xe2, 0x63, 0x66, 0x75, 0x26, 0x8b,
- 0xd0, 0xf1, 0xf8, 0x86, 0x5b, 0x84, 0x1d, 0x04, 0xdb, 0xb6, 0x9a, 0xba,
- 0x0b, 0xbc, 0x49, 0x76, 0xc9, 0xc9, 0xff, 0x73, 0xec, 0xd3, 0x48, 0x16,
- 0x9b, 0x8d, 0x7f, 0x45, 0x11, 0x3b, 0x40, 0x5d, 0x0e, 0xf1, 0xed, 0xfd,
- 0x35, 0xdf, 0x76, 0xa3, 0xf3, 0xdc, 0x12, 0x14, 0xc5, 0x26, 0x18, 0x9c,
- 0xb2, 0x61, 0xcb, 0x77, 0x36, 0x5c, 0xa1, 0xf5, 0xd5, 0xdf, 0xbb, 0x3c,
- 0x79, 0x7b, 0x4c, 0xac, 0xd9, 0xaf, 0x4f, 0x88, 0x7c, 0x6e, 0x24, 0xf4,
- 0x8f, 0xea, 0x81, 0xb0, 0x8c, 0xbc, 0x7e, 0xb5, 0x14, 0x0e, 0xef, 0x5a,
- 0xb4, 0x99, 0x95, 0x1c, 0x76, 0x25, 0xe8, 0xd3, 0x82, 0x81, 0xae, 0x35,
- 0xd3, 0xf2, 0xe4, 0x6a, 0xf0, 0xb6, 0x9c, 0xc2, 0x4a, 0x1e, 0x8c, 0x00,
- 0x15, 0x34, 0x6f, 0x99, 0x1f, 0xbe, 0x2f, 0xe6, 0xad, 0x1f, 0x0f, 0x23,
- 0x99, 0xba, 0x1b, 0xab, 0x8a, 0xf2, 0xfc, 0x7d, 0x67, 0x30, 0xa0, 0xce,
- 0x0c, 0x18, 0xd6, 0x25, 0xc1, 0x9d, 0x16, 0x3f, 0x87, 0x8a, 0x16, 0x33,
- 0x41, 0xf9, 0xec, 0x9e, 0x81, 0x08, 0xa9, 0x83, 0x8f, 0xb9, 0xec, 0xcd,
- 0x6b, 0xca, 0x20, 0x73, 0x2e, 0x3e, 0x76, 0xe2, 0x6d, 0xf8, 0xe4, 0xa5,
- 0x30, 0xa4, 0xb2, 0x3b, 0x87, 0x7f, 0x92, 0xaa, 0xcd, 0xe5, 0xe2, 0x1e,
- 0xa3, 0xbc, 0x6b, 0x41, 0x2b, 0xa2, 0xf1, 0xd5, 0xbf, 0xf3, 0x3b, 0xad,
- 0x32, 0x54, 0xc2, 0x31, 0xed, 0xed, 0x40, 0xf9, 0x89, 0x54, 0x6d, 0x3a,
- 0xab, 0xbc, 0xeb, 0x4a, 0xba, 0xad, 0xd5, 0xed, 0x3c, 0x62, 0x53, 0x8f,
- 0x87, 0xb5, 0xdd, 0x4f, 0x9f, 0x04, 0xb6, 0xa4, 0xd4, 0xd7, 0xd7, 0xa5,
- 0x0d, 0x8e, 0x19, 0xb1, 0xb3, 0x68, 0xd7, 0x45, 0xce, 0x12, 0x4d, 0xf2,
- 0xe6, 0x1c, 0xfe, 0xcd, 0xc1, 0x26, 0xea, 0x32, 0xe4, 0x45, 0x64, 0x30,
- 0x83, 0x5f, 0x3e, 0x9a, 0x20, 0xf4, 0x9a, 0xf4, 0xae, 0x88, 0x08, 0x83,
- 0xe2, 0x58, 0x3d, 0xee, 0x00, 0xf3, 0xc4, 0xf0, 0xe6, 0x32, 0x17, 0x04,
- 0xc9, 0x35, 0x35, 0x24, 0xd9, 0xa8, 0xb6, 0xc8, 0x58, 0xeb, 0x24, 0x67,
- 0xaf, 0x24, 0x09, 0xd2, 0xe5, 0x62, 0x0a, 0x50, 0x06, 0xc3, 0x51, 0xff,
- 0x8b, 0x48, 0xb1, 0xab, 0xfb, 0x64, 0x6f, 0xbf, 0x9f, 0xec, 0xef, 0xee,
- 0xed, 0x47, 0xc6, 0xd0, 0xfb, 0x2f, 0x02, 0x45, 0xed, 0xe3, 0xd7, 0xbd,
- 0xc7, 0x8e, 0xc2, 0xe5, 0x33, 0xe0, 0x26, 0x91, 0xcc, 0x5f, 0x23, 0x7c,
- 0x28, 0x3e, 0x0b, 0x22, 0x66, 0x14, 0x4b, 0x06, 0x9d, 0x1d, 0xae, 0x2d,
- 0x76, 0x12, 0x6a, 0x8d, 0x4d, 0x5b, 0x3a, 0x6c, 0x8a, 0x4a, 0x3a, 0x5c,
- 0xaf, 0x16, 0xc8, 0x17, 0xeb, 0x29, 0x4d, 0x2b, 0x54, 0x10, 0x6d, 0xaf,
- 0x51, 0xde, 0xe8, 0xb2, 0x10, 0xb4, 0x86, 0xd6, 0xc6, 0xec, 0xf7, 0xd7,
- 0x27, 0x47, 0x97, 0xca, 0x77, 0x78, 0x45, 0xca, 0x53, 0x75, 0xff, 0xb8,
- 0x62, 0x8c, 0x6b, 0x9f, 0x99, 0x1e, 0xdc, 0x64, 0x46, 0x8d, 0x2e, 0xc6,
- 0xcb, 0xeb, 0x83, 0xbf, 0xa6, 0xd5, 0x75, 0x59, 0x3c, 0xf4, 0xfc, 0x14,
- 0x09, 0x65, 0x07, 0x46, 0x42, 0xed, 0xbd, 0xd8, 0x7b, 0x82, 0xfc, 0xef,
- 0x59, 0x8e, 0x82, 0x40, 0x24, 0x20, 0x36, 0xe7, 0x9b, 0x4c, 0xb0, 0x81,
- 0x34, 0x09, 0xcb, 0xaa, 0x51, 0x4c, 0x37, 0xf9, 0xba, 0x4f, 0xfd, 0x67,
- 0xa7, 0xf2, 0x2c, 0xa7, 0x9e, 0x6f, 0x4a, 0xae, 0xc2, 0x26, 0xa5, 0x69,
- 0x2e, 0x17, 0x9b, 0x6d, 0x8a, 0xf8, 0x07, 0xc6, 0x4a, 0x9f, 0xb0, 0xb5,
- 0x27, 0x8f, 0x2c, 0xf1, 0x3d, 0x32, 0x88, 0xaa, 0x2c, 0xfd, 0xe8, 0xaa,
- 0x27, 0x3b, 0xf6, 0x0d, 0x0d, 0x79, 0x5c, 0xbc, 0x39, 0x62, 0x06, 0x53,
- 0xcd, 0x97, 0xc2, 0x54, 0x27, 0xd6, 0x35, 0xb5, 0x4d, 0xbd, 0x7c, 0xe0,
- 0xfb, 0x94, 0xdb, 0x70, 0x30, 0x1d, 0x3f, 0xe2, 0x21, 0x73, 0xee, 0x98,
- 0x2c, 0xee, 0xb0, 0x5d, 0x7a, 0x87, 0x0c, 0x35, 0xd4, 0x0f, 0xd1, 0x32,
- 0xc9, 0x5b, 0x5c, 0x89, 0x96, 0x23, 0x0e, 0xd4, 0x35, 0x2d, 0x40, 0xad,
- 0xde, 0x1d, 0xd3, 0x6f, 0xaa, 0xf2, 0xfa, 0xfa, 0xf0, 0xdc, 0x33, 0x74,
- 0x61, 0x48, 0x3a, 0xa7, 0x1e, 0x3d, 0x47, 0x86, 0x0e, 0x2a, 0xb1, 0x4b,
- 0x35, 0xa6, 0xbe, 0x33, 0x51, 0x1a, 0xc8, 0x49, 0xd2, 0x8d, 0x00, 0x90,
- 0x2f, 0xe5, 0x3e, 0x81, 0xff, 0x09, 0xd5, 0x0c, 0x66, 0xd3, 0x14, 0x81,
- 0x50, 0xb9, 0x85, 0xa0, 0x73, 0xa1, 0xad, 0x5c, 0xd0, 0x50, 0x66, 0x6d,
- 0x3e, 0x25, 0x92, 0xc4, 0x21, 0xd9, 0x2a, 0x52, 0x6f, 0x04, 0x8f, 0x51,
- 0x56, 0xf2, 0xbd, 0x0e, 0x80, 0xe5, 0xb3, 0xe9, 0x7c, 0x5a, 0x7f, 0x34,
- 0xa2, 0x94, 0x03, 0xf8, 0xe6, 0xeb, 0xb9, 0x84, 0xc0, 0xc9, 0xe9, 0x93,
- 0x33, 0x90, 0x86, 0xdc, 0x4f, 0xe0, 0x41, 0x6a, 0x2d, 0x18, 0x5f, 0x41,
- 0x64, 0x71, 0xce, 0xea, 0x8c, 0x59, 0x0b, 0x41, 0xa3, 0x43, 0x11, 0x33,
- 0x5a, 0x30, 0x58, 0x1a, 0x8a, 0x44, 0x85, 0x10, 0xa0, 0xb5, 0xdd, 0xdf,
- 0x7f, 0xf6, 0xac, 0x9f, 0xf4, 0xc8, 0x5b, 0xa7, 0x05, 0xe9, 0x69, 0x6b,
- 0x99, 0x1d, 0xda, 0x8b, 0xd6, 0xa5, 0xdd, 0xa9, 0xae, 0x26, 0xf4, 0x7f,
- 0xf4, 0x9e, 0x96, 0x63, 0xbc, 0x94, 0xf4, 0x15, 0xea, 0x26, 0x42, 0x93,
- 0x96, 0x64, 0x86, 0xd7, 0x87, 0x7e, 0x77, 0x62, 0x1d, 0x32, 0x14, 0x7d,
- 0x59, 0x64, 0xe5, 0x42, 0xc3, 0xac, 0x73, 0x29, 0xb4, 0x81, 0xef, 0x7b,
- 0xb1, 0x29, 0x04, 0xc6, 0x19, 0x57, 0x26, 0x6c, 0x02, 0xf5, 0x72, 0x3c,
- 0x90, 0xb4, 0x5a, 0x36, 0xcf, 0x72, 0x73, 0x04, 0xcc, 0x3f, 0x67, 0xea,
- 0xf7, 0x0e, 0x44, 0xdb, 0x57, 0x49, 0x4f, 0x16, 0x89, 0xfe, 0x18, 0x22,
- 0x4a, 0x9a, 0x4d, 0x68, 0x18, 0xe5, 0x2b, 0xf9, 0xc7, 0x7f, 0xfe, 0xa7,
- 0x69, 0xf6, 0x3f, 0xa9, 0x95, 0x57, 0xff, 0x51, 0x37, 0x37, 0xde, 0x33,
- 0x3d, 0xd9, 0x39, 0x27, 0x2e, 0x46, 0x0c, 0xdc, 0x17, 0xf8, 0x5a, 0x91,
- 0xfd, 0xf5, 0xf6, 0x54, 0x44, 0x5b, 0xdf, 0x1b, 0x5f, 0x8e, 0xbc, 0x3c,
- 0xf6, 0x36, 0x5a, 0xd8, 0xc5, 0x57, 0x14, 0xbf, 0xcd, 0x28, 0x9f, 0xdb,
- 0x2c, 0x02, 0xe8, 0xf8, 0xb6, 0xf5, 0xae, 0x3e, 0x7e, 0xf7, 0xdd, 0xc9,
- 0xc5, 0xd9, 0xbb, 0xb7, 0xc7, 0xef, 0x2e, 0x93, 0xef, 0x0e, 0x2f, 0x4e,
- 0x0e, 0xbf, 0x3a, 0x95, 0xb4, 0x71, 0x1a, 0x02, 0xa1, 0x65, 0x58, 0x89,
- 0xed, 0xd0, 0xa9, 0x7a, 0x19, 0x3d, 0xd1, 0x22, 0x1c, 0x9d, 0xfa, 0xc2,
- 0x1f, 0x84, 0x0b, 0x1c, 0x2a, 0xfd, 0x07, 0xd4, 0x13, 0xea, 0x93, 0x16,
- 0xf7, 0x41, 0x4b, 0x0b, 0x91, 0x15, 0x72, 0xef, 0x25, 0x22, 0x13, 0x90,
- 0x87, 0xb6, 0x94, 0x1e, 0x74, 0x57, 0x54, 0xcf, 0x56, 0xa9, 0xf8, 0x9a,
- 0x73, 0xd9, 0xb5, 0x64, 0x87, 0xbe, 0x8a, 0x35, 0x64, 0x29, 0xed, 0xfa,
- 0x70, 0x78, 0x7a, 0xea, 0x3e, 0xb5, 0xbe, 0x9a, 0x8b, 0xf0, 0x18, 0x71,
- 0x16, 0x14, 0x1a, 0xa5, 0x08, 0xdb, 0x75, 0xe9, 0x88, 0xcd, 0x8b, 0x7b,
- 0x9f, 0xc3, 0x9c, 0x3e, 0x66, 0x96, 0x63, 0x8b, 0x09, 0x28, 0x28, 0xdc,
- 0x6a, 0xac, 0xb1, 0xbc, 0xfe, 0xd8, 0x4f, 0x36, 0xff, 0x63, 0x53, 0x4a,
- 0x72, 0x83, 0x75, 0x97, 0x6b, 0xc5, 0x6c, 0xbb, 0x4e, 0xbd, 0x3b, 0x73,
- 0x7d, 0x92, 0x08, 0xa2, 0xed, 0x80, 0x7d, 0xd1, 0xc5, 0x7f, 0x6b, 0x55,
- 0x0c, 0x00, 0xbc, 0x74, 0x8f, 0x4b, 0x41, 0x05, 0x9b, 0x57, 0x2f, 0x7b,
- 0x94, 0x22, 0x44, 0xd1, 0x77, 0x61, 0xfe, 0xa4, 0x13, 0x8f, 0x5c, 0x19,
- 0x63, 0x2d, 0xc8, 0x67, 0x60, 0x8b, 0x5c, 0xa9, 0x5b, 0xcd, 0x4c, 0x35,
- 0x39, 0xc7, 0x24, 0x2e, 0xb7, 0xac, 0x45, 0x14, 0x61, 0x57, 0x7d, 0xda,
- 0xd1, 0x9a, 0x31, 0x08, 0xd6, 0x11, 0xb0, 0xbe, 0xca, 0xa7, 0x42, 0xd6,
- 0x17, 0xdd, 0x15, 0x43, 0xc4, 0x78, 0x2e, 0x8e, 0xc0, 0x6d, 0x5e, 0x50,
- 0x75, 0x43, 0x57, 0x93, 0x02, 0x20, 0x5c, 0x63, 0xc5, 0x56, 0x94, 0xd9,
- 0x56, 0xc8, 0x6d, 0x0e, 0x60, 0x2b, 0x94, 0xdd, 0xf4, 0xba, 0x54, 0x45,
- 0x36, 0xb5, 0xd1, 0x67, 0x5b, 0xb9, 0xcb, 0x53, 0x8e, 0x2d, 0x03, 0x97,
- 0xf5, 0xfd, 0x21, 0x4e, 0xad, 0x9e, 0x76, 0xc2, 0x69, 0xd1, 0x92, 0x6b,
- 0x25, 0xe6, 0xda, 0xcb, 0x71, 0x76, 0x69, 0x00, 0x24, 0x4b, 0x18, 0xed,
- 0xae, 0x94, 0x58, 0xa0, 0x21, 0xd3, 0x9c, 0x68, 0x20, 0x06, 0xd1, 0x2d,
- 0x7a, 0x10, 0x4d, 0x0a, 0xf8, 0x13, 0x4d, 0xaa, 0x13, 0xd8, 0x9c, 0x9e,
- 0x19, 0x65, 0x62, 0xa9, 0x24, 0x4a, 0x93, 0x71, 0x7e, 0xcd, 0xb9, 0xf5,
- 0x94, 0xc8, 0x4d, 0xbb, 0x04, 0x54, 0x69, 0xc6, 0x42, 0xa6, 0xa5, 0x02,
- 0x11, 0x1a, 0x94, 0xe0, 0x9b, 0x72, 0xe6, 0xb3, 0x75, 0xe9, 0x48, 0x6a,
- 0xa9, 0x49, 0xa6, 0x3e, 0x44, 0xc4, 0x10, 0x96, 0x34, 0x8f, 0x0a, 0xeb,
- 0x12, 0x9a, 0x6f, 0x01, 0xb9, 0x91, 0x73, 0x1a, 0x9c, 0x83, 0x05, 0x52,
- 0x6a, 0x34, 0x27, 0x19, 0xf3, 0xa0, 0x00, 0x60, 0x92, 0x16, 0x70, 0x48,
- 0x51, 0xbd, 0xc4, 0x2d, 0xcb, 0xd3, 0x4d, 0xad, 0x4c, 0x98, 0xe9, 0x94,
- 0x36, 0x3d, 0x87, 0x66, 0xdb, 0x85, 0x75, 0x64, 0xb1, 0x84, 0x83, 0xca,
- 0xec, 0x09, 0xea, 0xb4, 0x99, 0xa9, 0x2d, 0x4f, 0xf0, 0x14, 0x66, 0x8b,
- 0xf0, 0x63, 0x6c, 0x89, 0xc9, 0xbf, 0x06, 0xb6, 0x26, 0x98, 0x04, 0x70,
- 0xb7, 0x5d, 0x00, 0x9f, 0xaf, 0x53, 0xda, 0xad, 0x13, 0xa9, 0xca, 0x88,
- 0x50, 0x37, 0x95, 0x94, 0x04, 0xb1, 0x52, 0xcb, 0x89, 0x97, 0x68, 0xe2,
- 0xca, 0x6c, 0xe6, 0x11, 0x75, 0xb3, 0x5d, 0x9f, 0x06, 0x97, 0x38, 0x45,
- 0x59, 0x86, 0x2c, 0x01, 0x18, 0x42, 0xc3, 0xa4, 0xbe, 0xde, 0x40, 0x04,
- 0x9c, 0x4d, 0x6a, 0x4e, 0xc7, 0x37, 0xe8, 0x09, 0x34, 0x0d, 0x33, 0xfb,
- 0x17, 0x93, 0xd4, 0xa5, 0xc8, 0xd3, 0x39, 0x2b, 0x61, 0x6e, 0xf7, 0xcd,
- 0xef, 0x19, 0xbe, 0xb7, 0xb1, 0x71, 0xf4, 0x7e, 0x74, 0x79, 0xf6, 0x36,
- 0x39, 0x7b, 0x7f, 0x79, 0xfe, 0xfe, 0x52, 0x6e, 0xae, 0x31, 0x83, 0x9f,
- 0x19, 0x02, 0xc0, 0xb7, 0xa9, 0x2e, 0xe6, 0x5c, 0x02, 0xe5, 0xc0, 0x6a,
- 0x94, 0xa0, 0xe7, 0xf3, 0x98, 0x79, 0x6c, 0x72, 0x13, 0x38, 0xab, 0x98,
- 0xf7, 0x17, 0x53, 0x7e, 0x67, 0xa6, 0x1c, 0x89, 0xa9, 0xf0, 0x88, 0x69,
- 0xae, 0x14, 0xec, 0x07, 0x3d, 0x6b, 0xed, 0x9a, 0x2f, 0xf7, 0x6d, 0x7b,
- 0x00, 0x51, 0xee, 0x36, 0x13, 0x92, 0x5f, 0x7a, 0x92, 0x9d, 0x24, 0xce,
- 0x87, 0xe2, 0x63, 0x23, 0xa5, 0x70, 0xa5, 0x7a, 0x72, 0x15, 0x9e, 0x0a,
- 0xcc, 0x4e, 0x3b, 0x43, 0xcf, 0x4f, 0x14, 0x6c, 0x4a, 0x33, 0xc2, 0x1b,
- 0x0b, 0x2d, 0x27, 0x38, 0x0e, 0x20, 0x75, 0x8c, 0x44, 0x20, 0xec, 0x1a,
- 0xab, 0xde, 0xc6, 0xa0, 0x22, 0xdf, 0x7f, 0x70, 0xcb, 0xde, 0x25, 0x9b,
- 0xdf, 0x67, 0x7e, 0x83, 0x7f, 0xfc, 0x6f, 0xca, 0x7f, 0xfc, 0xa0, 0x3f,
- 0xf9, 0x07, 0x7f, 0xf2, 0xa7, 0x62, 0x13, 0x48, 0xb4, 0x76, 0xc8, 0xf9,
- 0xdb, 0xe3, 0x8b, 0xaf, 0x8e, 0x2f, 0xce, 0x46, 0x90, 0x07, 0xea, 0x37,
- 0x0a, 0xf7, 0xfa, 0xc7, 0xac, 0x1a, 0x67, 0x55, 0x29, 0xf5, 0xa8, 0xf4,
- 0x5f, 0xcf, 0x76, 0xbe, 0x1e, 0x8d, 0x0e, 0xcf, 0x4f, 0x6c, 0xc5, 0x17,
- 0x9b, 0x89, 0xc5, 0xb6, 0x46, 0xc1, 0xb9, 0x82, 0x34, 0x7e, 0x7d, 0xc5,
- 0xec, 0x8b, 0xc9, 0x47, 0x46, 0xe8, 0x06, 0xc1, 0x5d, 0x75, 0x50, 0x53,
- 0x54, 0x57, 0x12, 0xf4, 0xa8, 0x61, 0x65, 0x54, 0xf2, 0x59, 0xdb, 0x99,
- 0x5e, 0x9d, 0x9c, 0xea, 0x7d, 0x0b, 0x65, 0xfb, 0x58, 0x8d, 0x8d, 0x29,
- 0x3e, 0xf9, 0xa8, 0x05, 0x90, 0x39, 0xa1, 0xc0, 0x88, 0x4a, 0x46, 0x1a,
- 0x3b, 0xa3, 0xfd, 0x23, 0xd5, 0x92, 0xdf, 0xf9, 0x48, 0xe7, 0x83, 0xaa,
- 0x91, 0xcc, 0x86, 0x2c, 0xdd, 0xf9, 0x40, 0x29, 0x7c, 0x94, 0x44, 0xec,
- 0x3a, 0x96, 0x07, 0xf3, 0x35, 0x5b, 0x42, 0x90, 0x1d, 0x47, 0xe6, 0x27,
- 0x4f, 0x2d, 0xdd, 0x95, 0x5f, 0x8f, 0xfb, 0xca, 0x68, 0xb2, 0x8b, 0xbb,
- 0xa9, 0x5c, 0x22, 0x60, 0x7b, 0x2e, 0xd8, 0xcf, 0xcf, 0x32, 0xbc, 0x1b,
- 0xe9, 0xa1, 0x32, 0x87, 0xc8, 0x7c, 0x10, 0x5c, 0x77, 0x32, 0x9e, 0xa5,
- 0xc5, 0x47, 0xdc, 0x66, 0xb8, 0x9f, 0xc8, 0x76, 0x53, 0x12, 0x27, 0x2a,
- 0x3f, 0x89, 0xc0, 0x9e, 0xf0, 0x2a, 0x40, 0x09, 0x9c, 0x91, 0x70, 0xbb,
- 0x67, 0xa7, 0xb8, 0xe5, 0xaa, 0xf2, 0x42, 0x58, 0x38, 0x4e, 0x6e, 0x12,
- 0xc8, 0x07, 0x73, 0x7c, 0x6a, 0x2e, 0x26, 0x9b, 0xad, 0x01, 0x5b, 0x37,
- 0x9b, 0x91, 0x4f, 0x55, 0xa1, 0x35, 0x9c, 0xa0, 0x98, 0x43, 0x90, 0xb1,
- 0xf4, 0x50, 0x22, 0x72, 0x04, 0x62, 0xb0, 0x5d, 0x90, 0x87, 0x59, 0xdb,
- 0x72, 0x1d, 0x22, 0xb9, 0x59, 0x88, 0x81, 0x65, 0xd3, 0x55, 0xef, 0xf0,
- 0xeb, 0xc8, 0x08, 0x6e, 0xed, 0xc8, 0x01, 0x6b, 0x6c, 0x61, 0x2d, 0xee,
- 0x84, 0x53, 0x4b, 0x6d, 0xa8, 0xae, 0x95, 0x26, 0xb2, 0x72, 0x99, 0xf8,
- 0xf5, 0x98, 0x35, 0xcd, 0xe4, 0x60, 0x53, 0x09, 0x1c, 0x58, 0x5e, 0x1d,
- 0xc5, 0xfe, 0xb6, 0xf1, 0xb6, 0xda, 0x71, 0x0e, 0xab, 0x93, 0x17, 0x74,
- 0xd6, 0x68, 0xf4, 0x0d, 0x58, 0x51, 0xb9, 0x81, 0x9b, 0x29, 0x44, 0x4e,
- 0xd5, 0xa2, 0x7c, 0xf5, 0x61, 0xae, 0x4c, 0xfd, 0x00, 0x27, 0x1b, 0x27,
- 0x3e, 0xc0, 0x1e, 0xb0, 0xfa, 0xed, 0xe0, 0x1d, 0x5d, 0x17, 0xe5, 0x60,
- 0xbc, 0x84, 0x81, 0xe3, 0x15, 0xbc, 0xe2, 0x64, 0x48, 0x63, 0xf7, 0x30,
- 0x2b, 0x19, 0x7e, 0x4f, 0x81, 0x1d, 0xa4, 0x99, 0x73, 0xac, 0x07, 0x79,
- 0x87, 0x6d, 0xc6, 0x1a, 0xcb, 0x53, 0xc2, 0x60, 0x7e, 0x57, 0x89, 0xd7,
- 0x0e, 0x50, 0x16, 0xd9, 0xc2, 0xee, 0x0a, 0x29, 0x97, 0x8a, 0x10, 0x45,
- 0x1b, 0xba, 0xdc, 0x58, 0xe2, 0xf8, 0x4b, 0xa8, 0x09, 0x99, 0xd0, 0xa9,
- 0x2b, 0x26, 0x59, 0x33, 0x20, 0x6e, 0x1b, 0x2a, 0xd1, 0xc4, 0x14, 0x0b,
- 0xe9, 0x8c, 0xeb, 0x5d, 0xac, 0xbc, 0x4a, 0xf8, 0x30, 0x35, 0x97, 0x97,
- 0x7f, 0x39, 0x3f, 0x7e, 0xa5, 0x6f, 0xae, 0x5b, 0x33, 0x66, 0x1e, 0x03,
- 0xf8, 0x24, 0x13, 0xa6, 0x4f, 0xaf, 0xc8, 0xb4, 0xd9, 0x64, 0x83, 0x46,
- 0x83, 0xe2, 0xfc, 0x99, 0x41, 0xf2, 0xc3, 0xeb, 0x93, 0xd1, 0xf9, 0xe9,
- 0xd9, 0xd1, 0xab, 0x97, 0x3f, 0xa8, 0x48, 0xfe, 0x82, 0x7c, 0xed, 0xac,
- 0xa7, 0xd9, 0x9f, 0x39, 0x66, 0x04, 0x79, 0xef, 0xdd, 0xf1, 0xf7, 0x1f,
- 0x8c, 0x75, 0xf0, 0x8a, 0xf8, 0xd1, 0xfb, 0xb7, 0xe9, 0x4c, 0x5e, 0x22,
- 0x13, 0x2b, 0xa2, 0xdb, 0x0d, 0xdb, 0x54, 0x76, 0xdd, 0x89, 0xb5, 0x75,
- 0x3e, 0x1d, 0xe0, 0xff, 0x5e, 0xf1, 0x68, 0x5e, 0x49, 0xa7, 0xb4, 0x95,
- 0x9f, 0x1a, 0xa9, 0xca, 0xeb, 0xae, 0xff, 0xcd, 0x86, 0xc1, 0x89, 0x14,
- 0x8b, 0xf7, 0x43, 0xdc, 0x00, 0x80, 0xca, 0x6f, 0x1c, 0x30, 0x56, 0x78,
- 0x88, 0x2b, 0x42, 0x82, 0x58, 0x22, 0x47, 0x29, 0xf5, 0x8c, 0xe0, 0xb1,
- 0xb0, 0x3d, 0x0a, 0x85, 0x11, 0x61, 0x51, 0x15, 0x96, 0xae, 0x72, 0x4c,
- 0x54, 0x18, 0xdb, 0x97, 0x54, 0x8b, 0xce, 0xa2, 0xb2, 0xcd, 0xf9, 0xf1,
- 0xc5, 0xe8, 0x64, 0x74, 0x49, 0x66, 0x94, 0x54, 0x40, 0x14, 0x67, 0xae,
- 0x96, 0xa7, 0x04, 0xf9, 0x41, 0x9b, 0xb8, 0xd3, 0xaf, 0xba, 0xd1, 0x3a,
- 0xd1, 0x56, 0xcc, 0xb5, 0xb3, 0x21, 0xe9, 0x06, 0xe0, 0x14, 0x4b, 0x52,
- 0x44, 0x99, 0x7e, 0x36, 0xbd, 0xd2, 0x03, 0x5c, 0xca, 0xd6, 0xe8, 0x14,
- 0x9f, 0x40, 0xe1, 0x18, 0xac, 0xce, 0x2c, 0x1f, 0x7b, 0x25, 0xa7, 0xdb,
- 0xb1, 0x58, 0x0a, 0xf3, 0x0b, 0xd5, 0x85, 0x7f, 0x84, 0xd4, 0xb1, 0xec,
- 0x52, 0x8c, 0xa5, 0x28, 0xae, 0x5c, 0x6b, 0x92, 0x1e, 0xe8, 0x27, 0x82,
- 0x5a, 0x43, 0x15, 0xc6, 0x89, 0x5f, 0xfc, 0x1b, 0x3f, 0xf5, 0xd0, 0x9c,
- 0xc2, 0x9e, 0x04, 0xe2, 0x57, 0x11, 0xd9, 0x24, 0x94, 0x73, 0x4e, 0xe9,
- 0x22, 0x8f, 0x85, 0xd1, 0x5a, 0x90, 0xa2, 0x0e, 0xc0, 0x8d, 0x8c, 0x2c,
- 0x50, 0x41, 0x44, 0x75, 0xbc, 0xa6, 0x5c, 0x30, 0x50, 0x54, 0x4d, 0x49,
- 0xdf, 0x82, 0x2b, 0xcb, 0xff, 0x98, 0x5e, 0xa7, 0x34, 0x83, 0xe3, 0xa5,
- 0x5f, 0x52, 0xcd, 0xf6, 0x9e, 0xab, 0x7b, 0x60, 0xe2, 0x01, 0x35, 0x4c,
- 0x2b, 0x70, 0x40, 0x36, 0x42, 0xb9, 0xae, 0x86, 0x8f, 0xe0, 0x06, 0x87,
- 0x6d, 0x36, 0x1c, 0xdd, 0x97, 0x5a, 0xf6, 0x73, 0xdd, 0x8c, 0x7a, 0x35,
- 0x18, 0x69, 0xfb, 0x56, 0x99, 0x02, 0x80, 0xd8, 0xcd, 0x50, 0x93, 0xe7,
- 0xbe, 0x98, 0xd8, 0xcb, 0x98, 0xb2, 0x77, 0x28, 0x50, 0x57, 0x09, 0xd3,
- 0x90, 0x11, 0x7f, 0xe4, 0xa2, 0x45, 0xe1, 0x46, 0x54, 0x34, 0xa6, 0xf0,
- 0x95, 0xb2, 0xd0, 0x39, 0x3c, 0x34, 0x4f, 0xb7, 0xb7, 0xad, 0xd8, 0x4f,
- 0x7d, 0x2f, 0x1f, 0xb4, 0x99, 0xe6, 0xba, 0x58, 0x7d, 0x4e, 0x5c, 0x4a,
- 0x91, 0x27, 0xa3, 0x0e, 0x52, 0x2f, 0xdf, 0xb2, 0x96, 0x2c, 0x56, 0x1b,
- 0xe7, 0x85, 0xc0, 0x6b, 0x55, 0xaf, 0xa5, 0xd1, 0xb5, 0x62, 0x6c, 0x46,
- 0xbf, 0x5c, 0xa0, 0x14, 0xd1, 0x44, 0xb8, 0xd8, 0x81, 0x7e, 0xb5, 0x0d,
- 0xea, 0x25, 0xe2, 0x26, 0xcb, 0xcc, 0xea, 0xdb, 0xf7, 0xa7, 0x97, 0x27,
- 0xe7, 0x7e, 0x1c, 0x2f, 0xf9, 0xfe, 0xe4, 0xf2, 0x1b, 0xa3, 0xb5, 0x8f,
- 0x4e, 0xde, 0x7d, 0x7d, 0x4a, 0xc1, 0x92, 0xb7, 0x6f, 0x0f, 0xdf, 0x51,
- 0x9a, 0xfe, 0x3b, 0x40, 0x04, 0x0f, 0x61, 0x38, 0x90, 0x38, 0x32, 0x53,
- 0x4c, 0x7b, 0x87, 0x12, 0xb8, 0xfb, 0xa1, 0xcf, 0xbe, 0x73, 0xfc, 0xb8,
- 0x3a, 0x71, 0xd1, 0x9e, 0xa4, 0x0d, 0xd4, 0x9a, 0x86, 0x65, 0x70, 0x4f,
- 0x8e, 0x1d, 0x1c, 0x5b, 0x32, 0xb6, 0x68, 0xa2, 0xbb, 0x24, 0xec, 0x48,
- 0x16, 0x64, 0x0d, 0x1d, 0xf1, 0x68, 0xbe, 0xbb, 0x5d, 0x1c, 0x00, 0x2b,
- 0x6a, 0x29, 0x5c, 0x61, 0xc7, 0x18, 0x9d, 0xa9, 0x10, 0xbb, 0x86, 0xef,
- 0xcb, 0x36, 0x78, 0xdf, 0x7c, 0x11, 0x5d, 0x42, 0x40, 0xbe, 0x74, 0xae,
- 0x35, 0xb2, 0x38, 0xc9, 0x68, 0xbe, 0x38, 0xf5, 0x2f, 0xd4, 0x61, 0xab,
- 0x76, 0x97, 0xe2, 0xec, 0xae, 0xcb, 0xcc, 0x9d, 0xdc, 0xc1, 0x99, 0x36,
- 0xa3, 0x7e, 0x54, 0x98, 0x61, 0x7c, 0xb9, 0x0c, 0x48, 0xae, 0x0d, 0xcc,
- 0x92, 0x6c, 0xdb, 0x7a, 0x3d, 0xe2, 0x3e, 0x3b, 0x60, 0xb5, 0xd2, 0x92,
- 0x14, 0x6b, 0x99, 0x3b, 0xd3, 0x9c, 0xb6, 0x2c, 0x98, 0x0e, 0x00, 0x9b,
- 0x25, 0x3f, 0x48, 0xc6, 0x0c, 0x69, 0xa9, 0x8f, 0xb5, 0xd2, 0x9b, 0xf9,
- 0xbe, 0x3b, 0x53, 0x27, 0xbf, 0xe6, 0x87, 0xd9, 0x02, 0x6a, 0x2e, 0x04,
- 0x89, 0x12, 0x65, 0x65, 0x39, 0xcc, 0x3e, 0x65, 0x14, 0x2d, 0xa4, 0xbf,
- 0xfe, 0x75, 0x71, 0xed, 0xa7, 0x8e, 0x71, 0x81, 0xe6, 0x45, 0x6c, 0x65,
- 0x85, 0x11, 0x99, 0xd5, 0x22, 0x29, 0x0a, 0xd7, 0xea, 0x81, 0x54, 0x7a,
- 0xdb, 0x5b, 0xf5, 0x41, 0xf9, 0xfd, 0x7e, 0xf8, 0xfb, 0x7d, 0x76, 0x3b,
- 0x9e, 0x9c, 0xdf, 0x3e, 0xb7, 0x4c, 0xa2, 0x9c, 0x10, 0xed, 0xab, 0x6f,
- 0xaa, 0x14, 0xd0, 0x0e, 0xa3, 0x47, 0xf9, 0xce, 0x49, 0x59, 0x26, 0xb2,
- 0x13, 0x9d, 0xa0, 0x58, 0xcb, 0x0a, 0x89, 0x9e, 0x78, 0x04, 0xfe, 0x56,
- 0xc6, 0xcf, 0x02, 0xad, 0x06, 0x39, 0x45, 0xd7, 0x95, 0x69, 0xd0, 0xfc,
- 0xfe, 0xa9, 0x05, 0xb5, 0x3b, 0x99, 0x86, 0x62, 0x67, 0x92, 0x56, 0x34,
- 0xc8, 0x17, 0xb7, 0x5a, 0x2d, 0xd7, 0xfc, 0xf5, 0xb9, 0x2d, 0x74, 0x53,
- 0xb7, 0x82, 0x3d, 0x2d, 0xd6, 0x5e, 0x15, 0xfe, 0xe8, 0x1c, 0xf0, 0x85,
- 0x24, 0x19, 0x9c, 0x91, 0xd1, 0xe9, 0x57, 0xd6, 0x46, 0x36, 0x7b, 0xe5,
- 0x3e, 0x91, 0x3d, 0x31, 0x43, 0x8a, 0x29, 0xe4, 0x91, 0x27, 0x5c, 0x7c,
- 0xc6, 0x7c, 0x59, 0xf5, 0x1f, 0xf7, 0x77, 0x77, 0xf7, 0x0e, 0xf6, 0x3e,
- 0x7f, 0xb1, 0x7b, 0xb0, 0xb7, 0xb7, 0xb7, 0x7f, 0xb0, 0x77, 0x70, 0xb0,
- 0xbf, 0xfb, 0xf3, 0x0e, 0xf9, 0x8f, 0x6e, 0xf3, 0xec, 0x4e, 0x23, 0x3c,
- 0x9c, 0xd4, 0x86, 0x6d, 0xcd, 0x55, 0xcf, 0xc5, 0x82, 0x17, 0x3b, 0x57,
- 0x35, 0x1f, 0x4b, 0xcf, 0xc0, 0xd8, 0x73, 0xa6, 0x62, 0x5b, 0xb8, 0x94,
- 0x4d, 0x9c, 0x41, 0x8f, 0x2e, 0x1a, 0xbd, 0xfa, 0xdb, 0x92, 0x46, 0x3a,
- 0x26, 0x75, 0x00, 0x3a, 0x4d, 0x6d, 0x13, 0xe4, 0xae, 0x67, 0xe5, 0x78,
- 0x8c, 0x14, 0x00, 0x9b, 0x23, 0x3a, 0x4c, 0x88, 0x93, 0xf4, 0x23, 0x6f,
- 0x09, 0x71, 0xc1, 0x03, 0x9d, 0xc7, 0x07, 0xdd, 0xcd, 0x0e, 0x2b, 0x5e,
- 0x82, 0x48, 0x9e, 0x94, 0xc4, 0xcf, 0x3f, 0x25, 0xa1, 0x64, 0x26, 0xa9,
- 0xb2, 0xb9, 0x23, 0xc9, 0x55, 0xf6, 0xf9, 0xee, 0xc1, 0x01, 0x95, 0xd0,
- 0xf8, 0xe3, 0x5e, 0x5f, 0x80, 0x95, 0x3e, 0x5a, 0xbc, 0x6f, 0xaf, 0x27,
- 0x6e, 0x83, 0xcc, 0x0f, 0x7f, 0x9c, 0xc5, 0x72, 0x9e, 0x55, 0xc6, 0x10,
- 0xa1, 0x22, 0xac, 0x40, 0x16, 0xc2, 0xe9, 0xcd, 0x5c, 0x65, 0x60, 0x36,
- 0xe9, 0xa0, 0xda, 0xe9, 0x46, 0x60, 0xce, 0x55, 0x9b, 0xcd, 0xcd, 0xbc,
- 0x3b, 0x6e, 0x88, 0xb6, 0x6d, 0x94, 0x91, 0x01, 0xe8, 0x89, 0x73, 0x42,
- 0x38, 0x1b, 0x86, 0xef, 0x5b, 0x91, 0x0c, 0x38, 0x5c, 0x05, 0x97, 0x06,
- 0xa5, 0xc7, 0x59, 0x87, 0x87, 0xc7, 0xc4, 0x53, 0x6e, 0x25, 0x11, 0xe6,
- 0x47, 0x6f, 0xb0, 0xfb, 0xcf, 0xf6, 0x7e, 0x66, 0xdc, 0x1f, 0x1d, 0x08,
- 0x37, 0x6b, 0x52, 0x56, 0x6d, 0xea, 0xa7, 0x3a, 0xe8, 0x46, 0xda, 0xca,
- 0x86, 0xd7, 0x43, 0xd5, 0x2a, 0xc4, 0xdb, 0xd8, 0xf7, 0xd1, 0xd7, 0xcc,
- 0xf7, 0xcd, 0x05, 0x7f, 0x61, 0xa7, 0xa9, 0x43, 0x49, 0x1d, 0xc2, 0xec,
- 0xcc, 0x6c, 0xd5, 0xc7, 0x31, 0x37, 0xcc, 0xf1, 0xe5, 0xa1, 0xb9, 0x3c,
- 0xbe, 0x0d, 0x0d, 0xfd, 0xb7, 0x99, 0xb1, 0xca, 0x69, 0xb1, 0xb7, 0x70,
- 0x1e, 0x6e, 0x2d, 0xcb, 0x2e, 0xcd, 0xdd, 0xd3, 0x64, 0x8b, 0x82, 0x16,
- 0xcf, 0x3e, 0x7f, 0xf6, 0x74, 0x9b, 0x4b, 0x1a, 0xf0, 0x6b, 0x19, 0x25,
- 0x5a, 0xc0, 0x2b, 0x29, 0x2c, 0x2f, 0xe4, 0x4e, 0xb6, 0x22, 0xe9, 0xfd,
- 0xc5, 0x09, 0x1f, 0xe9, 0x1b, 0x4e, 0xc6, 0x67, 0xa3, 0xb7, 0xcb, 0xca,
- 0x86, 0xfb, 0xd6, 0x53, 0x32, 0xe6, 0x39, 0x31, 0x06, 0x22, 0x89, 0x99,
- 0x2e, 0x46, 0x9b, 0x44, 0x8f, 0x1b, 0xd6, 0x1c, 0xd0, 0x12, 0x85, 0xfe,
- 0xa4, 0x7e, 0x12, 0x3a, 0x03, 0x8a, 0x41, 0x62, 0x38, 0x95, 0x7d, 0x66,
- 0x2d, 0x30, 0xb2, 0x83, 0x58, 0x1e, 0xb1, 0xf4, 0xef, 0xb0, 0x5a, 0x6f,
- 0x73, 0xe8, 0x1c, 0x4a, 0x21, 0x6d, 0x43, 0xf3, 0xa0, 0x62, 0x30, 0xa9,
- 0xc7, 0xad, 0xb4, 0x2e, 0xa7, 0x6d, 0x7a, 0xe4, 0x48, 0xca, 0x8b, 0x22,
- 0xa2, 0xc8, 0x4e, 0x21, 0xc7, 0x85, 0x1b, 0x78, 0x16, 0xf3, 0x96, 0xcb,
- 0x47, 0x92, 0xd2, 0x91, 0x1c, 0x0e, 0xec, 0xee, 0xdc, 0x5c, 0x47, 0xd5,
- 0xbd, 0x68, 0xd8, 0x30, 0x13, 0x6c, 0x5d, 0xb2, 0x4e, 0x64, 0x9d, 0xe9,
- 0x17, 0x7c, 0x48, 0xba, 0x65, 0x1f, 0x51, 0xa3, 0xb9, 0xd5, 0x81, 0x96,
- 0xd8, 0x1f, 0xcc, 0xf5, 0x57, 0x1e, 0xf0, 0xc4, 0xcf, 0xd3, 0xd2, 0xbf,
- 0xeb, 0x73, 0x1e, 0x26, 0x31, 0xed, 0x0e, 0x6c, 0x45, 0xd7, 0x98, 0x99,
- 0x12, 0x38, 0x24, 0x6b, 0xfd, 0x6c, 0xa1, 0x27, 0x3b, 0x3b, 0xdb, 0x2b,
- 0x7a, 0x23, 0xbf, 0x8e, 0x7d, 0xfd, 0x1c, 0xe4, 0x1e, 0x5e, 0x6a, 0xa4,
- 0x59, 0xf3, 0x76, 0xe3, 0x34, 0xb5, 0x79, 0x4d, 0x2b, 0x39, 0x15, 0x80,
- 0x29, 0xbb, 0x51, 0xd5, 0xbc, 0xe2, 0xce, 0xab, 0xf0, 0x6a, 0x0f, 0x42,
- 0x30, 0x2d, 0x4a, 0xb6, 0xc4, 0xd5, 0x99, 0x39, 0x4e, 0x38, 0x4c, 0x0e,
- 0x69, 0x37, 0xb4, 0x3e, 0xec, 0x75, 0x59, 0xfd, 0xb9, 0xca, 0x1f, 0xae,
- 0x4a, 0xac, 0x75, 0xe7, 0xf5, 0xbd, 0x5f, 0xaa, 0x9a, 0xa7, 0xb9, 0xf5,
- 0xd6, 0xd9, 0x3b, 0xce, 0x98, 0x47, 0xc4, 0x4a, 0x4e, 0x8f, 0x17, 0x38,
- 0x2f, 0x5a, 0x05, 0x37, 0xa5, 0x11, 0x44, 0x8c, 0xed, 0x20, 0x40, 0x39,
- 0x58, 0x29, 0x95, 0xad, 0x5f, 0x84, 0x0f, 0xa9, 0xfc, 0x82, 0x0e, 0x67,
- 0xc5, 0xda, 0x6e, 0x62, 0x0e, 0x5b, 0x8e, 0x79, 0x7b, 0xb5, 0xe6, 0xa3,
- 0xcf, 0x3b, 0x9e, 0xd1, 0x00, 0x0c, 0x5c, 0x35, 0x87, 0x84, 0x04, 0xc6,
- 0xe1, 0xc9, 0x29, 0xc1, 0xcb, 0x4e, 0x8d, 0x89, 0x37, 0x52, 0x55, 0x09,
- 0x70, 0x4b, 0x00, 0xdf, 0x8a, 0x9c, 0xd4, 0xf5, 0xbe, 0x2d, 0xdc, 0xa1,
- 0x59, 0x47, 0xb0, 0x5b, 0x28, 0xb8, 0xc7, 0xa6, 0xbf, 0x90, 0xed, 0x99,
- 0xd5, 0x32, 0xfa, 0x52, 0xcd, 0x4e, 0x5b, 0x10, 0xd9, 0x12, 0xc5, 0xfb,
- 0x6d, 0x36, 0x2b, 0x17, 0x30, 0xa9, 0x59, 0x4c, 0xa3, 0x6e, 0x50, 0x95,
- 0xcd, 0xb2, 0x5b, 0xf1, 0xae, 0x32, 0x2d, 0xe8, 0xd7, 0x12, 0xc3, 0xe4,
- 0xc2, 0xa1, 0x8d, 0xa0, 0xc3, 0x83, 0x38, 0x29, 0x7d, 0x74, 0x87, 0xd9,
- 0x55, 0x1c, 0x69, 0x06, 0x7d, 0xdf, 0x91, 0xd9, 0x9b, 0x19, 0xb2, 0x64,
- 0xe8, 0x03, 0x32, 0x72, 0x05, 0x24, 0xfa, 0xbe, 0x16, 0x5e, 0x84, 0x2e,
- 0xea, 0x9a, 0x9d, 0x85, 0x5a, 0x7b, 0x8e, 0xbd, 0xef, 0x7d, 0xa5, 0x1b,
- 0xe6, 0x90, 0x01, 0xdd, 0x3c, 0x7d, 0xf2, 0xd4, 0x72, 0x2d, 0x75, 0x63,
- 0x91, 0x51, 0x61, 0x89, 0x3e, 0xa7, 0x60, 0x62, 0x73, 0x94, 0x33, 0xf3,
- 0x4f, 0x00, 0x93, 0x18, 0xaa, 0x68, 0x9e, 0x25, 0xba, 0x54, 0x0f, 0x1b,
- 0x6a, 0xfe, 0xc9, 0x69, 0x05, 0xf2, 0x2f, 0x34, 0x55, 0x2d, 0xc1, 0xca,
- 0xdb, 0xe7, 0xdb, 0x90, 0xa2, 0x8e, 0xcd, 0x64, 0x68, 0x7b, 0x2f, 0xd1,
- 0x73, 0xee, 0xff, 0x6b, 0x9e, 0x4a, 0x1a, 0x04, 0xeb, 0x21, 0x65, 0xa5,
- 0xd3, 0xcb, 0xcb, 0x30, 0xe6, 0x52, 0x81, 0x5f, 0x2d, 0x29, 0x1a, 0x66,
- 0x0b, 0xe1, 0x50, 0x2f, 0xe6, 0x74, 0x17, 0x65, 0x5c, 0x95, 0xd3, 0x36,
- 0x4e, 0x26, 0xdd, 0xd2, 0x2c, 0x2f, 0xb7, 0x7e, 0x5a, 0xde, 0x51, 0x49,
- 0xd1, 0xab, 0xab, 0x7c, 0x42, 0x01, 0x6e, 0xc7, 0xbe, 0x4b, 0x32, 0x9e,
- 0x1f, 0x9c, 0x6b, 0x15, 0x23, 0x33, 0xb6, 0x64, 0xb1, 0x1c, 0xcf, 0xcc,
- 0x65, 0xad, 0xb8, 0x70, 0x73, 0xaa, 0x30, 0x4b, 0xc6, 0xda, 0x42, 0x73,
- 0x4c, 0x13, 0x06, 0x83, 0xb3, 0x83, 0x45, 0x96, 0x3a, 0xeb, 0xa4, 0x82,
- 0xcf, 0x51, 0x5b, 0x95, 0x00, 0xbb, 0xf3, 0xb2, 0xd0, 0xb4, 0x92, 0x65,
- 0xcd, 0xb4, 0x8c, 0x5a, 0x94, 0x7d, 0x83, 0x43, 0x13, 0xf9, 0x4c, 0xc8,
- 0xcf, 0xc5, 0x34, 0xc7, 0x1b, 0xfe, 0x60, 0xa6, 0x83, 0xc5, 0xcd, 0x42,
- 0x57, 0x5a, 0x15, 0x22, 0xd6, 0x96, 0x24, 0x91, 0x01, 0x47, 0xef, 0xfc,
- 0x9b, 0xf3, 0x61, 0x72, 0x4c, 0x2d, 0x71, 0x9f, 0x44, 0xd1, 0x85, 0x8f,
- 0xc6, 0xfc, 0xce, 0x0c, 0xf6, 0x9a, 0x2e, 0xb0, 0xb3, 0x8a, 0xfe, 0x85,
- 0xd6, 0xe4, 0x97, 0xec, 0x96, 0xc5, 0x6f, 0xdb, 0x5f, 0x35, 0x0d, 0x29,
- 0x5c, 0xf9, 0x1c, 0x7f, 0x37, 0x67, 0xc5, 0xa8, 0x5f, 0x76, 0x99, 0xdc,
- 0x17, 0xca, 0xaa, 0x45, 0x62, 0xc3, 0x6f, 0x26, 0x46, 0x2b, 0x83, 0x6e,
- 0xb5, 0xb8, 0xc7, 0xfa, 0x79, 0xc2, 0x91, 0xf5, 0x4f, 0x6e, 0xc0, 0xdb,
- 0x5a, 0xb2, 0xfd, 0x2c, 0x10, 0x8e, 0x0f, 0x56, 0xc5, 0xf4, 0x2d, 0x55,
- 0x26, 0xb0, 0xc1, 0x52, 0xc2, 0xa4, 0xec, 0xd1, 0xa8, 0xb3, 0xce, 0x79,
- 0xf5, 0xec, 0x37, 0xfd, 0x05, 0x99, 0xdd, 0xd4, 0x17, 0xa3, 0xb5, 0x98,
- 0x25, 0x18, 0x6e, 0xfc, 0x7f, 0x01, 0x18, 0x6d, 0x77, 0xf2, 0x19, 0xca,
+ 0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xfd,
+ 0x6b, 0x5b, 0x24, 0x47, 0x92, 0x26, 0x80, 0x7e, 0xe7, 0x57, 0xc4, 0xd0,
+ 0xa7, 0x07, 0x98, 0xce, 0x4c, 0x2e, 0x75, 0x91, 0x8a, 0xae, 0xd2, 0x08,
+ 0x51, 0x94, 0xc4, 0x88, 0x02, 0x96, 0xa4, 0x24, 0xf5, 0x4a, 0x7a, 0xea,
+ 0x89, 0xcc, 0x0c, 0x20, 0x9a, 0xcc, 0x88, 0xec, 0x88, 0x48, 0x28, 0x7a,
+ 0x76, 0xf6, 0xb7, 0x1f, 0xb7, 0xd7, 0xcc, 0xdc, 0x3d, 0xc2, 0x3d, 0x13,
+ 0xa4, 0x96, 0x7a, 0xe7, 0x9c, 0xdd, 0xb9, 0xa8, 0xaa, 0x20, 0xc2, 0xc3,
+ 0xaf, 0xe6, 0x76, 0x79, 0xed, 0xb5, 0x24, 0x79, 0xec, 0x7f, 0x3e, 0xe2,
+ 0xff, 0x3f, 0x9a, 0xff, 0x31, 0x7f, 0xae, 0x25, 0xc9, 0x79, 0x55, 0xfe,
+ 0x35, 0x1b, 0x37, 0xf1, 0x67, 0x3f, 0x7e, 0xfc, 0x5f, 0x09, 0xff, 0xaf,
+ 0x79, 0xe7, 0x27, 0xf3, 0xe7, 0xda, 0xca, 0xb6, 0xb7, 0x13, 0xf7, 0xc2,
+ 0xff, 0xfa, 0xb8, 0x95, 0x3c, 0xf6, 0xc2, 0xff, 0x4a, 0x36, 0xf1, 0xc2,
+ 0x47, 0xf9, 0xc2, 0x6b, 0xfa, 0xfb, 0xc7, 0x8f, 0xab, 0x3f, 0xf2, 0x13,
+ 0xf5, 0x8a, 0xfe, 0xb3, 0x4d, 0xef, 0xfd, 0xf4, 0x91, 0xfe, 0x6a, 0x7e,
+ 0xb2, 0xb6, 0x76, 0x7a, 0xf0, 0xfe, 0x48, 0x5f, 0x1d, 0x2f, 0xaa, 0x69,
+ 0xd2, 0x4f, 0x9a, 0x2a, 0x2d, 0xea, 0xab, 0xac, 0x4a, 0xd2, 0xe4, 0xc3,
+ 0xc5, 0xc9, 0xda, 0xda, 0xf0, 0x2f, 0xa7, 0x67, 0xe7, 0xc3, 0xe3, 0x61,
+ 0xeb, 0xb1, 0x1f, 0xcb, 0x79, 0x93, 0x97, 0x45, 0xfd, 0x73, 0xf2, 0xa3,
+ 0x79, 0x68, 0x30, 0x18, 0xfc, 0xbc, 0xb6, 0xf6, 0xf6, 0x68, 0x78, 0x78,
+ 0x71, 0x7c, 0x7e, 0x79, 0x7c, 0x76, 0xda, 0x7a, 0x36, 0xc9, 0xeb, 0xc4,
+ 0x34, 0xd6, 0x94, 0xe5, 0xd4, 0xfc, 0xc7, 0xb5, 0x3f, 0x49, 0x9b, 0x34,
+ 0xb9, 0xaa, 0xca, 0x59, 0x52, 0x56, 0xf4, 0x8b, 0x34, 0xa9, 0xb3, 0xea,
+ 0x2e, 0xab, 0x7a, 0xc9, 0xa2, 0xce, 0x8b, 0xeb, 0xa4, 0x2c, 0xb2, 0xa4,
+ 0xbc, 0x4a, 0x9a, 0x9b, 0x4c, 0x9b, 0xab, 0x17, 0xf3, 0x79, 0x59, 0x35,
+ 0xd9, 0x24, 0x99, 0x57, 0x65, 0x53, 0x8e, 0xcb, 0x69, 0x9d, 0x6c, 0xbe,
+ 0x3d, 0x3e, 0xbc, 0xec, 0x25, 0xef, 0x8e, 0x4f, 0x8e, 0xcc, 0x7f, 0x2f,
+ 0xcf, 0xf1, 0x9f, 0x61, 0x2f, 0xf9, 0xfa, 0xec, 0xfc, 0x9b, 0xa3, 0x8b,
+ 0x5e, 0xf2, 0xcd, 0x25, 0xfd, 0x8c, 0xfe, 0x6b, 0x7e, 0x98, 0x1c, 0xbf,
+ 0x3f, 0x38, 0xef, 0x69, 0x73, 0xf4, 0x0f, 0xfa, 0xe1, 0xc9, 0x5b, 0xf3,
+ 0x43, 0xfe, 0x83, 0xfe, 0x79, 0x7e, 0x76, 0xfe, 0x4c, 0xfe, 0xa0, 0x7f,
+ 0x5e, 0x5c, 0xbe, 0x37, 0xbf, 0xbd, 0xb8, 0x1c, 0x9a, 0xff, 0x0e, 0x0f,
+ 0xe9, 0x3f, 0xf8, 0xca, 0xf0, 0xfd, 0x57, 0xf8, 0xcf, 0xd0, 0x36, 0x37,
+ 0x7c, 0xcf, 0x3f, 0xc7, 0x97, 0x2e, 0x8f, 0x4e, 0x4e, 0x8f, 0x2e, 0x93,
+ 0xb4, 0x98, 0x24, 0x97, 0xe6, 0xf9, 0xad, 0x41, 0x72, 0x79, 0x93, 0x25,
+ 0xe3, 0x72, 0x36, 0xa3, 0x1f, 0x99, 0x19, 0x99, 0x64, 0x75, 0x7e, 0x5d,
+ 0x98, 0xa1, 0x98, 0x91, 0xdf, 0x97, 0xd5, 0x6d, 0x92, 0xdc, 0xe7, 0xcd,
+ 0x4d, 0xb9, 0x68, 0xb4, 0xb9, 0x85, 0x99, 0x8d, 0x24, 0x2f, 0x9a, 0xac,
+ 0x4a, 0xc7, 0x34, 0xd7, 0x83, 0xb5, 0xd6, 0xac, 0x96, 0x57, 0x66, 0x0e,
+ 0x6b, 0x33, 0x69, 0xa3, 0x45, 0x3d, 0x2d, 0xd3, 0x09, 0x4d, 0x95, 0x79,
+ 0xe5, 0x6a, 0x61, 0x26, 0xb9, 0xca, 0xc7, 0xb7, 0x75, 0x32, 0xcd, 0x6f,
+ 0x33, 0x9a, 0xa8, 0x4f, 0x0f, 0x3a, 0x71, 0x3d, 0x6e, 0x34, 0x5d, 0x98,
+ 0x39, 0x2d, 0xfa, 0xda, 0x5c, 0x93, 0x8f, 0x53, 0xfa, 0x00, 0x66, 0x2e,
+ 0x59, 0xcc, 0xa9, 0x35, 0x9e, 0xb1, 0x64, 0x5e, 0xd6, 0xe6, 0xa5, 0xe1,
+ 0xf0, 0xc4, 0xf4, 0xbc, 0x28, 0x32, 0xf4, 0xa3, 0xee, 0x99, 0x7f, 0x94,
+ 0xb7, 0x79, 0x66, 0xfe, 0x72, 0x95, 0x4f, 0xb3, 0x84, 0x57, 0xd4, 0x36,
+ 0x47, 0x4b, 0x9b, 0x54, 0x59, 0xbd, 0x98, 0x65, 0x66, 0xf6, 0xde, 0x67,
+ 0x4d, 0x3a, 0xcd, 0x8b, 0x5b, 0xf3, 0x57, 0x1a, 0xf8, 0xac, 0xac, 0xb2,
+ 0x41, 0x72, 0x50, 0x27, 0x0f, 0xe5, 0xc2, 0x0c, 0x78, 0x3a, 0x35, 0x6b,
+ 0x9e, 0x25, 0xa3, 0x6c, 0x5a, 0xde, 0xf7, 0x68, 0xa5, 0x93, 0x62, 0x31,
+ 0x1b, 0x99, 0x06, 0xca, 0x2b, 0xd7, 0x5c, 0xda, 0x2c, 0x4c, 0x73, 0xfc,
+ 0xf4, 0x2c, 0x35, 0x63, 0x32, 0xef, 0x56, 0xc9, 0x4d, 0x66, 0xc6, 0x5c,
+ 0xcf, 0xf3, 0xe2, 0x5f, 0xda, 0xf3, 0x62, 0xa6, 0x76, 0x5e, 0xde, 0x67,
+ 0x95, 0x99, 0xd9, 0xd1, 0x43, 0x62, 0x26, 0x61, 0xc4, 0x9b, 0xf0, 0xca,
+ 0x6c, 0xb2, 0x24, 0x35, 0x4d, 0xd8, 0x0d, 0xd8, 0xaf, 0xb2, 0x69, 0x4a,
+ 0x9b, 0xc9, 0x7e, 0x63, 0x60, 0x16, 0x31, 0xb3, 0xbb, 0x4d, 0x5e, 0xdd,
+ 0x7c, 0xb6, 0x85, 0x97, 0x27, 0x66, 0x24, 0xf9, 0xb4, 0x36, 0xcb, 0x40,
+ 0xc7, 0x42, 0x9e, 0xa1, 0x45, 0xa5, 0x63, 0x62, 0xf6, 0xe6, 0x43, 0xd1,
+ 0xa4, 0x9f, 0xf0, 0x79, 0xd9, 0x9b, 0xfd, 0x49, 0x36, 0xcf, 0x8a, 0x49,
+ 0x56, 0x34, 0x83, 0xe4, 0x2f, 0xe5, 0x62, 0xc3, 0x7c, 0xfb, 0x2a, 0x37,
+ 0x73, 0x90, 0x4a, 0x53, 0xe6, 0xcb, 0x66, 0x13, 0x8c, 0xab, 0x7c, 0xee,
+ 0x2d, 0x45, 0x59, 0x98, 0x35, 0x4f, 0x2e, 0xde, 0x1d, 0x26, 0xcf, 0x5e,
+ 0x7d, 0xfe, 0xd2, 0xad, 0xb9, 0x69, 0x20, 0x19, 0xa7, 0x85, 0x19, 0x71,
+ 0x36, 0xce, 0xaf, 0x1e, 0x92, 0xd9, 0x62, 0xda, 0xe4, 0x73, 0x33, 0xfb,
+ 0xe6, 0xe3, 0x35, 0x1d, 0xa0, 0x79, 0x5a, 0x35, 0x35, 0x6d, 0x02, 0xfc,
+ 0x00, 0x63, 0xbf, 0xaf, 0xf2, 0x86, 0x0e, 0x12, 0x7e, 0x67, 0x7a, 0x98,
+ 0x35, 0xb5, 0x36, 0x47, 0x7b, 0xcd, 0x7c, 0x67, 0x64, 0xf6, 0x96, 0x99,
+ 0xda, 0xb4, 0x36, 0x1f, 0xdd, 0x5f, 0x73, 0x32, 0xe4, 0xa6, 0x69, 0xe6,
+ 0xfb, 0xdb, 0xdb, 0x75, 0xde, 0x64, 0x83, 0xff, 0x34, 0xe7, 0xb0, 0xd7,
+ 0xdc, 0x97, 0xbd, 0xe6, 0xa6, 0xca, 0xb2, 0xff, 0x1a, 0x98, 0x3d, 0x6c,
+ 0x9f, 0x34, 0xdf, 0x7d, 0x90, 0x8e, 0x5d, 0x67, 0x8d, 0xf9, 0xc2, 0xdf,
+ 0x16, 0x59, 0x41, 0x2d, 0x9a, 0x7e, 0xa4, 0xd3, 0xf9, 0x4d, 0x6a, 0x96,
+ 0x33, 0x33, 0xbb, 0x91, 0x4e, 0xb6, 0xd9, 0x30, 0xd4, 0x2b, 0x3e, 0xdb,
+ 0x3f, 0xfe, 0x1c, 0x7e, 0xf4, 0x0a, 0xdf, 0x34, 0xff, 0x1d, 0x64, 0x9f,
+ 0xd2, 0x99, 0x19, 0x1b, 0x7d, 0x6a, 0x9b, 0xb6, 0xd8, 0x8f, 0xbb, 0xfd,
+ 0xdd, 0x9d, 0x9d, 0x9f, 0x07, 0xcd, 0xa7, 0xe6, 0x69, 0xcf, 0xef, 0xec,
+ 0xb8, 0x37, 0xe8, 0xd1, 0x4d, 0x1a, 0x6f, 0x32, 0x35, 0x5b, 0x86, 0x3e,
+ 0xfe, 0xf7, 0xac, 0x2a, 0xeb, 0xad, 0xa7, 0xb5, 0x94, 0xf6, 0xff, 0xde,
+ 0xfe, 0xee, 0x69, 0x56, 0x63, 0xcf, 0xb8, 0xb1, 0x26, 0x69, 0x65, 0xf6,
+ 0x6d, 0xd9, 0x38, 0xf1, 0xd4, 0x33, 0x87, 0xb2, 0xb1, 0x33, 0x63, 0xce,
+ 0x9c, 0x79, 0xda, 0x08, 0xb6, 0x74, 0x4a, 0x32, 0xad, 0x4e, 0x8a, 0xec,
+ 0x93, 0x3d, 0xe5, 0xe6, 0xf4, 0x67, 0xe9, 0xf8, 0x26, 0x29, 0xcd, 0xe6,
+ 0xaf, 0x22, 0x4b, 0xe0, 0x77, 0x28, 0xad, 0xc6, 0x37, 0xf9, 0x9d, 0x99,
+ 0x8d, 0x57, 0xaf, 0x5e, 0xf6, 0xcd, 0x7f, 0x5e, 0xfd, 0xbc, 0x7d, 0x57,
+ 0x4e, 0xcd, 0xe4, 0x3c, 0xff, 0x79, 0x9b, 0x96, 0xf8, 0x3f, 0xd3, 0xde,
+ 0xa8, 0x37, 0xfe, 0xaf, 0xc1, 0x4d, 0x33, 0x9b, 0x2e, 0xdd, 0x38, 0x69,
+ 0x61, 0xfe, 0x7f, 0x56, 0x2e, 0x8a, 0xc6, 0x6e, 0x16, 0xb3, 0xe7, 0x1a,
+ 0x4f, 0x38, 0x99, 0xe3, 0x6a, 0xce, 0x28, 0x6d, 0x6d, 0xda, 0x43, 0x74,
+ 0xea, 0xcc, 0x01, 0x75, 0xc7, 0xb1, 0x19, 0xdf, 0x98, 0xf1, 0x9b, 0xcd,
+ 0x93, 0xca, 0x1c, 0x34, 0x79, 0x4a, 0x07, 0xd3, 0xc8, 0x07, 0x92, 0x57,
+ 0x68, 0x8a, 0x3f, 0x96, 0x9b, 0xe7, 0xca, 0x6a, 0x92, 0x55, 0xed, 0x6d,
+ 0x8c, 0xee, 0xb8, 0xfe, 0x24, 0x66, 0x3e, 0xe7, 0xe6, 0xe3, 0x0b, 0x12,
+ 0x75, 0x38, 0x69, 0xd4, 0x82, 0x39, 0xa3, 0xd7, 0x66, 0xaa, 0xcc, 0xf4,
+ 0xd0, 0xc6, 0xa2, 0xd9, 0x7b, 0x48, 0x4e, 0xcd, 0x1a, 0xb2, 0x7c, 0xf0,
+ 0xf6, 0xdf, 0x34, 0x6b, 0x9a, 0x47, 0x67, 0xce, 0x6d, 0xa2, 0xfd, 0xdd,
+ 0x60, 0x1f, 0x2d, 0x7b, 0xde, 0x2c, 0xfd, 0xfe, 0x5e, 0xfb, 0xe1, 0xef,
+ 0x8d, 0xdc, 0x74, 0x3b, 0xd8, 0x7c, 0xfd, 0x3f, 0xff, 0xcb, 0xdb, 0x08,
+ 0xf7, 0xf4, 0xdb, 0xbc, 0xb8, 0x2b, 0x6f, 0xcd, 0xc0, 0x71, 0xb1, 0xa5,
+ 0xad, 0x49, 0x4d, 0x48, 0x34, 0xcc, 0xe6, 0x8d, 0xbd, 0x31, 0x68, 0x87,
+ 0x98, 0x1f, 0x8d, 0xd2, 0xd1, 0xf4, 0x21, 0xb9, 0x49, 0xef, 0x32, 0x1a,
+ 0xef, 0xdc, 0x6c, 0x1d, 0x9a, 0x01, 0x23, 0xc9, 0xa7, 0x10, 0x2d, 0x72,
+ 0x56, 0x27, 0xe5, 0x62, 0x64, 0xce, 0xfb, 0xdf, 0x16, 0x65, 0xc3, 0x13,
+ 0x93, 0xde, 0x95, 0xf9, 0xa4, 0x75, 0x3d, 0xde, 0x64, 0x24, 0x63, 0xe8,
+ 0xc3, 0xb8, 0x37, 0x8c, 0x8c, 0xa3, 0x9e, 0x62, 0xef, 0xe7, 0x0d, 0xdd,
+ 0x40, 0x46, 0x3a, 0xa5, 0xd3, 0xba, 0x4c, 0x92, 0xeb, 0x92, 0x36, 0x2e,
+ 0x64, 0x22, 0x76, 0x9e, 0x59, 0x94, 0x9b, 0x94, 0x2e, 0x1a, 0x73, 0xa7,
+ 0xd8, 0xad, 0x59, 0x65, 0x10, 0x8f, 0x58, 0xa9, 0x74, 0xda, 0xe3, 0x0b,
+ 0x85, 0xde, 0x91, 0xa9, 0x4a, 0x36, 0xfe, 0x75, 0xa3, 0x97, 0x6c, 0xfc,
+ 0xfb, 0x06, 0x44, 0xfb, 0xc6, 0xbf, 0x6d, 0xb8, 0x75, 0x36, 0x1a, 0xd2,
+ 0x5d, 0x3e, 0xa1, 0xbb, 0xc1, 0x8c, 0xe4, 0xf8, 0xfc, 0xee, 0x65, 0xf2,
+ 0x77, 0xba, 0xce, 0x8d, 0xf8, 0xcb, 0x3e, 0xe9, 0x26, 0xd1, 0xb1, 0x99,
+ 0xb7, 0x13, 0x23, 0x07, 0xd3, 0x39, 0xdd, 0xeb, 0x59, 0x35, 0x36, 0x3b,
+ 0x2a, 0xbd, 0x36, 0x7b, 0xc8, 0x5c, 0x8f, 0xda, 0x1c, 0xb5, 0x4f, 0xaf,
+ 0xf0, 0xb0, 0x8c, 0xcc, 0x4a, 0x8a, 0x74, 0x66, 0x36, 0xe9, 0x09, 0xf5,
+ 0x28, 0x2f, 0xc2, 0xc5, 0xfc, 0xf1, 0x2a, 0xfb, 0x7c, 0x67, 0x7f, 0xff,
+ 0xd9, 0x1f, 0xf7, 0x5e, 0x64, 0xcd, 0xcd, 0xce, 0xcf, 0xdb, 0xf6, 0x91,
+ 0xe3, 0x2b, 0x4c, 0xbb, 0x6e, 0x3f, 0xed, 0x84, 0xb9, 0x78, 0xad, 0xe0,
+ 0x36, 0xef, 0x9b, 0xbf, 0x67, 0x57, 0xf9, 0xa7, 0x9e, 0xaa, 0x30, 0x7c,
+ 0x0c, 0x52, 0xb3, 0xd5, 0xcc, 0xfa, 0xd1, 0xa9, 0xd5, 0xe6, 0xae, 0x17,
+ 0x59, 0x6d, 0x66, 0xf2, 0xfe, 0x26, 0x6d, 0x12, 0xdb, 0x00, 0xaf, 0xec,
+ 0x2c, 0xbf, 0xbe, 0x69, 0x92, 0xfb, 0x94, 0xe4, 0xff, 0x71, 0xc3, 0x4d,
+ 0xd0, 0xc5, 0x6b, 0xa4, 0xfe, 0x55, 0x6a, 0xc4, 0x37, 0xad, 0x21, 0x6e,
+ 0xd9, 0x91, 0xbb, 0xf4, 0x1b, 0xb3, 0xcd, 0x79, 0x41, 0x9c, 0x86, 0x33,
+ 0x4a, 0x6b, 0x3a, 0x48, 0x85, 0x39, 0xaf, 0x8d, 0xb9, 0xb6, 0x17, 0xf4,
+ 0xaf, 0x1b, 0x73, 0x31, 0x63, 0x0e, 0xa4, 0xa3, 0xb8, 0xbb, 0xde, 0xd1,
+ 0x72, 0xd2, 0xda, 0xd8, 0xfb, 0xc4, 0x2c, 0x52, 0x4f, 0x96, 0xd9, 0xbe,
+ 0x51, 0x9b, 0x03, 0x67, 0x84, 0x85, 0xdd, 0x19, 0xeb, 0x24, 0xf7, 0xd6,
+ 0x79, 0x9c, 0xe8, 0x63, 0x5a, 0xd3, 0xdd, 0xcd, 0x37, 0xb4, 0xe9, 0xbc,
+ 0x37, 0x58, 0x33, 0x69, 0xe9, 0x2d, 0x69, 0x09, 0x1d, 0x5d, 0x04, 0xaf,
+ 0x4d, 0x4a, 0xb3, 0xc9, 0x4c, 0x6f, 0x8d, 0x7c, 0xa4, 0x91, 0x91, 0xd4,
+ 0xc3, 0xac, 0x60, 0x93, 0x9b, 0x36, 0xe9, 0x87, 0x79, 0x43, 0x62, 0x1f,
+ 0x8a, 0xa5, 0xe9, 0xaf, 0x99, 0x14, 0xe8, 0x86, 0x46, 0x76, 0x7a, 0xe3,
+ 0xc7, 0x8d, 0x65, 0x9e, 0x4d, 0xee, 0x8c, 0xe2, 0x60, 0x74, 0xc4, 0xcc,
+ 0xbe, 0x85, 0x2b, 0x76, 0x4c, 0xea, 0xca, 0xd4, 0x9c, 0x97, 0x71, 0x59,
+ 0x55, 0xa4, 0x84, 0xd3, 0x0a, 0x8e, 0x58, 0xae, 0xcd, 0x32, 0x73, 0xb3,
+ 0xfb, 0xd3, 0x99, 0xd3, 0x1d, 0x63, 0xe4, 0x8b, 0x51, 0x15, 0x20, 0x41,
+ 0xcc, 0x95, 0x0e, 0x31, 0x8c, 0x81, 0xa3, 0x77, 0xd4, 0xf6, 0x78, 0x9c,
+ 0xcd, 0x9b, 0x3a, 0x36, 0x26, 0x5d, 0x70, 0xd3, 0x9d, 0x2a, 0xa3, 0x99,
+ 0xf7, 0xf5, 0x20, 0xcc, 0xab, 0xbd, 0x87, 0xa1, 0x0a, 0xa9, 0x6a, 0x61,
+ 0x54, 0xa3, 0xda, 0xce, 0x5a, 0x83, 0xbd, 0x61, 0xc4, 0x18, 0xe6, 0x7c,
+ 0x46, 0x1d, 0xa5, 0x87, 0x6b, 0x3e, 0xa9, 0x10, 0x97, 0xb4, 0x90, 0xac,
+ 0xfc, 0xf2, 0x77, 0xe9, 0x36, 0x31, 0xf3, 0x69, 0x1b, 0x37, 0x5f, 0xb5,
+ 0x6b, 0x4a, 0x9f, 0xaf, 0x8d, 0xd9, 0x60, 0x2e, 0xd7, 0x49, 0x7d, 0x63,
+ 0xf4, 0xa1, 0x5a, 0x4e, 0x76, 0x3e, 0x33, 0x7b, 0xe6, 0x8e, 0xd6, 0x77,
+ 0x9e, 0x65, 0x93, 0x41, 0x72, 0x76, 0x45, 0x52, 0xb5, 0x32, 0x9d, 0x6e,
+ 0xf0, 0x6b, 0x12, 0xf4, 0x66, 0xde, 0x26, 0xd0, 0xab, 0xed, 0xd1, 0xe2,
+ 0xae, 0x78, 0x12, 0x9b, 0x76, 0x9a, 0x99, 0xec, 0x84, 0xa4, 0xdc, 0xb4,
+ 0x7d, 0x2b, 0xe0, 0x1c, 0x1a, 0xe9, 0x4d, 0xdd, 0x1b, 0x65, 0x09, 0x76,
+ 0xe2, 0x28, 0x6b, 0xee, 0xb3, 0xcc, 0x36, 0x57, 0x67, 0xe6, 0x26, 0xa2,
+ 0x45, 0x63, 0x65, 0x0c, 0xc2, 0x90, 0xa6, 0xf6, 0xfc, 0xe2, 0xec, 0xeb,
+ 0x8b, 0xa3, 0xe1, 0x30, 0x79, 0x7f, 0x74, 0x79, 0x74, 0xd1, 0x9a, 0xe9,
+ 0xa2, 0xac, 0x66, 0x58, 0xd1, 0x49, 0x5e, 0xcf, 0xa7, 0xe9, 0x03, 0x2d,
+ 0xb5, 0x19, 0xc9, 0x75, 0x45, 0x27, 0x6b, 0x96, 0xd1, 0xad, 0x30, 0x59,
+ 0x40, 0x92, 0x25, 0xa5, 0x91, 0x0f, 0xa9, 0x28, 0xa1, 0x24, 0x4c, 0xa0,
+ 0xb9, 0x16, 0xd7, 0x6e, 0xa6, 0x8d, 0xc4, 0x91, 0xcb, 0x8d, 0x6e, 0x37,
+ 0xbb, 0x1e, 0xa4, 0x0d, 0xc2, 0xde, 0xe8, 0xb9, 0x9f, 0xf1, 0x34, 0xd5,
+ 0x18, 0x93, 0xd9, 0xb3, 0xf9, 0x0c, 0xc2, 0xce, 0xfc, 0xe9, 0x14, 0xc0,
+ 0xec, 0xca, 0x68, 0xbf, 0xe6, 0xc2, 0x63, 0xe5, 0xbd, 0xdb, 0x27, 0xed,
+ 0xad, 0x55, 0x59, 0xcd, 0x36, 0x24, 0xd1, 0x4c, 0x0d, 0x72, 0x57, 0xf8,
+ 0x0b, 0x56, 0x88, 0x19, 0x35, 0x81, 0x64, 0x9f, 0x3c, 0x36, 0xa7, 0x2e,
+ 0x64, 0x66, 0x65, 0x27, 0xdc, 0x7c, 0xbd, 0xb8, 0xc2, 0x41, 0x4e, 0x36,
+ 0x8d, 0xb2, 0xfc, 0xde, 0x18, 0x30, 0xc6, 0x88, 0xe8, 0x25, 0xe7, 0x5b,
+ 0x78, 0x6f, 0x77, 0x67, 0xef, 0x39, 0x0b, 0x82, 0x81, 0x36, 0xf7, 0xce,
+ 0x13, 0xc4, 0xbb, 0xb7, 0xb4, 0xbc, 0xfc, 0x10, 0x35, 0x3e, 0x48, 0x76,
+ 0xdf, 0xf3, 0x4f, 0x9e, 0x7f, 0xfe, 0xe2, 0xb3, 0x97, 0xf2, 0xc3, 0xf6,
+ 0x06, 0xb7, 0xfd, 0xc7, 0xee, 0x80, 0x31, 0x46, 0xd6, 0x99, 0xe9, 0x89,
+ 0x19, 0xdd, 0x2c, 0x2f, 0xcc, 0x31, 0x31, 0xc7, 0x4a, 0x64, 0x15, 0xed,
+ 0x67, 0xd3, 0xf9, 0x2b, 0x96, 0x6c, 0xb2, 0xae, 0x6d, 0x2b, 0xcf, 0xbc,
+ 0x6c, 0xb6, 0xac, 0x91, 0xe5, 0x76, 0x91, 0x30, 0x13, 0xe6, 0x80, 0xd1,
+ 0xad, 0x33, 0x22, 0x01, 0x4b, 0xa6, 0x8e, 0xd1, 0x49, 0xb3, 0xe8, 0xd7,
+ 0xec, 0xad, 0x68, 0xde, 0x30, 0x7d, 0x33, 0x77, 0x22, 0x5d, 0x73, 0xe1,
+ 0xbc, 0x1b, 0x51, 0x00, 0x09, 0x79, 0x9f, 0xd7, 0x10, 0x0d, 0xf7, 0xe5,
+ 0x62, 0x6a, 0x0c, 0x0b, 0x7a, 0x60, 0x31, 0xc7, 0x0b, 0xe6, 0x53, 0x73,
+ 0x27, 0x03, 0x66, 0xf9, 0x27, 0xda, 0x3b, 0xdd, 0x56, 0x4c, 0xd7, 0xcc,
+ 0x3f, 0xe7, 0x66, 0x2b, 0x71, 0x77, 0x06, 0xdd, 0x1b, 0x02, 0xb2, 0x2f,
+ 0xd8, 0x89, 0x74, 0xe6, 0x21, 0xb4, 0xcf, 0xcf, 0x86, 0x97, 0xa4, 0x01,
+ 0x9c, 0x7f, 0xb8, 0x34, 0x0d, 0x19, 0x15, 0xa0, 0x6e, 0xcc, 0xa6, 0xa4,
+ 0x17, 0x8b, 0x0c, 0x56, 0x9d, 0x36, 0x67, 0xf6, 0x5e, 0x0e, 0x41, 0x05,
+ 0xb5, 0x46, 0x3f, 0xc9, 0x7d, 0x64, 0xb3, 0x97, 0x8e, 0xa0, 0x1a, 0xbd,
+ 0x7c, 0x87, 0xdb, 0x77, 0x92, 0xcd, 0x2f, 0xb6, 0xcc, 0x9e, 0xed, 0x97,
+ 0x76, 0x76, 0xfa, 0x7d, 0x79, 0xd5, 0x7c, 0xbb, 0xce, 0x67, 0xf9, 0x34,
+ 0xf5, 0xd4, 0x2b, 0x91, 0xa8, 0x74, 0x3e, 0xad, 0x5c, 0x19, 0x9b, 0x5d,
+ 0x83, 0x6e, 0x3b, 0xeb, 0x8e, 0xe6, 0x10, 0x52, 0xc9, 0x2d, 0xd5, 0x84,
+ 0x14, 0x02, 0x28, 0xb1, 0xf3, 0xdc, 0x4e, 0x1d, 0xad, 0x19, 0x89, 0xab,
+ 0xd6, 0x44, 0x75, 0xd7, 0x2d, 0x98, 0x38, 0xba, 0x91, 0xe0, 0x3e, 0xb0,
+ 0x53, 0x97, 0xac, 0x8f, 0xd2, 0x6a, 0x3d, 0xb1, 0xb2, 0x98, 0xcf, 0x26,
+ 0x9d, 0x90, 0x2a, 0xbb, 0x5e, 0x98, 0x11, 0x24, 0x3c, 0xbb, 0x34, 0xd2,
+ 0x3f, 0x78, 0x23, 0xd5, 0x06, 0xfa, 0x23, 0x7a, 0x24, 0xaf, 0xd9, 0xf2,
+ 0xbb, 0x32, 0xa6, 0x04, 0x1d, 0x1a, 0xd5, 0x6c, 0xa1, 0xd1, 0xc8, 0x8e,
+ 0x89, 0x6c, 0x18, 0xbb, 0x4b, 0x4b, 0x3a, 0x2a, 0x4d, 0x66, 0x04, 0x0d,
+ 0xc4, 0x3f, 0x3d, 0xd9, 0x37, 0x4b, 0xd6, 0xef, 0xd7, 0x66, 0xfe, 0x49,
+ 0x1d, 0x9e, 0x8b, 0x99, 0x7d, 0x06, 0x1f, 0x86, 0x75, 0x78, 0x9c, 0xb1,
+ 0xab, 0x83, 0xaf, 0x4d, 0x7e, 0x17, 0x22, 0xd4, 0x28, 0xaa, 0xf7, 0xe6,
+ 0xc3, 0xa9, 0x59, 0x32, 0x73, 0xe0, 0xde, 0xd3, 0x44, 0xb1, 0xbb, 0x22,
+ 0x91, 0xa6, 0xea, 0x04, 0x3b, 0x23, 0xa7, 0x73, 0x9f, 0x3a, 0x5d, 0x66,
+ 0x32, 0xc9, 0xe9, 0xb7, 0xe6, 0x7c, 0x99, 0x1b, 0x6e, 0x91, 0xc1, 0x1c,
+ 0x90, 0x49, 0x9d, 0xb9, 0xc9, 0x84, 0x65, 0x59, 0xdf, 0x94, 0x64, 0xb9,
+ 0xad, 0xb3, 0x2c, 0xee, 0xd3, 0xb7, 0xd6, 0x71, 0x9f, 0xcf, 0x12, 0xfd,
+ 0x96, 0x7c, 0xca, 0x8c, 0x63, 0xe2, 0xeb, 0x66, 0x3d, 0x73, 0xd1, 0x3c,
+ 0x78, 0x7a, 0x3b, 0x64, 0x35, 0xf7, 0xbd, 0xb2, 0x0a, 0x8f, 0xb9, 0x52,
+ 0xe7, 0xa4, 0x4c, 0x89, 0x0c, 0xc7, 0x65, 0x88, 0x23, 0x5b, 0x73, 0xd7,
+ 0x7a, 0x66, 0x6e, 0xe9, 0xc9, 0xeb, 0x1b, 0x7d, 0xd4, 0xbb, 0x58, 0x53,
+ 0x33, 0x38, 0xba, 0x1c, 0xc8, 0xc4, 0x9d, 0xa8, 0xdc, 0x2f, 0x2b, 0x16,
+ 0x66, 0xd3, 0xd2, 0xec, 0xe5, 0x75, 0x56, 0x59, 0xa5, 0xdb, 0xd4, 0x6b,
+ 0xea, 0x25, 0xcd, 0x38, 0xbb, 0x7e, 0x4a, 0xbb, 0x36, 0xb6, 0xd3, 0x32,
+ 0x5f, 0xf5, 0xa3, 0x5d, 0x73, 0x13, 0x35, 0xc4, 0x1c, 0x99, 0xab, 0xb3,
+ 0xa6, 0x7d, 0xac, 0x33, 0x8f, 0xed, 0x6d, 0xae, 0xba, 0x8d, 0x86, 0xcf,
+ 0x23, 0xcc, 0x9e, 0xce, 0xcc, 0xd7, 0xd8, 0x3e, 0x72, 0x91, 0xd9, 0x91,
+ 0x99, 0x11, 0x4d, 0xf2, 0x14, 0xfb, 0x84, 0x97, 0x06, 0xca, 0x88, 0x33,
+ 0xd2, 0x22, 0x7a, 0xf0, 0x43, 0xd7, 0xc6, 0x9a, 0x4e, 0xfd, 0x2b, 0x49,
+ 0xfb, 0xd4, 0x3f, 0x33, 0x63, 0x3f, 0xc1, 0x38, 0xfa, 0x77, 0x09, 0x1d,
+ 0x3f, 0x63, 0x36, 0xd0, 0x59, 0xec, 0x9f, 0x9d, 0xdc, 0x79, 0xc7, 0x88,
+ 0x8c, 0xe9, 0x82, 0xf4, 0x94, 0x1e, 0x1c, 0x16, 0xa3, 0xb2, 0x34, 0x96,
+ 0xab, 0x1b, 0x1a, 0xdd, 0x07, 0x59, 0x41, 0xbb, 0x5d, 0x56, 0xd4, 0x88,
+ 0x84, 0xb9, 0x95, 0xb7, 0x0f, 0xc6, 0x5c, 0x4a, 0xaf, 0xd3, 0xdc, 0xee,
+ 0x37, 0x39, 0x19, 0x93, 0x44, 0x1f, 0x2e, 0x4a, 0x79, 0x9e, 0x96, 0x8a,
+ 0x54, 0x20, 0x91, 0x5b, 0x8b, 0x9a, 0x8f, 0x8f, 0x19, 0x95, 0x91, 0x3c,
+ 0x90, 0x1d, 0xd2, 0x2e, 0xa9, 0x8d, 0xda, 0xdc, 0x08, 0x8a, 0x32, 0xe9,
+ 0x9c, 0x10, 0xbe, 0xd0, 0x20, 0x4d, 0x8b, 0xeb, 0x83, 0xe4, 0x9b, 0xf2,
+ 0x3e, 0x83, 0xfb, 0x0e, 0xfa, 0x7d, 0x4e, 0x0e, 0x28, 0xa3, 0x0a, 0xde,
+ 0x67, 0xc9, 0xcc, 0xa8, 0x9e, 0x66, 0x36, 0xa1, 0x7d, 0xe0, 0x67, 0xa6,
+ 0x9f, 0xce, 0x66, 0x29, 0xef, 0x79, 0x96, 0xec, 0x28, 0xec, 0x52, 0x5e,
+ 0xf1, 0x91, 0x48, 0x36, 0xa1, 0xde, 0x8c, 0x69, 0xb6, 0xe6, 0x8d, 0x1b,
+ 0x85, 0x9d, 0x90, 0xfb, 0xb4, 0xf6, 0x0e, 0x17, 0x1b, 0xa7, 0xc9, 0x67,
+ 0x83, 0xdd, 0x57, 0x83, 0x9d, 0x01, 0x99, 0x22, 0xd9, 0x5d, 0x5e, 0x2e,
+ 0x6a, 0x5a, 0x4f, 0xea, 0x89, 0x77, 0x3a, 0xc9, 0x4d, 0x44, 0xcb, 0x7b,
+ 0x7d, 0x3d, 0x65, 0xc5, 0x67, 0xbb, 0xbc, 0xba, 0x4a, 0x3c, 0xe5, 0xa8,
+ 0xca, 0xe6, 0x6c, 0x03, 0xd1, 0xdc, 0xc8, 0x81, 0x63, 0xa1, 0xea, 0x6b,
+ 0x45, 0x32, 0x9b, 0xce, 0xa3, 0xd0, 0xef, 0xa7, 0xa3, 0xba, 0x21, 0x73,
+ 0xaa, 0xbf, 0x28, 0xf2, 0x4f, 0xfd, 0xba, 0x1c, 0xdf, 0x9a, 0x65, 0x79,
+ 0x3d, 0x4f, 0x9b, 0x9b, 0x2f, 0x3a, 0x9e, 0xda, 0x4d, 0xba, 0x4d, 0xb6,
+ 0x92, 0xe4, 0x90, 0x15, 0x4b, 0x9a, 0x8b, 0x8a, 0x4f, 0x9c, 0x59, 0x4f,
+ 0x69, 0x25, 0xf9, 0x60, 0x5a, 0x31, 0xbb, 0x79, 0x66, 0x96, 0x35, 0xe1,
+ 0xc6, 0x7a, 0x2a, 0x4c, 0x3b, 0xcd, 0xc1, 0x0b, 0x48, 0x17, 0x09, 0x9c,
+ 0x69, 0xe6, 0xf0, 0x94, 0xd5, 0xed, 0x80, 0xdc, 0x16, 0xc6, 0x6a, 0xdc,
+ 0xa7, 0x0d, 0xdd, 0x18, 0x31, 0xd6, 0xf0, 0xbc, 0xd7, 0x22, 0x84, 0xa9,
+ 0x5b, 0x2c, 0x93, 0x9d, 0x94, 0xd2, 0xf9, 0xd4, 0x1e, 0xc8, 0x67, 0x13,
+ 0xb5, 0x37, 0x64, 0xeb, 0x6d, 0x7c, 0x69, 0x2c, 0xc0, 0x1b, 0x5e, 0x78,
+ 0x34, 0xc6, 0x63, 0x34, 0x7b, 0xf4, 0xda, 0xd8, 0x10, 0x45, 0xd3, 0x69,
+ 0xce, 0x7c, 0x95, 0x2e, 0x6b, 0xba, 0x67, 0xd8, 0xdc, 0xc5, 0x36, 0x11,
+ 0xb7, 0x8c, 0xb5, 0x40, 0x07, 0x6b, 0x9d, 0xd7, 0x0e, 0x74, 0x55, 0x3f,
+ 0x1b, 0xbc, 0x78, 0x66, 0x16, 0xd5, 0x9f, 0xe8, 0xe2, 0x81, 0xdc, 0x99,
+ 0xf1, 0x49, 0xbd, 0x34, 0x77, 0x69, 0xcd, 0xea, 0x89, 0x39, 0xc3, 0x57,
+ 0xf9, 0xf5, 0xa2, 0xca, 0xf8, 0x52, 0x83, 0x07, 0x54, 0x1d, 0x9f, 0x74,
+ 0x4f, 0xdc, 0x94, 0xf0, 0x17, 0x1a, 0xf9, 0x92, 0x4d, 0xaf, 0x7a, 0xdd,
+ 0x59, 0x20, 0x8d, 0x8e, 0xb6, 0x00, 0x86, 0x88, 0x4d, 0x64, 0x34, 0x37,
+ 0x34, 0x56, 0x64, 0x72, 0xaf, 0xcf, 0xcc, 0x04, 0x27, 0xe4, 0x30, 0x4b,
+ 0xc6, 0xd3, 0x34, 0x9f, 0xc1, 0xdc, 0x11, 0x87, 0xd0, 0xa0, 0xd3, 0xdc,
+ 0xa5, 0xa8, 0xe3, 0xd0, 0xc4, 0x47, 0x64, 0x0d, 0x54, 0x35, 0x09, 0x2b,
+ 0x9a, 0x84, 0x54, 0x95, 0x09, 0xd6, 0xb5, 0x6f, 0xb2, 0xf1, 0xad, 0xae,
+ 0xa6, 0xde, 0xc2, 0xfd, 0x4e, 0x73, 0xe4, 0x09, 0x85, 0xc9, 0x61, 0x9e,
+ 0x5a, 0x98, 0x35, 0x9d, 0x97, 0x75, 0x9d, 0x93, 0x47, 0x81, 0x34, 0xe4,
+ 0xc5, 0x18, 0x8a, 0x33, 0x99, 0xd8, 0x9f, 0xcc, 0x4a, 0xea, 0x96, 0x48,
+ 0xcc, 0x1e, 0x2b, 0x26, 0xfd, 0xa6, 0xca, 0xe7, 0xcb, 0x7a, 0xc7, 0x57,
+ 0x46, 0xfb, 0xce, 0xae, 0xc5, 0x88, 0x81, 0x7d, 0xc0, 0x16, 0xc3, 0x38,
+ 0xe9, 0xcc, 0x66, 0xa7, 0x39, 0x9e, 0xdb, 0x1e, 0x99, 0xc8, 0xb9, 0x11,
+ 0xa1, 0xac, 0x3f, 0xc2, 0x03, 0x64, 0xb4, 0x45, 0x39, 0xcb, 0x46, 0xb1,
+ 0xcd, 0xc7, 0xb8, 0x17, 0xf2, 0xeb, 0x8c, 0x3c, 0xce, 0xe6, 0x78, 0x37,
+ 0x53, 0x73, 0x5b, 0x78, 0x82, 0xc2, 0xae, 0x78, 0x91, 0x5d, 0x97, 0x0d,
+ 0x09, 0xe8, 0x60, 0x9b, 0x7c, 0xc0, 0xc6, 0xb7, 0x7b, 0x42, 0x35, 0x21,
+ 0xff, 0x9a, 0xca, 0x59, 0x45, 0x31, 0x9f, 0x66, 0x4d, 0x48, 0x8c, 0xb0,
+ 0xba, 0x31, 0x3b, 0xb0, 0xbb, 0xea, 0xa6, 0xb5, 0x71, 0x06, 0x75, 0x14,
+ 0x77, 0xa9, 0x5e, 0xe5, 0xaa, 0x03, 0x8d, 0xc8, 0x64, 0x23, 0xf3, 0xf8,
+ 0x3e, 0x1f, 0x67, 0xea, 0xa1, 0x10, 0x4f, 0xda, 0x34, 0x0f, 0xf7, 0xfe,
+ 0x6c, 0x51, 0xc3, 0x6a, 0x62, 0x35, 0x85, 0x0c, 0xca, 0xfb, 0x9c, 0xd4,
+ 0x98, 0xe3, 0x2b, 0x39, 0xab, 0x74, 0x8b, 0xf2, 0xf9, 0x48, 0xab, 0x1c,
+ 0xd6, 0xb3, 0x69, 0x4e, 0xfa, 0xe9, 0x19, 0x39, 0x6a, 0xb7, 0xb9, 0x7e,
+ 0xe3, 0x7d, 0xd1, 0xec, 0x9c, 0x46, 0x07, 0x43, 0xf2, 0x2a, 0xcd, 0xa7,
+ 0x91, 0x79, 0x82, 0x82, 0x6a, 0x2c, 0xd2, 0x9b, 0xac, 0x92, 0x35, 0x58,
+ 0xd0, 0xa4, 0x53, 0x74, 0x20, 0x78, 0x7a, 0x98, 0x65, 0xac, 0x62, 0x41,
+ 0x1f, 0xfb, 0xf4, 0x60, 0xa7, 0x17, 0xf7, 0x18, 0xaf, 0x9d, 0xfc, 0x9d,
+ 0x97, 0xcf, 0x3b, 0x9e, 0x29, 0xb5, 0x9a, 0xce, 0xc9, 0x0d, 0xde, 0x3d,
+ 0xa1, 0xa4, 0x8d, 0x52, 0x24, 0x65, 0x4b, 0x9d, 0x6a, 0xe2, 0x54, 0x2c,
+ 0x6c, 0x04, 0x02, 0xc2, 0x81, 0x1c, 0xfe, 0x72, 0x84, 0xb9, 0x1d, 0xd1,
+ 0x94, 0x3a, 0xcd, 0x19, 0xd5, 0x8c, 0xfc, 0x84, 0x30, 0xc2, 0x5b, 0x3b,
+ 0xd6, 0x18, 0xc4, 0x95, 0xf5, 0x83, 0x93, 0x13, 0x8c, 0xe6, 0x5b, 0x75,
+ 0x4f, 0x9c, 0x59, 0xbc, 0xd4, 0x69, 0x8e, 0xb4, 0x61, 0x52, 0x1d, 0xcc,
+ 0xa1, 0xc9, 0x69, 0x3f, 0x62, 0x13, 0xa8, 0x2b, 0xd4, 0x6c, 0x5f, 0xf6,
+ 0x8c, 0xa9, 0x5c, 0x65, 0x65, 0x03, 0xdd, 0xbd, 0x9a, 0xa6, 0xd7, 0x66,
+ 0xdf, 0x75, 0x9a, 0xcb, 0xaf, 0x8d, 0x8d, 0xcb, 0x01, 0x89, 0xba, 0x34,
+ 0xb7, 0x07, 0x8d, 0x5b, 0xec, 0x7d, 0x63, 0xee, 0x99, 0x6d, 0x36, 0x5d,
+ 0x40, 0x02, 0x9e, 0x99, 0x01, 0x0e, 0x87, 0xdf, 0x6c, 0xf9, 0x02, 0x0e,
+ 0xf3, 0xfb, 0x14, 0xf1, 0x06, 0xf9, 0x04, 0xd3, 0x24, 0xf9, 0x0a, 0x6b,
+ 0xd2, 0x95, 0x72, 0xbc, 0xd2, 0x91, 0xc9, 0xd3, 0x89, 0x20, 0x17, 0xd1,
+ 0x40, 0x04, 0x00, 0x24, 0x00, 0xa6, 0x49, 0xbd, 0x55, 0xbc, 0xc3, 0xc9,
+ 0x8b, 0xc0, 0xd7, 0xb4, 0xf9, 0xdb, 0xa2, 0x5e, 0x90, 0xe1, 0xde, 0x69,
+ 0x6e, 0x6e, 0x04, 0x59, 0x63, 0x8c, 0x37, 0x23, 0x91, 0x16, 0x05, 0xfd,
+ 0x69, 0xb5, 0x8b, 0x1c, 0x7a, 0x2e, 0x2d, 0x49, 0x45, 0xce, 0x41, 0xb2,
+ 0x10, 0xec, 0xdd, 0x6c, 0x44, 0x8b, 0xb4, 0xdc, 0x5d, 0x5a, 0xb8, 0x4f,
+ 0x28, 0x78, 0x01, 0xb1, 0x33, 0xc9, 0x29, 0xf0, 0x45, 0x07, 0x6f, 0x89,
+ 0x14, 0xdf, 0xac, 0x17, 0x46, 0xce, 0x90, 0x56, 0xc5, 0x42, 0x24, 0x10,
+ 0x20, 0x2a, 0x64, 0x8c, 0x02, 0xe7, 0x49, 0x93, 0xad, 0xdf, 0xfa, 0x98,
+ 0x60, 0xe1, 0xfc, 0x95, 0x1c, 0x1b, 0x7d, 0xd6, 0x68, 0xaa, 0xaf, 0x0f,
+ 0x0f, 0x12, 0xfa, 0x0b, 0xc9, 0x4e, 0xf3, 0xdd, 0x40, 0x1f, 0xb8, 0x3c,
+ 0x19, 0xc6, 0x96, 0xb6, 0xed, 0x56, 0xf7, 0x1a, 0x10, 0xcf, 0x53, 0x49,
+ 0x7a, 0x93, 0x51, 0x3e, 0x83, 0xd9, 0xa3, 0x0b, 0x3e, 0x33, 0x1d, 0x16,
+ 0x93, 0x82, 0x43, 0x76, 0x24, 0xd0, 0x8c, 0x42, 0xd5, 0x90, 0x42, 0x61,
+ 0xbd, 0x4c, 0xed, 0x8e, 0xc1, 0xad, 0xd4, 0xdd, 0x2a, 0xde, 0xef, 0x37,
+ 0xeb, 0x2d, 0x2b, 0xd3, 0x4c, 0x2b, 0xe7, 0x47, 0xef, 0xa1, 0xe2, 0xa7,
+ 0x66, 0x0b, 0x9d, 0xaa, 0x47, 0x47, 0x23, 0x72, 0xa3, 0x45, 0x3e, 0x6d,
+ 0xb9, 0x4d, 0x9d, 0x55, 0x82, 0x70, 0x18, 0xef, 0x30, 0x74, 0x8d, 0x03,
+ 0x00, 0x39, 0x3c, 0x68, 0xdd, 0xfd, 0xd6, 0x3c, 0xcc, 0xc5, 0xf9, 0xb7,
+ 0xa8, 0x5b, 0x36, 0xb6, 0xde, 0xd3, 0xd3, 0x06, 0x6a, 0x08, 0xa9, 0xfe,
+ 0x5e, 0x9b, 0xc1, 0x5a, 0xa1, 0x5b, 0x74, 0x2d, 0x5c, 0x17, 0xf9, 0xdf,
+ 0xc5, 0xcb, 0x90, 0x15, 0x77, 0x79, 0x55, 0x16, 0xa4, 0xb4, 0x18, 0xeb,
+ 0xa0, 0xca, 0x21, 0xa6, 0x49, 0xf1, 0x35, 0x82, 0x64, 0xe3, 0xf0, 0xc3,
+ 0xc5, 0xc9, 0xc7, 0xc3, 0x83, 0x8f, 0x5f, 0x7d, 0x38, 0x7d, 0x7b, 0x72,
+ 0xb4, 0xd1, 0x3d, 0xde, 0x57, 0x2c, 0x20, 0xe8, 0xc8, 0xd4, 0xa4, 0x9a,
+ 0xe1, 0xac, 0x98, 0x2e, 0x72, 0xcb, 0xd7, 0xf9, 0x9d, 0x11, 0x70, 0x50,
+ 0xb2, 0xe0, 0xc6, 0xc4, 0xdf, 0x60, 0xf8, 0xcb, 0x84, 0x77, 0x9a, 0x1b,
+ 0x99, 0x9b, 0xd9, 0x74, 0x9a, 0xcf, 0xa1, 0x0c, 0x5e, 0xcf, 0x8c, 0x18,
+ 0x36, 0xda, 0xc1, 0x60, 0x64, 0xb4, 0xc4, 0x74, 0xad, 0x90, 0x72, 0xe7,
+ 0xe9, 0xd1, 0x9e, 0x47, 0x73, 0xd1, 0x18, 0x35, 0x52, 0x7d, 0xa8, 0xc6,
+ 0x4e, 0x2b, 0x6f, 0x35, 0x36, 0x6a, 0x74, 0xd0, 0x83, 0xc8, 0x72, 0xd7,
+ 0xbc, 0x2e, 0x3c, 0x15, 0x1b, 0xd4, 0x92, 0xd9, 0xc9, 0x7d, 0xe9, 0xe4,
+ 0xb8, 0x6a, 0x8c, 0x02, 0x98, 0xe5, 0x38, 0x22, 0x1a, 0xfc, 0x21, 0x05,
+ 0x19, 0xfe, 0x8b, 0xae, 0xa6, 0x62, 0xcc, 0xc3, 0x07, 0x9a, 0x03, 0x6a,
+ 0x64, 0x90, 0x7d, 0xca, 0x70, 0x06, 0xe5, 0xad, 0xc3, 0x45, 0x85, 0x53,
+ 0xfd, 0xbd, 0xd1, 0x4e, 0x48, 0x16, 0xbe, 0x85, 0x03, 0xc4, 0xbc, 0xa0,
+ 0x0f, 0x99, 0x6b, 0xa7, 0x7b, 0x05, 0x96, 0xd3, 0x09, 0x39, 0x1a, 0x60,
+ 0x6c, 0xc2, 0x35, 0x70, 0x7e, 0x70, 0xf9, 0x4d, 0x30, 0x27, 0x24, 0xf0,
+ 0x1d, 0x10, 0x41, 0xb6, 0x22, 0x4c, 0xa4, 0xba, 0x91, 0x03, 0x72, 0x3a,
+ 0x1c, 0x26, 0x08, 0x73, 0x4f, 0xf3, 0x51, 0x95, 0xd2, 0x37, 0xe9, 0xc7,
+ 0xf4, 0x53, 0xb3, 0xad, 0x3b, 0xcd, 0x9d, 0x7f, 0x7b, 0x38, 0xfc, 0xc3,
+ 0xee, 0xae, 0x51, 0x03, 0x27, 0x0b, 0x33, 0x2f, 0x9b, 0xe6, 0x95, 0xa2,
+ 0x36, 0x27, 0x73, 0x36, 0xa8, 0xcb, 0x2d, 0x5c, 0xe3, 0xd0, 0xfd, 0x70,
+ 0x51, 0xa4, 0x77, 0xe6, 0xfe, 0xc5, 0x4e, 0xe2, 0x39, 0xa6, 0xfd, 0xdc,
+ 0x55, 0xd8, 0x79, 0x81, 0x15, 0x05, 0x60, 0x64, 0x87, 0xb9, 0xc1, 0xa7,
+ 0x0f, 0xc1, 0x28, 0x36, 0xf3, 0xb3, 0xa1, 0xc4, 0xd0, 0xd3, 0xb1, 0xf9,
+ 0x2b, 0x59, 0x53, 0x5b, 0x34, 0xb6, 0xf6, 0x19, 0xd3, 0x71, 0x0d, 0x59,
+ 0x3f, 0xbd, 0x24, 0x67, 0x27, 0x42, 0xff, 0xa1, 0x5c, 0x28, 0xba, 0xc7,
+ 0xcb, 0xc1, 0x2b, 0xd0, 0xd9, 0x51, 0x3a, 0xbe, 0xbd, 0x4f, 0xab, 0x09,
+ 0xbb, 0x4e, 0xcc, 0x9e, 0x19, 0xe5, 0xd3, 0xbc, 0x79, 0xe0, 0x7b, 0xa4,
+ 0x3b, 0x0a, 0x0e, 0x22, 0xd1, 0x14, 0x9a, 0x93, 0x74, 0x6d, 0xac, 0x22,
+ 0xd2, 0x47, 0xc9, 0x56, 0x34, 0x07, 0xc3, 0xd3, 0xfa, 0xa1, 0x34, 0x35,
+ 0x56, 0xe9, 0xb1, 0xdf, 0xee, 0x34, 0x07, 0x47, 0x14, 0x9d, 0x24, 0x74,
+ 0xd3, 0xed, 0x5e, 0x15, 0x84, 0xbe, 0x98, 0xd2, 0x0d, 0x94, 0xd4, 0x0f,
+ 0xe6, 0xde, 0x9f, 0x25, 0x11, 0xa5, 0x11, 0xa8, 0x87, 0xe4, 0xdb, 0xec,
+ 0xc1, 0x98, 0x18, 0x79, 0xe1, 0x64, 0x25, 0x7b, 0x8b, 0x32, 0xb2, 0x59,
+ 0x59, 0x3b, 0xcd, 0xd5, 0xe3, 0x98, 0x89, 0xd3, 0x98, 0xef, 0x94, 0xd0,
+ 0xc6, 0xe2, 0xf7, 0x55, 0x33, 0xa7, 0x26, 0x36, 0xea, 0x96, 0x50, 0xc6,
+ 0x97, 0x62, 0x5b, 0x31, 0xb8, 0x42, 0xe1, 0x3c, 0xe1, 0xe8, 0x30, 0x39,
+ 0x9f, 0x6b, 0xde, 0x7b, 0xd3, 0xb4, 0x6e, 0x60, 0x5d, 0x60, 0xdc, 0xe2,
+ 0xa3, 0x68, 0xdf, 0x26, 0x90, 0x23, 0xaf, 0xcd, 0x41, 0xfb, 0xc7, 0xaf,
+ 0x10, 0x3e, 0xae, 0x38, 0x9e, 0xa1, 0x54, 0x95, 0xb9, 0x6a, 0x5d, 0x25,
+ 0xef, 0xf5, 0xce, 0xa0, 0x4e, 0x58, 0x3f, 0xca, 0x9c, 0xa3, 0x7e, 0xac,
+ 0xe8, 0xb0, 0x43, 0x28, 0x54, 0x5c, 0xc9, 0xa6, 0x17, 0xbf, 0xc1, 0xfe,
+ 0x7a, 0xb2, 0x99, 0x0d, 0xae, 0x4d, 0x7b, 0xeb, 0xd4, 0xce, 0xee, 0x3e,
+ 0xfd, 0x77, 0x0f, 0xff, 0x7d, 0xb6, 0xae, 0x90, 0x19, 0x7f, 0xa9, 0xe9,
+ 0xbe, 0xe9, 0x4a, 0x4b, 0x71, 0xaa, 0xd3, 0xfd, 0x23, 0x17, 0x90, 0x08,
+ 0x60, 0x92, 0xcb, 0xf1, 0xc3, 0xc1, 0x7a, 0xd6, 0x49, 0x2f, 0xa2, 0x0b,
+ 0xb9, 0x89, 0xc0, 0xdd, 0x06, 0x2b, 0x75, 0x44, 0x0e, 0x28, 0x33, 0xb6,
+ 0xb1, 0xd1, 0x65, 0xe0, 0x0b, 0xe0, 0x10, 0x15, 0x4d, 0xc7, 0xf8, 0x63,
+ 0x95, 0xdd, 0xa4, 0xb5, 0x51, 0xab, 0x16, 0x0d, 0x4e, 0x47, 0xd7, 0x86,
+ 0x30, 0x47, 0x6a, 0x9a, 0x5b, 0xe7, 0x8b, 0x7c, 0x78, 0x60, 0x4d, 0x15,
+ 0x59, 0x45, 0x76, 0x63, 0x4e, 0xcb, 0x7b, 0x7d, 0xa2, 0x2f, 0x18, 0x96,
+ 0xd8, 0xc5, 0x65, 0x56, 0x13, 0x30, 0x18, 0x7a, 0xcc, 0x0f, 0x47, 0xcd,
+ 0x48, 0xef, 0x21, 0x80, 0x8d, 0x39, 0x82, 0x57, 0x66, 0xc6, 0xc8, 0x06,
+ 0x99, 0x62, 0xdd, 0xc8, 0xda, 0x42, 0xaf, 0x03, 0x5d, 0x48, 0x74, 0x92,
+ 0xfc, 0x4a, 0x5c, 0x30, 0xf2, 0x6f, 0x48, 0x7c, 0xd1, 0x0f, 0x6a, 0x0e,
+ 0x59, 0x75, 0x95, 0x83, 0xc7, 0xb7, 0xb6, 0x1e, 0x60, 0x7b, 0x17, 0xcb,
+ 0x60, 0xd9, 0xeb, 0xa9, 0xfb, 0x5a, 0x74, 0xe3, 0x98, 0xc9, 0x6d, 0x7a,
+ 0xc5, 0xd1, 0x83, 0x5f, 0x7f, 0x48, 0x4c, 0x8f, 0xfb, 0xe4, 0xf0, 0x58,
+ 0xd4, 0x4f, 0x38, 0x23, 0x9e, 0x50, 0xe0, 0x77, 0xac, 0xcb, 0x87, 0x43,
+ 0x73, 0xfe, 0x04, 0x74, 0x77, 0xe1, 0x83, 0xe7, 0x76, 0x39, 0xf4, 0x4e,
+ 0xd6, 0x90, 0x1b, 0xba, 0x10, 0xa3, 0x7e, 0x33, 0xbd, 0x4d, 0x07, 0xc9,
+ 0xd9, 0xe1, 0xf0, 0x9c, 0x3e, 0x61, 0xb6, 0x46, 0x71, 0x6d, 0x7a, 0x71,
+ 0x32, 0xec, 0x34, 0x67, 0x6c, 0xf5, 0xac, 0xa8, 0x5b, 0xa0, 0xaf, 0xa5,
+ 0xd3, 0xac, 0xae, 0x40, 0x8d, 0x91, 0x4b, 0x67, 0x8d, 0x6d, 0x8a, 0xe0,
+ 0x16, 0xc5, 0x6a, 0x28, 0x90, 0x9a, 0xf0, 0x51, 0x0b, 0x3e, 0x34, 0x37,
+ 0x1b, 0x7e, 0xb2, 0x65, 0x9d, 0x0b, 0x3d, 0xdd, 0x0b, 0xd6, 0xe7, 0x5f,
+ 0x2f, 0xae, 0x49, 0x5f, 0xae, 0xd5, 0xca, 0xb1, 0x5f, 0x30, 0xb3, 0x11,
+ 0x5c, 0xf0, 0x3a, 0x6c, 0x73, 0x26, 0xf8, 0xd8, 0x18, 0x05, 0x9f, 0xe0,
+ 0x10, 0xb8, 0xc4, 0x8b, 0xd2, 0xb5, 0x4a, 0x3a, 0x3d, 0xd0, 0x58, 0x39,
+ 0xbc, 0xe4, 0xe3, 0xcc, 0x28, 0x49, 0x93, 0xc8, 0x25, 0xc5, 0x8b, 0xa2,
+ 0x2a, 0xfe, 0x95, 0x20, 0xb0, 0x22, 0x1e, 0x0b, 0x34, 0x34, 0x66, 0x25,
+ 0x82, 0x76, 0x3d, 0xbc, 0x8d, 0x39, 0xb9, 0x67, 0x49, 0xa5, 0x63, 0xe3,
+ 0x92, 0xda, 0xb3, 0x67, 0xff, 0xeb, 0x62, 0x61, 0x26, 0x3e, 0x72, 0x5b,
+ 0xd0, 0xb5, 0x4f, 0x77, 0x1f, 0x4d, 0xe0, 0x2a, 0x57, 0xd4, 0xf3, 0xdd,
+ 0xb6, 0x2b, 0x0a, 0x9b, 0xcd, 0xa8, 0xa8, 0x59, 0xf2, 0x9a, 0xfe, 0xfb,
+ 0xa8, 0x54, 0x46, 0xfc, 0xd9, 0x97, 0xc2, 0x78, 0x57, 0x02, 0x18, 0x2c,
+ 0x47, 0x57, 0xec, 0x38, 0x84, 0xb6, 0x07, 0x24, 0xf6, 0x7a, 0xc9, 0xdb,
+ 0xa3, 0x0b, 0x2c, 0xff, 0xd1, 0xe9, 0xd7, 0xf0, 0x0e, 0x5b, 0xd5, 0x76,
+ 0x82, 0x36, 0x6b, 0xb6, 0x7a, 0x39, 0xba, 0x23, 0xe2, 0xbf, 0x3b, 0xd5,
+ 0x24, 0x3e, 0xc9, 0xa9, 0x8f, 0xd8, 0xff, 0xe4, 0xf7, 0xbb, 0xb8, 0x02,
+ 0x6b, 0xe9, 0xa8, 0x27, 0x53, 0x27, 0x3e, 0x84, 0xdb, 0xec, 0xc1, 0xfd,
+ 0x0d, 0xd3, 0xe9, 0xcd, 0xb1, 0x7b, 0xf8, 0xb5, 0x37, 0x33, 0x3f, 0xee,
+ 0x13, 0xbe, 0xc0, 0xa8, 0x4f, 0x93, 0x9f, 0x7f, 0xdd, 0x55, 0x28, 0x0e,
+ 0x9b, 0xa4, 0x7d, 0x27, 0x46, 0xfc, 0x02, 0x70, 0xc9, 0x68, 0x24, 0x9f,
+ 0x03, 0x77, 0x2c, 0xd8, 0x05, 0x5f, 0x4a, 0xd0, 0x53, 0xda, 0xe9, 0x69,
+ 0xc1, 0x0a, 0x11, 0x89, 0x68, 0x86, 0x6f, 0x00, 0xce, 0xd1, 0x3d, 0x2e,
+ 0xe3, 0x72, 0x1a, 0x5c, 0x72, 0x2d, 0x9b, 0x0a, 0xaa, 0xe6, 0x9e, 0x5c,
+ 0x6b, 0xb0, 0x33, 0xe4, 0xf2, 0x61, 0xf5, 0xae, 0x7b, 0x0e, 0xac, 0xb2,
+ 0x07, 0x64, 0x94, 0x7f, 0x25, 0x26, 0xde, 0xcb, 0x08, 0x54, 0xa1, 0x7b,
+ 0xac, 0xa9, 0x0d, 0x64, 0x79, 0xb3, 0xa8, 0x66, 0x6a, 0x56, 0x57, 0x67,
+ 0xd7, 0x2c, 0x3b, 0x39, 0x45, 0xdc, 0x1e, 0xe2, 0x08, 0x00, 0x2f, 0xb3,
+ 0x91, 0x6f, 0x55, 0x2e, 0xaa, 0x23, 0x03, 0xca, 0xba, 0x87, 0x59, 0xe3,
+ 0x85, 0xe2, 0x34, 0x11, 0xc3, 0x1e, 0xdb, 0x4a, 0xf7, 0x15, 0x6f, 0x3f,
+ 0x32, 0x92, 0xd6, 0xbd, 0x29, 0x59, 0x8f, 0x2d, 0x45, 0xc3, 0xa1, 0x0b,
+ 0x39, 0x2f, 0xf9, 0x1d, 0x4d, 0x9d, 0xee, 0x1d, 0xe7, 0x83, 0x6b, 0xeb,
+ 0x64, 0x65, 0x41, 0x7f, 0x16, 0xe4, 0xbb, 0xf9, 0x97, 0xc8, 0x86, 0x8c,
+ 0xee, 0x45, 0x72, 0xe3, 0x4a, 0x58, 0x07, 0x9a, 0x0b, 0x41, 0x98, 0x04,
+ 0xd6, 0x19, 0xd1, 0xd2, 0x63, 0xb6, 0x86, 0x6a, 0x1d, 0x6a, 0x52, 0x78,
+ 0x76, 0x46, 0xa0, 0x86, 0x77, 0x37, 0x88, 0x91, 0xdf, 0x0d, 0x05, 0x84,
+ 0x79, 0xef, 0x92, 0x9b, 0x30, 0x1f, 0xdf, 0x02, 0xf7, 0x23, 0x57, 0x53,
+ 0x4b, 0x7e, 0x08, 0xea, 0x86, 0xf1, 0x62, 0x91, 0x25, 0x80, 0x99, 0x43,
+ 0xfe, 0x4b, 0xda, 0x93, 0x74, 0x2d, 0xe7, 0x05, 0x2b, 0x6b, 0x4b, 0x0d,
+ 0x60, 0xd3, 0xd7, 0x8f, 0x6f, 0x8f, 0x2f, 0x92, 0x4d, 0xb3, 0xaa, 0xa3,
+ 0xae, 0x72, 0xa3, 0xf7, 0xfa, 0x76, 0xd6, 0x8c, 0xb7, 0xe7, 0xb7, 0xf9,
+ 0xb6, 0xb1, 0x83, 0x26, 0xa3, 0x2d, 0xab, 0xdd, 0xe3, 0x73, 0xd8, 0x84,
+ 0x6a, 0x33, 0xa9, 0xd1, 0x04, 0xab, 0xa9, 0x7b, 0x1a, 0x3c, 0x2b, 0x8a,
+ 0x21, 0xe3, 0xce, 0x78, 0xc2, 0x34, 0xb1, 0x8b, 0x01, 0x70, 0x15, 0x8e,
+ 0x6d, 0x26, 0xe4, 0x27, 0xcc, 0xd8, 0x85, 0x6a, 0xcc, 0xbf, 0xee, 0x59,
+ 0x65, 0xec, 0x92, 0xf8, 0x18, 0xd8, 0xb7, 0xa0, 0x80, 0x1b, 0xb9, 0x27,
+ 0x9c, 0xb6, 0xd7, 0x23, 0xa8, 0x14, 0x4d, 0xca, 0x9c, 0xee, 0xa2, 0x09,
+ 0xb9, 0xaa, 0xba, 0xcd, 0xc1, 0x79, 0xb6, 0x3e, 0xd8, 0x5e, 0x4f, 0x2c,
+ 0x38, 0xcc, 0xcc, 0x32, 0xf0, 0x8d, 0x0e, 0x8d, 0x67, 0xb6, 0xd8, 0xd5,
+ 0xa2, 0x66, 0xf7, 0x2b, 0xd9, 0xfb, 0x76, 0xbd, 0x06, 0x31, 0x81, 0xea,
+ 0x2d, 0xa7, 0x55, 0xb6, 0x8c, 0x52, 0x8c, 0x73, 0x65, 0x0d, 0xc9, 0x91,
+ 0xed, 0x14, 0x96, 0x6a, 0xfd, 0xa7, 0xf5, 0xc4, 0x03, 0x17, 0xb5, 0x9c,
+ 0x64, 0xb9, 0x0b, 0xff, 0x7b, 0x57, 0x80, 0xb9, 0x8a, 0xed, 0x09, 0x9e,
+ 0x64, 0xd3, 0x7c, 0x96, 0x37, 0xd0, 0xe1, 0xbd, 0x2e, 0x04, 0x4b, 0xd1,
+ 0xee, 0xd2, 0x4f, 0x61, 0x97, 0x14, 0xb0, 0x97, 0xd2, 0xaf, 0x4d, 0x97,
+ 0xe0, 0xac, 0x61, 0x3c, 0x55, 0xdc, 0x9c, 0x6b, 0x77, 0xc8, 0x42, 0xfe,
+ 0x56, 0x44, 0x7d, 0x7e, 0x1f, 0x8b, 0xb7, 0x7d, 0x64, 0xea, 0x06, 0xc0,
+ 0x22, 0x3a, 0x67, 0xe2, 0xc4, 0x18, 0xf1, 0xe5, 0xa0, 0x67, 0x2c, 0xd5,
+ 0xc7, 0x03, 0xd9, 0x6d, 0x5e, 0xdf, 0x56, 0xc1, 0x03, 0xc9, 0xa3, 0xee,
+ 0x0f, 0x36, 0x43, 0xcd, 0x81, 0x81, 0xd9, 0x79, 0x2b, 0x56, 0x27, 0x34,
+ 0x20, 0x08, 0x2b, 0x76, 0xff, 0x74, 0xf5, 0x5d, 0x15, 0xf6, 0xfd, 0xac,
+ 0x18, 0x97, 0x93, 0x8e, 0x7d, 0x46, 0x93, 0xe0, 0x09, 0x39, 0xec, 0x78,
+ 0x8e, 0xa4, 0x60, 0x97, 0xc7, 0x1d, 0x6b, 0xe4, 0xd1, 0x61, 0x6f, 0xdf,
+ 0x2f, 0xda, 0xf7, 0x31, 0xf3, 0x1e, 0xdb, 0xfe, 0x57, 0xed, 0xfa, 0x7f,
+ 0x9a, 0x1e, 0xe1, 0xa9, 0x5f, 0x4f, 0x50, 0x24, 0xfa, 0xe3, 0x7c, 0x7e,
+ 0x43, 0xde, 0xf7, 0xd7, 0x08, 0x48, 0x93, 0x8b, 0x8c, 0x7f, 0x10, 0x57,
+ 0x20, 0x86, 0x72, 0xe5, 0xd5, 0xe2, 0x27, 0xd0, 0xb7, 0x45, 0xbc, 0xe4,
+ 0x0a, 0xa0, 0x56, 0x63, 0x4c, 0x40, 0x10, 0x79, 0x60, 0xad, 0x52, 0x48,
+ 0x42, 0x5f, 0xe6, 0x9b, 0xde, 0xde, 0x2e, 0x8c, 0x77, 0xd4, 0xdf, 0x0e,
+ 0x8c, 0xc9, 0x90, 0x4e, 0x08, 0xd1, 0x64, 0xa6, 0x09, 0x09, 0x18, 0xf8,
+ 0x79, 0xa7, 0x39, 0x74, 0x5e, 0x12, 0x13, 0xf8, 0xd6, 0x35, 0x33, 0xfa,
+ 0xe1, 0xe2, 0x64, 0xbf, 0x3b, 0x4f, 0xc0, 0xc5, 0xd6, 0xfb, 0xdb, 0xdb,
+ 0x70, 0xbd, 0xdd, 0xa4, 0x9f, 0x3e, 0x0d, 0xea, 0x6c, 0x7b, 0x52, 0x8e,
+ 0xeb, 0xed, 0xba, 0x9e, 0xea, 0x6c, 0xb4, 0x91, 0xe3, 0xbf, 0x83, 0xcf,
+ 0xa2, 0x9c, 0xcd, 0x2b, 0x18, 0xd1, 0xf1, 0x80, 0x86, 0x5a, 0x49, 0x80,
+ 0x4d, 0xcb, 0x93, 0xce, 0x64, 0xe8, 0x66, 0x05, 0x99, 0x85, 0xbf, 0x2e,
+ 0x2b, 0xb3, 0xe1, 0x66, 0x75, 0xcc, 0x4c, 0x56, 0x77, 0x56, 0xad, 0xee,
+ 0x80, 0x9a, 0x6c, 0x79, 0x36, 0xdb, 0x17, 0x85, 0xf7, 0x01, 0x33, 0x0b,
+ 0x88, 0x55, 0x0f, 0xec, 0x58, 0xe3, 0x2e, 0x3a, 0x1d, 0x79, 0xc7, 0xd0,
+ 0x12, 0x4b, 0x2b, 0x81, 0x91, 0x5d, 0x38, 0x1f, 0x5a, 0x82, 0x83, 0x6c,
+ 0xba, 0xdc, 0x8b, 0xf5, 0x0e, 0x53, 0x54, 0x65, 0xf4, 0x2c, 0x84, 0x61,
+ 0x55, 0x95, 0x9e, 0x04, 0xec, 0x7f, 0x0b, 0x4d, 0xc4, 0x1c, 0xab, 0xfc,
+ 0x3a, 0x79, 0x4d, 0x87, 0xf8, 0x8b, 0x60, 0xe7, 0xeb, 0xb6, 0x49, 0x49,
+ 0xb5, 0x22, 0x98, 0x8a, 0x24, 0xe3, 0x90, 0x91, 0x65, 0x76, 0x0e, 0x87,
+ 0xcc, 0x24, 0x0c, 0xcf, 0x61, 0xce, 0x56, 0x0e, 0x52, 0xb0, 0x93, 0x08,
+ 0xde, 0xe9, 0x1e, 0xa7, 0xf0, 0xb0, 0xee, 0x6b, 0x34, 0x2f, 0xba, 0xae,
+ 0x5b, 0xd8, 0x84, 0xe4, 0x38, 0xd4, 0x4a, 0xf3, 0x4c, 0x57, 0x35, 0x00,
+ 0xb2, 0xc2, 0x9a, 0x31, 0xb1, 0x04, 0x83, 0xee, 0x78, 0x14, 0x65, 0xa5,
+ 0xd3, 0x9b, 0x23, 0xa5, 0x25, 0x05, 0x84, 0xab, 0xb6, 0x4a, 0xb1, 0x97,
+ 0x58, 0xe0, 0x39, 0x9b, 0xa9, 0xc1, 0xae, 0x79, 0xc4, 0xbf, 0x66, 0x68,
+ 0x9d, 0x82, 0x52, 0x71, 0x81, 0x9a, 0x13, 0xdc, 0x64, 0x00, 0x17, 0x51,
+ 0x22, 0xd3, 0xb4, 0x74, 0x92, 0xd9, 0xec, 0x3e, 0x23, 0x4b, 0x00, 0x3c,
+ 0xef, 0x5e, 0xd7, 0x27, 0x25, 0xc3, 0x4f, 0x39, 0x90, 0xc6, 0x30, 0x6a,
+ 0x8e, 0x62, 0xab, 0x96, 0x3c, 0x85, 0x46, 0xc2, 0xbe, 0x7e, 0x27, 0x0f,
+ 0x68, 0xfd, 0x62, 0x76, 0x84, 0x00, 0xb0, 0x18, 0xd3, 0x9e, 0x23, 0x83,
+ 0x42, 0xf0, 0xfd, 0x8c, 0x27, 0x53, 0xff, 0x47, 0x5d, 0xf6, 0xa4, 0xa9,
+ 0x29, 0x79, 0xf2, 0x2b, 0xe9, 0x63, 0x77, 0x47, 0x59, 0xec, 0xbe, 0x8f,
+ 0x68, 0xa2, 0xf5, 0xb1, 0xb0, 0xac, 0x3a, 0xf4, 0xb9, 0xba, 0xc9, 0x8c,
+ 0xa9, 0x3a, 0x01, 0xc4, 0x0d, 0x1d, 0xa9, 0x32, 0xfd, 0x82, 0x31, 0xe6,
+ 0x3b, 0x9d, 0xd2, 0x7e, 0xf4, 0x43, 0xc5, 0xdf, 0xc2, 0xb8, 0xbc, 0x0e,
+ 0x28, 0x9c, 0xcb, 0xae, 0x72, 0xfc, 0xb2, 0xc8, 0xdc, 0x03, 0x50, 0xf7,
+ 0x4b, 0x1b, 0xb7, 0xf2, 0x17, 0xb2, 0xfd, 0x9c, 0xec, 0x96, 0xae, 0xaf,
+ 0xa3, 0x18, 0x4f, 0x4b, 0x85, 0xc1, 0x99, 0xf7, 0x39, 0x93, 0xc2, 0x9c,
+ 0xfa, 0xef, 0x45, 0x61, 0x96, 0x15, 0x90, 0x5f, 0xf4, 0x44, 0x56, 0x5c,
+ 0x95, 0xe4, 0x98, 0x0b, 0x9d, 0x67, 0xa2, 0xbf, 0x74, 0x13, 0x81, 0x9c,
+ 0xda, 0xba, 0x9f, 0x24, 0x3f, 0xfd, 0xd4, 0x4b, 0x48, 0x79, 0xfa, 0xc9,
+ 0x98, 0x64, 0x3f, 0x99, 0x8d, 0xf6, 0x13, 0x03, 0x4f, 0x7f, 0xba, 0x1b,
+ 0x24, 0xdd, 0x50, 0x0b, 0x79, 0x1c, 0xea, 0x29, 0xb9, 0x12, 0xf9, 0x2a,
+ 0x6e, 0x5b, 0x6a, 0x9c, 0xe5, 0x02, 0xa3, 0x9f, 0xfd, 0x65, 0x7e, 0x20,
+ 0x1b, 0xf8, 0x91, 0xd0, 0xb4, 0x5c, 0xcc, 0x0a, 0xd1, 0x60, 0x78, 0x1f,
+ 0xe2, 0x88, 0x03, 0xb8, 0xb7, 0xf1, 0x87, 0x0d, 0xb7, 0x67, 0x7a, 0xea,
+ 0xee, 0x69, 0x54, 0xae, 0x46, 0x8e, 0x93, 0x1e, 0x7c, 0xcd, 0x09, 0x41,
+ 0x20, 0x8b, 0x61, 0x15, 0x46, 0x6e, 0x9e, 0x91, 0xaf, 0x85, 0x91, 0xbd,
+ 0xa5, 0xc5, 0x43, 0x01, 0xe0, 0x3c, 0xbf, 0x79, 0xa8, 0x29, 0xd6, 0x14,
+ 0x93, 0x36, 0xe1, 0x29, 0x19, 0x2c, 0x15, 0x72, 0x8d, 0x86, 0x2e, 0xa1,
+ 0x97, 0xd1, 0x2e, 0x68, 0x89, 0x48, 0xd3, 0x9d, 0x8d, 0xfe, 0x86, 0xf5,
+ 0x8c, 0x4a, 0x7c, 0x2f, 0x00, 0x47, 0xa9, 0x44, 0xf0, 0xc0, 0x13, 0xc1,
+ 0x27, 0xbd, 0x80, 0x7e, 0xe9, 0xc3, 0x35, 0x5c, 0xbe, 0x12, 0x25, 0x1c,
+ 0x68, 0xcc, 0x41, 0xbe, 0x2f, 0x72, 0x26, 0x62, 0x85, 0x00, 0xd6, 0x81,
+ 0x78, 0x90, 0xbd, 0xe7, 0x49, 0x45, 0x76, 0xce, 0xc2, 0x7e, 0x1f, 0xd9,
+ 0x9c, 0x73, 0xce, 0xc0, 0xa4, 0xdd, 0x81, 0x38, 0xc9, 0x03, 0x81, 0x7b,
+ 0xe7, 0x41, 0x6c, 0x5d, 0xa1, 0x0c, 0x9a, 0x3f, 0x43, 0x07, 0x99, 0xd2,
+ 0xfe, 0xee, 0x0b, 0x49, 0xdb, 0x1a, 0x96, 0x50, 0xd5, 0xc7, 0x88, 0xb8,
+ 0x48, 0x78, 0x4f, 0x60, 0xc2, 0x11, 0x35, 0x91, 0x2e, 0xbb, 0x40, 0x57,
+ 0xa0, 0xfe, 0xbc, 0x49, 0xd6, 0x97, 0x6b, 0x0c, 0xeb, 0xdd, 0x37, 0x80,
+ 0xe0, 0x70, 0x76, 0xaf, 0xa4, 0x40, 0xa1, 0x23, 0x9b, 0x02, 0x01, 0xe8,
+ 0xff, 0x8d, 0xf1, 0x3d, 0x8c, 0xd2, 0x95, 0xab, 0x74, 0x8b, 0x01, 0x4e,
+ 0x75, 0x10, 0xd7, 0xab, 0xbc, 0xa8, 0xb0, 0xb7, 0x3f, 0x5c, 0x5c, 0x35,
+ 0x87, 0x37, 0x04, 0xb7, 0x14, 0xdf, 0x6a, 0xde, 0xd3, 0x5d, 0xf9, 0x63,
+ 0xdf, 0x26, 0x10, 0x21, 0x7d, 0x4f, 0xbc, 0x14, 0x7a, 0x45, 0xe8, 0xf9,
+ 0x36, 0xaa, 0x30, 0xb2, 0x21, 0x15, 0xbe, 0x08, 0x25, 0x37, 0x98, 0x9d,
+ 0xdd, 0x2d, 0x0b, 0x78, 0x47, 0x4a, 0x23, 0x23, 0xcb, 0x44, 0x25, 0x58,
+ 0xbf, 0x29, 0x39, 0xf6, 0xb9, 0xbe, 0x4f, 0x58, 0x6c, 0x06, 0x76, 0xf1,
+ 0x18, 0x35, 0xb3, 0xad, 0xd3, 0x1c, 0x22, 0xcb, 0xdf, 0x9c, 0xbd, 0x3f,
+ 0x6a, 0x23, 0x88, 0xf0, 0x93, 0x98, 0x45, 0x6e, 0xe4, 0xd5, 0x3b, 0x23,
+ 0x5f, 0x78, 0x0f, 0xa4, 0x81, 0x91, 0xc3, 0x7b, 0xcb, 0x74, 0xeb, 0x3a,
+ 0x6b, 0xe6, 0xf7, 0x8b, 0x7c, 0xb2, 0xb9, 0x45, 0x7b, 0x84, 0xf0, 0x83,
+ 0x7d, 0xc0, 0x56, 0xd9, 0x3a, 0xa9, 0x93, 0x4d, 0x56, 0x64, 0xab, 0xac,
+ 0x59, 0x54, 0x05, 0x7b, 0x51, 0xa8, 0xef, 0x61, 0x34, 0x44, 0xae, 0x34,
+ 0xdf, 0x7a, 0x90, 0xcc, 0x64, 0x0e, 0xb9, 0x72, 0x83, 0x5b, 0x24, 0x04,
+ 0x8c, 0x20, 0x45, 0xe4, 0x19, 0x0b, 0x8f, 0xb1, 0x04, 0xf7, 0x94, 0x3f,
+ 0x13, 0xc9, 0xc1, 0xf9, 0xf9, 0xdb, 0x83, 0xcb, 0x03, 0x3b, 0x36, 0x5c,
+ 0xc4, 0x90, 0x2c, 0xd0, 0x24, 0x8d, 0x48, 0x22, 0xed, 0x88, 0x9e, 0xdc,
+ 0xf8, 0xe3, 0x87, 0xe1, 0xd1, 0x45, 0x77, 0x61, 0xcf, 0x2f, 0xce, 0x28,
+ 0xed, 0xfb, 0x8f, 0x3f, 0x1d, 0x50, 0x90, 0x45, 0x5c, 0xc4, 0x6f, 0xd3,
+ 0x26, 0xdd, 0x08, 0x4e, 0xf5, 0xde, 0x16, 0xf5, 0xef, 0xde, 0xf6, 0xef,
+ 0x4a, 0x2e, 0x33, 0x58, 0xcb, 0xc9, 0x47, 0x5a, 0xd0, 0x6a, 0xac, 0xf0,
+ 0x21, 0x3b, 0x1b, 0x98, 0x00, 0xa0, 0x7f, 0x96, 0x0f, 0xa4, 0x74, 0x92,
+ 0x4c, 0x03, 0xdf, 0x3a, 0x59, 0xd3, 0x24, 0xfb, 0x64, 0x8c, 0xd2, 0x46,
+ 0xb7, 0x3c, 0xf6, 0x17, 0x25, 0xe6, 0x74, 0xe7, 0x25, 0x58, 0x1e, 0xe7,
+ 0x59, 0x63, 0x29, 0x80, 0xbc, 0x30, 0xb3, 0xd1, 0x00, 0xf1, 0x1a, 0x48,
+ 0x6f, 0x59, 0x8a, 0xc5, 0x62, 0x58, 0x19, 0xfb, 0xda, 0x90, 0x27, 0xc6,
+ 0x5d, 0x0a, 0x26, 0xe4, 0x0f, 0xe6, 0x34, 0xf6, 0x93, 0x23, 0x01, 0x30,
+ 0x63, 0xe0, 0xe6, 0x07, 0xc1, 0x43, 0x9a, 0x39, 0x64, 0x85, 0x7d, 0x5c,
+ 0x56, 0x78, 0xb9, 0x93, 0xeb, 0x5d, 0xe5, 0x99, 0xb3, 0x15, 0xcc, 0x43,
+ 0xd4, 0x6d, 0x9a, 0x74, 0x58, 0x19, 0xeb, 0x91, 0x10, 0x6d, 0x3f, 0xbd,
+ 0xa6, 0xed, 0x65, 0x1e, 0x35, 0x5a, 0xb4, 0x31, 0x2e, 0xe8, 0x5f, 0xdb,
+ 0xbb, 0x83, 0x9d, 0xf5, 0xb0, 0xf3, 0x74, 0x58, 0x90, 0x8a, 0x6a, 0x5d,
+ 0xad, 0x24, 0x0d, 0x9b, 0xb2, 0x7c, 0xb4, 0x7f, 0x2c, 0xc2, 0x8c, 0x1e,
+ 0x3a, 0x37, 0xed, 0x47, 0xbb, 0xd2, 0x3f, 0x0b, 0xf0, 0x51, 0x84, 0x38,
+ 0xaa, 0x54, 0x28, 0x1a, 0x99, 0x58, 0x94, 0xf7, 0x34, 0x12, 0xb3, 0xd5,
+ 0xa6, 0xd3, 0x56, 0xce, 0xf0, 0x7a, 0x7c, 0x9a, 0x0b, 0xa4, 0xe7, 0x67,
+ 0xdd, 0xd9, 0x8e, 0xc6, 0x31, 0x54, 0xc9, 0xf4, 0x35, 0x39, 0x0b, 0xd1,
+ 0x81, 0xb5, 0x65, 0x77, 0x82, 0x9f, 0x1f, 0x66, 0xa4, 0x5c, 0x20, 0xf7,
+ 0xa6, 0x7e, 0x9c, 0xae, 0xaf, 0xc1, 0xc2, 0x3e, 0x35, 0x42, 0xda, 0xe7,
+ 0x6b, 0x4e, 0x3f, 0x0a, 0x6c, 0xde, 0xf7, 0xe9, 0xa7, 0x7c, 0xb6, 0x98,
+ 0xe1, 0x63, 0xb4, 0xb7, 0xe5, 0x31, 0x71, 0x32, 0xc1, 0xed, 0xc0, 0xc1,
+ 0x4a, 0x6c, 0xf2, 0x8d, 0x3a, 0xf1, 0x2c, 0xdf, 0xd8, 0x25, 0x63, 0xae,
+ 0xe4, 0x81, 0x1b, 0x5e, 0x01, 0xdc, 0x09, 0x79, 0xa1, 0xea, 0x8e, 0xd5,
+ 0x6c, 0xb4, 0x85, 0x94, 0x22, 0x50, 0xc6, 0x9c, 0xd7, 0xd0, 0x6d, 0x44,
+ 0x9c, 0x73, 0xfe, 0x9b, 0xe8, 0x70, 0x1e, 0xbe, 0x26, 0xab, 0xf2, 0x72,
+ 0x62, 0xcf, 0x0d, 0x29, 0x89, 0x79, 0xb1, 0x30, 0xf3, 0x4c, 0x6d, 0xd1,
+ 0x95, 0xaa, 0x10, 0xbe, 0x20, 0x02, 0x06, 0x54, 0xe0, 0x10, 0x60, 0x4f,
+ 0x85, 0xcc, 0x7c, 0x36, 0x78, 0xb6, 0x37, 0xd8, 0xe9, 0xb5, 0x0c, 0x5f,
+ 0x49, 0x13, 0x34, 0xa7, 0x6b, 0x9c, 0xcf, 0x6c, 0x0a, 0xc1, 0xe0, 0x9f,
+ 0xe6, 0xe0, 0xa0, 0xe4, 0x89, 0xfe, 0x2c, 0xfd, 0x84, 0xe5, 0x8b, 0x2e,
+ 0x6b, 0x99, 0xbc, 0xfe, 0xe6, 0x6c, 0x78, 0xb9, 0xbb, 0x7f, 0x7e, 0x76,
+ 0x61, 0xfe, 0x4b, 0x7f, 0xdf, 0xc3, 0xdf, 0xf7, 0x02, 0xeb, 0xf1, 0x9d,
+ 0x20, 0x7e, 0x14, 0x6c, 0x2c, 0x39, 0x3d, 0x3c, 0x95, 0xf4, 0x22, 0xde,
+ 0x33, 0x2a, 0x35, 0xc9, 0x3f, 0xf9, 0x00, 0x3d, 0x74, 0x78, 0x76, 0x7a,
+ 0x7a, 0x74, 0x78, 0xd9, 0x5d, 0x93, 0xcb, 0xb3, 0x3e, 0x5e, 0xd2, 0x5f,
+ 0x9b, 0x7f, 0xe3, 0x7d, 0x81, 0x62, 0x0e, 0xba, 0x7b, 0x1b, 0x48, 0xa9,
+ 0x45, 0xde, 0x88, 0x77, 0xb7, 0x8c, 0x06, 0xe1, 0x6d, 0x5a, 0x15, 0x05,
+ 0x0b, 0x53, 0x87, 0x37, 0x56, 0x96, 0x10, 0x20, 0x07, 0xda, 0xbf, 0x1a,
+ 0x4f, 0x8d, 0xe6, 0x1f, 0x78, 0x49, 0x8a, 0x72, 0x92, 0x71, 0xc2, 0xba,
+ 0xfc, 0x9e, 0x0e, 0xa3, 0xc0, 0x2f, 0x07, 0x49, 0xac, 0x6f, 0xbc, 0x49,
+ 0xd9, 0xca, 0x0d, 0x7a, 0x67, 0xba, 0x64, 0xfa, 0x9d, 0xd7, 0x37, 0xa2,
+ 0x96, 0x2a, 0xa4, 0xda, 0x77, 0xff, 0x1c, 0x37, 0x9c, 0x51, 0x75, 0x7a,
+ 0x76, 0x99, 0xa4, 0x57, 0x57, 0x9a, 0xfe, 0x45, 0x08, 0xcb, 0x98, 0xaf,
+ 0x75, 0x7b, 0xce, 0x37, 0x5d, 0xea, 0xc2, 0xdd, 0x74, 0xb7, 0x5c, 0x9e,
+ 0x0c, 0xb7, 0xc9, 0xf7, 0xc3, 0x20, 0x89, 0xe1, 0xe9, 0x71, 0xaf, 0x1d,
+ 0xa1, 0xa2, 0xd8, 0x68, 0xa8, 0xed, 0xf0, 0x45, 0xb8, 0xc5, 0x31, 0x20,
+ 0xbd, 0x6b, 0x53, 0xef, 0x8a, 0xb4, 0xa9, 0xc5, 0x04, 0xbc, 0xa0, 0x2e,
+ 0xad, 0x43, 0x9e, 0xae, 0x53, 0x27, 0xba, 0x02, 0x4c, 0x3c, 0xed, 0x30,
+ 0x8f, 0x67, 0xf3, 0xe6, 0x41, 0x3c, 0xa6, 0x3d, 0xe4, 0xda, 0x92, 0x16,
+ 0xb2, 0x4e, 0x46, 0x0a, 0x35, 0x82, 0x31, 0xac, 0xd3, 0x7c, 0xae, 0xbb,
+ 0x1d, 0x19, 0x60, 0xd5, 0xf1, 0x35, 0xfe, 0x9c, 0xf7, 0x14, 0x5e, 0xc5,
+ 0xb7, 0xb0, 0xd7, 0x97, 0x7e, 0xb0, 0x1f, 0x58, 0xf9, 0xa6, 0x03, 0x1a,
+ 0xcf, 0x93, 0xed, 0xb2, 0x41, 0x9a, 0x5b, 0x7e, 0x8d, 0x04, 0x46, 0xaf,
+ 0x5f, 0x51, 0x61, 0x2b, 0x6b, 0xde, 0x12, 0xb5, 0x34, 0x1e, 0x2b, 0x66,
+ 0xd3, 0x89, 0xfc, 0x44, 0xcf, 0x40, 0xb5, 0x98, 0x46, 0xc0, 0x0f, 0x9e,
+ 0x1b, 0x92, 0xb4, 0x96, 0xe9, 0x9d, 0x38, 0x21, 0xbf, 0xa1, 0x33, 0xcb,
+ 0xf8, 0xfc, 0x41, 0x2b, 0x74, 0xfc, 0xaa, 0x15, 0x3a, 0x3e, 0x14, 0x53,
+ 0x06, 0x12, 0xab, 0x6f, 0x36, 0xc1, 0xeb, 0xf2, 0xea, 0xaa, 0xce, 0x9a,
+ 0xae, 0x60, 0x3e, 0x94, 0x47, 0xb6, 0x2f, 0x40, 0xaf, 0xe2, 0x01, 0x68,
+ 0xdb, 0xe9, 0xc7, 0x49, 0xaa, 0xc0, 0x36, 0x3e, 0xd0, 0x09, 0x37, 0x37,
+ 0x88, 0x80, 0x05, 0xdb, 0x4f, 0x78, 0xb0, 0x5f, 0xce, 0x02, 0x0a, 0x92,
+ 0x5b, 0xb1, 0x47, 0x45, 0x62, 0x75, 0xb1, 0x2e, 0xb7, 0xf9, 0x7c, 0x4e,
+ 0x6a, 0x3f, 0xb8, 0x1c, 0x68, 0x69, 0xac, 0xdf, 0x79, 0x94, 0x99, 0xf5,
+ 0xc0, 0x76, 0x51, 0x44, 0x85, 0x51, 0x1d, 0xc7, 0x16, 0x8d, 0x3a, 0xca,
+ 0xcc, 0x36, 0xcd, 0x42, 0x55, 0x96, 0xec, 0x7d, 0x2f, 0x83, 0x57, 0x84,
+ 0xd4, 0x84, 0xb2, 0x75, 0x8b, 0x94, 0x0f, 0x1a, 0x09, 0x5c, 0x97, 0xdb,
+ 0x26, 0xa0, 0xfe, 0x18, 0xb0, 0xc7, 0x41, 0xae, 0xad, 0x1f, 0x6a, 0x78,
+ 0xfc, 0x3f, 0x8f, 0x5c, 0xbe, 0xb5, 0x4d, 0x68, 0x66, 0xd8, 0x6a, 0x0c,
+ 0x0e, 0x9c, 0xac, 0xf7, 0x0f, 0x93, 0xfe, 0x3a, 0x3a, 0xe2, 0xa2, 0x72,
+ 0x65, 0x07, 0x54, 0x09, 0x6b, 0x80, 0xee, 0xd7, 0x04, 0x4a, 0xc2, 0x36,
+ 0x67, 0x38, 0x95, 0x81, 0x52, 0x81, 0x25, 0xe4, 0xc9, 0xd6, 0x51, 0x42,
+ 0x70, 0x34, 0x82, 0x87, 0xf7, 0xd1, 0xa3, 0xac, 0x45, 0x6d, 0xe7, 0x05,
+ 0xe9, 0x52, 0xb8, 0xd8, 0x03, 0x68, 0xa5, 0xe6, 0xb7, 0x70, 0x62, 0xe7,
+ 0xa2, 0xf9, 0x27, 0xfa, 0xde, 0x2b, 0xda, 0xbf, 0x60, 0xec, 0xf0, 0x36,
+ 0xf5, 0x98, 0x37, 0x35, 0x31, 0x05, 0xf5, 0xff, 0x6a, 0xac, 0xcf, 0xd7,
+ 0x6a, 0xbe, 0x2f, 0xc9, 0x80, 0x52, 0x5b, 0x9f, 0x90, 0x90, 0xb0, 0x4d,
+ 0xb0, 0x37, 0x6c, 0x26, 0xae, 0xce, 0x35, 0xbb, 0x19, 0x00, 0x1d, 0x11,
+ 0x1a, 0xa2, 0x6e, 0x24, 0xe5, 0x8a, 0x24, 0x3c, 0x5d, 0x6e, 0x9a, 0xf1,
+ 0x39, 0xf1, 0x12, 0xc7, 0x07, 0x04, 0x34, 0x9d, 0x72, 0x2b, 0x35, 0x9a,
+ 0x91, 0x56, 0x84, 0x37, 0xa3, 0x09, 0xb0, 0xfb, 0x45, 0x7f, 0x96, 0xcd,
+ 0x08, 0x10, 0xc6, 0x0f, 0x1a, 0x79, 0x54, 0x92, 0x6a, 0xda, 0xbe, 0x32,
+ 0xd9, 0x3a, 0x6d, 0x24, 0x90, 0x3a, 0xe1, 0xd4, 0x03, 0xfa, 0x66, 0x88,
+ 0x90, 0x29, 0x0b, 0xc1, 0x63, 0x90, 0xe5, 0x61, 0xbf, 0x0e, 0xdf, 0xd1,
+ 0xad, 0xd1, 0x2b, 0x8b, 0x1e, 0xfd, 0x1c, 0x49, 0x26, 0x3a, 0xfb, 0xd4,
+ 0xd9, 0x26, 0x2b, 0x62, 0x78, 0xec, 0x96, 0x57, 0x56, 0x9e, 0xf3, 0x9c,
+ 0x0b, 0xa7, 0x59, 0x23, 0x51, 0x36, 0xee, 0xbb, 0x84, 0x83, 0x04, 0xa6,
+ 0x6d, 0x3a, 0xd1, 0x69, 0x0e, 0xcc, 0x18, 0x59, 0xe3, 0x1c, 0x25, 0x70,
+ 0xb7, 0x30, 0x37, 0x17, 0xd3, 0x01, 0x90, 0x2f, 0xb0, 0x67, 0xce, 0xc1,
+ 0xba, 0xfa, 0x25, 0xb9, 0xfb, 0x71, 0x89, 0xa0, 0x1d, 0x22, 0xf7, 0x49,
+ 0x33, 0x89, 0xed, 0x49, 0xc9, 0xec, 0x0b, 0x92, 0xe9, 0x04, 0xac, 0x6c,
+ 0x6e, 0x53, 0xc4, 0xbc, 0xc4, 0xd7, 0x82, 0x31, 0x08, 0x6a, 0x81, 0x63,
+ 0x9e, 0xc1, 0x6d, 0x65, 0xb3, 0x45, 0x28, 0xde, 0x58, 0x4d, 0xd4, 0x63,
+ 0xa0, 0x1d, 0x35, 0x52, 0x58, 0xec, 0x85, 0xfb, 0x14, 0x5b, 0xcd, 0x7e,
+ 0x02, 0xe2, 0x26, 0x3c, 0x54, 0x7a, 0xb9, 0xf4, 0x47, 0x6e, 0x3b, 0xbb,
+ 0x4c, 0xe1, 0xa8, 0xbf, 0x52, 0x1e, 0xa2, 0x3d, 0x6f, 0x2e, 0x96, 0x0d,
+ 0x48, 0x16, 0xc9, 0x18, 0x41, 0xf2, 0xad, 0x9d, 0x14, 0x9e, 0xc2, 0xfb,
+ 0x9b, 0x72, 0xca, 0xe6, 0x62, 0x10, 0x76, 0xd0, 0x54, 0x9e, 0xe4, 0x1e,
+ 0x89, 0xac, 0x84, 0x7e, 0x82, 0xbb, 0xf5, 0x0e, 0xc0, 0xaa, 0x56, 0xec,
+ 0xc0, 0xa8, 0x36, 0x59, 0x4a, 0xb8, 0x61, 0x85, 0x16, 0xde, 0x85, 0x89,
+ 0x0f, 0xe6, 0x9c, 0x8f, 0xca, 0x5a, 0xf6, 0x0b, 0xa5, 0xcb, 0x98, 0x2d,
+ 0x96, 0x56, 0x10, 0xcb, 0x42, 0x06, 0xa0, 0xd4, 0x45, 0x1a, 0x4f, 0xd6,
+ 0xcb, 0x80, 0xf4, 0xa1, 0x2e, 0x2a, 0x34, 0xa7, 0x24, 0x33, 0xb3, 0x4d,
+ 0xb2, 0x6c, 0x42, 0xbe, 0x4b, 0xec, 0x1d, 0x34, 0xca, 0xa9, 0xfe, 0x37,
+ 0x20, 0xe2, 0x92, 0x4c, 0x34, 0x73, 0x0a, 0x6f, 0x52, 0x32, 0x66, 0x9b,
+ 0x45, 0xba, 0x6c, 0xea, 0xda, 0x48, 0x90, 0x47, 0xc5, 0x93, 0x8b, 0x04,
+ 0x44, 0xfc, 0xeb, 0xd8, 0xb6, 0x4b, 0xa2, 0x50, 0xfe, 0x42, 0xbe, 0xa6,
+ 0x73, 0xb6, 0x44, 0x1e, 0x9d, 0x83, 0xb3, 0xe4, 0xa6, 0x9d, 0xf4, 0x8e,
+ 0xfc, 0x1a, 0xb9, 0x46, 0x14, 0xb8, 0xce, 0x4d, 0xe9, 0x2d, 0x7f, 0xdc,
+ 0x84, 0x40, 0x2d, 0x0e, 0x45, 0x99, 0x6e, 0x4c, 0x1f, 0x5c, 0x8b, 0x5e,
+ 0xee, 0x8b, 0xe2, 0xdf, 0x3c, 0x46, 0x10, 0xfb, 0x89, 0xb4, 0x1b, 0x8a,
+ 0x1d, 0x66, 0x4d, 0x9f, 0xbf, 0xb9, 0xbf, 0x9e, 0x28, 0x59, 0x13, 0xdf,
+ 0xe5, 0x68, 0x57, 0xe1, 0xd6, 0x40, 0xc6, 0x02, 0x1a, 0xcb, 0x6b, 0x28,
+ 0xc7, 0xbe, 0xdb, 0x1c, 0x31, 0x00, 0xee, 0xbe, 0xf9, 0xee, 0xe0, 0xe4,
+ 0xc3, 0xd1, 0xee, 0x9f, 0x13, 0xfa, 0xd7, 0x1e, 0xff, 0x6b, 0x6f, 0x3d,
+ 0xba, 0x4a, 0x46, 0x38, 0x6d, 0xbc, 0xd9, 0x48, 0xea, 0x87, 0xd9, 0xa8,
+ 0x9c, 0xda, 0x55, 0x92, 0xb9, 0xd0, 0x00, 0x52, 0x4f, 0x6e, 0x6f, 0x4d,
+ 0xc5, 0x12, 0xb7, 0x71, 0x57, 0x52, 0xd7, 0x02, 0xcc, 0x50, 0x29, 0x83,
+ 0xc0, 0x95, 0x9f, 0x13, 0xd4, 0x20, 0x6d, 0x4a, 0x85, 0x97, 0x84, 0xb0,
+ 0x96, 0x81, 0x65, 0x98, 0xd9, 0x48, 0x0f, 0xb4, 0x6e, 0xdd, 0x8e, 0xd4,
+ 0xe0, 0xab, 0xc5, 0x71, 0xc9, 0x79, 0xb2, 0x22, 0x10, 0xfc, 0x46, 0x2e,
+ 0x01, 0x1c, 0xa0, 0x6c, 0x77, 0xfc, 0xae, 0x68, 0xc4, 0x44, 0xbf, 0xf2,
+ 0xa0, 0x8c, 0x18, 0x1b, 0xe4, 0xf8, 0xb7, 0xb8, 0x60, 0xa0, 0x11, 0x03,
+ 0xdf, 0x57, 0x39, 0x1b, 0x89, 0xd6, 0xe2, 0x65, 0x62, 0x99, 0xfd, 0x78,
+ 0x42, 0xfb, 0x71, 0x5a, 0x8a, 0x6e, 0xae, 0xf9, 0x1e, 0x55, 0x8b, 0xff,
+ 0xc5, 0x63, 0x9c, 0xb3, 0x44, 0x39, 0xc2, 0x34, 0xd3, 0x0a, 0x84, 0xb1,
+ 0xe7, 0x35, 0x9a, 0x15, 0xa2, 0xc9, 0x35, 0x04, 0x06, 0x13, 0x25, 0x4c,
+ 0x13, 0x87, 0x38, 0x5e, 0xe8, 0x5f, 0x83, 0xb2, 0x85, 0x08, 0x7a, 0x32,
+ 0x4d, 0x83, 0xa1, 0x70, 0x92, 0x99, 0xa4, 0x9d, 0x9a, 0xf3, 0xe2, 0x76,
+ 0xa4, 0x59, 0xb1, 0x87, 0x69, 0xb6, 0xa5, 0x01, 0x35, 0xbd, 0x7e, 0xb6,
+ 0xdf, 0x97, 0x7f, 0x37, 0x33, 0x9e, 0xca, 0x47, 0x62, 0x77, 0x98, 0xdc,
+ 0x49, 0x4b, 0x7b, 0xee, 0x8e, 0x3b, 0x27, 0x62, 0xf9, 0xa7, 0x58, 0x99,
+ 0x6d, 0x34, 0xe8, 0x95, 0x40, 0x4d, 0x02, 0xce, 0x2c, 0x58, 0x04, 0xb9,
+ 0x6d, 0x6d, 0x2e, 0x9f, 0x77, 0x45, 0xe9, 0x94, 0x98, 0x3d, 0x56, 0xf2,
+ 0xd6, 0x73, 0x4b, 0x2f, 0xd7, 0x40, 0x57, 0xa4, 0x76, 0x75, 0x9c, 0x25,
+ 0x17, 0xc3, 0xd1, 0xa7, 0xac, 0x1a, 0x53, 0x4a, 0xe7, 0xd8, 0x68, 0x8a,
+ 0xd0, 0xbd, 0xae, 0xc4, 0x8d, 0x12, 0xec, 0x1b, 0x15, 0x7f, 0x88, 0x58,
+ 0xeb, 0xfa, 0x2f, 0x5d, 0x7b, 0xda, 0x8b, 0xe5, 0xd8, 0xec, 0xe1, 0x81,
+ 0x65, 0xdf, 0xd0, 0x0b, 0xab, 0x7d, 0xae, 0x15, 0x18, 0x0f, 0xb7, 0x77,
+ 0x00, 0x3d, 0xc1, 0x0c, 0xeb, 0x8b, 0xde, 0x6a, 0xca, 0x76, 0x41, 0x5f,
+ 0x98, 0x4b, 0xc1, 0x45, 0x31, 0x28, 0x15, 0x0f, 0x09, 0xe9, 0xcb, 0x71,
+ 0x36, 0x76, 0x75, 0x90, 0x27, 0x0b, 0xaf, 0x7e, 0xf1, 0xa0, 0x69, 0xec,
+ 0x9b, 0xb8, 0xc5, 0x58, 0x59, 0x53, 0xba, 0x13, 0x70, 0x1b, 0x84, 0x49,
+ 0x3e, 0xd3, 0xf2, 0x9e, 0x62, 0x05, 0x6d, 0xf2, 0xa1, 0x59, 0x39, 0xe1,
+ 0xfd, 0x30, 0x7a, 0xb0, 0xcc, 0xa1, 0x7d, 0xd2, 0x5d, 0xf8, 0xb3, 0x03,
+ 0x0d, 0x8f, 0x45, 0x77, 0x80, 0x15, 0x07, 0x1d, 0xfc, 0x74, 0xea, 0xd0,
+ 0xd3, 0x0d, 0x3b, 0x3d, 0xf9, 0xbe, 0x77, 0x99, 0xff, 0xb1, 0x8b, 0x06,
+ 0x23, 0x1e, 0x95, 0xcd, 0x8d, 0xbd, 0x72, 0x30, 0x60, 0xf2, 0x19, 0x25,
+ 0x57, 0x8b, 0x06, 0x4a, 0xb9, 0x5a, 0x66, 0x8d, 0xe0, 0xa4, 0xc4, 0x89,
+ 0x11, 0xc4, 0xc5, 0x6e, 0x99, 0x77, 0xa2, 0x6c, 0x94, 0x53, 0x4c, 0xf8,
+ 0x76, 0x1a, 0xe4, 0x2f, 0x93, 0x23, 0x05, 0x46, 0x29, 0xe8, 0x4d, 0xcc,
+ 0x77, 0x09, 0x7c, 0x52, 0xd7, 0x44, 0x65, 0x41, 0x43, 0x4f, 0x83, 0x34,
+ 0x56, 0x4c, 0xb5, 0xf9, 0x3f, 0x6f, 0x51, 0x37, 0x39, 0xd1, 0xdc, 0x19,
+ 0x72, 0x9c, 0x7f, 0x4a, 0x91, 0xcc, 0xc5, 0x48, 0xdf, 0xa9, 0xe1, 0x3e,
+ 0x88, 0x80, 0x8a, 0x5a, 0x5a, 0xe5, 0x92, 0x43, 0xfb, 0x0f, 0x1b, 0x1a,
+ 0x81, 0xe1, 0x55, 0xd5, 0xcc, 0xdf, 0x05, 0x06, 0x34, 0x8b, 0xec, 0xc3,
+ 0x94, 0x87, 0xc2, 0x2b, 0x75, 0xb1, 0x22, 0xa8, 0xf9, 0xdd, 0x51, 0xcc,
+ 0x27, 0x50, 0xc5, 0xf4, 0x1d, 0x28, 0x2f, 0x1e, 0x0f, 0x4f, 0x5d, 0xca,
+ 0x89, 0x44, 0xf3, 0x24, 0x68, 0x9c, 0xa4, 0x89, 0x25, 0xa4, 0x77, 0x65,
+ 0x80, 0x1f, 0x0c, 0x68, 0x69, 0xb6, 0xa2, 0xe9, 0xfa, 0xf2, 0xc1, 0xbc,
+ 0x88, 0x9b, 0xb1, 0x6f, 0xf6, 0x7f, 0x1d, 0x0b, 0xaa, 0xe9, 0xe5, 0x3a,
+ 0x2e, 0x8b, 0xbf, 0x2e, 0x8a, 0x71, 0x63, 0x31, 0x56, 0xd0, 0x49, 0xcb,
+ 0x9e, 0x47, 0x07, 0x24, 0x11, 0x44, 0x8b, 0x2e, 0xe9, 0x6e, 0x7c, 0x7c,
+ 0x48, 0x52, 0xcd, 0x29, 0x93, 0x85, 0xe0, 0xa7, 0x74, 0xed, 0x4c, 0xbd,
+ 0x9c, 0x97, 0x9b, 0xdc, 0xac, 0x50, 0x35, 0xbe, 0x41, 0x96, 0x1e, 0x62,
+ 0x97, 0x99, 0x3a, 0xef, 0xe2, 0x98, 0x18, 0x69, 0x56, 0x14, 0xa5, 0x9c,
+ 0x44, 0x12, 0x65, 0xe4, 0x96, 0x85, 0x0a, 0xea, 0x65, 0xfd, 0x0c, 0x11,
+ 0x82, 0x37, 0x34, 0xe7, 0xd9, 0xb4, 0xce, 0x2c, 0x52, 0xc1, 0xbe, 0xe3,
+ 0x4c, 0x11, 0x98, 0xc5, 0x64, 0x1f, 0xe5, 0x15, 0xfb, 0xb7, 0xf2, 0xe8,
+ 0x29, 0x47, 0x4f, 0x8c, 0x0a, 0x22, 0x9d, 0x21, 0x43, 0x8f, 0xf6, 0xc9,
+ 0x83, 0xe6, 0x73, 0x4b, 0x0b, 0xba, 0xeb, 0x34, 0x9f, 0x3b, 0xb8, 0x7d,
+ 0x4a, 0x3b, 0x6f, 0x92, 0x23, 0xad, 0x53, 0x95, 0x2b, 0xdd, 0x23, 0x6f,
+ 0x15, 0x72, 0x2e, 0x98, 0xde, 0x30, 0x33, 0x30, 0xc5, 0x6a, 0xfa, 0xfd,
+ 0xab, 0x66, 0xde, 0x8f, 0x2e, 0x01, 0xd6, 0xba, 0xbd, 0x05, 0xa6, 0x57,
+ 0x92, 0x0f, 0xff, 0x5e, 0xa9, 0x40, 0xee, 0x08, 0x84, 0x9c, 0x9c, 0xbc,
+ 0xe3, 0xd0, 0xf1, 0xe1, 0x05, 0xfd, 0x2d, 0xb7, 0x6c, 0x00, 0x03, 0x1c,
+ 0x0a, 0xa2, 0xfa, 0xe5, 0x4c, 0xbd, 0xf7, 0xdf, 0x75, 0x13, 0x48, 0x36,
+ 0xcf, 0x86, 0xdb, 0xcf, 0x5e, 0xed, 0x84, 0x49, 0xcd, 0x9b, 0xf4, 0x0d,
+ 0x47, 0x93, 0xf2, 0xd9, 0xe0, 0xf9, 0xce, 0x60, 0x67, 0xab, 0xd3, 0x1b,
+ 0x9a, 0x6e, 0x41, 0x1d, 0xc5, 0xd0, 0x70, 0x4a, 0xee, 0x68, 0x2f, 0x0e,
+ 0x9a, 0x02, 0x97, 0xff, 0xab, 0x20, 0x40, 0x3f, 0x0d, 0xe6, 0x22, 0xbb,
+ 0x33, 0x5b, 0x2d, 0x66, 0x0c, 0x27, 0x27, 0x79, 0x2d, 0xae, 0x4f, 0xba,
+ 0xcd, 0xf4, 0x7e, 0xa1, 0x3c, 0xb3, 0x76, 0xee, 0x17, 0x1e, 0xa1, 0x0b,
+ 0x93, 0xe3, 0xf2, 0x91, 0xc8, 0x40, 0x6d, 0x3a, 0x55, 0x01, 0x31, 0x86,
+ 0xf8, 0xf3, 0xef, 0xee, 0x00, 0xf1, 0x1c, 0x7a, 0xbb, 0xaf, 0x06, 0x9f,
+ 0xf9, 0x6b, 0x4a, 0x9a, 0x78, 0x3f, 0xad, 0xc7, 0x79, 0xbe, 0xd2, 0xc6,
+ 0x50, 0xae, 0x8d, 0xbf, 0x2e, 0x40, 0xf8, 0x61, 0xb6, 0x69, 0x9e, 0x72,
+ 0x58, 0xd1, 0xf1, 0x24, 0x05, 0xcd, 0x92, 0x1a, 0x69, 0xb6, 0xd8, 0xaa,
+ 0x76, 0xc5, 0xa5, 0x4d, 0xf4, 0xcd, 0x42, 0xed, 0x06, 0x77, 0xde, 0x14,
+ 0xe7, 0xba, 0xa3, 0x4a, 0x99, 0xb3, 0xc0, 0xd4, 0x20, 0xf3, 0x2a, 0x4c,
+ 0x50, 0x30, 0x72, 0x02, 0x44, 0x91, 0x66, 0xee, 0xeb, 0x92, 0xe6, 0x29,
+ 0x36, 0xa9, 0xf0, 0x1a, 0x80, 0x1c, 0xcb, 0x1a, 0x37, 0xf6, 0xec, 0x0b,
+ 0x70, 0xe5, 0x4b, 0x0f, 0x65, 0xd2, 0x32, 0x50, 0xd2, 0x88, 0x32, 0xc8,
+ 0xdc, 0x9e, 0x09, 0x42, 0xb9, 0x6c, 0x3f, 0xd1, 0x40, 0x98, 0x8c, 0x24,
+ 0x81, 0x2b, 0x82, 0xf1, 0x0c, 0xc2, 0x39, 0x4b, 0xa9, 0xfe, 0x76, 0xb6,
+ 0x22, 0x44, 0x0e, 0x3d, 0x33, 0x3e, 0x30, 0x07, 0x61, 0x07, 0x15, 0xd9,
+ 0x3d, 0x49, 0xe3, 0x5a, 0xd4, 0x89, 0xaa, 0xca, 0xc9, 0x99, 0x63, 0x03,
+ 0xe1, 0xac, 0x92, 0x11, 0x34, 0x90, 0x2e, 0xe8, 0x49, 0x24, 0x2b, 0x6d,
+ 0x8c, 0xd3, 0x59, 0x5b, 0x2a, 0xa6, 0x02, 0xdc, 0x37, 0xc4, 0xe5, 0xf2,
+ 0x34, 0xab, 0x76, 0xe9, 0xa6, 0x03, 0x37, 0xb0, 0x43, 0x23, 0x34, 0x11,
+ 0x67, 0x0f, 0xc1, 0x09, 0xd8, 0x33, 0xc2, 0x5c, 0x18, 0x98, 0xeb, 0xb4,
+ 0x16, 0x1e, 0xe9, 0x11, 0xef, 0xc6, 0x15, 0x5b, 0xa7, 0x4a, 0xef, 0x1f,
+ 0xdf, 0x8f, 0xde, 0xae, 0x91, 0x99, 0x9e, 0xc2, 0x55, 0xe2, 0x51, 0x77,
+ 0xc1, 0x47, 0xa0, 0x20, 0xb6, 0x48, 0x4f, 0x85, 0x32, 0x96, 0xf9, 0x5a,
+ 0xcd, 0x64, 0x36, 0x62, 0xdc, 0xb0, 0x5c, 0xff, 0x72, 0x05, 0xe8, 0xdb,
+ 0x39, 0x15, 0xdd, 0x28, 0x5a, 0x9e, 0xf3, 0x0e, 0xff, 0x0f, 0x86, 0x65,
+ 0xae, 0x3c, 0x46, 0x4d, 0x3f, 0xe1, 0x50, 0xb8, 0xd1, 0xf5, 0xec, 0x46,
+ 0x12, 0xe5, 0x9f, 0x1d, 0x43, 0xde, 0x30, 0x85, 0x28, 0x2a, 0x06, 0x8f,
+ 0x63, 0xa2, 0x2c, 0xda, 0x56, 0xc8, 0xde, 0xb6, 0x04, 0x20, 0xf3, 0xac,
+ 0x22, 0x29, 0x08, 0x14, 0x6e, 0x5f, 0x11, 0xa0, 0xb1, 0x8b, 0xc5, 0x6c,
+ 0xfe, 0xc3, 0xaf, 0x8f, 0x01, 0x89, 0x35, 0x87, 0xbe, 0x90, 0x54, 0x49,
+ 0xee, 0x3f, 0x13, 0x76, 0x5b, 0x23, 0xec, 0x3a, 0xb7, 0x26, 0x63, 0x9a,
+ 0xb4, 0xc8, 0xb8, 0x3a, 0x3a, 0x72, 0xa2, 0xca, 0xb0, 0x80, 0xfe, 0x44,
+ 0xa7, 0xa5, 0xc8, 0x02, 0x29, 0xa4, 0x1a, 0x26, 0x4b, 0x1d, 0x44, 0x39,
+ 0x3a, 0x5f, 0xf8, 0xba, 0xa6, 0xf4, 0xa6, 0x35, 0x53, 0x2d, 0xb0, 0x62,
+ 0x11, 0x60, 0x70, 0xdd, 0x7e, 0x65, 0x02, 0xf4, 0x2c, 0xc4, 0x13, 0xc9,
+ 0xe7, 0xe3, 0x15, 0x0a, 0xb0, 0x26, 0x1d, 0x73, 0xdc, 0x4e, 0x5d, 0xa6,
+ 0x01, 0x62, 0x74, 0x1f, 0x20, 0x78, 0x72, 0xca, 0xc4, 0x3c, 0x7f, 0xaa,
+ 0x96, 0x50, 0x48, 0xe0, 0x3f, 0x80, 0xab, 0xa6, 0x3b, 0xc2, 0x9c, 0x4f,
+ 0xba, 0x25, 0x35, 0x39, 0xc1, 0x6f, 0x4d, 0x29, 0x5e, 0x04, 0x4d, 0x18,
+ 0x6f, 0x8e, 0xec, 0x95, 0x37, 0x74, 0xb3, 0x7f, 0x29, 0x0e, 0x0f, 0x73,
+ 0x54, 0x53, 0x3f, 0x08, 0x22, 0x99, 0x29, 0xe8, 0xbb, 0x66, 0xa1, 0xd3,
+ 0x34, 0xc4, 0x9b, 0x33, 0x97, 0xe3, 0xf8, 0xc6, 0x9f, 0x3d, 0xde, 0x71,
+ 0xc4, 0xd0, 0x58, 0x33, 0x09, 0xfe, 0xbf, 0x74, 0x27, 0xef, 0xcd, 0xe3,
+ 0xb3, 0xf7, 0x4b, 0xa7, 0x6f, 0xf5, 0xec, 0x31, 0xd3, 0xa9, 0x22, 0x10,
+ 0xdf, 0x78, 0x8e, 0x1e, 0x04, 0xd1, 0xd9, 0x56, 0xb0, 0x0e, 0x9f, 0xb6,
+ 0x94, 0xf1, 0x8c, 0xa2, 0x37, 0xbf, 0xd5, 0xaa, 0x63, 0x33, 0xc2, 0x02,
+ 0xa5, 0xce, 0xc7, 0x9b, 0x63, 0x6f, 0x25, 0xd6, 0xde, 0xe7, 0xe3, 0x11,
+ 0x9d, 0x11, 0x2d, 0x90, 0xa1, 0xf7, 0xc9, 0xec, 0xff, 0x86, 0x37, 0xf3,
+ 0x08, 0x3e, 0x95, 0x7e, 0xbc, 0x39, 0xcd, 0xc0, 0x10, 0xa5, 0x31, 0x18,
+ 0xdf, 0x97, 0x7a, 0x49, 0x3d, 0x36, 0x38, 0xd9, 0x17, 0x0c, 0x17, 0x03,
+ 0x62, 0x43, 0x5c, 0x74, 0x16, 0xb9, 0x63, 0xe3, 0x6f, 0x11, 0x27, 0xa6,
+ 0x4d, 0x83, 0xb1, 0xfc, 0x40, 0xd8, 0x8f, 0xf6, 0x06, 0xdb, 0xea, 0xb5,
+ 0xe7, 0x8c, 0x58, 0x4f, 0x70, 0x1f, 0xc8, 0x42, 0xc7, 0x9b, 0xcb, 0x61,
+ 0x98, 0xca, 0xf2, 0x11, 0x89, 0x69, 0x74, 0xf9, 0xfe, 0xff, 0x6c, 0x88,
+ 0xec, 0x1e, 0x65, 0xec, 0x28, 0x17, 0x43, 0xb8, 0x66, 0x3e, 0x21, 0xd3,
+ 0x2d, 0x80, 0x97, 0x93, 0x16, 0xdd, 0x78, 0x47, 0x08, 0xe0, 0xae, 0x25,
+ 0xd7, 0x38, 0xc5, 0xec, 0xa6, 0x88, 0x6c, 0xe6, 0x4c, 0x8a, 0xf8, 0xc6,
+ 0xde, 0x3c, 0x93, 0x3e, 0x0d, 0xaf, 0x2f, 0xbb, 0x76, 0x80, 0x7d, 0xb8,
+ 0x62, 0xb3, 0xda, 0xcd, 0x19, 0xdf, 0x97, 0xc1, 0x0e, 0x5c, 0x7e, 0x3b,
+ 0x2a, 0xf5, 0x96, 0x5c, 0xef, 0xad, 0xcb, 0x72, 0xf7, 0xf3, 0xd6, 0x65,
+ 0xe9, 0xde, 0x59, 0x75, 0x4d, 0x0e, 0x33, 0xc6, 0xfa, 0xf8, 0x3e, 0x37,
+ 0xbc, 0x04, 0x04, 0x05, 0x68, 0x6f, 0x15, 0x35, 0x02, 0xe3, 0x04, 0x4b,
+ 0x4c, 0xaf, 0x76, 0x75, 0x00, 0x81, 0x69, 0x24, 0x92, 0x8b, 0x98, 0xb0,
+ 0x49, 0x8c, 0xc0, 0x8b, 0x28, 0xf3, 0xc9, 0xa8, 0x2a, 0xef, 0x6b, 0x68,
+ 0x4f, 0x6a, 0x4f, 0xa5, 0x8c, 0x2e, 0xbc, 0x49, 0xeb, 0x50, 0x31, 0x9c,
+ 0x5a, 0x8a, 0xb0, 0x6f, 0x2e, 0xdf, 0x9f, 0x30, 0x0d, 0x2a, 0x67, 0x46,
+ 0x51, 0x22, 0x87, 0xf4, 0x79, 0x31, 0x9a, 0x99, 0xf5, 0x37, 0x0a, 0x4a,
+ 0xc3, 0xd2, 0x4c, 0x05, 0x64, 0x90, 0xbe, 0x85, 0xa8, 0x90, 0x04, 0x15,
+ 0xe7, 0x31, 0x5f, 0xbf, 0xb8, 0x82, 0x5c, 0x34, 0x4d, 0x16, 0x17, 0xb9,
+ 0x44, 0x6b, 0xc1, 0x1e, 0x51, 0x78, 0xc5, 0xf6, 0xa7, 0xfe, 0xfd, 0xfd,
+ 0x7d, 0x9f, 0x7a, 0xe7, 0x14, 0x13, 0x32, 0xd9, 0x0e, 0x89, 0x45, 0x85,
+ 0xed, 0x97, 0xfe, 0x3b, 0x5a, 0x0a, 0x7a, 0x24, 0x38, 0x7d, 0x9e, 0xa6,
+ 0x06, 0xb6, 0x7e, 0xb0, 0x0d, 0x5a, 0x87, 0x02, 0x29, 0x5e, 0x96, 0xaa,
+ 0x17, 0xe4, 0x14, 0x69, 0x5b, 0xd9, 0xea, 0x8a, 0x34, 0xa7, 0x7c, 0x39,
+ 0xd2, 0x5d, 0x5f, 0xff, 0x22, 0x55, 0x84, 0x54, 0x22, 0x89, 0x49, 0x2c,
+ 0x2a, 0xf2, 0x3f, 0xb1, 0x85, 0xd1, 0x8b, 0xc0, 0x99, 0x45, 0x27, 0x51,
+ 0xbf, 0xbe, 0x8d, 0x8e, 0xb5, 0x2c, 0x13, 0x65, 0x17, 0xa5, 0xb6, 0xbd,
+ 0xe3, 0x1b, 0xd1, 0x13, 0x99, 0x0a, 0x02, 0x20, 0x75, 0xac, 0xa6, 0xd9,
+ 0x6c, 0xa6, 0x75, 0x90, 0xe7, 0xa7, 0xf0, 0xe7, 0x06, 0x1a, 0x5e, 0x54,
+ 0xc7, 0x76, 0xd4, 0xbb, 0xb5, 0x63, 0x5b, 0x55, 0xf3, 0x0e, 0x8c, 0x18,
+ 0xe0, 0xc0, 0x00, 0xdd, 0x6a, 0xd9, 0x76, 0xcf, 0xf4, 0x83, 0x08, 0xa2,
+ 0xb8, 0x6b, 0x7a, 0x5e, 0xa4, 0x26, 0x27, 0x87, 0x89, 0x9f, 0x2f, 0xee,
+ 0xa8, 0xe0, 0x66, 0x59, 0x75, 0xcd, 0x28, 0x21, 0xe6, 0x09, 0x8b, 0x66,
+ 0x8d, 0xa6, 0x89, 0x47, 0x87, 0x92, 0x24, 0xff, 0xda, 0xe7, 0x4b, 0x15,
+ 0x9e, 0x95, 0x05, 0x25, 0x1a, 0x88, 0x0b, 0x78, 0xa3, 0x3f, 0x61, 0xb1,
+ 0x32, 0x49, 0x0b, 0x33, 0x13, 0xe6, 0xc4, 0x86, 0x10, 0x8b, 0xe9, 0xf4,
+ 0xcd, 0xb4, 0x5c, 0xd4, 0x0f, 0x1b, 0x89, 0x30, 0x5f, 0x0b, 0x59, 0x6c,
+ 0xc3, 0x09, 0x7f, 0x58, 0x4b, 0xb3, 0xbe, 0x8b, 0xe2, 0x56, 0xef, 0x45,
+ 0x02, 0x81, 0xd7, 0xec, 0x5b, 0xec, 0x34, 0xb7, 0xe1, 0x7d, 0xec, 0x5f,
+ 0xfd, 0xb6, 0xa3, 0xb3, 0x0c, 0x4f, 0x24, 0xdb, 0x79, 0x4f, 0x33, 0xf4,
+ 0x5c, 0x14, 0x21, 0x66, 0xe5, 0x25, 0xad, 0xa8, 0x8f, 0x6d, 0x90, 0xee,
+ 0x0d, 0xe6, 0x66, 0x53, 0x2f, 0xb9, 0x0b, 0xff, 0x43, 0xde, 0x2c, 0xc1,
+ 0xf5, 0xbb, 0x6a, 0x52, 0x8c, 0xeb, 0x77, 0x14, 0x35, 0x9c, 0x32, 0x6c,
+ 0x99, 0xa2, 0xfd, 0x2c, 0xa2, 0x41, 0x72, 0x1e, 0x41, 0x64, 0x21, 0x20,
+ 0x6a, 0x9b, 0x4b, 0x7d, 0xfe, 0x2b, 0xb9, 0xd6, 0x6c, 0x66, 0x25, 0x40,
+ 0xbb, 0x8c, 0xc4, 0x4e, 0xac, 0x35, 0x19, 0x20, 0x3d, 0xd8, 0xb4, 0x04,
+ 0xb6, 0x5f, 0xad, 0x4f, 0xeb, 0x29, 0x26, 0x0a, 0x4e, 0x4a, 0xa4, 0xa5,
+ 0xe8, 0xb8, 0x1a, 0xd3, 0xec, 0x6b, 0x67, 0x37, 0x67, 0x70, 0x66, 0xbc,
+ 0xd3, 0x4b, 0xf3, 0x01, 0x21, 0x60, 0xf9, 0x38, 0xe9, 0x26, 0xeb, 0x18,
+ 0x5d, 0x9c, 0x0b, 0xea, 0xc4, 0x4a, 0x30, 0x58, 0x86, 0xe8, 0xad, 0x80,
+ 0x34, 0xf9, 0x67, 0xdb, 0xbb, 0x6d, 0x9c, 0xd5, 0xd5, 0xbd, 0x82, 0x96,
+ 0xfb, 0x0b, 0x1d, 0x8f, 0x99, 0x13, 0x81, 0xfc, 0xfa, 0xb1, 0x42, 0xa5,
+ 0xa4, 0x35, 0xf1, 0x74, 0xf9, 0xa6, 0x5e, 0x36, 0xcd, 0xae, 0x79, 0x4c,
+ 0xaf, 0x4f, 0x8e, 0xbe, 0x3b, 0x3a, 0x09, 0x2e, 0xb0, 0xaf, 0x87, 0xc3,
+ 0xed, 0xdb, 0xac, 0x1a, 0xa1, 0xbe, 0x0f, 0xf9, 0xbc, 0x13, 0x3c, 0x67,
+ 0xf1, 0x3a, 0x9e, 0x54, 0xbf, 0x77, 0xc9, 0xca, 0x82, 0x66, 0x0d, 0x8c,
+ 0x7d, 0x22, 0xb4, 0xe7, 0x4f, 0x0a, 0x17, 0x27, 0xf2, 0x2a, 0x04, 0x18,
+ 0x86, 0x5b, 0x6a, 0x5c, 0x65, 0x13, 0xae, 0x7f, 0x13, 0x42, 0xc2, 0x0a,
+ 0x52, 0xf3, 0x93, 0xe4, 0x2d, 0x96, 0x92, 0xe1, 0xb2, 0x88, 0x7e, 0xd8,
+ 0x41, 0x04, 0x6f, 0xcc, 0x4b, 0x73, 0x85, 0x3c, 0x24, 0x6f, 0xe5, 0x9b,
+ 0x92, 0x5c, 0x47, 0xb3, 0xc1, 0x5c, 0x26, 0x6c, 0x32, 0x9c, 0x7d, 0xdb,
+ 0x3f, 0x18, 0xf6, 0xdf, 0x1e, 0x9d, 0x1c, 0x7d, 0x7d, 0x70, 0x79, 0xa4,
+ 0x84, 0x93, 0xe4, 0xfe, 0x5f, 0xa2, 0x0c, 0xb1, 0xbc, 0xfb, 0x56, 0xa6,
+ 0x05, 0xe3, 0x27, 0xc2, 0xd2, 0x26, 0x67, 0x1a, 0x61, 0xe5, 0x65, 0xe5,
+ 0x22, 0x6d, 0x64, 0xa2, 0x00, 0x3e, 0x53, 0x5e, 0xc5, 0x9b, 0x33, 0xa7,
+ 0x6f, 0x3a, 0x93, 0xae, 0x06, 0x23, 0x48, 0xa7, 0xf7, 0x54, 0x50, 0xe0,
+ 0x43, 0x41, 0x78, 0xe1, 0xdc, 0xe6, 0xc5, 0xf1, 0xe8, 0xbd, 0xc9, 0xf7,
+ 0x66, 0xb6, 0xb5, 0xc0, 0x20, 0x66, 0x5c, 0x62, 0xbc, 0x1f, 0x15, 0x5c,
+ 0x11, 0x00, 0xc1, 0xc7, 0xb7, 0x78, 0xb2, 0x43, 0x00, 0x39, 0xb0, 0xee,
+ 0x34, 0x3a, 0xea, 0xf2, 0xab, 0x48, 0xda, 0x36, 0x6d, 0xa0, 0x7a, 0x7c,
+ 0x93, 0xcd, 0x44, 0xa3, 0xa4, 0x80, 0x33, 0x92, 0x1e, 0x39, 0x89, 0x4c,
+ 0x32, 0xe5, 0xf9, 0xa0, 0x8f, 0x32, 0x08, 0x66, 0xc4, 0x73, 0xb0, 0x79,
+ 0x63, 0xf4, 0x8a, 0xf7, 0x44, 0x0b, 0x4b, 0x4e, 0x7a, 0x82, 0x60, 0x20,
+ 0x5b, 0x72, 0x00, 0xb4, 0x18, 0x83, 0xe7, 0x8b, 0x56, 0xe8, 0xd7, 0xca,
+ 0x4b, 0xae, 0x7a, 0xd1, 0xbd, 0xfc, 0x2d, 0xbf, 0xa4, 0xc7, 0x0b, 0x47,
+ 0x91, 0x1d, 0xfc, 0x08, 0x02, 0x53, 0x55, 0x5f, 0xea, 0xe4, 0xaf, 0xf4,
+ 0x70, 0x0a, 0xbc, 0xd5, 0xe5, 0x8e, 0x25, 0xb0, 0x49, 0x43, 0xfc, 0xcb,
+ 0x52, 0xd8, 0x97, 0xc4, 0xda, 0xa9, 0xbb, 0xda, 0x5f, 0xb6, 0xd1, 0x94,
+ 0xfc, 0x92, 0x97, 0x32, 0x91, 0xb3, 0x2c, 0x8c, 0xb1, 0x4f, 0x14, 0x0c,
+ 0x2d, 0x4a, 0x59, 0xa2, 0xf0, 0xd4, 0xbf, 0x86, 0xc4, 0xbf, 0x36, 0xa3,
+ 0xa8, 0x9f, 0xcd, 0x03, 0x1e, 0xc5, 0xcd, 0x77, 0x4a, 0x92, 0x6a, 0xf5,
+ 0x3c, 0xbf, 0x4a, 0x80, 0x47, 0xe9, 0x7d, 0x74, 0x7e, 0xc1, 0xa5, 0xfa,
+ 0x4e, 0xe8, 0x2f, 0x12, 0xb4, 0xa9, 0x63, 0xdc, 0x2f, 0x42, 0xd2, 0x4c,
+ 0x18, 0x83, 0x0c, 0x5e, 0x7f, 0x1b, 0x8b, 0x55, 0x60, 0x19, 0xc3, 0x09,
+ 0x85, 0xff, 0x52, 0x0e, 0x44, 0x2c, 0x41, 0xcf, 0x2b, 0x2d, 0x43, 0x3d,
+ 0xa1, 0x2e, 0x08, 0xdd, 0x1d, 0x3a, 0xc1, 0x90, 0x48, 0xf5, 0xad, 0x9f,
+ 0xd1, 0x2f, 0x49, 0xf7, 0x53, 0xe0, 0xc0, 0x92, 0x69, 0x6c, 0x31, 0xd5,
+ 0x52, 0xb3, 0x40, 0x61, 0x57, 0x28, 0x44, 0x94, 0x9a, 0xae, 0x0c, 0x3a,
+ 0x43, 0x05, 0x95, 0x3c, 0x71, 0x4d, 0x85, 0xae, 0x74, 0x90, 0xe8, 0x8b,
+ 0x5f, 0x4c, 0xe1, 0xb4, 0x34, 0x60, 0x05, 0x0f, 0xf7, 0x24, 0x44, 0x9d,
+ 0xda, 0x70, 0x25, 0x8a, 0x18, 0x22, 0x76, 0x1d, 0x68, 0xdb, 0x02, 0xb6,
+ 0xe6, 0x31, 0x50, 0xba, 0xb0, 0x44, 0x5d, 0x59, 0x39, 0xbb, 0x92, 0xc8,
+ 0x56, 0x0a, 0x7a, 0x41, 0x98, 0x19, 0x23, 0xd6, 0x26, 0x00, 0xd2, 0xba,
+ 0x49, 0x8b, 0xc8, 0xa9, 0x33, 0x13, 0x6f, 0xd9, 0xfc, 0x31, 0x4a, 0x59,
+ 0xb6, 0x88, 0x42, 0x4d, 0x7b, 0xa3, 0x85, 0xf1, 0xa5, 0xa2, 0x6b, 0x9f,
+ 0x48, 0x61, 0xcf, 0xc9, 0x25, 0x2e, 0x5d, 0xe1, 0x99, 0x21, 0x32, 0x09,
+ 0xdd, 0x6f, 0x65, 0x6c, 0x57, 0x89, 0x78, 0x71, 0x8e, 0xfa, 0xd6, 0x16,
+ 0x5c, 0xe2, 0x02, 0xce, 0x12, 0x8b, 0xe8, 0xa9, 0x91, 0x48, 0xe0, 0x11,
+ 0xc9, 0x51, 0x75, 0xac, 0x76, 0xa6, 0x01, 0x96, 0x0f, 0xf7, 0x7a, 0x11,
+ 0x60, 0xcf, 0x19, 0x4b, 0x6e, 0xbe, 0x8d, 0xee, 0x92, 0x57, 0xc6, 0x06,
+ 0xf3, 0x68, 0xf3, 0x04, 0xdf, 0x7f, 0x8b, 0xce, 0xd1, 0x77, 0xf0, 0x02,
+ 0x4e, 0xbe, 0xd1, 0x1f, 0xb8, 0xb8, 0x1a, 0x21, 0x76, 0x78, 0x2b, 0x8f,
+ 0x32, 0xf3, 0xbd, 0x9c, 0xaa, 0x37, 0xf8, 0xd5, 0x4f, 0x42, 0xd4, 0x6a,
+ 0x6d, 0x36, 0x20, 0xdd, 0x16, 0xa4, 0x88, 0x91, 0x14, 0xa2, 0x77, 0x29,
+ 0x14, 0x9f, 0x25, 0x7e, 0xe9, 0x13, 0x6c, 0x08, 0x68, 0xef, 0xe7, 0x3d,
+ 0x09, 0x85, 0x01, 0xac, 0x16, 0x44, 0x94, 0xcd, 0x04, 0x8e, 0x2d, 0xe7,
+ 0x84, 0x3e, 0x99, 0xd6, 0x77, 0xf1, 0x13, 0x5e, 0xdf, 0x45, 0x4f, 0xf8,
+ 0x13, 0xce, 0xb9, 0xb3, 0x7d, 0x8e, 0xce, 0x87, 0xdf, 0x25, 0x4b, 0x72,
+ 0xe0, 0x99, 0x70, 0x9b, 0x8f, 0xb8, 0x1b, 0x1d, 0x6d, 0x7a, 0xff, 0x98,
+ 0x2f, 0x3f, 0xe7, 0x51, 0x77, 0x7d, 0x70, 0xce, 0xcd, 0xf7, 0xe5, 0x70,
+ 0x9f, 0x1f, 0x0c, 0xbf, 0xf3, 0x8e, 0xb5, 0xb7, 0x05, 0x62, 0x39, 0x67,
+ 0x16, 0xa8, 0x4c, 0xf1, 0x45, 0xde, 0x3a, 0xd4, 0x58, 0x74, 0xbf, 0xd7,
+ 0x77, 0x4f, 0xd9, 0xef, 0xa6, 0x27, 0xc1, 0x7e, 0x0f, 0xe6, 0x78, 0xd5,
+ 0x7e, 0xf7, 0x17, 0xaa, 0x8d, 0x81, 0xf4, 0x76, 0x7b, 0xc1, 0xf5, 0xdf,
+ 0x6e, 0x50, 0x4a, 0x34, 0xbe, 0xcd, 0x81, 0x84, 0xe5, 0xad, 0x1d, 0x42,
+ 0xc4, 0xd0, 0xcf, 0x5f, 0xb6, 0xd1, 0xcd, 0x0b, 0xc1, 0x46, 0xd7, 0xf5,
+ 0x8c, 0xef, 0xf4, 0x65, 0x1b, 0x5d, 0x11, 0xa2, 0x19, 0x6f, 0x72, 0x7f,
+ 0x8f, 0x87, 0xfb, 0xdb, 0xdb, 0xb5, 0x7e, 0xb6, 0x6b, 0x38, 0x43, 0x0a,
+ 0x54, 0x62, 0xc4, 0x11, 0xed, 0x12, 0x97, 0xbb, 0x1e, 0xe1, 0x4a, 0xd0,
+ 0x4c, 0x74, 0xce, 0xfb, 0x0b, 0xbd, 0xeb, 0x36, 0x03, 0xb9, 0x05, 0x66,
+ 0xaf, 0x54, 0x97, 0xc6, 0x2d, 0x8e, 0x6b, 0x1b, 0xa6, 0xba, 0x9f, 0x37,
+ 0x7d, 0x15, 0x9c, 0xc8, 0x16, 0x99, 0x48, 0x16, 0x4d, 0xc2, 0xad, 0x33,
+ 0x82, 0x08, 0x80, 0xc7, 0xa6, 0x75, 0x4e, 0x8b, 0xba, 0xef, 0xea, 0xf3,
+ 0xbd, 0xb6, 0x7f, 0x0d, 0xb4, 0xf4, 0xb7, 0xa7, 0xc3, 0xce, 0x71, 0xad,
+ 0x33, 0x46, 0xcc, 0x5f, 0xe3, 0xe8, 0x99, 0xdf, 0x27, 0x2e, 0xf7, 0xc7,
+ 0xd6, 0xc3, 0x90, 0x26, 0x83, 0x7c, 0x17, 0xfa, 0x44, 0x37, 0xc1, 0x48,
+ 0x32, 0x16, 0x51, 0x52, 0x12, 0xfe, 0x3e, 0xf2, 0xb9, 0x78, 0xbd, 0x93,
+ 0xec, 0x57, 0xf2, 0xa4, 0x44, 0xa8, 0x8a, 0x24, 0x61, 0x87, 0xfa, 0xa9,
+ 0xa5, 0xb9, 0x84, 0xc5, 0x53, 0xe8, 0x82, 0x2c, 0x95, 0x7f, 0x91, 0x78,
+ 0x25, 0x09, 0x63, 0x91, 0x99, 0x4d, 0xb4, 0x57, 0x28, 0x64, 0x67, 0x6b,
+ 0xa5, 0x36, 0xc5, 0x53, 0x38, 0xbf, 0x7b, 0xde, 0xa7, 0xc7, 0x55, 0x79,
+ 0x92, 0x1f, 0xbe, 0xc4, 0x0f, 0x07, 0xdd, 0x89, 0x0e, 0x6c, 0x4d, 0xa9,
+ 0x9f, 0x63, 0xbd, 0x8c, 0x8b, 0x62, 0x42, 0x7c, 0xc2, 0xd4, 0x6d, 0xad,
+ 0x85, 0x7b, 0x9f, 0x3a, 0x1e, 0x64, 0x64, 0xa6, 0x33, 0x67, 0x89, 0xd9,
+ 0x4b, 0xdd, 0xc9, 0x4d, 0x51, 0x14, 0xd7, 0xf3, 0x28, 0x3e, 0xeb, 0x86,
+ 0xdf, 0x5a, 0x3d, 0x7e, 0x2d, 0xc3, 0x8c, 0x2f, 0x39, 0xaf, 0xb9, 0x67,
+ 0xc9, 0x8f, 0x72, 0xa6, 0xf3, 0x7f, 0x9d, 0xcf, 0xfb, 0xfa, 0x26, 0x0b,
+ 0xe1, 0x59, 0x7a, 0x2b, 0x57, 0xe3, 0x73, 0x5a, 0x86, 0xc8, 0x20, 0xb9,
+ 0xdc, 0x96, 0x1f, 0xd8, 0xa1, 0x6d, 0x63, 0x77, 0x8d, 0xa8, 0x2c, 0x8d,
+ 0xe5, 0xfc, 0x82, 0x79, 0xc3, 0xdf, 0x88, 0xa5, 0xc1, 0x28, 0x70, 0xd5,
+ 0xf7, 0x59, 0x28, 0xe4, 0x1d, 0xbd, 0xb0, 0xef, 0x3e, 0xba, 0x7e, 0x6e,
+ 0x3f, 0xac, 0x5a, 0x3f, 0x9d, 0xb3, 0xff, 0x1e, 0xeb, 0xf7, 0xf2, 0x77,
+ 0x5b, 0xbf, 0x97, 0xff, 0x2d, 0xd6, 0xef, 0xe5, 0x3f, 0xbe, 0x7e, 0xcf,
+ 0xbb, 0xeb, 0xf7, 0xf2, 0xbf, 0xcb, 0xfa, 0x69, 0x21, 0x09, 0x5d, 0xbd,
+ 0x2c, 0x58, 0x3f, 0xf2, 0x84, 0xf0, 0x15, 0x02, 0xc2, 0x28, 0x68, 0x43,
+ 0x34, 0xdd, 0xfa, 0x26, 0x07, 0x1e, 0x04, 0x6b, 0xc6, 0x9e, 0x5d, 0x85,
+ 0x3c, 0x22, 0x1f, 0x3d, 0xce, 0xfb, 0x27, 0x15, 0x05, 0x94, 0x40, 0xeb,
+ 0xf8, 0x3c, 0xb1, 0x1d, 0xf0, 0x96, 0xc1, 0x71, 0xef, 0x40, 0xc9, 0x89,
+ 0xba, 0x5c, 0x6b, 0xf2, 0xc3, 0x99, 0x09, 0xe0, 0x64, 0xb3, 0xda, 0x25,
+ 0x02, 0xc6, 0xc8, 0x75, 0xcc, 0xe4, 0xed, 0xbf, 0xa6, 0xf9, 0xea, 0xf3,
+ 0xe3, 0x5f, 0x44, 0xf3, 0x7f, 0x50, 0xaf, 0xcb, 0x75, 0x29, 0xe6, 0x66,
+ 0xf7, 0xa6, 0xee, 0xc9, 0xcb, 0xb6, 0xac, 0x90, 0x81, 0x2e, 0xe1, 0xb8,
+ 0xff, 0xd8, 0x92, 0xbd, 0x85, 0x66, 0xb0, 0x98, 0xcd, 0x25, 0x2f, 0xf0,
+ 0x91, 0xbc, 0x28, 0xe8, 0x9f, 0x5b, 0xc9, 0xf7, 0xc8, 0x7a, 0x62, 0xcf,
+ 0xaa, 0xe4, 0x0a, 0xd8, 0x62, 0xb3, 0x0a, 0xc4, 0xd6, 0xb0, 0xc5, 0x12,
+ 0x56, 0x9f, 0x28, 0xc1, 0xca, 0x65, 0xdb, 0x5b, 0xc0, 0xa0, 0x76, 0x5b,
+ 0xbd, 0x35, 0x2b, 0x7c, 0x0d, 0x49, 0x30, 0xd1, 0xbc, 0x91, 0xe4, 0xa3,
+ 0x51, 0x1a, 0x42, 0xba, 0x16, 0x39, 0x51, 0x82, 0x3a, 0xcd, 0xf4, 0x58,
+ 0xe6, 0x75, 0xd3, 0xd4, 0x40, 0xb2, 0x25, 0xbc, 0xda, 0xa7, 0xda, 0x7b,
+ 0x30, 0x96, 0xc4, 0xa0, 0xc4, 0xaa, 0xca, 0xc0, 0x2e, 0x94, 0x5c, 0x74,
+ 0x4b, 0x36, 0x52, 0xdc, 0x29, 0x70, 0x1e, 0x15, 0xcf, 0x7d, 0x6a, 0xee,
+ 0xfe, 0x28, 0xcc, 0x80, 0x51, 0x18, 0x27, 0x8f, 0xf8, 0x5f, 0xb0, 0x7f,
+ 0x97, 0x80, 0xb8, 0x59, 0x87, 0xf0, 0xed, 0xd0, 0x60, 0xcd, 0x7d, 0x88,
+ 0xf8, 0x60, 0x6d, 0x15, 0x7c, 0x93, 0x71, 0x81, 0x37, 0x99, 0x9f, 0x85,
+ 0x68, 0x79, 0xcd, 0xd8, 0x21, 0xcc, 0xc0, 0x23, 0x33, 0x38, 0x41, 0xb1,
+ 0x05, 0x34, 0xe7, 0xc8, 0x75, 0x95, 0xd9, 0x5a, 0x17, 0xb6, 0x90, 0x05,
+ 0x43, 0x90, 0x88, 0xd9, 0x6c, 0xc2, 0x8c, 0x16, 0xff, 0xc4, 0xac, 0x3f,
+ 0x0f, 0xd5, 0xe9, 0x8b, 0xa4, 0xec, 0x9a, 0x63, 0xa1, 0xab, 0x10, 0x84,
+ 0x1d, 0x62, 0x1f, 0x2e, 0x40, 0x66, 0xa9, 0x7d, 0xe0, 0x92, 0x29, 0x9a,
+ 0xaa, 0x9c, 0x3f, 0x24, 0x5f, 0xa7, 0x34, 0x2c, 0xa8, 0x85, 0x69, 0x36,
+ 0x0b, 0x72, 0x3e, 0xb8, 0x2a, 0x99, 0x68, 0x69, 0x5c, 0xa1, 0x4c, 0x47,
+ 0x08, 0xbd, 0x92, 0xa7, 0x25, 0xa1, 0x72, 0xe2, 0x13, 0xf2, 0xe7, 0x69,
+ 0xee, 0x18, 0x60, 0x93, 0xc3, 0xe1, 0x49, 0xa8, 0x4c, 0x2b, 0x9d, 0xfa,
+ 0xca, 0x1c, 0x5f, 0xb4, 0xd6, 0x6f, 0x9f, 0x28, 0x33, 0x72, 0x6e, 0xfc,
+ 0x75, 0xf4, 0x30, 0xcb, 0xb8, 0xb3, 0xa9, 0xe6, 0x82, 0x0b, 0x11, 0x75,
+ 0x32, 0xae, 0x1e, 0xe6, 0x64, 0xa0, 0xf1, 0xcb, 0x72, 0xf6, 0xa8, 0x7f,
+ 0x4c, 0xca, 0xb7, 0x32, 0x8d, 0xf0, 0x03, 0x22, 0x64, 0xf2, 0x2a, 0x04,
+ 0x31, 0x05, 0x33, 0xcd, 0x74, 0x51, 0x70, 0x55, 0x05, 0x33, 0xc9, 0xac,
+ 0x09, 0x58, 0x03, 0x5c, 0x85, 0x87, 0x80, 0x1a, 0x0b, 0x25, 0x1b, 0x3a,
+ 0xd4, 0xbc, 0x70, 0xeb, 0x20, 0xd3, 0x92, 0xe8, 0x5f, 0xe1, 0xd1, 0xde,
+ 0xd2, 0x8b, 0x41, 0xde, 0xe8, 0x54, 0x99, 0x54, 0x11, 0x6c, 0x99, 0x5b,
+ 0x53, 0xca, 0x98, 0x2e, 0x02, 0xca, 0x02, 0x0e, 0x79, 0xef, 0xee, 0xec,
+ 0x3c, 0xca, 0x45, 0x21, 0xee, 0xdf, 0x95, 0x94, 0x14, 0x24, 0xa3, 0xd8,
+ 0xc7, 0x6c, 0x93, 0x44, 0xd3, 0x5c, 0x12, 0x0e, 0xba, 0xec, 0x3d, 0xe6,
+ 0x93, 0x96, 0x1a, 0xc2, 0x1d, 0x41, 0x96, 0x75, 0x4c, 0xd9, 0x02, 0x62,
+ 0x0a, 0x23, 0xc2, 0x8e, 0xd0, 0xc7, 0x7a, 0xbf, 0xf5, 0x4e, 0xb4, 0xf4,
+ 0x1a, 0x75, 0x88, 0x5e, 0x12, 0xed, 0x65, 0x90, 0x7c, 0xf5, 0xe0, 0x0c,
+ 0x27, 0xaf, 0x7c, 0x38, 0x7a, 0xc5, 0xae, 0x56, 0x29, 0xfc, 0xbb, 0x8a,
+ 0x00, 0x24, 0xce, 0x37, 0xf1, 0x2f, 0x2c, 0x58, 0xd0, 0xac, 0x11, 0x40,
+ 0xf3, 0x1a, 0xad, 0x22, 0x41, 0x3e, 0xee, 0x31, 0xb0, 0xa3, 0x35, 0xb7,
+ 0x57, 0x97, 0xda, 0xdd, 0x63, 0x69, 0xe7, 0x4b, 0x65, 0x25, 0xbf, 0x66,
+ 0x9b, 0x3d, 0xa4, 0x8d, 0xca, 0xfb, 0xac, 0xad, 0x96, 0x50, 0xa6, 0x62,
+ 0x1f, 0xf9, 0x88, 0xdd, 0x2c, 0x6c, 0x4a, 0x61, 0x44, 0xc5, 0xe5, 0x4f,
+ 0x8c, 0xd2, 0x70, 0x26, 0x30, 0xb1, 0xd6, 0x30, 0x0c, 0x42, 0x73, 0x25,
+ 0x3a, 0xa4, 0x88, 0xbe, 0x60, 0x55, 0x0a, 0x58, 0x3d, 0xe9, 0x7e, 0xb2,
+ 0x54, 0x90, 0x1a, 0xa5, 0xb6, 0x34, 0x1b, 0xd3, 0x11, 0xc6, 0xa4, 0xa0,
+ 0xba, 0xbb, 0x26, 0x5f, 0x22, 0x5c, 0x0c, 0x55, 0x82, 0x75, 0x8f, 0x0f,
+ 0x17, 0x27, 0xbd, 0x44, 0xaa, 0xf6, 0x11, 0xe0, 0xd3, 0xac, 0x74, 0x5c,
+ 0x37, 0x72, 0x04, 0x3e, 0xcc, 0xd7, 0xc6, 0x63, 0xa9, 0x1d, 0xf1, 0x10,
+ 0x89, 0x6d, 0x38, 0x3f, 0x4d, 0x93, 0xb5, 0x22, 0x64, 0x42, 0x97, 0x14,
+ 0x2b, 0x6d, 0x24, 0x98, 0xe9, 0xc1, 0x0d, 0xa4, 0x12, 0xc2, 0x7d, 0xa8,
+ 0x9d, 0xb6, 0x5c, 0x3f, 0x9a, 0xb6, 0xcf, 0xc9, 0xa0, 0xe4, 0xac, 0x88,
+ 0xa4, 0x94, 0x4a, 0x28, 0x92, 0x68, 0xc2, 0x12, 0x2c, 0x0f, 0x72, 0x4a,
+ 0x17, 0x95, 0x17, 0x90, 0x5c, 0xbf, 0xc9, 0xcd, 0xba, 0x16, 0xeb, 0xb8,
+ 0x4f, 0xeb, 0xc5, 0x88, 0xe9, 0xed, 0x1a, 0x7c, 0x38, 0x06, 0x0f, 0x26,
+ 0x7c, 0x9d, 0xf3, 0x8e, 0xc5, 0x4b, 0xf2, 0xb5, 0x40, 0xb0, 0xbd, 0xa4,
+ 0x75, 0x28, 0x54, 0xe1, 0xe4, 0xae, 0xb9, 0x7c, 0xd6, 0x28, 0x87, 0x38,
+ 0xef, 0x14, 0x97, 0x4c, 0x43, 0xa7, 0x1f, 0x35, 0x01, 0x7a, 0x3e, 0x2f,
+ 0xb7, 0xf3, 0xf6, 0xf9, 0xb5, 0xc0, 0x69, 0xa2, 0xe3, 0xea, 0x4a, 0x65,
+ 0xb3, 0xec, 0x23, 0x3c, 0x95, 0x82, 0x75, 0x4a, 0x1f, 0x90, 0x35, 0x60,
+ 0x3f, 0x8d, 0x1d, 0x1e, 0x90, 0x0d, 0x11, 0xf1, 0x56, 0x09, 0xdd, 0x51,
+ 0xf6, 0x32, 0xf1, 0xb8, 0x8d, 0xab, 0x7c, 0xde, 0x70, 0xf8, 0x37, 0x28,
+ 0xd8, 0x1c, 0x57, 0xc3, 0xae, 0xa7, 0xe5, 0x28, 0xe5, 0x73, 0x62, 0xc1,
+ 0x1e, 0xea, 0x76, 0x6a, 0x91, 0x60, 0xa2, 0x08, 0xad, 0xd9, 0x9e, 0x91,
+ 0x44, 0x1d, 0x33, 0xe4, 0xfe, 0x3e, 0x2a, 0x29, 0x52, 0x3c, 0x6a, 0xd5,
+ 0x07, 0xed, 0x27, 0x98, 0x6a, 0xaa, 0x7f, 0xd5, 0x93, 0x13, 0xac, 0x19,
+ 0x8f, 0xc0, 0xca, 0xd4, 0xde, 0xb9, 0x0a, 0x54, 0x21, 0x64, 0x26, 0x4f,
+ 0x16, 0x59, 0x1b, 0x3a, 0xb3, 0x21, 0xd1, 0x3a, 0x29, 0xa6, 0x01, 0xf8,
+ 0x86, 0xad, 0xda, 0x2c, 0x51, 0xb1, 0x28, 0x2c, 0x84, 0x48, 0x27, 0x6d,
+ 0x5d, 0x63, 0xad, 0x2e, 0x5a, 0xd0, 0xcd, 0xe4, 0x3a, 0xa7, 0x88, 0x44,
+ 0x6f, 0xae, 0x98, 0x0d, 0xbe, 0x0a, 0x0a, 0x64, 0x5e, 0xb1, 0x9e, 0x06,
+ 0x9c, 0x27, 0xaf, 0xc9, 0x8a, 0x99, 0xf1, 0x6b, 0x8d, 0xee, 0xb5, 0xa4,
+ 0x9a, 0xfd, 0x74, 0xfc, 0x8a, 0x82, 0x68, 0xe3, 0x52, 0xd2, 0x66, 0x16,
+ 0x37, 0xa9, 0x3e, 0x2d, 0x67, 0xaf, 0xa4, 0x88, 0xff, 0x82, 0x87, 0x4d,
+ 0x29, 0x63, 0x59, 0x1a, 0xc4, 0x33, 0x6b, 0xe8, 0xa4, 0x48, 0xc5, 0x5c,
+ 0x14, 0x08, 0xc5, 0x9a, 0x43, 0x0b, 0x15, 0xc7, 0xad, 0x6e, 0xa8, 0xac,
+ 0x19, 0x7b, 0xbf, 0x9c, 0x64, 0xe9, 0x34, 0x46, 0xdd, 0x4c, 0x1d, 0x26,
+ 0x6f, 0x23, 0x0b, 0x37, 0xa2, 0x01, 0x2d, 0xc4, 0x6f, 0x2d, 0xb8, 0x53,
+ 0x86, 0x5d, 0x15, 0x92, 0xd5, 0xa9, 0x3d, 0xc4, 0xa9, 0x8a, 0x51, 0xf3,
+ 0x64, 0xd3, 0xfc, 0x4e, 0xf8, 0x15, 0x94, 0x38, 0x57, 0xa2, 0x4e, 0x0e,
+ 0x42, 0x0f, 0xfd, 0xff, 0xfd, 0x89, 0x7d, 0x00, 0x3b, 0x00, 0x18, 0xe1,
+ 0x6e, 0x73, 0xe2, 0x88, 0xe3, 0xbc, 0x2e, 0x2e, 0xe4, 0x2d, 0x50, 0x76,
+ 0xea, 0x18, 0xc3, 0x0d, 0x48, 0x4c, 0x6e, 0xc9, 0x39, 0x44, 0xb8, 0x5b,
+ 0x24, 0xc7, 0x3c, 0x5c, 0xe9, 0xbb, 0x4c, 0xa1, 0x22, 0xb0, 0x2f, 0x78,
+ 0x01, 0x1a, 0x9b, 0xee, 0xc6, 0x45, 0xdf, 0x21, 0x67, 0x58, 0xc8, 0xec,
+ 0xed, 0x2d, 0x29, 0x26, 0x22, 0xb5, 0x04, 0x65, 0x8f, 0xe1, 0xb0, 0xd7,
+ 0xe9, 0x95, 0x2d, 0xf3, 0x29, 0x02, 0xbc, 0x1c, 0x9b, 0x29, 0xe4, 0x12,
+ 0xc4, 0xf8, 0x59, 0x11, 0xc9, 0x49, 0x61, 0x71, 0x4d, 0x52, 0xd2, 0x5e,
+ 0xbb, 0x74, 0x10, 0x14, 0x3e, 0x59, 0x4f, 0xf3, 0xb9, 0xf5, 0x71, 0xf6,
+ 0x88, 0x5c, 0x88, 0x61, 0x1c, 0x14, 0xa0, 0xbd, 0x0f, 0x19, 0xf4, 0x3a,
+ 0x25, 0x0f, 0x85, 0x6c, 0x71, 0x4a, 0xea, 0xff, 0x66, 0xa7, 0xfd, 0xe7,
+ 0x3b, 0xbb, 0xe8, 0xee, 0xf3, 0x9d, 0xcf, 0xb6, 0xda, 0x77, 0xf3, 0xb4,
+ 0xce, 0xfa, 0xc0, 0xf1, 0xc4, 0x75, 0x54, 0xae, 0x96, 0xe1, 0xfc, 0x3c,
+ 0xd0, 0x47, 0xe9, 0x25, 0x01, 0xff, 0x4c, 0x16, 0x95, 0x22, 0xe2, 0xa8,
+ 0x80, 0x0a, 0xd9, 0x8c, 0xf5, 0x0d, 0x71, 0x7c, 0x05, 0x77, 0xbd, 0x7b,
+ 0x07, 0xc6, 0x14, 0x5c, 0xe8, 0x3c, 0x53, 0x66, 0xf7, 0xd0, 0xbb, 0xb6,
+ 0xf0, 0x86, 0x4c, 0x06, 0x83, 0x8b, 0xc8, 0x62, 0x0c, 0xf9, 0x56, 0x7d,
+ 0x06, 0x23, 0x4e, 0x42, 0xe0, 0x28, 0x4a, 0xbb, 0x14, 0x97, 0x95, 0x3c,
+ 0xef, 0xf2, 0x22, 0xaf, 0x6f, 0x50, 0xc2, 0xab, 0xae, 0xd3, 0xeb, 0x2c,
+ 0x4c, 0x53, 0x35, 0x22, 0xc9, 0x18, 0x4e, 0x52, 0x74, 0x17, 0x7c, 0xc7,
+ 0x84, 0xc5, 0xe1, 0xf3, 0x20, 0x30, 0x7e, 0x29, 0xf3, 0xb1, 0x40, 0xa0,
+ 0xc2, 0x0e, 0x73, 0x49, 0xc1, 0x5c, 0x57, 0x7c, 0x66, 0x59, 0xed, 0x19,
+ 0x2a, 0x88, 0x00, 0xe2, 0x19, 0xa6, 0xaa, 0x67, 0xae, 0xfa, 0x00, 0xb1,
+ 0x47, 0x7e, 0x84, 0x4d, 0x5a, 0xdc, 0xb3, 0xa1, 0x11, 0x42, 0x3b, 0x84,
+ 0x85, 0x9a, 0xa6, 0x20, 0x6a, 0x35, 0x7f, 0x33, 0x3f, 0xfb, 0xc1, 0x68,
+ 0xa4, 0x83, 0x57, 0xf6, 0xc7, 0x5b, 0x4f, 0x2b, 0x56, 0xb3, 0xd7, 0xd1,
+ 0xd0, 0x08, 0x9e, 0x28, 0xee, 0x6c, 0x18, 0x2c, 0x6f, 0xf8, 0x1f, 0xcb,
+ 0x72, 0x27, 0x86, 0x8e, 0x43, 0x34, 0xf1, 0xb1, 0x3b, 0x7e, 0x6a, 0x0d,
+ 0xca, 0xf5, 0x00, 0xd1, 0x27, 0x0d, 0x87, 0xe1, 0x05, 0xc5, 0xbd, 0x4e,
+ 0xda, 0xac, 0xbe, 0x50, 0xe3, 0xa6, 0x54, 0x97, 0x80, 0x76, 0xfe, 0x20,
+ 0x39, 0x91, 0x92, 0xd0, 0x1b, 0x5f, 0x6e, 0x60, 0xc2, 0x36, 0x5e, 0x33,
+ 0x61, 0x6d, 0xe0, 0x1f, 0x03, 0xe9, 0xb1, 0x12, 0x7c, 0xe3, 0xca, 0xdf,
+ 0xf8, 0x33, 0xc1, 0x33, 0xdf, 0x6c, 0x24, 0xda, 0x09, 0x99, 0x7b, 0xee,
+ 0x98, 0x44, 0x55, 0x15, 0x2c, 0x15, 0xd4, 0x2a, 0x06, 0xa7, 0x55, 0x1b,
+ 0xbd, 0xc1, 0xc5, 0xe0, 0x88, 0xe1, 0x57, 0x91, 0x9b, 0x3a, 0x76, 0x4d,
+ 0x3e, 0xac, 0xb2, 0x0d, 0x48, 0xbd, 0xb0, 0x10, 0x2a, 0xd1, 0x5f, 0x48,
+ 0xd1, 0x3c, 0xad, 0x76, 0x62, 0x27, 0x87, 0x3b, 0x04, 0x57, 0xd7, 0x78,
+ 0x9c, 0x93, 0xde, 0x82, 0x53, 0x6f, 0x7e, 0x79, 0x7d, 0x9d, 0xc5, 0xa8,
+ 0x42, 0x69, 0x32, 0xcc, 0xa2, 0xd3, 0x5c, 0x5c, 0x65, 0x69, 0x03, 0x6d,
+ 0x83, 0x6e, 0xf9, 0xe5, 0x58, 0x52, 0xa7, 0xbd, 0x47, 0x9e, 0xf1, 0x16,
+ 0xf1, 0xb5, 0x8f, 0xd8, 0x5f, 0x95, 0x1a, 0x34, 0x25, 0xd4, 0xb4, 0x98,
+ 0x49, 0x8b, 0x29, 0x2a, 0x13, 0x08, 0x30, 0xb7, 0x6f, 0x66, 0x0a, 0x6d,
+ 0x31, 0x31, 0xf3, 0x98, 0x51, 0x8f, 0x84, 0x0c, 0xe9, 0x9a, 0x4c, 0xe4,
+ 0xfc, 0x54, 0xea, 0x75, 0x09, 0x8d, 0x33, 0x66, 0xb7, 0x0d, 0xda, 0x15,
+ 0xa5, 0x43, 0x2d, 0x3a, 0xe0, 0x8e, 0x23, 0x09, 0x5e, 0x0e, 0x9d, 0x0b,
+ 0x76, 0x2c, 0x82, 0xe7, 0x5e, 0x52, 0x0d, 0x00, 0x31, 0x07, 0x8c, 0x3c,
+ 0xd9, 0xc6, 0x56, 0x67, 0x50, 0xba, 0x99, 0xe9, 0xb2, 0x62, 0x9c, 0x39,
+ 0xed, 0xe3, 0x8b, 0x77, 0x87, 0x5d, 0x9e, 0xd0, 0x67, 0x9f, 0x7f, 0x6e,
+ 0x83, 0x49, 0x99, 0x40, 0x8e, 0x6c, 0x09, 0x66, 0x58, 0xd3, 0x8c, 0x83,
+ 0x63, 0x50, 0xa1, 0xb9, 0x82, 0x81, 0xa0, 0xe5, 0x38, 0x76, 0x64, 0xc9,
+ 0x64, 0x4e, 0x37, 0x12, 0x8d, 0x42, 0x8d, 0x32, 0x9b, 0x68, 0xcc, 0xf5,
+ 0x14, 0x1c, 0xb5, 0xb1, 0x7a, 0x40, 0x04, 0x33, 0x6a, 0x2e, 0xd1, 0x2f,
+ 0x03, 0x54, 0xc6, 0xb5, 0xc0, 0x6a, 0x91, 0x30, 0x78, 0x9d, 0x35, 0x61,
+ 0xaa, 0x84, 0x87, 0x59, 0x6c, 0x7d, 0x62, 0x39, 0x4b, 0x8a, 0x00, 0x92,
+ 0x24, 0xd1, 0xe3, 0xb5, 0xf0, 0xe9, 0x4a, 0x99, 0xdd, 0x71, 0x66, 0xb9,
+ 0xbb, 0xbf, 0xc4, 0x29, 0x7b, 0x6d, 0x69, 0x61, 0xe2, 0x85, 0x7a, 0xbf,
+ 0x54, 0x16, 0x1e, 0xc1, 0x4d, 0x82, 0x12, 0xa6, 0x69, 0x8c, 0x92, 0xea,
+ 0xe4, 0x20, 0x40, 0xaa, 0x96, 0xfd, 0x43, 0x0b, 0x3e, 0x07, 0xd1, 0xf8,
+ 0x5c, 0x22, 0xf8, 0xaf, 0x6d, 0x8b, 0xc2, 0x44, 0x4f, 0x20, 0x61, 0xea,
+ 0x0b, 0x66, 0x01, 0x5f, 0xb0, 0x6c, 0xcc, 0x0d, 0x90, 0x5c, 0x51, 0xc9,
+ 0x43, 0x12, 0xca, 0xbd, 0xef, 0xcd, 0x53, 0x84, 0xaf, 0x01, 0x44, 0x9d,
+ 0xfb, 0xe2, 0x9e, 0xa7, 0xe8, 0x24, 0x2a, 0xa9, 0xcd, 0x84, 0xf7, 0x29,
+ 0xb5, 0xe0, 0x76, 0xbe, 0xcd, 0x36, 0xe6, 0x55, 0x49, 0x0d, 0x6d, 0x88,
+ 0x0a, 0x1a, 0x9b, 0x67, 0x9b, 0x2f, 0x55, 0x91, 0xe3, 0x88, 0x7a, 0x60,
+ 0x89, 0xae, 0x48, 0xe2, 0x57, 0xc6, 0x8a, 0x1f, 0xfc, 0x75, 0x7e, 0xed,
+ 0x98, 0xb6, 0x41, 0x0d, 0x6f, 0xd4, 0x97, 0xb0, 0x96, 0x03, 0xce, 0x44,
+ 0xff, 0x5d, 0x22, 0x5f, 0x7d, 0xf3, 0x65, 0xab, 0x01, 0xe5, 0x6d, 0xf6,
+ 0x69, 0x49, 0x05, 0x4c, 0x39, 0xbe, 0xce, 0x23, 0x99, 0x68, 0x92, 0x41,
+ 0xcf, 0x7b, 0xc8, 0x21, 0x68, 0xfd, 0x50, 0x80, 0xee, 0x27, 0xc4, 0xbc,
+ 0x5d, 0xe4, 0x7a, 0x9a, 0xc5, 0xc8, 0x0c, 0xed, 0xf9, 0xb9, 0x26, 0xc3,
+ 0x02, 0x36, 0x0a, 0x52, 0xe9, 0x75, 0xff, 0x90, 0x8f, 0xb3, 0xa9, 0x16,
+ 0x63, 0x52, 0x46, 0x3f, 0x14, 0xe6, 0xd7, 0xcd, 0x82, 0x22, 0x3d, 0x74,
+ 0x65, 0x36, 0x91, 0xf4, 0x4d, 0xae, 0x5b, 0x26, 0xfe, 0xf5, 0x4a, 0x2e,
+ 0x86, 0x36, 0x93, 0x77, 0xaa, 0x77, 0x4a, 0x3e, 0x07, 0x69, 0xbd, 0xda,
+ 0x59, 0xbd, 0x10, 0x4d, 0xe0, 0xca, 0xd8, 0x50, 0x0b, 0x0b, 0x30, 0xec,
+ 0xfe, 0x3d, 0x53, 0x5d, 0x42, 0x80, 0x45, 0x6c, 0xe2, 0x41, 0x1b, 0x09,
+ 0x2f, 0xd5, 0xbf, 0xd8, 0x02, 0xf6, 0x1c, 0x36, 0x6a, 0xbc, 0xa8, 0x18,
+ 0x53, 0x36, 0xb4, 0x05, 0x11, 0x6d, 0x21, 0x9a, 0x37, 0x2d, 0x11, 0xd8,
+ 0x15, 0x11, 0x7c, 0x5d, 0xf5, 0xd8, 0xbf, 0x2d, 0x29, 0xad, 0x2e, 0x31,
+ 0x71, 0xf9, 0xea, 0xaf, 0xdf, 0x67, 0xa3, 0x37, 0x5f, 0x92, 0xd9, 0xfb,
+ 0x09, 0x34, 0xb6, 0x7c, 0xef, 0xd1, 0x0e, 0xdf, 0x06, 0xab, 0x6d, 0xe2,
+ 0x6d, 0x80, 0x6e, 0x23, 0xe6, 0x74, 0x2c, 0x6d, 0xd6, 0xc3, 0x84, 0x7b,
+ 0x4d, 0x5e, 0x95, 0xe5, 0xca, 0x16, 0xd5, 0xac, 0xc3, 0x9c, 0x78, 0x60,
+ 0x13, 0x86, 0x60, 0xb8, 0x7c, 0x17, 0xde, 0xfa, 0xd8, 0x52, 0x22, 0xf4,
+ 0x78, 0x6f, 0xc6, 0x52, 0x10, 0x51, 0x45, 0x94, 0xd5, 0x77, 0x8d, 0x91,
+ 0xbc, 0xe9, 0x31, 0xe4, 0x3a, 0x4a, 0x5c, 0xee, 0xc6, 0xc0, 0xc7, 0x02,
+ 0xec, 0x06, 0xf4, 0xd7, 0x3f, 0xdb, 0xd7, 0xe9, 0x3f, 0xe6, 0x54, 0x81,
+ 0x85, 0x72, 0xc5, 0x68, 0x08, 0xb5, 0xa5, 0xef, 0x6c, 0x73, 0x85, 0x4e,
+ 0x2d, 0x86, 0xb4, 0xd1, 0xe3, 0x5b, 0xf8, 0xcf, 0x1b, 0xf0, 0xf1, 0x28,
+ 0x14, 0x00, 0x35, 0x03, 0x60, 0x5b, 0x4e, 0xca, 0x45, 0xf7, 0x54, 0x10,
+ 0x5a, 0x86, 0x8b, 0x0a, 0xa0, 0xf7, 0x4b, 0x3a, 0x4e, 0x3d, 0xd7, 0xae,
+ 0xff, 0xb4, 0x6e, 0x3b, 0xff, 0xd3, 0xba, 0xeb, 0xfe, 0x4f, 0xeb, 0x6e,
+ 0x00, 0x3f, 0xad, 0xaf, 0x83, 0xbe, 0x36, 0x0d, 0x02, 0x6a, 0xbf, 0x7c,
+ 0xd1, 0x37, 0xf8, 0xab, 0xee, 0xa3, 0xde, 0x37, 0xbd, 0x4f, 0xae, 0x6f,
+ 0xac, 0x9a, 0x34, 0xdf, 0x75, 0x0c, 0xe4, 0x72, 0x77, 0x0e, 0x8d, 0x4c,
+ 0x68, 0x4d, 0x93, 0x9b, 0x96, 0x5e, 0x44, 0x7b, 0xf2, 0x1f, 0xa0, 0x19,
+ 0x77, 0x05, 0x12, 0x3c, 0xee, 0x5f, 0xcb, 0x1e, 0xa5, 0xeb, 0xa0, 0x75,
+ 0xa9, 0x82, 0x62, 0x65, 0xf6, 0xf5, 0xa8, 0x96, 0x74, 0xb5, 0xa8, 0xb8,
+ 0x22, 0x1e, 0x0f, 0x8f, 0xbd, 0x35, 0x8a, 0x85, 0x91, 0x6f, 0xbd, 0x3f,
+ 0x38, 0xfd, 0x70, 0x70, 0xf2, 0x74, 0x22, 0xd1, 0x16, 0x67, 0xf3, 0xca,
+ 0xd7, 0x3c, 0xf0, 0x6b, 0x27, 0xaf, 0xeb, 0x71, 0x54, 0x3c, 0x81, 0x8f,
+ 0x48, 0xad, 0x21, 0x3f, 0x57, 0x3c, 0xad, 0x8b, 0x03, 0x88, 0x62, 0xe5,
+ 0x7b, 0x01, 0xa8, 0xb4, 0x16, 0x0a, 0xf3, 0x75, 0x7d, 0x9f, 0x5e, 0x5f,
+ 0x97, 0x00, 0xaa, 0x45, 0x1c, 0x47, 0x52, 0xe0, 0x2d, 0x48, 0xda, 0x3a,
+ 0x90, 0xb5, 0xd4, 0x8b, 0x20, 0xbc, 0x38, 0x5f, 0x4c, 0x88, 0x7f, 0xca,
+ 0xab, 0x2b, 0x2f, 0x30, 0xd7, 0x35, 0x51, 0x0e, 0x0f, 0x97, 0x43, 0x37,
+ 0x7f, 0x4f, 0xc2, 0x86, 0x4e, 0x20, 0x1d, 0xd3, 0x48, 0xe5, 0xe3, 0x09,
+ 0xa7, 0x7d, 0x97, 0x11, 0x29, 0x2d, 0x66, 0xe0, 0xb5, 0xf4, 0x2d, 0x3e,
+ 0xab, 0x9c, 0x7d, 0xe4, 0xd9, 0xe4, 0xc4, 0x95, 0xa0, 0x0a, 0x15, 0x51,
+ 0xd6, 0x63, 0xba, 0xce, 0x0f, 0x8c, 0xdd, 0xa7, 0xa8, 0x62, 0xf1, 0x57,
+ 0x06, 0x00, 0x59, 0x38, 0x16, 0x50, 0xc3, 0x54, 0x26, 0x23, 0xb1, 0x75,
+ 0x15, 0x24, 0x28, 0xa5, 0x5a, 0xeb, 0xe5, 0x62, 0x66, 0x0e, 0x86, 0x51,
+ 0xc9, 0x26, 0x64, 0x76, 0xac, 0xae, 0x04, 0xe9, 0x1c, 0x3a, 0x25, 0xfe,
+ 0x8b, 0x02, 0x95, 0x5a, 0x07, 0x32, 0x52, 0x23, 0xb1, 0x17, 0xbd, 0xa3,
+ 0xd6, 0x87, 0xc7, 0x97, 0x47, 0xc9, 0xc1, 0x87, 0xcb, 0x6f, 0xd6, 0x79,
+ 0x82, 0xbb, 0xd9, 0x14, 0xc8, 0xe2, 0xa1, 0x7a, 0x08, 0x77, 0xc2, 0xd5,
+ 0x48, 0x73, 0xc7, 0xda, 0x2c, 0x5d, 0xd0, 0x11, 0x23, 0xd0, 0xfb, 0xe6,
+ 0x60, 0xc5, 0x2a, 0xbd, 0x18, 0xbc, 0xe8, 0xae, 0xd2, 0x72, 0xc6, 0x1c,
+ 0x70, 0xa8, 0x80, 0x84, 0x65, 0x4b, 0xe7, 0x4e, 0x76, 0xbc, 0x70, 0xb3,
+ 0x90, 0x0f, 0x78, 0xdb, 0xd1, 0x2a, 0xc2, 0xc0, 0x48, 0xa5, 0x20, 0x5b,
+ 0x98, 0x14, 0x6d, 0x33, 0xc4, 0xad, 0x5d, 0x0f, 0xf6, 0x18, 0x9b, 0x41,
+ 0x26, 0x2a, 0xa0, 0x94, 0x0b, 0x2e, 0x26, 0x54, 0x2a, 0x5d, 0xd1, 0x85,
+ 0x91, 0x04, 0x0a, 0x0d, 0x59, 0x10, 0x53, 0xab, 0xd9, 0x02, 0x4a, 0xd4,
+ 0xd8, 0x42, 0x7d, 0xba, 0xd2, 0x50, 0xaa, 0x7c, 0x39, 0xf8, 0x68, 0x9c,
+ 0xcf, 0x67, 0x96, 0x33, 0x43, 0x87, 0x47, 0x4c, 0xb3, 0x32, 0x88, 0x13,
+ 0xa7, 0xa0, 0xa1, 0x79, 0x15, 0x97, 0xd7, 0x6b, 0xfe, 0x33, 0xbe, 0xdf,
+ 0x49, 0xb3, 0xa9, 0x4a, 0x29, 0x5d, 0x2b, 0x2f, 0x70, 0x28, 0x8a, 0xf1,
+ 0x1e, 0xc8, 0x07, 0x84, 0x46, 0x49, 0xcc, 0xfc, 0x7c, 0xc1, 0x33, 0x9b,
+ 0x59, 0xc8, 0xc6, 0xbb, 0x49, 0xbe, 0x26, 0x9e, 0x44, 0x36, 0x39, 0xa4,
+ 0xbd, 0x08, 0x94, 0x27, 0xe0, 0x1b, 0x88, 0x65, 0x6c, 0x79, 0xa7, 0x37,
+ 0x54, 0x0d, 0x20, 0x8c, 0xc7, 0xf7, 0x93, 0x78, 0x52, 0x0b, 0x86, 0x00,
+ 0x5d, 0xd3, 0x82, 0x86, 0x0e, 0xbf, 0x7f, 0xeb, 0x11, 0x70, 0xaa, 0x9f,
+ 0x5d, 0x43, 0xd5, 0x9c, 0x43, 0xbc, 0x8c, 0x35, 0xc0, 0x4b, 0x7a, 0x36,
+ 0x1b, 0x6e, 0x00, 0xb2, 0xf5, 0x49, 0x96, 0xcd, 0x2d, 0xbd, 0x52, 0x0e,
+ 0xa4, 0x49, 0x5e, 0xc3, 0xe1, 0x20, 0xd4, 0x56, 0xb3, 0xf0, 0x06, 0x74,
+ 0xcc, 0x81, 0x90, 0x1c, 0x2e, 0xbf, 0x85, 0x18, 0x85, 0x8d, 0xed, 0x9a,
+ 0xec, 0x7e, 0xf6, 0xec, 0xf3, 0xa4, 0xa6, 0x0c, 0x83, 0xbc, 0x43, 0xab,
+ 0xc2, 0x74, 0x24, 0xcb, 0x73, 0xb7, 0xa5, 0x70, 0xaa, 0x46, 0x29, 0x05,
+ 0x96, 0x9f, 0xd4, 0x94, 0x07, 0x85, 0x8b, 0x54, 0x40, 0xb2, 0x61, 0x56,
+ 0x93, 0x99, 0x44, 0xd5, 0x57, 0x30, 0x63, 0xc0, 0xee, 0xd2, 0x6c, 0xb1,
+ 0x9b, 0x7b, 0xe0, 0xed, 0xe1, 0x49, 0x09, 0x8a, 0xe5, 0x5e, 0x72, 0x71,
+ 0x74, 0x79, 0xd1, 0x4b, 0x86, 0x97, 0x67, 0x17, 0x4b, 0x12, 0xee, 0x1b,
+ 0x4e, 0xf7, 0xa0, 0x39, 0x53, 0x7f, 0x9b, 0x94, 0x49, 0xf4, 0xa5, 0x0c,
+ 0x02, 0xba, 0x2c, 0x78, 0xea, 0x68, 0xf2, 0xa6, 0x97, 0xc3, 0xe9, 0xcd,
+ 0x16, 0xb6, 0x8d, 0xb9, 0x1f, 0x56, 0x0e, 0x8c, 0x97, 0xfd, 0x09, 0x3b,
+ 0x84, 0xf6, 0x22, 0x0d, 0xd7, 0x8a, 0x79, 0xf4, 0xd6, 0x98, 0x0a, 0x64,
+ 0x86, 0x3a, 0x26, 0x2d, 0xad, 0xe6, 0xb2, 0x84, 0x68, 0x81, 0xa3, 0x8b,
+ 0xb5, 0x8b, 0x80, 0x9a, 0x2d, 0xb7, 0xae, 0x70, 0xf2, 0x75, 0xd4, 0x47,
+ 0xbd, 0xcd, 0xbc, 0xd4, 0xe9, 0x47, 0xf6, 0x6f, 0x5a, 0x93, 0x87, 0xdc,
+ 0x2b, 0x84, 0x5d, 0x97, 0xb3, 0x8c, 0x8d, 0x11, 0x04, 0x19, 0x55, 0x3e,
+ 0xd5, 0x89, 0xe5, 0x1b, 0x89, 0xe5, 0x55, 0xd8, 0xb4, 0x50, 0x5a, 0xe5,
+ 0x0d, 0x8b, 0x4c, 0xd7, 0x4a, 0x65, 0xbc, 0x2e, 0x46, 0xdf, 0x9a, 0x36,
+ 0xc8, 0xb7, 0xdd, 0xd0, 0x5e, 0x79, 0xf9, 0xa2, 0x6d, 0xe1, 0xbd, 0xdb,
+ 0x15, 0x32, 0x04, 0xee, 0x8f, 0x4a, 0x16, 0xf2, 0xb8, 0x29, 0x44, 0x1b,
+ 0x7e, 0x62, 0x25, 0xae, 0x87, 0x2a, 0xe1, 0x53, 0xeb, 0x9f, 0x2b, 0x30,
+ 0x5f, 0xdc, 0x10, 0x81, 0x28, 0x80, 0x18, 0x98, 0xba, 0xf2, 0xb4, 0xba,
+ 0xe6, 0x0c, 0xb5, 0x5f, 0x74, 0xa5, 0x6e, 0x07, 0x29, 0xdf, 0x55, 0x9a,
+ 0x45, 0x35, 0xf3, 0xb9, 0xd6, 0xbb, 0x59, 0x0d, 0x2b, 0xd8, 0x80, 0x7f,
+ 0xe3, 0x5c, 0x2c, 0x2a, 0x15, 0x23, 0xf9, 0x09, 0xa0, 0x2e, 0x28, 0xe0,
+ 0x78, 0x9a, 0xd8, 0x99, 0xa3, 0xec, 0x3c, 0xb2, 0xa3, 0x71, 0x6f, 0x4d,
+ 0x4a, 0x84, 0x8b, 0x68, 0xd0, 0x61, 0x22, 0x37, 0xf4, 0x65, 0xe0, 0xab,
+ 0xf4, 0xa6, 0x91, 0xc6, 0xc4, 0xa3, 0x54, 0xa1, 0x02, 0x43, 0x67, 0xa4,
+ 0xc8, 0x16, 0x08, 0x06, 0x7a, 0xee, 0x2f, 0x1b, 0x4b, 0x34, 0x18, 0x01,
+ 0x4e, 0x10, 0x34, 0x0c, 0xda, 0x67, 0x64, 0xbe, 0x46, 0x57, 0x25, 0x3d,
+ 0xa2, 0x88, 0x82, 0xbe, 0x38, 0x35, 0x42, 0x6b, 0x47, 0xb5, 0x52, 0x0e,
+ 0x74, 0x26, 0x07, 0x2b, 0x12, 0x56, 0xfd, 0x0c, 0x85, 0xd6, 0x96, 0x6c,
+ 0x97, 0x6c, 0x6f, 0x8f, 0x6e, 0x29, 0xfa, 0x95, 0x15, 0x8a, 0x0b, 0x5a,
+ 0xb8, 0xda, 0xf2, 0xca, 0xea, 0xee, 0xe2, 0xf2, 0x7d, 0xe6, 0xcc, 0x6f,
+ 0x13, 0xde, 0x86, 0x52, 0xb1, 0x13, 0x73, 0x43, 0x6a, 0x5c, 0x6d, 0x49,
+ 0xfd, 0x12, 0xab, 0x27, 0x9a, 0xa6, 0x5b, 0x94, 0xb6, 0x3e, 0x83, 0x35,
+ 0x0a, 0x17, 0x73, 0xf2, 0x01, 0xe6, 0x76, 0x90, 0xc4, 0x42, 0xfa, 0x4c,
+ 0x40, 0xd3, 0x20, 0x66, 0xd3, 0xd6, 0xc8, 0xb4, 0x64, 0x81, 0x12, 0x1c,
+ 0xba, 0xaa, 0xd8, 0x1b, 0xcb, 0x6b, 0xff, 0x29, 0xb7, 0x24, 0xd4, 0x7c,
+ 0x94, 0x12, 0x67, 0x3f, 0x5c, 0xeb, 0x6c, 0xc2, 0x72, 0x68, 0x7f, 0xcc,
+ 0x18, 0xea, 0x8b, 0x79, 0x78, 0xcf, 0x1f, 0x9f, 0xbb, 0x26, 0x85, 0xc5,
+ 0x85, 0xa6, 0x1a, 0xe5, 0xb7, 0x1a, 0xbf, 0x93, 0x4d, 0x39, 0x70, 0x0b,
+ 0xe0, 0xae, 0xfe, 0xee, 0x69, 0x84, 0x22, 0x10, 0xdc, 0xee, 0xcb, 0xd0,
+ 0xf0, 0xfa, 0xeb, 0x81, 0x11, 0xae, 0x46, 0xb9, 0xd8, 0x59, 0xf7, 0x0b,
+ 0xb9, 0xb1, 0xef, 0xcd, 0xbe, 0x4a, 0xba, 0x74, 0xab, 0xb7, 0xe1, 0x99,
+ 0x51, 0xc7, 0xa4, 0x57, 0x58, 0x7a, 0x93, 0x4a, 0x37, 0x71, 0x65, 0xe2,
+ 0xb5, 0x70, 0xe8, 0xd2, 0xd6, 0x8a, 0x5e, 0xed, 0xbe, 0xda, 0x1b, 0xec,
+ 0xbe, 0xfc, 0x7c, 0xb0, 0xbb, 0x33, 0xd8, 0x5d, 0xef, 0xd4, 0x1a, 0x97,
+ 0x12, 0x0c, 0x5e, 0x3b, 0x91, 0x62, 0x1a, 0xc9, 0x72, 0x92, 0x16, 0x7c,
+ 0x60, 0xf6, 0x30, 0xa0, 0xc7, 0x06, 0x4c, 0xeb, 0x19, 0x7c, 0x62, 0x66,
+ 0x94, 0x1a, 0xaa, 0xf6, 0xd7, 0x45, 0x4a, 0xea, 0x45, 0xea, 0xb8, 0x5d,
+ 0xe6, 0x39, 0xed, 0x22, 0x65, 0x4e, 0x70, 0x9d, 0xb2, 0x55, 0x4b, 0x94,
+ 0x62, 0x71, 0x11, 0x96, 0x77, 0x75, 0x71, 0x78, 0xeb, 0xaf, 0x26, 0x2d,
+ 0xd2, 0x49, 0x75, 0xfb, 0xfd, 0x7f, 0xc0, 0xe2, 0x53, 0x09, 0xf9, 0x36,
+ 0x77, 0x21, 0x35, 0x5b, 0x3d, 0x3c, 0xb1, 0x69, 0x60, 0xc8, 0x15, 0xec,
+ 0xa6, 0x9b, 0x49, 0xf6, 0x10, 0x0b, 0xbf, 0x4e, 0xc6, 0x96, 0x77, 0xc5,
+ 0x1c, 0x79, 0xe9, 0xa1, 0xbe, 0x7b, 0x14, 0x6d, 0xaa, 0x7f, 0xaf, 0x9b,
+ 0x11, 0x28, 0xaf, 0xe1, 0xba, 0x62, 0xf9, 0xac, 0xcd, 0xd1, 0x6b, 0x7f,
+ 0xfa, 0x93, 0x93, 0x47, 0x5c, 0x83, 0x88, 0xd9, 0x04, 0x5f, 0xf4, 0x84,
+ 0x70, 0x81, 0x3d, 0x8d, 0x4c, 0xf7, 0x96, 0xac, 0xef, 0xff, 0x08, 0xaf,
+ 0xe4, 0xcf, 0xfd, 0x1f, 0xcd, 0xbf, 0x7f, 0x5e, 0xb7, 0x70, 0x49, 0x4e,
+ 0xf1, 0x64, 0x1d, 0x79, 0xad, 0x7d, 0x94, 0x7b, 0xed, 0x72, 0x15, 0xd0,
+ 0x0a, 0x2e, 0x0f, 0xcf, 0xf9, 0x20, 0x56, 0xec, 0x9d, 0xc3, 0x48, 0x49,
+ 0x10, 0x41, 0xad, 0x27, 0x09, 0xce, 0x64, 0x0f, 0x66, 0xa7, 0xd8, 0xb9,
+ 0x54, 0xd6, 0x5f, 0x36, 0x2b, 0xf1, 0x62, 0xcf, 0xf1, 0x21, 0x90, 0xe2,
+ 0xc8, 0x15, 0xa1, 0x8d, 0x96, 0x7b, 0x4d, 0xae, 0x14, 0x46, 0x67, 0x1b,
+ 0xf1, 0xab, 0x2a, 0x35, 0xff, 0x40, 0x9b, 0xa3, 0x74, 0xd1, 0x9a, 0x3c,
+ 0xb2, 0xf7, 0xa6, 0x6b, 0x3d, 0x21, 0x36, 0x61, 0x90, 0x87, 0x16, 0x12,
+ 0x37, 0xd3, 0x51, 0x65, 0xa9, 0x32, 0xbb, 0x54, 0x79, 0x7d, 0x4b, 0x23,
+ 0x14, 0xc4, 0x12, 0x54, 0x36, 0x77, 0xe2, 0x39, 0xac, 0x50, 0x31, 0x89,
+ 0xa4, 0x64, 0x40, 0x59, 0x18, 0xa2, 0x37, 0xc5, 0xee, 0x92, 0xd0, 0xc5,
+ 0x57, 0x98, 0x7f, 0x34, 0x8b, 0x53, 0x1e, 0xab, 0xb2, 0x78, 0x72, 0xb1,
+ 0x9f, 0x12, 0xa1, 0x79, 0x4c, 0x69, 0x72, 0x6e, 0xf4, 0x5d, 0xbb, 0x4d,
+ 0xbc, 0x5c, 0xbf, 0x64, 0x93, 0x7e, 0x40, 0x97, 0xe0, 0x56, 0xf7, 0xf2,
+ 0x22, 0xae, 0xcc, 0x34, 0xf7, 0xdd, 0x33, 0x66, 0xdd, 0xe8, 0xc4, 0x12,
+ 0x0a, 0xa4, 0x32, 0x7d, 0x98, 0xf4, 0x6c, 0x72, 0x81, 0xc2, 0xa9, 0x08,
+ 0x6d, 0xa0, 0x8a, 0xdd, 0x5a, 0xd4, 0x64, 0x10, 0x9c, 0xab, 0xd3, 0x4a,
+ 0x81, 0x09, 0x35, 0xab, 0x61, 0x27, 0x9e, 0xfe, 0x84, 0xdc, 0x26, 0xa4,
+ 0xd1, 0x7d, 0x81, 0xea, 0x29, 0xa1, 0x5d, 0x83, 0xce, 0xcf, 0x62, 0xec,
+ 0x2b, 0xde, 0xdd, 0xba, 0xb7, 0x13, 0x7a, 0x54, 0xa8, 0x24, 0x0c, 0x26,
+ 0xb9, 0x9f, 0xcf, 0x1f, 0xcf, 0xce, 0xd6, 0xac, 0x51, 0x5a, 0xcb, 0x96,
+ 0x80, 0xb1, 0x17, 0x4d, 0xbd, 0xb8, 0xbe, 0x46, 0x7e, 0x48, 0xd0, 0x45,
+ 0xc2, 0x5f, 0x3a, 0x84, 0x85, 0xd0, 0xd5, 0x19, 0x99, 0x8e, 0xae, 0xeb,
+ 0x74, 0x38, 0x94, 0xa7, 0x88, 0x1e, 0x47, 0xfa, 0xb3, 0x14, 0x08, 0x4c,
+ 0x80, 0x19, 0x3e, 0xe8, 0x7e, 0xdd, 0xe6, 0x3e, 0xc4, 0x89, 0xc7, 0x6a,
+ 0xd4, 0xba, 0x3a, 0x82, 0x38, 0x86, 0x27, 0x1b, 0xeb, 0x15, 0x62, 0x70,
+ 0xb0, 0xb2, 0x22, 0x1c, 0x39, 0xdb, 0x88, 0xac, 0x93, 0xb3, 0xd3, 0xf2,
+ 0x2b, 0x49, 0x0b, 0xe7, 0xbc, 0xde, 0xca, 0xe6, 0x49, 0xfa, 0x69, 0x1c,
+ 0x61, 0xf5, 0x71, 0x9a, 0x8f, 0x55, 0x0e, 0x02, 0x27, 0x12, 0x7d, 0xb5,
+ 0xe9, 0xf9, 0x60, 0x2f, 0x58, 0x5a, 0x2a, 0x1b, 0x3e, 0x1e, 0xf7, 0xa1,
+ 0x10, 0xbc, 0x66, 0x3d, 0x65, 0x5b, 0xb4, 0x84, 0xb8, 0x06, 0x35, 0xcc,
+ 0x64, 0xbe, 0x0f, 0x0f, 0x0f, 0x45, 0xa1, 0xb9, 0xbc, 0xe9, 0x68, 0x16,
+ 0x36, 0x81, 0x51, 0xd4, 0xaa, 0x28, 0x3c, 0xac, 0xbe, 0x59, 0x34, 0x13,
+ 0x54, 0x4a, 0x21, 0xa9, 0xa1, 0x72, 0xd8, 0x62, 0x7e, 0x3b, 0x44, 0x13,
+ 0xa5, 0x59, 0x0e, 0x4e, 0x56, 0xd7, 0xc6, 0x03, 0x50, 0xe4, 0x9c, 0x09,
+ 0x2e, 0xf1, 0xa2, 0xb4, 0xdd, 0x2d, 0xc5, 0xc0, 0x7d, 0xf5, 0x73, 0x41,
+ 0xb5, 0x87, 0x75, 0xc4, 0xbb, 0x65, 0x5b, 0xc1, 0x67, 0xd3, 0xbc, 0xa9,
+ 0xa5, 0xa8, 0x29, 0x7f, 0xab, 0xdb, 0xf6, 0x23, 0xeb, 0x21, 0x53, 0xdd,
+ 0x5e, 0x92, 0x97, 0x4b, 0x97, 0x24, 0x2e, 0xa9, 0xc8, 0xc0, 0xc2, 0xcc,
+ 0x27, 0x9b, 0x87, 0xe0, 0xa9, 0x20, 0x3e, 0x2a, 0x9c, 0x8a, 0xc3, 0x1b,
+ 0x0a, 0x3a, 0x4d, 0xcd, 0x02, 0x99, 0x5e, 0xd7, 0x90, 0x03, 0x4c, 0x04,
+ 0x3f, 0x3c, 0xd9, 0xbe, 0x3c, 0xe9, 0x26, 0x6f, 0x51, 0x95, 0x90, 0x4a,
+ 0x7c, 0xc4, 0x6d, 0xcf, 0x27, 0x4f, 0x91, 0x5f, 0x48, 0xd8, 0xee, 0x70,
+ 0xfe, 0x42, 0x34, 0xf9, 0x67, 0x51, 0x28, 0xa8, 0xc7, 0xf9, 0x6e, 0x8b,
+ 0xac, 0x00, 0x2a, 0x3e, 0x9b, 0x88, 0x72, 0x0c, 0x74, 0x77, 0x9d, 0x9c,
+ 0x1e, 0x5c, 0x12, 0x52, 0xa7, 0x91, 0x6c, 0x97, 0xab, 0x32, 0x80, 0x60,
+ 0x2a, 0xd1, 0x88, 0xa5, 0x66, 0x48, 0xc7, 0x8e, 0xec, 0x52, 0x55, 0x76,
+ 0x5e, 0xbe, 0x5a, 0x77, 0xde, 0xaa, 0xe9, 0x37, 0x53, 0x2a, 0xf7, 0x43,
+ 0x77, 0xcf, 0x77, 0x57, 0x63, 0x37, 0xba, 0x1a, 0x3c, 0x01, 0xd1, 0x15,
+ 0xb9, 0x10, 0x69, 0x2e, 0xd3, 0x6c, 0xb7, 0x2e, 0x9c, 0x98, 0xd3, 0xf2,
+ 0x3a, 0x07, 0x52, 0x96, 0x97, 0x0a, 0x62, 0xdc, 0x16, 0x89, 0xea, 0xca,
+ 0x60, 0x9e, 0x1c, 0xc2, 0x94, 0xe3, 0x5e, 0x6c, 0x63, 0xc4, 0xf8, 0x90,
+ 0xd0, 0x5d, 0x61, 0x27, 0x55, 0x58, 0xce, 0x14, 0xce, 0x19, 0xa9, 0xbe,
+ 0x6b, 0x64, 0x4c, 0x3e, 0x36, 0x96, 0xc2, 0xf8, 0x61, 0xc0, 0x98, 0xed,
+ 0xba, 0x1d, 0x1a, 0xcd, 0x5b, 0x59, 0xde, 0xd6, 0x53, 0x4a, 0x61, 0xda,
+ 0x28, 0x9c, 0x49, 0xc6, 0xb8, 0xd2, 0x21, 0xff, 0xb2, 0x75, 0x7d, 0x7c,
+ 0x4d, 0xa6, 0xd9, 0x75, 0x70, 0xed, 0xb2, 0x57, 0x97, 0x44, 0x5c, 0xaf,
+ 0x4b, 0xad, 0xeb, 0xe8, 0x24, 0xc9, 0x47, 0xc4, 0xf4, 0xb5, 0x9d, 0xa2,
+ 0x11, 0x93, 0x5e, 0x94, 0x6c, 0xad, 0xd7, 0xe5, 0x2f, 0xab, 0x42, 0x8a,
+ 0xa3, 0x56, 0x8a, 0x9c, 0xcd, 0x70, 0xea, 0x34, 0xf7, 0xb5, 0xb9, 0xf7,
+ 0x2d, 0x39, 0x5e, 0x27, 0x93, 0xae, 0x45, 0x9c, 0xc7, 0x35, 0xba, 0x28,
+ 0xe2, 0x74, 0x4f, 0x65, 0x21, 0xee, 0xe3, 0xd6, 0x0e, 0x2b, 0xb4, 0x97,
+ 0x8e, 0x6a, 0x8b, 0x8f, 0x87, 0xf2, 0x11, 0xaa, 0xc8, 0xa2, 0xca, 0xa7,
+ 0x42, 0xb9, 0xbd, 0xf1, 0xef, 0x1b, 0x8e, 0xfd, 0x75, 0xb0, 0x24, 0xf1,
+ 0x3c, 0xc6, 0x48, 0x83, 0x48, 0x93, 0x84, 0x9a, 0x34, 0xdd, 0x1c, 0x3d,
+ 0x16, 0x36, 0xc7, 0x08, 0x83, 0x9e, 0x8e, 0x6f, 0x75, 0x8f, 0xbe, 0x39,
+ 0x3a, 0x78, 0x6b, 0x13, 0x23, 0x7e, 0x01, 0x3f, 0x72, 0x57, 0xe5, 0x87,
+ 0x9b, 0xc4, 0x25, 0x0b, 0xa0, 0xea, 0x6e, 0xbd, 0x64, 0xbe, 0xd8, 0xed,
+ 0x37, 0xca, 0x98, 0xe3, 0x6f, 0x21, 0x1e, 0x93, 0x14, 0xcb, 0xa3, 0x5b,
+ 0x15, 0x1b, 0xc5, 0xe8, 0x6b, 0x54, 0x6f, 0x14, 0x6c, 0xc6, 0x4b, 0xb9,
+ 0xee, 0x96, 0x3a, 0x49, 0x3c, 0x87, 0xb3, 0xfa, 0xae, 0x49, 0x6b, 0x66,
+ 0xbc, 0x98, 0xb7, 0x95, 0xaf, 0xb1, 0x95, 0xa7, 0xe5, 0xa8, 0xbc, 0xba,
+ 0x5a, 0x11, 0x04, 0x64, 0xc6, 0x01, 0x60, 0xba, 0x78, 0xc7, 0xac, 0xd3,
+ 0x34, 0xd2, 0x7b, 0x23, 0x14, 0xa7, 0x4e, 0x2b, 0x73, 0xdc, 0xd6, 0x07,
+ 0x7c, 0x04, 0xa4, 0x50, 0x57, 0xa4, 0x9c, 0xb7, 0x8d, 0x25, 0x3c, 0x48,
+ 0x44, 0x5e, 0xcd, 0x3d, 0x24, 0x1a, 0xb0, 0x63, 0x86, 0x63, 0xd9, 0x1e,
+ 0x6d, 0x9b, 0x99, 0xf5, 0xff, 0xfc, 0xaf, 0x1f, 0x7f, 0x8e, 0x90, 0xd7,
+ 0x81, 0xe0, 0xf9, 0x86, 0x61, 0x92, 0xe6, 0xf9, 0x99, 0x24, 0xa2, 0x59,
+ 0x8e, 0x31, 0x57, 0x30, 0x8f, 0x54, 0xb0, 0x6c, 0x7a, 0x35, 0x70, 0x14,
+ 0xac, 0xe1, 0xc5, 0x58, 0xbb, 0x0f, 0x82, 0x3a, 0x9b, 0x70, 0xed, 0x8c,
+ 0x45, 0x26, 0x36, 0x28, 0x70, 0xc0, 0x3a, 0x10, 0x8f, 0xe5, 0x8a, 0x91,
+ 0x95, 0x08, 0x32, 0xe2, 0x1c, 0x51, 0xab, 0x85, 0x75, 0xd9, 0x0d, 0x78,
+ 0x6c, 0x7d, 0x9e, 0xde, 0x4a, 0xd8, 0x68, 0x6a, 0x34, 0xd3, 0x92, 0x04,
+ 0x2f, 0xd5, 0x93, 0xde, 0x4a, 0xde, 0xa1, 0xb2, 0xb0, 0x9f, 0x9d, 0x48,
+ 0xdb, 0xef, 0x5f, 0x70, 0xe4, 0x6d, 0xce, 0xa8, 0x60, 0xf0, 0xa2, 0x35,
+ 0x46, 0xf8, 0x62, 0xc5, 0xde, 0x67, 0x37, 0x03, 0x56, 0x86, 0x51, 0xf4,
+ 0x25, 0x00, 0x4b, 0x5a, 0xf0, 0x40, 0x3d, 0xef, 0x92, 0x49, 0x44, 0x89,
+ 0x0a, 0x21, 0x87, 0x39, 0xa3, 0xa8, 0x07, 0xbe, 0xf8, 0x03, 0xd3, 0x8e,
+ 0x8b, 0x6e, 0x51, 0xbf, 0x05, 0xa3, 0xc3, 0xae, 0x6a, 0xae, 0xe7, 0x55,
+ 0x47, 0x73, 0x28, 0x08, 0x43, 0x4e, 0xa0, 0x17, 0xe4, 0x38, 0x90, 0x19,
+ 0xcd, 0xb5, 0x54, 0xe4, 0x1a, 0x46, 0x8a, 0x15, 0x8d, 0xd7, 0x9b, 0x38,
+ 0xaf, 0x8e, 0x65, 0xf2, 0x9a, 0xff, 0xdc, 0xfe, 0x32, 0x9a, 0xde, 0xc7,
+ 0x60, 0xc1, 0x23, 0x10, 0xca, 0xcb, 0x0b, 0x66, 0xc4, 0x5a, 0x62, 0x44,
+ 0x36, 0x9d, 0x8a, 0x41, 0xe8, 0xe3, 0x82, 0xf6, 0x8d, 0x0a, 0x54, 0x0a,
+ 0x77, 0xa6, 0x2e, 0x4a, 0xf4, 0x17, 0x21, 0x86, 0xd4, 0x2d, 0x4d, 0x84,
+ 0x6a, 0xae, 0x40, 0x65, 0xe6, 0x7d, 0xb4, 0x8e, 0x32, 0xb0, 0xb2, 0x61,
+ 0x29, 0x84, 0xf5, 0x7c, 0xba, 0xa9, 0xc0, 0x67, 0x6a, 0xe6, 0xac, 0x6e,
+ 0x8c, 0x4a, 0xa6, 0x1d, 0xa6, 0xc7, 0x6e, 0x04, 0xe5, 0x04, 0xf5, 0x9e,
+ 0x99, 0xb7, 0xea, 0x88, 0x37, 0xca, 0xe5, 0x9a, 0x38, 0xc7, 0x33, 0x88,
+ 0xdc, 0xd9, 0x5a, 0xd0, 0xa8, 0x58, 0x8f, 0x8b, 0xa5, 0x13, 0xd7, 0x52,
+ 0xc5, 0xf9, 0xcc, 0xe1, 0xe9, 0x95, 0xaf, 0xfb, 0x11, 0xec, 0xee, 0x25,
+ 0x62, 0xbf, 0x51, 0xda, 0xcc, 0x14, 0x51, 0x8d, 0x42, 0xf1, 0x45, 0x73,
+ 0xc7, 0x0e, 0x1c, 0x54, 0xda, 0x21, 0x60, 0xe9, 0xf8, 0x36, 0xa7, 0xeb,
+ 0xba, 0x6e, 0x16, 0x10, 0x31, 0x69, 0xe1, 0xf7, 0xd2, 0x92, 0xd9, 0x4c,
+ 0x4a, 0xcc, 0x74, 0x5c, 0x1a, 0xd2, 0x91, 0x25, 0x25, 0x96, 0x12, 0xe4,
+ 0xb5, 0x37, 0x3c, 0x1a, 0x7b, 0x56, 0xac, 0xd8, 0xa0, 0x72, 0x86, 0xcc,
+ 0xa5, 0x13, 0xa1, 0xed, 0xc8, 0x50, 0x8e, 0x00, 0x36, 0xe8, 0xbd, 0x24,
+ 0xf1, 0x51, 0x15, 0x2d, 0xc8, 0xea, 0x81, 0x51, 0x8e, 0x66, 0x25, 0x8a,
+ 0xa8, 0xba, 0x21, 0xcb, 0xf4, 0x18, 0x69, 0x73, 0x9d, 0xdf, 0x45, 0x03,
+ 0x80, 0xda, 0x31, 0x44, 0x0f, 0xb5, 0x17, 0x0a, 0x6c, 0x43, 0x1c, 0x92,
+ 0x73, 0x41, 0xe1, 0x2b, 0x41, 0xb5, 0x08, 0xbb, 0x7c, 0xc1, 0x09, 0x9e,
+ 0x92, 0x08, 0x25, 0xbc, 0x58, 0xb1, 0x6f, 0xb6, 0x7f, 0xb2, 0xfe, 0x4d,
+ 0x59, 0x37, 0xfb, 0xeb, 0x96, 0x34, 0x46, 0xe2, 0xf5, 0x59, 0x67, 0xe7,
+ 0x48, 0x41, 0x85, 0x7e, 0x94, 0xe6, 0x94, 0x2f, 0x12, 0x23, 0xd8, 0xe4,
+ 0x61, 0x85, 0xac, 0x70, 0x02, 0x97, 0x4b, 0x91, 0x27, 0x74, 0xe1, 0x2c,
+ 0x97, 0x2e, 0x50, 0x02, 0xc1, 0x4d, 0x08, 0x63, 0xa3, 0x2e, 0xfd, 0xd0,
+ 0x3f, 0xc4, 0xc7, 0xfb, 0xdf, 0xa0, 0xbd, 0x3f, 0xaf, 0x5b, 0x17, 0x44,
+ 0xf7, 0x57, 0xfb, 0x61, 0x29, 0x37, 0x3f, 0x05, 0x8b, 0x77, 0x49, 0xbd,
+ 0xa8, 0x14, 0xbe, 0x83, 0x50, 0xa7, 0xf4, 0x12, 0xc9, 0x95, 0x93, 0xc9,
+ 0xb6, 0x5d, 0x74, 0x46, 0x75, 0x2c, 0xe3, 0xc4, 0x9f, 0x57, 0x14, 0xdb,
+ 0xa2, 0x1a, 0x98, 0xfd, 0xf2, 0xaa, 0x8f, 0xba, 0x37, 0xb3, 0xb4, 0xba,
+ 0xa5, 0x40, 0xb9, 0x77, 0xea, 0x00, 0xbe, 0x07, 0x35, 0xca, 0x64, 0x12,
+ 0xbb, 0x2a, 0x52, 0x8e, 0xcb, 0x57, 0xd6, 0x92, 0x90, 0xce, 0xc8, 0x62,
+ 0xee, 0x8b, 0xab, 0x08, 0xaf, 0x5b, 0x4a, 0x4d, 0xca, 0x7b, 0x5b, 0xc9,
+ 0xc0, 0xd9, 0xe3, 0xeb, 0x04, 0x83, 0x86, 0x3e, 0x31, 0x63, 0xf7, 0x02,
+ 0x1c, 0x22, 0x8b, 0x39, 0x34, 0x5f, 0x4a, 0x52, 0x0f, 0xec, 0x01, 0x72,
+ 0xb9, 0x09, 0x94, 0xfc, 0xb3, 0xc1, 0x8b, 0x17, 0xdd, 0xca, 0xe0, 0x74,
+ 0xcb, 0x36, 0x50, 0x3c, 0x0b, 0x17, 0xbd, 0x46, 0xec, 0xee, 0xcb, 0x65,
+ 0x18, 0xc9, 0x84, 0x2b, 0xa5, 0xf5, 0xec, 0xf5, 0x90, 0x81, 0x23, 0x86,
+ 0x86, 0x2d, 0x43, 0xb5, 0x21, 0x67, 0xae, 0x1d, 0x54, 0x38, 0x40, 0x68,
+ 0x2c, 0xaf, 0x5f, 0xc0, 0x04, 0x5f, 0xf6, 0xc3, 0xd2, 0x76, 0x42, 0xae,
+ 0xaa, 0xcd, 0x5a, 0xd0, 0x24, 0xd3, 0xa4, 0x2e, 0xb5, 0x7d, 0xc0, 0x15,
+ 0x74, 0xa0, 0x74, 0x84, 0x7d, 0x33, 0xa9, 0xc2, 0x21, 0xdf, 0xcf, 0x50,
+ 0xed, 0x15, 0xa0, 0x78, 0x4d, 0x96, 0xaf, 0x1f, 0x99, 0xb3, 0x67, 0x9f,
+ 0xd1, 0x9c, 0x59, 0xf6, 0x24, 0x65, 0x09, 0x74, 0x17, 0x04, 0xb6, 0xad,
+ 0x77, 0x96, 0xba, 0x73, 0x46, 0x72, 0x45, 0x8b, 0x60, 0x89, 0x29, 0x8d,
+ 0x26, 0x96, 0x42, 0x77, 0x97, 0x40, 0xdd, 0x70, 0x6c, 0xde, 0x91, 0x0a,
+ 0xd9, 0x3f, 0x35, 0xcb, 0xb0, 0x9f, 0xfc, 0x47, 0x99, 0xad, 0x03, 0x32,
+ 0xdb, 0x41, 0xcc, 0x06, 0x59, 0xa7, 0x07, 0x17, 0xa7, 0xc7, 0xa7, 0x5f,
+ 0xef, 0x7b, 0x75, 0xef, 0x50, 0x2f, 0xd9, 0x11, 0xf2, 0x75, 0x2c, 0x11,
+ 0xb8, 0xa4, 0xe9, 0x11, 0x32, 0x17, 0xa6, 0xd3, 0x25, 0x14, 0x28, 0x49,
+ 0x3f, 0x59, 0x56, 0x07, 0xcd, 0x95, 0x75, 0xe8, 0x29, 0xcf, 0x2c, 0x13,
+ 0x94, 0x35, 0x65, 0xa0, 0x0b, 0x89, 0x0e, 0x7f, 0x02, 0x1d, 0x5e, 0x6b,
+ 0x09, 0x5a, 0x20, 0x7d, 0x61, 0xb4, 0xab, 0xd4, 0x2a, 0xe7, 0x2a, 0x47,
+ 0xa1, 0xc7, 0x01, 0xa0, 0x15, 0x06, 0x3d, 0x81, 0x85, 0xbb, 0x41, 0xa5,
+ 0x0c, 0x5c, 0x13, 0x2d, 0x16, 0x40, 0x66, 0xf2, 0xaa, 0xb1, 0x68, 0x75,
+ 0x0e, 0xf5, 0xd7, 0xcd, 0xc9, 0x12, 0x4d, 0xcd, 0x95, 0x68, 0xd6, 0x12,
+ 0x78, 0x92, 0xfe, 0x27, 0x3f, 0x75, 0x65, 0x24, 0xec, 0x1c, 0xac, 0x76,
+ 0x86, 0xb1, 0x5f, 0x5c, 0xdd, 0xfe, 0x1d, 0xb0, 0x9d, 0x54, 0xee, 0x56,
+ 0x99, 0xb5, 0x5d, 0xe1, 0x36, 0x89, 0x41, 0x42, 0xe8, 0x15, 0xd5, 0x18,
+ 0x9c, 0xba, 0x73, 0xc3, 0xea, 0xce, 0x74, 0x1e, 0x64, 0xb3, 0x12, 0x00,
+ 0x9c, 0x7e, 0x21, 0x73, 0x4b, 0xee, 0x54, 0xa9, 0x22, 0xcc, 0x20, 0xa1,
+ 0x58, 0x2d, 0xdb, 0xda, 0x42, 0xfa, 0xc3, 0x2b, 0x95, 0xd2, 0xa9, 0x32,
+ 0x4e, 0xe8, 0x83, 0xff, 0xcf, 0xda, 0xa5, 0x34, 0xc9, 0xf3, 0xc5, 0x68,
+ 0x36, 0x79, 0x91, 0xbc, 0x36, 0xff, 0x09, 0xf4, 0xac, 0x21, 0x63, 0x9d,
+ 0x0e, 0xc9, 0xb5, 0x83, 0x4a, 0xa5, 0xa9, 0xe6, 0x95, 0x88, 0x76, 0x4f,
+ 0x7f, 0x7d, 0xb6, 0x67, 0x3a, 0xfb, 0x29, 0xd5, 0x0c, 0xf2, 0x89, 0x59,
+ 0xc0, 0xa6, 0x8e, 0x95, 0x11, 0x96, 0x57, 0x1d, 0xe2, 0x86, 0x16, 0x7c,
+ 0x77, 0xef, 0xf3, 0x64, 0x94, 0x37, 0xc9, 0xfb, 0xb7, 0x2f, 0x12, 0x63,
+ 0x98, 0x8c, 0x6f, 0xeb, 0xc5, 0x4c, 0xe5, 0xb1, 0xd6, 0xc3, 0xc2, 0x66,
+ 0xd8, 0xe8, 0x2a, 0x46, 0xa6, 0xe3, 0xd3, 0x7c, 0x9c, 0xdc, 0x66, 0x0f,
+ 0xbd, 0x96, 0xd7, 0xf4, 0x4a, 0xbd, 0xbb, 0xce, 0xe5, 0xe9, 0x6e, 0x0e,
+ 0x44, 0xb3, 0x38, 0xe2, 0x1b, 0xf1, 0xa8, 0x99, 0x39, 0x30, 0x9f, 0xaf,
+ 0xb9, 0x84, 0xc6, 0x4a, 0x3f, 0xc2, 0x67, 0x2d, 0x57, 0xcc, 0x0e, 0x96,
+ 0xd2, 0x9c, 0xef, 0xdd, 0xc1, 0xce, 0x92, 0xc4, 0x16, 0x84, 0x4e, 0xd5,
+ 0x07, 0x4d, 0x3d, 0x84, 0x35, 0x20, 0x35, 0x7e, 0x12, 0xf3, 0x9e, 0xaf,
+ 0x85, 0x29, 0x92, 0x31, 0x56, 0x28, 0xda, 0x6a, 0x43, 0x6c, 0x02, 0x52,
+ 0x29, 0x2a, 0xbf, 0xa9, 0xa7, 0x42, 0x40, 0xa5, 0xbb, 0xbb, 0xe2, 0x78,
+ 0xa2, 0x7f, 0xb5, 0x5c, 0x7d, 0xf2, 0xeb, 0x5f, 0x39, 0x9a, 0xdd, 0x47,
+ 0xce, 0x95, 0xeb, 0x08, 0x26, 0xcf, 0xcd, 0x9e, 0x65, 0x78, 0xe5, 0x0e,
+ 0xb9, 0x49, 0xef, 0x34, 0x17, 0x92, 0x14, 0xe1, 0x05, 0x23, 0xf2, 0xf3,
+ 0xb2, 0xea, 0x93, 0x4e, 0x38, 0xcd, 0x26, 0xc1, 0x15, 0x1d, 0xed, 0x3e,
+ 0xd7, 0x36, 0x14, 0xe7, 0x3e, 0xb9, 0xb0, 0x90, 0x33, 0xc8, 0x89, 0xaa,
+ 0x8e, 0x20, 0x2e, 0x86, 0x58, 0xa4, 0x67, 0xb6, 0xf7, 0x3c, 0x13, 0x16,
+ 0x3f, 0xa0, 0x49, 0x4d, 0x3e, 0xcc, 0xaf, 0xab, 0x14, 0xd1, 0xf4, 0xe3,
+ 0xc6, 0x11, 0xff, 0xa0, 0x77, 0xc9, 0xb2, 0xde, 0xd9, 0xf4, 0x36, 0x1b,
+ 0x87, 0x40, 0x3a, 0x42, 0xad, 0xdf, 0xa9, 0x29, 0xfd, 0x02, 0x5a, 0x25,
+ 0xb3, 0xac, 0xe2, 0xe7, 0x1e, 0x8b, 0x5d, 0x8c, 0x98, 0xc1, 0xbc, 0xc4,
+ 0x19, 0xfc, 0xa5, 0xb6, 0xd2, 0x42, 0x12, 0x12, 0xe5, 0x0c, 0xab, 0x93,
+ 0x4a, 0x7b, 0xeb, 0x28, 0x7f, 0x82, 0xac, 0x57, 0x5e, 0x5c, 0x51, 0x12,
+ 0x3a, 0x49, 0x99, 0x81, 0xcb, 0x2b, 0xba, 0x1c, 0x4f, 0xa6, 0x40, 0xea,
+ 0xca, 0x76, 0x10, 0x22, 0xd1, 0x0d, 0x2e, 0x19, 0x1a, 0x3c, 0x96, 0xc1,
+ 0xd3, 0x36, 0xf7, 0x4e, 0x2f, 0xda, 0x3b, 0xda, 0x6d, 0xfe, 0xe6, 0x6f,
+ 0x25, 0x32, 0xbe, 0x8a, 0x6c, 0xae, 0x5f, 0x75, 0x16, 0xf6, 0x56, 0x39,
+ 0x7e, 0x8d, 0x12, 0x9f, 0x4e, 0xe7, 0xc5, 0x40, 0xbf, 0xf0, 0xa4, 0xf9,
+ 0xe9, 0x2e, 0xb3, 0x25, 0x8c, 0xfa, 0x75, 0xf3, 0xd3, 0x9d, 0x1b, 0x5f,
+ 0x96, 0xf9, 0xf3, 0xd3, 0x5d, 0xcb, 0x95, 0x8c, 0x61, 0xcc, 0x47, 0xa1,
+ 0x85, 0x4a, 0xfa, 0xd3, 0xac, 0xb8, 0x0e, 0x72, 0xc6, 0x01, 0xa4, 0x95,
+ 0xac, 0x76, 0x73, 0x2a, 0xe8, 0x6f, 0xbd, 0xe4, 0x98, 0x89, 0x2c, 0xb8,
+ 0xe4, 0x35, 0xbf, 0x7c, 0x82, 0x97, 0x6d, 0xe9, 0x6b, 0x8b, 0x3f, 0x8b,
+ 0x24, 0x73, 0xe4, 0xe3, 0x05, 0x17, 0x12, 0xa3, 0x75, 0xb0, 0x95, 0x0b,
+ 0x2d, 0xff, 0xd6, 0xa2, 0xc0, 0x85, 0x75, 0x30, 0xa7, 0x3c, 0x31, 0x23,
+ 0xa5, 0x3e, 0xf5, 0xbc, 0x4a, 0xcd, 0x61, 0xbc, 0x86, 0x26, 0x92, 0xea,
+ 0x33, 0x33, 0x4a, 0xa9, 0xd3, 0x1d, 0x6a, 0x98, 0xd3, 0xf3, 0xa6, 0x84,
+ 0xca, 0xab, 0x12, 0xd6, 0x61, 0x92, 0x3d, 0x02, 0x65, 0x5e, 0x07, 0x54,
+ 0x3a, 0xa3, 0x87, 0x26, 0x82, 0x99, 0xa5, 0x71, 0xc3, 0xb9, 0xb2, 0x89,
+ 0x30, 0x33, 0x6d, 0xbc, 0x97, 0x83, 0x9d, 0xad, 0x1e, 0x95, 0x60, 0x98,
+ 0x63, 0x12, 0x08, 0xd4, 0x68, 0xaf, 0x7b, 0x8a, 0x46, 0xe4, 0xd7, 0x64,
+ 0x41, 0x09, 0x58, 0x2e, 0x80, 0x17, 0xba, 0x24, 0x23, 0x0d, 0xb4, 0x4a,
+ 0x72, 0x71, 0x9b, 0x44, 0x28, 0xef, 0x81, 0xa8, 0x12, 0xee, 0x92, 0xae,
+ 0xb7, 0x54, 0x9c, 0x28, 0xb6, 0x0e, 0xb9, 0xc7, 0x5f, 0x63, 0x15, 0x30,
+ 0x8b, 0x18, 0x14, 0x62, 0x26, 0xa9, 0x0c, 0x1e, 0xf1, 0xad, 0x44, 0x5e,
+ 0x1e, 0xc3, 0xde, 0xd6, 0xaf, 0xc0, 0x2c, 0x82, 0xe2, 0x29, 0x52, 0x8f,
+ 0x0c, 0x97, 0x9e, 0xad, 0x89, 0xdc, 0xf5, 0x52, 0x81, 0x2d, 0x85, 0xb5,
+ 0x03, 0x47, 0x0c, 0xd0, 0x3a, 0x70, 0x9a, 0xcc, 0x3f, 0x18, 0xc4, 0x0a,
+ 0xa2, 0xdd, 0xe5, 0xd9, 0x7d, 0xcb, 0x3b, 0x24, 0xdd, 0xea, 0x59, 0x52,
+ 0x2c, 0xb6, 0x49, 0xee, 0x7a, 0x5e, 0x29, 0xfb, 0x25, 0xd8, 0x3b, 0x77,
+ 0x90, 0xfd, 0xa7, 0xbd, 0x69, 0xbe, 0xe5, 0x69, 0xae, 0x63, 0xe0, 0x79,
+ 0x4e, 0x83, 0x77, 0x1c, 0x3e, 0x3d, 0x52, 0xd1, 0xab, 0x87, 0x04, 0x64,
+ 0x4d, 0x4e, 0x71, 0x81, 0x5c, 0x61, 0xb8, 0x56, 0x5e, 0x73, 0x16, 0x7a,
+ 0x1e, 0x43, 0x10, 0xb2, 0x1d, 0x40, 0xdf, 0x19, 0xb4, 0xaf, 0x7c, 0xf1,
+ 0xdc, 0xd8, 0x1a, 0x34, 0x55, 0x39, 0xce, 0xa4, 0x0e, 0xb1, 0xb2, 0xcf,
+ 0x90, 0x6d, 0x10, 0x09, 0xcf, 0xc8, 0x7a, 0x78, 0x6c, 0x55, 0x5e, 0x30,
+ 0xc1, 0x51, 0x88, 0x25, 0x3a, 0xc0, 0x68, 0x59, 0xed, 0xa0, 0x91, 0xd6,
+ 0x30, 0x46, 0x0f, 0x4a, 0xe2, 0x68, 0x1d, 0x03, 0x96, 0xc4, 0x3a, 0xd0,
+ 0xf7, 0x3c, 0x30, 0x7f, 0xe2, 0x32, 0xa5, 0x7c, 0x6f, 0x8b, 0xa5, 0xae,
+ 0x97, 0x0f, 0xd4, 0x1e, 0x31, 0x42, 0x40, 0x12, 0xe4, 0x55, 0xdc, 0xa1,
+ 0x32, 0xa8, 0xe0, 0x59, 0x8b, 0x2e, 0x31, 0x1b, 0xe1, 0x05, 0x74, 0x6d,
+ 0xb3, 0x9d, 0xcb, 0x05, 0xb9, 0xe6, 0x71, 0xfc, 0x25, 0x9d, 0x47, 0x32,
+ 0x78, 0xf6, 0xbb, 0xc6, 0xa0, 0xe6, 0x48, 0xd2, 0xdc, 0x0f, 0x6e, 0xd2,
+ 0x4f, 0x9f, 0x06, 0x75, 0xb6, 0x6d, 0x76, 0x6d, 0xbd, 0x5d, 0xd7, 0x53,
+ 0xfa, 0x68, 0x8d, 0x94, 0xba, 0xe5, 0xd7, 0x03, 0xdb, 0xaf, 0x3a, 0xbf,
+ 0x22, 0x8c, 0xc7, 0x29, 0xbd, 0xda, 0x12, 0xb6, 0x8e, 0x0f, 0x97, 0x49,
+ 0xc1, 0xba, 0xc0, 0x0a, 0xa6, 0x19, 0x20, 0xc7, 0x81, 0x9f, 0x96, 0xc0,
+ 0x92, 0xc1, 0x45, 0xaf, 0x6c, 0x33, 0x1e, 0x7d, 0x0a, 0x11, 0x0b, 0x54,
+ 0xcb, 0x70, 0x70, 0x89, 0x9c, 0x55, 0x1f, 0x46, 0x51, 0x56, 0x0e, 0x30,
+ 0x66, 0x6e, 0x88, 0x42, 0x73, 0x9d, 0x98, 0x79, 0x0f, 0x55, 0x62, 0x22,
+ 0xd5, 0xa8, 0x97, 0x19, 0xd2, 0xde, 0xd0, 0x08, 0x59, 0xb7, 0xbf, 0x6b,
+ 0xe7, 0xf4, 0xfe, 0xfe, 0x7e, 0xb0, 0xca, 0x92, 0xfe, 0xfd, 0x08, 0xe9,
+ 0xda, 0xfc, 0x9d, 0xde, 0x3a, 0x3c, 0xc7, 0x69, 0x9f, 0xdf, 0x3d, 0x5f,
+ 0xa1, 0x80, 0x37, 0x2d, 0x65, 0x81, 0x76, 0xd3, 0xf4, 0x8e, 0x1d, 0xbf,
+ 0x30, 0x27, 0x7d, 0x12, 0x58, 0xd2, 0x8d, 0xc9, 0x7f, 0xd4, 0x8b, 0xa4,
+ 0x46, 0x81, 0x2e, 0xa4, 0xb4, 0x89, 0x64, 0x80, 0xbe, 0x12, 0x01, 0xe9,
+ 0x6a, 0xe2, 0x51, 0xbd, 0xf4, 0xbb, 0x2a, 0xf6, 0x32, 0xd5, 0xbc, 0xff,
+ 0x32, 0x54, 0x9c, 0x88, 0x92, 0xd4, 0x1b, 0xf3, 0x4b, 0x19, 0xf3, 0xcb,
+ 0x7f, 0x68, 0xcc, 0x2f, 0xff, 0x81, 0x31, 0x3f, 0xff, 0xa7, 0x8f, 0xf9,
+ 0xaf, 0x34, 0xe6, 0xbf, 0x2e, 0x8a, 0xdb, 0x7e, 0x4d, 0x85, 0x6b, 0x8d,
+ 0xc1, 0x20, 0x97, 0x55, 0x5c, 0x3f, 0x6c, 0x31, 0x89, 0x91, 0x57, 0xc5,
+ 0x56, 0x23, 0xea, 0xd4, 0x13, 0xe7, 0x5c, 0x0e, 0x0e, 0xaf, 0x34, 0xcb,
+ 0x6b, 0x61, 0xfb, 0xde, 0x54, 0x4a, 0xc8, 0x98, 0xe4, 0xf5, 0x98, 0x54,
+ 0x79, 0xf2, 0x0f, 0xac, 0x4b, 0x8f, 0xb4, 0xe9, 0xf5, 0x81, 0x2b, 0xa2,
+ 0x17, 0x64, 0x2a, 0xd6, 0x46, 0x94, 0x92, 0x1d, 0x09, 0xb6, 0x0a, 0x1b,
+ 0x84, 0x70, 0xdc, 0xff, 0x39, 0xa5, 0xcf, 0x16, 0xe6, 0xba, 0xd4, 0x46,
+ 0x19, 0xf3, 0x4f, 0x2e, 0xb7, 0x10, 0x17, 0x7d, 0xf9, 0x30, 0xa7, 0xe6,
+ 0x12, 0x2d, 0xb6, 0x56, 0xdb, 0x3a, 0x2d, 0xb6, 0x83, 0x49, 0xa7, 0x73,
+ 0xec, 0x68, 0x22, 0x67, 0xe9, 0x46, 0x70, 0x3b, 0x8e, 0xa7, 0x25, 0x1d,
+ 0x57, 0x52, 0x62, 0x56, 0x1c, 0xc5, 0x91, 0xe3, 0xd4, 0x64, 0xe1, 0xd8,
+ 0x21, 0xd9, 0xf4, 0x85, 0xe4, 0x6d, 0x96, 0xcd, 0xd3, 0x29, 0x92, 0xee,
+ 0x28, 0xf4, 0xb4, 0x8c, 0x09, 0xb0, 0x15, 0x2b, 0x55, 0x28, 0x11, 0xde,
+ 0x48, 0x7d, 0xbc, 0x56, 0x22, 0xf9, 0xdd, 0x52, 0x2b, 0x8a, 0x30, 0x74,
+ 0x66, 0x7a, 0x26, 0x01, 0xf9, 0x81, 0x28, 0x63, 0x36, 0xfc, 0x64, 0x7b,
+ 0x41, 0x17, 0xf1, 0x48, 0x32, 0x40, 0xed, 0x27, 0x94, 0x03, 0x21, 0x37,
+ 0x0f, 0xdf, 0xe5, 0x93, 0x45, 0x40, 0x1d, 0xd2, 0x7d, 0x7d, 0x40, 0xd6,
+ 0x65, 0x8b, 0x14, 0x86, 0x97, 0x8f, 0x9e, 0x28, 0xad, 0xb4, 0x47, 0xd9,
+ 0x54, 0x62, 0xd8, 0x0d, 0xb6, 0x14, 0xb1, 0x2f, 0x38, 0x2e, 0xd3, 0xcb,
+ 0xc3, 0xf3, 0x8f, 0xdf, 0x1e, 0x1d, 0x9d, 0x1f, 0xbf, 0x3d, 0x39, 0x92,
+ 0x03, 0x63, 0x7f, 0x74, 0x7a, 0xf9, 0xdd, 0x89, 0x12, 0x61, 0x26, 0x4b,
+ 0x4a, 0xd6, 0x6e, 0x0a, 0xb3, 0x49, 0x72, 0x92, 0x17, 0x8b, 0x4f, 0x3d,
+ 0xf0, 0xfd, 0x15, 0x4d, 0x72, 0x70, 0xfc, 0x83, 0x51, 0xd1, 0xce, 0xfb,
+ 0x1f, 0x7e, 0x08, 0x88, 0x96, 0x3c, 0xcc, 0xd9, 0xd2, 0x2a, 0x14, 0x66,
+ 0x1b, 0xc2, 0x50, 0x72, 0x63, 0xb7, 0xd0, 0xfc, 0xdf, 0x5a, 0xe6, 0x87,
+ 0x48, 0x86, 0xc2, 0x5e, 0x8f, 0x52, 0x3d, 0x59, 0xc8, 0xcc, 0x58, 0x67,
+ 0x83, 0xfc, 0x7a, 0xb9, 0xa3, 0x3c, 0x91, 0x2b, 0x1d, 0x46, 0xed, 0x22,
+ 0x89, 0x66, 0x34, 0x0f, 0xa8, 0xf0, 0x97, 0xbc, 0xa6, 0xff, 0x2e, 0xab,
+ 0x80, 0x9e, 0xdf, 0x91, 0xb2, 0x63, 0x9e, 0x65, 0x8f, 0x3a, 0x3d, 0x3a,
+ 0xb0, 0xac, 0xa6, 0xe2, 0xd4, 0xa7, 0x46, 0x10, 0xf6, 0x43, 0xa3, 0x49,
+ 0xac, 0xc0, 0x36, 0x92, 0x66, 0xe9, 0x37, 0xdc, 0x1e, 0x1a, 0x34, 0xd3,
+ 0x33, 0x48, 0xde, 0x1e, 0x5d, 0xf4, 0xa8, 0xa6, 0x3a, 0x23, 0xd7, 0x8e,
+ 0x4e, 0xbf, 0x66, 0xa2, 0x57, 0xe5, 0xef, 0x44, 0x20, 0x2a, 0x84, 0xb2,
+ 0x79, 0x73, 0x42, 0xf5, 0xd8, 0x29, 0x3c, 0x58, 0xd7, 0x46, 0x15, 0xff,
+ 0x1d, 0x53, 0x6b, 0x79, 0x6c, 0xaf, 0xcd, 0x7f, 0x62, 0x53, 0x65, 0x94,
+ 0xe6, 0x6f, 0x22, 0xd3, 0x25, 0x3a, 0x88, 0x0d, 0x5d, 0x8a, 0xfe, 0x8b,
+ 0xaa, 0xf2, 0x98, 0x31, 0x33, 0x21, 0x61, 0x10, 0x4d, 0x27, 0x08, 0x7e,
+ 0x0e, 0xc4, 0xa1, 0x98, 0x5a, 0x5a, 0x42, 0x20, 0x64, 0xb2, 0x99, 0xcf,
+ 0xf5, 0x68, 0x5f, 0x82, 0x33, 0xc2, 0x4d, 0x46, 0x2c, 0x6f, 0xa2, 0xca,
+ 0x05, 0x58, 0xec, 0x7c, 0xcf, 0x46, 0xb1, 0x9a, 0xe4, 0x13, 0x24, 0x66,
+ 0x99, 0x6f, 0x94, 0x15, 0x85, 0xce, 0x7e, 0xcf, 0x89, 0xab, 0x46, 0xc9,
+ 0xeb, 0xa9, 0x79, 0x71, 0x1a, 0x07, 0x4c, 0x72, 0xc9, 0x2b, 0x57, 0xba,
+ 0xab, 0x43, 0xfe, 0x25, 0xb5, 0x1d, 0x18, 0x21, 0x84, 0x66, 0x38, 0xa4,
+ 0x18, 0x02, 0x89, 0xa0, 0x2b, 0x8a, 0x69, 0x11, 0x64, 0x55, 0x6e, 0x00,
+ 0x63, 0xb6, 0xd1, 0x4b, 0x36, 0x88, 0xe1, 0x8c, 0xfe, 0x44, 0xb1, 0x07,
+ 0x29, 0x6c, 0xb6, 0xd1, 0x0b, 0xab, 0xb6, 0x6c, 0xc8, 0x76, 0xdd, 0x30,
+ 0x3b, 0x9e, 0x5b, 0xa3, 0x25, 0x44, 0xba, 0x8a, 0xf4, 0x43, 0x48, 0x00,
+ 0x6a, 0xe1, 0x90, 0xf5, 0x03, 0xe5, 0x75, 0xc0, 0xc4, 0x65, 0x9b, 0x6b,
+ 0x67, 0xbe, 0x2e, 0xd3, 0xf7, 0x7e, 0x63, 0x59, 0xc2, 0xcb, 0xf0, 0x4b,
+ 0x19, 0xc0, 0x9d, 0x43, 0xa7, 0xd3, 0x9c, 0x2e, 0x96, 0xbf, 0xce, 0xfa,
+ 0x7a, 0x94, 0x10, 0xf9, 0x80, 0xa1, 0xfd, 0xfe, 0x90, 0x28, 0x7a, 0x41,
+ 0x15, 0x2d, 0x09, 0xd2, 0x42, 0x78, 0x34, 0x41, 0x2c, 0xfb, 0x24, 0xa6,
+ 0x72, 0x09, 0x84, 0x51, 0x7f, 0xd6, 0x41, 0x40, 0xba, 0xa3, 0xdd, 0xee,
+ 0xb3, 0x41, 0x71, 0x98, 0x88, 0x81, 0x04, 0x3c, 0xdb, 0x7d, 0x95, 0x37,
+ 0xc4, 0xb9, 0x27, 0x41, 0x21, 0x16, 0x62, 0xf1, 0x1c, 0x68, 0xce, 0x45,
+ 0x31, 0xd3, 0x73, 0x97, 0x4e, 0x85, 0x5d, 0x53, 0x23, 0xf6, 0x95, 0x76,
+ 0xab, 0x2f, 0xf1, 0x0e, 0xb5, 0x61, 0xe8, 0xbd, 0x7f, 0xf9, 0x07, 0x57,
+ 0xce, 0x2b, 0x1b, 0x1c, 0xad, 0xad, 0xf1, 0xe4, 0x54, 0xff, 0x0e, 0x38,
+ 0x73, 0x9a, 0xcf, 0xf2, 0xa6, 0x0f, 0xc1, 0xf1, 0xda, 0xc8, 0x88, 0x2c,
+ 0xc8, 0x75, 0x6e, 0x93, 0x53, 0xcf, 0x84, 0x7a, 0xd8, 0xa1, 0x1f, 0x13,
+ 0xbc, 0xdb, 0x2e, 0x4d, 0xa9, 0x05, 0x61, 0x22, 0xcc, 0x43, 0x20, 0xbf,
+ 0x71, 0xe8, 0x7a, 0x1c, 0x5b, 0xd0, 0x38, 0x68, 0x8e, 0xaa, 0x22, 0x89,
+ 0x78, 0x42, 0xc8, 0x39, 0x26, 0x18, 0x15, 0x2e, 0xf0, 0x1a, 0x58, 0x65,
+ 0xa6, 0xfb, 0x4a, 0x76, 0x43, 0x8d, 0x11, 0x72, 0x62, 0xc2, 0x8e, 0x1a,
+ 0x2c, 0x89, 0xed, 0x27, 0x8a, 0x05, 0x71, 0xbf, 0x18, 0x7d, 0x62, 0x4e,
+ 0x74, 0xa0, 0xcf, 0x8d, 0x4c, 0x13, 0xf7, 0xf9, 0x04, 0xd5, 0xd9, 0x4a,
+ 0x56, 0x5e, 0x8d, 0xee, 0x5a, 0x4b, 0x3e, 0x07, 0x39, 0xce, 0xf2, 0x18,
+ 0x54, 0x31, 0xea, 0x52, 0xe0, 0x15, 0xc3, 0x9c, 0x26, 0x9c, 0xdd, 0x4c,
+ 0xbe, 0x03, 0x2c, 0x03, 0xbc, 0x6c, 0xdb, 0x7c, 0x1d, 0xdb, 0xc4, 0x3e,
+ 0x63, 0xe3, 0x2e, 0xae, 0x88, 0xa0, 0x2a, 0xf4, 0x19, 0x2a, 0xa4, 0x70,
+ 0x60, 0x8f, 0x08, 0x57, 0x48, 0xbd, 0x65, 0xf6, 0x95, 0x6f, 0x37, 0x94,
+ 0xdd, 0x78, 0x51, 0x48, 0x35, 0x65, 0xc6, 0x01, 0x99, 0x13, 0x7a, 0x9b,
+ 0x4f, 0xcb, 0xa8, 0x93, 0xcf, 0x88, 0xb6, 0x19, 0x5e, 0x7f, 0xbf, 0xa1,
+ 0x8e, 0x1b, 0x4a, 0x77, 0xb9, 0x4e, 0xe5, 0xb7, 0x9c, 0xe9, 0xb6, 0x71,
+ 0xcd, 0x9f, 0xf8, 0x7a, 0x43, 0x99, 0xac, 0x42, 0x3c, 0x3f, 0xf9, 0x11,
+ 0xd9, 0x6f, 0xa8, 0x01, 0xe7, 0x7a, 0x3f, 0xd9, 0xdb, 0xd9, 0xf9, 0xb6,
+ 0x97, 0x3c, 0xe3, 0x72, 0x75, 0xbb, 0x5f, 0x2f, 0xaf, 0xa1, 0x0a, 0x15,
+ 0xd9, 0x96, 0xce, 0xfd, 0x0b, 0x69, 0xc6, 0x98, 0x33, 0xde, 0x99, 0x16,
+ 0xc0, 0xc7, 0x20, 0x51, 0x57, 0x2b, 0xa9, 0x7b, 0x81, 0xd1, 0x52, 0x71,
+ 0xa5, 0x76, 0xd0, 0x74, 0x41, 0x83, 0x83, 0xb3, 0x85, 0xc2, 0x89, 0x73,
+ 0x49, 0x66, 0xa2, 0xad, 0xca, 0xed, 0x42, 0xd9, 0x9c, 0xd2, 0x03, 0xc6,
+ 0x8a, 0x0b, 0xdd, 0x54, 0x14, 0xd5, 0x84, 0x16, 0x6b, 0x99, 0x14, 0xbd,
+ 0x2e, 0x11, 0x1c, 0x79, 0x8c, 0x94, 0x1d, 0x42, 0xe7, 0xfc, 0x7e, 0x57,
+ 0xe2, 0xb4, 0x87, 0xf3, 0x59, 0x37, 0x7d, 0xb2, 0x35, 0xa3, 0xf4, 0x0e,
+ 0xe7, 0x67, 0xe7, 0xcf, 0xb6, 0x2c, 0xaa, 0x9d, 0x01, 0x71, 0x92, 0xd5,
+ 0x62, 0xe9, 0x1e, 0x6c, 0xc2, 0x8b, 0xe0, 0x34, 0x18, 0x5a, 0x19, 0xab,
+ 0x3d, 0x56, 0x0b, 0x77, 0x14, 0xbe, 0x07, 0x17, 0xa4, 0x03, 0x90, 0x7a,
+ 0x54, 0x9c, 0xee, 0x58, 0x3a, 0x7a, 0x8b, 0xb5, 0x30, 0x2b, 0xb0, 0x56,
+ 0xd4, 0x15, 0x92, 0xea, 0xfa, 0x80, 0x6c, 0x26, 0x3e, 0x45, 0x1b, 0x08,
+ 0xfb, 0xba, 0x9d, 0x6c, 0x27, 0x32, 0xf9, 0x44, 0x89, 0x0c, 0x8d, 0x74,
+ 0x0f, 0xc2, 0x45, 0xaa, 0x08, 0x56, 0xbe, 0x6f, 0x6d, 0xbc, 0x88, 0xfc,
+ 0x37, 0xb4, 0x6f, 0xc9, 0x9f, 0x94, 0x36, 0x83, 0xa5, 0xd5, 0x08, 0x2c,
+ 0x7d, 0x52, 0x4b, 0x6d, 0x16, 0xb6, 0xbd, 0x34, 0x39, 0x3d, 0x19, 0x5e,
+ 0xfa, 0x5e, 0x6d, 0x54, 0xf0, 0x08, 0xe0, 0x3e, 0xed, 0xbc, 0x7c, 0x2f,
+ 0x3c, 0x7a, 0x72, 0x1c, 0x29, 0x28, 0x4f, 0x48, 0xbc, 0xfd, 0x64, 0x58,
+ 0xce, 0xfc, 0xfa, 0x07, 0xb5, 0xf0, 0xd3, 0x23, 0xfd, 0x99, 0xdd, 0xf5,
+ 0xea, 0xbc, 0xce, 0x2b, 0xdf, 0x3b, 0x1d, 0xec, 0x54, 0xea, 0xe2, 0x9f,
+ 0x19, 0xca, 0x23, 0x30, 0x20, 0xf5, 0x59, 0xd7, 0x8b, 0x51, 0xdf, 0x23,
+ 0xc2, 0x60, 0x7d, 0x07, 0xb4, 0x76, 0x66, 0xf7, 0x9a, 0x1b, 0xea, 0x36,
+ 0x34, 0x04, 0x36, 0x65, 0x3f, 0xf1, 0x46, 0x12, 0x12, 0x93, 0x96, 0xff,
+ 0x6d, 0x9c, 0x90, 0x11, 0x29, 0x8c, 0xb2, 0xf4, 0xf4, 0x93, 0x36, 0x15,
+ 0x4d, 0x44, 0x67, 0x1e, 0x85, 0x53, 0xb4, 0x8d, 0xea, 0xa3, 0x28, 0xc2,
+ 0x2f, 0x8c, 0x9c, 0x08, 0xf8, 0x1e, 0xf4, 0x34, 0xbc, 0xeb, 0xb8, 0xd4,
+ 0x01, 0xbb, 0x05, 0x6c, 0xaf, 0xcd, 0xa1, 0x0b, 0xc8, 0x68, 0x09, 0xbe,
+ 0x90, 0x4f, 0x98, 0xc7, 0xa4, 0x6e, 0x13, 0x99, 0x70, 0xaa, 0x0a, 0x89,
+ 0x1c, 0xc4, 0x2a, 0x28, 0xfd, 0xae, 0x5e, 0xb2, 0x92, 0xec, 0x37, 0x69,
+ 0xe1, 0x37, 0xfa, 0x3f, 0x30, 0x28, 0x08, 0x9e, 0xfb, 0x5e, 0x2c, 0xbd,
+ 0x3e, 0x96, 0x17, 0x6a, 0x53, 0xe6, 0x8a, 0xe4, 0x83, 0x31, 0x6d, 0xbb,
+ 0xa9, 0x95, 0x52, 0x1f, 0x48, 0x86, 0xaa, 0x15, 0xc1, 0xa1, 0x8d, 0xd0,
+ 0x8a, 0x04, 0x6e, 0xe8, 0x45, 0x91, 0x9b, 0xef, 0x27, 0xac, 0xba, 0x5e,
+ 0x11, 0xd4, 0xb1, 0x42, 0xf5, 0x08, 0x0d, 0x00, 0xe5, 0x94, 0xf8, 0xac,
+ 0x7c, 0xb0, 0xe4, 0x14, 0xf0, 0x41, 0x92, 0x61, 0xcc, 0x66, 0x19, 0x6a,
+ 0xdd, 0xcf, 0x79, 0xdb, 0x6d, 0xf3, 0xd3, 0x80, 0x3f, 0x4b, 0xb2, 0xc9,
+ 0xcd, 0x85, 0xb4, 0x8d, 0x2c, 0xc9, 0x68, 0x35, 0x9e, 0x34, 0xf1, 0x50,
+ 0x02, 0xad, 0x04, 0x49, 0x3a, 0xc4, 0x9c, 0x96, 0xb9, 0xf9, 0xee, 0xe2,
+ 0xec, 0x7d, 0xff, 0xf2, 0x0c, 0x45, 0x17, 0xd0, 0x74, 0x12, 0xd1, 0x38,
+ 0xb5, 0x68, 0x8e, 0x57, 0x39, 0xa2, 0x0d, 0xb1, 0xd8, 0xac, 0xb7, 0xb4,
+ 0xb0, 0x03, 0xd7, 0xbb, 0xf5, 0x4b, 0xed, 0x04, 0x3c, 0x59, 0x05, 0xeb,
+ 0x22, 0x30, 0x37, 0xcd, 0x6e, 0x1a, 0xa7, 0xa4, 0x32, 0x5a, 0xe7, 0x3a,
+ 0x1a, 0x50, 0xe1, 0x3d, 0x5a, 0xd4, 0x0f, 0x44, 0xfb, 0xc1, 0x98, 0x1b,
+ 0x00, 0x82, 0x9a, 0xb0, 0x50, 0x85, 0xb2, 0x2d, 0xd8, 0x54, 0x53, 0xe2,
+ 0xa6, 0x60, 0xf0, 0x73, 0x53, 0x9a, 0xf3, 0x9b, 0x56, 0x55, 0x79, 0xaf,
+ 0x37, 0x17, 0x10, 0xfb, 0x66, 0x21, 0x6d, 0xb1, 0xbf, 0xa5, 0x79, 0x79,
+ 0x92, 0x71, 0xae, 0xfc, 0xf5, 0x2b, 0x15, 0xc0, 0x17, 0xed, 0x5c, 0x29,
+ 0x05, 0x48, 0xf5, 0x9b, 0xca, 0xd8, 0x4b, 0xd9, 0x64, 0x09, 0xe5, 0xed,
+ 0x09, 0x30, 0x57, 0x1d, 0x50, 0x95, 0xd6, 0x6b, 0xa4, 0xd4, 0x49, 0x94,
+ 0x9c, 0x50, 0xff, 0x91, 0x65, 0xb8, 0xfb, 0x53, 0x70, 0x86, 0x85, 0x2c,
+ 0x8b, 0xd4, 0xfa, 0xe9, 0xd4, 0xc1, 0xaa, 0x04, 0x51, 0x40, 0x35, 0x72,
+ 0x68, 0x6f, 0x2b, 0xf0, 0x09, 0xa9, 0xf0, 0x90, 0x07, 0xf4, 0xd3, 0x40,
+ 0x9b, 0xd4, 0xfc, 0xd6, 0x9c, 0x32, 0x8b, 0x26, 0x8b, 0x31, 0x56, 0x89,
+ 0xa2, 0x10, 0xc4, 0x32, 0x3b, 0x62, 0xe6, 0x1d, 0x4d, 0xcf, 0xa1, 0xa6,
+ 0x1d, 0xa6, 0x8c, 0xed, 0xec, 0xae, 0x9e, 0xc5, 0x4f, 0x59, 0x2e, 0x4a,
+ 0x52, 0x26, 0x89, 0x14, 0x31, 0x63, 0xc5, 0xb2, 0x0a, 0x18, 0xa7, 0x8b,
+ 0xab, 0xd2, 0xd2, 0x76, 0x47, 0x04, 0xd6, 0x34, 0x25, 0x07, 0xfc, 0xa7,
+ 0x46, 0xc1, 0x08, 0x44, 0x4d, 0x42, 0xdb, 0x17, 0x81, 0xc0, 0xaf, 0xb8,
+ 0xb0, 0x6f, 0xab, 0xc5, 0xad, 0x15, 0x5e, 0x44, 0x5b, 0x0d, 0xd9, 0x5b,
+ 0xbd, 0x93, 0x9e, 0xb7, 0x1a, 0x4b, 0x56, 0x4e, 0x8b, 0xae, 0xda, 0x4a,
+ 0x3b, 0x0c, 0xd6, 0xb0, 0x73, 0x2e, 0x27, 0x1b, 0xc4, 0x19, 0xd7, 0x5c,
+ 0x06, 0x83, 0x00, 0x62, 0x11, 0xf1, 0x94, 0x5a, 0x22, 0xd4, 0x26, 0xd1,
+ 0x8f, 0x26, 0x9b, 0xe4, 0x05, 0x1c, 0xfb, 0x80, 0xdd, 0x13, 0xf9, 0xd5,
+ 0xbe, 0xa2, 0xeb, 0x48, 0x8a, 0x75, 0x15, 0xf7, 0x67, 0x3f, 0xfc, 0x90,
+ 0xb4, 0x49, 0xc0, 0xb7, 0x22, 0x05, 0x31, 0x7d, 0xe8, 0xe6, 0xa4, 0xf4,
+ 0xbb, 0x1b, 0xa0, 0xcf, 0x79, 0xcf, 0x19, 0x95, 0x00, 0x28, 0xb7, 0x81,
+ 0x4d, 0xf0, 0x69, 0x4a, 0x63, 0xff, 0xdd, 0x28, 0x1c, 0x19, 0x31, 0x65,
+ 0x17, 0x54, 0x4e, 0x40, 0x90, 0xd9, 0x3f, 0x8e, 0x20, 0x2f, 0x38, 0xf7,
+ 0xc7, 0x46, 0x83, 0x25, 0xb5, 0x9b, 0xec, 0xc9, 0xf6, 0x84, 0x79, 0xd5,
+ 0xeb, 0x6f, 0xc8, 0x0d, 0x8c, 0x0b, 0xe1, 0x51, 0xa2, 0x72, 0x4e, 0xda,
+ 0xc2, 0xc8, 0x70, 0xe9, 0x73, 0x5d, 0x28, 0x82, 0xf6, 0x78, 0x65, 0xd4,
+ 0x59, 0x22, 0xc7, 0x58, 0x5d, 0x28, 0xd9, 0x72, 0xca, 0x78, 0xb3, 0x01,
+ 0x56, 0x38, 0xf5, 0x4e, 0x8c, 0x23, 0xcd, 0xe8, 0xac, 0x19, 0x63, 0x15,
+ 0xc3, 0xca, 0x28, 0xa8, 0xca, 0x4e, 0x99, 0x4b, 0x48, 0xfa, 0x2f, 0x39,
+ 0x72, 0x26, 0x4c, 0xd6, 0x7c, 0xdf, 0xfc, 0xc9, 0x16, 0xd9, 0x6e, 0x87,
+ 0x2d, 0x68, 0x17, 0xc4, 0xaa, 0xf1, 0xa8, 0x30, 0xc1, 0xc2, 0x10, 0x41,
+ 0x13, 0xe5, 0x20, 0x2b, 0xf9, 0x25, 0x79, 0xf4, 0x34, 0x72, 0xc7, 0x1a,
+ 0x35, 0x12, 0x88, 0xb8, 0x3a, 0x45, 0xc0, 0x14, 0xe6, 0x8e, 0x2c, 0x27,
+ 0x39, 0x92, 0x98, 0xb1, 0xec, 0x02, 0xb0, 0x19, 0xfa, 0xc6, 0x28, 0xed,
+ 0xe3, 0xb1, 0x7a, 0x59, 0x08, 0xdc, 0x05, 0x37, 0xb8, 0x85, 0xda, 0x9f,
+ 0x30, 0xf5, 0x6d, 0xdb, 0x5c, 0x35, 0x41, 0x63, 0xf3, 0xf9, 0x45, 0x22,
+ 0x5b, 0xf7, 0x68, 0xf9, 0x01, 0x1e, 0x64, 0x86, 0x99, 0x7f, 0x9f, 0x7f,
+ 0xb8, 0xdc, 0x72, 0x95, 0x4e, 0x64, 0xb7, 0xfa, 0x50, 0x4e, 0x49, 0xf3,
+ 0x08, 0xab, 0x12, 0x70, 0x32, 0x96, 0xc8, 0x29, 0xc8, 0x06, 0x7b, 0x30,
+ 0xc8, 0xc9, 0xf2, 0x6c, 0x67, 0xd7, 0x58, 0x52, 0x3b, 0x7b, 0xa0, 0x3c,
+ 0x7f, 0xb6, 0xf3, 0x6c, 0xa0, 0x75, 0x65, 0xf5, 0xa9, 0xe0, 0x5a, 0xa0,
+ 0x8d, 0x8d, 0xba, 0x7a, 0xe4, 0x39, 0x11, 0x00, 0x6b, 0xf2, 0xec, 0xd3,
+ 0x27, 0xfc, 0xaa, 0x8d, 0x42, 0xec, 0x5b, 0xf0, 0xbe, 0xed, 0x6a, 0xfc,
+ 0xe6, 0xf7, 0x66, 0x1c, 0x01, 0x98, 0x45, 0xc1, 0x89, 0x32, 0x20, 0x95,
+ 0xa7, 0x7c, 0xaf, 0xc1, 0x32, 0x16, 0xd4, 0xa6, 0x9b, 0xd6, 0xee, 0xd3,
+ 0xa0, 0x9a, 0xbd, 0xd2, 0x4a, 0x14, 0xd4, 0xe4, 0xb1, 0x50, 0x38, 0xe3,
+ 0x31, 0x86, 0x06, 0x93, 0xc2, 0xf0, 0x6c, 0xe7, 0x93, 0xaf, 0x18, 0xb7,
+ 0xb6, 0x84, 0xb9, 0xec, 0x44, 0x24, 0x29, 0xe8, 0x34, 0x4e, 0x81, 0xbc,
+ 0x4f, 0xc1, 0x6b, 0x73, 0x28, 0x30, 0xc3, 0xfa, 0xd7, 0x3d, 0x09, 0x60,
+ 0xf3, 0xbf, 0x9e, 0xb5, 0xef, 0xca, 0xeb, 0xbc, 0xe8, 0x6b, 0x9b, 0xaf,
+ 0xe5, 0x2f, 0x81, 0xbf, 0xf2, 0xf8, 0xfd, 0xc1, 0x39, 0x94, 0xe3, 0x64,
+ 0xf8, 0x1e, 0xb9, 0xde, 0x1e, 0xc7, 0x08, 0x9a, 0xb0, 0xdd, 0x12, 0x35,
+ 0x45, 0x8a, 0x08, 0x88, 0x88, 0x5e, 0x29, 0x3c, 0x56, 0x30, 0xf0, 0xba,
+ 0x2c, 0x7c, 0xfe, 0x88, 0x43, 0xdc, 0x7a, 0x3c, 0x27, 0xb6, 0x50, 0x9e,
+ 0xaa, 0xc6, 0xd1, 0xf0, 0x9d, 0x5c, 0x0f, 0x5c, 0xcf, 0x8a, 0xe5, 0xa8,
+ 0xf4, 0xb1, 0xd3, 0x9b, 0xe4, 0xa0, 0x01, 0x7f, 0xb9, 0x24, 0x95, 0x04,
+ 0x66, 0x2a, 0x4d, 0x45, 0x8f, 0xed, 0x54, 0x26, 0xfb, 0x7f, 0x4f, 0x36,
+ 0x8f, 0xa0, 0xbf, 0x5a, 0x73, 0xc1, 0x2e, 0x6b, 0x10, 0x74, 0xd1, 0xb5,
+ 0x4a, 0x76, 0x5b, 0x78, 0xa7, 0xa5, 0x23, 0xa5, 0xdf, 0x6a, 0xcf, 0xa3,
+ 0x39, 0x87, 0x74, 0xb5, 0x92, 0xde, 0x4f, 0x54, 0x70, 0x7b, 0xcf, 0x3e,
+ 0x7f, 0xde, 0xc3, 0xdf, 0x5e, 0xec, 0xbc, 0xda, 0x13, 0xf7, 0xe0, 0xf1,
+ 0xd1, 0xe5, 0xbb, 0xae, 0x43, 0xaf, 0x32, 0xfb, 0x89, 0xff, 0x4b, 0x05,
+ 0x9a, 0x6e, 0x8c, 0x81, 0x41, 0x59, 0xae, 0xfd, 0x7a, 0xd6, 0xcc, 0xfb,
+ 0x3b, 0x3b, 0x83, 0xe6, 0x53, 0xf3, 0x4f, 0x64, 0xe1, 0x7c, 0xf6, 0xbc,
+ 0x1d, 0x7b, 0x21, 0xb5, 0xbe, 0x4f, 0xf3, 0xbd, 0x9c, 0x8c, 0x89, 0xf7,
+ 0x97, 0xf3, 0xd1, 0xa5, 0xca, 0xdd, 0x66, 0x4b, 0x3d, 0xba, 0xc0, 0xaa,
+ 0x5f, 0x00, 0x5b, 0x76, 0x43, 0xc4, 0xcc, 0xee, 0xba, 0xd5, 0x05, 0x2f,
+ 0xb1, 0xc9, 0x76, 0x44, 0xf3, 0xb0, 0xc5, 0xbe, 0xeb, 0x54, 0x89, 0xea,
+ 0x21, 0xe4, 0xc5, 0x8a, 0x88, 0x26, 0x98, 0xd5, 0x02, 0xae, 0xaf, 0x32,
+ 0x4a, 0x96, 0x67, 0xc5, 0xaf, 0x60, 0x91, 0xf4, 0x78, 0xc2, 0x3f, 0xa6,
+ 0xa0, 0x1a, 0xcf, 0x25, 0xd9, 0x82, 0xff, 0x4d, 0x57, 0x71, 0x0b, 0xd5,
+ 0xb7, 0xf7, 0x22, 0x32, 0x71, 0xb8, 0xb0, 0x7f, 0xc1, 0xc4, 0xb5, 0xe7,
+ 0xcd, 0xa9, 0x47, 0xec, 0xc6, 0x83, 0xd1, 0x2b, 0xd1, 0x82, 0x30, 0x11,
+ 0xbb, 0x56, 0xb2, 0xf0, 0x5f, 0x3c, 0x16, 0x9a, 0xee, 0xc1, 0x2a, 0xe2,
+ 0x10, 0xf7, 0xd6, 0x23, 0x63, 0xd1, 0xa1, 0x74, 0x47, 0xd2, 0x73, 0xe4,
+ 0xb5, 0x74, 0x7f, 0x50, 0x7b, 0xec, 0xc5, 0x57, 0xf4, 0x4b, 0xa7, 0xb9,
+ 0x8b, 0x6c, 0x9e, 0x61, 0xe8, 0x7e, 0x80, 0xd9, 0xdb, 0xdc, 0xd6, 0x4e,
+ 0x6d, 0xbc, 0x2a, 0x63, 0xe6, 0x1e, 0xcd, 0xe7, 0x44, 0xa6, 0x55, 0x47,
+ 0x7d, 0x2d, 0xed, 0x0a, 0x22, 0x98, 0x4b, 0xf5, 0xcb, 0xf6, 0xb4, 0x8e,
+ 0x27, 0xbf, 0xaf, 0x73, 0x6c, 0x93, 0x1a, 0xc3, 0xe4, 0x31, 0x32, 0xd9,
+ 0xd1, 0x84, 0x5d, 0xaa, 0xd2, 0x65, 0xa0, 0x71, 0xdb, 0x65, 0x5c, 0x01,
+ 0xf0, 0x7b, 0x51, 0x78, 0x0c, 0x25, 0x0c, 0xc3, 0x52, 0xe2, 0x85, 0xcd,
+ 0xef, 0x2e, 0xde, 0xfd, 0xc5, 0xe6, 0xad, 0x6e, 0xf5, 0xe2, 0xd6, 0xb0,
+ 0xf6, 0xd7, 0x2f, 0xee, 0x6a, 0x21, 0x4a, 0x92, 0x2d, 0xd9, 0x9a, 0x78,
+ 0xf7, 0x8f, 0x10, 0xcc, 0xca, 0x7c, 0x54, 0xc9, 0xa6, 0x79, 0x8f, 0xf2,
+ 0xc5, 0x86, 0x62, 0xd4, 0x3d, 0x1b, 0xbc, 0x80, 0x57, 0xe4, 0xdd, 0xe1,
+ 0x8b, 0x67, 0x7b, 0xbb, 0xc6, 0x6e, 0xdd, 0xec, 0x48, 0x8b, 0xad, 0x47,
+ 0x87, 0xd9, 0x5e, 0xef, 0xec, 0xd3, 0x9c, 0xf6, 0xde, 0xe6, 0xd1, 0x0f,
+ 0xe7, 0xa7, 0xde, 0x00, 0xed, 0x0a, 0x04, 0x89, 0x84, 0xfe, 0x08, 0x19,
+ 0xbb, 0x67, 0xc7, 0xe8, 0x6e, 0xdb, 0x60, 0x4b, 0xf5, 0x90, 0xa7, 0x17,
+ 0xa6, 0x88, 0xae, 0xbf, 0xab, 0x72, 0xd2, 0x73, 0xd7, 0x69, 0x3e, 0xd6,
+ 0x4f, 0xca, 0x62, 0x62, 0x6e, 0xff, 0x33, 0x62, 0x57, 0xc8, 0xd6, 0x8d,
+ 0x1a, 0xfb, 0xe8, 0xe8, 0x96, 0x1f, 0x93, 0xf7, 0x3d, 0x1c, 0x95, 0x22,
+ 0x84, 0x22, 0xbc, 0xc7, 0x0f, 0xc1, 0x69, 0x45, 0x39, 0xc0, 0x9c, 0x5c,
+ 0xb1, 0x90, 0xc4, 0x15, 0x94, 0x40, 0x68, 0x9f, 0xb6, 0x4f, 0x28, 0x64,
+ 0x09, 0xaf, 0xcf, 0x6b, 0x38, 0xb5, 0x97, 0xc5, 0x43, 0x78, 0xe4, 0x1c,
+ 0x0d, 0xc1, 0xe3, 0x9b, 0xea, 0xd8, 0xdf, 0x72, 0x45, 0x02, 0x58, 0x83,
+ 0xd7, 0x70, 0x07, 0x54, 0xf5, 0x58, 0x4d, 0x3b, 0x3c, 0xea, 0xcc, 0x8a,
+ 0xdc, 0x82, 0x75, 0x25, 0xdf, 0x88, 0xb0, 0x88, 0x94, 0x35, 0xd9, 0x6b,
+ 0x13, 0x4f, 0x44, 0xfc, 0xe0, 0x08, 0xf5, 0xa2, 0x70, 0x50, 0x5a, 0xb4,
+ 0x49, 0x7a, 0x50, 0xe8, 0x09, 0x36, 0x10, 0xaa, 0x0d, 0x42, 0x49, 0x7c,
+ 0xf9, 0x2c, 0x74, 0x6a, 0x9d, 0x5d, 0x1e, 0xed, 0x23, 0x7e, 0xe1, 0x52,
+ 0xa3, 0x55, 0x21, 0x66, 0xa0, 0x0c, 0x21, 0xab, 0x0b, 0x49, 0x11, 0xf0,
+ 0x47, 0xd7, 0x8b, 0x95, 0xec, 0x03, 0x40, 0x93, 0x36, 0x03, 0x3b, 0x35,
+ 0x9b, 0x0e, 0x9a, 0xc2, 0x31, 0xf8, 0x20, 0xf1, 0x4b, 0x54, 0x60, 0x8e,
+ 0xbf, 0xc5, 0xca, 0x01, 0x5d, 0x71, 0x36, 0x25, 0x12, 0x14, 0xf9, 0x5a,
+ 0x09, 0x26, 0x4a, 0x02, 0x65, 0x30, 0x2c, 0xac, 0x2f, 0x71, 0x5c, 0x16,
+ 0xe3, 0xac, 0x0a, 0x90, 0x20, 0x08, 0x46, 0x91, 0x17, 0x16, 0x09, 0xea,
+ 0x97, 0x4a, 0x93, 0x12, 0x2d, 0xde, 0xe7, 0x49, 0x72, 0x17, 0x33, 0xeb,
+ 0xee, 0x1d, 0xb1, 0x42, 0xc8, 0xdd, 0xb5, 0xb4, 0x76, 0x10, 0x39, 0xbc,
+ 0x6c, 0x18, 0x4d, 0xbc, 0x5c, 0xb4, 0x63, 0xd4, 0x1e, 0x21, 0xf3, 0xc9,
+ 0xea, 0xe2, 0x92, 0xd2, 0x1c, 0x46, 0x6a, 0x71, 0xd2, 0xdb, 0xf6, 0xbf,
+ 0xb3, 0x2b, 0xbd, 0x5a, 0x90, 0xc4, 0xd3, 0x69, 0xeb, 0x80, 0x89, 0x15,
+ 0x1b, 0xa7, 0x8a, 0x81, 0x06, 0xea, 0x75, 0xa2, 0x4e, 0xd6, 0x29, 0x5b,
+ 0x6f, 0x54, 0x2f, 0xaa, 0xc9, 0x62, 0xb6, 0x3e, 0x68, 0x81, 0x80, 0xa1,
+ 0xe0, 0xc0, 0x76, 0x03, 0xf4, 0x20, 0xe2, 0x12, 0x7f, 0xb1, 0xd3, 0x6a,
+ 0x6c, 0x80, 0x81, 0x77, 0x02, 0xbb, 0xfd, 0x5d, 0xdc, 0x22, 0x12, 0x66,
+ 0x5b, 0x14, 0x12, 0xcd, 0xfb, 0x1d, 0x63, 0x2a, 0xb3, 0x9e, 0xac, 0x14,
+ 0xa3, 0xab, 0xe8, 0xbf, 0x5f, 0x04, 0x12, 0xe3, 0x49, 0xd5, 0x55, 0x71,
+ 0x70, 0xef, 0x6f, 0xca, 0x69, 0x96, 0x78, 0xa1, 0xde, 0xd0, 0x6c, 0x21,
+ 0x73, 0x7c, 0xe0, 0x31, 0x0d, 0x8b, 0xdf, 0x9a, 0x0e, 0x86, 0xac, 0x0d,
+ 0x4d, 0x3c, 0xbc, 0x4b, 0x23, 0x4a, 0xe7, 0x4a, 0xfe, 0x5a, 0x8e, 0x04,
+ 0x6b, 0x47, 0x66, 0x52, 0x2c, 0xb7, 0xfb, 0x0a, 0xe8, 0xd5, 0x85, 0xd9,
+ 0x68, 0x52, 0x65, 0x90, 0x02, 0x94, 0x49, 0x91, 0x35, 0x4c, 0x23, 0x47,
+ 0xb5, 0xb0, 0xc8, 0xbd, 0x9f, 0x5c, 0x33, 0x39, 0x2a, 0xd0, 0x69, 0xca,
+ 0xa8, 0x17, 0xe6, 0x27, 0xed, 0x75, 0x33, 0x78, 0xe3, 0xb5, 0x56, 0x7b,
+ 0x96, 0x9d, 0x21, 0x1d, 0x37, 0x0b, 0x99, 0xf5, 0x6e, 0xef, 0x4a, 0x75,
+ 0x07, 0x9a, 0x77, 0xc1, 0x56, 0x87, 0x84, 0xcf, 0xb1, 0xd9, 0x7c, 0xe9,
+ 0xf8, 0x41, 0xaf, 0x45, 0x77, 0x87, 0x68, 0xbd, 0x5b, 0xcb, 0x6d, 0x17,
+ 0x0c, 0xd6, 0x76, 0x82, 0x62, 0x7b, 0x79, 0xfd, 0xeb, 0xa9, 0x65, 0x7f,
+ 0x15, 0x84, 0xb6, 0x5b, 0xe5, 0xd5, 0x3f, 0xed, 0x59, 0x93, 0xd2, 0x2c,
+ 0x3f, 0x9e, 0x96, 0xd9, 0x32, 0x7f, 0x39, 0x0a, 0x06, 0x3e, 0x51, 0x42,
+ 0xb8, 0x23, 0xec, 0xab, 0xe4, 0xd8, 0xc7, 0xe1, 0x8d, 0xf9, 0x5e, 0xbe,
+ 0xc2, 0x22, 0x71, 0x13, 0xf2, 0x4a, 0x13, 0x08, 0xd8, 0xa0, 0x7a, 0x9e,
+ 0x6c, 0x92, 0x9d, 0x93, 0xbc, 0xf8, 0xfc, 0xc5, 0xf3, 0x2d, 0xa9, 0x9b,
+ 0x6d, 0x81, 0x51, 0x5b, 0x11, 0x7c, 0x2a, 0x1f, 0x37, 0x29, 0x8a, 0x89,
+ 0x4b, 0x2c, 0xe7, 0x6a, 0xac, 0x60, 0x6c, 0x9d, 0x68, 0x3d, 0x09, 0x00,
+ 0xc7, 0xcd, 0xc5, 0x0e, 0xa6, 0x7c, 0x2d, 0xd4, 0xda, 0x6d, 0xce, 0x95,
+ 0x72, 0xdd, 0x94, 0x1b, 0xdf, 0xc9, 0x6f, 0x87, 0xcc, 0x67, 0x02, 0x42,
+ 0xa8, 0x23, 0xca, 0x41, 0xb8, 0x85, 0x84, 0xb3, 0x28, 0x5a, 0x83, 0x5d,
+ 0x4b, 0x5c, 0xc7, 0x8e, 0xaf, 0xc7, 0x1b, 0x2a, 0x73, 0x51, 0x7a, 0x57,
+ 0x03, 0x3b, 0x01, 0x38, 0xb7, 0x82, 0xef, 0x9e, 0x18, 0x99, 0x96, 0xd1,
+ 0x4b, 0x11, 0x93, 0xa6, 0xbb, 0xac, 0x3d, 0x8f, 0xcc, 0xcd, 0x42, 0x3b,
+ 0x45, 0xdf, 0x17, 0x38, 0x90, 0xac, 0x09, 0x99, 0x34, 0x41, 0x26, 0xdf,
+ 0x2c, 0x9b, 0x29, 0x95, 0x35, 0x5f, 0xb2, 0x65, 0xe5, 0x6a, 0x38, 0x71,
+ 0x3c, 0x82, 0x6f, 0x4c, 0x40, 0x18, 0x97, 0xa5, 0x62, 0xab, 0xc5, 0x9f,
+ 0x6a, 0xce, 0x68, 0xab, 0x67, 0x4b, 0xf1, 0xe5, 0xba, 0xdb, 0x34, 0x39,
+ 0xbb, 0x0b, 0x2b, 0xd7, 0xbf, 0xdb, 0x5d, 0x19, 0x66, 0x94, 0xf0, 0x57,
+ 0x3b, 0x13, 0xb1, 0xa4, 0xf7, 0x5c, 0xdb, 0x08, 0x34, 0x2a, 0xf0, 0x17,
+ 0xf4, 0x43, 0x46, 0x88, 0x64, 0x13, 0x1d, 0xde, 0xde, 0xde, 0x7a, 0xbc,
+ 0xd3, 0xf2, 0xe4, 0x63, 0x9d, 0x3c, 0x67, 0x23, 0xde, 0x63, 0xbd, 0xbc,
+ 0xf2, 0xfa, 0x40, 0xdf, 0xa4, 0x15, 0x63, 0x66, 0x4a, 0xc6, 0x39, 0x32,
+ 0x4c, 0x04, 0xa4, 0xeb, 0x46, 0x35, 0x89, 0x50, 0x7e, 0xc0, 0x25, 0x92,
+ 0xca, 0x00, 0xdb, 0x63, 0x17, 0xf3, 0x8e, 0x09, 0x5e, 0x44, 0x84, 0x10,
+ 0x0e, 0x08, 0x8c, 0x1b, 0x07, 0xd3, 0xa0, 0x38, 0x67, 0xab, 0x5b, 0xde,
+ 0xe0, 0x60, 0xcc, 0x75, 0x9c, 0xca, 0x38, 0x85, 0x4c, 0x4c, 0xa3, 0xee,
+ 0xe7, 0x08, 0x5c, 0x5b, 0x9f, 0x56, 0x69, 0xc4, 0xc9, 0x68, 0x11, 0xd2,
+ 0x26, 0x7e, 0x92, 0x0e, 0x90, 0xba, 0xa3, 0xf3, 0x22, 0xa2, 0x46, 0x3a,
+ 0xa7, 0x21, 0x1a, 0x34, 0x12, 0xf5, 0xd6, 0x8d, 0x99, 0x19, 0x93, 0xb8,
+ 0x32, 0xac, 0x64, 0x2d, 0x5b, 0xdf, 0x76, 0x5a, 0x85, 0x1e, 0x66, 0xf4,
+ 0xcd, 0xee, 0x6f, 0xcc, 0x98, 0x16, 0x23, 0xc5, 0x4f, 0x5b, 0x93, 0xd9,
+ 0xe3, 0x33, 0x8a, 0xbc, 0xe8, 0x98, 0x56, 0x8a, 0x12, 0x0f, 0x61, 0xee,
+ 0xa5, 0x9d, 0xc3, 0x95, 0x78, 0x33, 0x0b, 0x38, 0x63, 0x97, 0x26, 0x43,
+ 0xce, 0xc2, 0x7b, 0x56, 0x9d, 0x4a, 0xda, 0x68, 0xdb, 0xaa, 0xee, 0x94,
+ 0xe4, 0xb6, 0x69, 0xa4, 0x4b, 0x18, 0x7b, 0xa4, 0xd6, 0xdd, 0xa9, 0x3e,
+ 0x66, 0x8c, 0xec, 0xf3, 0xd3, 0xa3, 0xaf, 0xcf, 0xb6, 0x1e, 0xf3, 0xc6,
+ 0xb5, 0xe5, 0xbf, 0x1d, 0x17, 0xe0, 0x67, 0x15, 0xc1, 0xd7, 0xb8, 0xfb,
+ 0xd0, 0xc3, 0xbf, 0x1e, 0x0e, 0xfb, 0x07, 0xe7, 0xc7, 0xa8, 0xc7, 0x31,
+ 0x34, 0x7f, 0x2e, 0xe1, 0x8b, 0x93, 0xc2, 0xf6, 0xdf, 0x49, 0xee, 0x56,
+ 0x2d, 0x6a, 0x46, 0x02, 0x6f, 0x17, 0x50, 0x18, 0x50, 0x1e, 0x44, 0xc3,
+ 0xb3, 0xc9, 0xb8, 0x68, 0xbe, 0x6b, 0x40, 0x9d, 0x1f, 0x6f, 0xe3, 0x53,
+ 0xf4, 0x49, 0x0c, 0x28, 0x6e, 0x28, 0x87, 0xbc, 0xf0, 0xcc, 0x57, 0x01,
+ 0x44, 0x25, 0x04, 0xb4, 0xe2, 0x53, 0x8d, 0x99, 0x43, 0xd7, 0x89, 0x0b,
+ 0x4e, 0xc5, 0xb3, 0x01, 0xc8, 0xe9, 0x43, 0x70, 0xef, 0xb4, 0xc9, 0x62,
+ 0x5e, 0x26, 0x18, 0x23, 0x4c, 0x96, 0x42, 0x05, 0x2f, 0xcd, 0x15, 0x2c,
+ 0x08, 0xa7, 0xae, 0xf9, 0xbf, 0xd1, 0x5f, 0x24, 0xc9, 0xfe, 0x06, 0xa3,
+ 0x29, 0xb3, 0x82, 0xca, 0xc4, 0x82, 0x1f, 0xa5, 0x63, 0x6e, 0xb7, 0xca,
+ 0xf2, 0x58, 0x7e, 0x49, 0xd3, 0xc9, 0x60, 0x0b, 0xe2, 0x1d, 0xd5, 0x7b,
+ 0xaa, 0x8c, 0x02, 0x21, 0xac, 0xde, 0x30, 0xce, 0x65, 0xf2, 0x4f, 0x21,
+ 0xb2, 0x5f, 0xa1, 0x81, 0x8c, 0x38, 0x48, 0x08, 0x87, 0x51, 0xd1, 0x4c,
+ 0x67, 0xf2, 0xd7, 0xb4, 0x78, 0x80, 0x63, 0x50, 0x3c, 0xd5, 0xc8, 0xbf,
+ 0xb2, 0x7b, 0xba, 0xbd, 0xd1, 0x9b, 0x6a, 0x0c, 0x93, 0x96, 0x01, 0x97,
+ 0x9c, 0x78, 0xb5, 0x6a, 0xcf, 0x92, 0x3e, 0x6f, 0x0b, 0xae, 0x25, 0xfd,
+ 0xa2, 0xa7, 0xad, 0xf4, 0x5a, 0xe5, 0x4d, 0x99, 0xdc, 0x0d, 0x9b, 0x20,
+ 0x22, 0x8a, 0x50, 0xaf, 0x62, 0xd3, 0xd8, 0x0e, 0xe5, 0x74, 0xc1, 0x05,
+ 0xab, 0xc8, 0xfd, 0x47, 0x78, 0xff, 0x2d, 0x8d, 0x69, 0x51, 0x6a, 0x82,
+ 0x69, 0x55, 0x21, 0x8d, 0x0c, 0x92, 0x3d, 0x0c, 0xa1, 0xc9, 0xae, 0x98,
+ 0xca, 0xc0, 0x85, 0x14, 0x38, 0x66, 0x26, 0x96, 0x38, 0xcd, 0x2c, 0xb7,
+ 0x85, 0xa6, 0xe6, 0x00, 0xe1, 0xdc, 0x29, 0xef, 0x47, 0xb8, 0x7e, 0xba,
+ 0x56, 0xad, 0xd9, 0x51, 0x4f, 0x32, 0x89, 0x6e, 0xbf, 0x7e, 0x93, 0xa7,
+ 0x35, 0x46, 0xd3, 0x53, 0x96, 0xe1, 0x72, 0x35, 0x2c, 0x3e, 0xa2, 0x53,
+ 0x42, 0x45, 0xb6, 0xe5, 0x63, 0xfc, 0x9d, 0x14, 0xc0, 0x15, 0xab, 0x08,
+ 0x3f, 0x95, 0x0c, 0xc1, 0x2d, 0xc6, 0x60, 0x15, 0xf0, 0xa2, 0xfd, 0xa5,
+ 0x4e, 0xd3, 0xdf, 0x51, 0xf6, 0xa6, 0x5d, 0x62, 0xae, 0x60, 0xeb, 0x2f,
+ 0x32, 0x6b, 0xf9, 0x5d, 0x0e, 0x7e, 0x9a, 0x88, 0x01, 0x9e, 0x08, 0x36,
+ 0x30, 0x05, 0x8d, 0xed, 0xa8, 0x54, 0x3d, 0x22, 0xcf, 0x52, 0xca, 0xb5,
+ 0x3f, 0xf8, 0x65, 0xef, 0x1b, 0x7e, 0xa9, 0xf5, 0x95, 0x59, 0xe7, 0x76,
+ 0x75, 0x06, 0x4f, 0x98, 0x10, 0x37, 0x7e, 0xf7, 0xc3, 0xc0, 0xb2, 0xb3,
+ 0x91, 0xd1, 0x7a, 0x2c, 0x44, 0x2e, 0x03, 0xd9, 0x85, 0x9b, 0x1f, 0xe5,
+ 0x2f, 0x74, 0x06, 0xbe, 0xcf, 0x0b, 0xa3, 0x19, 0xd6, 0x5b, 0xba, 0x39,
+ 0x05, 0x8a, 0x15, 0x9e, 0x5d, 0xaa, 0xad, 0x7c, 0x43, 0x50, 0x2e, 0x07,
+ 0x4b, 0x23, 0xc5, 0x99, 0x83, 0x13, 0x81, 0x28, 0xf2, 0xaa, 0xb0, 0x3c,
+ 0xcc, 0x03, 0x48, 0xff, 0xd8, 0x0a, 0x1d, 0xb4, 0x01, 0x2e, 0x3b, 0x63,
+ 0x16, 0x14, 0xf9, 0x27, 0x17, 0xcc, 0xc6, 0xbd, 0xc1, 0x19, 0xe8, 0xce,
+ 0xb7, 0x23, 0xa5, 0x59, 0x23, 0xbd, 0x0b, 0xa2, 0x35, 0x34, 0xbb, 0x18,
+ 0xe7, 0xe6, 0x8b, 0xad, 0xe4, 0xaa, 0x99, 0x6f, 0xee, 0x6e, 0xe1, 0x63,
+ 0x5a, 0xdc, 0xcd, 0xab, 0xc0, 0x12, 0x3a, 0x72, 0x08, 0x49, 0x87, 0x13,
+ 0xea, 0x88, 0x89, 0x51, 0x40, 0x85, 0x5c, 0x97, 0xd0, 0x29, 0xe8, 0x04,
+ 0xf3, 0x84, 0x59, 0x0e, 0x54, 0x80, 0x76, 0x63, 0x0e, 0x54, 0x20, 0x5c,
+ 0xe6, 0x44, 0xf6, 0x55, 0x73, 0xd1, 0xf0, 0xcd, 0xbc, 0xf1, 0x69, 0xd5,
+ 0x88, 0xd0, 0x30, 0xe7, 0xb8, 0x7d, 0x59, 0x4d, 0x27, 0x7d, 0x92, 0x21,
+ 0xd7, 0x55, 0x69, 0xae, 0xc8, 0x2a, 0xc2, 0x88, 0x24, 0x36, 0x05, 0xa9,
+ 0xfa, 0x59, 0x71, 0x97, 0x57, 0x65, 0x01, 0xda, 0xa9, 0xbb, 0xb4, 0xca,
+ 0x11, 0xd4, 0x5e, 0xff, 0xe6, 0xec, 0xfd, 0xd1, 0xba, 0xef, 0x17, 0xb9,
+ 0xca, 0xc5, 0x63, 0x8c, 0xf5, 0xeb, 0xfa, 0x63, 0x75, 0x35, 0xc3, 0x70,
+ 0x4d, 0x92, 0x98, 0x2b, 0xdd, 0x68, 0x39, 0x6c, 0x4b, 0xdd, 0xe9, 0x61,
+ 0x22, 0xd5, 0xde, 0x46, 0x84, 0x8d, 0x3a, 0x29, 0x31, 0x6f, 0x29, 0x04,
+ 0xa1, 0xbb, 0x2c, 0x04, 0x9c, 0xc0, 0x95, 0xa0, 0xc6, 0x21, 0x78, 0x7a,
+ 0x4b, 0xbf, 0x14, 0x41, 0xe2, 0x95, 0x2b, 0x20, 0x45, 0x9f, 0x37, 0x00,
+ 0x96, 0x36, 0x06, 0x02, 0xdf, 0x98, 0x3d, 0x90, 0x65, 0xb3, 0xd1, 0xbe,
+ 0x00, 0x37, 0x6a, 0x32, 0xc6, 0x9b, 0x0d, 0x9d, 0x5e, 0x80, 0x23, 0x57,
+ 0x14, 0xd5, 0x5c, 0xf6, 0x6d, 0xde, 0xd5, 0xfc, 0x09, 0xd7, 0x3a, 0x37,
+ 0xee, 0x4e, 0xdf, 0x3e, 0x9f, 0xbe, 0x4f, 0x5d, 0xeb, 0x2e, 0xe4, 0x9f,
+ 0x48, 0x5d, 0xce, 0x4a, 0xbb, 0xb8, 0x54, 0x3b, 0x70, 0x4e, 0x34, 0x98,
+ 0xa1, 0x63, 0xd1, 0x7c, 0xbe, 0x1c, 0x33, 0x11, 0x88, 0x8b, 0x20, 0xca,
+ 0x55, 0x26, 0xb9, 0xe4, 0x8c, 0x2f, 0x76, 0x45, 0x6b, 0x55, 0xee, 0x27,
+ 0xd4, 0xe4, 0x12, 0x0a, 0x2a, 0x2a, 0x3a, 0x8f, 0xd2, 0x56, 0x4a, 0x65,
+ 0x05, 0xfc, 0x25, 0x39, 0x3c, 0x2d, 0x94, 0x50, 0xbe, 0xd6, 0xf3, 0xb3,
+ 0x3c, 0x7b, 0x61, 0xa1, 0x7b, 0x58, 0xc3, 0x0e, 0x7b, 0x61, 0x95, 0x13,
+ 0xa6, 0x66, 0x63, 0x72, 0x2f, 0x4b, 0xdb, 0xa2, 0xfc, 0x66, 0xa1, 0x92,
+ 0x6c, 0xa7, 0x53, 0xfd, 0xb8, 0xc4, 0xa2, 0x45, 0x30, 0x14, 0xb6, 0x69,
+ 0x6c, 0x88, 0x17, 0xdb, 0x91, 0xb5, 0x0e, 0x62, 0x49, 0x55, 0xe6, 0xc5,
+ 0xa8, 0x89, 0x6d, 0x0f, 0xa5, 0x19, 0x1b, 0x3b, 0x77, 0x28, 0xad, 0xfd,
+ 0x0e, 0xd9, 0x78, 0x42, 0x14, 0xce, 0x68, 0x58, 0xb7, 0x28, 0x71, 0x68,
+ 0x00, 0x04, 0xbb, 0xeb, 0x61, 0x2e, 0xa5, 0x6c, 0x21, 0x6a, 0xbe, 0xe6,
+ 0x5e, 0xd8, 0x0e, 0x5a, 0x73, 0x87, 0x58, 0x08, 0x58, 0x95, 0x0d, 0x70,
+ 0xe9, 0x65, 0x0d, 0x3a, 0xb5, 0xa6, 0x4a, 0xc7, 0xee, 0x2f, 0xfd, 0xb4,
+ 0x1e, 0xe7, 0xb9, 0x12, 0x4f, 0x53, 0x38, 0x2c, 0x23, 0x04, 0x68, 0x9c,
+ 0xa4, 0x42, 0xd7, 0x23, 0xb1, 0x8c, 0xaf, 0x93, 0x92, 0xdd, 0xbc, 0x0c,
+ 0xb2, 0x48, 0xb9, 0x26, 0x01, 0x41, 0x36, 0x50, 0x62, 0x56, 0x62, 0x65,
+ 0x31, 0x2e, 0x6e, 0x25, 0xae, 0x5a, 0x62, 0xdf, 0x1a, 0x13, 0x7c, 0xd7,
+ 0xb7, 0xc1, 0x75, 0x12, 0xfa, 0x13, 0x54, 0x74, 0x66, 0x7b, 0xf2, 0xfe,
+ 0x7e, 0x6f, 0xb0, 0xa2, 0x48, 0xa8, 0x1f, 0xf0, 0x78, 0xd9, 0xb1, 0x50,
+ 0x98, 0x72, 0x25, 0x66, 0x9f, 0x0c, 0xb7, 0x5a, 0x15, 0x3a, 0x0e, 0x4e,
+ 0xce, 0x4f, 0x13, 0xf0, 0xdc, 0x80, 0x51, 0xb3, 0x80, 0x93, 0x2c, 0x91,
+ 0x1f, 0xbb, 0xca, 0xdd, 0x14, 0xc0, 0x09, 0xaa, 0x8a, 0x0a, 0x07, 0x38,
+ 0xac, 0x88, 0x30, 0xaf, 0x87, 0xf1, 0x5c, 0x05, 0xb8, 0x1e, 0xd4, 0x7e,
+ 0x81, 0x94, 0x57, 0x23, 0xa3, 0x3b, 0x1c, 0xf3, 0xc9, 0x01, 0x7f, 0x58,
+ 0x25, 0xed, 0xe8, 0xc1, 0xa5, 0xde, 0xb4, 0xdf, 0xb5, 0x3c, 0x3f, 0x65,
+ 0x22, 0xac, 0x3e, 0x81, 0x50, 0x6f, 0x32, 0x4b, 0x29, 0x24, 0xc6, 0x9d,
+ 0xab, 0xcf, 0xcd, 0xae, 0x25, 0x01, 0x25, 0x20, 0xdb, 0x5e, 0xf3, 0x76,
+ 0xeb, 0xd5, 0x99, 0xd6, 0x66, 0x62, 0x8b, 0x79, 0x11, 0x24, 0x5a, 0xdb,
+ 0x19, 0x8f, 0x64, 0x3f, 0x05, 0xc8, 0xda, 0x27, 0xe5, 0x42, 0xd1, 0x92,
+ 0x0c, 0x56, 0x2c, 0xf1, 0x69, 0x8f, 0x3f, 0x3a, 0x5a, 0x90, 0x8c, 0xe8,
+ 0x7c, 0x43, 0x16, 0x98, 0x75, 0x27, 0x7e, 0x42, 0x4a, 0xae, 0xe3, 0x64,
+ 0x82, 0xce, 0x84, 0x88, 0x96, 0xb2, 0x74, 0x46, 0x35, 0x19, 0x14, 0x1d,
+ 0x4f, 0x0e, 0x60, 0xc2, 0x30, 0x76, 0xa7, 0x72, 0x91, 0x8a, 0xcc, 0x6a,
+ 0x51, 0x5d, 0x76, 0x40, 0xf3, 0xfc, 0x19, 0x02, 0xcd, 0xf8, 0xcd, 0xc7,
+ 0x12, 0xa1, 0xf0, 0xba, 0xcd, 0xc7, 0x96, 0x08, 0x8e, 0x16, 0x2a, 0x61,
+ 0x46, 0x49, 0x6e, 0xc2, 0xd6, 0x2c, 0x23, 0x9a, 0xed, 0x9b, 0x45, 0x71,
+ 0x6b, 0xba, 0x10, 0x26, 0x6a, 0x2a, 0xbe, 0x35, 0x27, 0xe9, 0x85, 0x3a,
+ 0x3f, 0xf4, 0x17, 0xe1, 0xf7, 0xd3, 0x16, 0x88, 0xcc, 0xf2, 0x8e, 0xfc,
+ 0x79, 0x61, 0xa9, 0xc8, 0x58, 0xef, 0x26, 0xf6, 0x84, 0xa4, 0x8d, 0x9b,
+ 0xc0, 0x28, 0x86, 0x5b, 0xd7, 0xd9, 0x15, 0xc8, 0x33, 0xfb, 0xd1, 0x43,
+ 0x0f, 0x09, 0x47, 0xa5, 0xf2, 0xb8, 0x20, 0x0d, 0x47, 0x51, 0x37, 0x81,
+ 0x40, 0x5c, 0xd4, 0x9c, 0xfa, 0x24, 0xcb, 0x4a, 0xfb, 0xc1, 0xa7, 0xc9,
+ 0x8e, 0xf4, 0xa4, 0x9d, 0x35, 0xbc, 0x6c, 0x1f, 0xb4, 0xeb, 0xf6, 0xb8,
+ 0x24, 0x63, 0x81, 0x5e, 0x58, 0xd5, 0x8d, 0x8a, 0xd9, 0xf8, 0x35, 0x34,
+ 0x22, 0x92, 0xcb, 0xe5, 0x2f, 0x65, 0x85, 0xdd, 0x64, 0x33, 0x94, 0x21,
+ 0x66, 0x79, 0xf0, 0x4f, 0x9c, 0x25, 0x37, 0x10, 0x6f, 0xa2, 0xec, 0x0f,
+ 0x3b, 0x93, 0x54, 0x3c, 0x49, 0x1e, 0x9e, 0x1a, 0xf1, 0x43, 0xd2, 0xd0,
+ 0x13, 0x86, 0xa7, 0x2c, 0x91, 0x54, 0x10, 0xba, 0x91, 0x76, 0xdd, 0x5e,
+ 0x57, 0xbf, 0x46, 0x0a, 0x52, 0xf3, 0x84, 0x29, 0x3f, 0x3f, 0xed, 0x36,
+ 0x67, 0xf9, 0xdb, 0x47, 0x80, 0x98, 0x3c, 0x26, 0x07, 0xad, 0x05, 0x2f,
+ 0x3f, 0x5b, 0xe2, 0xe1, 0xfa, 0xf5, 0x42, 0xb0, 0x4d, 0xe7, 0x15, 0x97,
+ 0x81, 0x45, 0x4b, 0x04, 0x8a, 0x56, 0xff, 0xbb, 0x09, 0x41, 0xfa, 0xa2,
+ 0x74, 0x39, 0x9f, 0x44, 0xb3, 0xcb, 0xed, 0xda, 0x4a, 0x0d, 0x1b, 0x89,
+ 0x5c, 0xd0, 0x6a, 0x28, 0xaf, 0xc5, 0xf1, 0x5b, 0xb3, 0xc9, 0x48, 0x67,
+ 0xbd, 0x36, 0x83, 0xf8, 0x6a, 0xd9, 0xe2, 0xa2, 0x58, 0xa6, 0x86, 0x77,
+ 0x61, 0xe7, 0x53, 0x5d, 0x50, 0x9f, 0x5f, 0x87, 0xe8, 0xb6, 0x3c, 0xc6,
+ 0x76, 0x49, 0x81, 0x53, 0x76, 0xf2, 0xb8, 0x5f, 0x02, 0x74, 0x48, 0x9c,
+ 0x63, 0x9a, 0xdc, 0x2c, 0xa8, 0x18, 0x14, 0x5d, 0x79, 0x5c, 0x34, 0x4b,
+ 0x38, 0xd8, 0xab, 0x8c, 0xfa, 0xdc, 0xee, 0x70, 0xc0, 0x18, 0xc5, 0xde,
+ 0xec, 0x3a, 0x33, 0x07, 0x91, 0x13, 0x64, 0x46, 0x55, 0x79, 0x9b, 0xf1,
+ 0xae, 0x83, 0x79, 0x41, 0x87, 0x8a, 0xa5, 0xb8, 0x3a, 0x65, 0x8d, 0x9c,
+ 0x9b, 0x58, 0x9c, 0x5e, 0x44, 0x9f, 0xa5, 0x7a, 0x1a, 0x92, 0x4e, 0xee,
+ 0xa4, 0x61, 0xee, 0xb2, 0xb9, 0x95, 0xe2, 0x97, 0x97, 0x6b, 0x4c, 0x7c,
+ 0x4b, 0x83, 0x55, 0x65, 0xcc, 0x1b, 0x2d, 0xa8, 0xb9, 0xec, 0xf0, 0xfb,
+ 0x67, 0x5f, 0x3c, 0x35, 0xcb, 0x4f, 0xbe, 0x5d, 0x75, 0xff, 0xe4, 0x47,
+ 0x56, 0xf4, 0xe9, 0x55, 0x32, 0xcc, 0x5e, 0x82, 0x27, 0x2c, 0x79, 0x6d,
+ 0x36, 0x15, 0xfb, 0xc4, 0x28, 0xa6, 0xd5, 0x75, 0x77, 0xa1, 0xd2, 0x4b,
+ 0x5f, 0x4d, 0x8f, 0x89, 0x64, 0x5e, 0x5d, 0x49, 0x2a, 0x02, 0x63, 0xf9,
+ 0x27, 0xae, 0xfe, 0x92, 0x70, 0xeb, 0xf6, 0x58, 0x49, 0x32, 0x3b, 0x26,
+ 0x72, 0xc8, 0x9d, 0x23, 0x87, 0x53, 0x3f, 0xa1, 0x87, 0xd3, 0xf2, 0x80,
+ 0x50, 0x24, 0xf7, 0x2a, 0xe9, 0xfe, 0x1b, 0x81, 0x5f, 0x8d, 0x56, 0xdb,
+ 0x10, 0xf2, 0x09, 0xdf, 0x0a, 0xd4, 0x4e, 0xae, 0x7b, 0x60, 0x93, 0x23,
+ 0x98, 0xf3, 0xc0, 0xf2, 0x65, 0x10, 0x25, 0xb9, 0xaf, 0x1b, 0x30, 0xf1,
+ 0x6f, 0x72, 0x44, 0x46, 0x4b, 0xc4, 0x22, 0x64, 0xcf, 0x05, 0xf5, 0x11,
+ 0xc3, 0x44, 0x22, 0x2a, 0xbe, 0x00, 0x90, 0x92, 0x58, 0xd8, 0xa9, 0x02,
+ 0x90, 0x78, 0xf0, 0x96, 0xb3, 0x2a, 0x3c, 0xf5, 0xd4, 0x23, 0x46, 0xf8,
+ 0x88, 0x99, 0xa6, 0x3f, 0xb0, 0xf5, 0x0e, 0xde, 0x79, 0x46, 0x51, 0xc2,
+ 0x46, 0x0a, 0xb4, 0x63, 0xce, 0x95, 0x8d, 0x0d, 0x36, 0xf1, 0x1e, 0xf3,
+ 0x5f, 0xd9, 0xff, 0x7c, 0x47, 0x33, 0xbb, 0x29, 0xdc, 0xe5, 0x3f, 0x83,
+ 0x1a, 0x15, 0xa1, 0x1e, 0x41, 0x8f, 0x99, 0x9f, 0xda, 0x27, 0x43, 0x19,
+ 0x28, 0xec, 0x75, 0x2f, 0x9e, 0x51, 0xcc, 0x3b, 0xee, 0x53, 0xe2, 0x8b,
+ 0xd6, 0xf7, 0x22, 0x58, 0x37, 0x42, 0x1d, 0x03, 0x38, 0x7a, 0x67, 0xcb,
+ 0xae, 0xc6, 0xb1, 0xc4, 0x4b, 0x37, 0x28, 0xeb, 0x2e, 0xee, 0x91, 0x98,
+ 0xe4, 0x75, 0xc4, 0x89, 0xc1, 0x98, 0x2d, 0xd9, 0x70, 0xb6, 0x66, 0x05,
+ 0x2a, 0x24, 0xf0, 0xd6, 0xc6, 0x2a, 0x9a, 0x03, 0xb3, 0x0e, 0x7e, 0x73,
+ 0x5b, 0x8f, 0x35, 0x5f, 0x99, 0x98, 0xb5, 0xfb, 0x6a, 0xf0, 0xbc, 0x75,
+ 0x4e, 0x9a, 0xe9, 0xac, 0x7f, 0x3f, 0x7a, 0x24, 0xf6, 0x71, 0x79, 0xf2,
+ 0x3e, 0x99, 0x2d, 0x50, 0x15, 0x52, 0xc8, 0x38, 0x1f, 0xa6, 0x99, 0xba,
+ 0xa1, 0xc9, 0xc1, 0xc3, 0xbe, 0xc2, 0x1b, 0x50, 0xb4, 0x85, 0xb0, 0x65,
+ 0x4c, 0x63, 0xc7, 0xcf, 0xef, 0x52, 0x25, 0xc5, 0xee, 0x97, 0x1a, 0x33,
+ 0xd4, 0x24, 0xfb, 0xb3, 0xe7, 0xf3, 0x69, 0x1e, 0xcd, 0x66, 0x51, 0x30,
+ 0x69, 0xf6, 0x29, 0x1b, 0x2f, 0x10, 0xa7, 0x26, 0xf5, 0x90, 0xd8, 0x6d,
+ 0x56, 0x3b, 0xd0, 0x3d, 0xa7, 0xb9, 0xb8, 0xc9, 0xcd, 0x0f, 0xba, 0x93,
+ 0xd1, 0x1d, 0x3b, 0x0f, 0x3e, 0xf0, 0x9e, 0x31, 0x7b, 0x60, 0xec, 0x77,
+ 0x41, 0xac, 0x18, 0x18, 0x76, 0xba, 0x10, 0xcd, 0x96, 0xca, 0xaf, 0x0b,
+ 0x56, 0x3a, 0xde, 0xe7, 0xe3, 0xaa, 0xac, 0xcb, 0x2b, 0x06, 0x67, 0x79,
+ 0x26, 0xd2, 0xf1, 0xf1, 0x30, 0xb9, 0xcf, 0x46, 0x9a, 0x0c, 0x3a, 0x08,
+ 0x9d, 0xc9, 0x90, 0x21, 0x14, 0x21, 0xa9, 0xf2, 0xac, 0xa1, 0x29, 0xd3,
+ 0x98, 0x28, 0xd1, 0xd7, 0xa0, 0x14, 0x6b, 0x3f, 0x2b, 0xae, 0x8d, 0xb5,
+ 0x0a, 0x05, 0x9e, 0x8a, 0x90, 0x4c, 0xf9, 0x62, 0x9a, 0x67, 0x65, 0x24,
+ 0x30, 0xce, 0x1d, 0xd0, 0x6b, 0x45, 0xca, 0xe0, 0xd0, 0x1d, 0x3e, 0x4a,
+ 0xa9, 0x4b, 0xac, 0x4b, 0xe6, 0x28, 0x7d, 0x44, 0x3a, 0x8a, 0x38, 0x2e,
+ 0x6f, 0xc9, 0x67, 0x16, 0x24, 0x68, 0xd8, 0x2a, 0xef, 0x1d, 0xef, 0x5d,
+ 0x31, 0x29, 0x2b, 0xa0, 0x91, 0x3c, 0xaa, 0x7b, 0x14, 0x29, 0x59, 0x54,
+ 0xc8, 0x38, 0x04, 0x8f, 0x60, 0x28, 0x4f, 0xef, 0x6f, 0x38, 0x6e, 0xab,
+ 0xab, 0x40, 0x97, 0x13, 0x92, 0x4b, 0x39, 0x9b, 0x45, 0xd8, 0x94, 0xb9,
+ 0x46, 0x9f, 0x5e, 0x37, 0xde, 0x6a, 0xc4, 0xb2, 0x51, 0x74, 0x3d, 0x5c,
+ 0x26, 0xa5, 0xb8, 0x67, 0xde, 0xe6, 0xd7, 0x4b, 0x2a, 0xf1, 0x58, 0x3e,
+ 0x03, 0x5c, 0x4e, 0x38, 0xb1, 0xe8, 0x8d, 0x5c, 0x99, 0x15, 0x9f, 0xd1,
+ 0xb0, 0xbc, 0x54, 0xac, 0xcc, 0x35, 0xdf, 0x77, 0xb1, 0xdd, 0xe7, 0xe5,
+ 0xc2, 0xff, 0xd6, 0x95, 0x7f, 0x96, 0x1e, 0x89, 0x76, 0x57, 0xec, 0x09,
+ 0x88, 0xa9, 0x7c, 0xbe, 0x96, 0x17, 0xf0, 0x2e, 0x78, 0x31, 0xd9, 0xb8,
+ 0xd2, 0xb7, 0x8c, 0xd3, 0x15, 0x21, 0xad, 0x08, 0x30, 0xc5, 0x8b, 0xca,
+ 0x4e, 0x6c, 0x19, 0x4a, 0x5a, 0x9f, 0x76, 0xcc, 0xcb, 0x3f, 0xbb, 0x25,
+ 0xfd, 0x60, 0xaf, 0x3f, 0xca, 0x52, 0x62, 0xdf, 0x7f, 0xdd, 0x90, 0xc6,
+ 0xf4, 0x8b, 0xb2, 0x31, 0xbe, 0xe2, 0x37, 0x2f, 0xa1, 0x6a, 0xd1, 0xda,
+ 0x9e, 0x1d, 0x7c, 0xb8, 0xfc, 0x26, 0x49, 0xf6, 0x88, 0xe1, 0xf9, 0x29,
+ 0xd9, 0x18, 0x10, 0x09, 0xad, 0x56, 0x5c, 0xd1, 0x41, 0xba, 0x48, 0xff,
+ 0xba, 0x28, 0xda, 0xcc, 0xde, 0x31, 0x2f, 0x3d, 0x2e, 0x50, 0xb9, 0x7b,
+ 0x39, 0x3f, 0xb8, 0x05, 0x25, 0xd6, 0xd2, 0x0f, 0xbc, 0x24, 0xfd, 0x3e,
+ 0xe6, 0x1d, 0x79, 0x6b, 0xab, 0x03, 0x9a, 0x75, 0x94, 0x96, 0x42, 0x7b,
+ 0x2b, 0xdd, 0x55, 0xe2, 0x1c, 0x8d, 0x9c, 0x56, 0x99, 0xb8, 0xfa, 0x9b,
+ 0x6e, 0x29, 0xa1, 0x8b, 0x77, 0x87, 0x9d, 0xe6, 0x5e, 0x7e, 0xf6, 0x62,
+ 0xe7, 0x77, 0xc4, 0xea, 0x95, 0xe4, 0x20, 0x11, 0x47, 0x42, 0x94, 0x2d,
+ 0xe6, 0xfb, 0x8a, 0xb2, 0x35, 0xd5, 0xd5, 0x50, 0xca, 0x43, 0x7e, 0x42,
+ 0x79, 0xdd, 0x4c, 0x08, 0xb7, 0xa5, 0x27, 0x9a, 0x46, 0xc7, 0xfa, 0xfe,
+ 0x7f, 0xfe, 0x57, 0x98, 0x4c, 0xfa, 0xe3, 0xcf, 0xec, 0x2d, 0xbe, 0x42,
+ 0xc1, 0x23, 0x07, 0x6e, 0x57, 0x39, 0x53, 0xbb, 0x2b, 0x99, 0x8e, 0xf4,
+ 0xc6, 0x1f, 0x36, 0x6c, 0x51, 0x02, 0x28, 0xfd, 0xd1, 0x54, 0x64, 0xbd,
+ 0x3d, 0xa5, 0x6f, 0xba, 0xb0, 0x95, 0xd4, 0x97, 0xb5, 0xfa, 0x80, 0x2b,
+ 0x93, 0x20, 0x3c, 0xfd, 0x93, 0x65, 0x45, 0x45, 0x94, 0x5c, 0x5f, 0x68,
+ 0xea, 0xd5, 0x61, 0x4e, 0x6e, 0x72, 0x46, 0x59, 0xa1, 0xff, 0xa4, 0x8b,
+ 0x22, 0x67, 0x37, 0x2f, 0x96, 0x38, 0x30, 0x05, 0x4a, 0xf4, 0x9f, 0x66,
+ 0x05, 0x7a, 0xcd, 0x7d, 0xf9, 0x5f, 0x6d, 0x67, 0xa6, 0x51, 0x31, 0xa8,
+ 0xc7, 0x1f, 0xff, 0xb0, 0x4b, 0x59, 0x30, 0xeb, 0xdd, 0x26, 0x18, 0xd0,
+ 0x6e, 0x57, 0xd5, 0x6a, 0x48, 0xab, 0x68, 0x32, 0xf5, 0x83, 0x94, 0x63,
+ 0xdb, 0x23, 0xc5, 0xf1, 0xbf, 0x50, 0x8d, 0xf9, 0xc7, 0xdd, 0xfe, 0x8b,
+ 0x9f, 0xed, 0x47, 0xff, 0xb0, 0xfb, 0xf1, 0x0f, 0x7b, 0xeb, 0xd1, 0x24,
+ 0x27, 0x97, 0xf3, 0xee, 0x61, 0x15, 0x49, 0x9f, 0x2d, 0x1e, 0x24, 0x35,
+ 0x41, 0x62, 0x8d, 0xae, 0x0a, 0x12, 0xca, 0x7c, 0x85, 0xbc, 0x40, 0xe4,
+ 0xba, 0xea, 0xa8, 0xaa, 0x5a, 0x08, 0x49, 0x85, 0xc3, 0x7d, 0xc9, 0x2f,
+ 0x8b, 0x5b, 0x45, 0x0a, 0x9b, 0x0a, 0x66, 0x3e, 0x10, 0x86, 0x45, 0xd6,
+ 0xde, 0x1b, 0xc4, 0x12, 0xa2, 0xd4, 0x12, 0xe1, 0x6c, 0x08, 0x40, 0xca,
+ 0x5c, 0x67, 0x69, 0xd2, 0x99, 0xf4, 0xd1, 0xc8, 0xfe, 0xa4, 0xc8, 0x82,
+ 0xe4, 0x23, 0x28, 0xc3, 0x4c, 0x68, 0x0c, 0x03, 0xce, 0x4a, 0x05, 0xf3,
+ 0xa6, 0x0d, 0x60, 0x4b, 0x5c, 0x0b, 0xbd, 0x77, 0x05, 0xde, 0xa8, 0xce,
+ 0x58, 0x57, 0x5a, 0xfc, 0x75, 0xa1, 0xd5, 0xf7, 0xdc, 0x8d, 0x62, 0x5a,
+ 0xca, 0x5d, 0x55, 0x56, 0xfe, 0x99, 0x44, 0x60, 0x28, 0xa9, 0x3d, 0xe1,
+ 0x32, 0x3c, 0xd1, 0xb4, 0xd4, 0x74, 0x44, 0x55, 0x8a, 0x5a, 0x35, 0x1f,
+ 0x68, 0x3e, 0x70, 0xeb, 0x8c, 0x1c, 0xc9, 0x52, 0x5a, 0x2f, 0x99, 0x10,
+ 0x7f, 0x2a, 0xbc, 0x49, 0x90, 0x89, 0xc2, 0xe4, 0xac, 0xf0, 0xec, 0x72,
+ 0x2a, 0x28, 0xe1, 0x48, 0x9b, 0xac, 0xef, 0xe5, 0x82, 0x22, 0xf5, 0x14,
+ 0x3f, 0xf5, 0xb0, 0x6e, 0x12, 0xe0, 0xeb, 0x07, 0x51, 0x49, 0xb3, 0x89,
+ 0x26, 0x0f, 0x46, 0x12, 0x32, 0xe7, 0xa4, 0x25, 0xb1, 0x53, 0x17, 0x81,
+ 0xc8, 0x1a, 0xb3, 0xcf, 0x36, 0xfa, 0x1b, 0xc9, 0xa6, 0x4b, 0xb7, 0x4a,
+ 0x26, 0x69, 0x7d, 0xb3, 0x15, 0x73, 0x44, 0x3a, 0xdf, 0x9f, 0x13, 0x54,
+ 0x23, 0xf1, 0x3d, 0xd0, 0x95, 0xc9, 0x12, 0x2a, 0x3a, 0x30, 0xbd, 0xb0,
+ 0xcf, 0x10, 0x30, 0x61, 0xc0, 0x60, 0x9f, 0xdd, 0x6c, 0xe2, 0xb9, 0xf1,
+ 0x7e, 0xd6, 0x47, 0x6e, 0x32, 0xff, 0xfc, 0x3f, 0xc2, 0x7b, 0x41, 0x9e,
+ 0x64, 0xcc, 0x57, 0x9f, 0x13, 0x7f, 0xdc, 0x45, 0x4a, 0xd1, 0xbc, 0xe4,
+ 0xf5, 0xfc, 0xa6, 0x32, 0xea, 0x5f, 0x98, 0x5f, 0x34, 0xfc, 0x26, 0x61,
+ 0xa2, 0x3f, 0xf3, 0x14, 0x3f, 0x63, 0x37, 0xc8, 0xdc, 0x91, 0xd9, 0xfd,
+ 0x8e, 0xdc, 0x70, 0x04, 0x27, 0xe9, 0xa7, 0x75, 0x3f, 0x50, 0x75, 0x82,
+ 0x8a, 0xc9, 0x64, 0x8d, 0x10, 0x8c, 0x91, 0x02, 0x6b, 0xc5, 0x18, 0xf5,
+ 0x03, 0x93, 0xed, 0xc1, 0x60, 0x9b, 0x04, 0xd6, 0xb6, 0xf9, 0xc3, 0x51,
+ 0x82, 0x03, 0x75, 0xdb, 0x2d, 0x69, 0x62, 0x36, 0x3a, 0xb0, 0x2b, 0xa0,
+ 0x88, 0x90, 0x0a, 0x60, 0x2e, 0xd0, 0x5e, 0xff, 0x6d, 0x01, 0x28, 0x6a,
+ 0x65, 0x14, 0xca, 0x8a, 0x13, 0x58, 0x67, 0xad, 0x3b, 0x32, 0x28, 0x24,
+ 0xc2, 0x9e, 0xf5, 0x5a, 0x68, 0x12, 0x9a, 0x9b, 0x4e, 0x5a, 0x15, 0xc3,
+ 0x68, 0x00, 0x10, 0xce, 0x1b, 0x65, 0xa8, 0x42, 0xe6, 0x70, 0xba, 0xd2,
+ 0xa0, 0x7b, 0xbe, 0xd7, 0x76, 0x7c, 0xcc, 0xf3, 0xc2, 0x98, 0x18, 0x46,
+ 0x35, 0x06, 0xfb, 0x20, 0x61, 0xf1, 0xc2, 0xbc, 0x15, 0xf6, 0xa6, 0x75,
+ 0x4a, 0x4a, 0x78, 0x85, 0x9b, 0xad, 0xc6, 0xa1, 0x2a, 0x36, 0xd3, 0x2f,
+ 0x72, 0x3c, 0x7f, 0x33, 0xb8, 0x2c, 0xf9, 0x23, 0x5b, 0x7c, 0x63, 0x0a,
+ 0x5a, 0x17, 0x1b, 0x22, 0xe3, 0xbb, 0x4d, 0x6a, 0xed, 0x8c, 0xe0, 0x40,
+ 0x21, 0x34, 0x10, 0xb4, 0x77, 0xb4, 0x16, 0x73, 0x7b, 0x58, 0x9f, 0x83,
+ 0xf5, 0x94, 0xb8, 0xb2, 0x29, 0x34, 0x66, 0x22, 0x70, 0x34, 0xf3, 0xfe,
+ 0xf6, 0xe8, 0x42, 0xd4, 0x13, 0x78, 0x20, 0x5c, 0xc9, 0xbb, 0xb0, 0xb6,
+ 0x33, 0x59, 0x32, 0x2f, 0x9f, 0xdb, 0xaa, 0x88, 0xf5, 0x4d, 0xba, 0xf7,
+ 0xe2, 0xa5, 0x74, 0x5b, 0x99, 0xa2, 0x70, 0x6f, 0x6f, 0xf0, 0xaf, 0xb6,
+ 0xb7, 0x39, 0x6c, 0x4e, 0xb6, 0x69, 0x20, 0x17, 0x52, 0x29, 0xed, 0xb8,
+ 0xf1, 0xe7, 0x8d, 0x28, 0x60, 0x4e, 0x35, 0x57, 0xb6, 0xdf, 0xc9, 0xfb,
+ 0x0c, 0x50, 0x9f, 0x4f, 0x91, 0xde, 0x6b, 0xb1, 0x86, 0x27, 0x92, 0xf1,
+ 0x1f, 0x68, 0x0d, 0x2d, 0xf6, 0x70, 0xa1, 0x56, 0xd0, 0x1a, 0x2b, 0x89,
+ 0x26, 0x61, 0x52, 0x1d, 0x79, 0x7f, 0x7e, 0x6a, 0x2e, 0xf7, 0x37, 0x0e,
+ 0xe9, 0x3b, 0x04, 0xfc, 0x46, 0xab, 0xe1, 0x35, 0x2c, 0x28, 0xd0, 0xbc,
+ 0x61, 0x4a, 0x3b, 0xda, 0x78, 0x1a, 0x76, 0x61, 0x97, 0x0c, 0x7a, 0x6a,
+ 0xbe, 0x10, 0xa4, 0x89, 0xe8, 0xbe, 0x50, 0x88, 0x14, 0x5b, 0xf4, 0x1e,
+ 0x4c, 0xd0, 0x9d, 0x16, 0x73, 0x1d, 0x54, 0x4d, 0x87, 0x7d, 0x25, 0x4e,
+ 0x3b, 0xab, 0xac, 0x21, 0x80, 0x89, 0x8d, 0xb3, 0x9c, 0x29, 0x87, 0xcc,
+ 0xda, 0x52, 0xe0, 0x27, 0x38, 0x07, 0x66, 0x2b, 0x6c, 0xd3, 0x3e, 0x10,
+ 0x63, 0x23, 0xa0, 0x33, 0x27, 0x27, 0xf3, 0xab, 0xc1, 0xce, 0x7e, 0x72,
+ 0x36, 0xcf, 0x0a, 0xb3, 0x06, 0xbd, 0xe4, 0xeb, 0x62, 0x41, 0x4b, 0x42,
+ 0xa3, 0xfe, 0x7a, 0xf8, 0x6d, 0xc0, 0x7f, 0x40, 0x6f, 0x3c, 0x7f, 0x46,
+ 0x6f, 0x9c, 0x0e, 0xf9, 0xa9, 0xfb, 0x72, 0x7a, 0x45, 0x55, 0x7a, 0x0f,
+ 0x1f, 0x52, 0xf3, 0x47, 0xec, 0xf1, 0xcf, 0xe8, 0x71, 0xb3, 0xf1, 0x26,
+ 0xcd, 0xb4, 0x8e, 0xfd, 0x1e, 0x1d, 0x38, 0x2f, 0xa7, 0x69, 0x05, 0xbf,
+ 0x2f, 0x6f, 0xbe, 0x15, 0x3d, 0x7e, 0xfe, 0x3c, 0xd2, 0xe3, 0xde, 0x92,
+ 0x0e, 0x0d, 0xfe, 0xf1, 0x1e, 0x9d, 0xc1, 0xf1, 0x47, 0x7f, 0x1b, 0xa5,
+ 0xe3, 0x5b, 0x6c, 0x45, 0xa0, 0xda, 0x2d, 0xa5, 0xea, 0xef, 0x29, 0xcd,
+ 0x39, 0xe3, 0xfe, 0x29, 0x65, 0x4a, 0x2a, 0xd0, 0x8e, 0x35, 0x48, 0xe5,
+ 0xfe, 0x6c, 0xef, 0xd9, 0xee, 0xf6, 0xcb, 0xc1, 0xf3, 0xc1, 0x9e, 0x45,
+ 0x99, 0x99, 0x8d, 0x75, 0x47, 0xa4, 0xf8, 0x14, 0xcf, 0x5f, 0x56, 0x53,
+ 0x2c, 0x2f, 0x4c, 0x3b, 0x14, 0xfa, 0xb7, 0x3f, 0x81, 0xe7, 0xc8, 0xe1,
+ 0x4b, 0x52, 0x22, 0x58, 0xf0, 0x73, 0x95, 0x62, 0x35, 0xa1, 0x88, 0xa7,
+ 0x80, 0x3a, 0x21, 0xce, 0x8e, 0x45, 0x85, 0x19, 0x18, 0xe5, 0xc6, 0x66,
+ 0x6e, 0xca, 0x05, 0x7c, 0xea, 0xe4, 0xc0, 0x51, 0x56, 0x69, 0xd1, 0x91,
+ 0xd8, 0x44, 0xa6, 0x33, 0x16, 0x73, 0x8e, 0x71, 0xef, 0x19, 0xcf, 0x4b,
+ 0x01, 0x22, 0x8d, 0xc6, 0x23, 0x25, 0x2a, 0xe7, 0xaa, 0xb4, 0xa8, 0x5f,
+ 0x60, 0xcc, 0x19, 0x14, 0x9f, 0xfe, 0xc6, 0x98, 0x1a, 0x77, 0xe4, 0x38,
+ 0x0e, 0x6a, 0x67, 0xb1, 0x4c, 0x61, 0xe2, 0x1c, 0x76, 0xfc, 0x0b, 0xc8,
+ 0x01, 0x73, 0x08, 0xdf, 0xae, 0xfc, 0x40, 0x08, 0x14, 0xe0, 0x01, 0xa1,
+ 0x2c, 0x6e, 0x1a, 0x77, 0x3f, 0xcc, 0x6e, 0xb5, 0x0e, 0x2f, 0xcf, 0x2b,
+ 0xc1, 0x24, 0x86, 0xc4, 0x9c, 0x4c, 0x09, 0x4c, 0xec, 0xe3, 0x66, 0x26,
+ 0x35, 0x9a, 0x46, 0x97, 0x8b, 0x16, 0x73, 0xc1, 0xac, 0x72, 0xd1, 0x45,
+ 0x69, 0x17, 0xf8, 0x5f, 0xdd, 0x1a, 0x6e, 0x72, 0x09, 0xc6, 0xea, 0x2c,
+ 0x75, 0x4a, 0x5d, 0x69, 0xab, 0xbf, 0x7a, 0x97, 0x3d, 0xfb, 0xed, 0x77,
+ 0xd9, 0xde, 0x53, 0x77, 0x99, 0xb7, 0xcd, 0xd8, 0x15, 0xb4, 0x62, 0xa3,
+ 0x99, 0x29, 0xe4, 0x22, 0xb7, 0xf1, 0x5d, 0xe6, 0x6d, 0x32, 0x17, 0xf6,
+ 0x6c, 0x6d, 0xb1, 0xf6, 0x1e, 0x73, 0x9b, 0x6c, 0xd9, 0x2e, 0xc3, 0x36,
+ 0xb3, 0xfb, 0xec, 0x91, 0x8d, 0xc6, 0x9e, 0xb6, 0xd5, 0xbb, 0xec, 0xb2,
+ 0x2d, 0x57, 0x56, 0xec, 0x31, 0x7f, 0x43, 0x3c, 0x79, 0x97, 0x39, 0xb7,
+ 0x17, 0xcb, 0x9d, 0x64, 0xc9, 0x46, 0xf3, 0xf7, 0xd9, 0xd2, 0x6a, 0x5e,
+ 0xbb, 0xaf, 0x62, 0xbb, 0xec, 0xd9, 0xaf, 0xde, 0x65, 0xcf, 0x7f, 0xfb,
+ 0x5d, 0xf6, 0xec, 0xff, 0xc9, 0xb2, 0xff, 0x5e, 0xb2, 0x6c, 0xf7, 0x17,
+ 0xcb, 0xb2, 0xbd, 0x4e, 0x60, 0xd3, 0xa8, 0xab, 0xec, 0x6f, 0xfe, 0x51,
+ 0xdd, 0xfe, 0xfb, 0xdb, 0xdb, 0x3f, 0xc3, 0x79, 0xb2, 0x4f, 0xf7, 0xf5,
+ 0xcf, 0x41, 0x69, 0xc6, 0x88, 0x5a, 0x3f, 0x3c, 0x3b, 0xfc, 0x76, 0x28,
+ 0x7e, 0x6b, 0x51, 0xbc, 0x54, 0x31, 0x63, 0x07, 0x9f, 0x51, 0xd7, 0x91,
+ 0x03, 0x1d, 0xe8, 0xfa, 0x5c, 0xbf, 0xad, 0xff, 0xa9, 0xa7, 0xbe, 0x63,
+ 0x40, 0x8e, 0xe4, 0x68, 0x83, 0xd3, 0x4c, 0xb2, 0x8b, 0x39, 0xd3, 0x41,
+ 0x5a, 0x5d, 0x4a, 0x5f, 0xc5, 0x1d, 0xb1, 0x1e, 0x74, 0xf1, 0x69, 0x14,
+ 0xde, 0x8b, 0x9b, 0xcd, 0x4d, 0x85, 0xdc, 0x0e, 0x3c, 0xba, 0xa5, 0x61,
+ 0xa3, 0x55, 0xbd, 0x93, 0x7e, 0x7d, 0x03, 0xf6, 0xd7, 0x79, 0x95, 0x2d,
+ 0xa9, 0x88, 0x7a, 0x79, 0xe3, 0xfd, 0x36, 0xac, 0xf4, 0xe8, 0xa6, 0x4b,
+ 0xb8, 0xcc, 0xbc, 0xf9, 0xa6, 0xf7, 0x82, 0x7c, 0x74, 0xa2, 0xeb, 0x05,
+ 0xc2, 0xd4, 0x12, 0x89, 0x4c, 0x51, 0xf8, 0x10, 0xa5, 0x0d, 0x74, 0x88,
+ 0xda, 0x08, 0x83, 0x97, 0x32, 0x94, 0x27, 0xa8, 0x9f, 0x9b, 0x26, 0x03,
+ 0xd8, 0x28, 0x7e, 0x91, 0xd2, 0x6f, 0xf8, 0xef, 0x2f, 0xe8, 0xbb, 0xe4,
+ 0xea, 0xe5, 0x7f, 0xdd, 0xd0, 0x3f, 0xa5, 0x96, 0x83, 0xd0, 0x25, 0xf9,
+ 0xab, 0x3c, 0x8e, 0x4f, 0xb4, 0x9f, 0x34, 0xa4, 0xea, 0x98, 0x31, 0x6f,
+ 0x03, 0x2a, 0x20, 0x8c, 0xda, 0x27, 0x5d, 0x5b, 0x82, 0x16, 0x34, 0xcd,
+ 0xa0, 0xe5, 0xe7, 0x71, 0x25, 0x31, 0xf3, 0x39, 0x15, 0x95, 0x3b, 0xc0,
+ 0x2f, 0xdf, 0xe3, 0x22, 0xa5, 0xb2, 0x00, 0x3d, 0xae, 0x10, 0x12, 0xd2,
+ 0x1e, 0x33, 0x5d, 0xbf, 0xf4, 0x7b, 0x77, 0xe7, 0xf3, 0xd0, 0xdb, 0xfc,
+ 0x41, 0x93, 0xda, 0x1c, 0xb1, 0x20, 0x00, 0x11, 0x80, 0x97, 0x8f, 0x5c,
+ 0x2a, 0x47, 0xec, 0xb3, 0x91, 0xbc, 0x37, 0x72, 0x00, 0x4c, 0x32, 0xb6,
+ 0x18, 0x47, 0x6c, 0xfa, 0x07, 0x95, 0xc5, 0x39, 0x8d, 0xb7, 0x86, 0x9c,
+ 0x14, 0x52, 0xdc, 0x44, 0xa2, 0xfa, 0x81, 0xb4, 0x20, 0xa4, 0x89, 0x06,
+ 0x9b, 0xbe, 0x74, 0x1c, 0x55, 0x7f, 0x7c, 0xbe, 0x43, 0xab, 0xaa, 0xad,
+ 0xa4, 0x5c, 0x62, 0x9b, 0xf7, 0xdc, 0x1f, 0x9f, 0xa5, 0x83, 0x7f, 0x22,
+ 0xe9, 0xd0, 0x8b, 0xb6, 0x2b, 0xe1, 0x0f, 0x72, 0xc6, 0xaf, 0x89, 0x19,
+ 0xa5, 0x3f, 0x4a, 0xab, 0x48, 0x0a, 0x85, 0xbd, 0x0b, 0x84, 0x52, 0xc3,
+ 0xe3, 0x02, 0xd7, 0x37, 0xb9, 0x66, 0xb5, 0xe0, 0xe2, 0xed, 0x0f, 0xc3,
+ 0xe6, 0x3a, 0x15, 0xdd, 0xd5, 0x61, 0xd2, 0x0b, 0x78, 0xa0, 0xd2, 0x69,
+ 0x8f, 0xa2, 0x78, 0x11, 0xb6, 0x20, 0xac, 0x8e, 0xff, 0x09, 0xe2, 0x73,
+ 0xba, 0xf7, 0x1c, 0x09, 0x4c, 0xc6, 0x7e, 0x05, 0x7f, 0xbd, 0x43, 0x5f,
+ 0x90, 0xe9, 0x4d, 0xd1, 0xd8, 0xd8, 0x6d, 0x56, 0x8f, 0x2b, 0x2a, 0x6f,
+ 0x22, 0x05, 0x02, 0xd0, 0xd6, 0x9c, 0x08, 0xf1, 0xcc, 0x35, 0x76, 0x9d,
+ 0x69, 0xfa, 0xa4, 0x1d, 0xb4, 0x52, 0x64, 0x80, 0x17, 0x63, 0x10, 0x01,
+ 0x25, 0x3b, 0xd0, 0x91, 0x16, 0xe0, 0x4c, 0x85, 0x44, 0x83, 0x5e, 0x75,
+ 0x94, 0x71, 0x3a, 0x19, 0xea, 0x28, 0x8c, 0x80, 0x4d, 0x68, 0x0c, 0x76,
+ 0x08, 0x8c, 0x1a, 0x47, 0x0a, 0xc2, 0xee, 0xce, 0xde, 0x73, 0x26, 0x1f,
+ 0xb1, 0x5f, 0xab, 0x3a, 0x46, 0x17, 0xf2, 0x78, 0xf5, 0x08, 0xbf, 0xd6,
+ 0xb3, 0xff, 0xc5, 0xa3, 0x28, 0x7d, 0x2b, 0x25, 0xae, 0xc4, 0xe1, 0x42,
+ 0x67, 0x04, 0x59, 0x1b, 0xcc, 0x0b, 0x3c, 0xbe, 0xc9, 0x66, 0x52, 0xc3,
+ 0xe2, 0x17, 0x96, 0x9f, 0xee, 0xf4, 0x89, 0xf1, 0x6b, 0x57, 0xcd, 0x7c,
+ 0x30, 0x2b, 0xff, 0x6e, 0xe6, 0x23, 0x1d, 0x94, 0xd5, 0x75, 0xb0, 0x73,
+ 0x29, 0x39, 0xb1, 0xe0, 0xd9, 0x83, 0x60, 0x5c, 0x14, 0xd6, 0x66, 0x75,
+ 0x82, 0x56, 0x19, 0x9c, 0x91, 0x9c, 0x9e, 0x1c, 0x9a, 0x1e, 0x1f, 0x7d,
+ 0xfc, 0x70, 0x3a, 0xfc, 0x70, 0xde, 0x3d, 0xa0, 0xe7, 0x67, 0x17, 0x97,
+ 0x47, 0x6f, 0x3f, 0x9e, 0x5f, 0x9c, 0x5d, 0x9e, 0x1d, 0x9e, 0x9d, 0x24,
+ 0x9b, 0xbb, 0x5b, 0x2b, 0x73, 0xb1, 0xac, 0xbb, 0xc4, 0xa3, 0xb0, 0xd3,
+ 0xfe, 0xb3, 0x68, 0xb1, 0x5d, 0xd8, 0xa4, 0xf1, 0x84, 0xad, 0x7d, 0x2f,
+ 0x5b, 0xa0, 0x45, 0x0a, 0x0c, 0x9f, 0x09, 0xee, 0x20, 0xc8, 0xde, 0x34,
+ 0xb9, 0x5e, 0xf0, 0x66, 0x96, 0x60, 0xbc, 0x26, 0xaa, 0xd4, 0x4d, 0x70,
+ 0x63, 0x64, 0x99, 0x44, 0x04, 0xbd, 0x34, 0x9e, 0x95, 0xae, 0xc3, 0x17,
+ 0x5d, 0xd5, 0x82, 0xd6, 0x00, 0x1a, 0xa3, 0xdb, 0x15, 0x75, 0x7c, 0x5b,
+ 0xd8, 0x7d, 0xc1, 0xcc, 0x1f, 0xe0, 0x47, 0xb6, 0xaf, 0x80, 0x3e, 0x5e,
+ 0x22, 0x34, 0xa6, 0xcb, 0xaa, 0x83, 0x0e, 0x92, 0xf3, 0xb0, 0xd0, 0x8b,
+ 0xbc, 0x31, 0xc9, 0x0a, 0xa9, 0xae, 0x27, 0xfd, 0x40, 0x80, 0x8e, 0xa6,
+ 0x57, 0xe2, 0xc5, 0xe6, 0x01, 0xfa, 0xad, 0x37, 0x57, 0x48, 0x0e, 0xcd,
+ 0x02, 0xef, 0x36, 0xbf, 0xcd, 0xbc, 0x18, 0xf7, 0x5e, 0x9f, 0xa8, 0x3d,
+ 0xd2, 0x9d, 0x40, 0x50, 0x17, 0x11, 0x84, 0x47, 0x1a, 0xfe, 0xe1, 0x44,
+ 0x1c, 0xe8, 0x81, 0xd0, 0x32, 0x94, 0x10, 0x66, 0xe8, 0x8f, 0xe5, 0x91,
+ 0x8d, 0xcc, 0x93, 0x48, 0x7e, 0xf8, 0x1e, 0xad, 0x7d, 0x8f, 0x37, 0x74,
+ 0x58, 0x4e, 0xbd, 0xdb, 0x8a, 0x43, 0x2c, 0xfa, 0xde, 0x33, 0x74, 0x88,
+ 0x7c, 0xfa, 0x6e, 0x34, 0x5e, 0x57, 0x34, 0x17, 0xd3, 0x5c, 0x01, 0x61,
+ 0x75, 0xf8, 0xd4, 0xc2, 0x9f, 0x27, 0x52, 0x21, 0x51, 0x18, 0x71, 0x89,
+ 0x64, 0xc3, 0x28, 0xe1, 0xfb, 0x16, 0x08, 0x45, 0xc8, 0xa0, 0x84, 0x93,
+ 0xec, 0x59, 0x11, 0x1b, 0x1e, 0x9e, 0x47, 0x48, 0x1e, 0xbc, 0xac, 0x7b,
+ 0x96, 0x8a, 0x5a, 0x05, 0x74, 0x67, 0xb0, 0x93, 0x0c, 0xdf, 0x7f, 0x25,
+ 0xd4, 0x7e, 0x5f, 0x0d, 0x99, 0x28, 0x99, 0x54, 0x61, 0x7d, 0x63, 0x10,
+ 0xa7, 0x4f, 0x82, 0xf0, 0x98, 0x4a, 0x1c, 0xfb, 0x4f, 0xa9, 0xcb, 0x62,
+ 0xab, 0x85, 0x64, 0xd5, 0x8d, 0x3a, 0xe1, 0x4c, 0x6a, 0x1e, 0x77, 0x2f,
+ 0x9a, 0xa8, 0xce, 0xe1, 0x19, 0x2a, 0x81, 0x19, 0x1d, 0xf7, 0x60, 0x35,
+ 0x91, 0xd4, 0x5e, 0x70, 0x1e, 0x9e, 0x78, 0x12, 0x9e, 0x72, 0x14, 0x44,
+ 0xef, 0x50, 0xa9, 0xdc, 0x9d, 0x8e, 0xf3, 0xd6, 0x56, 0xcd, 0x28, 0x1b,
+ 0x87, 0x41, 0x89, 0xd9, 0x15, 0x14, 0x2d, 0xe4, 0xc9, 0xf5, 0xf0, 0x4b,
+ 0x04, 0xd6, 0x2c, 0x74, 0x2a, 0x4e, 0xb7, 0x84, 0x46, 0xd2, 0xb1, 0xaf,
+ 0xb9, 0x2a, 0x01, 0x59, 0x77, 0x0e, 0xfe, 0x84, 0x82, 0x8b, 0xcc, 0xbe,
+ 0xca, 0x37, 0xa8, 0x70, 0x2c, 0x80, 0xf4, 0x2f, 0xd7, 0xd0, 0x99, 0x77,
+ 0x96, 0xa6, 0x94, 0x79, 0xf7, 0xc0, 0x49, 0x7b, 0x41, 0x86, 0x01, 0xb4,
+ 0x9d, 0x09, 0x69, 0xee, 0x0e, 0x20, 0xae, 0xbb, 0x1a, 0x25, 0x88, 0x12,
+ 0xa1, 0x0b, 0xad, 0x54, 0x7d, 0x09, 0x65, 0x63, 0x3f, 0x49, 0xde, 0x66,
+ 0xc5, 0x43, 0xbb, 0x43, 0x3d, 0x30, 0x65, 0xc0, 0x25, 0x9c, 0x37, 0x2e,
+ 0x99, 0x5b, 0xf0, 0x8c, 0x14, 0x00, 0xb5, 0x5d, 0x0c, 0xbb, 0xd4, 0xee,
+ 0x73, 0x4c, 0x02, 0xbc, 0xb1, 0xd3, 0xa0, 0xd8, 0x1a, 0x7f, 0x32, 0x36,
+ 0xc1, 0xc9, 0xa0, 0xd1, 0x3f, 0x7c, 0xf2, 0x29, 0xd3, 0x00, 0x4e, 0x35,
+ 0x18, 0x30, 0xf5, 0x62, 0xf4, 0x57, 0x3a, 0xae, 0x50, 0xda, 0xa7, 0x29,
+ 0xec, 0x55, 0x9e, 0x08, 0x85, 0xc4, 0x91, 0xb5, 0x6c, 0x9e, 0xe2, 0x88,
+ 0x55, 0xe8, 0x9a, 0xa6, 0x3a, 0x25, 0x08, 0x4b, 0x2a, 0x85, 0x74, 0x7b,
+ 0x17, 0xa0, 0x4f, 0xd1, 0x54, 0xa8, 0x6c, 0xc9, 0xe5, 0xab, 0x5b, 0xbc,
+ 0x7f, 0x45, 0xd2, 0x89, 0x91, 0x56, 0x9d, 0x6b, 0x8c, 0x67, 0x93, 0xe1,
+ 0x7d, 0x16, 0x6c, 0x4a, 0x8f, 0x2f, 0x6d, 0x4b, 0x65, 0x5e, 0xdd, 0xfb,
+ 0x13, 0xfd, 0x11, 0x8e, 0xa2, 0x15, 0x9c, 0xa1, 0x79, 0xd6, 0xd3, 0x4e,
+ 0x8f, 0x43, 0x7c, 0xe0, 0xf5, 0x65, 0x1f, 0x78, 0xe3, 0x04, 0xea, 0xea,
+ 0xb6, 0x21, 0x7b, 0x9e, 0xf2, 0x81, 0x0f, 0x85, 0xf2, 0x98, 0xe9, 0xfe,
+ 0x9e, 0x5b, 0x06, 0xf1, 0xfb, 0xb4, 0x2a, 0x00, 0x26, 0xf7, 0x35, 0x7f,
+ 0xe2, 0xbe, 0x98, 0x4b, 0x79, 0x81, 0xf4, 0x8a, 0x70, 0xb8, 0x55, 0xe6,
+ 0xe8, 0x4e, 0xc9, 0xbd, 0xc6, 0x14, 0x37, 0xc2, 0xa1, 0xac, 0xa8, 0xd0,
+ 0x79, 0xd9, 0x30, 0x9b, 0x33, 0x01, 0x77, 0x49, 0x67, 0xa8, 0xc8, 0xc5,
+ 0xe2, 0x4d, 0xb2, 0xea, 0x84, 0xd4, 0x9a, 0xdd, 0x4d, 0x70, 0x76, 0x2d,
+ 0xe6, 0xb4, 0x3f, 0x14, 0x53, 0x25, 0x21, 0x57, 0x4f, 0xce, 0xc8, 0x17,
+ 0x19, 0x7d, 0x05, 0xd7, 0x90, 0x25, 0x7d, 0xbe, 0x2b, 0x73, 0xc2, 0x50,
+ 0xad, 0xd9, 0x2b, 0xc1, 0xe8, 0x41, 0x6e, 0x97, 0x5c, 0x86, 0x05, 0x09,
+ 0x60, 0x4f, 0x58, 0xc4, 0x8b, 0x18, 0x14, 0x0e, 0x11, 0x9c, 0xd6, 0xad,
+ 0x54, 0x9f, 0xbc, 0x85, 0x0d, 0x06, 0x34, 0xc2, 0x28, 0xfc, 0x44, 0xb2,
+ 0x66, 0xf6, 0x64, 0x91, 0x36, 0x7a, 0x60, 0x3c, 0x89, 0x48, 0xdd, 0x03,
+ 0x5a, 0xad, 0x20, 0x25, 0x7f, 0x6c, 0xd9, 0x87, 0xba, 0x84, 0xcd, 0xed,
+ 0xb2, 0xb2, 0xf6, 0x56, 0xb5, 0x08, 0x4e, 0xa7, 0x30, 0x0e, 0x1e, 0x11,
+ 0xe3, 0x9f, 0x1e, 0x14, 0x32, 0xb6, 0x5a, 0x99, 0x99, 0x53, 0x3a, 0x2f,
+ 0x15, 0xdf, 0xc9, 0x1b, 0xac, 0x58, 0x07, 0xb3, 0xaa, 0x58, 0x4e, 0x29,
+ 0xf3, 0x30, 0x5b, 0x74, 0x8f, 0x7c, 0xa1, 0x21, 0x3a, 0x8b, 0xd0, 0x61,
+ 0x42, 0x27, 0xe8, 0x11, 0xe2, 0x96, 0x60, 0x06, 0x7b, 0x18, 0xa5, 0x4a,
+ 0xeb, 0x8f, 0xb2, 0xb5, 0x14, 0xb5, 0x8b, 0x3b, 0xfb, 0xb6, 0x2d, 0x9b,
+ 0x8b, 0xd9, 0x30, 0xc5, 0xa4, 0x6f, 0x84, 0xc0, 0x7c, 0x85, 0xe3, 0xc9,
+ 0xf9, 0x66, 0x5a, 0x60, 0x57, 0x9f, 0x3e, 0x82, 0x7f, 0xc2, 0x90, 0x3a,
+ 0x99, 0xbb, 0x10, 0x2c, 0x6e, 0x54, 0x82, 0x67, 0xb1, 0x99, 0x8c, 0x81,
+ 0xf6, 0x96, 0x54, 0x94, 0x8f, 0xf1, 0xda, 0x6b, 0x36, 0x17, 0x26, 0x50,
+ 0x27, 0x6c, 0x19, 0xc0, 0x89, 0xa7, 0x4f, 0x66, 0xee, 0x03, 0x27, 0x53,
+ 0xa1, 0x4d, 0xd8, 0x3b, 0x85, 0xc0, 0xa4, 0xbd, 0x6f, 0xb1, 0xaf, 0x26,
+ 0x98, 0x47, 0xf0, 0x2b, 0x31, 0x45, 0x3a, 0x3f, 0x27, 0xd7, 0x92, 0x4b,
+ 0x7b, 0xec, 0x76, 0x52, 0xb9, 0xa7, 0x23, 0xce, 0x0f, 0xc8, 0x49, 0x7c,
+ 0x88, 0x3a, 0x96, 0xaf, 0x64, 0x2e, 0x58, 0xb2, 0x18, 0x31, 0xd2, 0x8e,
+ 0x49, 0x07, 0x81, 0xaa, 0x3f, 0xe7, 0xea, 0xc9, 0x71, 0xd8, 0xdb, 0x50,
+ 0xce, 0x9b, 0xd6, 0x58, 0x86, 0x9c, 0x56, 0xcc, 0xa1, 0xe7, 0x0d, 0xe3,
+ 0x3a, 0x3b, 0x9f, 0x9a, 0x47, 0xbc, 0xe2, 0xf2, 0x3d, 0x04, 0xe9, 0x15,
+ 0x57, 0x22, 0x0d, 0xbb, 0x7f, 0xba, 0xdf, 0x9a, 0xd1, 0xc5, 0x84, 0x34,
+ 0xad, 0xd5, 0x72, 0xb7, 0x42, 0xfb, 0x2b, 0xaf, 0xcd, 0x89, 0x5e, 0x35,
+ 0x28, 0x3c, 0xf4, 0x6b, 0x06, 0xd5, 0xaa, 0x47, 0x2d, 0x63, 0x90, 0x3e,
+ 0x77, 0x56, 0x84, 0x3f, 0xb2, 0xd2, 0x09, 0xbb, 0x64, 0x08, 0xa6, 0xcd,
+ 0x15, 0x15, 0x31, 0xbd, 0x61, 0xd8, 0x07, 0x7f, 0xe9, 0x48, 0x1e, 0x9f,
+ 0x46, 0x6c, 0x0d, 0xfa, 0xef, 0x8f, 0xfb, 0xf0, 0x7b, 0x4d, 0x7e, 0x5e,
+ 0xda, 0x8f, 0xa3, 0x9e, 0xf4, 0xe5, 0x77, 0xe8, 0x46, 0x3e, 0xbf, 0x21,
+ 0xaf, 0xc6, 0xeb, 0x58, 0x96, 0x8d, 0x37, 0x11, 0xf2, 0xd8, 0x6f, 0xff,
+ 0xfd, 0x6a, 0xea, 0x88, 0x6d, 0x56, 0x7c, 0x5f, 0x1e, 0xfb, 0xcd, 0xbf,
+ 0xcf, 0x67, 0x77, 0xf5, 0xe5, 0x62, 0xa5, 0xe2, 0x5b, 0x81, 0x32, 0xb7,
+ 0x25, 0x8e, 0xbb, 0x55, 0x7e, 0x85, 0x50, 0x14, 0x74, 0x74, 0x28, 0x15,
+ 0xe5, 0x5b, 0xd1, 0x4a, 0x03, 0xbe, 0x58, 0xfc, 0x4d, 0x24, 0x18, 0x44,
+ 0x73, 0x38, 0x39, 0x52, 0xfa, 0xe3, 0x35, 0xff, 0xb9, 0xfd, 0x65, 0x6c,
+ 0x8d, 0x94, 0x12, 0xf5, 0x88, 0xae, 0x41, 0x2d, 0x16, 0x82, 0xfa, 0x13,
+ 0x4c, 0x15, 0x20, 0x2a, 0xaf, 0xad, 0x9c, 0x40, 0x93, 0xa5, 0x58, 0x11,
+ 0x7a, 0x35, 0x56, 0xa1, 0x44, 0x66, 0x88, 0x00, 0xa3, 0x64, 0x82, 0x59,
+ 0x1e, 0x69, 0x8b, 0x14, 0x22, 0xc5, 0x23, 0xf3, 0x3e, 0x58, 0x5b, 0x56,
+ 0x96, 0x58, 0x5c, 0xcb, 0xaf, 0xf4, 0xe8, 0x68, 0x4b, 0xbf, 0xe9, 0x49,
+ 0x85, 0x10, 0xd3, 0x1c, 0x6d, 0x2b, 0x41, 0x4c, 0xea, 0x7e, 0xc2, 0x72,
+ 0x86, 0xf4, 0x2e, 0x8c, 0x84, 0x27, 0xdd, 0x74, 0xca, 0xc0, 0xdc, 0xe4,
+ 0xf0, 0xec, 0xf4, 0xf4, 0xe8, 0xb0, 0x1b, 0xce, 0x03, 0x6d, 0x05, 0x92,
+ 0x0f, 0x40, 0xb3, 0x2e, 0xaa, 0x7e, 0x50, 0xa1, 0x0e, 0x5f, 0x67, 0xea,
+ 0x71, 0xcb, 0xa9, 0xc4, 0x3d, 0x40, 0xfd, 0x9a, 0x54, 0xa8, 0x59, 0x39,
+ 0x87, 0xc1, 0xe3, 0xed, 0xe4, 0x1d, 0x10, 0x49, 0xec, 0x0a, 0xf6, 0x83,
+ 0xf3, 0x46, 0xc0, 0x2d, 0x45, 0xe5, 0x0b, 0x59, 0x03, 0x85, 0x89, 0xa9,
+ 0x3d, 0xe0, 0x2a, 0x7e, 0x93, 0xc9, 0xb6, 0x00, 0x97, 0x25, 0x25, 0x2e,
+ 0x34, 0x66, 0xec, 0x5e, 0x66, 0xa6, 0x2f, 0xca, 0x10, 0xe9, 0x97, 0x57,
+ 0x5c, 0x2c, 0x73, 0x96, 0x56, 0xb7, 0x14, 0x0d, 0xf4, 0x72, 0x45, 0x90,
+ 0x2b, 0x08, 0xde, 0xe1, 0xc9, 0x24, 0x96, 0x84, 0x0e, 0x17, 0xb3, 0x62,
+ 0xe3, 0x91, 0x8b, 0xc6, 0x1d, 0x92, 0xea, 0x72, 0xfb, 0x9a, 0xc4, 0x47,
+ 0xaf, 0x17, 0xd9, 0x3d, 0x7d, 0x86, 0xb9, 0x37, 0x28, 0x93, 0x3c, 0x64,
+ 0xab, 0x67, 0x86, 0x64, 0x76, 0xa3, 0x3f, 0x48, 0x12, 0x3b, 0xad, 0xd5,
+ 0x8c, 0xd9, 0xe0, 0xc1, 0xc5, 0x4b, 0x25, 0x96, 0x38, 0x01, 0x24, 0x98,
+ 0xab, 0x6f, 0x94, 0x4c, 0xcf, 0x8b, 0xb8, 0x29, 0x87, 0x88, 0x9f, 0xd9,
+ 0xc1, 0x38, 0x6f, 0xc9, 0x91, 0xf1, 0x68, 0xf6, 0x96, 0x85, 0x7c, 0x31,
+ 0xdf, 0x58, 0x08, 0xb2, 0x57, 0x6a, 0x47, 0xbd, 0x23, 0xb5, 0xe8, 0xfc,
+ 0x5d, 0x1f, 0x9c, 0x67, 0x22, 0x82, 0x86, 0xe1, 0x0c, 0x21, 0xf6, 0xa2,
+ 0x4b, 0xf4, 0x0a, 0x0e, 0x24, 0x38, 0x1c, 0x89, 0xfc, 0xec, 0x7a, 0xc1,
+ 0xd9, 0x6e, 0x04, 0x09, 0xc0, 0x71, 0x0d, 0x14, 0x5d, 0x20, 0x4f, 0x91,
+ 0x06, 0xd6, 0xd3, 0xaa, 0xce, 0xb4, 0x5f, 0xcd, 0x04, 0xd3, 0x52, 0xc8,
+ 0xf4, 0x2b, 0x95, 0x09, 0xfb, 0xdd, 0xe5, 0x08, 0xe7, 0xc5, 0x7c, 0xd1,
+ 0x04, 0xb1, 0x33, 0x22, 0x76, 0xe2, 0x64, 0xfe, 0x2f, 0xfb, 0x61, 0xbd,
+ 0x9f, 0x74, 0xe2, 0xaf, 0x2a, 0x44, 0x38, 0xac, 0xff, 0xba, 0x31, 0x02,
+ 0x60, 0xa5, 0x97, 0xd6, 0xb7, 0x69, 0x9c, 0x51, 0x23, 0x18, 0x71, 0x9c,
+ 0x15, 0x6f, 0xbb, 0x6e, 0xc3, 0xbd, 0xd0, 0xdd, 0x0d, 0xf6, 0x2d, 0x15,
+ 0x12, 0xab, 0xa8, 0x3b, 0x40, 0x2e, 0xd8, 0x91, 0x7f, 0xc6, 0xce, 0x21,
+ 0xef, 0x53, 0xb6, 0xec, 0x5a, 0xba, 0xed, 0x81, 0x02, 0x92, 0x1f, 0xfa,
+ 0xed, 0xef, 0xa6, 0xd5, 0x75, 0xbb, 0xdd, 0xe5, 0x68, 0x9f, 0xfb, 0x3d,
+ 0x7a, 0x10, 0x2d, 0x84, 0xdd, 0xfa, 0xf6, 0xd3, 0x3f, 0x1b, 0xb0, 0xdc,
+ 0x3d, 0xe2, 0x97, 0x73, 0x37, 0xef, 0xa3, 0x24, 0x8e, 0x90, 0xba, 0x01,
+ 0x1e, 0xd5, 0xbb, 0x93, 0x57, 0xde, 0xc2, 0x2e, 0x69, 0xdf, 0xbf, 0x88,
+ 0x23, 0x31, 0xea, 0x58, 0x47, 0x24, 0xca, 0xfc, 0xb4, 0x4b, 0xf9, 0xd1,
+ 0x4b, 0xb8, 0x95, 0xf3, 0xd9, 0x85, 0x43, 0xd9, 0x9c, 0xaf, 0xa7, 0x4f,
+ 0x1c, 0x25, 0xbc, 0xfd, 0x96, 0x0a, 0x0b, 0x12, 0xcd, 0x5a, 0xea, 0x0a,
+ 0x3e, 0xd1, 0x9a, 0x84, 0xa7, 0xdc, 0x4b, 0xc1, 0x94, 0xb8, 0x35, 0x88,
+ 0x68, 0x2b, 0xe1, 0x2c, 0xac, 0x42, 0xbb, 0xbb, 0xed, 0x89, 0xa7, 0x7e,
+ 0xf3, 0x63, 0x41, 0xf0, 0x96, 0x7c, 0x2c, 0x30, 0xfe, 0xd7, 0x8f, 0xd3,
+ 0x31, 0x06, 0x5c, 0x56, 0x5e, 0xe4, 0x49, 0xda, 0x62, 0xc1, 0x6c, 0x15,
+ 0x90, 0x80, 0x5c, 0x45, 0xa0, 0xc9, 0x11, 0xe0, 0x8a, 0x1f, 0x17, 0x7a,
+ 0x16, 0xed, 0x6d, 0x3d, 0xed, 0xa3, 0x07, 0x94, 0x63, 0x17, 0xe8, 0xba,
+ 0x6e, 0xae, 0x3a, 0xcf, 0xfd, 0xf6, 0xd3, 0xd6, 0x4c, 0x6b, 0x5a, 0xcb,
+ 0xa7, 0x88, 0x34, 0xff, 0xd1, 0xdf, 0xa3, 0x1f, 0x16, 0x69, 0xf0, 0x9a,
+ 0x61, 0x04, 0x2b, 0x7b, 0x62, 0x1f, 0xfe, 0x3d, 0x7a, 0x82, 0xb4, 0xbd,
+ 0xe8, 0x1e, 0x6a, 0xf5, 0x01, 0x8f, 0xfd, 0x1e, 0xdf, 0xbf, 0xdb, 0x5d,
+ 0xf6, 0x59, 0x94, 0xd3, 0xc2, 0x13, 0xbf, 0xe1, 0x87, 0x3f, 0x58, 0xa3,
+ 0x84, 0xb3, 0x1c, 0x5f, 0xd3, 0x7f, 0xf7, 0x75, 0x86, 0x57, 0xd5, 0xe9,
+ 0x58, 0xc2, 0x0c, 0xeb, 0x15, 0x09, 0x0d, 0xd2, 0x79, 0x9f, 0x04, 0xfc,
+ 0xb2, 0x45, 0xac, 0x85, 0x67, 0x5a, 0x89, 0x23, 0x13, 0x10, 0xfa, 0xf6,
+ 0x95, 0x6f, 0x86, 0x33, 0xab, 0x39, 0xd5, 0x9d, 0x13, 0x97, 0x85, 0x79,
+ 0xa1, 0x4b, 0xb6, 0x61, 0xc5, 0x98, 0xe9, 0x51, 0x4c, 0xfa, 0x0a, 0x4e,
+ 0xea, 0xc1, 0x96, 0xfc, 0x42, 0xea, 0x88, 0x95, 0xdd, 0x41, 0x6c, 0x78,
+ 0xca, 0xbc, 0x4c, 0xab, 0xa9, 0x71, 0xa5, 0x1a, 0xba, 0xe3, 0x28, 0x18,
+ 0xb1, 0xd9, 0x14, 0x54, 0x1e, 0x90, 0xa8, 0x9d, 0xe3, 0x4c, 0x9b, 0xba,
+ 0xbc, 0x56, 0xab, 0x7c, 0xed, 0x27, 0xeb, 0xfd, 0x0f, 0xc9, 0xfe, 0xfa,
+ 0xef, 0x08, 0x20, 0xf7, 0x8c, 0xd3, 0x5f, 0x80, 0x87, 0x6b, 0x57, 0x1e,
+ 0x58, 0x85, 0x0e, 0xf3, 0x10, 0x42, 0x41, 0x3a, 0x6e, 0x1c, 0x16, 0x76,
+ 0x45, 0x1c, 0x9d, 0xc9, 0x69, 0x77, 0x01, 0x22, 0x00, 0x2b, 0x8a, 0x50,
+ 0x73, 0x40, 0xd8, 0x8e, 0xae, 0x41, 0x72, 0x1a, 0x32, 0x7d, 0x7d, 0x97,
+ 0xf1, 0x87, 0xa0, 0xae, 0x9f, 0x83, 0x8d, 0x2d, 0x07, 0x8a, 0x79, 0x38,
+ 0x31, 0xc0, 0x25, 0xd9, 0x72, 0x46, 0x21, 0xe4, 0xc0, 0x20, 0x05, 0x9b,
+ 0x21, 0x63, 0xc4, 0x14, 0x22, 0xe6, 0x23, 0xc4, 0x92, 0xcd, 0x4b, 0xcf,
+ 0x85, 0xef, 0xd8, 0x87, 0xc8, 0xee, 0x8a, 0x3b, 0x8f, 0xb1, 0x0f, 0x41,
+ 0x47, 0xfb, 0x59, 0x50, 0xbb, 0xc7, 0x3f, 0xfa, 0xda, 0xd4, 0x5d, 0x9e,
+ 0x72, 0x54, 0x86, 0xa7, 0x51, 0x3e, 0xc4, 0xf3, 0xa9, 0x05, 0x0c, 0x57,
+ 0xba, 0xe7, 0x38, 0x65, 0x3b, 0x92, 0xe6, 0x71, 0x3a, 0x1c, 0x86, 0x50,
+ 0xb1, 0xa2, 0xca, 0xc6, 0xe5, 0x75, 0x91, 0xff, 0x9d, 0x5a, 0x84, 0x67,
+ 0xb3, 0x0b, 0x1e, 0x69, 0x81, 0xf5, 0xd4, 0x53, 0x4f, 0x0c, 0x1e, 0x14,
+ 0x3f, 0xe9, 0xae, 0x86, 0x72, 0x89, 0x90, 0x90, 0xa2, 0x40, 0x2e, 0x51,
+ 0x20, 0xc8, 0x3c, 0x72, 0xb5, 0x5a, 0xe6, 0x73, 0x97, 0x5c, 0x1a, 0x1d,
+ 0x9d, 0x7c, 0x38, 0x58, 0x5c, 0xdd, 0x15, 0x02, 0x02, 0x5a, 0xc2, 0x11,
+ 0x90, 0x25, 0xbf, 0x02, 0x5c, 0x87, 0x22, 0x2d, 0xbf, 0x1c, 0x5a, 0x17,
+ 0xcf, 0xdf, 0x47, 0xb5, 0x6c, 0x3a, 0x1a, 0x71, 0x86, 0x14, 0x65, 0x0f,
+ 0x88, 0x94, 0x84, 0xb9, 0x71, 0x80, 0x48, 0x16, 0xbc, 0x4f, 0xe2, 0x49,
+ 0x31, 0x0d, 0x71, 0x56, 0x55, 0x78, 0xb6, 0xba, 0x1c, 0x29, 0xd6, 0xf9,
+ 0xf1, 0x04, 0x72, 0x14, 0xb2, 0xee, 0x95, 0xde, 0x52, 0x8c, 0x6c, 0x30,
+ 0x3f, 0xdb, 0xaa, 0xe4, 0x25, 0x57, 0x01, 0xf7, 0x8e, 0x24, 0x1f, 0xd8,
+ 0x68, 0x59, 0xa2, 0x39, 0x51, 0x87, 0x83, 0xb4, 0x6e, 0x64, 0xb1, 0xd0,
+ 0x0d, 0xb3, 0xff, 0xa3, 0x81, 0x01, 0x51, 0x78, 0x10, 0xde, 0x58, 0xed,
+ 0x79, 0xf3, 0x6b, 0xc2, 0x31, 0xeb, 0xae, 0xe8, 0x6e, 0x2d, 0x47, 0x35,
+ 0x6a, 0xbb, 0xc8, 0xc1, 0x23, 0x31, 0xfc, 0x6d, 0x1d, 0x0d, 0xc7, 0x28,
+ 0x8c, 0xe4, 0x41, 0x29, 0x31, 0x1c, 0xb2, 0x9a, 0xe9, 0x34, 0x35, 0x54,
+ 0x4c, 0x9a, 0x08, 0xc8, 0x18, 0x5e, 0x6b, 0xf7, 0x4a, 0x8f, 0xa4, 0x0f,
+ 0x8b, 0x5c, 0x51, 0xdf, 0xfb, 0x73, 0x95, 0xb2, 0xdd, 0xc1, 0x3e, 0x48,
+ 0x23, 0x4b, 0x4a, 0xad, 0xfe, 0x0e, 0x88, 0xcc, 0x5f, 0x05, 0xc9, 0xfc,
+ 0x7d, 0x11, 0x99, 0xee, 0xa6, 0xa0, 0x5b, 0x27, 0xbc, 0x27, 0x10, 0x2c,
+ 0xa5, 0x94, 0x3a, 0x8e, 0x8e, 0xde, 0xa7, 0x96, 0x08, 0x3b, 0xaa, 0xa4,
+ 0xc7, 0x0f, 0x53, 0xaf, 0x8d, 0x6f, 0xc9, 0x02, 0x19, 0xb9, 0x29, 0x52,
+ 0x23, 0x56, 0xe7, 0x85, 0x2b, 0xc3, 0x8f, 0x32, 0x08, 0x50, 0xdc, 0xff,
+ 0x7f, 0x72, 0x44, 0xd4, 0xbf, 0x67, 0x76, 0x17, 0x0d, 0x6f, 0xd7, 0xc8,
+ 0xe6, 0xd7, 0xde, 0x7d, 0xfc, 0xc5, 0xa3, 0x17, 0x32, 0xce, 0x19, 0xbd,
+ 0xe6, 0x28, 0x94, 0x3c, 0x79, 0x67, 0xeb, 0x64, 0x71, 0xb9, 0x8f, 0x26,
+ 0x7e, 0x60, 0x50, 0xfa, 0x8a, 0xb9, 0x72, 0x44, 0xbc, 0x69, 0x81, 0xf7,
+ 0x25, 0x02, 0x2e, 0x53, 0xca, 0x5c, 0xe5, 0xe9, 0x35, 0x12, 0x7d, 0x94,
+ 0x35, 0xf7, 0x84, 0xfe, 0xc4, 0x7c, 0xe8, 0x44, 0x7a, 0x52, 0x40, 0xa6,
+ 0x68, 0x69, 0x18, 0xac, 0xc7, 0x61, 0x46, 0x12, 0x28, 0xcc, 0x02, 0x67,
+ 0xab, 0xbc, 0xaa, 0xb7, 0x37, 0x38, 0x7d, 0x51, 0x66, 0x79, 0xe7, 0xb9,
+ 0x6e, 0xcd, 0x8d, 0x82, 0x74, 0x5a, 0xb8, 0x59, 0x0d, 0x68, 0xca, 0x83,
+ 0xbe, 0xe1, 0x6f, 0x8f, 0xb1, 0x1c, 0xdb, 0x68, 0xb9, 0x07, 0x52, 0x25,
+ 0xbd, 0x21, 0xea, 0xf2, 0x7b, 0x9a, 0x56, 0xa4, 0x36, 0x37, 0x6e, 0xc7,
+ 0x48, 0x6a, 0x89, 0x36, 0xa4, 0xb7, 0x28, 0xfc, 0x6d, 0x3c, 0x15, 0xe2,
+ 0xa8, 0x66, 0xf9, 0x61, 0xe7, 0x61, 0xf9, 0xb1, 0x70, 0x88, 0xd8, 0x2b,
+ 0x4a, 0xb9, 0xce, 0xa6, 0x7a, 0x5c, 0x73, 0xcd, 0x94, 0xa6, 0x8f, 0xf5,
+ 0xe1, 0x4e, 0x77, 0xb2, 0x92, 0x49, 0x59, 0xcc, 0x57, 0x02, 0x07, 0xa6,
+ 0xf9, 0x6a, 0x3a, 0x37, 0x1f, 0x42, 0x59, 0x78, 0xba, 0xa4, 0x27, 0x9e,
+ 0xc4, 0x43, 0xbf, 0x75, 0x41, 0x74, 0xad, 0x1c, 0xd0, 0x3e, 0x04, 0x5b,
+ 0x85, 0x55, 0x4b, 0x24, 0x62, 0xc2, 0x72, 0x49, 0x80, 0x7a, 0x92, 0xd4,
+ 0xa0, 0x4e, 0x78, 0x71, 0xf5, 0xd0, 0xae, 0x8c, 0xf3, 0x85, 0x08, 0x95,
+ 0x62, 0xc1, 0xfb, 0xa6, 0x2b, 0xb0, 0xc3, 0xca, 0x96, 0x97, 0x4c, 0xbb,
+ 0x03, 0xf4, 0x33, 0x7f, 0xdf, 0x45, 0x15, 0x04, 0x41, 0xa0, 0x85, 0x5e,
+ 0xee, 0x6d, 0x15, 0x6c, 0xf6, 0xd0, 0xc7, 0xca, 0xa8, 0x08, 0xf6, 0x58,
+ 0x5f, 0x11, 0xae, 0x3e, 0xf9, 0x80, 0x2d, 0x88, 0xb5, 0xcc, 0x2b, 0x1a,
+ 0x8b, 0x20, 0xb5, 0x84, 0x83, 0xa4, 0xa8, 0x47, 0xfc, 0x82, 0x9b, 0x43,
+ 0xa2, 0x3f, 0x1f, 0x1e, 0x9e, 0x6f, 0x25, 0xe7, 0x2e, 0xb5, 0x19, 0x6e,
+ 0x5f, 0x80, 0x8b, 0xe9, 0xce, 0xf6, 0xc5, 0xbd, 0x14, 0x20, 0x61, 0x32,
+ 0xa6, 0x78, 0xa6, 0xb2, 0xe4, 0x8e, 0x63, 0xe7, 0x5a, 0xca, 0x31, 0xb8,
+ 0x9d, 0x7f, 0x73, 0xf9, 0xd7, 0x19, 0xcb, 0x01, 0x88, 0x07, 0x38, 0x11,
+ 0x59, 0x72, 0xa2, 0x7d, 0x69, 0x60, 0xcc, 0xba, 0x92, 0x70, 0xed, 0x4c,
+ 0xf9, 0x2f, 0xb9, 0xdb, 0xbc, 0x83, 0x30, 0xf4, 0x4e, 0x73, 0x9c, 0x88,
+ 0xaf, 0xc8, 0x37, 0x8f, 0x72, 0x41, 0x8a, 0xef, 0xd4, 0x7c, 0xfb, 0x75,
+ 0x58, 0x71, 0x69, 0x14, 0xd7, 0x59, 0x11, 0xd2, 0x6c, 0xe3, 0xa3, 0xa4,
+ 0x2f, 0xc8, 0x06, 0x9e, 0x0c, 0xba, 0x04, 0xaf, 0x5e, 0x6e, 0xb9, 0x74,
+ 0x2e, 0x07, 0xf6, 0x94, 0xf7, 0xfb, 0x32, 0x2a, 0x28, 0x3a, 0xdb, 0x23,
+ 0xe0, 0xed, 0x6f, 0x49, 0xf4, 0x5e, 0x53, 0x3e, 0x7f, 0x83, 0xab, 0x74,
+ 0xfe, 0x40, 0xd3, 0x61, 0x1e, 0xac, 0xeb, 0x9b, 0x3d, 0x23, 0xa0, 0xf6,
+ 0x06, 0x9f, 0xc3, 0x12, 0x32, 0x3a, 0x41, 0x56, 0x2d, 0x21, 0x7a, 0x93,
+ 0x22, 0x5d, 0x9d, 0xd6, 0x44, 0xd9, 0x1f, 0x38, 0xfb, 0xa2, 0xff, 0x3f,
+ 0x68, 0xa7, 0xfd, 0x6d, 0x11, 0xfa, 0x0e, 0x37, 0xb1, 0xa1, 0xde, 0x81,
+ 0xf3, 0x89, 0x08, 0xe0, 0x11, 0xe5, 0x18, 0xe5, 0x0d, 0x18, 0x5c, 0x95,
+ 0xa6, 0xa4, 0x7d, 0x2c, 0xe9, 0x0d, 0x40, 0x52, 0xe9, 0xb5, 0x68, 0x62,
+ 0x9a, 0x51, 0xf5, 0xff, 0x07, 0x7d, 0x4b, 0x1b, 0x60, 0xe0, 0x26, 0x22,
+ 0x31, 0x5f, 0x1d, 0xbd, 0x3b, 0xbb, 0x38, 0x6a, 0x27, 0x07, 0x34, 0x28,
+ 0x39, 0x81, 0x40, 0x43, 0xb7, 0x77, 0x60, 0x5f, 0x71, 0xa5, 0xcc, 0xf2,
+ 0x22, 0x27, 0x98, 0x58, 0x72, 0xfe, 0xfd, 0x5b, 0xdb, 0x39, 0xd2, 0x44,
+ 0x0a, 0xee, 0x94, 0xab, 0x97, 0x2b, 0xf3, 0xdc, 0xd5, 0x20, 0x48, 0xd9,
+ 0xa0, 0x12, 0x08, 0x52, 0x4f, 0xd1, 0x76, 0x0f, 0x01, 0x1e, 0x0e, 0xcc,
+ 0xf1, 0xc7, 0x52, 0x26, 0xfb, 0xac, 0x6b, 0xca, 0x7c, 0xb3, 0xcd, 0x06,
+ 0xea, 0x35, 0x14, 0x0c, 0x30, 0x5c, 0x88, 0xcd, 0x4b, 0x0c, 0x27, 0x44,
+ 0x7b, 0x32, 0x48, 0xec, 0x47, 0xdc, 0x57, 0xb8, 0x38, 0x2c, 0xd4, 0x17,
+ 0x7c, 0x25, 0x16, 0x49, 0xa4, 0x82, 0x9f, 0xec, 0xbd, 0xe4, 0x4b, 0x95,
+ 0xc8, 0xaa, 0x69, 0xcf, 0xda, 0x6a, 0x0b, 0x3d, 0x66, 0xa4, 0x91, 0xe4,
+ 0x34, 0x7f, 0x1e, 0x23, 0xde, 0x79, 0xf3, 0xd9, 0xcd, 0x7a, 0xab, 0xe7,
+ 0xf5, 0xd4, 0x4e, 0x9b, 0x74, 0x78, 0xe3, 0x4f, 0x1b, 0x89, 0x00, 0x52,
+ 0x21, 0xf0, 0xf8, 0xaa, 0x5f, 0x52, 0x65, 0xc9, 0x55, 0xdd, 0xd8, 0x7a,
+ 0x2c, 0x7a, 0xac, 0x83, 0x5e, 0x6e, 0xa3, 0x69, 0xa6, 0xac, 0xc4, 0x14,
+ 0xb9, 0x00, 0x16, 0xc5, 0x79, 0xf0, 0x0d, 0x88, 0x0f, 0xb9, 0xb9, 0xb5,
+ 0xad, 0x5e, 0x24, 0x4f, 0x8e, 0x1c, 0x3f, 0x95, 0x4f, 0xc3, 0xaf, 0x22,
+ 0x07, 0xcc, 0x0a, 0x4a, 0xb2, 0xca, 0x45, 0x99, 0xb4, 0xc4, 0xc1, 0x43,
+ 0xd1, 0xd0, 0x69, 0x85, 0x60, 0x09, 0x26, 0xad, 0xc2, 0x85, 0xc4, 0xfb,
+ 0xc9, 0x6d, 0xdf, 0x1a, 0x19, 0xa9, 0xaf, 0x5e, 0xbc, 0x22, 0x35, 0x02,
+ 0x41, 0x52, 0x29, 0x45, 0x21, 0x6c, 0x84, 0x60, 0xda, 0x08, 0x53, 0x51,
+ 0x3a, 0x03, 0xd0, 0xf2, 0x81, 0xa3, 0x6c, 0xca, 0xa5, 0x2f, 0x86, 0x5e,
+ 0x13, 0x4f, 0x8e, 0xd6, 0xb5, 0x11, 0x88, 0x03, 0x56, 0x4f, 0xcc, 0x2a,
+ 0xa4, 0xb7, 0x2e, 0x47, 0x31, 0x59, 0x76, 0x34, 0x7b, 0x76, 0xdb, 0x6a,
+ 0x4e, 0x2a, 0x6f, 0x07, 0xcb, 0xe0, 0x6c, 0x44, 0x77, 0x56, 0xe5, 0xf5,
+ 0x6d, 0xb2, 0xf9, 0x6f, 0x5b, 0xb6, 0xf0, 0x68, 0x04, 0xeb, 0x45, 0xae,
+ 0xc9, 0xbc, 0x58, 0x64, 0xad, 0xa2, 0xb4, 0xda, 0xda, 0x15, 0x0a, 0xa5,
+ 0x10, 0xeb, 0x5d, 0x0c, 0xb6, 0x4f, 0x75, 0x01, 0xe7, 0x01, 0x8f, 0xbd,
+ 0x64, 0x46, 0xca, 0x2e, 0x08, 0x6f, 0x4d, 0xac, 0x08, 0x28, 0x1e, 0xc5,
+ 0x4b, 0xa8, 0xea, 0xd3, 0x20, 0xf9, 0x50, 0x40, 0xbb, 0x91, 0xbd, 0x29,
+ 0x77, 0x49, 0x5e, 0x98, 0x81, 0x98, 0xb1, 0x9a, 0xdb, 0x24, 0x22, 0xa8,
+ 0xfe, 0xd6, 0x96, 0x4f, 0x22, 0x48, 0x3b, 0x5c, 0x1b, 0x38, 0xd9, 0x22,
+ 0xfc, 0x9c, 0x68, 0x4b, 0xde, 0x85, 0x95, 0x5f, 0xb8, 0x68, 0x05, 0x1d,
+ 0x07, 0xb3, 0x4a, 0x68, 0x9b, 0xd2, 0xa2, 0xb2, 0xe9, 0xb4, 0xcf, 0x8c,
+ 0xa0, 0xc4, 0x90, 0x48, 0x76, 0x86, 0x59, 0xa7, 0x74, 0xcc, 0x21, 0x76,
+ 0xdf, 0x06, 0x0b, 0x6e, 0x1f, 0x64, 0x5f, 0x0d, 0x08, 0xa4, 0xac, 0x59,
+ 0xcb, 0x82, 0xcb, 0x53, 0x22, 0x5e, 0xc2, 0xff, 0x3b, 0xbf, 0x0c, 0x26,
+ 0x87, 0x87, 0xb4, 0xac, 0x4c, 0x43, 0x48, 0xb1, 0x35, 0xbe, 0xb9, 0xae,
+ 0xe6, 0x5c, 0x2f, 0x26, 0x56, 0xcc, 0xc6, 0x37, 0x00, 0xf8, 0x51, 0x5d,
+ 0xdd, 0x3a, 0x6b, 0xb8, 0x33, 0xfc, 0xee, 0xf1, 0xdb, 0x56, 0xe1, 0x49,
+ 0x9a, 0x8a, 0x49, 0x58, 0x46, 0xc1, 0xf3, 0x70, 0x48, 0x2d, 0x29, 0x73,
+ 0x62, 0xdd, 0xdd, 0x62, 0x9b, 0x72, 0xd6, 0xce, 0x48, 0x8b, 0x83, 0xe1,
+ 0x77, 0xf1, 0xe6, 0xa4, 0x15, 0xd6, 0x66, 0xb9, 0x0d, 0x6d, 0x18, 0x5b,
+ 0x45, 0x2b, 0xa3, 0xd2, 0x66, 0xa0, 0x12, 0xc8, 0xfa, 0x99, 0x10, 0xc6,
+ 0x71, 0x33, 0x2b, 0x27, 0x84, 0x3a, 0xcf, 0x1e, 0x9f, 0x8b, 0x19, 0xe0,
+ 0x8f, 0x7a, 0x70, 0x04, 0xb2, 0x5f, 0xfb, 0x65, 0xaa, 0xd1, 0xce, 0x88,
+ 0xd8, 0x68, 0x78, 0x66, 0xe2, 0xcd, 0xb9, 0xa1, 0x6a, 0xfd, 0x26, 0x79,
+ 0xd3, 0x1f, 0x42, 0x91, 0x94, 0xe3, 0xc6, 0x1b, 0x01, 0x3d, 0x10, 0x6f,
+ 0x8e, 0x85, 0x6f, 0x64, 0x64, 0x04, 0xe1, 0x86, 0x71, 0xbb, 0x7a, 0x64,
+ 0xfc, 0x60, 0xb0, 0xc8, 0xe6, 0x87, 0x2c, 0xd2, 0x83, 0x15, 0x5e, 0x3e,
+ 0xb2, 0xd8, 0x0a, 0xa3, 0x07, 0xdd, 0x05, 0x56, 0xc2, 0xfe, 0x8a, 0x97,
+ 0xb2, 0x1f, 0x6f, 0xce, 0xae, 0xb0, 0x10, 0x37, 0xae, 0x58, 0x60, 0xf9,
+ 0x4a, 0x30, 0x0b, 0x53, 0x23, 0x22, 0x8d, 0x16, 0x3c, 0xce, 0x3e, 0x72,
+ 0xe1, 0x6c, 0xaa, 0x88, 0xdd, 0x7c, 0x5c, 0x3d, 0x21, 0x53, 0x49, 0x6f,
+ 0x7c, 0x98, 0xa1, 0x00, 0xa3, 0x15, 0x16, 0xc2, 0x94, 0x96, 0xd2, 0x6f,
+ 0x46, 0x25, 0x29, 0x81, 0x5c, 0xe4, 0xb2, 0x59, 0x3e, 0x21, 0xde, 0xf7,
+ 0x12, 0x5b, 0x8a, 0x7a, 0x5e, 0xe6, 0x85, 0xe6, 0x95, 0x8b, 0x8c, 0xf1,
+ 0xba, 0x98, 0xc4, 0x52, 0xeb, 0x57, 0x05, 0x5a, 0x66, 0xb7, 0x04, 0x02,
+ 0xb7, 0x8a, 0xc2, 0xc7, 0x08, 0xd3, 0xb5, 0xbf, 0x8f, 0xf9, 0x71, 0xb7,
+ 0x8f, 0x79, 0x54, 0xba, 0x8d, 0x5d, 0xad, 0xae, 0xc7, 0x57, 0xbb, 0xfd,
+ 0x49, 0x7b, 0x26, 0xbb, 0xfd, 0x9b, 0xdf, 0x4f, 0xac, 0x57, 0xe8, 0x7e,
+ 0x62, 0x3f, 0xac, 0xf7, 0x3f, 0xd0, 0x57, 0x5a, 0x0c, 0x8f, 0x80, 0xa7,
+ 0xdc, 0xd8, 0x95, 0xf2, 0x39, 0x2e, 0x99, 0x0a, 0xd0, 0x3c, 0x06, 0x5a,
+ 0x52, 0xf0, 0xf1, 0x0a, 0x55, 0xfd, 0x64, 0x82, 0x65, 0x39, 0x96, 0x4f,
+ 0x8e, 0x3c, 0xed, 0xba, 0xc8, 0xf2, 0xdd, 0xaf, 0xdb, 0x1b, 0x4e, 0xd0,
+ 0x72, 0x81, 0x27, 0x5f, 0xed, 0x1c, 0x88, 0x49, 0x46, 0x4e, 0x62, 0xd9,
+ 0x0a, 0x84, 0xe6, 0xe5, 0x86, 0x54, 0xee, 0xad, 0xda, 0x48, 0x4b, 0xe7,
+ 0xb8, 0x9a, 0x3d, 0x72, 0xc8, 0xcd, 0x03, 0x6e, 0x54, 0x84, 0xe9, 0xf1,
+ 0x46, 0x15, 0x9c, 0x4c, 0x39, 0xc6, 0x4b, 0x66, 0x7e, 0x59, 0x0f, 0x5a,
+ 0xbb, 0x70, 0x55, 0x4f, 0xe8, 0xc1, 0x58, 0x67, 0xdc, 0xd4, 0x22, 0xb1,
+ 0xe7, 0xc1, 0x93, 0x94, 0xf1, 0xe6, 0xa4, 0xbb, 0xee, 0x3d, 0x99, 0x9e,
+ 0x9e, 0xe7, 0x48, 0x65, 0x62, 0x6c, 0x63, 0x5c, 0x86, 0x7b, 0x43, 0x0f,
+ 0xf8, 0x2f, 0x12, 0x10, 0x64, 0xc5, 0x4f, 0x0b, 0xdf, 0x6e, 0xa7, 0x2f,
+ 0x9a, 0xbb, 0x77, 0x05, 0xdc, 0xd6, 0x8b, 0xb6, 0xda, 0x05, 0xe7, 0x3a,
+ 0x6b, 0x08, 0x15, 0x82, 0x01, 0x04, 0x50, 0x1a, 0x14, 0x56, 0x10, 0x45,
+ 0x16, 0x8c, 0x20, 0x13, 0xa2, 0xac, 0x0e, 0xb1, 0x7d, 0xfc, 0x49, 0xa6,
+ 0x00, 0xc3, 0xa4, 0xa2, 0x0a, 0x8c, 0xa8, 0x21, 0x5a, 0xc5, 0xad, 0xce,
+ 0xc4, 0x96, 0xd0, 0xc7, 0x13, 0x66, 0xc1, 0x0e, 0x8b, 0xd7, 0x75, 0xd8,
+ 0xd8, 0xea, 0x81, 0xe7, 0xac, 0x60, 0xea, 0xc8, 0xec, 0x7a, 0xe2, 0x97,
+ 0x82, 0xf4, 0x86, 0x5f, 0xf5, 0x78, 0x0a, 0xae, 0xcd, 0xe0, 0xf1, 0x47,
+ 0x14, 0xc8, 0xca, 0x8a, 0x35, 0xd4, 0x15, 0x4a, 0xa8, 0xdc, 0x4a, 0x2e,
+ 0x32, 0xca, 0xdc, 0xba, 0x23, 0x69, 0x4a, 0xa9, 0xd9, 0x09, 0xb7, 0xb0,
+ 0x99, 0x0f, 0x32, 0x01, 0x2e, 0x92, 0x8a, 0x44, 0xe4, 0xb2, 0x81, 0x4e,
+ 0x63, 0xb6, 0xc6, 0x16, 0x1b, 0xfc, 0x29, 0x97, 0x02, 0xd9, 0x1d, 0xec,
+ 0xf6, 0xb8, 0x22, 0x60, 0xa5, 0xea, 0xa2, 0xda, 0x18, 0xf4, 0x93, 0x54,
+ 0x68, 0xf3, 0x39, 0x95, 0xb3, 0xeb, 0x8d, 0xb8, 0xa0, 0xef, 0xd6, 0xa1,
+ 0x8f, 0x1a, 0x7e, 0x6e, 0x67, 0xd6, 0xdc, 0xa7, 0x0f, 0xa1, 0xa2, 0xbe,
+ 0xd3, 0x7f, 0xfe, 0xea, 0x55, 0xeb, 0x46, 0xaf, 0x3d, 0x62, 0xd0, 0x17,
+ 0x3b, 0x3b, 0x9c, 0x75, 0xde, 0x7d, 0xcd, 0xfc, 0xa2, 0xff, 0x0a, 0x2f,
+ 0xb6, 0x5f, 0xab, 0x33, 0xb3, 0x04, 0x93, 0xe5, 0xef, 0xf5, 0xe9, 0x37,
+ 0x91, 0xcf, 0xc1, 0xeb, 0xb2, 0xf4, 0xad, 0x57, 0xf4, 0xb9, 0xc8, 0x5b,
+ 0x9c, 0x10, 0x8f, 0x79, 0x2c, 0xaf, 0xae, 0xc8, 0xdf, 0x45, 0x4f, 0xe2,
+ 0xe2, 0x33, 0x3b, 0xe2, 0x3e, 0xad, 0x26, 0xe1, 0x70, 0x77, 0x7a, 0xfd,
+ 0xdd, 0x65, 0xc3, 0x05, 0xad, 0x29, 0xe0, 0x2d, 0xb4, 0x9c, 0x64, 0x4e,
+ 0x1a, 0x43, 0x82, 0x41, 0xcc, 0xdd, 0x86, 0x76, 0x4d, 0x8f, 0x76, 0x5f,
+ 0xbd, 0xea, 0x51, 0xcf, 0x5e, 0xbc, 0x7a, 0xb5, 0x34, 0x69, 0xcd, 0xfb,
+ 0xcc, 0x7d, 0xe9, 0x9c, 0x54, 0xf4, 0xba, 0xdb, 0x33, 0x35, 0xd9, 0x2b,
+ 0xf1, 0xef, 0xd0, 0x6f, 0x92, 0x37, 0xc9, 0xe9, 0xd9, 0xe5, 0x91, 0xe7,
+ 0xbf, 0x71, 0xfe, 0x59, 0xbf, 0x4e, 0x0c, 0x02, 0xc2, 0x73, 0x54, 0xa6,
+ 0x80, 0x7d, 0x6c, 0x8c, 0xad, 0x10, 0xe5, 0x00, 0x40, 0xad, 0x7a, 0x0e,
+ 0xff, 0xa5, 0xfb, 0xb9, 0xb3, 0x02, 0xf5, 0x27, 0xae, 0xf3, 0xc6, 0x67,
+ 0x52, 0xd8, 0x34, 0x8b, 0xbd, 0x05, 0x3f, 0xc8, 0x5d, 0x3a, 0xcd, 0x6d,
+ 0x64, 0x67, 0xa3, 0x26, 0xfc, 0x29, 0xb3, 0x2a, 0xd2, 0x3f, 0xca, 0xf9,
+ 0x46, 0x00, 0x01, 0xcd, 0xa6, 0xe4, 0x3c, 0x90, 0x9b, 0x90, 0x5f, 0xe8,
+ 0xe3, 0x49, 0x39, 0x2d, 0x30, 0x68, 0xb9, 0x00, 0x66, 0x0a, 0xef, 0xb2,
+ 0xff, 0xf1, 0x48, 0x70, 0x07, 0x4e, 0x2f, 0x20, 0xcf, 0x14, 0x3c, 0x4e,
+ 0xcd, 0xf4, 0xbc, 0x69, 0xd8, 0xa8, 0xbb, 0x85, 0xb2, 0xa9, 0xda, 0x74,
+ 0x1c, 0xf0, 0x80, 0x88, 0xc2, 0x24, 0x9b, 0x2b, 0x3f, 0x61, 0xd1, 0x6e,
+ 0xc7, 0xec, 0xe5, 0xab, 0xfc, 0x7a, 0x51, 0xc5, 0xc1, 0x55, 0x30, 0xce,
+ 0x05, 0xcb, 0xac, 0x1c, 0xb8, 0xe9, 0x7d, 0xaa, 0x18, 0x6a, 0xd0, 0x16,
+ 0xeb, 0xe1, 0x56, 0x43, 0x59, 0x31, 0xcb, 0x44, 0x50, 0x1c, 0xf8, 0xc5,
+ 0x08, 0x65, 0x6e, 0xf4, 0x18, 0xf2, 0x23, 0x08, 0xb2, 0x04, 0xae, 0x3f,
+ 0x29, 0x55, 0x23, 0xc0, 0x71, 0xf5, 0xb4, 0x9b, 0xc5, 0x46, 0x4d, 0x9a,
+ 0x34, 0x91, 0x29, 0xe8, 0x46, 0xf1, 0xca, 0xc5, 0x86, 0xc7, 0x39, 0x41,
+ 0xcf, 0xc2, 0x27, 0x73, 0x53, 0x7a, 0x8c, 0xd7, 0x61, 0x62, 0x29, 0x49,
+ 0x1e, 0x4e, 0x14, 0xc7, 0x5f, 0x79, 0x91, 0xcc, 0xf3, 0xf7, 0xc5, 0xb4,
+ 0x4c, 0x27, 0xb5, 0x14, 0xe6, 0x95, 0xf8, 0x3e, 0x26, 0x8b, 0x39, 0x40,
+ 0x64, 0x69, 0x03, 0x82, 0x54, 0x5a, 0x69, 0x5e, 0xe3, 0x64, 0x53, 0x8b,
+ 0xc8, 0xea, 0x0e, 0xf5, 0xdc, 0x24, 0x2c, 0xa5, 0x68, 0xa7, 0x70, 0x1a,
+ 0xef, 0xd6, 0x20, 0xe6, 0x06, 0xa0, 0xfd, 0xce, 0xab, 0x65, 0x79, 0x9b,
+ 0x51, 0x04, 0x8a, 0x2e, 0x49, 0xea, 0xae, 0x5e, 0xc8, 0xc3, 0xe3, 0xff,
+ 0x79, 0xf4, 0x7b, 0x86, 0xc0, 0xaa, 0xf4, 0xde, 0x26, 0x37, 0x7c, 0xcf,
+ 0xac, 0x52, 0x12, 0x9a, 0xb2, 0xd9, 0xb4, 0xe9, 0x54, 0xac, 0x78, 0x2a,
+ 0x9a, 0x8b, 0xdb, 0x03, 0x31, 0x4e, 0xa9, 0xf1, 0x66, 0x36, 0x56, 0xb8,
+ 0xb7, 0x29, 0x05, 0xc1, 0x91, 0x89, 0x30, 0xb1, 0x29, 0x50, 0xe9, 0x58,
+ 0x0f, 0x1b, 0x2a, 0xe1, 0x7a, 0xbd, 0x6c, 0xdf, 0xc3, 0x2d, 0x8c, 0x0a,
+ 0x99, 0x41, 0x4d, 0x82, 0x02, 0x44, 0x45, 0xd4, 0x2d, 0xd3, 0xdb, 0x47,
+ 0x8a, 0xec, 0xf8, 0xf9, 0x80, 0xa8, 0xcb, 0x58, 0x65, 0x14, 0x2d, 0xab,
+ 0x92, 0xd7, 0x1f, 0x2e, 0x4e, 0x96, 0x24, 0x75, 0x0c, 0xb1, 0x0a, 0x34,
+ 0x5d, 0xeb, 0x17, 0x19, 0xe8, 0x48, 0xaa, 0xe4, 0x3c, 0xbd, 0xce, 0xd6,
+ 0x7d, 0x56, 0x97, 0x16, 0xb1, 0x93, 0x38, 0x21, 0x62, 0x9e, 0x22, 0x9f,
+ 0x46, 0x9a, 0xc4, 0xb8, 0x8b, 0x52, 0xfb, 0x99, 0x18, 0x57, 0xd3, 0x54,
+ 0x66, 0x6f, 0x51, 0xa1, 0x5a, 0xf4, 0xf7, 0xd1, 0x5a, 0x0c, 0x16, 0x98,
+ 0xdf, 0x61, 0xe4, 0xf2, 0x71, 0x55, 0xe9, 0x9c, 0x76, 0x51, 0xb2, 0xfe,
+ 0x67, 0xf2, 0xd4, 0xaf, 0x6b, 0x37, 0xfb, 0x59, 0x8c, 0x57, 0x99, 0xa7,
+ 0x82, 0xe2, 0xd4, 0xbe, 0x4b, 0xa9, 0xe3, 0xe3, 0xe7, 0x60, 0x0b, 0xc7,
+ 0xb9, 0x32, 0x22, 0x5d, 0xab, 0x63, 0x55, 0x48, 0x39, 0x49, 0x32, 0x47,
+ 0xb2, 0xaf, 0xe0, 0x3e, 0xd3, 0xe4, 0x44, 0xfa, 0xb7, 0x2f, 0x41, 0x19,
+ 0xd6, 0x86, 0xb4, 0x6b, 0x2d, 0xa0, 0x52, 0x6c, 0xb0, 0xe9, 0x94, 0x08,
+ 0xde, 0xad, 0x2b, 0x8b, 0xc6, 0x38, 0x29, 0x89, 0x13, 0x1c, 0x85, 0x44,
+ 0x0b, 0xeb, 0x77, 0x6e, 0xad, 0xec, 0xef, 0xce, 0x40, 0xe4, 0x02, 0x45,
+ 0x07, 0x5a, 0x39, 0xbe, 0x6f, 0x76, 0x47, 0x21, 0xf9, 0x7a, 0xde, 0xb2,
+ 0x7a, 0x7b, 0xef, 0x3f, 0x7a, 0x51, 0x22, 0xeb, 0x25, 0xe4, 0x7b, 0x5e,
+ 0x77, 0x1b, 0x60, 0x9c, 0xb1, 0x84, 0x67, 0xbd, 0x0e, 0x95, 0xb6, 0x4b,
+ 0xeb, 0x91, 0xeb, 0x32, 0xea, 0x5b, 0xec, 0x7b, 0x69, 0x1d, 0xc9, 0x21,
+ 0x67, 0x98, 0xf4, 0xdf, 0xe6, 0xe6, 0x1e, 0xa9, 0x99, 0x2a, 0x81, 0x1d,
+ 0x03, 0x9c, 0x22, 0xe1, 0x0e, 0x63, 0x58, 0x2d, 0x45, 0xe3, 0x29, 0x40,
+ 0xd2, 0xd9, 0x57, 0x6c, 0x70, 0xc7, 0xec, 0x89, 0x65, 0xac, 0x5a, 0x72,
+ 0x8b, 0x3b, 0x8d, 0x21, 0x75, 0x2e, 0x0b, 0xa9, 0x6b, 0xca, 0xc6, 0xb5,
+ 0xa6, 0x9d, 0x10, 0x0e, 0x27, 0x32, 0x3f, 0x4a, 0x60, 0xc0, 0x50, 0x1e,
+ 0x54, 0x66, 0x6d, 0xd5, 0x15, 0x08, 0x0c, 0x4e, 0x4b, 0x50, 0xc4, 0xe8,
+ 0x93, 0xae, 0x1f, 0xd8, 0x74, 0xca, 0x52, 0xbb, 0x73, 0x94, 0x85, 0x69,
+ 0x77, 0x38, 0x85, 0x66, 0x6c, 0x9a, 0x1d, 0x74, 0x86, 0xa0, 0xac, 0xf4,
+ 0x4b, 0x50, 0x86, 0xad, 0x81, 0x01, 0xf1, 0xe8, 0x6f, 0x3d, 0x8a, 0x22,
+ 0x14, 0xa5, 0x64, 0xa2, 0xc7, 0x62, 0xfa, 0x80, 0x13, 0xd1, 0x23, 0xfe,
+ 0x5d, 0xc8, 0x08, 0x92, 0xe4, 0x8f, 0x7d, 0xc7, 0x0c, 0xbe, 0xf9, 0x90,
+ 0x19, 0x2d, 0xdb, 0xa1, 0x50, 0x60, 0x4c, 0x45, 0x72, 0x54, 0x12, 0x2e,
+ 0x78, 0x55, 0x97, 0x9d, 0xb2, 0xe8, 0x0f, 0x7e, 0x0c, 0x92, 0x27, 0xdd,
+ 0x68, 0x02, 0x44, 0xab, 0xbb, 0x28, 0xb2, 0x4f, 0x44, 0xf5, 0xb8, 0xbc,
+ 0xb9, 0x50, 0xd1, 0xfe, 0xfe, 0xe0, 0xe2, 0xf4, 0xf8, 0xf4, 0xeb, 0x7d,
+ 0xca, 0x86, 0xcb, 0xaa, 0x31, 0x55, 0x67, 0x4c, 0xfe, 0xba, 0x98, 0xe4,
+ 0x63, 0x96, 0x15, 0x52, 0xf5, 0xae, 0x45, 0xb5, 0x9c, 0x89, 0x9b, 0xd5,
+ 0x88, 0x97, 0x40, 0xbe, 0x0b, 0x10, 0x95, 0x88, 0xa2, 0xab, 0xf2, 0x7a,
+ 0x61, 0xa7, 0x7e, 0x0c, 0x75, 0x04, 0xc1, 0x02, 0x04, 0x52, 0x49, 0x22,
+ 0xf1, 0xa6, 0x25, 0x26, 0x0d, 0xa3, 0x2c, 0xbc, 0x3d, 0x39, 0x49, 0x42,
+ 0x8e, 0x3d, 0x94, 0x8c, 0x54, 0x32, 0x70, 0x86, 0x30, 0xa1, 0x21, 0xb3,
+ 0xfd, 0xeb, 0x7c, 0x34, 0x85, 0x4d, 0x46, 0x0a, 0x00, 0x97, 0xe2, 0xf1,
+ 0xe4, 0x9e, 0x31, 0x5f, 0x4d, 0x57, 0xba, 0x8b, 0x0c, 0x8c, 0x2c, 0xd0,
+ 0x8a, 0x58, 0xe1, 0xbc, 0x9a, 0xc0, 0x1e, 0x32, 0x62, 0xb2, 0xbc, 0x6a,
+ 0x48, 0x45, 0x6a, 0xdd, 0xa6, 0x6d, 0x8e, 0xfb, 0x55, 0x91, 0x84, 0x1b,
+ 0xb6, 0x74, 0x7c, 0x48, 0x84, 0xc4, 0x2e, 0x41, 0x5e, 0x65, 0xf6, 0x23,
+ 0xeb, 0x86, 0xa8, 0x8d, 0x10, 0x0d, 0xa3, 0x4d, 0xb2, 0xd4, 0x96, 0x7c,
+ 0xac, 0x49, 0x5e, 0x86, 0x02, 0xe3, 0x3e, 0xab, 0x32, 0x57, 0xa6, 0x1d,
+ 0xa9, 0x4e, 0x46, 0xdc, 0x0d, 0x92, 0x61, 0x69, 0x9e, 0x0f, 0xb5, 0x2c,
+ 0x5b, 0x46, 0xa8, 0x55, 0x91, 0x14, 0xfd, 0x71, 0x40, 0x2f, 0x54, 0x58,
+ 0x40, 0x74, 0xae, 0x3d, 0xde, 0x48, 0x09, 0x43, 0xda, 0xff, 0xa3, 0xcc,
+ 0x2a, 0x15, 0xf4, 0x05, 0x44, 0x80, 0x68, 0x87, 0xac, 0xf7, 0x8d, 0x40,
+ 0x5d, 0xa7, 0x99, 0x45, 0x61, 0x45, 0xaf, 0xa5, 0x47, 0xca, 0x83, 0xf9,
+ 0x30, 0xeb, 0xee, 0x80, 0xa3, 0x45, 0x57, 0xbc, 0x62, 0x06, 0xa9, 0xd8,
+ 0x9e, 0x9e, 0xff, 0x54, 0x6a, 0x5f, 0xd8, 0xb0, 0x2a, 0xd3, 0xbe, 0x67,
+ 0xa4, 0x65, 0x06, 0xa1, 0xf2, 0x33, 0x57, 0xd1, 0x88, 0xe8, 0x32, 0xbc,
+ 0x7c, 0x3e, 0xff, 0x65, 0xb9, 0x70, 0x7a, 0xce, 0xc1, 0x90, 0x23, 0x69,
+ 0xa5, 0x09, 0xa2, 0x52, 0x57, 0x83, 0xad, 0x28, 0xd0, 0x87, 0xfb, 0x20,
+ 0x77, 0x52, 0x6d, 0xf4, 0xeb, 0xc9, 0xa3, 0x82, 0x4f, 0xeb, 0xc6, 0x74,
+ 0x6f, 0x69, 0x2c, 0xa8, 0xf5, 0x2c, 0x69, 0x53, 0x69, 0xe2, 0x95, 0xfb,
+ 0xf6, 0x83, 0x9a, 0x12, 0x2b, 0x45, 0xfa, 0x64, 0xa4, 0x39, 0x49, 0xe8,
+ 0x90, 0x98, 0xd5, 0x52, 0x21, 0x2c, 0xf1, 0x9b, 0xbc, 0xb8, 0x2b, 0xf1,
+ 0x1b, 0x89, 0x39, 0x05, 0x29, 0xbe, 0x3e, 0x59, 0x56, 0x6c, 0x22, 0xfc,
+ 0x59, 0x55, 0x27, 0x8d, 0xa2, 0xe0, 0xcd, 0x58, 0x98, 0x6b, 0xbe, 0x4e,
+ 0x1c, 0xa3, 0xbc, 0x40, 0x0f, 0x22, 0x57, 0x23, 0x1f, 0x26, 0xda, 0xbc,
+ 0x3d, 0x5b, 0x25, 0xd3, 0xbc, 0x38, 0xa5, 0x2a, 0xde, 0x1e, 0xc7, 0xbc,
+ 0x5e, 0x38, 0x72, 0xdf, 0xe4, 0xd6, 0xff, 0xb3, 0xfc, 0x26, 0x19, 0xb4,
+ 0x6b, 0x70, 0xb5, 0x6c, 0x58, 0x8a, 0x34, 0xe3, 0x20, 0x49, 0x3a, 0x4c,
+ 0x59, 0x0a, 0xdb, 0xe9, 0x32, 0x61, 0x9b, 0x40, 0xa9, 0x41, 0xe2, 0xee,
+ 0x12, 0x0d, 0xa2, 0x5d, 0x7c, 0x49, 0xb2, 0x15, 0xba, 0x67, 0xcf, 0x23,
+ 0x45, 0x6a, 0x11, 0x92, 0xb5, 0xef, 0x36, 0xee, 0x8f, 0xbd, 0x9c, 0x13,
+ 0x5b, 0xae, 0x23, 0x06, 0x73, 0xe0, 0xab, 0x3b, 0x3e, 0x3d, 0x02, 0xf5,
+ 0xf4, 0x27, 0x25, 0x7a, 0xd9, 0x31, 0xf8, 0xd3, 0x31, 0x57, 0x62, 0xd7,
+ 0xc0, 0x74, 0x2a, 0xda, 0x61, 0x0d, 0xf4, 0x34, 0x6f, 0x20, 0x40, 0xfe,
+ 0xb8, 0xb7, 0xb3, 0x4c, 0xc8, 0x53, 0x43, 0x5a, 0x34, 0x81, 0x4e, 0x63,
+ 0x6d, 0x6d, 0x30, 0x5c, 0x83, 0x2e, 0x3b, 0x96, 0xee, 0x90, 0xc5, 0x9c,
+ 0x7c, 0x75, 0x7d, 0xda, 0x2f, 0x69, 0xbd, 0x6c, 0xfe, 0x07, 0xff, 0x8c,
+ 0x6a, 0x3e, 0x4e, 0x7e, 0x5d, 0x78, 0x6b, 0x4c, 0x0d, 0xc5, 0x10, 0x6f,
+ 0x2a, 0x4b, 0xd4, 0x57, 0xe2, 0xa9, 0xed, 0x4e, 0x67, 0x80, 0x6d, 0x8f,
+ 0xb2, 0x2d, 0x72, 0x38, 0xa9, 0xb5, 0xd0, 0x84, 0x4d, 0x67, 0x73, 0x57,
+ 0x88, 0x47, 0x8f, 0x97, 0x20, 0x73, 0xf4, 0x14, 0x28, 0xa8, 0xc5, 0x02,
+ 0x77, 0xf9, 0x8b, 0xe1, 0xa6, 0xf5, 0x44, 0x29, 0x9b, 0xe4, 0xa9, 0x20,
+ 0x48, 0x31, 0x25, 0xf4, 0xad, 0xf6, 0xd5, 0x08, 0x70, 0x5a, 0x3f, 0xea,
+ 0xf3, 0x8f, 0x92, 0x50, 0x0b, 0xa0, 0xdd, 0x67, 0xa9, 0x5d, 0xe7, 0xb7,
+ 0xd7, 0x93, 0x4d, 0x92, 0xab, 0x5b, 0x56, 0x7b, 0x0d, 0xe3, 0xfd, 0xca,
+ 0xc2, 0xcd, 0x76, 0x4c, 0xca, 0x77, 0x64, 0x17, 0xcf, 0x4b, 0x1a, 0xac,
+ 0xb1, 0xf4, 0x2a, 0xa3, 0x01, 0x2c, 0xa6, 0x69, 0x05, 0xc8, 0x5e, 0x76,
+ 0xb5, 0x98, 0xc6, 0x4c, 0x1d, 0x3a, 0xdd, 0x12, 0x24, 0xca, 0xeb, 0x7a,
+ 0x21, 0x86, 0xa0, 0xcd, 0x7d, 0xb6, 0xdc, 0x48, 0xc9, 0xd4, 0xf4, 0x07,
+ 0x9f, 0xae, 0xa7, 0x84, 0x42, 0x59, 0xaa, 0xa0, 0xc0, 0x47, 0xac, 0x75,
+ 0x39, 0x45, 0xcb, 0x14, 0x5b, 0x4a, 0xae, 0x94, 0x6b, 0xea, 0x14, 0x36,
+ 0xf9, 0x1c, 0x35, 0x91, 0x8c, 0x1e, 0x45, 0xb7, 0x55, 0xa7, 0xb9, 0xf5,
+ 0xb3, 0xf3, 0xcb, 0xe3, 0xb3, 0xd3, 0x61, 0xf2, 0x6f, 0x5e, 0x22, 0x4b,
+ 0xff, 0x87, 0x9e, 0x9b, 0xf3, 0xe4, 0xb5, 0x78, 0x13, 0x96, 0xd9, 0xbf,
+ 0x9e, 0x9a, 0x3e, 0x36, 0xf7, 0xb3, 0x91, 0xa0, 0xfa, 0xa6, 0xb0, 0xcc,
+ 0xc8, 0x6a, 0x74, 0x32, 0x2a, 0x03, 0x7d, 0x98, 0x46, 0xdd, 0xc6, 0x28,
+ 0xda, 0x68, 0xfd, 0x65, 0x0b, 0x41, 0xdb, 0x69, 0x3e, 0x2e, 0x63, 0x45,
+ 0xb6, 0xb5, 0xd0, 0xa3, 0xf2, 0x82, 0x2b, 0x0b, 0x2e, 0x56, 0xf2, 0x26,
+ 0x4b, 0x45, 0x55, 0xa5, 0xea, 0x08, 0x5a, 0xf0, 0xeb, 0xa3, 0x4b, 0x72,
+ 0xc5, 0x5c, 0xc0, 0xd8, 0xb1, 0x1d, 0x84, 0x43, 0x4b, 0x54, 0x9b, 0xd4,
+ 0xaa, 0x5f, 0x42, 0x4e, 0xc9, 0xe5, 0x6c, 0x3f, 0xcd, 0xa7, 0x69, 0x11,
+ 0x4d, 0xb2, 0x32, 0x3a, 0x2b, 0x55, 0xe8, 0x2d, 0x1d, 0x0d, 0x9d, 0x7a,
+ 0x48, 0x3c, 0x1a, 0x74, 0xe6, 0x87, 0x38, 0xff, 0x70, 0x29, 0xde, 0xa8,
+ 0xb7, 0x47, 0x27, 0x47, 0x97, 0x47, 0x5d, 0xeb, 0x7c, 0xc4, 0xb4, 0x5a,
+ 0xc8, 0xae, 0x69, 0xb2, 0xf1, 0x4d, 0x51, 0x4e, 0xcb, 0xeb, 0x5c, 0x8a,
+ 0x94, 0x25, 0xdf, 0x67, 0xa3, 0xb7, 0x07, 0xdf, 0x91, 0xc6, 0x40, 0x9e,
+ 0xa5, 0xf3, 0x8b, 0xb3, 0xf3, 0x77, 0xc7, 0xa7, 0x6f, 0x7b, 0xc9, 0xe1,
+ 0xd9, 0xf9, 0x5f, 0x7a, 0xc9, 0xfb, 0xb3, 0xef, 0x8e, 0x22, 0xa8, 0x6a,
+ 0xe2, 0xa5, 0x8d, 0x14, 0x49, 0x96, 0x52, 0x41, 0xce, 0xb8, 0x2e, 0x38,
+ 0x30, 0xe1, 0x5d, 0x13, 0x07, 0x40, 0x87, 0xa0, 0xe2, 0x37, 0xce, 0x92,
+ 0x99, 0x3a, 0x23, 0x1f, 0xbe, 0x39, 0x3a, 0x78, 0xdb, 0x0b, 0x48, 0x49,
+ 0x89, 0xdb, 0xdc, 0x7c, 0x8c, 0xc6, 0x67, 0x07, 0x0d, 0x2a, 0x4b, 0xb6,
+ 0x2f, 0xa0, 0x03, 0x70, 0x28, 0x8b, 0x4f, 0xa4, 0x39, 0x7e, 0x28, 0xec,
+ 0x32, 0x59, 0x86, 0x90, 0x10, 0x12, 0xdc, 0xa5, 0x65, 0x01, 0xbd, 0x4c,
+ 0x0f, 0x52, 0xc7, 0x54, 0x91, 0x96, 0x22, 0xae, 0xcc, 0x1b, 0x91, 0x00,
+ 0xcc, 0x2f, 0x7b, 0xc3, 0x96, 0x51, 0x8a, 0xf0, 0x70, 0x48, 0x97, 0x99,
+ 0xd5, 0xd9, 0x32, 0xa6, 0x42, 0xe4, 0xb0, 0x8f, 0x31, 0x95, 0xa2, 0x4a,
+ 0x20, 0xa0, 0x27, 0x98, 0xcf, 0x90, 0xb9, 0x3b, 0x85, 0xb2, 0x2e, 0x9e,
+ 0xbe, 0xa0, 0x6a, 0xb4, 0x30, 0xa4, 0x0a, 0x87, 0x04, 0xcd, 0x9f, 0xfb,
+ 0xa0, 0x56, 0x09, 0xf8, 0x81, 0x27, 0x36, 0x8a, 0xab, 0xe6, 0x32, 0x27,
+ 0x57, 0x66, 0x6b, 0x66, 0x0c, 0xa0, 0xe2, 0xa5, 0xb2, 0xe6, 0x7f, 0xd2,
+ 0x3f, 0x56, 0xe7, 0xc3, 0x2a, 0x35, 0xca, 0x72, 0x45, 0x89, 0x03, 0x86,
+ 0x99, 0x2b, 0xd4, 0x37, 0xd5, 0x16, 0x15, 0xbe, 0x27, 0x84, 0x06, 0x1a,
+ 0xd1, 0xea, 0x75, 0x99, 0x95, 0x58, 0x41, 0x06, 0xed, 0xcd, 0x0a, 0xe7,
+ 0x18, 0x06, 0x3e, 0xab, 0xb0, 0xf4, 0xb7, 0xf0, 0x8b, 0x19, 0x71, 0x52,
+ 0x88, 0xef, 0x33, 0xa1, 0x20, 0x5b, 0x9f, 0x2d, 0x66, 0x1f, 0x05, 0xac,
+ 0x12, 0x52, 0x34, 0x50, 0xe9, 0x43, 0xbc, 0x96, 0x6d, 0xab, 0x14, 0xa4,
+ 0x3d, 0xe9, 0xcf, 0x76, 0x3e, 0x39, 0x6f, 0x3a, 0xe9, 0x0c, 0x75, 0xd2,
+ 0x17, 0x86, 0xd0, 0x99, 0xb9, 0xe8, 0x42, 0x3f, 0xd2, 0xe6, 0xbb, 0x25,
+ 0xc2, 0xd1, 0xf7, 0xcf, 0xca, 0x62, 0x78, 0x62, 0xea, 0xe4, 0xd8, 0x1c,
+ 0x89, 0x48, 0x9a, 0xfe, 0xa4, 0x44, 0xc1, 0x43, 0x40, 0x0f, 0xa0, 0x3d,
+ 0x61, 0xf6, 0x4d, 0x5b, 0xe1, 0x87, 0xa9, 0x02, 0x68, 0xf4, 0xcb, 0x28,
+ 0x0d, 0xfa, 0xc8, 0xa7, 0x83, 0x35, 0xbb, 0x38, 0xba, 0xbc, 0x18, 0x24,
+ 0x9b, 0x3e, 0x03, 0xdd, 0xcb, 0xc1, 0x4e, 0x18, 0x9e, 0xa1, 0xe2, 0xa3,
+ 0xd1, 0xaf, 0xa2, 0x2a, 0xe9, 0x92, 0xaf, 0x42, 0x3e, 0xd0, 0x77, 0x43,
+ 0x5c, 0xb1, 0xc7, 0x3a, 0xb1, 0x13, 0xfb, 0x9e, 0x5f, 0xe2, 0xb4, 0xf5,
+ 0x3d, 0xfa, 0xc5, 0x8a, 0x51, 0x7e, 0x73, 0x74, 0x12, 0xa1, 0xd6, 0xff,
+ 0xee, 0xe2, 0xdd, 0x5f, 0xda, 0xa3, 0x7c, 0xf6, 0x3c, 0xf2, 0xd5, 0xdf,
+ 0xd2, 0x75, 0x9e, 0xd5, 0xe5, 0xd4, 0x28, 0x25, 0x48, 0x1e, 0x41, 0xee,
+ 0xc8, 0xbe, 0xb9, 0x06, 0x08, 0x7b, 0xfe, 0x45, 0xc8, 0x9c, 0x0a, 0xe7,
+ 0x8b, 0x1d, 0xa1, 0x3c, 0x27, 0xa6, 0xb5, 0xb3, 0xad, 0x39, 0x43, 0x87,
+ 0xef, 0x09, 0x4e, 0x26, 0x99, 0xa7, 0x79, 0xe0, 0x67, 0xfe, 0xa0, 0xaa,
+ 0x4d, 0x4e, 0x69, 0x37, 0xd6, 0x13, 0xac, 0x6a, 0x9a, 0x92, 0x92, 0xf0,
+ 0x29, 0xdd, 0xac, 0xb7, 0xa4, 0x36, 0xfc, 0xb2, 0xe8, 0xbd, 0x76, 0x06,
+ 0x89, 0x50, 0x54, 0xa1, 0x59, 0xcc, 0x18, 0x77, 0xc9, 0x16, 0x7a, 0x69,
+ 0xc8, 0x90, 0x27, 0xee, 0xa5, 0xf0, 0x9e, 0x1d, 0xc9, 0xa5, 0x3c, 0x80,
+ 0xf3, 0x11, 0x31, 0x73, 0x58, 0x56, 0xb8, 0x50, 0x50, 0xe3, 0x2e, 0x6b,
+ 0xc6, 0xdb, 0x5c, 0xc1, 0xde, 0xd7, 0xed, 0x96, 0xb8, 0xb5, 0xca, 0xa2,
+ 0x05, 0x69, 0xa4, 0xcb, 0x81, 0xbd, 0xca, 0x7e, 0x72, 0xa1, 0xab, 0x8a,
+ 0xc0, 0x5e, 0x22, 0xc9, 0xc0, 0xa1, 0x6e, 0x44, 0xc2, 0xeb, 0xed, 0x42,
+ 0x04, 0x5e, 0xc2, 0xa3, 0x56, 0x89, 0x0f, 0xa4, 0xa0, 0x4b, 0x8a, 0x8b,
+ 0x38, 0x4d, 0x20, 0x94, 0x75, 0x03, 0x59, 0x0a, 0xd4, 0xf6, 0x4d, 0xa0,
+ 0xee, 0x37, 0x7f, 0xe1, 0x63, 0x0e, 0x5c, 0x52, 0x9f, 0xd1, 0x03, 0xe6,
+ 0x33, 0x55, 0x13, 0x7d, 0x8e, 0xca, 0xd6, 0x4b, 0x12, 0xbb, 0x58, 0xa5,
+ 0xd5, 0x96, 0x49, 0xae, 0xb7, 0x79, 0xa8, 0xdb, 0xa3, 0x51, 0xe7, 0x7a,
+ 0xff, 0x79, 0x18, 0x20, 0xc8, 0xe7, 0x77, 0xcf, 0xe1, 0x91, 0x79, 0xd9,
+ 0xe3, 0x7f, 0xbd, 0x64, 0x5e, 0xa6, 0xa6, 0x1d, 0x2e, 0x60, 0xc5, 0x9c,
+ 0xd5, 0xd8, 0xe3, 0x73, 0x4d, 0x24, 0x1d, 0x3c, 0x15, 0x37, 0xeb, 0xac,
+ 0x26, 0xf2, 0xc8, 0x4c, 0x10, 0x07, 0x32, 0x3f, 0x92, 0xbd, 0xcf, 0x10,
+ 0x9f, 0x70, 0x5b, 0xc9, 0xd6, 0x5b, 0xc9, 0x8f, 0xbc, 0x3b, 0x78, 0xd6,
+ 0x3e, 0xa0, 0x4d, 0xf5, 0x80, 0x3c, 0x10, 0x63, 0x55, 0x47, 0xf6, 0xc2,
+ 0x71, 0xd1, 0x35, 0x95, 0x65, 0xd3, 0x53, 0x50, 0x8b, 0x7f, 0x6c, 0x0e,
+ 0x98, 0x02, 0x3f, 0x92, 0x23, 0x4a, 0x56, 0xb9, 0x38, 0x7a, 0xf7, 0x61,
+ 0x78, 0xf4, 0x16, 0x8c, 0x4e, 0x5d, 0x8d, 0x90, 0xc2, 0x5d, 0x39, 0x2d,
+ 0x17, 0x3b, 0x95, 0x9b, 0x92, 0x55, 0x05, 0xe9, 0x48, 0xbb, 0x78, 0x90,
+ 0x57, 0x36, 0xbb, 0x29, 0x8d, 0x49, 0x13, 0x26, 0x17, 0xf0, 0xe5, 0x2c,
+ 0xef, 0xfe, 0x02, 0xca, 0x03, 0x1e, 0xf5, 0x24, 0xa3, 0x72, 0x07, 0xaf,
+ 0x19, 0xc4, 0x10, 0x08, 0x24, 0xbf, 0x34, 0x42, 0x3d, 0xcd, 0xb2, 0xb9,
+ 0x52, 0x3f, 0xa5, 0xb3, 0x72, 0x51, 0xb0, 0x57, 0xcb, 0xac, 0x90, 0x3a,
+ 0x72, 0xe0, 0x38, 0x44, 0xbb, 0x7c, 0x23, 0x47, 0x47, 0x4e, 0x7e, 0x0b,
+ 0xb2, 0xd7, 0x09, 0x39, 0xac, 0xd9, 0xe7, 0x24, 0xdc, 0xdc, 0xb4, 0xc8,
+ 0xbc, 0x24, 0x9b, 0x14, 0x35, 0xf2, 0xf5, 0xb6, 0x25, 0xc5, 0x3b, 0x50,
+ 0xef, 0xcd, 0xe8, 0xbc, 0xdc, 0x97, 0x74, 0x7a, 0x5d, 0x56, 0xa6, 0xd1,
+ 0x99, 0x4d, 0x7b, 0xab, 0x00, 0x5a, 0xa9, 0xb7, 0xba, 0x65, 0x99, 0x02,
+ 0x09, 0x32, 0x7d, 0xe0, 0x00, 0x66, 0xc6, 0xe9, 0xc0, 0xb4, 0xfb, 0x79,
+ 0x9a, 0x60, 0xe7, 0x52, 0x68, 0x87, 0x05, 0xd6, 0x50, 0x12, 0x78, 0x31,
+ 0x17, 0x3c, 0x83, 0xe1, 0x46, 0xfc, 0x7b, 0x56, 0x95, 0x5d, 0x4b, 0x5c,
+ 0xf5, 0x31, 0xed, 0xb9, 0xdf, 0xf1, 0x7f, 0x66, 0x85, 0x8c, 0xdd, 0xbd,
+ 0xd8, 0x09, 0x98, 0xa5, 0x9f, 0xe0, 0x5d, 0x58, 0xba, 0x1d, 0x2e, 0xd9,
+ 0x1b, 0x00, 0x8c, 0x17, 0x3d, 0x28, 0xc9, 0x8b, 0x44, 0x45, 0xdf, 0x24,
+ 0x7e, 0x8e, 0x03, 0x63, 0x4b, 0xec, 0x72, 0x8b, 0x03, 0x22, 0x00, 0xf1,
+ 0xf0, 0xba, 0xd8, 0x5e, 0xc3, 0xc5, 0x93, 0xd2, 0x30, 0x49, 0x37, 0xdf,
+ 0xe4, 0x3a, 0x00, 0xf8, 0xdc, 0x16, 0xfd, 0x78, 0x5a, 0x52, 0x80, 0x89,
+ 0x1d, 0x28, 0xf8, 0x7a, 0x58, 0xbe, 0x93, 0x34, 0xbf, 0x8a, 0x76, 0xa1,
+ 0x5a, 0x2a, 0xec, 0xce, 0x03, 0xa1, 0x39, 0x32, 0x82, 0xf2, 0xb1, 0x38,
+ 0xab, 0xb5, 0xe2, 0x05, 0x46, 0xc1, 0x6f, 0x06, 0x82, 0x44, 0xdb, 0xc9,
+ 0xb8, 0x81, 0x5e, 0x9b, 0xb9, 0x4f, 0x3a, 0x8d, 0x84, 0x3b, 0x86, 0xe4,
+ 0xdf, 0xc0, 0x3b, 0x26, 0xf9, 0xd6, 0x11, 0xa3, 0x97, 0xad, 0x07, 0x72,
+ 0x12, 0x21, 0x81, 0x85, 0xc6, 0x03, 0xf3, 0x21, 0x2d, 0xfc, 0xce, 0x62,
+ 0x05, 0x4c, 0x23, 0x79, 0x39, 0x41, 0xea, 0x0b, 0xb3, 0xb1, 0xa7, 0x61,
+ 0xaa, 0x3e, 0x11, 0x56, 0x48, 0x6f, 0x36, 0xc8, 0xc9, 0xf4, 0x29, 0x9f,
+ 0x2d, 0x66, 0x78, 0xbd, 0x27, 0x8a, 0xf5, 0x0c, 0x8a, 0xb5, 0x2e, 0xeb,
+ 0x00, 0x31, 0xca, 0x86, 0x8f, 0x70, 0x77, 0xef, 0xdb, 0x88, 0x21, 0xb6,
+ 0xad, 0x54, 0x9e, 0xa5, 0xb7, 0x98, 0xc7, 0x19, 0x0b, 0xf5, 0x7f, 0x7c,
+ 0x87, 0x26, 0xaf, 0xcd, 0x8d, 0xfd, 0x45, 0x24, 0x43, 0x25, 0x26, 0x3e,
+ 0xf2, 0x5a, 0xb0, 0xaa, 0xd9, 0xc4, 0xb3, 0x0f, 0x78, 0xc7, 0xd1, 0x4d,
+ 0xcb, 0xcb, 0xb4, 0x54, 0x46, 0xb9, 0x1a, 0x26, 0xfc, 0x69, 0x0c, 0xd4,
+ 0xf9, 0xed, 0xf8, 0x62, 0x92, 0x2d, 0x4f, 0x2b, 0x27, 0xf4, 0xd6, 0x41,
+ 0x6d, 0x00, 0x11, 0x15, 0x2d, 0x85, 0xc3, 0x7c, 0x7e, 0x47, 0x40, 0x0d,
+ 0x62, 0xb4, 0x90, 0xbb, 0x53, 0x66, 0x59, 0x7d, 0x14, 0x6d, 0x42, 0xea,
+ 0xb6, 0xc8, 0x23, 0x51, 0xd6, 0xb9, 0x45, 0x38, 0x15, 0x9f, 0x39, 0x58,
+ 0xf6, 0xcd, 0x84, 0xc8, 0xda, 0xf5, 0x12, 0xcd, 0x2f, 0x49, 0x92, 0xe7,
+ 0x9f, 0x3e, 0x85, 0x97, 0xa5, 0xb3, 0x73, 0xb8, 0xfa, 0x2c, 0x1b, 0x41,
+ 0x2f, 0x3e, 0x75, 0x8c, 0xa0, 0x41, 0xb4, 0x46, 0xac, 0x5c, 0x0d, 0x24,
+ 0x1d, 0x47, 0x25, 0x87, 0x4e, 0x78, 0xb6, 0xd2, 0xc8, 0x3c, 0xb2, 0x50,
+ 0xb8, 0x4f, 0xf3, 0x26, 0x92, 0x7a, 0x23, 0x28, 0x3a, 0x49, 0x4e, 0x76,
+ 0xc1, 0x2d, 0xf3, 0x67, 0x73, 0x63, 0x94, 0x3a, 0x9a, 0x43, 0x9d, 0x20,
+ 0x6d, 0xd0, 0xcc, 0xdb, 0x82, 0x9d, 0xe6, 0xc1, 0x3c, 0xd1, 0x57, 0x78,
+ 0xda, 0xe9, 0x34, 0x99, 0xab, 0x2a, 0x47, 0x39, 0x62, 0x3e, 0xd3, 0x75,
+ 0xb2, 0x6b, 0xa6, 0x3f, 0x2f, 0x16, 0x04, 0xa5, 0xf3, 0x48, 0xff, 0x2c,
+ 0x7b, 0x49, 0x64, 0xda, 0xa7, 0x00, 0x69, 0x6a, 0x1a, 0x35, 0x1d, 0xbc,
+ 0xda, 0x0b, 0xea, 0xf0, 0xf1, 0x40, 0xd9, 0x0b, 0x6b, 0xb0, 0xfb, 0x17,
+ 0x6c, 0x44, 0x1b, 0xb4, 0x05, 0x28, 0xf4, 0x4a, 0xcd, 0x3e, 0x99, 0xd9,
+ 0x66, 0x5e, 0x75, 0x77, 0xa3, 0xb9, 0xdb, 0x6c, 0xe0, 0x71, 0x1c, 0x47,
+ 0x10, 0x1b, 0x2d, 0xf9, 0x6d, 0x6b, 0x38, 0x40, 0xc4, 0x95, 0x8d, 0x9c,
+ 0x45, 0xce, 0xe2, 0x95, 0x20, 0xdf, 0x7f, 0x83, 0x33, 0x5d, 0xa7, 0xf5,
+ 0xb4, 0x9f, 0x77, 0xc5, 0xf8, 0x11, 0x70, 0x60, 0x16, 0xc3, 0x61, 0x77,
+ 0xa1, 0x69, 0x62, 0x78, 0x30, 0x3c, 0xe9, 0xf0, 0x07, 0xad, 0x24, 0x31,
+ 0xdc, 0x6d, 0x6b, 0x3c, 0x4f, 0xe4, 0x29, 0x53, 0xc7, 0x7d, 0x2b, 0x37,
+ 0x77, 0x15, 0x45, 0x19, 0x33, 0xdf, 0x2d, 0x2b, 0xc4, 0x52, 0xef, 0xe3,
+ 0xe3, 0x8e, 0xcf, 0x2d, 0xe8, 0x0a, 0xd3, 0xe0, 0x00, 0x6d, 0xcf, 0x15,
+ 0x73, 0x92, 0x18, 0x9b, 0x0a, 0x9e, 0xd9, 0x16, 0xe8, 0xc6, 0x63, 0xf1,
+ 0x4f, 0xa6, 0x3e, 0xd3, 0x91, 0x0f, 0x49, 0x4d, 0xa7, 0xb2, 0x4f, 0xfd,
+ 0x18, 0xeb, 0x8b, 0x8d, 0x1e, 0x88, 0x2a, 0x59, 0xe3, 0x69, 0x82, 0x71,
+ 0x34, 0x3d, 0xbe, 0xb0, 0xac, 0xa0, 0xa2, 0x36, 0x1c, 0x1a, 0x82, 0x68,
+ 0x44, 0x43, 0xd2, 0x51, 0x0e, 0x90, 0x5d, 0x71, 0xd1, 0x1e, 0xed, 0x81,
+ 0xd7, 0x66, 0x57, 0x40, 0xe6, 0x53, 0x81, 0x81, 0xfd, 0x6d, 0x91, 0x9b,
+ 0xdb, 0x89, 0x12, 0x66, 0x06, 0xc9, 0x5b, 0x86, 0xf3, 0x48, 0xe5, 0x1b,
+ 0xae, 0x83, 0x85, 0x5a, 0x59, 0x0c, 0x0e, 0x16, 0x05, 0xd1, 0x74, 0x20,
+ 0x88, 0x5d, 0x98, 0x0e, 0xd1, 0x49, 0x84, 0xea, 0x6a, 0x4e, 0xd5, 0x21,
+ 0x75, 0x7b, 0x66, 0x4e, 0x3a, 0x4c, 0x33, 0x2e, 0x79, 0xde, 0x00, 0xc5,
+ 0x21, 0xc1, 0x5e, 0x45, 0x61, 0x03, 0x68, 0x58, 0xdf, 0x86, 0x66, 0x60,
+ 0xaf, 0x55, 0xef, 0x00, 0x66, 0x91, 0xd8, 0x00, 0x0d, 0x95, 0xcb, 0x28,
+ 0xd2, 0xe9, 0x36, 0x17, 0xbc, 0x37, 0x62, 0x66, 0x4a, 0xfd, 0xa4, 0x96,
+ 0xb4, 0xb6, 0x4b, 0x77, 0x6e, 0x9a, 0x18, 0xb7, 0x08, 0xaf, 0x50, 0x6b,
+ 0x89, 0xd8, 0x1b, 0x69, 0x8d, 0x0e, 0x49, 0x39, 0xf1, 0xd0, 0x3f, 0x36,
+ 0xf6, 0x1e, 0x72, 0xc8, 0xf8, 0xb3, 0x45, 0xe6, 0x21, 0x8f, 0x17, 0x73,
+ 0xd9, 0x5a, 0xb7, 0x55, 0xa9, 0xee, 0x77, 0xb4, 0x5e, 0x66, 0xa3, 0x8d,
+ 0xca, 0x5a, 0x09, 0x08, 0xcd, 0x20, 0xcd, 0xeb, 0xad, 0xf3, 0x04, 0xc6,
+ 0xa6, 0x5f, 0x48, 0x8a, 0xc1, 0x65, 0xf6, 0x3c, 0x4a, 0x8c, 0x55, 0xd5,
+ 0xf5, 0xc2, 0xda, 0x84, 0xbf, 0x98, 0x0f, 0xc3, 0x27, 0x1e, 0x74, 0x94,
+ 0x3f, 0x64, 0x48, 0x5a, 0xd4, 0x9a, 0x00, 0x51, 0x5a, 0xd4, 0x10, 0xac,
+ 0x67, 0x3e, 0x44, 0x6a, 0xd1, 0x98, 0xcd, 0xb4, 0x90, 0x1c, 0xf7, 0xf1,
+ 0xd4, 0x08, 0xfb, 0x88, 0xad, 0xa9, 0xa5, 0x88, 0x88, 0x35, 0xaa, 0xd7,
+ 0x15, 0xa7, 0xf5, 0x82, 0x54, 0x8f, 0xe9, 0x82, 0xbe, 0xcc, 0x84, 0x4b,
+ 0x96, 0xf0, 0x47, 0x53, 0x73, 0xa3, 0x24, 0x59, 0x96, 0xb1, 0x87, 0xce,
+ 0xa8, 0xc7, 0x17, 0xb6, 0xd0, 0xaa, 0x65, 0x4a, 0xa5, 0xd5, 0xa5, 0x54,
+ 0x19, 0x2c, 0xe9, 0x1d, 0x19, 0x84, 0x3d, 0xbf, 0x12, 0xa7, 0x6f, 0x7d,
+ 0x53, 0x22, 0x82, 0x76, 0xa7, 0x55, 0x66, 0x33, 0x8d, 0x91, 0x20, 0xd9,
+ 0x70, 0x5e, 0xab, 0x67, 0x7a, 0x77, 0x68, 0xae, 0x2a, 0x90, 0xc1, 0x4c,
+ 0x9a, 0xa5, 0xeb, 0x6f, 0x6c, 0xeb, 0xee, 0x60, 0xbb, 0x25, 0x38, 0x59,
+ 0x6d, 0xb0, 0x75, 0x34, 0xe5, 0xec, 0xb5, 0xba, 0xa4, 0x4a, 0x43, 0x04,
+ 0x63, 0xfa, 0x94, 0xe2, 0x9b, 0xad, 0x72, 0x9b, 0xff, 0xcc, 0xfb, 0xf0,
+ 0x45, 0xbb, 0x2c, 0x85, 0x30, 0xa0, 0xfd, 0xaa, 0x03, 0x95, 0x3e, 0xed,
+ 0x44, 0x2d, 0xc1, 0x83, 0xff, 0xdf, 0x79, 0xa2, 0xd2, 0xe4, 0x69, 0x67,
+ 0x2a, 0xed, 0x1e, 0xaa, 0x48, 0xc9, 0xd4, 0xa5, 0x3d, 0xfe, 0x0d, 0x4f,
+ 0x19, 0x1f, 0xb3, 0x5f, 0x74, 0xce, 0x6c, 0x69, 0xdb, 0xff, 0x8b, 0x4f,
+ 0xd9, 0xe7, 0x1d, 0x2d, 0x10, 0x74, 0x82, 0x4f, 0xac, 0xfe, 0x42, 0x20,
+ 0x5e, 0xd2, 0xb5, 0xb6, 0x2d, 0xf3, 0x57, 0x9c, 0x3c, 0x98, 0x29, 0x64,
+ 0x22, 0x71, 0x6e, 0x80, 0xc9, 0x30, 0x1f, 0x2f, 0xac, 0xcc, 0xd3, 0xd4,
+ 0xd8, 0x95, 0x0d, 0x87, 0xfe, 0x29, 0xa5, 0xde, 0xf4, 0x8b, 0x51, 0x0f,
+ 0xac, 0x06, 0xa1, 0xe3, 0xba, 0x36, 0x77, 0xfb, 0x3c, 0x67, 0x8d, 0xc1,
+ 0x68, 0x2f, 0xc4, 0x5d, 0xff, 0xf5, 0x70, 0xd8, 0x3f, 0x38, 0x3f, 0xee,
+ 0x9e, 0xbc, 0xf6, 0xf7, 0xb4, 0x02, 0xee, 0x8b, 0xa5, 0xc5, 0x60, 0x7c,
+ 0x5f, 0xe2, 0x8b, 0xe8, 0x9c, 0xf2, 0xb7, 0x8d, 0xaa, 0xdb, 0x9d, 0xd8,
+ 0x83, 0xba, 0x85, 0x82, 0x93, 0x0e, 0xf9, 0x3c, 0xbe, 0x42, 0x40, 0xc9,
+ 0x99, 0x6c, 0x9c, 0x56, 0x0d, 0x5e, 0x2c, 0x3c, 0x11, 0x60, 0x06, 0xc1,
+ 0x14, 0x01, 0x8e, 0x87, 0x64, 0xf7, 0xd5, 0xcb, 0x5d, 0x73, 0x30, 0x1e,
+ 0x98, 0x28, 0x4d, 0xde, 0x7f, 0x3e, 0x78, 0xb6, 0x4d, 0x85, 0xc8, 0xf3,
+ 0xc6, 0x73, 0xf9, 0x4b, 0xfb, 0x46, 0xde, 0x45, 0x62, 0xea, 0xd4, 0xad,
+ 0xd3, 0xa3, 0xc3, 0x84, 0x81, 0x55, 0x60, 0xcd, 0x4a, 0x90, 0xe6, 0x41,
+ 0x39, 0x23, 0xb2, 0x22, 0x88, 0xfb, 0x92, 0x28, 0x1d, 0x58, 0xa6, 0x2d,
+ 0x6c, 0xd7, 0xc0, 0x1c, 0x0b, 0xa6, 0xc3, 0x72, 0x1e, 0x23, 0xb3, 0xba,
+ 0xb0, 0x3d, 0x21, 0x89, 0xc7, 0x86, 0x85, 0xcc, 0xcc, 0x3c, 0x52, 0x58,
+ 0xd2, 0x9f, 0x93, 0x27, 0x32, 0x1f, 0x53, 0x0d, 0xc4, 0xe5, 0xeb, 0xa3,
+ 0x06, 0xcc, 0x12, 0x13, 0xc8, 0xb9, 0x27, 0x03, 0x4b, 0x47, 0x24, 0xa2,
+ 0x02, 0xc3, 0xc8, 0xc5, 0x32, 0x9e, 0x59, 0xa3, 0xe4, 0xea, 0x6f, 0x93,
+ 0x95, 0xde, 0xfd, 0xa8, 0x45, 0x15, 0x51, 0x89, 0xdb, 0x86, 0x13, 0xf7,
+ 0x5d, 0x44, 0xb5, 0x18, 0x4c, 0xcb, 0x46, 0xc4, 0x46, 0x52, 0xd7, 0x17,
+ 0x80, 0x0d, 0xb0, 0x90, 0x22, 0xd5, 0x93, 0x6d, 0xaf, 0x21, 0xdb, 0xfa,
+ 0xaa, 0xc6, 0x23, 0xe0, 0x79, 0xf7, 0xad, 0xed, 0x2a, 0x4b, 0xa7, 0xf2,
+ 0xa2, 0x18, 0x6f, 0xf0, 0xbd, 0x05, 0xbf, 0xbc, 0x42, 0x99, 0x86, 0x3a,
+ 0xa0, 0x1a, 0xba, 0x07, 0xe0, 0xcd, 0x32, 0x6d, 0xf1, 0xd3, 0x16, 0x61,
+ 0x30, 0x4b, 0x9b, 0xb1, 0xb2, 0xaa, 0x99, 0x0b, 0x25, 0x9f, 0xa7, 0xd3,
+ 0xe4, 0x09, 0xd8, 0xd7, 0xe5, 0x8b, 0xff, 0xa8, 0xc4, 0xd3, 0xb3, 0x19,
+ 0x93, 0x73, 0x7e, 0x71, 0x75, 0xe6, 0x40, 0x8b, 0x55, 0xe7, 0x7e, 0x91,
+ 0xb4, 0x24, 0xdd, 0x92, 0x06, 0x29, 0xbd, 0x57, 0x04, 0x9a, 0x63, 0x1d,
+ 0xe9, 0x86, 0x7e, 0x8d, 0x2d, 0xa9, 0xdc, 0x5e, 0xe3, 0x72, 0x36, 0x77,
+ 0x01, 0x03, 0x6d, 0x54, 0xd2, 0xb2, 0xb6, 0x06, 0x5d, 0x31, 0x18, 0x13,
+ 0xef, 0x5c, 0x4e, 0x75, 0xfc, 0x04, 0xe1, 0xfb, 0x5b, 0x08, 0x43, 0x52,
+ 0xe2, 0xd8, 0xd3, 0xf0, 0x88, 0x3a, 0x17, 0xaf, 0x6a, 0x2f, 0x7b, 0x32,
+ 0xd9, 0x44, 0x34, 0x33, 0xf3, 0xc9, 0xd8, 0x34, 0xa0, 0x1c, 0xfa, 0xa9,
+ 0x10, 0x1a, 0xa3, 0x8f, 0x6e, 0x0d, 0x9e, 0x52, 0xb8, 0xbc, 0x27, 0x35,
+ 0xca, 0x2d, 0x77, 0x6a, 0xc8, 0xf2, 0xf2, 0x7f, 0x83, 0x22, 0xf8, 0x22,
+ 0xb1, 0x6b, 0xf5, 0x14, 0x7d, 0x90, 0xa9, 0x88, 0xb9, 0x6e, 0x5f, 0xc0,
+ 0xb2, 0xe3, 0x8c, 0xae, 0xff, 0xa7, 0x0f, 0xfe, 0xff, 0x92, 0x3e, 0xf8,
+ 0xab, 0x4f, 0xa9, 0xb2, 0x2b, 0xf6, 0x15, 0x9b, 0x67, 0xcf, 0xa6, 0x3b,
+ 0x8d, 0x31, 0x40, 0xec, 0xf4, 0xe1, 0xe9, 0x47, 0xd4, 0x3b, 0xa1, 0x49,
+ 0xb8, 0x15, 0xfe, 0xef, 0x38, 0xa2, 0x4f, 0x3a, 0x99, 0xff, 0xcf, 0xfb,
+ 0xf1, 0xdf, 0xed, 0x1c, 0x2e, 0xd7, 0x06, 0x37, 0xcd, 0x26, 0xbb, 0x27,
+ 0xae, 0x7f, 0xae, 0xb6, 0x01, 0x4b, 0x7b, 0xcb, 0x69, 0x3e, 0x94, 0x2d,
+ 0xc2, 0x73, 0x77, 0x7c, 0xfe, 0xdd, 0xcb, 0x1e, 0x42, 0x58, 0xc3, 0x6e,
+ 0xd4, 0xb2, 0x4a, 0x4e, 0xde, 0x1e, 0x9c, 0xff, 0x82, 0xd3, 0xfe, 0x17,
+ 0xf8, 0xa1, 0xe7, 0x59, 0x36, 0xe9, 0x73, 0x84, 0xe4, 0x35, 0xfe, 0x11,
+ 0x89, 0x29, 0xa6, 0x36, 0x03, 0x1c, 0xdb, 0x96, 0x02, 0x27, 0x61, 0xac,
+ 0x16, 0x2f, 0x1b, 0x35, 0xa5, 0x10, 0x5e, 0x06, 0x82, 0x6f, 0xd6, 0xa1,
+ 0x97, 0xa5, 0x2c, 0x26, 0x5b, 0x9c, 0x8c, 0x82, 0x2f, 0x63, 0xab, 0x48,
+ 0x88, 0x9d, 0x8e, 0xf7, 0x35, 0x71, 0x37, 0x59, 0x02, 0x3c, 0xef, 0x19,
+ 0xe5, 0x34, 0x8d, 0x22, 0x3e, 0x1e, 0xdc, 0x50, 0x38, 0xb8, 0xc3, 0x1c,
+ 0x4b, 0xcf, 0x76, 0xb8, 0x36, 0x35, 0x92, 0x61, 0x7f, 0xc7, 0x8c, 0xf0,
+ 0xee, 0xe7, 0x97, 0x61, 0x06, 0x56, 0x4e, 0xa5, 0xbf, 0x12, 0xad, 0x19,
+ 0xa4, 0x58, 0xe0, 0x64, 0x51, 0x85, 0xb5, 0x78, 0x52, 0x7f, 0x7e, 0x38,
+ 0x4a, 0xce, 0xfd, 0xb5, 0x9f, 0x68, 0xcf, 0xa6, 0xf9, 0xbc, 0xf7, 0x42,
+ 0x60, 0x53, 0x73, 0xd2, 0x44, 0xa7, 0x84, 0xaa, 0xdf, 0x2b, 0x89, 0x34,
+ 0x12, 0xa1, 0xbc, 0xfa, 0xf7, 0x1d, 0x22, 0xf6, 0x2f, 0x21, 0x34, 0xca,
+ 0x7b, 0x77, 0x35, 0x43, 0x60, 0x59, 0x34, 0x15, 0x71, 0x09, 0x6b, 0x9c,
+ 0x54, 0x89, 0x99, 0x17, 0xb5, 0x5f, 0x50, 0x2d, 0x49, 0xb9, 0x3a, 0x31,
+ 0x66, 0x2d, 0xa4, 0xf4, 0xe3, 0xf3, 0x9d, 0x64, 0xcd, 0x78, 0xe0, 0xd6,
+ 0x16, 0x44, 0x5b, 0x54, 0xb8, 0xd8, 0x28, 0xb9, 0x5a, 0xdb, 0xcd, 0xcc,
+ 0x51, 0xf5, 0x20, 0xa4, 0x30, 0x4b, 0xbc, 0x15, 0x1a, 0xec, 0x5f, 0x02,
+ 0x10, 0xfe, 0x0d, 0x01, 0x91, 0xab, 0x2b, 0xf0, 0x84, 0x49, 0xce, 0x6a,
+ 0x9e, 0x58, 0xb1, 0x90, 0xa2, 0x7e, 0x30, 0xed, 0x05, 0x2a, 0x35, 0x96,
+ 0x37, 0x0f, 0x94, 0x27, 0x7f, 0x2f, 0xd9, 0x1a, 0x5d, 0x79, 0x3f, 0x3c,
+ 0x79, 0xc6, 0x48, 0xc9, 0xcb, 0x93, 0xa1, 0x4f, 0x38, 0x5d, 0x27, 0x5c,
+ 0x2d, 0xdb, 0x88, 0x9f, 0xaf, 0x8e, 0x0e, 0x86, 0x97, 0x83, 0xc8, 0x18,
+ 0x43, 0x54, 0x88, 0xcb, 0xd8, 0x23, 0xf2, 0x9d, 0x69, 0xfa, 0x40, 0x1c,
+ 0x6f, 0x92, 0xf6, 0x43, 0x7d, 0xe3, 0xae, 0x69, 0xdb, 0x64, 0xe6, 0x32,
+ 0x74, 0x19, 0xb8, 0xa2, 0x90, 0x9b, 0xc9, 0xcc, 0xdd, 0x28, 0x9f, 0xd2,
+ 0x08, 0x4c, 0xb7, 0x8c, 0x31, 0x34, 0x13, 0xb8, 0x2f, 0xb2, 0x48, 0xcb,
+ 0x29, 0xc1, 0xc9, 0xe8, 0x3b, 0x6d, 0x4f, 0x04, 0x91, 0x48, 0x4a, 0x6a,
+ 0xed, 0xf2, 0x44, 0x39, 0xa3, 0x65, 0x94, 0x75, 0x26, 0x44, 0x5d, 0xd4,
+ 0x86, 0xce, 0x55, 0x0f, 0x93, 0x61, 0x71, 0xf6, 0xcc, 0xc1, 0x41, 0x34,
+ 0x03, 0x61, 0x16, 0x52, 0x5a, 0xdf, 0x2a, 0x5c, 0x7b, 0xdc, 0x20, 0xa5,
+ 0x31, 0x5d, 0x59, 0xdc, 0x66, 0xaf, 0x6b, 0x09, 0x99, 0x85, 0x46, 0xce,
+ 0x26, 0x61, 0xfb, 0xbb, 0xb6, 0xdd, 0xf7, 0x39, 0xb1, 0xde, 0x6e, 0x75,
+ 0xb4, 0x94, 0xf6, 0x8a, 0x6b, 0x88, 0x9c, 0x8a, 0x0b, 0x70, 0xe6, 0x05,
+ 0x45, 0xdb, 0xef, 0xca, 0x78, 0x2d, 0x9b, 0x64, 0x7c, 0x93, 0x99, 0x5b,
+ 0x64, 0xe0, 0x65, 0x1e, 0x3f, 0x79, 0x42, 0xd6, 0x02, 0x8a, 0xaa, 0xc8,
+ 0xf4, 0xfc, 0xe2, 0x09, 0x79, 0xfe, 0x3c, 0x9c, 0x90, 0x2a, 0xfb, 0xdb,
+ 0x24, 0xc6, 0xea, 0x0b, 0xf4, 0x34, 0x80, 0xdb, 0x0c, 0x78, 0xbe, 0x60,
+ 0x6a, 0x62, 0xea, 0xea, 0x36, 0xd5, 0x00, 0xe1, 0x5a, 0xe9, 0x99, 0x47,
+ 0xf8, 0x44, 0x06, 0x36, 0x85, 0x20, 0xc3, 0xa2, 0x86, 0x8d, 0x64, 0x0c,
+ 0xbb, 0x67, 0x15, 0xf0, 0xd4, 0x4d, 0x57, 0x17, 0x5a, 0x13, 0xf9, 0xc8,
+ 0x4a, 0x91, 0x45, 0xc5, 0x4b, 0x50, 0x49, 0x82, 0x12, 0xa0, 0xec, 0xd9,
+ 0xe9, 0xf7, 0xaf, 0x9a, 0xb9, 0x1d, 0xd8, 0xca, 0xdd, 0xb1, 0x13, 0x4c,
+ 0xc6, 0x92, 0xa1, 0x5f, 0x56, 0x0f, 0xb6, 0x6c, 0x9b, 0x1d, 0xbf, 0x07,
+ 0xc9, 0xf5, 0xa6, 0x20, 0x80, 0x94, 0x51, 0x99, 0x0a, 0x46, 0x8c, 0x82,
+ 0x5b, 0x47, 0x8a, 0x11, 0x3e, 0x75, 0x22, 0x42, 0xe1, 0x81, 0x69, 0x69,
+ 0xd5, 0x67, 0xd3, 0xf1, 0x8a, 0x08, 0xd7, 0xf0, 0xa8, 0xcc, 0x00, 0x77,
+ 0x93, 0x21, 0xb9, 0xfd, 0x90, 0xfd, 0xd6, 0x98, 0xf2, 0x77, 0xd9, 0x14,
+ 0x09, 0x88, 0x59, 0x31, 0xae, 0x1e, 0xe6, 0x3e, 0x0d, 0xf5, 0xe4, 0x11,
+ 0x0d, 0xfe, 0x91, 0x15, 0x68, 0xa1, 0xda, 0x77, 0x8d, 0xac, 0xdb, 0x0a,
+ 0xf5, 0xaf, 0xd4, 0x16, 0x7d, 0x65, 0xca, 0x3c, 0xba, 0x84, 0x1b, 0x1f,
+ 0xf7, 0x4b, 0x46, 0x8c, 0xbb, 0xf4, 0x84, 0xe8, 0x4d, 0xb2, 0x63, 0xba,
+ 0xaa, 0xf9, 0xd5, 0x02, 0xcc, 0x3d, 0x16, 0xd8, 0xfb, 0xe4, 0xb5, 0xdf,
+ 0xeb, 0xf1, 0x8c, 0xdd, 0xed, 0x05, 0x60, 0x7f, 0x88, 0x84, 0x77, 0xe4,
+ 0xa6, 0xe9, 0x94, 0x1c, 0xa6, 0x23, 0xab, 0x35, 0x7d, 0xf6, 0xd8, 0x1f,
+ 0x65, 0xbd, 0xa1, 0x5a, 0xcf, 0x70, 0x49, 0xc1, 0x74, 0x3e, 0xed, 0x9c,
+ 0x61, 0x36, 0x34, 0x92, 0x95, 0xc1, 0x5b, 0xea, 0x59, 0x1a, 0x2d, 0xf2,
+ 0x69, 0xe3, 0x25, 0xe6, 0x99, 0xa7, 0xef, 0xf6, 0x96, 0x92, 0x2a, 0x0f,
+ 0xe4, 0xf7, 0x48, 0xb3, 0x9c, 0x10, 0x7d, 0xbf, 0x63, 0x7c, 0x4b, 0x6c,
+ 0xf1, 0x4b, 0x80, 0x17, 0xc9, 0x3f, 0xfd, 0x72, 0xf7, 0xb3, 0x97, 0x5b,
+ 0xab, 0xab, 0x95, 0x53, 0xc1, 0x0b, 0x4a, 0x2f, 0x93, 0x8d, 0x44, 0xff,
+ 0xdc, 0x1b, 0xf8, 0x73, 0x14, 0xb2, 0xf2, 0x07, 0xcc, 0x37, 0x13, 0xda,
+ 0x12, 0x34, 0x0d, 0xca, 0x5c, 0x4e, 0x5b, 0x85, 0x07, 0xd6, 0x94, 0xf6,
+ 0x94, 0x63, 0x2b, 0x87, 0x46, 0x61, 0x77, 0x98, 0x6c, 0x24, 0xf6, 0x9f,
+ 0x69, 0x07, 0x9e, 0x71, 0xcf, 0xbc, 0x02, 0x68, 0xdc, 0x53, 0xfc, 0x7d,
+ 0xd0, 0xfe, 0x97, 0x1f, 0xd0, 0x74, 0x0d, 0xfc, 0xba, 0x55, 0x7e, 0xf6,
+ 0x7b, 0xaf, 0xf2, 0xb3, 0x47, 0x56, 0xf9, 0xd9, 0x53, 0x57, 0xf9, 0xb3,
+ 0x17, 0x2f, 0x3f, 0xff, 0x75, 0xab, 0xec, 0x4d, 0xf2, 0xff, 0x99, 0x55,
+ 0xf6, 0xb6, 0xd9, 0xaf, 0x5b, 0x65, 0x01, 0x86, 0x04, 0x82, 0x58, 0x6a,
+ 0x45, 0x00, 0xc5, 0x47, 0xd9, 0xde, 0x0c, 0xbb, 0xe4, 0x87, 0xd5, 0x04,
+ 0x6d, 0x53, 0xea, 0xda, 0x42, 0x51, 0x46, 0x11, 0x8b, 0x98, 0xd9, 0x2e,
+ 0xf9, 0x1d, 0x1a, 0xee, 0x7c, 0x4a, 0xe5, 0x86, 0x36, 0xfa, 0x1b, 0xea,
+ 0x22, 0xd1, 0xd4, 0x1f, 0x65, 0x6e, 0xe1, 0xaf, 0x99, 0xc5, 0xfe, 0x27,
+ 0x32, 0xff, 0x84, 0xb8, 0x19, 0x0f, 0xf9, 0xd4, 0x9a, 0xb4, 0x25, 0xe5,
+ 0x27, 0x62, 0xd8, 0xac, 0xa0, 0xe0, 0x89, 0xed, 0x31, 0x53, 0xe4, 0x44,
+ 0x2a, 0x7b, 0xd0, 0xe2, 0x13, 0x32, 0x39, 0xc8, 0x2d, 0x43, 0xf6, 0xb0,
+ 0x60, 0x9f, 0x22, 0x85, 0x41, 0x04, 0x6b, 0xd7, 0xa9, 0x23, 0xbe, 0x0c,
+ 0x31, 0x4f, 0x98, 0xd3, 0xc6, 0x2b, 0xb0, 0x26, 0x66, 0xd1, 0x5b, 0xea,
+ 0xee, 0x64, 0x31, 0x9b, 0x2b, 0x8b, 0x15, 0x25, 0x37, 0xe4, 0x40, 0x38,
+ 0x69, 0x9a, 0x2b, 0xc3, 0x2e, 0x23, 0xfe, 0x25, 0x9b, 0xeb, 0x90, 0x30,
+ 0x62, 0xc9, 0xab, 0x32, 0xa6, 0xf5, 0x3b, 0x34, 0x2b, 0x9b, 0x47, 0x01,
+ 0x5c, 0x17, 0x13, 0xe8, 0x74, 0x6f, 0x5b, 0x36, 0x9d, 0x4c, 0xc7, 0x27,
+ 0xd9, 0x68, 0x71, 0xad, 0xa9, 0xa2, 0xb6, 0x54, 0x52, 0x7b, 0xb1, 0x90,
+ 0x80, 0x41, 0xf4, 0x10, 0x59, 0x8f, 0x81, 0xb0, 0x0f, 0x61, 0x56, 0x7c,
+ 0x43, 0x75, 0xc2, 0xc6, 0xab, 0x70, 0x53, 0xc1, 0xd0, 0xb1, 0x07, 0xf2,
+ 0x9e, 0x37, 0x74, 0xfc, 0xa4, 0xb5, 0xa2, 0x91, 0x9a, 0x2e, 0xfe, 0x56,
+ 0x69, 0xc6, 0xf3, 0xfe, 0x55, 0x4a, 0xbc, 0x72, 0x41, 0xae, 0xa0, 0x60,
+ 0x25, 0xc5, 0x85, 0x77, 0x79, 0x78, 0x9e, 0xbc, 0x4b, 0xa5, 0xa2, 0x44,
+ 0xb2, 0x69, 0x04, 0xd3, 0x67, 0xcf, 0x77, 0x9f, 0x6d, 0xad, 0x54, 0x50,
+ 0xdb, 0x3c, 0x29, 0xf8, 0x56, 0x51, 0xc6, 0x30, 0xab, 0x97, 0x8b, 0xaa,
+ 0xd0, 0x24, 0x2b, 0xf3, 0xa1, 0x8f, 0xa7, 0x67, 0x6f, 0x8f, 0x4e, 0x0e,
+ 0xfe, 0x62, 0x73, 0x81, 0x69, 0x0e, 0x34, 0xa9, 0xec, 0xa3, 0x31, 0xeb,
+ 0x1e, 0x3e, 0x1a, 0x3b, 0xd9, 0xfc, 0x72, 0xf3, 0xd9, 0x16, 0x12, 0x77,
+ 0x82, 0xf2, 0x62, 0xd7, 0x59, 0x3b, 0x85, 0x9a, 0x01, 0xc4, 0x2b, 0x98,
+ 0x3e, 0xd8, 0x73, 0x47, 0xae, 0xbb, 0x9d, 0x81, 0x91, 0x5a, 0x82, 0x48,
+ 0x64, 0xde, 0x6b, 0xb7, 0x49, 0x3d, 0x0a, 0xfb, 0x54, 0x18, 0x81, 0x24,
+ 0x1b, 0x36, 0x60, 0xad, 0x9a, 0x4f, 0xf3, 0x71, 0x4e, 0x6a, 0x7c, 0x6d,
+ 0xf6, 0x2d, 0x21, 0xae, 0x29, 0x40, 0x7d, 0xd5, 0x66, 0x14, 0x43, 0x62,
+ 0x16, 0x10, 0xcb, 0x2b, 0xbd, 0x4c, 0x6d, 0x91, 0xd8, 0x40, 0x86, 0x66,
+ 0xd3, 0x22, 0x6b, 0xfa, 0xd2, 0xad, 0xd7, 0xe6, 0xcf, 0x37, 0x77, 0xe9,
+ 0x34, 0x48, 0xf9, 0xa3, 0xea, 0x5c, 0xba, 0x33, 0x2d, 0xae, 0x90, 0xde,
+ 0xf4, 0x08, 0xf3, 0x87, 0x96, 0x39, 0x5e, 0x9f, 0x34, 0x47, 0x25, 0x20,
+ 0x88, 0xbf, 0xbc, 0xfc, 0xcb, 0xf9, 0xd1, 0x9b, 0xd7, 0x84, 0x4a, 0xfc,
+ 0x82, 0x70, 0xe7, 0x75, 0x0b, 0xa4, 0x98, 0x50, 0xf1, 0xd8, 0x60, 0x0c,
+ 0x3f, 0xbc, 0x3d, 0x1e, 0x9e, 0x9f, 0x9c, 0x1d, 0xbe, 0x79, 0xfd, 0x03,
+ 0x19, 0x5b, 0x46, 0xa6, 0x3e, 0x78, 0xef, 0xda, 0x9f, 0x59, 0x12, 0xec,
+ 0x30, 0x4f, 0xfc, 0xe8, 0xfb, 0x8f, 0x47, 0xa7, 0xdf, 0xbd, 0x79, 0x7d,
+ 0x97, 0x56, 0x3d, 0x1a, 0x1f, 0xbf, 0xbd, 0xa4, 0xf4, 0x5d, 0x6b, 0xab,
+ 0x91, 0xd6, 0x3a, 0x9a, 0xde, 0xd6, 0xf9, 0xdf, 0xb3, 0xc4, 0xbc, 0x3e,
+ 0x5d, 0x84, 0x1c, 0xb4, 0x97, 0x52, 0xe9, 0xc4, 0x5c, 0x6a, 0x64, 0x27,
+ 0x7c, 0x75, 0xf2, 0x2d, 0xf1, 0x1c, 0x5a, 0x0f, 0xe2, 0x8c, 0x4b, 0x6b,
+ 0x24, 0x5f, 0xbc, 0xd8, 0xdd, 0xdb, 0x72, 0x75, 0xe3, 0xc0, 0x93, 0x6a,
+ 0x7a, 0x7c, 0x1b, 0xe4, 0x4c, 0xfc, 0x3d, 0xf3, 0x8a, 0xcf, 0x4b, 0xed,
+ 0xbb, 0x87, 0x16, 0x6b, 0x81, 0xba, 0x63, 0x90, 0x00, 0x0d, 0x60, 0x28,
+ 0x95, 0xdd, 0xab, 0xc0, 0x17, 0x13, 0xb8, 0xa2, 0x2e, 0xdf, 0x79, 0xd4,
+ 0x05, 0x5f, 0xb9, 0x8d, 0x67, 0xba, 0x23, 0xee, 0xac, 0x95, 0xd7, 0xc6,
+ 0xef, 0x18, 0xe4, 0xe8, 0xda, 0x5a, 0x98, 0x6c, 0x63, 0x8a, 0xcb, 0xfe,
+ 0x89, 0xcf, 0xb3, 0x17, 0x0c, 0x46, 0xf6, 0x47, 0xc9, 0xa4, 0x5a, 0x18,
+ 0xa5, 0x6e, 0x3c, 0x4d, 0x17, 0x5d, 0x69, 0x29, 0xe6, 0x33, 0x4a, 0x37,
+ 0x24, 0xa4, 0x3e, 0x7b, 0x3d, 0x3c, 0x9f, 0xc6, 0x34, 0xbb, 0x4e, 0xc7,
+ 0x0f, 0x89, 0x25, 0x07, 0xb5, 0xc4, 0x16, 0x91, 0x94, 0xf6, 0x24, 0x1d,
+ 0x93, 0x91, 0x33, 0xcd, 0x26, 0xc4, 0x25, 0x44, 0x66, 0x15, 0x67, 0xc8,
+ 0x53, 0x9a, 0x96, 0x3a, 0x44, 0x5a, 0xbd, 0x93, 0xe2, 0x1a, 0xcb, 0xf3,
+ 0x5b, 0x6c, 0x15, 0xb0, 0xf6, 0xee, 0xa3, 0x6d, 0x83, 0xc2, 0x96, 0x2b,
+ 0xe7, 0xf4, 0x79, 0xdb, 0x95, 0xfc, 0x77, 0x1c, 0x72, 0xa2, 0x4f, 0x81,
+ 0xb7, 0xf2, 0x35, 0xfd, 0x35, 0x4e, 0xa2, 0xfc, 0x4e, 0xcd, 0x79, 0xae,
+ 0x5b, 0xca, 0x84, 0xd5, 0x34, 0x6c, 0xcb, 0x7b, 0x25, 0x45, 0x09, 0x88,
+ 0x8a, 0xb7, 0x51, 0xdf, 0xe8, 0x72, 0x72, 0x22, 0xf6, 0x0d, 0xa3, 0xea,
+ 0xae, 0x79, 0x5c, 0x6b, 0x99, 0x2c, 0x6b, 0xd2, 0xa6, 0x65, 0x85, 0xb1,
+ 0x0b, 0x24, 0x05, 0x51, 0x8c, 0xfe, 0x35, 0x35, 0x44, 0x12, 0x91, 0x54,
+ 0x12, 0x33, 0x51, 0x5f, 0x68, 0x34, 0x04, 0x75, 0x2b, 0x4a, 0x61, 0xcc,
+ 0xc1, 0x43, 0xcc, 0x0d, 0x50, 0x47, 0xf8, 0x4a, 0x18, 0xf8, 0xad, 0x06,
+ 0x35, 0x23, 0x17, 0x28, 0xd2, 0x64, 0x39, 0x41, 0x4d, 0x27, 0x6b, 0x55,
+ 0xd6, 0x28, 0x03, 0x0a, 0xd6, 0xab, 0x63, 0x0c, 0x8c, 0x15, 0xfc, 0xd3,
+ 0x6c, 0x9d, 0x6b, 0xcb, 0x35, 0xc9, 0xe3, 0x52, 0x90, 0x14, 0xba, 0x64,
+ 0x04, 0x01, 0x0d, 0x65, 0x4b, 0x59, 0x9d, 0xa2, 0x6c, 0xde, 0x56, 0xb7,
+ 0x64, 0xb5, 0xdc, 0x5e, 0x55, 0xa6, 0x65, 0x6a, 0x84, 0xae, 0x29, 0x73,
+ 0x4b, 0xe1, 0x5e, 0xe2, 0xb4, 0xdb, 0xce, 0x94, 0x04, 0x19, 0x21, 0x0d,
+ 0x23, 0xdc, 0xbb, 0x97, 0x14, 0x71, 0xc2, 0x2a, 0xaa, 0xdc, 0x7f, 0xbf,
+ 0x55, 0x72, 0x68, 0xb3, 0xef, 0x8a, 0xb5, 0xe4, 0x8d, 0x55, 0xdb, 0x22,
+ 0x3c, 0x0a, 0x89, 0x25, 0xae, 0xb5, 0x84, 0x3b, 0xec, 0x16, 0x94, 0x50,
+ 0x84, 0x16, 0xa5, 0xa7, 0xaf, 0x6d, 0x73, 0xee, 0x97, 0x4a, 0xa1, 0x3c,
+ 0x4c, 0x3d, 0x0d, 0xda, 0x2a, 0xb2, 0x7b, 0xbf, 0x2d, 0xa7, 0x8f, 0xdb,
+ 0xf6, 0x7e, 0x4f, 0x47, 0xb0, 0x31, 0x26, 0x28, 0x69, 0x25, 0x79, 0xfd,
+ 0xdd, 0xd1, 0xc5, 0xf0, 0xf8, 0xec, 0xf4, 0x8b, 0xa8, 0x9d, 0x28, 0xbf,
+ 0xb4, 0xa5, 0x7c, 0x34, 0xd3, 0xcd, 0xd5, 0x53, 0x21, 0xf7, 0x90, 0x3a,
+ 0x21, 0xcc, 0x91, 0x4d, 0x28, 0xb9, 0x87, 0x1e, 0xe9, 0x6e, 0x81, 0x5a,
+ 0xda, 0x80, 0xfb, 0x33, 0xad, 0xae, 0x31, 0x17, 0x66, 0x7f, 0xc1, 0xa6,
+ 0x41, 0xb1, 0x4c, 0x35, 0x76, 0xec, 0x5f, 0xf7, 0x82, 0xf1, 0xc7, 0xa1,
+ 0x2a, 0x5e, 0xa4, 0x78, 0x31, 0xe7, 0x3c, 0x28, 0x4a, 0x45, 0x67, 0xb2,
+ 0x0a, 0xbf, 0x7f, 0x01, 0xab, 0xb6, 0xf9, 0x70, 0xeb, 0x45, 0xf3, 0xf0,
+ 0xdd, 0xae, 0x97, 0xbd, 0x61, 0x9f, 0xdb, 0x8d, 0x3d, 0xb7, 0x1b, 0x3e,
+ 0xb7, 0x17, 0x7b, 0x6e, 0x2f, 0x7c, 0xee, 0x59, 0xec, 0x39, 0x2f, 0x41,
+ 0xc7, 0x73, 0x79, 0xe9, 0x0c, 0xad, 0xb2, 0x08, 0xbd, 0xf5, 0x6c, 0x59,
+ 0xb2, 0x6b, 0x9e, 0x09, 0xf7, 0x8b, 0x4c, 0x58, 0x1f, 0x62, 0xd3, 0xf1,
+ 0xa3, 0x9a, 0x0f, 0x11, 0x62, 0x87, 0x54, 0x1a, 0x23, 0x78, 0xcd, 0x7f,
+ 0xbf, 0x08, 0xd3, 0xee, 0x30, 0xeb, 0x61, 0xb5, 0x71, 0xd2, 0x82, 0x90,
+ 0x16, 0xc2, 0xe5, 0x6d, 0x35, 0xf8, 0x63, 0x0b, 0x69, 0xf1, 0x96, 0x8a,
+ 0x5f, 0x1f, 0x30, 0xab, 0xd6, 0x87, 0x17, 0xe7, 0xeb, 0x3d, 0x71, 0x47,
+ 0x9a, 0x6f, 0xf4, 0xcd, 0xbf, 0x13, 0x68, 0xdb, 0xc4, 0x11, 0xff, 0xe2,
+ 0xf9, 0x16, 0x07, 0x12, 0x5c, 0x99, 0xfa, 0xd0, 0xbb, 0x8c, 0xdf, 0x39,
+ 0xec, 0x51, 0xd5, 0xaa, 0xe5, 0x60, 0xb4, 0xe0, 0xf6, 0x00, 0x19, 0x12,
+ 0xd0, 0x93, 0x42, 0xe9, 0xcb, 0x2f, 0x37, 0xcb, 0x69, 0x44, 0xe5, 0x82,
+ 0xa9, 0x93, 0x8f, 0xe4, 0xc0, 0x3f, 0xef, 0xcc, 0xa8, 0x76, 0x28, 0x32,
+ 0x95, 0xae, 0xf0, 0x2d, 0x86, 0x0d, 0x6d, 0x49, 0xf9, 0x9b, 0x50, 0x9f,
+ 0xba, 0x3d, 0xcb, 0xc2, 0xaf, 0xb2, 0x34, 0x85, 0x43, 0x73, 0xd6, 0xbd,
+ 0x51, 0x0e, 0xd4, 0xdf, 0x2d, 0xee, 0x0f, 0x6f, 0xfa, 0x1c, 0x49, 0xf2,
+ 0xe3, 0x03, 0xf2, 0xc7, 0x83, 0xb7, 0xa3, 0x18, 0x47, 0x1a, 0x92, 0x62,
+ 0xc0, 0x9e, 0x34, 0x20, 0xc7, 0x8c, 0xb3, 0x74, 0x48, 0x4a, 0xc0, 0xdc,
+ 0x1e, 0x94, 0x1b, 0x95, 0x37, 0x2c, 0xb7, 0xf2, 0x34, 0xb4, 0x60, 0x39,
+ 0x9f, 0x34, 0xd0, 0xd6, 0x48, 0xe9, 0x6c, 0x06, 0x2a, 0xdd, 0xc9, 0x70,
+ 0x4b, 0x3d, 0x6c, 0xbe, 0x83, 0xcd, 0x93, 0x45, 0x90, 0x3d, 0x4f, 0x03,
+ 0xf6, 0x89, 0x8b, 0x8d, 0x5e, 0x56, 0x4e, 0xeb, 0x15, 0x79, 0x77, 0xe1,
+ 0x69, 0x25, 0x79, 0x11, 0xed, 0x61, 0xdb, 0x09, 0x18, 0xef, 0xe4, 0x6e,
+ 0x0b, 0x65, 0xad, 0xa8, 0xea, 0xdf, 0xbe, 0x87, 0x7b, 0xbf, 0x6e, 0x0e,
+ 0xf7, 0xfe, 0x79, 0x73, 0xf8, 0xec, 0x57, 0xcf, 0xe1, 0xb3, 0xdf, 0x66,
+ 0x0e, 0x5d, 0x51, 0x4d, 0x7a, 0x88, 0x9a, 0xcd, 0xdb, 0x04, 0xf9, 0x72,
+ 0xb7, 0x9a, 0x7f, 0x8e, 0x28, 0x4e, 0x4e, 0x5e, 0x09, 0xf3, 0x20, 0xa5,
+ 0xb3, 0x66, 0x28, 0x2f, 0xd8, 0x19, 0x70, 0x63, 0xb3, 0xf0, 0x51, 0xae,
+ 0xa3, 0xca, 0x2d, 0xaf, 0x02, 0xc9, 0x3b, 0x38, 0xd1, 0x8c, 0x74, 0xfc,
+ 0xaa, 0x24, 0x9d, 0x93, 0xfc, 0xbb, 0x74, 0xe5, 0x9c, 0x0e, 0x87, 0xf8,
+ 0xe4, 0x2f, 0x20, 0xbb, 0x70, 0x4e, 0xcd, 0xb8, 0x27, 0x3a, 0x84, 0xc1,
+ 0xb6, 0x67, 0xef, 0xd3, 0x2f, 0xf3, 0x44, 0x7b, 0x13, 0xc8, 0x21, 0x17,
+ 0x4e, 0xce, 0xee, 0x1c, 0xbd, 0x5e, 0x22, 0x9a, 0x46, 0x4c, 0xcb, 0xf0,
+ 0x2e, 0x5f, 0xf5, 0x1c, 0xb7, 0x1d, 0xc7, 0x9e, 0x9f, 0xd6, 0xdd, 0xb7,
+ 0x62, 0x4d, 0xad, 0xf4, 0x1d, 0xbb, 0xe2, 0xa6, 0x8f, 0x78, 0x8f, 0x95,
+ 0x3d, 0x6d, 0xb9, 0xef, 0x38, 0xae, 0x09, 0xb4, 0xfe, 0xd5, 0x4a, 0xf8,
+ 0x6d, 0xaa, 0xbe, 0x52, 0xfc, 0xc7, 0x19, 0x06, 0x9d, 0x91, 0x44, 0x70,
+ 0x5f, 0xd2, 0x9c, 0x49, 0x7b, 0x12, 0x93, 0xbc, 0x7f, 0x24, 0xef, 0x3a,
+ 0x3f, 0x25, 0xc7, 0x68, 0xa3, 0x85, 0x1c, 0x85, 0xe7, 0x4d, 0xd3, 0xa7,
+ 0x35, 0x81, 0x95, 0x47, 0x59, 0x73, 0x10, 0x7c, 0x51, 0xe8, 0x67, 0x5c,
+ 0x1e, 0x28, 0x58, 0x1c, 0x82, 0x65, 0x1d, 0x67, 0x9c, 0xe1, 0x9f, 0x3f,
+ 0x26, 0x9a, 0x5f, 0xb6, 0xc7, 0x9b, 0x8e, 0xb3, 0x7e, 0x5a, 0x8f, 0xf3,
+ 0x3c, 0x6e, 0x94, 0xb0, 0xff, 0x0e, 0x46, 0xd0, 0x02, 0xce, 0x08, 0x2a,
+ 0x69, 0x4a, 0xee, 0x43, 0xad, 0x19, 0x48, 0xbc, 0x80, 0x9c, 0xfc, 0xce,
+ 0x1c, 0x13, 0xe5, 0xa2, 0xb9, 0x06, 0x3f, 0x18, 0x3a, 0xdb, 0x0b, 0x6c,
+ 0x1c, 0xad, 0xac, 0x6e, 0x96, 0x67, 0x5c, 0xe5, 0x73, 0x10, 0x26, 0x79,
+ 0xc5, 0x09, 0x7a, 0xb6, 0x7e, 0x1f, 0x8c, 0x06, 0xf1, 0x03, 0x73, 0x39,
+ 0xbb, 0x0f, 0x41, 0xc6, 0xf1, 0x7a, 0x7f, 0x9d, 0x2c, 0x34, 0xcb, 0xe8,
+ 0x6e, 0xde, 0x25, 0x72, 0x3b, 0xcf, 0xf9, 0xca, 0xe5, 0x51, 0x97, 0x3b,
+ 0xda, 0xd5, 0x23, 0x63, 0xb6, 0xd0, 0x83, 0xf2, 0xa7, 0x81, 0xb4, 0x56,
+ 0x3d, 0xad, 0xa4, 0xed, 0x4c, 0x33, 0x62, 0xcc, 0x4b, 0x4a, 0xc9, 0xc2,
+ 0xb8, 0xc9, 0x3e, 0x71, 0xb2, 0x48, 0xa8, 0x37, 0x89, 0x92, 0x76, 0x83,
+ 0x2a, 0x02, 0xf4, 0xec, 0xc1, 0xf0, 0xf0, 0xf8, 0xb8, 0x95, 0x5a, 0x42,
+ 0x93, 0xc7, 0x2c, 0x4c, 0xc8, 0xff, 0xad, 0x89, 0x8f, 0x8a, 0x3c, 0xd0,
+ 0xe8, 0x6e, 0x8c, 0xaf, 0x76, 0x96, 0x5f, 0xdf, 0xc0, 0x89, 0x94, 0xa5,
+ 0x75, 0xae, 0x15, 0x65, 0x52, 0x0e, 0xe3, 0x2e, 0x0a, 0xd3, 0x4d, 0xd8,
+ 0x0b, 0x37, 0x0b, 0x63, 0x1c, 0xfe, 0xfe, 0xc9, 0xf2, 0xdd, 0x73, 0x67,
+ 0xcf, 0x19, 0x36, 0x06, 0xce, 0x95, 0xef, 0xb4, 0x0e, 0xf7, 0x5a, 0x84,
+ 0x1c, 0xf6, 0xbc, 0x92, 0xf2, 0x21, 0xcc, 0x09, 0x21, 0xec, 0xae, 0x54,
+ 0xe1, 0x92, 0xd8, 0x7a, 0xb8, 0x65, 0x33, 0x56, 0xf5, 0x83, 0x33, 0xad,
+ 0xa2, 0x08, 0x92, 0x48, 0x21, 0x51, 0xf1, 0x08, 0xae, 0x44, 0xc4, 0xef,
+ 0x76, 0x2f, 0x2f, 0x7c, 0x64, 0xe5, 0x09, 0x20, 0x4b, 0x17, 0x67, 0x40,
+ 0x7a, 0xd4, 0x3a, 0x05, 0xf6, 0x10, 0xd0, 0x0c, 0xd8, 0x23, 0xf0, 0x4f,
+ 0x3a, 0x01, 0x74, 0x04, 0xbc, 0x42, 0x08, 0x8f, 0x1f, 0x02, 0xd8, 0x54,
+ 0xeb, 0x7f, 0x5c, 0x8f, 0xd3, 0x07, 0x3f, 0xe1, 0x24, 0xb5, 0xd2, 0xac,
+ 0xff, 0xb9, 0x3b, 0x2d, 0x92, 0xf7, 0xed, 0x09, 0x31, 0x7f, 0x4d, 0x17,
+ 0x45, 0xfe, 0x09, 0xa8, 0x4d, 0x73, 0xcb, 0xbf, 0x26, 0xe2, 0xdc, 0x25,
+ 0xa4, 0xb1, 0x87, 0x5a, 0x2b, 0x5e, 0xcb, 0xbd, 0xd3, 0x87, 0x3f, 0x98,
+ 0x97, 0x93, 0x49, 0x39, 0xa3, 0x08, 0x1e, 0xb7, 0xd1, 0xf3, 0x99, 0xfb,
+ 0x20, 0xd6, 0x23, 0x11, 0xc0, 0x22, 0x6b, 0x08, 0x63, 0xb5, 0xd2, 0x49,
+ 0xd7, 0x76, 0x7c, 0x5e, 0xa2, 0x12, 0xc7, 0x9c, 0x80, 0x81, 0x2b, 0x2a,
+ 0xbd, 0x71, 0xb0, 0xd4, 0x21, 0xf1, 0xba, 0x58, 0x6f, 0x8f, 0xc1, 0xb8,
+ 0x5d, 0x5b, 0x1b, 0xc4, 0xc0, 0xb1, 0x60, 0xa5, 0xe5, 0xb0, 0x76, 0x0c,
+ 0xf0, 0x79, 0xd7, 0xc5, 0x02, 0x8e, 0x71, 0xe7, 0x89, 0x96, 0xfa, 0x2c,
+ 0x2b, 0xf9, 0x93, 0x99, 0xf3, 0xda, 0x55, 0xc6, 0x6a, 0x31, 0xe5, 0x83,
+ 0x73, 0x25, 0x9f, 0xd2, 0xe6, 0xdf, 0xd6, 0x48, 0xcd, 0x34, 0xc4, 0xd7,
+ 0x39, 0xfa, 0x75, 0x16, 0x75, 0x04, 0xe6, 0x86, 0xbb, 0x96, 0xfe, 0x0d,
+ 0xba, 0x04, 0x8d, 0x3f, 0xb7, 0x07, 0x21, 0x25, 0x15, 0xa2, 0x65, 0xb0,
+ 0xd9, 0x95, 0x7e, 0x43, 0x55, 0xf9, 0xb4, 0x5f, 0x15, 0x6f, 0xc4, 0x76,
+ 0xdd, 0x45, 0xf5, 0xce, 0x7b, 0x84, 0xed, 0x91, 0xca, 0xbc, 0xa2, 0x83,
+ 0x89, 0xee, 0xc4, 0x14, 0x5a, 0x04, 0xa5, 0x27, 0x8a, 0x5b, 0x8a, 0xc4,
+ 0xdb, 0x22, 0x60, 0xbc, 0xb0, 0x5e, 0x35, 0xe9, 0x20, 0xc8, 0x43, 0x34,
+ 0x14, 0x03, 0x1f, 0x19, 0x89, 0x53, 0x53, 0x16, 0x0a, 0xc8, 0xde, 0x34,
+ 0xea, 0xb3, 0x56, 0x5a, 0xa6, 0x16, 0x89, 0x9e, 0xd6, 0x95, 0xdc, 0x0e,
+ 0x88, 0x56, 0x97, 0x9d, 0x26, 0xcd, 0xca, 0x76, 0x13, 0x45, 0x92, 0x63,
+ 0x33, 0x55, 0x9a, 0x26, 0x72, 0xfa, 0x6d, 0xa9, 0x6a, 0x69, 0x4e, 0x78,
+ 0x5e, 0xf8, 0xdb, 0x3d, 0x50, 0x23, 0xc5, 0xcf, 0xcb, 0x52, 0xc9, 0x6c,
+ 0x6f, 0x61, 0x3f, 0xcc, 0xac, 0xbb, 0xc2, 0xfb, 0xce, 0xc0, 0xff, 0x0e,
+ 0x03, 0x62, 0xb7, 0x02, 0xb6, 0xdc, 0x87, 0x6e, 0x95, 0x3c, 0xfb, 0x6d,
+ 0xea, 0xa7, 0x85, 0x5a, 0x71, 0xcf, 0x00, 0xf5, 0x21, 0xec, 0x14, 0x62,
+ 0x28, 0xe1, 0x49, 0x44, 0x22, 0x22, 0x5b, 0x38, 0x20, 0xa1, 0xc6, 0x7d,
+ 0xc9, 0x4c, 0xd6, 0x5a, 0xbf, 0x4f, 0xe2, 0xcb, 0xc2, 0x88, 0xa5, 0xcd,
+ 0x92, 0x67, 0x3a, 0x6c, 0x8e, 0x17, 0x31, 0x32, 0xa9, 0x7f, 0xe9, 0x24,
+ 0x06, 0x90, 0x4c, 0x0b, 0x0f, 0xb4, 0x2d, 0x58, 0x41, 0xfc, 0xd7, 0x65,
+ 0xe1, 0xea, 0x64, 0x47, 0x39, 0x83, 0x85, 0x17, 0x32, 0x39, 0xa2, 0x37,
+ 0xc2, 0xc6, 0xfe, 0x24, 0x2c, 0xda, 0xb9, 0x5f, 0x93, 0x06, 0xe5, 0x1d,
+ 0x83, 0x9d, 0x25, 0x7b, 0x4f, 0xa8, 0x47, 0x91, 0xc5, 0x37, 0x10, 0xba,
+ 0x75, 0x52, 0xdb, 0x55, 0xd1, 0x4c, 0xd6, 0xaf, 0xa7, 0xe5, 0x68, 0x64,
+ 0x86, 0xbd, 0xee, 0xa9, 0xa5, 0xe6, 0xcb, 0x81, 0x4b, 0xc8, 0xef, 0x87,
+ 0x75, 0x4e, 0xf6, 0x38, 0xc8, 0x2e, 0x0c, 0x52, 0x74, 0x25, 0x6b, 0xba,
+ 0x84, 0x7c, 0x5f, 0xab, 0x8b, 0x47, 0x6e, 0x1a, 0x41, 0xc1, 0xc9, 0xd6,
+ 0xa0, 0x81, 0x79, 0xa8, 0x46, 0xc9, 0x5a, 0xa0, 0x9f, 0x6a, 0x07, 0x13,
+ 0xae, 0x7d, 0xbd, 0xa2, 0x9a, 0xbc, 0xa3, 0x43, 0xef, 0x69, 0x3d, 0x8c,
+ 0x3c, 0x2c, 0x54, 0xcd, 0xb3, 0xd0, 0x1e, 0xd0, 0xfa, 0x7f, 0xd2, 0x1f,
+ 0xbb, 0x3d, 0xfa, 0xef, 0xde, 0x7f, 0xad, 0x27, 0x64, 0xc5, 0xec, 0x6f,
+ 0x6f, 0xdf, 0xdf, 0xdf, 0x0f, 0x84, 0x0b, 0x78, 0x60, 0x96, 0x6c, 0x2d,
+ 0xc4, 0xf7, 0x13, 0xdf, 0xca, 0x92, 0x0f, 0x5c, 0x26, 0xeb, 0xf9, 0xec,
+ 0xfa, 0xc7, 0xdd, 0xfe, 0xee, 0xce, 0xce, 0xce, 0xcf, 0x83, 0x39, 0x4d,
+ 0xf1, 0x15, 0x9a, 0x35, 0xff, 0xf5, 0x9b, 0xdd, 0xe6, 0x9e, 0x6c, 0xc7,
+ 0x29, 0xac, 0xf8, 0x97, 0x6a, 0xb5, 0x9b, 0x99, 0x05, 0xad, 0x2c, 0x6f,
+ 0xe5, 0x7d, 0x4f, 0xcc, 0xb0, 0x53, 0x3c, 0xf5, 0x88, 0x12, 0xc2, 0xf4,
+ 0xc2, 0x11, 0xc3, 0x81, 0x5e, 0x3c, 0xdb, 0xdb, 0x4b, 0x58, 0xe5, 0x60,
+ 0x10, 0x3a, 0xc7, 0x65, 0x28, 0xff, 0x50, 0x8a, 0xdd, 0xf1, 0x6d, 0x36,
+ 0x26, 0x22, 0x96, 0x8a, 0x2b, 0x69, 0x05, 0x55, 0x95, 0x2c, 0xdc, 0x81,
+ 0xcb, 0x56, 0x1b, 0x41, 0x66, 0xe4, 0x4f, 0x39, 0x79, 0x70, 0x0d, 0x9b,
+ 0x5d, 0x5e, 0x91, 0x74, 0xe5, 0x9a, 0x34, 0xb6, 0x68, 0x73, 0x5a, 0xc7,
+ 0xf4, 0x36, 0x5b, 0x80, 0x01, 0xd7, 0x1c, 0xf8, 0xbe, 0x8a, 0x52, 0x4a,
+ 0xae, 0x21, 0x08, 0x71, 0xb5, 0xa8, 0x84, 0x89, 0x1b, 0x51, 0x9b, 0xfb,
+ 0xf4, 0xa1, 0x75, 0xdd, 0x9b, 0x19, 0x7f, 0x6d, 0xfe, 0xb3, 0xac, 0x48,
+ 0x6a, 0xaa, 0xd5, 0xc2, 0xae, 0xb2, 0x66, 0x7c, 0xd3, 0xc5, 0x8d, 0x24,
+ 0x10, 0xe0, 0xa4, 0xbc, 0xdf, 0x98, 0xd1, 0x3c, 0x68, 0x55, 0xb0, 0x65,
+ 0x75, 0x48, 0x5c, 0xf6, 0x8d, 0x69, 0x94, 0x88, 0x69, 0x51, 0x8a, 0x84,
+ 0x4b, 0x13, 0xb2, 0x54, 0x8c, 0xa8, 0x47, 0x9e, 0x56, 0x47, 0x5d, 0x31,
+ 0x1f, 0x9d, 0xe5, 0xb5, 0x66, 0x07, 0x8d, 0x6f, 0xb2, 0x99, 0x48, 0xcc,
+ 0x4d, 0xc5, 0x7f, 0xac, 0xcb, 0x26, 0x5c, 0x0f, 0x2f, 0xb5, 0xf5, 0x2b,
+ 0xf9, 0x8d, 0x19, 0xcc, 0x96, 0x64, 0xd7, 0xd8, 0x7b, 0x4e, 0xd8, 0xba,
+ 0xaf, 0x17, 0x64, 0x37, 0x8e, 0x52, 0xb9, 0x50, 0x34, 0xe1, 0x0b, 0xde,
+ 0xdf, 0x58, 0xb2, 0x9e, 0x11, 0x8a, 0x59, 0x85, 0x7b, 0x8c, 0x9c, 0x23,
+ 0x7d, 0xd1, 0x7e, 0xe4, 0x5a, 0x45, 0xb4, 0xcc, 0x9c, 0xd8, 0xb7, 0xc7,
+ 0x87, 0x97, 0xa8, 0x8a, 0xda, 0x03, 0x28, 0xb6, 0x87, 0xfc, 0x96, 0x90,
+ 0x4c, 0xfd, 0xfc, 0x19, 0x9d, 0x0d, 0x6c, 0x54, 0x29, 0x26, 0x95, 0x3a,
+ 0xbc, 0x80, 0x87, 0xde, 0x94, 0xf4, 0x06, 0x8f, 0x06, 0x3f, 0xc2, 0x6d,
+ 0xde, 0xd2, 0x13, 0x6d, 0x7e, 0xd4, 0xf3, 0x17, 0x83, 0x1d, 0x1e, 0xa3,
+ 0xab, 0xc5, 0xa6, 0x78, 0x6c, 0xf8, 0x78, 0x6a, 0x61, 0xb6, 0x4b, 0x97,
+ 0xb0, 0x72, 0x6a, 0x77, 0x7a, 0x09, 0x13, 0x39, 0x72, 0xc2, 0xa4, 0xfe,
+ 0xd6, 0x83, 0x7e, 0xac, 0xd4, 0x4d, 0xfd, 0xe2, 0xb8, 0xb4, 0x2d, 0x3b,
+ 0x0c, 0x7c, 0x04, 0x81, 0x2e, 0x13, 0xcd, 0xa6, 0x90, 0x6c, 0xea, 0x18,
+ 0x28, 0x1e, 0x7b, 0x02, 0x70, 0x3e, 0x46, 0x87, 0xf5, 0x1c, 0x37, 0x7a,
+ 0x49, 0xb7, 0x80, 0x5c, 0x59, 0x82, 0xb1, 0x6e, 0x15, 0x0c, 0x8a, 0x69,
+ 0x28, 0x01, 0xed, 0x7c, 0xff, 0x2b, 0xa9, 0xf9, 0xc6, 0x9a, 0x72, 0x0c,
+ 0xe0, 0x4d, 0x4b, 0xb9, 0xa5, 0x90, 0x1d, 0xb6, 0x5c, 0x55, 0xe5, 0x1c,
+ 0x90, 0x0b, 0x2f, 0xe1, 0x75, 0x97, 0xfe, 0x72, 0xcd, 0x3e, 0x80, 0x07,
+ 0x83, 0x8a, 0x07, 0x59, 0x81, 0x3c, 0x66, 0xa1, 0x82, 0x10, 0xc2, 0x39,
+ 0x39, 0x81, 0xb4, 0x13, 0x60, 0xee, 0xc1, 0x41, 0xb5, 0xfe, 0x67, 0xf2,
+ 0x43, 0xbf, 0x39, 0x58, 0x6f, 0x9d, 0xc8, 0x18, 0xbb, 0x7a, 0xcd, 0xd2,
+ 0xad, 0x6d, 0xcb, 0x88, 0x4c, 0x23, 0xb9, 0x9f, 0x7d, 0x62, 0x6e, 0x2e,
+ 0xac, 0xdc, 0x7d, 0x5e, 0x3c, 0xdb, 0x4b, 0xea, 0x07, 0xa3, 0x46, 0xcc,
+ 0xfc, 0x49, 0xe8, 0x16, 0xbe, 0x8b, 0x7a, 0xdf, 0x5b, 0xd5, 0x24, 0x58,
+ 0x6e, 0x7d, 0xa0, 0x57, 0x0e, 0xf0, 0x8a, 0x70, 0xcf, 0x2b, 0xf8, 0xe0,
+ 0x09, 0xd5, 0x14, 0xcb, 0x44, 0xa5, 0xd8, 0x68, 0x9a, 0x16, 0xb7, 0xb5,
+ 0xd5, 0xb4, 0xd1, 0x52, 0x8f, 0x8a, 0x14, 0x71, 0xbe, 0x88, 0xfb, 0xa1,
+ 0x00, 0x12, 0x70, 0x33, 0x76, 0x9a, 0xfb, 0xdb, 0x82, 0x34, 0xd3, 0x59,
+ 0x5a, 0xdd, 0x2a, 0xfa, 0x6d, 0x65, 0xa5, 0x46, 0x57, 0xaa, 0x31, 0x3e,
+ 0xb7, 0xae, 0x76, 0xe3, 0xef, 0x17, 0x47, 0x5d, 0xe8, 0xac, 0x1b, 0x09,
+ 0x6d, 0xfe, 0xbb, 0xaf, 0xf1, 0x85, 0x55, 0x05, 0xad, 0xf1, 0xb8, 0x2d,
+ 0xb3, 0x67, 0x23, 0x12, 0x7e, 0xe1, 0x24, 0x56, 0xe6, 0x5c, 0x24, 0x24,
+ 0x96, 0x72, 0x31, 0x48, 0xce, 0x9c, 0xf1, 0x58, 0xf4, 0xc0, 0x73, 0xd7,
+ 0x54, 0x63, 0x31, 0x1d, 0xf1, 0xf7, 0xbe, 0xd6, 0x40, 0x8d, 0xcd, 0x00,
+ 0x2a, 0x0c, 0x10, 0x98, 0xe3, 0xc1, 0x8a, 0xfc, 0x56, 0xef, 0x14, 0xe6,
+ 0x25, 0x32, 0xcd, 0xc8, 0x10, 0x2a, 0x64, 0xc3, 0xb1, 0xb7, 0x34, 0x80,
+ 0x94, 0xf1, 0x20, 0xe2, 0xb5, 0x0d, 0xd0, 0xa4, 0x2b, 0x5d, 0xe4, 0x1e,
+ 0xaf, 0x25, 0x00, 0x37, 0x35, 0x77, 0xe0, 0x62, 0xee, 0x4a, 0x0c, 0x71,
+ 0xde, 0xe5, 0xb4, 0x2c, 0x7a, 0x01, 0x63, 0x03, 0x31, 0x46, 0xb2, 0x7f,
+ 0x89, 0xc0, 0x0c, 0x33, 0xa9, 0x18, 0x67, 0xcb, 0x4e, 0xa5, 0xfc, 0x9e,
+ 0xee, 0x43, 0xff, 0xcb, 0x8f, 0x14, 0xb7, 0x62, 0xaa, 0x6e, 0x5d, 0x0c,
+ 0xb3, 0xf1, 0x7a, 0x8c, 0xce, 0x5f, 0xc2, 0xbe, 0x29, 0x27, 0xff, 0x5b,
+ 0x63, 0xaf, 0x67, 0x55, 0x69, 0x84, 0xc6, 0x77, 0x2f, 0x14, 0x66, 0x20,
+ 0xc5, 0xf2, 0xe4, 0x7e, 0x92, 0xb5, 0xc4, 0x6c, 0x83, 0x0f, 0x25, 0xea,
+ 0x36, 0x61, 0x79, 0xa8, 0x6f, 0xca, 0x05, 0xc5, 0x66, 0x5b, 0xd1, 0x5d,
+ 0x16, 0xba, 0xba, 0x4c, 0x1f, 0x51, 0x41, 0x2f, 0xb8, 0x3e, 0xd9, 0x7c,
+ 0x16, 0x63, 0x00, 0x50, 0xce, 0xc5, 0x98, 0x74, 0x1d, 0x72, 0xf0, 0x18,
+ 0x81, 0x55, 0x8e, 0x1a, 0x5c, 0x7d, 0xa9, 0xeb, 0xf9, 0x65, 0x4e, 0x4e,
+ 0x80, 0x25, 0xc5, 0xc9, 0x18, 0x89, 0x27, 0x17, 0x9d, 0x63, 0x86, 0xec,
+ 0xc4, 0xe8, 0x48, 0xb3, 0xa8, 0x6f, 0xe8, 0x6e, 0xa6, 0x3b, 0x03, 0x86,
+ 0xdf, 0x5a, 0x9c, 0xe9, 0x90, 0x26, 0xed, 0xf4, 0xf2, 0xe4, 0x7d, 0xaf,
+ 0x73, 0x12, 0x82, 0x6a, 0xe2, 0xba, 0x35, 0xe1, 0x02, 0x8a, 0x38, 0xd5,
+ 0xed, 0xc2, 0xf6, 0x1c, 0xb0, 0x9c, 0x73, 0x11, 0x69, 0xea, 0x7a, 0x92,
+ 0x6a, 0x52, 0x09, 0x60, 0x59, 0x6d, 0x41, 0x9e, 0xd7, 0xd0, 0xbb, 0x49,
+ 0x30, 0x9d, 0x1a, 0x7e, 0x02, 0x98, 0xcf, 0x46, 0xd4, 0x98, 0xed, 0xe8,
+ 0x55, 0xcb, 0x08, 0xf7, 0x75, 0xd9, 0x3a, 0x34, 0xfe, 0x82, 0xd1, 0x36,
+ 0x64, 0x2e, 0xd8, 0xe4, 0x6d, 0x79, 0x5f, 0xf4, 0x4f, 0x28, 0xeb, 0x24,
+ 0x39, 0x29, 0xaf, 0xc9, 0x42, 0x3a, 0x8d, 0x5b, 0xf2, 0x1f, 0xce, 0x4f,
+ 0x93, 0x4d, 0x92, 0xc4, 0xc9, 0xb9, 0xe5, 0x1a, 0xa1, 0x47, 0xb7, 0x44,
+ 0xe3, 0xac, 0xf9, 0x96, 0x92, 0xde, 0xf4, 0x92, 0xa3, 0x1f, 0x0e, 0xde,
+ 0x9f, 0x9f, 0x1c, 0xfd, 0xb4, 0x24, 0xc8, 0x4d, 0x3f, 0xfe, 0xd2, 0xd3,
+ 0xc2, 0xe1, 0xb5, 0xa7, 0xd8, 0x93, 0xe9, 0xc9, 0xc3, 0x32, 0x59, 0xc0,
+ 0xc7, 0x47, 0xb7, 0xe0, 0x70, 0x78, 0x7e, 0xdc, 0x57, 0x96, 0x10, 0x2e,
+ 0xaf, 0x92, 0x17, 0xa4, 0x30, 0xf3, 0x01, 0x16, 0x06, 0x5f, 0xda, 0x45,
+ 0xfd, 0xc0, 0x50, 0x97, 0xf3, 0xd0, 0x4b, 0x4e, 0x95, 0x78, 0xb3, 0x87,
+ 0x45, 0xa7, 0x2b, 0xfe, 0x6d, 0x7e, 0x8d, 0x28, 0x43, 0x87, 0xf4, 0x43,
+ 0xeb, 0x4d, 0x8f, 0x03, 0xb4, 0x2a, 0x65, 0xa5, 0xd9, 0xf0, 0x50, 0x9d,
+ 0x4d, 0xd9, 0xa1, 0xb5, 0x54, 0x8a, 0x32, 0x0c, 0x09, 0xab, 0x08, 0x18,
+ 0x64, 0x10, 0x3e, 0x11, 0x58, 0xe4, 0xc8, 0x4a, 0x3d, 0x51, 0x53, 0x79,
+ 0x87, 0xb0, 0xf4, 0x90, 0x6b, 0xc6, 0x0a, 0x87, 0x7d, 0x63, 0xab, 0x2f,
+ 0x92, 0xfd, 0xf5, 0xdf, 0xf1, 0x22, 0xf1, 0xbd, 0x7f, 0x11, 0x26, 0x78,
+ 0x1b, 0x61, 0xb4, 0xbe, 0x62, 0x4e, 0xd1, 0x65, 0x37, 0xa6, 0x3a, 0x61,
+ 0xe0, 0xff, 0x34, 0x27, 0x5d, 0x54, 0xbc, 0xd1, 0xe2, 0xfa, 0x3a, 0x92,
+ 0xc6, 0x4b, 0xf5, 0x54, 0xb2, 0x0c, 0x57, 0xb1, 0xd1, 0x58, 0x36, 0xea,
+ 0x84, 0x7d, 0xba, 0xa6, 0xff, 0xeb, 0x88, 0x55, 0xb1, 0x0c, 0xb9, 0x29,
+ 0xcb, 0xc9, 0x3a, 0x43, 0x7a, 0xd8, 0x2d, 0x8d, 0x92, 0xdb, 0x61, 0x73,
+ 0x1c, 0x7b, 0xdf, 0xf8, 0x62, 0x23, 0x91, 0x50, 0x9b, 0x51, 0xee, 0xe5,
+ 0x56, 0x26, 0xad, 0x66, 0x9d, 0xd5, 0x9a, 0x11, 0xd7, 0xe8, 0xe9, 0x25,
+ 0x1b, 0xaf, 0x37, 0xe4, 0x39, 0x79, 0xac, 0x2b, 0x70, 0xf0, 0x0e, 0x47,
+ 0x7d, 0x58, 0xd9, 0x1d, 0x5b, 0xbf, 0x98, 0x99, 0xde, 0x9b, 0x7c, 0x32,
+ 0xe1, 0x6a, 0xec, 0x52, 0xf1, 0x22, 0x61, 0x66, 0x1f, 0xa9, 0x8d, 0x16,
+ 0x5c, 0x4c, 0xe8, 0xba, 0xf6, 0x9c, 0xfb, 0xba, 0xf1, 0x6f, 0xda, 0x03,
+ 0xaf, 0x22, 0x14, 0xb9, 0xa9, 0x5d, 0xa1, 0x06, 0xf9, 0xea, 0xb2, 0x93,
+ 0x82, 0x58, 0x08, 0xcc, 0x25, 0xe8, 0x46, 0x6a, 0x2d, 0xb6, 0xb0, 0xf1,
+ 0xbd, 0x0e, 0xf4, 0x1c, 0xb1, 0x8e, 0xd0, 0xa5, 0xc5, 0xcb, 0x87, 0xcd,
+ 0x43, 0x25, 0xd4, 0x2b, 0xa2, 0x26, 0xe7, 0x82, 0x8c, 0x54, 0xd2, 0x62,
+ 0xc9, 0xf7, 0xd5, 0xdb, 0xe7, 0x36, 0x1e, 0xe7, 0x91, 0x29, 0xfe, 0x8f,
+ 0x2c, 0x31, 0x3c, 0x98, 0x15, 0xf0, 0xfb, 0xaa, 0xb6, 0xdf, 0x0b, 0xb3,
+ 0x98, 0xb9, 0x6c, 0x02, 0xcb, 0x65, 0x0d, 0x16, 0x38, 0x38, 0xbe, 0xc4,
+ 0xcf, 0x14, 0xbf, 0x17, 0x73, 0xbd, 0xf9, 0x49, 0x16, 0xed, 0x12, 0x14,
+ 0xe2, 0xdf, 0x04, 0xb5, 0xec, 0xca, 0xfc, 0x9c, 0x56, 0x7a, 0xc2, 0x60,
+ 0x39, 0x75, 0x86, 0x1f, 0x8c, 0x09, 0x51, 0x3d, 0x51, 0x57, 0xf9, 0x77,
+ 0x72, 0xaa, 0x22, 0x28, 0xc2, 0xb7, 0x12, 0x4c, 0x69, 0x15, 0x10, 0x67,
+ 0x24, 0x3c, 0xbb, 0x92, 0x0a, 0xe5, 0x9f, 0xe7, 0x90, 0xad, 0x46, 0x8f,
+ 0x73, 0x78, 0x7c, 0xeb, 0x41, 0x44, 0xd1, 0x61, 0xc5, 0x05, 0x5b, 0x4e,
+ 0x46, 0xc3, 0x2e, 0x57, 0x04, 0x57, 0xf4, 0x7d, 0x72, 0x44, 0xf1, 0x51,
+ 0x70, 0xd1, 0xe0, 0x48, 0xb8, 0x0d, 0xf7, 0xc7, 0x33, 0x5b, 0xc9, 0xd6,
+ 0x3c, 0x5a, 0xa5, 0x15, 0x17, 0x1b, 0x2b, 0x6e, 0x15, 0xc6, 0xc3, 0x25,
+ 0xe9, 0xb3, 0xf1, 0xa2, 0x69, 0x23, 0xbc, 0x7d, 0xe5, 0x4b, 0x32, 0xfa,
+ 0xb9, 0x5b, 0x9b, 0x38, 0x0a, 0x6a, 0xa0, 0x9c, 0x6b, 0x3a, 0xf6, 0xfe,
+ 0xfa, 0x96, 0x84, 0xf6, 0x28, 0xe4, 0x63, 0xb3, 0xb4, 0x63, 0x31, 0x3b,
+ 0xed, 0x73, 0x95, 0xb1, 0x8f, 0xcd, 0x85, 0xaf, 0xa3, 0x9f, 0xe7, 0x6a,
+ 0xbc, 0x91, 0x6f, 0xbf, 0x63, 0x6f, 0x8c, 0xf7, 0x69, 0x5b, 0xec, 0x45,
+ 0x1c, 0x35, 0x75, 0x70, 0x94, 0x83, 0x2f, 0xa3, 0xd8, 0xda, 0x20, 0x39,
+ 0xb0, 0x65, 0x10, 0xf5, 0x55, 0x9d, 0xff, 0xc0, 0x41, 0x76, 0x7c, 0x7e,
+ 0xf7, 0xd2, 0xf3, 0x6f, 0xd2, 0x9d, 0x87, 0x1f, 0x59, 0x89, 0x1f, 0x8c,
+ 0xe2, 0xb6, 0x1a, 0x3d, 0x37, 0x7f, 0x7c, 0x4b, 0x7f, 0x90, 0x58, 0x25,
+ 0x73, 0x92, 0xc9, 0x54, 0xd8, 0x33, 0x17, 0x6e, 0xed, 0xe1, 0x89, 0xfd,
+ 0x43, 0x16, 0x1d, 0x10, 0x5e, 0x02, 0xe2, 0x13, 0xf5, 0x8a, 0x4b, 0x82,
+ 0x87, 0xf2, 0xab, 0xed, 0xf4, 0x34, 0x39, 0x26, 0x8e, 0x6e, 0x04, 0x53,
+ 0x08, 0xdc, 0x13, 0xe6, 0xbf, 0xe4, 0x85, 0x18, 0xb2, 0x20, 0x2f, 0x63,
+ 0xe9, 0x11, 0x66, 0xaa, 0xfe, 0x4e, 0xce, 0x6b, 0xad, 0x9d, 0x8c, 0x52,
+ 0x9e, 0x33, 0x0b, 0x87, 0x85, 0x61, 0x64, 0x63, 0xfc, 0xec, 0xaf, 0xa4,
+ 0x63, 0xc6, 0xe2, 0x2c, 0x44, 0x45, 0x59, 0x82, 0x94, 0x65, 0x43, 0xc6,
+ 0xe5, 0x2e, 0x7f, 0x84, 0x5c, 0x63, 0xcb, 0xdf, 0x7b, 0x8b, 0xe4, 0x20,
+ 0x39, 0xf0, 0x7c, 0x14, 0x16, 0x5c, 0xed, 0x54, 0x17, 0x9b, 0x31, 0x12,
+ 0x58, 0x1d, 0x3c, 0x2c, 0x76, 0x21, 0x2b, 0x26, 0x4b, 0xfa, 0x39, 0x43,
+ 0x3d, 0x14, 0xa2, 0x5b, 0x86, 0x54, 0xb8, 0xd5, 0xe8, 0xe5, 0x2c, 0x9b,
+ 0x51, 0x30, 0xc4, 0xde, 0x8b, 0xc2, 0xdd, 0x00, 0xf3, 0x9f, 0x3e, 0xd6,
+ 0x8f, 0x37, 0x37, 0x21, 0xfd, 0x8d, 0xae, 0x58, 0x46, 0xdb, 0xfc, 0x4b,
+ 0x10, 0x01, 0xab, 0x1f, 0x8a, 0xf1, 0xcd, 0xdb, 0xd3, 0x61, 0xfc, 0xf5,
+ 0x70, 0x70, 0x78, 0xde, 0xe8, 0x21, 0xb4, 0x19, 0xa4, 0xa0, 0x2c, 0x88,
+ 0x8b, 0xa8, 0xbc, 0xb6, 0xf7, 0xbb, 0x78, 0x73, 0xad, 0x17, 0xac, 0x6f,
+ 0x88, 0x14, 0x0b, 0x16, 0xe2, 0xa2, 0x79, 0x02, 0x63, 0xdd, 0x4f, 0xe9,
+ 0x28, 0xc4, 0xcb, 0x18, 0xd9, 0x33, 0x4d, 0x11, 0x04, 0x94, 0x7b, 0x44,
+ 0x93, 0x95, 0x87, 0x17, 0xea, 0xee, 0x6b, 0x50, 0xad, 0xeb, 0x1f, 0xbf,
+ 0x64, 0x99, 0x4f, 0xa8, 0x22, 0x68, 0x24, 0xe0, 0xe4, 0xcf, 0x50, 0x0b,
+ 0x22, 0xe2, 0xc5, 0x03, 0xcd, 0x5e, 0x9d, 0xd2, 0xeb, 0xbc, 0x4d, 0x7b,
+ 0xb2, 0x5b, 0xf1, 0xa3, 0x6a, 0xd9, 0x90, 0xcc, 0xa4, 0xec, 0x7d, 0xfd,
+ 0x55, 0x78, 0x7b, 0xbe, 0x3d, 0x5d, 0xf2, 0x39, 0xfa, 0x4d, 0x5f, 0xc1,
+ 0xf2, 0xa2, 0x11, 0x78, 0x2a, 0x7d, 0x38, 0x17, 0x71, 0x5a, 0xcf, 0xf6,
+ 0x2f, 0x1f, 0x93, 0x12, 0xe6, 0x09, 0xf9, 0x63, 0xe5, 0x83, 0x02, 0x73,
+ 0x8d, 0x7f, 0x8a, 0xf0, 0xaf, 0x9b, 0x43, 0xce, 0x88, 0xbd, 0xe0, 0xc0,
+ 0xde, 0xb9, 0x68, 0xc2, 0x5b, 0x91, 0x25, 0x5a, 0x0a, 0xb2, 0x75, 0x66,
+ 0x50, 0x12, 0xa3, 0x22, 0x20, 0xb9, 0xb0, 0xc7, 0x7f, 0x6c, 0xef, 0x59,
+ 0xb8, 0x92, 0xcd, 0x77, 0xc0, 0x21, 0x35, 0x17, 0x78, 0xa8, 0x20, 0x14,
+ 0xf9, 0xa7, 0x21, 0x62, 0xcc, 0x4b, 0x76, 0x33, 0x82, 0xd1, 0x1c, 0x85,
+ 0xb6, 0x73, 0x40, 0x1d, 0x55, 0x4d, 0x2c, 0xda, 0x93, 0x21, 0x67, 0xef,
+ 0x3d, 0xb6, 0x99, 0xf2, 0x08, 0xc2, 0x6a, 0x15, 0xdf, 0xd2, 0x7b, 0xa3,
+ 0x24, 0xd1, 0xe5, 0xfa, 0xf8, 0x31, 0xb6, 0xfb, 0xc6, 0xbe, 0x93, 0x6c,
+ 0x8e, 0xcc, 0x8d, 0xed, 0x65, 0x4f, 0x93, 0xbc, 0x79, 0x0e, 0x64, 0x72,
+ 0xbc, 0xb9, 0x17, 0x9f, 0xbf, 0x78, 0xbe, 0xb5, 0xa5, 0xe5, 0x19, 0x19,
+ 0x30, 0x31, 0x22, 0x80, 0x7d, 0x4e, 0x72, 0x8b, 0x09, 0x69, 0x68, 0x82,
+ 0x6f, 0x98, 0x51, 0xdf, 0x39, 0x62, 0xe2, 0xcd, 0xd1, 0x3d, 0xa6, 0xaf,
+ 0xd2, 0x22, 0x92, 0x09, 0x0e, 0x89, 0x6e, 0xcd, 0xe0, 0x54, 0x65, 0x62,
+ 0xed, 0xbc, 0xf0, 0x4b, 0xa5, 0x02, 0xe2, 0x46, 0xce, 0x0f, 0xc5, 0xb5,
+ 0xa3, 0x21, 0x46, 0xf5, 0xa6, 0x0d, 0x33, 0x1b, 0xcf, 0xf9, 0xda, 0xa3,
+ 0x3f, 0x68, 0x3f, 0xdf, 0xd0, 0x74, 0x53, 0x57, 0xce, 0x17, 0xa3, 0xa9,
+ 0xb9, 0x81, 0x86, 0x54, 0x23, 0xf3, 0x53, 0x72, 0x92, 0xd7, 0x8d, 0x08,
+ 0x63, 0xd8, 0x0a, 0x0a, 0x9a, 0x5b, 0x76, 0xe7, 0xf0, 0xc0, 0x69, 0xa7,
+ 0xf1, 0x56, 0xf3, 0x73, 0xc9, 0x13, 0x97, 0xa1, 0xc4, 0x7a, 0xdb, 0xfa,
+ 0x9c, 0xbf, 0x55, 0x2f, 0xae, 0xfa, 0xcb, 0x06, 0xf6, 0x29, 0xab, 0xfd,
+ 0x1a, 0xbc, 0xf7, 0xa4, 0x20, 0x22, 0x45, 0x9a, 0xdc, 0xd0, 0xc9, 0x6b,
+ 0x56, 0x05, 0xa3, 0xb5, 0xb8, 0xb8, 0x5c, 0x8c, 0x24, 0xe5, 0xf9, 0x4a,
+ 0x23, 0xf4, 0x6f, 0xb8, 0x6c, 0xd3, 0x2b, 0x4a, 0x21, 0x62, 0x04, 0xdd,
+ 0x34, 0x43, 0x9d, 0x58, 0x12, 0x64, 0x01, 0x68, 0xd9, 0x96, 0xdb, 0x15,
+ 0xf3, 0x3e, 0x11, 0x2f, 0x85, 0xf8, 0x5f, 0x81, 0x8d, 0x4a, 0x91, 0xf7,
+ 0x0e, 0x6f, 0x0d, 0xa7, 0x5b, 0xb3, 0x1b, 0xd8, 0x0c, 0x60, 0x12, 0xb3,
+ 0xc0, 0xda, 0x0e, 0x7a, 0x4d, 0xfa, 0xab, 0xd9, 0xad, 0x25, 0x5f, 0x09,
+ 0x9d, 0x2c, 0x34, 0xaf, 0xa1, 0xc9, 0xd4, 0xc0, 0x78, 0x4d, 0xd6, 0xb9,
+ 0x3f, 0x04, 0xb8, 0xa7, 0x3b, 0x44, 0xa3, 0x9f, 0x40, 0xcf, 0xa8, 0x86,
+ 0xcf, 0x3a, 0xb2, 0xb4, 0x0f, 0xdb, 0x3b, 0x8d, 0xd5, 0xed, 0x66, 0x9d,
+ 0xef, 0x4b, 0x05, 0xe1, 0xac, 0x6b, 0xec, 0xb6, 0x65, 0xdc, 0xdb, 0xe6,
+ 0xec, 0xac, 0x44, 0x32, 0xff, 0x38, 0xa0, 0x8d, 0xba, 0x7d, 0xb4, 0x6a,
+ 0xa6, 0xd1, 0xfe, 0x7a, 0x5c, 0xf1, 0xb5, 0x73, 0x40, 0xbe, 0xcb, 0x0c,
+ 0x56, 0x68, 0xcb, 0x42, 0xd3, 0xaf, 0xa8, 0x41, 0x4e, 0xb0, 0xd9, 0x26,
+ 0x6f, 0x16, 0xa1, 0x74, 0x94, 0x08, 0x1f, 0xf2, 0x24, 0x11, 0xa6, 0xa0,
+ 0x95, 0x70, 0xc9, 0x8c, 0x30, 0xc7, 0x08, 0xab, 0xd7, 0x80, 0xbd, 0xcf,
+ 0x9e, 0x66, 0x8a, 0x11, 0x18, 0xcd, 0xe1, 0x3e, 0x40, 0xde, 0x92, 0x3b,
+ 0xd5, 0xf5, 0xae, 0x9d, 0x83, 0x40, 0xd5, 0xd4, 0xff, 0x53, 0x7f, 0xf9,
+ 0x91, 0x26, 0xeb, 0xbf, 0x74, 0xb2, 0xa4, 0xdb, 0x69, 0x90, 0xae, 0x07,
+ 0x3b, 0xf8, 0x8f, 0x98, 0x94, 0xbf, 0x12, 0x22, 0x85, 0x67, 0xc6, 0x74,
+ 0x79, 0x86, 0xe6, 0xfe, 0x38, 0xb0, 0xfa, 0xae, 0x36, 0x41, 0xc9, 0x47,
+ 0x6c, 0xd5, 0x8f, 0x1e, 0x02, 0xdf, 0x11, 0xed, 0xc1, 0x9f, 0x8a, 0x1e,
+ 0xb8, 0xf0, 0x8c, 0xe9, 0x95, 0xa2, 0x96, 0x2b, 0x55, 0x73, 0xe2, 0x65,
+ 0xfc, 0xa9, 0x92, 0xdc, 0x77, 0x63, 0x74, 0x98, 0x8e, 0x93, 0x41, 0xc6,
+ 0x3f, 0x0f, 0x2d, 0x00, 0x42, 0xcb, 0xec, 0x63, 0x35, 0xfe, 0xd8, 0xaf,
+ 0x1f, 0x66, 0xa3, 0x72, 0x2a, 0x1b, 0x9d, 0x86, 0x6b, 0xfa, 0xac, 0x3f,
+ 0xe3, 0x65, 0x41, 0x64, 0xa3, 0xef, 0xe5, 0xae, 0xf6, 0xa2, 0x7c, 0xbd,
+ 0x64, 0xa2, 0x94, 0xe3, 0x31, 0xb2, 0x48, 0x08, 0x7a, 0x6d, 0xb6, 0xfb,
+ 0x1f, 0x13, 0x86, 0xe2, 0x20, 0xf0, 0xc6, 0x95, 0x89, 0x26, 0x1a, 0xe8,
+ 0x5c, 0xb8, 0x4a, 0x9c, 0xd1, 0xdc, 0x8d, 0xe8, 0xe6, 0xf1, 0x56, 0xc7,
+ 0xda, 0x16, 0xb1, 0xbc, 0x5f, 0x3a, 0xa1, 0xa6, 0xa3, 0x1f, 0x91, 0x2c,
+ 0x22, 0xfb, 0xee, 0x90, 0x7f, 0xd6, 0xbf, 0xc4, 0xcf, 0x14, 0x77, 0x20,
+ 0x79, 0x66, 0x14, 0xc9, 0x96, 0x44, 0x30, 0xf2, 0x51, 0xc6, 0xa5, 0x54,
+ 0x1b, 0xcc, 0x44, 0x50, 0x61, 0x73, 0xba, 0x83, 0x7e, 0xea, 0x61, 0xfa,
+ 0xc8, 0xc9, 0xf6, 0xc6, 0xe6, 0x5f, 0xdd, 0x1a, 0xa8, 0xcf, 0xa7, 0x4d,
+ 0x3e, 0x4b, 0x05, 0xfe, 0xc3, 0x78, 0x1f, 0xbb, 0x8d, 0x95, 0x29, 0x42,
+ 0x2a, 0xd4, 0x97, 0x83, 0xc7, 0x9a, 0xa3, 0x0b, 0x51, 0x21, 0xe8, 0x82,
+ 0x94, 0x20, 0xdf, 0x93, 0x47, 0x1c, 0xdc, 0x94, 0x53, 0x86, 0x68, 0x50,
+ 0xcb, 0x8f, 0x8c, 0xb5, 0xd4, 0xf4, 0x4c, 0xf1, 0x28, 0x31, 0x58, 0xe3,
+ 0xac, 0x97, 0xb8, 0x68, 0xa0, 0xc2, 0xa0, 0x12, 0x0a, 0x1c, 0xae, 0x6e,
+ 0xce, 0x46, 0x15, 0xad, 0x7b, 0xff, 0x18, 0x95, 0xda, 0x4a, 0x06, 0x6c,
+ 0xa1, 0x9f, 0xa8, 0x93, 0x4e, 0x5e, 0xcd, 0x48, 0xec, 0x28, 0x89, 0x88,
+ 0x58, 0xc4, 0x9d, 0xfe, 0xc3, 0x8b, 0x4e, 0xb2, 0xe3, 0xa7, 0xef, 0x45,
+ 0x25, 0x07, 0x5a, 0x54, 0x77, 0x75, 0x73, 0xcb, 0x2b, 0xfc, 0x5e, 0x35,
+ 0xf3, 0x8f, 0x54, 0x9f, 0xf4, 0xe1, 0x23, 0xe1, 0xfa, 0xb0, 0x66, 0xea,
+ 0x73, 0xc7, 0x0f, 0x30, 0xb3, 0x9c, 0xd9, 0xb6, 0x98, 0x53, 0x3b, 0xd8,
+ 0xe4, 0xd3, 0x92, 0x0d, 0x9a, 0xc7, 0x86, 0xd1, 0x46, 0xd0, 0xf9, 0x19,
+ 0xd4, 0x9b, 0xed, 0xda, 0x18, 0xcf, 0x83, 0x8e, 0x51, 0xc0, 0xfe, 0x23,
+ 0x22, 0x7d, 0x76, 0x33, 0x99, 0xeb, 0x26, 0xab, 0xf2, 0xb1, 0x5f, 0x28,
+ 0x0a, 0x0f, 0x60, 0x4b, 0x31, 0x5f, 0x12, 0x85, 0xfe, 0xa2, 0xd4, 0x70,
+ 0x9d, 0xff, 0x81, 0x77, 0x54, 0xea, 0x62, 0x81, 0xf2, 0x48, 0x01, 0x62,
+ 0x89, 0xc4, 0x66, 0x09, 0x89, 0xe0, 0x22, 0xb6, 0xc7, 0x8f, 0x8c, 0x13,
+ 0xdc, 0x93, 0x7b, 0x18, 0xab, 0x51, 0xcf, 0xd2, 0xda, 0x76, 0x90, 0x47,
+ 0x80, 0x13, 0x85, 0xf1, 0x2a, 0xd7, 0xc5, 0xa3, 0xe7, 0x90, 0x21, 0x3b,
+ 0x74, 0xeb, 0x0f, 0x96, 0xcc, 0x0c, 0x43, 0x2d, 0x45, 0x06, 0xb8, 0xa9,
+ 0xe1, 0x29, 0x11, 0x3d, 0xa7, 0x3b, 0x29, 0x31, 0x8c, 0x60, 0xd2, 0xc5,
+ 0xbf, 0x2b, 0x2f, 0xc8, 0x26, 0xbb, 0xb6, 0xb5, 0x72, 0xc6, 0x96, 0xe0,
+ 0xc0, 0x54, 0x47, 0x52, 0x2a, 0x91, 0xc7, 0x9a, 0x83, 0x18, 0xea, 0x2c,
+ 0xf8, 0xde, 0xb2, 0x05, 0x57, 0x85, 0x56, 0x86, 0x45, 0x3f, 0xb3, 0x4e,
+ 0x0d, 0x7f, 0x50, 0x89, 0x95, 0x41, 0xd3, 0x87, 0x24, 0x4a, 0x3f, 0xda,
+ 0xf9, 0x1f, 0xff, 0xf3, 0x2f, 0x62, 0xa5, 0xa7, 0x81, 0xbc, 0xfc, 0x98,
+ 0xcf, 0x3d, 0xe1, 0x75, 0x7c, 0x6e, 0x2b, 0xe8, 0x5a, 0x34, 0x17, 0x03,
+ 0x34, 0xe9, 0x44, 0x78, 0x10, 0x2f, 0x3a, 0xe5, 0x8f, 0x4d, 0xc3, 0x18,
+ 0x29, 0x88, 0x09, 0x9b, 0xce, 0x1e, 0x45, 0x59, 0x5f, 0xb5, 0x24, 0x31,
+ 0xa4, 0x8f, 0xcf, 0x51, 0x6f, 0x77, 0x75, 0x73, 0x70, 0x21, 0xb5, 0xaa,
+ 0x77, 0xbf, 0x5a, 0x3a, 0x24, 0xae, 0x19, 0x2d, 0x43, 0xe2, 0xee, 0xfb,
+ 0x24, 0xc4, 0x82, 0xa5, 0x67, 0xb0, 0x4a, 0xbb, 0x9b, 0xab, 0xfb, 0xe0,
+ 0x8d, 0xe1, 0xd1, 0x9e, 0x98, 0x6f, 0x7d, 0x74, 0x14, 0x96, 0xc9, 0xa9,
+ 0xd4, 0x62, 0x36, 0xdf, 0x36, 0x7a, 0x81, 0x23, 0xb7, 0x44, 0x7d, 0xcd,
+ 0x5c, 0x8b, 0xee, 0x8d, 0xe1, 0xe1, 0x8d, 0xe9, 0xb3, 0x49, 0x44, 0xbd,
+ 0xed, 0xec, 0xaf, 0x67, 0xd1, 0x3e, 0x68, 0xa9, 0xae, 0xda, 0xf6, 0xc1,
+ 0x74, 0xc1, 0xfd, 0x50, 0xf6, 0x17, 0x5d, 0x82, 0xe6, 0xd8, 0x48, 0x01,
+ 0x3d, 0xf8, 0xfe, 0x1f, 0x15, 0x28, 0xcb, 0xf6, 0x79, 0xd8, 0x0f, 0x1c,
+ 0xa6, 0x8f, 0x75, 0x3d, 0xa5, 0xcd, 0x9e, 0x5f, 0x3d, 0x98, 0x4e, 0xd5,
+ 0x4b, 0x73, 0x8c, 0xfd, 0xbb, 0x94, 0x9f, 0xd3, 0x05, 0xf3, 0x2c, 0xcb,
+ 0x8d, 0x1a, 0xce, 0xbf, 0x79, 0x46, 0x55, 0x8a, 0x99, 0x3d, 0xf1, 0x91,
+ 0x19, 0x03, 0xb9, 0x22, 0x3e, 0xef, 0x02, 0x62, 0x22, 0x43, 0xad, 0xde,
+ 0x30, 0xa0, 0xba, 0x95, 0x30, 0x9a, 0x1e, 0x1d, 0x7c, 0xab, 0x25, 0x6a,
+ 0xc4, 0xc5, 0x80, 0xdb, 0x13, 0x42, 0xa9, 0x5a, 0xc1, 0x84, 0xe8, 0xfc,
+ 0x7f, 0x64, 0xb1, 0x82, 0xc0, 0xad, 0xd6, 0xa6, 0xb4, 0x15, 0x58, 0x53,
+ 0xd9, 0x1d, 0x1a, 0x7a, 0xed, 0x9f, 0xd0, 0xbd, 0x38, 0x8d, 0xb0, 0x43,
+ 0x26, 0x21, 0x72, 0x81, 0xab, 0x01, 0x00, 0xc0, 0xea, 0x16, 0x7b, 0x93,
+ 0xb0, 0x2d, 0xa0, 0x5c, 0x42, 0x31, 0x45, 0xfc, 0x62, 0xb9, 0x2f, 0xd2,
+ 0xd1, 0x20, 0x35, 0x5b, 0x16, 0xb7, 0xa3, 0x5a, 0x9b, 0x40, 0x16, 0x40,
+ 0x62, 0x84, 0x3b, 0x60, 0x4c, 0xc4, 0xd9, 0xc0, 0xe8, 0xa4, 0x8f, 0x6d,
+ 0x1b, 0xa1, 0xce, 0xe2, 0x7a, 0x12, 0x30, 0x75, 0xae, 0x41, 0xf0, 0x50,
+ 0x76, 0xb6, 0x92, 0xb9, 0x5f, 0x22, 0x33, 0x47, 0xf7, 0xaa, 0x15, 0x5a,
+ 0x97, 0xee, 0xaa, 0x6d, 0x8b, 0xae, 0x7f, 0xf8, 0x80, 0x2f, 0x11, 0x52,
+ 0x1d, 0x39, 0xf4, 0xd8, 0x1d, 0x19, 0x15, 0x0d, 0x32, 0x06, 0x95, 0x52,
+ 0xde, 0x18, 0x96, 0x49, 0xa9, 0xdf, 0x4b, 0x48, 0x09, 0x70, 0xb0, 0x65,
+ 0xd3, 0x01, 0x49, 0x26, 0xbf, 0xd8, 0xac, 0x1d, 0xd1, 0x1c, 0x65, 0x1a,
+ 0x4d, 0xac, 0x67, 0x7d, 0x2b, 0xc6, 0xb8, 0xd1, 0xd5, 0xe8, 0xcc, 0x0e,
+ 0xf6, 0x2f, 0x2d, 0xc4, 0x6d, 0x1f, 0x3d, 0x1b, 0x44, 0x59, 0xf2, 0xd1,
+ 0xd2, 0x1d, 0x73, 0x84, 0x03, 0x35, 0x3e, 0x5d, 0x51, 0x6e, 0x26, 0x9f,
+ 0xe1, 0xf3, 0x4b, 0x92, 0x4b, 0x9f, 0x8e, 0x38, 0xb3, 0xd0, 0x9a, 0x06,
+ 0x4b, 0x57, 0xb5, 0xa6, 0x09, 0x56, 0xb6, 0x29, 0xc4, 0x1c, 0x1f, 0x39,
+ 0x69, 0xc4, 0x21, 0x16, 0xfd, 0xa2, 0x65, 0x2a, 0xe3, 0x39, 0xe5, 0x4f,
+ 0xae, 0x18, 0x81, 0x67, 0x3a, 0xaf, 0xfe, 0xa2, 0x2f, 0x22, 0xe2, 0x9f,
+ 0x16, 0xe4, 0x74, 0xf2, 0xb4, 0xa9, 0x5b, 0x0a, 0x4f, 0x07, 0xd3, 0xb3,
+ 0x5b, 0x07, 0x6a, 0x2b, 0xa5, 0x88, 0xfb, 0xb5, 0xc7, 0x45, 0xcd, 0xfc,
+ 0xe0, 0xce, 0xbc, 0x31, 0xb2, 0xb3, 0x5e, 0x54, 0x5c, 0x81, 0xf5, 0x71,
+ 0x75, 0x4f, 0x3d, 0x38, 0xb6, 0x3d, 0x22, 0x19, 0x6a, 0x93, 0x64, 0x2f,
+ 0xe9, 0x95, 0x1d, 0x22, 0x26, 0x57, 0xbb, 0xa5, 0x98, 0xf1, 0xdf, 0xa8,
+ 0x57, 0xdc, 0xda, 0x53, 0xfa, 0xf4, 0x8f, 0xde, 0x6b, 0xdd, 0x9b, 0x0c,
+ 0x57, 0x95, 0xbd, 0x61, 0x9e, 0x24, 0xec, 0x57, 0x5f, 0x65, 0xad, 0xdb,
+ 0xea, 0xf1, 0x33, 0xbb, 0xec, 0x2a, 0xdb, 0x8d, 0x89, 0x10, 0x92, 0x0e,
+ 0x1f, 0xd3, 0xf9, 0x5c, 0xc4, 0xce, 0xe3, 0x63, 0x67, 0x16, 0x17, 0xae,
+ 0x66, 0x45, 0x8c, 0xea, 0x5c, 0x36, 0xdc, 0x6c, 0xd4, 0xf2, 0x56, 0x19,
+ 0x6e, 0x18, 0x60, 0x45, 0xa1, 0xcc, 0xd5, 0xcd, 0x71, 0xe1, 0x63, 0x7e,
+ 0x9c, 0xb8, 0x6c, 0x87, 0xc3, 0x6f, 0xb6, 0xb3, 0x66, 0x6c, 0x65, 0xe0,
+ 0xb6, 0x03, 0x4d, 0xb1, 0x59, 0xf6, 0xd8, 0xcd, 0x04, 0x21, 0x8c, 0xba,
+ 0x16, 0x34, 0x0f, 0xd6, 0xc5, 0xf8, 0xd4, 0x69, 0x68, 0x5b, 0x28, 0xbf,
+ 0xd3, 0x40, 0x89, 0x06, 0x2f, 0xb1, 0x5f, 0xe2, 0xca, 0xa9, 0x59, 0xab,
+ 0xef, 0x9b, 0x8f, 0xed, 0x73, 0x31, 0x6e, 0xda, 0x63, 0x8c, 0x8e, 0x88,
+ 0xec, 0x6e, 0x42, 0x4b, 0x2c, 0xe6, 0xff, 0x07, 0x16, 0x16, 0x59, 0x04,
+ 0x2e, 0x16, 0x07, 0x74, 0xc9, 0xe3, 0x5d, 0x9e, 0x93, 0x89, 0xcb, 0x56,
+ 0xec, 0xe3, 0x7d, 0x96, 0x4e, 0x43, 0xe1, 0x8d, 0x74, 0x1b, 0xbd, 0x66,
+ 0x5c, 0xed, 0x2f, 0xe8, 0x33, 0x67, 0xd2, 0x49, 0x1f, 0xd0, 0x65, 0xb8,
+ 0x0c, 0x6d, 0x0d, 0x71, 0xa3, 0x55, 0x5c, 0xe7, 0xc5, 0x53, 0x7c, 0x3f,
+ 0x16, 0xe2, 0xc0, 0x98, 0x81, 0xac, 0x6f, 0x5b, 0x95, 0x2c, 0x2e, 0x8e,
+ 0x62, 0x50, 0xe2, 0xfe, 0xa3, 0x62, 0x22, 0x15, 0x12, 0x3e, 0x12, 0x15,
+ 0x9e, 0x3f, 0x74, 0xac, 0x1e, 0x0b, 0x02, 0x41, 0xe4, 0xe3, 0x05, 0xa5,
+ 0x30, 0x47, 0xca, 0xb4, 0x05, 0x5e, 0x0e, 0xa3, 0x03, 0x70, 0xea, 0xc2,
+ 0x1d, 0xc5, 0x34, 0x97, 0xac, 0x85, 0xd5, 0xf5, 0x96, 0x6c, 0x10, 0xaa,
+ 0xe1, 0x8d, 0x79, 0x96, 0x72, 0xe8, 0xfa, 0xfc, 0xa3, 0x62, 0xca, 0x88,
+ 0xb8, 0x79, 0xed, 0xa5, 0xc3, 0x62, 0x9b, 0xf0, 0x46, 0xed, 0xe9, 0xe1,
+ 0xe8, 0x25, 0x4f, 0xde, 0x0a, 0x08, 0x05, 0xd9, 0xb9, 0xb5, 0x75, 0xef,
+ 0xd9, 0x51, 0xce, 0xf4, 0x82, 0xf4, 0xcb, 0x74, 0xac, 0xea, 0xfe, 0x63,
+ 0xbd, 0x4b, 0xb9, 0x3c, 0x43, 0x7b, 0x12, 0x18, 0x83, 0xd1, 0xba, 0x64,
+ 0x18, 0x5a, 0xf2, 0x14, 0x11, 0x2f, 0xb4, 0x68, 0x80, 0x06, 0x6b, 0x56,
+ 0x94, 0x3f, 0x5f, 0xf5, 0xe0, 0xe9, 0x5a, 0x69, 0xd4, 0x48, 0x43, 0x5f,
+ 0xd1, 0xf3, 0xa7, 0x1f, 0x9f, 0xdf, 0x47, 0xc4, 0x31, 0xc6, 0x87, 0x34,
+ 0x95, 0xc8, 0xe1, 0x19, 0x65, 0x4f, 0x35, 0x90, 0x89, 0xef, 0xae, 0x73,
+ 0x8c, 0xba, 0x02, 0x42, 0x11, 0x6d, 0x61, 0xd1, 0xf9, 0x88, 0x66, 0x20,
+ 0x2b, 0xd0, 0x42, 0xff, 0x12, 0xf7, 0xa6, 0x12, 0xba, 0x1a, 0x0d, 0x99,
+ 0x8e, 0x4f, 0x93, 0x3d, 0xe5, 0xa6, 0xa1, 0xfb, 0x3f, 0x7e, 0x66, 0x44,
+ 0x57, 0x6c, 0xe9, 0x6f, 0xe1, 0x3c, 0x6b, 0x12, 0xab, 0x64, 0x95, 0x03,
+ 0x9e, 0xf8, 0x94, 0x6d, 0x44, 0xde, 0xb0, 0xc8, 0x69, 0x05, 0xab, 0xa9,
+ 0xaa, 0xea, 0xfc, 0x65, 0x9b, 0x6e, 0x01, 0x8f, 0x1a, 0xa5, 0x3d, 0x81,
+ 0xc0, 0x8f, 0x0c, 0x7e, 0xe5, 0x3d, 0x80, 0x6d, 0x42, 0x5a, 0x46, 0xff,
+ 0x31, 0x5f, 0xac, 0x7a, 0xad, 0x09, 0x80, 0x87, 0x54, 0xdc, 0xe9, 0xc4,
+ 0xd1, 0xb9, 0xa8, 0xa1, 0x6a, 0x69, 0x38, 0xf7, 0x57, 0x37, 0xa7, 0xec,
+ 0xbd, 0xbf, 0x23, 0x75, 0xdb, 0xa7, 0xd4, 0x9c, 0x82, 0x28, 0x28, 0xbd,
+ 0x4e, 0x71, 0x11, 0xd9, 0x24, 0x50, 0xeb, 0x54, 0x6f, 0xd7, 0x82, 0x6a,
+ 0x17, 0x7a, 0xa8, 0x9b, 0x32, 0xc8, 0xdb, 0x21, 0x65, 0x8f, 0x62, 0x8e,
+ 0xb8, 0x2d, 0x8c, 0x95, 0x95, 0x72, 0xfa, 0x5d, 0x61, 0x44, 0x42, 0xc3,
+ 0xde, 0x67, 0xf1, 0xd5, 0x53, 0x57, 0xf2, 0xd1, 0xa2, 0x41, 0x98, 0xda,
+ 0x31, 0x7b, 0x45, 0x40, 0xe9, 0x92, 0x18, 0x86, 0xaf, 0x59, 0xff, 0xe7,
+ 0xa7, 0xc9, 0xf5, 0xa0, 0xac, 0x72, 0xba, 0x71, 0x80, 0xb9, 0xd3, 0xd6,
+ 0x68, 0xeb, 0xf7, 0x20, 0x4f, 0xc8, 0xa6, 0x88, 0x35, 0x27, 0x91, 0x97,
+ 0x44, 0x69, 0xba, 0xda, 0xed, 0xce, 0xb0, 0x59, 0x11, 0x80, 0xb1, 0x6d,
+ 0x0e, 0x6c, 0xaa, 0x5a, 0x2c, 0x42, 0x29, 0x19, 0x35, 0x89, 0xab, 0x82,
+ 0xa4, 0x98, 0x01, 0x3b, 0x64, 0x37, 0x56, 0x8a, 0x8d, 0xdd, 0xa7, 0x15,
+ 0x72, 0x43, 0x03, 0x0f, 0x45, 0x5e, 0xd7, 0x0b, 0x2c, 0xd8, 0xbb, 0xe3,
+ 0x93, 0x23, 0x0b, 0x0a, 0xfa, 0xdf, 0xdb, 0x03, 0x9a, 0xf0, 0x6a, 0x1c,
+ 0x40, 0xa0, 0x38, 0x29, 0xcb, 0xcb, 0xb0, 0x93, 0xac, 0xad, 0x6f, 0x7b,
+ 0x5c, 0x30, 0x06, 0x3f, 0x6e, 0xa5, 0x6c, 0x1d, 0x9d, 0x7e, 0x77, 0x7c,
+ 0x71, 0x76, 0xfa, 0xfe, 0xe8, 0xd4, 0x7a, 0x7b, 0xe9, 0x50, 0xc4, 0x58,
+ 0x5f, 0xeb, 0x30, 0xe8, 0x9b, 0x53, 0xbc, 0x80, 0xa8, 0x07, 0x51, 0xe9,
+ 0x8a, 0xa8, 0x36, 0xe6, 0x73, 0xf9, 0xd7, 0xc0, 0x6f, 0xce, 0x7b, 0x48,
+ 0x3d, 0xbe, 0x14, 0x87, 0x9f, 0x93, 0xbd, 0x3f, 0xa1, 0xd0, 0xdb, 0x80,
+ 0x7d, 0xc4, 0xb6, 0xe4, 0x16, 0x11, 0xcf, 0x7e, 0x1a, 0x67, 0x52, 0x70,
+ 0x94, 0x12, 0x34, 0xd6, 0xec, 0x94, 0x70, 0x94, 0xc8, 0x05, 0xd3, 0x5a,
+ 0x9d, 0x70, 0x9b, 0xfb, 0x03, 0x27, 0x0d, 0xc6, 0x19, 0x6c, 0x19, 0x00,
+ 0xee, 0x57, 0x63, 0xbc, 0x61, 0x10, 0x83, 0x14, 0xe3, 0x13, 0xd2, 0x69,
+ 0x0f, 0x42, 0xe7, 0x32, 0x6e, 0xfd, 0xea, 0x60, 0xdd, 0xb8, 0x9f, 0x37,
+ 0x8a, 0x1f, 0xd5, 0x85, 0xb0, 0xbf, 0xbd, 0xfd, 0x33, 0xca, 0xd2, 0x7d,
+ 0x21, 0x75, 0xe9, 0x42, 0x1a, 0xb3, 0xda, 0xeb, 0x88, 0x88, 0x5c, 0x2f,
+ 0x85, 0x87, 0xf6, 0xad, 0x9d, 0x4e, 0x38, 0x07, 0x3f, 0x9e, 0x5f, 0x9c,
+ 0xfd, 0xf0, 0x97, 0xdf, 0xf8, 0x13, 0x1e, 0x56, 0xe7, 0x47, 0x82, 0xb0,
+ 0x69, 0xe3, 0x3f, 0xff, 0xaa, 0xaf, 0xad, 0xfc, 0x5c, 0xbb, 0xfd, 0x5e,
+ 0xbb, 0x7a, 0x6a, 0x90, 0xa0, 0x84, 0x6c, 0x48, 0x26, 0x8b, 0xd7, 0xdc,
+ 0x48, 0x67, 0xf5, 0x5a, 0x00, 0x0d, 0xdf, 0x70, 0x75, 0xab, 0xb8, 0x5f,
+ 0xac, 0xda, 0x05, 0xc8, 0x1e, 0x90, 0xa2, 0xe7, 0x00, 0x90, 0x9a, 0xa6,
+ 0x49, 0xa9, 0x98, 0x9c, 0xac, 0x09, 0x40, 0x9f, 0x9d, 0x8f, 0x83, 0x93,
+ 0x93, 0x5f, 0x3f, 0x09, 0xca, 0xcf, 0xde, 0x9e, 0x06, 0x54, 0xf7, 0xb2,
+ 0x03, 0xea, 0x5b, 0x2d, 0x55, 0x8f, 0xc0, 0x2a, 0x36, 0xb9, 0xd3, 0x33,
+ 0xe9, 0xcd, 0x6b, 0xa8, 0xc7, 0xfd, 0x3a, 0x33, 0x4a, 0x2d, 0x55, 0x53,
+ 0x4e, 0xa6, 0x84, 0x89, 0x31, 0xe6, 0x36, 0x75, 0x2c, 0xa8, 0xe1, 0xe5,
+ 0xff, 0x92, 0xc1, 0x68, 0x3c, 0x8f, 0x9c, 0x4b, 0x04, 0xb4, 0x77, 0x69,
+ 0x09, 0x3e, 0xb8, 0xb8, 0xa0, 0xd4, 0xb7, 0xbb, 0x8a, 0xd5, 0x2f, 0xc3,
+ 0x8d, 0x40, 0xd7, 0x6c, 0x95, 0xd7, 0xb7, 0x80, 0xc2, 0xd3, 0xc1, 0x84,
+ 0xb2, 0xab, 0x79, 0xb0, 0xa4, 0xeb, 0xa2, 0x2b, 0x2b, 0x58, 0xc0, 0x9f,
+ 0x11, 0x85, 0x16, 0xdf, 0x29, 0xd1, 0x93, 0xaa, 0xc5, 0x83, 0xdc, 0x7e,
+ 0x42, 0x32, 0x79, 0x47, 0x50, 0x5e, 0xd9, 0x1c, 0x1a, 0xff, 0x78, 0xba,
+ 0x50, 0x2a, 0x38, 0x28, 0x80, 0x5b, 0xd3, 0xc9, 0x7b, 0xc3, 0x2a, 0x25,
+ 0x32, 0xcc, 0x83, 0x44, 0x79, 0xc9, 0x75, 0x91, 0xbb, 0xbb, 0xff, 0x29,
+ 0xd1, 0x54, 0x77, 0x9e, 0x12, 0x3f, 0x1f, 0x46, 0x7f, 0xf3, 0x94, 0xe6,
+ 0x88, 0x0b, 0x99, 0x5c, 0x0e, 0x14, 0x1a, 0x97, 0xcd, 0x61, 0xfe, 0x20,
+ 0x00, 0x62, 0x23, 0x5b, 0x13, 0x28, 0xd1, 0x9c, 0xd3, 0xc1, 0x7b, 0xaa,
+ 0xb3, 0x07, 0x50, 0x88, 0x70, 0x04, 0xee, 0x13, 0x8f, 0x77, 0x39, 0x12,
+ 0x9d, 0x33, 0x8f, 0x91, 0x0b, 0x94, 0xf9, 0x0f, 0xfc, 0xf6, 0x5c, 0x7f,
+ 0x59, 0x35, 0x94, 0xbe, 0xa2, 0xa7, 0xb2, 0x55, 0x62, 0x41, 0x10, 0xb3,
+ 0xde, 0xbc, 0x43, 0xcd, 0x7f, 0x2f, 0xcf, 0x0e, 0xcf, 0x4e, 0xcc, 0x5f,
+ 0x8e, 0xde, 0x1d, 0xff, 0xe0, 0x2e, 0x31, 0xd9, 0x00, 0x36, 0x13, 0x85,
+ 0xc3, 0x80, 0x5a, 0x6e, 0xd2, 0x97, 0x1e, 0x8c, 0x64, 0x0a, 0xd8, 0x2f,
+ 0xda, 0xcc, 0x6d, 0xde, 0xb1, 0x94, 0x8a, 0x91, 0xad, 0xea, 0x8f, 0x42,
+ 0xbd, 0x41, 0x4a, 0x1f, 0xb7, 0x6a, 0x91, 0xd3, 0x6e, 0x67, 0x1e, 0xb7,
+ 0x4e, 0x24, 0x14, 0x01, 0xff, 0xa2, 0x6b, 0x9f, 0x65, 0xee, 0x14, 0x42,
+ 0xca, 0xf9, 0x95, 0xd5, 0xfe, 0xfd, 0x4a, 0x77, 0x9a, 0x41, 0x21, 0x14,
+ 0xca, 0x14, 0x5d, 0x75, 0xe4, 0x7a, 0xa4, 0x94, 0xf5, 0xbc, 0x41, 0xaa,
+ 0x7e, 0xd6, 0x54, 0x19, 0xce, 0x31, 0x70, 0x1a, 0xad, 0x2c, 0xef, 0x0e,
+ 0xd0, 0x90, 0x6e, 0x55, 0xd7, 0x5c, 0x7b, 0x4c, 0x32, 0x01, 0x82, 0x07,
+ 0x42, 0x9c, 0x18, 0x25, 0xbb, 0x1d, 0xe4, 0x84, 0xcb, 0x34, 0x9a, 0xb9,
+ 0x8a, 0xa6, 0x07, 0xe5, 0x7c, 0x2f, 0x12, 0x1b, 0xdd, 0x5d, 0x8a, 0x64,
+ 0x0c, 0x2a, 0x2c, 0x2a, 0xb5, 0x1d, 0x3b, 0x6d, 0xa4, 0xbf, 0xaa, 0x91,
+ 0xb4, 0xdd, 0xca, 0x8b, 0x5f, 0xd3, 0xc8, 0x8b, 0x4e, 0x1b, 0x37, 0xbf,
+ 0xaa, 0x11, 0x5b, 0xdf, 0xd9, 0xa8, 0x42, 0x3f, 0x1c, 0x5f, 0x26, 0x87,
+ 0x67, 0x6f, 0xdd, 0x1e, 0xbd, 0xb4, 0x70, 0xc7, 0x34, 0x19, 0x2d, 0x0a,
+ 0xb3, 0x8a, 0x44, 0x9f, 0x8d, 0x9a, 0x50, 0xd4, 0x0c, 0x83, 0x20, 0x39,
+ 0x2c, 0xaf, 0x04, 0x0f, 0xe6, 0x4b, 0x39, 0x7e, 0x54, 0x71, 0xb4, 0xdd,
+ 0x27, 0xc9, 0x93, 0xc7, 0x67, 0x44, 0x17, 0x71, 0xed, 0x68, 0xfe, 0x68,
+ 0x67, 0x13, 0x6b, 0x50, 0x5a, 0x69, 0x22, 0xd6, 0x28, 0x25, 0x52, 0x88,
+ 0x82, 0x33, 0x8a, 0x08, 0xca, 0xdd, 0xe2, 0x57, 0x5c, 0xf3, 0x33, 0x4e,
+ 0x85, 0x6b, 0xb1, 0x27, 0xf9, 0x1b, 0x79, 0x23, 0xbd, 0x69, 0x21, 0x8c,
+ 0x76, 0x15, 0x21, 0xdb, 0xda, 0x31, 0x52, 0x95, 0x00, 0x46, 0x0e, 0x41,
+ 0x21, 0x41, 0x24, 0x83, 0xf3, 0xc8, 0x75, 0x38, 0xac, 0xd6, 0xca, 0x25,
+ 0xcb, 0x82, 0x2b, 0xc9, 0x36, 0x61, 0xbf, 0xb3, 0xc7, 0x7f, 0xbc, 0x4b,
+ 0x51, 0xe1, 0xdb, 0x9c, 0x3f, 0xc1, 0x9b, 0xe4, 0x7f, 0xf7, 0xf4, 0xb2,
+ 0x67, 0xf6, 0x1a, 0x36, 0x23, 0x9f, 0xa2, 0x0e, 0xd6, 0x84, 0xa1, 0x85,
+ 0xf5, 0x43, 0xd1, 0xa4, 0x9f, 0x60, 0x87, 0x91, 0xd2, 0x2c, 0xb4, 0x18,
+ 0xee, 0xcd, 0xe7, 0x72, 0x19, 0x27, 0x96, 0x7f, 0x03, 0xe7, 0x4f, 0xb3,
+ 0x7b, 0x3c, 0x08, 0x81, 0x98, 0xab, 0xa6, 0x07, 0x9a, 0x5d, 0x88, 0x98,
+ 0x47, 0x56, 0x53, 0x75, 0xae, 0xb5, 0x68, 0x78, 0xd7, 0x7e, 0x56, 0x13,
+ 0x15, 0xcb, 0x4a, 0xe0, 0x08, 0xae, 0xc0, 0x84, 0x23, 0x4e, 0xa0, 0x9a,
+ 0xda, 0x3c, 0x69, 0xfd, 0x28, 0x1b, 0x3b, 0xd2, 0xd9, 0x91, 0xbf, 0x24,
+ 0x19, 0x40, 0xa2, 0x73, 0x4e, 0x4a, 0x61, 0xc5, 0x24, 0x80, 0x1d, 0xd5,
+ 0x0a, 0x34, 0xbf, 0x78, 0xe0, 0xca, 0x16, 0x69, 0x81, 0x44, 0x9d, 0x2e,
+ 0x5e, 0x50, 0x17, 0x46, 0xb2, 0x18, 0x5c, 0xca, 0xc0, 0x0b, 0xfe, 0xe3,
+ 0x50, 0xef, 0x6e, 0x2d, 0x59, 0xec, 0x17, 0x6d, 0x57, 0x0a, 0x22, 0x91,
+ 0x5a, 0xb8, 0xf8, 0x29, 0x91, 0x9d, 0xea, 0xdb, 0x83, 0x9a, 0x7f, 0x14,
+ 0x72, 0x24, 0xd6, 0x1d, 0x3f, 0xd7, 0xcb, 0x25, 0xdf, 0x61, 0x96, 0x8c,
+ 0x4b, 0xcb, 0xd6, 0xd1, 0xf5, 0x2a, 0x53, 0xfb, 0x61, 0x6b, 0x9f, 0x75,
+ 0xb7, 0x88, 0x7a, 0x78, 0x89, 0x4b, 0xad, 0xf4, 0x63, 0x3d, 0x9f, 0x8b,
+ 0x35, 0x9a, 0x51, 0xd6, 0x8f, 0xe8, 0x4e, 0x55, 0x36, 0xa7, 0x82, 0xcb,
+ 0x97, 0xae, 0xf0, 0x1b, 0x02, 0x4a, 0xb0, 0x28, 0x31, 0xcf, 0x63, 0xed,
+ 0xa5, 0x51, 0x88, 0x7c, 0x63, 0xe0, 0x95, 0x7c, 0x96, 0x72, 0x52, 0xf8,
+ 0x4a, 0x23, 0x6c, 0x65, 0x91, 0xdb, 0xad, 0x27, 0x65, 0xe4, 0xf0, 0x23,
+ 0xc2, 0x40, 0x19, 0x81, 0x5f, 0xda, 0x7f, 0xcb, 0x1b, 0x01, 0x79, 0x50,
+ 0xc7, 0x9d, 0x48, 0xa3, 0x5d, 0x54, 0x9c, 0xf5, 0xe6, 0x08, 0xb3, 0x80,
+ 0x2f, 0x4d, 0x8b, 0x46, 0x20, 0x42, 0x15, 0xb1, 0x1c, 0x99, 0xe5, 0x79,
+ 0x1f, 0x02, 0x4b, 0xca, 0xab, 0x46, 0xe8, 0x54, 0x12, 0x50, 0xe6, 0xf3,
+ 0xfc, 0xdc, 0xa4, 0xc5, 0x75, 0xc6, 0xca, 0x96, 0xc7, 0xf9, 0x45, 0x7b,
+ 0x5d, 0x6f, 0x18, 0x73, 0xec, 0x61, 0xe6, 0xc7, 0x6a, 0x1a, 0x77, 0xf8,
+ 0x5f, 0x77, 0x77, 0xec, 0x3c, 0xd0, 0xa0, 0xe6, 0x0d, 0xe0, 0xdd, 0x34,
+ 0x0b, 0xdf, 0x83, 0xe4, 0xe9, 0x3e, 0x65, 0xea, 0x56, 0xad, 0x52, 0xe8,
+ 0x74, 0x56, 0xeb, 0x89, 0xa7, 0xa4, 0x8e, 0x10, 0x4c, 0x49, 0x8a, 0x76,
+ 0x41, 0xd1, 0x71, 0xba, 0x62, 0x19, 0x0d, 0xc6, 0x09, 0x42, 0xe2, 0x9d,
+ 0xe8, 0xc1, 0x12, 0x83, 0x00, 0xb4, 0xb8, 0x29, 0xac, 0x1d, 0x41, 0xcb,
+ 0x97, 0xd8, 0xe4, 0x44, 0x05, 0xe2, 0x45, 0x79, 0x09, 0x44, 0xce, 0xdc,
+ 0x93, 0xde, 0x78, 0x76, 0xed, 0x78, 0xee, 0xb1, 0x51, 0xce, 0x0f, 0x86,
+ 0x43, 0xdd, 0x26, 0x87, 0xe1, 0x8e, 0x90, 0x18, 0x02, 0x88, 0x0a, 0x24,
+ 0xcb, 0x30, 0x62, 0xc5, 0x4b, 0x23, 0x9d, 0xe0, 0xe3, 0x2e, 0x8b, 0xb7,
+ 0xb7, 0x2c, 0xa3, 0x13, 0x10, 0x7b, 0x88, 0x1f, 0x09, 0xfb, 0x4a, 0x47,
+ 0x7c, 0xbf, 0x7a, 0x26, 0xe3, 0xe5, 0x5f, 0x31, 0xad, 0x98, 0x67, 0xe4,
+ 0xf3, 0xa9, 0xb8, 0x27, 0x67, 0xa0, 0x11, 0x40, 0xed, 0xa2, 0x82, 0xbb,
+ 0xcf, 0xc2, 0x41, 0x7f, 0xc7, 0xa3, 0xea, 0xfd, 0x43, 0x83, 0xfe, 0x2e,
+ 0x32, 0xe8, 0xe7, 0xee, 0xe0, 0xf0, 0xc7, 0x92, 0xbd, 0xbd, 0xcf, 0x14,
+ 0x56, 0xcd, 0x8e, 0x9a, 0x69, 0xe2, 0x3e, 0xe8, 0x7d, 0xd1, 0x3c, 0xd7,
+ 0x07, 0x30, 0x38, 0xfc, 0x96, 0x77, 0x78, 0xbd, 0x4f, 0xbd, 0xb0, 0x9f,
+ 0x1a, 0xa7, 0xb0, 0x46, 0x8c, 0xa6, 0xc9, 0x52, 0x26, 0x10, 0x3e, 0xb6,
+ 0x2e, 0xfb, 0x31, 0xcd, 0x81, 0xb1, 0x5b, 0x9a, 0x65, 0x60, 0x1e, 0xed,
+ 0x85, 0xf7, 0x9d, 0x97, 0xd6, 0x90, 0xde, 0xde, 0xe3, 0x3d, 0x69, 0xae,
+ 0x58, 0xad, 0xdc, 0x8a, 0x9d, 0x39, 0xc9, 0x1a, 0xb3, 0x26, 0xce, 0x07,
+ 0xc4, 0x49, 0x2b, 0x57, 0x55, 0x0a, 0xfa, 0x4a, 0x94, 0x8b, 0x1d, 0x2c,
+ 0xe1, 0x48, 0x65, 0x35, 0x3a, 0xa5, 0xde, 0x17, 0x84, 0xdb, 0x83, 0x5a,
+ 0x20, 0x8e, 0x13, 0xf2, 0xc4, 0xa1, 0x36, 0xef, 0x95, 0x75, 0xd6, 0x69,
+ 0xbd, 0xd8, 0x5e, 0x30, 0x43, 0x3c, 0x48, 0x3e, 0x32, 0xa2, 0x32, 0xc4,
+ 0xe9, 0x76, 0x76, 0x3f, 0x73, 0x4b, 0xe4, 0xd6, 0x81, 0xbc, 0x1b, 0x92,
+ 0x67, 0x3f, 0xf0, 0xa4, 0xb7, 0x95, 0x27, 0xea, 0x19, 0x16, 0x4a, 0xf4,
+ 0x60, 0x5f, 0xca, 0xab, 0xee, 0x2b, 0x2c, 0x8f, 0xcf, 0x49, 0xdc, 0x09,
+ 0x8f, 0xe1, 0x20, 0x39, 0x83, 0x27, 0xa6, 0xc5, 0xdc, 0xca, 0x18, 0xfd,
+ 0xd4, 0xe5, 0x5d, 0xb5, 0xb7, 0xee, 0x2b, 0xb7, 0xc6, 0xda, 0x25, 0x0d,
+ 0x8b, 0x6f, 0xab, 0x98, 0xb5, 0x57, 0x8a, 0xba, 0x1b, 0xb3, 0xe4, 0xe2,
+ 0xe8, 0xf2, 0x02, 0xb0, 0x1e, 0x88, 0x80, 0xee, 0x9d, 0x6b, 0x44, 0xc2,
+ 0x96, 0xe5, 0xfb, 0x13, 0x81, 0xe6, 0x94, 0x12, 0x27, 0x22, 0x98, 0x14,
+ 0xc6, 0xae, 0x38, 0xff, 0x53, 0xdf, 0x63, 0x5c, 0xba, 0x59, 0x73, 0x9e,
+ 0x72, 0x17, 0x12, 0x6b, 0xd3, 0xd5, 0xec, 0xed, 0x39, 0x7c, 0x02, 0x97,
+ 0xbf, 0xe2, 0x9b, 0xd4, 0x02, 0x4e, 0xf5, 0xea, 0x75, 0x28, 0x6d, 0xad,
+ 0x8f, 0x40, 0xcf, 0x31, 0x64, 0x33, 0x08, 0x5c, 0xda, 0x8f, 0x8b, 0x16,
+ 0x20, 0x9d, 0xb0, 0x58, 0x61, 0x7c, 0xce, 0x53, 0x37, 0x13, 0x49, 0xa2,
+ 0x49, 0x9e, 0xef, 0xec, 0x44, 0x38, 0x20, 0xd2, 0x91, 0x11, 0xab, 0xa2,
+ 0xda, 0x09, 0xde, 0x1e, 0x6f, 0xb1, 0xe7, 0x0c, 0xba, 0x66, 0x4d, 0x76,
+ 0x4b, 0xff, 0x8a, 0x6c, 0x65, 0x9a, 0x31, 0x95, 0xd3, 0xde, 0xbc, 0xb1,
+ 0x94, 0xf9, 0x1e, 0x09, 0x00, 0x3a, 0x69, 0x1d, 0xf1, 0xc2, 0xd9, 0x01,
+ 0x5a, 0x5f, 0x29, 0xf5, 0x38, 0x2e, 0xc5, 0x05, 0x1a, 0xf4, 0x2c, 0x90,
+ 0xe0, 0x7b, 0x2f, 0xc2, 0x1d, 0x31, 0xbc, 0x3c, 0xbb, 0x90, 0x1d, 0x16,
+ 0x5e, 0xce, 0x12, 0x06, 0xa7, 0x47, 0x1c, 0x5b, 0x41, 0x2f, 0x52, 0xdf,
+ 0xd9, 0xa6, 0xd8, 0x5a, 0x6a, 0x38, 0xef, 0xab, 0x2c, 0x03, 0x2e, 0x28,
+ 0x4d, 0x44, 0x86, 0xf6, 0x9d, 0xe4, 0xd4, 0x2a, 0x0d, 0xa2, 0x9e, 0x4c,
+ 0xef, 0x25, 0x3e, 0x68, 0x67, 0x7c, 0x82, 0x39, 0x05, 0x94, 0xf6, 0x91,
+ 0x24, 0x83, 0x12, 0x8d, 0xa2, 0x00, 0xe5, 0x6c, 0x25, 0x98, 0xee, 0x5e,
+ 0xe4, 0x43, 0x74, 0x66, 0x99, 0x2e, 0x55, 0xc8, 0xeb, 0xa6, 0xf1, 0x7c,
+ 0x57, 0xa8, 0x49, 0x44, 0xd2, 0x82, 0xd9, 0x20, 0x05, 0xf6, 0x90, 0x52,
+ 0x78, 0xa2, 0xbb, 0xda, 0x63, 0xa3, 0x2a, 0x4f, 0x84, 0x6e, 0x49, 0x2e,
+ 0x4f, 0xb5, 0x1d, 0x9c, 0xda, 0xed, 0x6e, 0xfe, 0xf3, 0xb3, 0x8b, 0x4b,
+ 0x7b, 0xef, 0xd3, 0x67, 0xf1, 0x83, 0xce, 0xf9, 0x21, 0x8e, 0x78, 0xae,
+ 0xfa, 0xa8, 0xb7, 0x1b, 0x2a, 0x3d, 0xad, 0x45, 0xf3, 0x78, 0x65, 0x51,
+ 0xd0, 0x8e, 0x36, 0x44, 0x46, 0x7c, 0x05, 0x24, 0x97, 0xf0, 0x5a, 0x39,
+ 0x99, 0xc3, 0xbe, 0x54, 0xba, 0x70, 0xe2, 0xd5, 0x7d, 0x9c, 0x92, 0xfb,
+ 0x6c, 0x37, 0xdc, 0x1d, 0xe4, 0x3d, 0xbb, 0x38, 0xa2, 0x4a, 0xdf, 0x97,
+ 0x37, 0xfc, 0xb7, 0xa0, 0xef, 0x9c, 0xb9, 0x27, 0x3f, 0x8c, 0x97, 0x8b,
+ 0xc7, 0xee, 0xa0, 0xf8, 0x94, 0x31, 0x3f, 0xd0, 0xbe, 0xcd, 0x13, 0xf5,
+ 0xe6, 0xec, 0x99, 0x87, 0x45, 0x82, 0xd8, 0x94, 0xbd, 0x02, 0x6c, 0x0b,
+ 0x7e, 0xb0, 0x2e, 0x5f, 0x59, 0x37, 0xca, 0x19, 0x1f, 0x89, 0x16, 0xb3,
+ 0xed, 0xb3, 0xe7, 0xae, 0x85, 0x39, 0xdd, 0x57, 0xd2, 0xc0, 0xb1, 0x16,
+ 0x53, 0xa2, 0x1f, 0xf6, 0x75, 0xbb, 0xe0, 0xca, 0xe0, 0x8d, 0xc1, 0xcf,
+ 0xb9, 0x76, 0x5e, 0xd8, 0x7c, 0x70, 0x55, 0x18, 0xbc, 0xae, 0xd0, 0x8f,
+ 0x15, 0x02, 0x02, 0x9d, 0xa3, 0xb3, 0xed, 0x9e, 0xf1, 0x6e, 0xff, 0x8a,
+ 0xb0, 0x44, 0x16, 0xd4, 0xc4, 0x63, 0xf7, 0xee, 0x56, 0x52, 0xb9, 0xf2,
+ 0x62, 0x91, 0x41, 0x53, 0x4b, 0xab, 0x29, 0xd1, 0x68, 0x1b, 0x41, 0x52,
+ 0x71, 0xa2, 0xc9, 0x7d, 0x10, 0xfc, 0x02, 0x6c, 0xc8, 0x7d, 0x43, 0x6e,
+ 0xa1, 0xe3, 0x93, 0x23, 0xb7, 0x54, 0x4c, 0xc1, 0x8d, 0x83, 0xec, 0x34,
+ 0x7e, 0x2a, 0x80, 0x68, 0xaf, 0x8a, 0x41, 0x72, 0x4e, 0x95, 0xed, 0xa0,
+ 0x39, 0xd5, 0xff, 0xee, 0x5a, 0xe3, 0x83, 0x02, 0x4f, 0xac, 0xb9, 0x3c,
+ 0x91, 0x35, 0x98, 0x17, 0x66, 0x65, 0xf1, 0x13, 0xfa, 0xab, 0x47, 0x17,
+ 0x1b, 0x0c, 0xf7, 0x95, 0x7b, 0xb9, 0x36, 0x23, 0x31, 0x76, 0x7b, 0xf7,
+ 0x91, 0xe7, 0xb2, 0xaf, 0x8c, 0x51, 0xcf, 0x55, 0x94, 0x55, 0x34, 0xd3,
+ 0x79, 0xd6, 0x32, 0xce, 0xdc, 0xc2, 0x95, 0x3e, 0xd3, 0x12, 0xe1, 0x5e,
+ 0x53, 0x7c, 0x21, 0x1c, 0x8c, 0x6c, 0xd9, 0x04, 0x82, 0x10, 0x92, 0x3a,
+ 0x67, 0xda, 0x2a, 0x48, 0xda, 0x4e, 0x2d, 0x12, 0xd7, 0x86, 0x03, 0x49,
+ 0x5a, 0xd2, 0x0b, 0x96, 0x73, 0xa5, 0x3b, 0xb9, 0x9d, 0x32, 0x7d, 0xcf,
+ 0x79, 0x27, 0xda, 0x6d, 0x63, 0xef, 0xb0, 0x56, 0xef, 0x04, 0xbb, 0x28,
+ 0xdc, 0x51, 0xe4, 0x45, 0x20, 0xbf, 0xb0, 0xb9, 0xe1, 0x7d, 0x13, 0xe0,
+ 0xf9, 0x0b, 0xd7, 0xd4, 0x15, 0x38, 0xba, 0x55, 0xb6, 0x1f, 0xb4, 0xe4,
+ 0x8f, 0x25, 0xe8, 0xce, 0xed, 0x93, 0x6c, 0x39, 0x72, 0x0a, 0x67, 0xe4,
+ 0x48, 0x79, 0xdf, 0xe0, 0xcd, 0x70, 0x59, 0x12, 0x89, 0x47, 0xf1, 0xe0,
+ 0xa0, 0xb9, 0x52, 0xda, 0x8d, 0x1d, 0x52, 0x5c, 0x03, 0x40, 0x7e, 0x23,
+ 0x1c, 0xca, 0x37, 0xe2, 0xad, 0xa1, 0xea, 0x50, 0x01, 0xf5, 0xeb, 0x62,
+ 0x26, 0x08, 0x3f, 0xef, 0x4b, 0x9f, 0x8b, 0x6b, 0x83, 0xeb, 0x68, 0x5b,
+ 0x67, 0x80, 0x2f, 0x48, 0x4b, 0x4b, 0xf8, 0x60, 0xe3, 0xe4, 0x13, 0x80,
+ 0xcf, 0x6a, 0x4b, 0x73, 0x1c, 0xe1, 0x20, 0xa3, 0xcb, 0x58, 0x54, 0x5e,
+ 0x8d, 0x75, 0x96, 0x1e, 0x81, 0x0c, 0xcd, 0xb7, 0x3c, 0xc6, 0xbf, 0x5a,
+ 0xc1, 0xc0, 0x51, 0x65, 0x7f, 0x85, 0x3a, 0x39, 0xe0, 0x0b, 0x87, 0xb3,
+ 0x6d, 0x78, 0x94, 0xc5, 0x22, 0xf5, 0x6c, 0xfa, 0xe7, 0xaf, 0xc4, 0x6f,
+ 0x25, 0x7e, 0x11, 0xad, 0x21, 0xd9, 0x0d, 0x33, 0xbd, 0xd8, 0xb5, 0x4e,
+ 0x40, 0x02, 0xd4, 0x09, 0x4a, 0xdc, 0x87, 0xd5, 0x11, 0xaf, 0xe4, 0xf0,
+ 0x9b, 0xe4, 0xfd, 0xdb, 0x17, 0x04, 0xec, 0xb8, 0xce, 0xaa, 0xb9, 0xb1,
+ 0x5a, 0x9c, 0x61, 0x7e, 0xf6, 0xad, 0xd7, 0xd8, 0x9e, 0x83, 0x09, 0x69,
+ 0xbc, 0x5f, 0x84, 0x99, 0x58, 0x0d, 0x66, 0x09, 0x29, 0x31, 0xf1, 0x5a,
+ 0x73, 0x8c, 0x95, 0x0c, 0xcb, 0x2b, 0xa6, 0x1c, 0x70, 0x2d, 0x75, 0x04,
+ 0xd8, 0x8b, 0x67, 0x4e, 0x80, 0x51, 0xb9, 0xf4, 0x32, 0xc9, 0x8a, 0x6b,
+ 0x32, 0x0e, 0x22, 0x27, 0xea, 0x05, 0x0b, 0xcd, 0x43, 0x3e, 0xf7, 0xa4,
+ 0xc8, 0x86, 0xaf, 0x41, 0x49, 0x47, 0xb8, 0xd3, 0x7b, 0xef, 0x85, 0xef,
+ 0x5b, 0x20, 0xde, 0x41, 0x40, 0x66, 0x98, 0x6d, 0x1c, 0x5a, 0x8a, 0xf7,
+ 0xec, 0x4b, 0xfb, 0x2c, 0x39, 0x92, 0xf2, 0xc2, 0xab, 0x0e, 0xb1, 0xe4,
+ 0x0d, 0x51, 0x80, 0xd5, 0x4c, 0x50, 0xd5, 0x8c, 0x75, 0x1e, 0x6f, 0xee,
+ 0xbd, 0x57, 0x5e, 0xb5, 0x5d, 0x27, 0xa0, 0x8d, 0xb6, 0x1b, 0x13, 0x83,
+ 0xca, 0xe7, 0x37, 0xfe, 0xe1, 0x7c, 0xc9, 0xb7, 0xf4, 0x79, 0x17, 0x25,
+ 0xa9, 0x32, 0x30, 0xf3, 0x33, 0xf1, 0xf5, 0xa8, 0xf3, 0xd6, 0x3f, 0x3c,
+ 0x48, 0x96, 0xa5, 0x08, 0x60, 0xaf, 0x7b, 0x1f, 0xd9, 0x95, 0x33, 0x43,
+ 0xc5, 0xcd, 0xae, 0x8b, 0xfc, 0xef, 0x9a, 0x5c, 0x4c, 0x77, 0xb3, 0x56,
+ 0xf6, 0xf0, 0x1e, 0xdf, 0x13, 0x81, 0x71, 0x97, 0x4e, 0x73, 0x11, 0x8a,
+ 0x14, 0x44, 0x73, 0x0f, 0x3c, 0x93, 0x5d, 0xcb, 0x05, 0xdd, 0x60, 0x01,
+ 0xa0, 0x20, 0x23, 0x85, 0x70, 0xb3, 0x16, 0xe8, 0xf6, 0xe5, 0x73, 0xd1,
+ 0xbb, 0x54, 0x37, 0xa6, 0x9b, 0x97, 0x26, 0x62, 0x0a, 0x66, 0xb3, 0xae,
+ 0x98, 0x7e, 0x29, 0xd7, 0x9e, 0x2c, 0xa5, 0xad, 0xee, 0x61, 0x2b, 0xa5,
+ 0xd0, 0x5f, 0xef, 0xf3, 0x42, 0x60, 0xb0, 0xc1, 0xeb, 0x2f, 0x97, 0xf8,
+ 0x23, 0xa5, 0x42, 0xf9, 0x11, 0xf6, 0x92, 0xf7, 0xfc, 0x67, 0xee, 0x24,
+ 0xb4, 0x58, 0xe1, 0x94, 0x12, 0xac, 0xe7, 0x39, 0x21, 0xec, 0x59, 0x62,
+ 0x47, 0x8a, 0x94, 0x71, 0x8e, 0x50, 0xf6, 0x5e, 0xd9, 0xcf, 0x4f, 0x4b,
+ 0x92, 0xa6, 0xde, 0xf7, 0x78, 0x4b, 0xbd, 0x03, 0x0d, 0xb8, 0x33, 0x0e,
+ 0x8a, 0x56, 0x45, 0x52, 0xf7, 0xf4, 0x2b, 0xd9, 0x1b, 0x7a, 0x5f, 0x5a,
+ 0x93, 0x75, 0xd9, 0x1b, 0x9f, 0xed, 0xf8, 0x0a, 0xeb, 0x84, 0xc2, 0x74,
+ 0x9c, 0x64, 0xbb, 0xf4, 0x05, 0xde, 0x19, 0xc7, 0x53, 0xaa, 0xef, 0x39,
+ 0xd5, 0xa2, 0x9c, 0xca, 0x08, 0xe6, 0x1e, 0xdb, 0x6b, 0x09, 0xdd, 0x4b,
+ 0x5f, 0x7d, 0x4a, 0x8e, 0xdf, 0x7a, 0x0f, 0x3e, 0x73, 0x03, 0x4c, 0xa7,
+ 0xa4, 0x0d, 0x3c, 0xb0, 0xb7, 0xaa, 0x96, 0x62, 0xa5, 0xde, 0xa3, 0xbc,
+ 0x33, 0x4e, 0x4b, 0xe6, 0xae, 0xc1, 0xf4, 0x07, 0xcf, 0xf0, 0x76, 0x38,
+ 0xbc, 0x31, 0xb7, 0xda, 0xb8, 0x01, 0x3a, 0xb0, 0xd0, 0xd0, 0x51, 0x77,
+ 0xed, 0x3f, 0x7b, 0xb9, 0xe2, 0x59, 0xb9, 0x34, 0x6b, 0x7b, 0xd5, 0x7b,
+ 0xef, 0x7d, 0x16, 0x1e, 0x73, 0x35, 0x09, 0x14, 0xc4, 0x6c, 0x8e, 0x1a,
+ 0x9d, 0xb4, 0x64, 0x93, 0xf2, 0x28, 0xff, 0x5d, 0xdd, 0x83, 0x15, 0xd1,
+ 0x72, 0xd5, 0xff, 0xee, 0xf7, 0xf7, 0x73, 0x1f, 0x09, 0xcd, 0xbe, 0xc1,
+ 0x2a, 0x43, 0xf4, 0x60, 0xdc, 0xe2, 0xe1, 0x76, 0x48, 0x11, 0xcc, 0x8e,
+ 0xd7, 0x02, 0xaf, 0xb9, 0xd1, 0x23, 0x16, 0x85, 0x93, 0x1c, 0x6c, 0x08,
+ 0x4a, 0xe2, 0xf2, 0xc4, 0xa7, 0x6f, 0x23, 0x99, 0x2f, 0x7e, 0x28, 0xcf,
+ 0x93, 0xba, 0xd3, 0x39, 0x06, 0xf5, 0xcd, 0x82, 0xcd, 0x6e, 0x3b, 0x22,
+ 0xe7, 0x66, 0xf3, 0x5e, 0xdb, 0x73, 0xd2, 0x0b, 0x7d, 0x83, 0xda, 0x78,
+ 0x68, 0x7a, 0xcb, 0x76, 0xb9, 0x25, 0x66, 0x86, 0x17, 0xfe, 0xbe, 0x2a,
+ 0xe9, 0xaf, 0x9a, 0x6e, 0xbf, 0xc9, 0x49, 0x91, 0x21, 0x48, 0x4f, 0x70,
+ 0xc5, 0xde, 0x67, 0x44, 0xb5, 0x21, 0xa8, 0x8b, 0x59, 0xa5, 0x9b, 0x6c,
+ 0x7c, 0xab, 0x47, 0x46, 0x1a, 0x71, 0x68, 0x64, 0xef, 0xad, 0xe7, 0x76,
+ 0x6a, 0x61, 0xd2, 0x5c, 0x1c, 0x75, 0xad, 0x00, 0xf7, 0x28, 0xef, 0x9a,
+ 0x8b, 0xcb, 0xe1, 0xf9, 0x3e, 0xf5, 0x99, 0xe3, 0x71, 0xe6, 0x40, 0x1c,
+ 0x0e, 0xb3, 0xbf, 0x49, 0x16, 0x4a, 0xed, 0x9e, 0x7e, 0xb9, 0xe4, 0xe9,
+ 0xa1, 0xb8, 0xf7, 0x8e, 0x27, 0x24, 0x7e, 0xcd, 0x3a, 0xf8, 0x2f, 0x7d,
+ 0x26, 0xd8, 0x3e, 0xf5, 0xf3, 0xb3, 0x17, 0x8c, 0x7a, 0x06, 0x69, 0x48,
+ 0x91, 0x77, 0xf7, 0xf0, 0xe7, 0xce, 0xa6, 0xb9, 0x59, 0x14, 0xb7, 0x56,
+ 0x5f, 0x14, 0x3a, 0x2a, 0x5d, 0x60, 0xf7, 0xc2, 0x2b, 0x3d, 0x1a, 0x9e,
+ 0x37, 0xd4, 0xe2, 0x5f, 0x7a, 0xe2, 0xa5, 0xd0, 0xf2, 0xa4, 0x1c, 0x48,
+ 0x34, 0xf2, 0x75, 0xe1, 0xcd, 0xc1, 0xab, 0x1d, 0x7b, 0xfd, 0x0a, 0xb1,
+ 0xc5, 0x6d, 0xf6, 0xe0, 0x76, 0x1d, 0xc7, 0xeb, 0x8d, 0xba, 0x98, 0x17,
+ 0xe4, 0x84, 0x70, 0x8f, 0xd8, 0x06, 0x7e, 0xf8, 0x81, 0x65, 0xbc, 0xe5,
+ 0x43, 0x92, 0x38, 0x93, 0xad, 0x79, 0x61, 0x04, 0x22, 0xab, 0x05, 0x74,
+ 0xbc, 0x10, 0x9c, 0xa9, 0xb2, 0x69, 0x46, 0x7c, 0x7a, 0x6c, 0xa3, 0x60,
+ 0x63, 0xf7, 0x03, 0x7b, 0x0f, 0x65, 0x9f, 0x38, 0x50, 0x69, 0xcb, 0xd0,
+ 0x17, 0xe4, 0x1b, 0x13, 0x47, 0x95, 0x59, 0xf1, 0x83, 0x0f, 0x97, 0xdf,
+ 0x9c, 0x5d, 0x0c, 0x93, 0x6d, 0x4a, 0x4b, 0xbd, 0xbc, 0x38, 0xfe, 0xea,
+ 0x83, 0xb1, 0xfd, 0x6d, 0x8c, 0xee, 0x6d, 0x5a, 0xe4, 0xe6, 0xe6, 0x18,
+ 0x36, 0x59, 0x61, 0xd6, 0xf1, 0x5a, 0x4b, 0x53, 0x30, 0x39, 0xa7, 0xb9,
+ 0x2b, 0xcb, 0x8a, 0xcb, 0x13, 0x81, 0x15, 0xe0, 0xa6, 0x94, 0xc5, 0x60,
+ 0xea, 0x34, 0xf2, 0x31, 0x13, 0x0a, 0xab, 0x74, 0x76, 0x6d, 0xde, 0xc9,
+ 0xaa, 0x55, 0x68, 0x45, 0x72, 0xf9, 0xcd, 0xc1, 0xe9, 0xb7, 0x43, 0xa5,
+ 0x2d, 0xff, 0xfe, 0xfb, 0xef, 0x7d, 0xc8, 0x4f, 0xbd, 0xbf, 0xbd, 0x0d,
+ 0xfd, 0xf2, 0x26, 0xfd, 0xf4, 0x69, 0x50, 0x67, 0x6b, 0x6b, 0xc3, 0xa3,
+ 0xa3, 0xe4, 0xe0, 0x64, 0x78, 0xb6, 0xe6, 0x92, 0xb1, 0x37, 0x77, 0x89,
+ 0xa4, 0xe5, 0x3a, 0x6b, 0xcc, 0x5f, 0xd6, 0xd6, 0x4e, 0x0e, 0x2e, 0xc9,
+ 0x72, 0x95, 0xaa, 0xa8, 0x34, 0xcf, 0x44, 0xac, 0x90, 0x4e, 0xef, 0x89,
+ 0x47, 0xee, 0x2a, 0x07, 0xda, 0xf9, 0x5e, 0xeb, 0xa9, 0x77, 0xc9, 0x15,
+ 0xcd, 0xcd, 0x73, 0x4f, 0x74, 0x17, 0x82, 0x59, 0x22, 0x30, 0xa6, 0x19,
+ 0x93, 0x32, 0x84, 0xad, 0x25, 0xce, 0x7b, 0xc5, 0x7c, 0xe7, 0xd9, 0x88,
+ 0x2b, 0xe2, 0xf6, 0x18, 0x7a, 0x08, 0x00, 0x9a, 0x47, 0x40, 0xb0, 0x64,
+ 0x08, 0xc7, 0xc4, 0x0b, 0x9a, 0x7c, 0x18, 0x1e, 0x7c, 0x7d, 0x44, 0xcf,
+ 0x7e, 0x9d, 0x35, 0x6e, 0x6a, 0xb9, 0xf0, 0x3b, 0x7d, 0xe5, 0x34, 0x6b,
+ 0xea, 0x71, 0x3a, 0xcf, 0x36, 0xa8, 0x4f, 0xa3, 0xbe, 0x30, 0xee, 0xbb,
+ 0xc6, 0x59, 0xad, 0x77, 0x85, 0x02, 0x0a, 0x79, 0x1e, 0x94, 0xfe, 0x7e,
+ 0xbb, 0x17, 0x47, 0x07, 0x6f, 0xdf, 0x1f, 0x69, 0x5d, 0x65, 0x66, 0xe5,
+ 0x34, 0x8d, 0xde, 0x50, 0xbd, 0x69, 0x17, 0xf9, 0xa0, 0x6b, 0x7e, 0x61,
+ 0xda, 0x30, 0xbf, 0xa1, 0xda, 0xcf, 0xf1, 0xcf, 0xb9, 0xfa, 0x01, 0x78,
+ 0x76, 0x70, 0x95, 0x6f, 0x73, 0xeb, 0xfa, 0xbd, 0xd4, 0xce, 0x89, 0x30,
+ 0x8d, 0xa8, 0xe6, 0xcb, 0xae, 0x09, 0xf8, 0x34, 0x3e, 0xdf, 0xd9, 0xd9,
+ 0x59, 0x31, 0x0e, 0x98, 0x06, 0x72, 0x81, 0x9a, 0xa1, 0xec, 0xd3, 0xe3,
+ 0xdb, 0xae, 0x7d, 0xd7, 0x63, 0xda, 0x6f, 0x58, 0xb7, 0x2b, 0xb2, 0xac,
+ 0x71, 0xed, 0xe6, 0x4d, 0x16, 0xef, 0xf2, 0xb8, 0x2c, 0xed, 0x0a, 0xb4,
+ 0x26, 0x07, 0x15, 0x6f, 0xf3, 0x46, 0x29, 0xd7, 0xf0, 0x06, 0x77, 0xdc,
+ 0x98, 0x32, 0xa0, 0x99, 0xaa, 0x1e, 0xba, 0x4d, 0xd2, 0x6f, 0x00, 0x4c,
+ 0x19, 0x37, 0x83, 0xb2, 0xba, 0xde, 0x9e, 0xed, 0x43, 0x3b, 0x31, 0x0f,
+ 0xbd, 0x23, 0x98, 0x6b, 0x62, 0xb4, 0x5c, 0xcb, 0x20, 0x51, 0xd3, 0xc4,
+ 0x96, 0xe6, 0x5a, 0x7a, 0x42, 0xbf, 0x7e, 0xc1, 0x2c, 0x30, 0xfb, 0xcf,
+ 0x95, 0x8e, 0x5c, 0xeb, 0xe9, 0x45, 0x3e, 0x42, 0xfb, 0x0f, 0x8e, 0xc3,
+ 0x81, 0x91, 0x05, 0xe6, 0x2b, 0xc4, 0x43, 0x85, 0x2d, 0x62, 0xfe, 0x5a,
+ 0x99, 0x2d, 0x33, 0x68, 0x3e, 0x41, 0x84, 0x4a, 0x99, 0x4f, 0x4e, 0x19,
+ 0xa4, 0xc8, 0xfc, 0x9c, 0xaa, 0x89, 0x57, 0xc4, 0x0c, 0xcb, 0x5f, 0x30,
+ 0x07, 0x48, 0x4b, 0x4d, 0x5b, 0x3c, 0x1f, 0x35, 0xdc, 0xfd, 0x66, 0xbf,
+ 0x8f, 0xfd, 0x53, 0xdb, 0xdd, 0xf2, 0x84, 0x8f, 0x7b, 0x83, 0xe2, 0xd9,
+ 0x2f, 0xe4, 0xc6, 0xf5, 0xf6, 0xce, 0xd0, 0xf4, 0x22, 0xf8, 0xd6, 0xc2,
+ 0x15, 0x2a, 0xad, 0xf9, 0x73, 0x7e, 0x61, 0x0b, 0xb3, 0x1a, 0xdb, 0x80,
+ 0x7a, 0x3e, 0xf9, 0x1b, 0x87, 0xe7, 0xf2, 0x37, 0xc2, 0xc4, 0xe5, 0x77,
+ 0x34, 0x78, 0x92, 0xd6, 0xe6, 0xde, 0x25, 0x71, 0xae, 0xea, 0x2a, 0x20,
+ 0x76, 0xb0, 0x3c, 0x51, 0xb5, 0xc6, 0x37, 0x1d, 0x56, 0xf4, 0x70, 0xdf,
+ 0x4c, 0x0d, 0xdd, 0x0e, 0xff, 0x7b, 0x7b, 0x50, 0xd7, 0x37, 0xdb, 0xf9,
+ 0xe4, 0x63, 0x55, 0xa7, 0xc9, 0x4f, 0x6b, 0x9d, 0x8c, 0xca, 0xee, 0x20,
+ 0xfe, 0x37, 0x66, 0xf0, 0x17, 0xcd, 0xd4, 0xf2, 0x51, 0xfc, 0x1e, 0x23,
+ 0xe8, 0xf7, 0xa9, 0x55, 0xfd, 0xd2, 0x47, 0xf3, 0xc0, 0x47, 0x4b, 0xf5,
+ 0xfb, 0x2b, 0x46, 0x17, 0x11, 0x85, 0x66, 0x90, 0xcc, 0x00, 0x69, 0x64,
+ 0x4b, 0x7c, 0xa3, 0x6b, 0xb1, 0x8a, 0x1f, 0xf7, 0x76, 0x76, 0x76, 0xf7,
+ 0x77, 0x3f, 0x7f, 0xb5, 0xb3, 0xbf, 0xbb, 0xbb, 0xbb, 0xb7, 0xbf, 0xbb,
+ 0xbf, 0xbf, 0xb7, 0xf3, 0xf3, 0xf6, 0xfa, 0xb2, 0xa9, 0x7b, 0xff, 0xd5,
+ 0x92, 0x06, 0xcd, 0xa8, 0xd7, 0x99, 0x5e, 0xee, 0x27, 0x3b, 0x7a, 0x8c,
+ 0x6a, 0xb2, 0x9e, 0xd4, 0xb3, 0x11, 0xe1, 0xba, 0xf8, 0x70, 0xfa, 0x83,
+ 0xa9, 0x8d, 0x52, 0x9c, 0x79, 0x03, 0x7a, 0x7b, 0xf6, 0xfd, 0xe9, 0xc9,
+ 0xd9, 0xc1, 0xdb, 0xe4, 0xf2, 0x2c, 0x39, 0x80, 0x0b, 0x2f, 0x22, 0x27,
+ 0x41, 0x11, 0x49, 0xc8, 0x68, 0x2e, 0xe3, 0xe1, 0x95, 0xb3, 0x12, 0x7f,
+ 0x93, 0x85, 0x30, 0xa2, 0x13, 0xdd, 0x7e, 0x96, 0x30, 0xd1, 0xa8, 0xa5,
+ 0xc1, 0x4d, 0x33, 0x7b, 0xfc, 0x46, 0x78, 0xca, 0x97, 0x7b, 0x0c, 0xb1,
+ 0x70, 0x56, 0x38, 0xba, 0xa3, 0x27, 0x5f, 0x8a, 0xd1, 0x4b, 0x5c, 0x4a,
+ 0xe0, 0x09, 0xb6, 0x74, 0xfa, 0x26, 0x03, 0x30, 0x5d, 0x09, 0x26, 0xae,
+ 0xee, 0xd5, 0x01, 0x7d, 0xd9, 0x3a, 0x39, 0x82, 0x7f, 0x81, 0xba, 0x43,
+ 0xfa, 0xe5, 0x56, 0x30, 0xc0, 0xb3, 0xa5, 0x43, 0x32, 0x97, 0x79, 0xf6,
+ 0x09, 0xa3, 0x6e, 0xcb, 0x5e, 0xe6, 0x1f, 0x74, 0xa3, 0x03, 0xcb, 0x92,
+ 0xfa, 0x15, 0xf2, 0x4a, 0xbb, 0x0c, 0xa4, 0x66, 0xe4, 0x73, 0xf4, 0x1d,
+ 0x15, 0xc9, 0xee, 0x13, 0xf4, 0x1b, 0xff, 0x1e, 0xdf, 0xb6, 0x59, 0xa7,
+ 0xdc, 0x81, 0x0f, 0xc3, 0xe3, 0xd3, 0xaf, 0x11, 0xe1, 0xfe, 0xfe, 0xec,
+ 0xe2, 0xed, 0xd0, 0x34, 0x6b, 0xe4, 0x15, 0x1a, 0xbf, 0x2c, 0x49, 0x12,
+ 0x4a, 0xaf, 0xf8, 0x5c, 0xd2, 0xa7, 0xff, 0xc4, 0xdb, 0xa9, 0xe7, 0xb3,
+ 0xcb, 0xcf, 0x7c, 0xdb, 0x85, 0x4a, 0x08, 0xc5, 0x6f, 0x0d, 0x6f, 0x37,
+ 0x7e, 0x39, 0x4b, 0xc7, 0x37, 0x64, 0x6c, 0xf3, 0x66, 0x05, 0x64, 0x76,
+ 0x9b, 0x72, 0x3a, 0xb6, 0xc9, 0x86, 0xda, 0x6e, 0x4a, 0x6c, 0x47, 0xb4,
+ 0x52, 0x56, 0x3e, 0x1f, 0xba, 0xe7, 0x69, 0x31, 0x7b, 0xfd, 0x6a, 0x9a,
+ 0x5e, 0xe3, 0x83, 0xe1, 0x31, 0xf0, 0x3e, 0x26, 0x9f, 0x7f, 0xea, 0x27,
+ 0xe9, 0xda, 0x40, 0x7b, 0xc7, 0xd8, 0x00, 0xc8, 0xc3, 0x41, 0x5d, 0x24,
+ 0x09, 0x20, 0xb1, 0x02, 0x89, 0x22, 0x6d, 0x04, 0xd5, 0x22, 0xa6, 0xe1,
+ 0x6e, 0x81, 0x1b, 0x94, 0x21, 0x65, 0xb6, 0x6d, 0xa3, 0x63, 0x3b, 0x34,
+ 0xaf, 0x14, 0x18, 0x41, 0x4b, 0x9e, 0x3f, 0xa7, 0x76, 0xf0, 0x62, 0x57,
+ 0x8a, 0x97, 0xa7, 0x9c, 0x3a, 0x43, 0x20, 0x46, 0x86, 0xc7, 0x13, 0x8e,
+ 0x51, 0x34, 0xda, 0x75, 0x22, 0xb1, 0x27, 0x20, 0xd2, 0x3a, 0xae, 0x38,
+ 0x38, 0xc0, 0x94, 0x1c, 0xcc, 0x65, 0x54, 0xd7, 0x8d, 0xe9, 0x4a, 0x4a,
+ 0xe5, 0x10, 0x18, 0x86, 0x20, 0x7c, 0x1b, 0xb6, 0x86, 0xfd, 0xba, 0xc2,
+ 0x99, 0xb8, 0x95, 0xbc, 0x66, 0xd6, 0x12, 0x5b, 0x52, 0x8a, 0x2e, 0x2f,
+ 0xfa, 0x3a, 0xfb, 0x30, 0x31, 0xeb, 0xf6, 0x9e, 0x74, 0x5e, 0x48, 0xba,
+ 0xe3, 0x8c, 0x3e, 0x6e, 0x04, 0x38, 0xef, 0x1c, 0x8d, 0x7d, 0xbb, 0xd2,
+ 0xa0, 0xad, 0x69, 0x53, 0x7a, 0x5c, 0x6e, 0x8e, 0x24, 0xb3, 0xf3, 0xa8,
+ 0xda, 0x19, 0x5c, 0x03, 0xa4, 0xcc, 0xde, 0x02, 0x16, 0x27, 0xed, 0x8a,
+ 0x9c, 0xa5, 0xae, 0x36, 0x84, 0x37, 0x6d, 0x0c, 0xa2, 0x74, 0xef, 0x99,
+ 0x35, 0xa2, 0xa6, 0xf2, 0xa6, 0xce, 0xa6, 0x57, 0x64, 0x0a, 0xd9, 0x2b,
+ 0x84, 0x4b, 0x1a, 0xbb, 0x22, 0x19, 0xc2, 0x03, 0xbe, 0x28, 0x8c, 0xa5,
+ 0x92, 0x0a, 0x3e, 0x87, 0x65, 0xc9, 0x35, 0xc4, 0xba, 0xab, 0xa3, 0xde,
+ 0x96, 0x21, 0x1c, 0xdb, 0xfc, 0x33, 0x03, 0xf0, 0x6c, 0x73, 0x2d, 0xd1,
+ 0xe1, 0x65, 0x0b, 0xf0, 0xad, 0xa3, 0x73, 0x47, 0xb3, 0xf5, 0x30, 0x27,
+ 0x3a, 0x1f, 0x02, 0x6b, 0x78, 0x65, 0x03, 0x95, 0x5f, 0x17, 0x44, 0xd7,
+ 0xd9, 0x27, 0x62, 0x9b, 0x95, 0xb1, 0x39, 0x7b, 0xcd, 0x6a, 0xf5, 0x32,
+ 0x5e, 0x6a, 0x0d, 0x3f, 0x87, 0x2c, 0xa4, 0xd9, 0x26, 0x22, 0x2a, 0xb2,
+ 0xb9, 0x04, 0x51, 0xcf, 0x6a, 0xa0, 0x5a, 0x79, 0xb6, 0x56, 0x25, 0x69,
+ 0x4c, 0xe6, 0x16, 0x66, 0x22, 0x68, 0x5b, 0xf3, 0x19, 0x31, 0xd4, 0x94,
+ 0x6d, 0x41, 0x28, 0xc1, 0xde, 0x87, 0x91, 0xbb, 0x43, 0xe7, 0xa2, 0x05,
+ 0xc1, 0x6d, 0x8d, 0x72, 0x31, 0x72, 0x0b, 0x4b, 0x7b, 0x04, 0xe0, 0x55,
+ 0x6a, 0xf2, 0x30, 0xac, 0xa6, 0xa6, 0xb5, 0x06, 0xbc, 0xd9, 0x13, 0x56,
+ 0x10, 0x23, 0x50, 0x90, 0xbb, 0xb4, 0xa8, 0xed, 0xce, 0x31, 0xb3, 0x75,
+ 0x2b, 0x17, 0xe2, 0x1a, 0x50, 0xec, 0xa1, 0xb8, 0x11, 0xc9, 0xbb, 0x5c,
+ 0xde, 0x3c, 0x2e, 0x6a, 0xc2, 0x2e, 0xa9, 0xe9, 0x37, 0x7d, 0x60, 0x69,
+ 0x90, 0x17, 0xab, 0x85, 0x8e, 0x74, 0xe2, 0x49, 0x1f, 0xc6, 0x58, 0x41,
+ 0x39, 0x5d, 0x73, 0x84, 0xc4, 0xa1, 0x4a, 0x19, 0x90, 0x01, 0xa2, 0x86,
+ 0x0e, 0xeb, 0xaa, 0xfa, 0x17, 0xed, 0x3c, 0xe2, 0xc0, 0x33, 0x90, 0x64,
+ 0x3f, 0xf9, 0x2a, 0xad, 0xf3, 0x71, 0x4f, 0x8a, 0x22, 0x48, 0x91, 0x04,
+ 0xd4, 0xd9, 0xd6, 0xc2, 0x09, 0xc9, 0x26, 0xf3, 0xed, 0x6e, 0x0d, 0x92,
+ 0xef, 0xb5, 0xca, 0x85, 0x31, 0x22, 0x99, 0xbc, 0x3f, 0x1f, 0x03, 0xc7,
+ 0x6d, 0xd1, 0x20, 0x34, 0x1f, 0xb2, 0x3f, 0xc5, 0xcf, 0x0e, 0x96, 0x6c,
+ 0x7c, 0xc4, 0x71, 0x00, 0x62, 0x55, 0xd3, 0xfa, 0xd6, 0x06, 0xb5, 0xb0,
+ 0x56, 0x22, 0x8a, 0x90, 0x35, 0xc7, 0xba, 0x34, 0x1b, 0xf9, 0x02, 0x7d,
+ 0x41, 0xc8, 0xab, 0xd0, 0xe0, 0x8b, 0x87, 0x8d, 0x62, 0x47, 0x6a, 0x6d,
+ 0x21, 0x53, 0xb6, 0x0a, 0x18, 0x76, 0xa6, 0x15, 0x51, 0xfd, 0xbe, 0x99,
+ 0x30, 0x9a, 0x1a, 0x11, 0xa0, 0x67, 0x97, 0x47, 0xff, 0x92, 0x1c, 0x74,
+ 0x63, 0xe0, 0x74, 0x33, 0xa9, 0x18, 0x96, 0x92, 0xb1, 0x76, 0x83, 0xa1,
+ 0xef, 0x0c, 0x31, 0x65, 0x56, 0xcc, 0x14, 0xcb, 0xbf, 0x26, 0x19, 0xb2,
+ 0xce, 0xdb, 0x5b, 0x97, 0x92, 0x21, 0x81, 0x92, 0x7a, 0xb6, 0xf6, 0x1a,
+ 0xa2, 0x03, 0xf7, 0xae, 0x0a, 0x09, 0x93, 0xba, 0xe7, 0x29, 0x67, 0xa8,
+ 0x7c, 0x32, 0x07, 0x5b, 0x53, 0x14, 0x68, 0x9a, 0xaf, 0x6f, 0xb4, 0xa0,
+ 0x20, 0x81, 0xb0, 0x09, 0x8e, 0x4c, 0xa6, 0x16, 0x53, 0x2b, 0x73, 0xf1,
+ 0x2b, 0xaf, 0xa0, 0x89, 0x6d, 0x81, 0x76, 0xff, 0x47, 0x3a, 0x72, 0x1f,
+ 0xf5, 0x62, 0x91, 0x2b, 0x90, 0xfb, 0x72, 0xc5, 0x76, 0x50, 0x7b, 0xcb,
+ 0xea, 0xb1, 0xe3, 0xdb, 0xec, 0x5c, 0xe1, 0xa5, 0x58, 0x08, 0xba, 0x02,
+ 0x00, 0xff, 0x40, 0xf0, 0x1b, 0x77, 0xaa, 0x4a, 0x4d, 0xff, 0x62, 0x02,
+ 0xed, 0x24, 0xdd, 0x11, 0x5c, 0x30, 0x59, 0x48, 0x27, 0x19, 0xcc, 0x6f,
+ 0x5a, 0x6d, 0xa7, 0xdc, 0x80, 0xa8, 0x16, 0xb3, 0x4a, 0xbd, 0x18, 0x9e,
+ 0x1d, 0x7e, 0x3b, 0x6c, 0xa5, 0xfc, 0x98, 0xd6, 0xf0, 0x21, 0x2d, 0x1d,
+ 0xd4, 0xd9, 0xd0, 0x46, 0x1a, 0x1e, 0x37, 0x1d, 0xf1, 0x64, 0xe9, 0x1c,
+ 0x3d, 0xec, 0x31, 0x5d, 0x36, 0xad, 0x66, 0xa9, 0xc2, 0xc6, 0x38, 0xf3,
+ 0xd8, 0x68, 0x8b, 0x72, 0xcd, 0xbb, 0xf9, 0x78, 0xff, 0x94, 0xb5, 0xca,
+ 0x44, 0x66, 0x2b, 0xe5, 0xba, 0x06, 0xa3, 0x8c, 0xc9, 0x86, 0x88, 0x49,
+ 0x10, 0xab, 0x48, 0xfd, 0xc3, 0x09, 0xe4, 0x9d, 0x39, 0xc3, 0xe6, 0x5e,
+ 0x73, 0xbb, 0x9b, 0xee, 0xa0, 0x65, 0xe3, 0xcc, 0xb9, 0x38, 0xa3, 0x75,
+ 0x7d, 0xbb, 0x72, 0x8d, 0x85, 0x54, 0x0f, 0x21, 0xdd, 0x4a, 0x7b, 0x4d,
+ 0xab, 0x03, 0xcd, 0xb6, 0xb0, 0x7a, 0x96, 0x2e, 0xba, 0x08, 0x3f, 0x1e,
+ 0x24, 0xc9, 0x94, 0x49, 0x32, 0x7b, 0x90, 0x1c, 0x16, 0xd1, 0x0d, 0x88,
+ 0x9b, 0x03, 0x5e, 0x89, 0xcf, 0x3f, 0x0f, 0x74, 0xc1, 0x4f, 0xf6, 0xe9,
+ 0x7d, 0xf3, 0x6b, 0xcf, 0xfb, 0x31, 0x25, 0xbc, 0x08, 0x79, 0x1b, 0xa0,
+ 0x87, 0x5a, 0x17, 0x48, 0xc4, 0xc2, 0xf0, 0x2a, 0x73, 0xf1, 0x17, 0x6d,
+ 0x88, 0x25, 0xd8, 0x65, 0x3d, 0x27, 0xf7, 0xd7, 0xd8, 0xbc, 0xe6, 0x8e,
+ 0xa6, 0x35, 0xe3, 0x8e, 0x96, 0x18, 0x66, 0x2a, 0x26, 0xbb, 0xbd, 0xf5,
+ 0xb4, 0x66, 0xa3, 0xb9, 0x0f, 0xe8, 0x52, 0x25, 0x23, 0x60, 0x58, 0x4a,
+ 0xc3, 0x34, 0xc9, 0xd2, 0x19, 0xbb, 0x3b, 0x3a, 0xfb, 0xc8, 0x96, 0xc4,
+ 0x72, 0x32, 0xe2, 0xc3, 0xf2, 0xee, 0x7c, 0xf8, 0x35, 0xdd, 0x39, 0x48,
+ 0x56, 0xa6, 0x5a, 0x61, 0x82, 0x58, 0xe2, 0xd7, 0x4a, 0xc4, 0x5c, 0x62,
+ 0x57, 0xab, 0xde, 0xc3, 0x73, 0x84, 0x9a, 0x34, 0xa3, 0x36, 0x49, 0x6b,
+ 0xe8, 0x98, 0x28, 0x4a, 0x7e, 0x1a, 0x46, 0x0d, 0xb5, 0xdf, 0xd3, 0xae,
+ 0x3c, 0xb5, 0xbb, 0xc7, 0x57, 0xde, 0x47, 0x5b, 0x9a, 0x09, 0x36, 0xbc,
+ 0xe4, 0x47, 0xed, 0x0e, 0x76, 0x7c, 0xfd, 0xca, 0x26, 0x35, 0x56, 0x48,
+ 0xa2, 0xa2, 0x29, 0x5e, 0xf3, 0x54, 0x14, 0x1a, 0x09, 0x40, 0x93, 0x9d,
+ 0xd7, 0xe4, 0x67, 0xbb, 0xcc, 0x6e, 0x60, 0x4e, 0x92, 0xb0, 0x07, 0x52,
+ 0x92, 0x6b, 0x36, 0x9b, 0x73, 0xf2, 0x57, 0xa4, 0xa4, 0x2a, 0xce, 0xd1,
+ 0x73, 0x77, 0xa4, 0x5e, 0xd8, 0xe5, 0x96, 0x3e, 0x72, 0xae, 0x88, 0x14,
+ 0x21, 0xe3, 0x74, 0x0d, 0x28, 0x9f, 0x59, 0xc6, 0x2d, 0x35, 0x4b, 0x13,
+ 0x55, 0x0f, 0xdb, 0x0c, 0xf0, 0xb4, 0x9f, 0x71, 0xd9, 0xda, 0xea, 0x98,
+ 0xc2, 0xfa, 0x2d, 0x28, 0x63, 0x6a, 0x95, 0xf0, 0xd8, 0x11, 0x49, 0x03,
+ 0x06, 0x89, 0x0c, 0x25, 0xc5, 0xe8, 0x5c, 0xb3, 0xa3, 0x9b, 0xb6, 0x96,
+ 0x72, 0xe5, 0xba, 0x30, 0x9a, 0x55, 0xcf, 0x4c, 0xbb, 0xd3, 0xdc, 0x74,
+ 0x68, 0x03, 0x74, 0x3a, 0x5a, 0x2d, 0x49, 0x64, 0xa1, 0x6e, 0x61, 0x4b,
+ 0x6c, 0xd1, 0x2e, 0x45, 0x14, 0xf2, 0x69, 0x76, 0x85, 0x2e, 0x5f, 0x03,
+ 0xbd, 0xa4, 0xff, 0x3f, 0x64, 0x66, 0x48, 0x3d, 0x27, 0x08, 0x18, 0x98,
+ 0x8f, 0xe6, 0x1e, 0xfb, 0x85, 0xa0, 0x4e, 0x21, 0xf0, 0x09, 0xdf, 0xa9,
+ 0xe3, 0xb0, 0x84, 0xf8, 0x9a, 0xeb, 0x07, 0xf9, 0xa7, 0x63, 0xcf, 0xb3,
+ 0x6e, 0x85, 0x28, 0x11, 0x15, 0xdc, 0xdc, 0x9a, 0xab, 0xa3, 0x0a, 0xc8,
+ 0x5f, 0xd0, 0x61, 0x7b, 0x91, 0x7d, 0x45, 0x14, 0xc7, 0x87, 0x65, 0xea,
+ 0x4f, 0xab, 0xda, 0x72, 0x6b, 0xda, 0x53, 0xde, 0xfc, 0xd6, 0x95, 0xc1,
+ 0xc4, 0xf3, 0x7d, 0xf3, 0x42, 0xff, 0x83, 0xb8, 0x33, 0xbe, 0xe4, 0x2f,
+ 0x0c, 0x48, 0x9e, 0xc9, 0x17, 0xce, 0xa9, 0x2d, 0xfb, 0xc0, 0xbe, 0xbc,
+ 0x44, 0x6c, 0xf5, 0xeb, 0xe2, 0xc9, 0x69, 0xcf, 0x0a, 0x3f, 0xaf, 0x6c,
+ 0xf6, 0x9d, 0x9a, 0xb6, 0x38, 0x64, 0xfc, 0x57, 0x7e, 0x57, 0x8c, 0xc7,
+ 0x07, 0x6a, 0x62, 0xc0, 0xd9, 0x14, 0xe2, 0x7b, 0xd9, 0xdb, 0xdd, 0xe6,
+ 0xce, 0x68, 0x29, 0x5a, 0xe8, 0x75, 0xb2, 0x25, 0x1d, 0x9e, 0x03, 0x07,
+ 0x01, 0x65, 0xa3, 0xdc, 0xc0, 0x29, 0xf7, 0x83, 0x70, 0x38, 0x33, 0x01,
+ 0x44, 0x23, 0x50, 0x46, 0x57, 0x93, 0xb9, 0x6b, 0x99, 0xa0, 0xb0, 0x94,
+ 0xf5, 0x59, 0x73, 0x0b, 0xd4, 0xb3, 0x2a, 0xdf, 0x06, 0x15, 0x75, 0xf7,
+ 0xad, 0xa6, 0x8c, 0x22, 0x2a, 0x29, 0x8a, 0xc6, 0xde, 0xdb, 0x5c, 0xd8,
+ 0xbc, 0x56, 0xd4, 0x83, 0xd9, 0xd1, 0x17, 0x07, 0xa7, 0x5f, 0x1f, 0x41,
+ 0x13, 0x80, 0x6c, 0xa7, 0x03, 0x9a, 0xd3, 0x6e, 0x9f, 0x2c, 0xc6, 0x30,
+ 0x85, 0xcc, 0x8c, 0x01, 0xc2, 0x56, 0x0f, 0x24, 0x55, 0x9a, 0x13, 0x53,
+ 0x52, 0xd9, 0xbc, 0x58, 0x6e, 0x01, 0xa6, 0xad, 0x25, 0xea, 0x51, 0x85,
+ 0x06, 0x01, 0x18, 0x73, 0xc5, 0xee, 0xd7, 0x7a, 0x31, 0x9a, 0xa3, 0x14,
+ 0x0b, 0xec, 0x33, 0x27, 0x66, 0xd4, 0xcf, 0x32, 0x68, 0x9f, 0xc5, 0x35,
+ 0x4d, 0x5b, 0xb2, 0x36, 0x7d, 0x05, 0x9b, 0x7e, 0xe0, 0x7b, 0xd5, 0x98,
+ 0x17, 0x63, 0x77, 0x67, 0xc7, 0x51, 0x96, 0xa5, 0xb6, 0xc1, 0x40, 0x5a,
+ 0x56, 0xc9, 0x4e, 0xff, 0xd5, 0xab, 0x65, 0x82, 0xd0, 0x36, 0x0a, 0x2a,
+ 0x84, 0x17, 0x4f, 0x6e, 0xb3, 0x4f, 0x8f, 0x2e, 0x6b, 0x33, 0x62, 0xd1,
+ 0xa0, 0xc4, 0x9c, 0x80, 0x02, 0x6b, 0xab, 0xb5, 0x88, 0x87, 0x87, 0xa3,
+ 0x35, 0x88, 0x83, 0xd9, 0xd2, 0x64, 0x98, 0xca, 0xb5, 0xc4, 0xda, 0x1f,
+ 0xa0, 0x0e, 0x51, 0x67, 0xd0, 0x9c, 0x70, 0x81, 0xb9, 0x0d, 0xc7, 0x3e,
+ 0x69, 0x62, 0x3c, 0x03, 0x7e, 0xc9, 0x14, 0x5d, 0x85, 0xa3, 0x51, 0x95,
+ 0xe0, 0xc3, 0x39, 0xf9, 0xff, 0x8e, 0x4f, 0xbf, 0x66, 0x77, 0x88, 0xb1,
+ 0xed, 0xe1, 0x4b, 0xdf, 0xee, 0x58, 0xfa, 0x1f, 0xa4, 0x5a, 0x36, 0x15,
+ 0x88, 0x22, 0x1c, 0x06, 0xd3, 0xd5, 0xe7, 0x85, 0x94, 0xa8, 0xb6, 0xab,
+ 0xbf, 0xc4, 0x57, 0x79, 0x99, 0xf4, 0x3d, 0xe5, 0x44, 0x88, 0xc7, 0x48,
+ 0x33, 0x99, 0x3d, 0xa8, 0x65, 0x24, 0x5f, 0x40, 0xeb, 0x1a, 0x99, 0xb1,
+ 0xcd, 0xb2, 0x9d, 0xcb, 0xe6, 0x39, 0x76, 0x50, 0xa0, 0x9b, 0x44, 0x3e,
+ 0xc9, 0x9f, 0xc1, 0xf9, 0xee, 0x68, 0x22, 0x4f, 0xeb, 0x4a, 0xcb, 0xd5,
+ 0xd9, 0x66, 0x3d, 0x26, 0xcd, 0xaa, 0xa7, 0xbe, 0x9f, 0xae, 0x1b, 0x92,
+ 0xeb, 0xc9, 0xf9, 0x52, 0x9d, 0x56, 0x1b, 0x6c, 0xea, 0x65, 0xf9, 0x8f,
+ 0xf7, 0x73, 0x45, 0x0f, 0xe9, 0xa0, 0xd2, 0x4d, 0x55, 0x4c, 0x9c, 0x4f,
+ 0x43, 0x7a, 0x1c, 0x0d, 0x84, 0x5c, 0xf2, 0xfb, 0xfc, 0xe9, 0x34, 0xfe,
+ 0x39, 0x7e, 0x5f, 0xa7, 0x26, 0x72, 0x00, 0x48, 0xa5, 0x15, 0x62, 0x3a,
+ 0x9b, 0x42, 0xae, 0xb6, 0x0c, 0x69, 0xe1, 0x90, 0x1c, 0x79, 0x5b, 0x2d,
+ 0x59, 0x4b, 0x84, 0xab, 0x02, 0xb4, 0x75, 0xb4, 0x87, 0xc0, 0x8f, 0x82,
+ 0xcb, 0xeb, 0x16, 0x18, 0x4f, 0xf3, 0xfc, 0xa2, 0x28, 0x32, 0x32, 0x52,
+ 0x51, 0x55, 0x32, 0x67, 0x7b, 0xa1, 0x67, 0x4f, 0x51, 0xb5, 0x90, 0x9a,
+ 0xce, 0x00, 0x1a, 0x98, 0xce, 0xa7, 0xf5, 0x0d, 0xaa, 0x98, 0x59, 0x57,
+ 0x54, 0xa8, 0x5e, 0xe1, 0xf3, 0xdc, 0x2e, 0xe9, 0x53, 0xac, 0x4c, 0x41,
+ 0xb9, 0x6e, 0x4d, 0x45, 0x7b, 0x06, 0xd6, 0xd6, 0xc8, 0x09, 0xbf, 0x4d,
+ 0xae, 0xf8, 0x61, 0x38, 0x81, 0xea, 0x4b, 0x5f, 0xe9, 0x8f, 0x77, 0x31,
+ 0x86, 0x47, 0x3c, 0xf3, 0x9e, 0xf7, 0xe4, 0xa9, 0x27, 0x8e, 0xf5, 0xf7,
+ 0x48, 0x5c, 0x11, 0x87, 0xce, 0x13, 0x64, 0xd1, 0xad, 0xde, 0xf6, 0xa6,
+ 0xf9, 0xb6, 0x00, 0x9c, 0x3e, 0xb0, 0xcc, 0x50, 0x33, 0xa3, 0xb3, 0x5c,
+ 0x9c, 0x42, 0x76, 0xfe, 0xe1, 0x52, 0xa8, 0xa4, 0x54, 0xbc, 0xfb, 0xb5,
+ 0x84, 0xfc, 0xa2, 0xa1, 0x90, 0x66, 0xa4, 0x5b, 0xb0, 0xf9, 0x8b, 0x58,
+ 0x37, 0x67, 0x45, 0xe2, 0x9b, 0x18, 0x21, 0x77, 0xb0, 0x67, 0x33, 0x60,
+ 0xce, 0xcf, 0x86, 0x97, 0xe4, 0x46, 0xc0, 0xd5, 0xa7, 0xf6, 0xe8, 0x77,
+ 0x47, 0x17, 0x5f, 0x9d, 0x0d, 0x8f, 0xcc, 0x7a, 0xbc, 0x3d, 0xfa, 0xea,
+ 0x03, 0x49, 0x2d, 0xda, 0x1d, 0xec, 0x7a, 0xa6, 0xec, 0x18, 0xf1, 0x7f,
+ 0x51, 0x5d, 0x57, 0xa4, 0xc8, 0x61, 0x9b, 0xb2, 0x1e, 0xa4, 0xf5, 0x3c,
+ 0xad, 0x8a, 0xc7, 0x75, 0x49, 0xa7, 0x19, 0xfb, 0x2a, 0x73, 0xe4, 0x12,
+ 0x30, 0x85, 0x8f, 0xe4, 0x21, 0xa1, 0x92, 0x21, 0xcc, 0x4b, 0x39, 0x4a,
+ 0x4c, 0xa3, 0x5d, 0xef, 0x3b, 0xa7, 0xe6, 0x1d, 0x7b, 0xa6, 0xe5, 0xf0,
+ 0xb9, 0xda, 0x8b, 0xe0, 0x13, 0xc2, 0xe6, 0x3d, 0xb4, 0x7a, 0xb4, 0x30,
+ 0xea, 0x4c, 0x4b, 0xbe, 0x35, 0x51, 0x2e, 0x90, 0xda, 0xc6, 0x3d, 0x9e,
+ 0x37, 0xb8, 0xc2, 0xd9, 0xa0, 0x90, 0xd2, 0x85, 0x35, 0x6f, 0x6e, 0xae,
+ 0xd3, 0x4a, 0x30, 0xb2, 0xcc, 0x2b, 0x5b, 0x59, 0x67, 0x5c, 0xc6, 0x80,
+ 0x6f, 0x6d, 0x89, 0x87, 0x33, 0x66, 0x57, 0x68, 0xbc, 0x36, 0xc5, 0x08,
+ 0xbe, 0xc7, 0x38, 0x85, 0xa2, 0x9c, 0x6b, 0xff, 0x59, 0x3e, 0x5b, 0x9a,
+ 0x79, 0xbf, 0x0e, 0x0b, 0x6f, 0x9d, 0xbb, 0xe5, 0xa2, 0xe7, 0x92, 0x47,
+ 0x4a, 0x7e, 0x0e, 0x56, 0x04, 0x24, 0x2d, 0x09, 0xfd, 0xee, 0x54, 0x34,
+ 0x71, 0x0a, 0x0a, 0x9f, 0x5d, 0x4a, 0x0b, 0xf0, 0x4c, 0xc8, 0xe5, 0xc5,
+ 0x02, 0x55, 0x9b, 0x95, 0x00, 0x93, 0x4b, 0x0a, 0x62, 0xe1, 0x2a, 0x88,
+ 0x3a, 0x5a, 0x52, 0x84, 0x04, 0x78, 0xf3, 0x85, 0xe7, 0x9d, 0x5b, 0xc7,
+ 0x7f, 0x71, 0x46, 0xbd, 0xc0, 0xc9, 0xda, 0xda, 0xda, 0xdb, 0xa3, 0xcb,
+ 0x83, 0xe3, 0x93, 0xa3, 0xb7, 0xc9, 0xf1, 0xe9, 0xbb, 0xb3, 0x8b, 0xf7,
+ 0x07, 0x97, 0x02, 0xc7, 0x78, 0x6b, 0x3d, 0x72, 0xae, 0xca, 0x9a, 0xd4,
+ 0x12, 0xf2, 0xbc, 0x75, 0xd8, 0xc2, 0x66, 0x15, 0xaf, 0xa5, 0x8c, 0x3a,
+ 0x4f, 0x43, 0xd6, 0x9a, 0x83, 0xb5, 0x44, 0x60, 0x1c, 0xae, 0x2c, 0x1d,
+ 0xe9, 0x05, 0xdb, 0x36, 0xf6, 0x3e, 0xd0, 0xe9, 0xb4, 0x3c, 0x4a, 0x44,
+ 0x37, 0xbc, 0xb2, 0x29, 0x5b, 0x65, 0x94, 0xef, 0x44, 0x57, 0x12, 0x18,
+ 0x7b, 0xb2, 0x7f, 0xbc, 0xcd, 0x05, 0xad, 0xbd, 0x92, 0x05, 0x5a, 0x6f,
+ 0x06, 0xac, 0x1c, 0xd4, 0x8e, 0x47, 0xa0, 0x73, 0x55, 0x02, 0x55, 0xe2,
+ 0xb7, 0x69, 0x69, 0x61, 0xb0, 0xa2, 0x46, 0x0b, 0x60, 0x18, 0x0f, 0x7e,
+ 0xe2, 0xaf, 0x2f, 0xf1, 0xb2, 0xac, 0x51, 0x32, 0x40, 0x23, 0xc5, 0xd2,
+ 0x88, 0xe2, 0xa8, 0x36, 0x2b, 0x65, 0xcf, 0x3a, 0x68, 0x97, 0xac, 0xc0,
+ 0xd6, 0xe8, 0x9c, 0x70, 0xd5, 0xfa, 0x4d, 0x6d, 0xda, 0x78, 0xbd, 0xd1,
+ 0x98, 0xfa, 0xc7, 0x42, 0x9c, 0x4c, 0x73, 0xb1, 0xb5, 0xc6, 0xdc, 0xfa,
+ 0x85, 0x52, 0xd6, 0x59, 0x24, 0xa8, 0xb3, 0xf8, 0xf3, 0x6d, 0xaf, 0xf0,
+ 0x23, 0x4e, 0x9b, 0x3b, 0xb7, 0x4a, 0x74, 0xdd, 0x7f, 0x6b, 0x1e, 0x9a,
+ 0x2c, 0x66, 0x73, 0xad, 0xf6, 0x2d, 0x1a, 0x35, 0x7c, 0x79, 0xba, 0x84,
+ 0xac, 0xb4, 0x41, 0xf9, 0x80, 0xe3, 0xe7, 0x9d, 0xcc, 0x01, 0x8f, 0x03,
+ 0xfb, 0xbb, 0xd1, 0x50, 0x20, 0x8a, 0xcd, 0xda, 0xe8, 0x5d, 0xb7, 0x7c,
+ 0x67, 0x5b, 0x73, 0xc1, 0x84, 0x0c, 0xed, 0xb3, 0xdd, 0x7a, 0x9f, 0xa9,
+ 0xc3, 0x1a, 0x61, 0xfe, 0x37, 0x95, 0xfe, 0x8b, 0xb6, 0xac, 0x34, 0x28,
+ 0x57, 0x45, 0x18, 0x7c, 0x6c, 0x0d, 0xca, 0x7f, 0xb1, 0x0d, 0xe9, 0xf1,
+ 0x25, 0xbd, 0x7e, 0xda, 0xb1, 0x5d, 0x75, 0x7b, 0x20, 0x52, 0xdc, 0xc8,
+ 0x93, 0x07, 0x2d, 0x74, 0x41, 0x9c, 0x8a, 0x80, 0x1b, 0x91, 0xb3, 0x14,
+ 0x7c, 0x04, 0x22, 0x29, 0x11, 0x10, 0xd3, 0xed, 0xbb, 0x40, 0xf9, 0x86,
+ 0xf2, 0x96, 0x6c, 0x79, 0x2d, 0xd9, 0xea, 0xa5, 0xd2, 0x31, 0x8a, 0x4c,
+ 0x98, 0xee, 0x20, 0xf4, 0x8a, 0x35, 0xcd, 0xfa, 0xd5, 0x97, 0x14, 0x8b,
+ 0x08, 0xe9, 0xcf, 0xa5, 0xe6, 0x21, 0xe4, 0xc9, 0xa8, 0xce, 0xd2, 0x1a,
+ 0x06, 0x15, 0x12, 0x6a, 0xf8, 0xce, 0xb0, 0x6e, 0x58, 0x47, 0xda, 0xe6,
+ 0x15, 0xb2, 0x83, 0x88, 0x9e, 0x24, 0xaf, 0xe9, 0x59, 0x22, 0xc5, 0xf1,
+ 0x58, 0x61, 0x32, 0xaf, 0x15, 0x0d, 0x70, 0x98, 0x66, 0xb8, 0x12, 0x3d,
+ 0xc3, 0x42, 0xcf, 0xe9, 0x81, 0x54, 0x35, 0xfc, 0x75, 0x57, 0x74, 0x68,
+ 0x7d, 0x7e, 0x63, 0xbe, 0xb1, 0x9e, 0x5c, 0x93, 0x8d, 0x34, 0x32, 0x5d,
+ 0x0f, 0x04, 0xe8, 0x84, 0x1f, 0x7f, 0x73, 0x91, 0x5e, 0xa5, 0xd9, 0xf4,
+ 0x8f, 0x7b, 0x3b, 0xc3, 0xf4, 0x7a, 0x31, 0x4d, 0xff, 0x15, 0x2f, 0xbe,
+ 0x79, 0xf6, 0x6c, 0x6f, 0xe7, 0xb3, 0xcf, 0x77, 0xd6, 0xbb, 0xe8, 0x03,
+ 0xc7, 0xc9, 0x02, 0x84, 0x0d, 0x38, 0x59, 0x48, 0xee, 0xe2, 0x3b, 0x83,
+ 0xf1, 0x75, 0x0e, 0xa3, 0x8e, 0x14, 0x25, 0x99, 0x83, 0x94, 0xad, 0x49,
+ 0x88, 0x49, 0xce, 0x1f, 0x36, 0x3b, 0xb8, 0x36, 0xfb, 0xfa, 0x0f, 0xbb,
+ 0xfb, 0x2c, 0xca, 0xae, 0xe1, 0x7c, 0x4f, 0x79, 0xc7, 0x26, 0xaf, 0xf3,
+ 0xc2, 0xdc, 0x40, 0x5f, 0x24, 0x4d, 0x7a, 0x6d, 0xf7, 0xaa, 0xb0, 0x24,
+ 0x70, 0x3a, 0x84, 0x8d, 0x6f, 0x5e, 0xd1, 0x26, 0xcf, 0xcd, 0x54, 0x6d,
+ 0x82, 0x0b, 0x63, 0xa3, 0x86, 0x92, 0x35, 0xcf, 0x2a, 0x64, 0xae, 0x5e,
+ 0x57, 0xe9, 0x4c, 0x93, 0x4e, 0xe8, 0x7d, 0x82, 0xad, 0x0d, 0xe6, 0x53,
+ 0x2d, 0xbe, 0xce, 0x7e, 0x8b, 0xdc, 0x6d, 0xb8, 0xe9, 0xbc, 0x76, 0xd5,
+ 0x31, 0xf9, 0xba, 0x39, 0x96, 0xa2, 0x62, 0x1b, 0xe4, 0x52, 0x59, 0x67,
+ 0x9f, 0xca, 0x3a, 0x46, 0xd5, 0xb3, 0x95, 0xa4, 0xfb, 0x13, 0x1d, 0xe9,
+ 0x00, 0x7f, 0x07, 0xab, 0x47, 0xca, 0x8c, 0x80, 0xeb, 0x73, 0xce, 0xa3,
+ 0xb7, 0xf5, 0xa5, 0xd8, 0xf9, 0x96, 0xb7, 0xc6, 0x95, 0x3a, 0xf0, 0x65,
+ 0xf2, 0x5a, 0xbd, 0x44, 0xbb, 0x5f, 0xbc, 0xc1, 0x86, 0xd8, 0xfd, 0xe2,
+ 0x5f, 0xed, 0xcf, 0xf6, 0xe4, 0x67, 0x7b, 0x5f, 0xfc, 0xeb, 0x60, 0x80,
+ 0xfe, 0xd1, 0x0e, 0xd9, 0xd0, 0x5f, 0x6f, 0x08, 0x6b, 0x52, 0x2a, 0x47,
+ 0x98, 0xff, 0x45, 0x66, 0x3b, 0x17, 0xa5, 0xc2, 0x5a, 0xaf, 0xeb, 0x97,
+ 0xfd, 0x59, 0xee, 0x49, 0x44, 0xd5, 0xca, 0xad, 0xbc, 0xf6, 0xa9, 0xe7,
+ 0xea, 0xd8, 0xa4, 0xdb, 0x38, 0x08, 0xda, 0x11, 0x18, 0x25, 0x5e, 0xfe,
+ 0x37, 0xda, 0xa9, 0xff, 0xb6, 0x96, 0x48, 0x74, 0x93, 0x96, 0xe3, 0x01,
+ 0x01, 0x0f, 0xdd, 0xb6, 0x4c, 0x77, 0xc4, 0xbc, 0xc8, 0xd4, 0x32, 0xa5,
+ 0x71, 0xd0, 0x1d, 0xe8, 0x95, 0x58, 0xfa, 0x93, 0x54, 0xa5, 0xb5, 0xf9,
+ 0x2f, 0xfa, 0x0c, 0xa7, 0xbc, 0x18, 0x1d, 0xa3, 0x21, 0xe9, 0x80, 0x67,
+ 0xff, 0xf8, 0xc3, 0x0f, 0xa2, 0x50, 0x99, 0xbf, 0x48, 0xcf, 0x6f, 0x8c,
+ 0x2c, 0x9a, 0x18, 0xf1, 0x36, 0x43, 0xcd, 0x16, 0xa9, 0x8a, 0x25, 0x57,
+ 0xfe, 0x95, 0x8c, 0x94, 0x1b, 0x31, 0x4b, 0x7b, 0x30, 0x3c, 0x3c, 0x3e,
+ 0x06, 0x62, 0x14, 0x93, 0x7a, 0xc4, 0x62, 0x0c, 0x7b, 0x73, 0x13, 0x10,
+ 0x0f, 0x07, 0x4b, 0xf4, 0xb7, 0x3e, 0xad, 0x1d, 0x96, 0x1d, 0xbb, 0xdf,
+ 0x34, 0xa6, 0x06, 0xb8, 0x2c, 0x25, 0xf6, 0x2c, 0x6b, 0x39, 0x6f, 0xd6,
+ 0xf9, 0xc1, 0xeb, 0x7c, 0x5d, 0x82, 0x58, 0xfc, 0x93, 0x75, 0x47, 0x82,
+ 0xc5, 0xeb, 0x81, 0x45, 0x7b, 0xc3, 0xaa, 0x53, 0xfe, 0xf7, 0xec, 0xcd,
+ 0xee, 0x4e, 0xfc, 0x09, 0x44, 0x6d, 0x89, 0xf6, 0xef, 0x8d, 0x0b, 0x08,
+ 0xae, 0x7a, 0x3e, 0x9f, 0xf0, 0xd3, 0x52, 0x55, 0x1a, 0x05, 0xbe, 0xde,
+ 0xac, 0x8f, 0xe8, 0x86, 0xa5, 0xff, 0x5b, 0xd2, 0x0f, 0x44, 0xac, 0xe4,
+ 0xd9, 0x7a, 0x31, 0x9a, 0xe5, 0xad, 0x0e, 0x6f, 0xd3, 0x00, 0xbf, 0xa0,
+ 0x01, 0x7f, 0x9f, 0xd9, 0xdd, 0x91, 0x91, 0x6a, 0xc7, 0xba, 0xdf, 0xc6,
+ 0x55, 0x59, 0x8e, 0xd2, 0x6a, 0x43, 0xc2, 0x39, 0xda, 0xcf, 0x8d, 0xdd,
+ 0xbd, 0x67, 0xcf, 0x5f, 0x6c, 0x0c, 0x44, 0x4f, 0x83, 0x88, 0x68, 0x7c,
+ 0xe2, 0x11, 0x6e, 0xc2, 0x52, 0x66, 0x30, 0x6a, 0x1a, 0xa9, 0xfa, 0xb1,
+ 0xe0, 0x2a, 0x49, 0x31, 0xfa, 0xdc, 0x1b, 0xfe, 0xda, 0xbf, 0xd2, 0x77,
+ 0xde, 0xe0, 0x13, 0xff, 0x9a, 0x4f, 0xde, 0xd8, 0x11, 0xfe, 0x2b, 0x8d,
+ 0xe5, 0x8d, 0x0c, 0xc2, 0xac, 0xab, 0xa6, 0x13, 0xd6, 0x5b, 0x6b, 0x51,
+ 0xb9, 0x16, 0x5d, 0x5c, 0x5d, 0xc4, 0x35, 0x0c, 0x1a, 0x08, 0x86, 0xfe,
+ 0x84, 0xa3, 0x1f, 0xd0, 0x56, 0x5d, 0x32, 0xdd, 0xf6, 0xa7, 0xbe, 0x69,
+ 0xa5, 0x4f, 0xad, 0xf4, 0x9d, 0xc0, 0x06, 0x5b, 0x63, 0x9f, 0x16, 0xa2,
+ 0x27, 0xd9, 0x94, 0x53, 0x78, 0x59, 0x44, 0x15, 0x28, 0x4b, 0x80, 0x00,
+ 0x0e, 0xbf, 0x3e, 0xde, 0x10, 0xe0, 0x0d, 0x9b, 0x89, 0xbd, 0x98, 0x7f,
+ 0xda, 0x42, 0x0c, 0xc7, 0xe9, 0x9c, 0x4e, 0xff, 0x9a, 0x12, 0xd2, 0xa6,
+ 0x84, 0x23, 0xa1, 0xef, 0x72, 0xe2, 0xb3, 0xf9, 0x98, 0xdc, 0x3a, 0x53,
+ 0xf2, 0x78, 0x57, 0xcc, 0x23, 0xe9, 0x35, 0x63, 0xe6, 0xa5, 0x16, 0x40,
+ 0x09, 0x62, 0x3e, 0x73, 0x9b, 0x39, 0xd9, 0x7f, 0x67, 0x83, 0x9e, 0x36,
+ 0x53, 0x4f, 0x1e, 0x35, 0xbf, 0x62, 0x79, 0xa2, 0x22, 0x62, 0x7d, 0xa0,
+ 0x35, 0xbb, 0x79, 0x27, 0xf8, 0xd2, 0x03, 0xd9, 0xfb, 0xa3, 0x4c, 0xf2,
+ 0x2d, 0xd9, 0x6d, 0xc2, 0x8a, 0x21, 0xc9, 0xcf, 0xd7, 0xb6, 0x58, 0xde,
+ 0x17, 0x09, 0x78, 0xa5, 0xf9, 0x2d, 0x89, 0x3b, 0xb6, 0x4a, 0xd7, 0xe3,
+ 0xa5, 0x35, 0x57, 0xa0, 0x8f, 0x67, 0xc4, 0xa1, 0x71, 0x44, 0x31, 0xf0,
+ 0x09, 0x33, 0x47, 0x0f, 0xe2, 0x6c, 0xa0, 0x16, 0x36, 0xfe, 0x8c, 0x43,
+ 0xf0, 0x9a, 0x96, 0x01, 0xbf, 0xfe, 0x62, 0x63, 0xcd, 0xd6, 0x8a, 0xb2,
+ 0x9a, 0x7b, 0x27, 0x80, 0xcc, 0x1b, 0xd4, 0x1f, 0x8f, 0x47, 0x90, 0xc0,
+ 0xda, 0x18, 0xd1, 0xb1, 0xa0, 0x20, 0x84, 0xd1, 0xa6, 0xa6, 0x13, 0xa9,
+ 0xb4, 0x6b, 0x1d, 0xd4, 0xdc, 0x78, 0x46, 0x69, 0x0a, 0xa4, 0x3d, 0x6e,
+ 0x10, 0x5a, 0x15, 0xef, 0x6d, 0x58, 0x72, 0x54, 0xf8, 0x4c, 0x21, 0xf0,
+ 0xaa, 0x4c, 0x0b, 0xc0, 0xae, 0x49, 0x31, 0x2e, 0xa7, 0xcd, 0xfb, 0x03,
+ 0xab, 0x3d, 0xe5, 0xc1, 0xe5, 0x2b, 0x32, 0x47, 0x51, 0x70, 0x44, 0xde,
+ 0x51, 0x22, 0xb0, 0x7c, 0xf4, 0x0d, 0x4d, 0xf7, 0xee, 0xe0, 0x3a, 0xbf,
+ 0xe2, 0xc9, 0x30, 0x22, 0xf2, 0x3a, 0xdb, 0x36, 0xff, 0xec, 0x99, 0x9f,
+ 0xef, 0x91, 0x56, 0x46, 0x7f, 0x79, 0x06, 0x3c, 0x96, 0x7f, 0xf7, 0x7b,
+ 0x67, 0xc3, 0x9e, 0x0b, 0xfa, 0x4b, 0x6e, 0xef, 0x7c, 0x89, 0xea, 0x48,
+ 0x2f, 0xfb, 0xca, 0x57, 0x8a, 0x2c, 0x39, 0x55, 0x35, 0x7d, 0x50, 0x09,
+ 0x19, 0x5a, 0x64, 0x92, 0x2e, 0x28, 0x3d, 0xc5, 0x82, 0x47, 0x04, 0x48,
+ 0x21, 0x8a, 0x3a, 0xe9, 0xdd, 0xb9, 0xb8, 0x67, 0x28, 0x9d, 0x07, 0x37,
+ 0x6b, 0x76, 0xbf, 0xd5, 0xf3, 0x91, 0xb6, 0x46, 0xbc, 0xdf, 0x51, 0x72,
+ 0x3c, 0x31, 0x88, 0x58, 0x9d, 0x16, 0x9f, 0xdf, 0x94, 0xba, 0x8a, 0x5e,
+ 0xce, 0x30, 0x96, 0x39, 0xef, 0xae, 0x60, 0xbb, 0x34, 0x21, 0x03, 0xf9,
+ 0xf2, 0xba, 0xd9, 0xa2, 0xcf, 0x64, 0xd3, 0x1a, 0xb6, 0xba, 0x14, 0x25,
+ 0xd5, 0xaf, 0x0a, 0xf0, 0x80, 0x3f, 0xb4, 0xe1, 0x9f, 0xfd, 0x72, 0xdc,
+ 0x64, 0xc6, 0xd6, 0x25, 0xb6, 0xb4, 0x19, 0xcb, 0xb9, 0xa3, 0x19, 0x53,
+ 0x12, 0x63, 0x0b, 0x4f, 0xfb, 0x7c, 0x7b, 0x8a, 0x4a, 0xd4, 0x7f, 0x37,
+ 0x48, 0x4e, 0x80, 0x18, 0xaf, 0x53, 0xe6, 0xe3, 0xd1, 0x1b, 0x56, 0x77,
+ 0x83, 0xd9, 0x3a, 0xac, 0x83, 0xaf, 0x71, 0x06, 0x0b, 0x31, 0x5b, 0xe8,
+ 0x96, 0x02, 0xf1, 0xa4, 0x33, 0x3a, 0x59, 0xbf, 0x10, 0x7d, 0xa4, 0x07,
+ 0x5f, 0xb8, 0x7d, 0x0e, 0x3e, 0x7f, 0xf6, 0xfb, 0x21, 0x8f, 0xcb, 0x6e,
+ 0x58, 0xaf, 0x11, 0x06, 0x6d, 0x89, 0x02, 0xea, 0x89, 0x75, 0x7b, 0x08,
+ 0x18, 0x52, 0x99, 0xb1, 0xd3, 0x85, 0x08, 0x16, 0x88, 0x14, 0x08, 0x31,
+ 0x61, 0xd3, 0x1a, 0x76, 0x19, 0xd5, 0x8c, 0xa4, 0x6d, 0xb4, 0x0e, 0xbb,
+ 0x71, 0x9a, 0x59, 0xe3, 0x9a, 0xd7, 0xaa, 0xb4, 0x70, 0x73, 0xf8, 0x62,
+ 0x84, 0x6e, 0xd7, 0x86, 0xeb, 0xa8, 0x93, 0xd4, 0xaf, 0xf4, 0xce, 0xfc,
+ 0x85, 0x94, 0xb3, 0x51, 0x65, 0x56, 0x3d, 0xab, 0xf8, 0x6a, 0x60, 0x8c,
+ 0x90, 0x57, 0x40, 0xf3, 0x9b, 0xcb, 0xf7, 0x27, 0x89, 0xf2, 0x1a, 0x5d,
+ 0x39, 0x55, 0x51, 0x91, 0x99, 0x18, 0xa2, 0x78, 0x46, 0x58, 0x1f, 0x92,
+ 0xa7, 0xf8, 0x96, 0xe3, 0xb9, 0xa5, 0x84, 0xf7, 0x84, 0x26, 0xa7, 0x75,
+ 0x64, 0xbd, 0x27, 0xf8, 0x55, 0xda, 0x47, 0x66, 0x9b, 0x6c, 0xd0, 0x14,
+ 0x6c, 0xf4, 0x92, 0x0d, 0xea, 0x2a, 0xfd, 0x62, 0x03, 0xf3, 0x89, 0x1f,
+ 0x7b, 0xd3, 0xb7, 0x31, 0x88, 0x9c, 0x42, 0x7a, 0xe6, 0xcd, 0x97, 0xad,
+ 0x59, 0xc2, 0xcf, 0xb5, 0xa9, 0x37, 0x9c, 0x2f, 0x12, 0xe8, 0xdc, 0xfa,
+ 0xae, 0xd7, 0xfe, 0x9b, 0xc3, 0x92, 0x98, 0x46, 0xa9, 0x40, 0xa7, 0x83,
+ 0xb9, 0x8e, 0xed, 0xcf, 0x72, 0xe4, 0xbe, 0x06, 0x0d, 0x3d, 0x7e, 0x8a,
+ 0x2f, 0x55, 0x14, 0x59, 0x08, 0x28, 0x4b, 0x37, 0xde, 0x02, 0x2a, 0x79,
+ 0xcd, 0x6a, 0xe6, 0x6c, 0xf7, 0xdd, 0x97, 0xf0, 0x32, 0x40, 0xe6, 0xec,
+ 0x0e, 0x90, 0x0c, 0xe9, 0x98, 0xd1, 0x6d, 0x03, 0xd6, 0x78, 0x5f, 0xc7,
+ 0x84, 0xae, 0x5b, 0x54, 0xae, 0x9a, 0xf4, 0x3a, 0xcb, 0x31, 0xd9, 0x35,
+ 0xcf, 0xc7, 0xa8, 0x75, 0xff, 0xe6, 0xcb, 0x49, 0x79, 0x4d, 0x92, 0xab,
+ 0x67, 0x0e, 0x1a, 0xfd, 0x09, 0x40, 0xf2, 0x9e, 0x7c, 0x94, 0x3b, 0x8c,
+ 0xb3, 0xc2, 0x5a, 0xbc, 0xfe, 0x7b, 0x09, 0x44, 0xf5, 0x1d, 0xb9, 0x42,
+ 0xc7, 0xd2, 0xb6, 0x6d, 0x9a, 0xd7, 0xc3, 0xb4, 0x6f, 0x7f, 0xe1, 0x7f,
+ 0x4b, 0x27, 0x27, 0x95, 0x96, 0xb9, 0x50, 0xaa, 0xd4, 0x91, 0x9d, 0x3e,
+ 0xd8, 0x22, 0x51, 0x70, 0x70, 0x11, 0xc3, 0x39, 0xdf, 0x5b, 0x53, 0xc9,
+ 0xd0, 0xdb, 0xf8, 0x72, 0x83, 0x73, 0x04, 0x36, 0x5e, 0x6f, 0x40, 0x82,
+ 0x91, 0x5c, 0x9a, 0x8d, 0x32, 0xe4, 0x91, 0xc9, 0xe5, 0xb4, 0xc1, 0xb7,
+ 0x62, 0x9f, 0x75, 0x07, 0x61, 0x72, 0x74, 0x07, 0x04, 0xd7, 0xb2, 0x33,
+ 0x23, 0x7d, 0xf0, 0x24, 0xdc, 0x04, 0xae, 0x7c, 0x2b, 0x51, 0x11, 0x8f,
+ 0x1a, 0x06, 0xca, 0xc8, 0xa5, 0x0b, 0xb5, 0x0c, 0xa4, 0x27, 0xc4, 0x03,
+ 0x24, 0x6e, 0xce, 0x45, 0x31, 0xa7, 0x34, 0xf7, 0x71, 0x03, 0x6f, 0x0b,
+ 0x9f, 0xa5, 0x41, 0xf2, 0xa1, 0x98, 0x70, 0x71, 0x75, 0x32, 0x96, 0xf3,
+ 0x6a, 0xbc, 0x98, 0x91, 0xab, 0x62, 0x4c, 0x0e, 0x32, 0x5c, 0x3c, 0xac,
+ 0x1e, 0xb4, 0xc2, 0xf3, 0x7e, 0x87, 0xd9, 0x39, 0xc2, 0x0e, 0x73, 0xf9,
+ 0x2e, 0xa0, 0x28, 0x04, 0xc0, 0x12, 0x87, 0x38, 0xb4, 0x02, 0x4b, 0x7e,
+ 0x22, 0x02, 0x88, 0x22, 0x83, 0x47, 0xef, 0x8e, 0x2e, 0x2e, 0x8e, 0x2e,
+ 0x68, 0xbe, 0x0f, 0x3a, 0xd5, 0xb8, 0x94, 0x06, 0xd9, 0x85, 0x1a, 0x15,
+ 0xf6, 0xeb, 0x7b, 0x6a, 0x34, 0x2b, 0x89, 0x44, 0xa1, 0x14, 0xa3, 0x82,
+ 0x05, 0xc1, 0x74, 0x3f, 0x5c, 0xee, 0xc0, 0x77, 0x2f, 0x02, 0xf6, 0x6d,
+ 0xc3, 0x06, 0x80, 0x41, 0xc1, 0x01, 0xd9, 0xd2, 0x2d, 0x5c, 0x0b, 0x95,
+ 0x10, 0xe0, 0x2f, 0x34, 0xbb, 0xfe, 0x26, 0x6b, 0xa9, 0xa9, 0x03, 0x41,
+ 0xea, 0x66, 0x12, 0x4c, 0x9f, 0x5a, 0xff, 0x04, 0x86, 0x7c, 0x45, 0x67,
+ 0x94, 0x6c, 0x27, 0x4c, 0x46, 0xdd, 0x2c, 0xe6, 0xf9, 0xc4, 0x7a, 0x7b,
+ 0xcd, 0xcf, 0x8d, 0xfa, 0x97, 0xf0, 0x29, 0xaf, 0x15, 0xeb, 0x82, 0xa8,
+ 0xa6, 0x3a, 0x23, 0x7c, 0x6f, 0x5b, 0xa7, 0x56, 0x75, 0x82, 0xc4, 0x37,
+ 0x06, 0x8d, 0x29, 0xb1, 0x79, 0x3b, 0x4d, 0x5c, 0xf6, 0x7e, 0x06, 0x2f,
+ 0x23, 0x49, 0x0b, 0x85, 0xdf, 0xf8, 0x92, 0x81, 0x7c, 0x59, 0x33, 0x87,
+ 0x77, 0x77, 0xb5, 0x6d, 0x2f, 0x90, 0x1d, 0x5a, 0xed, 0x27, 0x3f, 0xd6,
+ 0xf9, 0xf8, 0x67, 0x77, 0x79, 0x20, 0xfd, 0xa7, 0xcd, 0x47, 0x85, 0xa9,
+ 0x93, 0x89, 0x12, 0x63, 0x98, 0xb3, 0xb2, 0x3f, 0x0c, 0x8f, 0x2e, 0x92,
+ 0x83, 0xaf, 0x89, 0xd1, 0xfb, 0x1f, 0x5c, 0x60, 0x7a, 0x4e, 0x6e, 0x87,
+ 0x35, 0xe1, 0x57, 0x14, 0x8a, 0x92, 0x6c, 0xe2, 0x57, 0xa2, 0x1d, 0xb4,
+ 0x56, 0x36, 0xd7, 0xfa, 0x05, 0xee, 0xba, 0x6f, 0xaf, 0x21, 0xb9, 0x0b,
+ 0x1f, 0x59, 0xc5, 0xa7, 0xac, 0x21, 0x1d, 0x32, 0x7f, 0x15, 0x99, 0xdc,
+ 0x88, 0x43, 0x12, 0xba, 0x36, 0xd2, 0xfb, 0x3a, 0x30, 0x3b, 0x79, 0x95,
+ 0x0e, 0x92, 0x8d, 0xf7, 0xe5, 0xdf, 0x8d, 0x32, 0x90, 0x6e, 0x3f, 0x1b,
+ 0xec, 0x24, 0x9b, 0xdf, 0xe7, 0xc5, 0xab, 0x17, 0x7f, 0x4e, 0x8e, 0xb7,
+ 0x36, 0x5a, 0x60, 0x7e, 0x2e, 0x29, 0x32, 0x4a, 0x8b, 0x5b, 0xbb, 0x64,
+ 0x67, 0x38, 0xd9, 0x0c, 0xaa, 0x13, 0xe7, 0x43, 0xcd, 0x74, 0xfe, 0x4b,
+ 0x5b, 0x44, 0x0e, 0xa7, 0xe4, 0x05, 0x24, 0xdf, 0xd9, 0xf2, 0xee, 0x64,
+ 0xe5, 0x9b, 0xa7, 0x26, 0x34, 0x75, 0xaf, 0x5e, 0x04, 0x4d, 0x3c, 0xb7,
+ 0x6d, 0x7c, 0xe0, 0x36, 0x7e, 0x61, 0x13, 0x7b, 0x83, 0x9d, 0xbd, 0x64,
+ 0xf3, 0x6c, 0xb8, 0xbd, 0x67, 0x5b, 0x08, 0x9b, 0xd8, 0x43, 0x13, 0xf4,
+ 0x50, 0xfb, 0xe5, 0xe7, 0xf4, 0xfd, 0x1f, 0xb3, 0xe2, 0xe7, 0x64, 0xf3,
+ 0x87, 0xdd, 0x5d, 0xd3, 0xc0, 0x9f, 0x93, 0x83, 0xe3, 0x1f, 0x92, 0xe7,
+ 0x03, 0xd3, 0xd8, 0x69, 0x7a, 0x27, 0xcd, 0x09, 0x2b, 0xf1, 0x10, 0x8d,
+ 0x98, 0xdf, 0x07, 0x6d, 0xbc, 0xe8, 0xb4, 0x71, 0x62, 0xec, 0xc2, 0x4f,
+ 0xe6, 0x5a, 0xd9, 0x19, 0x3c, 0xdb, 0x4b, 0xf2, 0x17, 0x9f, 0xbf, 0xd4,
+ 0x86, 0xa4, 0x0d, 0xfc, 0xbe, 0xed, 0xad, 0x64, 0xe6, 0x13, 0xa3, 0xea,
+ 0x1c, 0x7d, 0x32, 0x02, 0x0d, 0x22, 0xa2, 0x22, 0x4f, 0xe1, 0x4d, 0x5a,
+ 0x4d, 0x64, 0xbb, 0x51, 0xb1, 0x11, 0xb3, 0x52, 0x42, 0x09, 0x9f, 0xc1,
+ 0x6d, 0x69, 0x2e, 0xce, 0xfd, 0xa0, 0x3b, 0x64, 0x9b, 0xea, 0xa3, 0x7f,
+ 0x4e, 0xde, 0x0f, 0x8f, 0x8f, 0xcc, 0x88, 0x76, 0x4c, 0xd7, 0xdc, 0x1c,
+ 0x72, 0x87, 0xf0, 0x2b, 0x4c, 0xee, 0x2b, 0xb0, 0xcd, 0x4a, 0x1b, 0xaa,
+ 0x73, 0x33, 0x90, 0xd5, 0x6c, 0x3a, 0x73, 0x71, 0xd7, 0xf8, 0x2e, 0x41,
+ 0x52, 0xfa, 0x07, 0xd7, 0x64, 0x42, 0xf0, 0x55, 0x8b, 0x4f, 0x7f, 0x5b,
+ 0x16, 0xe6, 0x98, 0x54, 0x65, 0x45, 0xc8, 0xa9, 0x8d, 0x96, 0xb6, 0xf0,
+ 0xed, 0xdb, 0x23, 0xce, 0x8e, 0x7f, 0x9f, 0x16, 0x46, 0x46, 0x12, 0xc9,
+ 0x55, 0x7d, 0x4b, 0xf1, 0x7f, 0x0e, 0xe7, 0xf0, 0xfb, 0x27, 0x0f, 0xc5,
+ 0x27, 0xb3, 0x8e, 0x9f, 0x0d, 0x76, 0x09, 0xb2, 0x4d, 0x56, 0xef, 0xbb,
+ 0xf7, 0xe6, 0xdf, 0xbb, 0xcf, 0x37, 0x12, 0xfa, 0x55, 0xdb, 0x82, 0xd7,
+ 0xf3, 0xba, 0x76, 0x78, 0x76, 0xf6, 0xed, 0x31, 0x03, 0x40, 0x0e, 0xc5,
+ 0xad, 0x4a, 0xca, 0x95, 0xb5, 0x8a, 0x59, 0xba, 0x1a, 0xeb, 0xcd, 0x65,
+ 0x2b, 0x21, 0x18, 0x77, 0x9b, 0x65, 0x73, 0x42, 0x23, 0x34, 0x1d, 0x89,
+ 0xd0, 0x88, 0x8c, 0xb6, 0xd8, 0x26, 0x52, 0x7f, 0x3a, 0x5c, 0x9c, 0x4d,
+ 0x6d, 0x5d, 0xb8, 0xa3, 0x07, 0xcb, 0xc0, 0x91, 0xba, 0xca, 0xb3, 0xe8,
+ 0xa2, 0xcd, 0x56, 0x50, 0x17, 0x34, 0x56, 0x98, 0xaa, 0xda, 0x88, 0xed,
+ 0xbb, 0x31, 0x34, 0xda, 0x3d, 0x77, 0x7a, 0x5f, 0xbc, 0xb6, 0x1b, 0x1e,
+ 0x47, 0x3c, 0x34, 0x5a, 0xa4, 0xeb, 0x30, 0x44, 0x8d, 0x0c, 0x04, 0x01,
+ 0xce, 0x8b, 0x6c, 0x46, 0x61, 0xf0, 0x0c, 0xf0, 0xbc, 0xd3, 0x83, 0xf7,
+ 0x47, 0x6f, 0xbe, 0x3b, 0x38, 0xf9, 0x70, 0x64, 0x5e, 0xc9, 0xcd, 0xc7,
+ 0x36, 0x1d, 0x84, 0x0f, 0x7d, 0x9c, 0xe5, 0xe3, 0x72, 0x4a, 0x51, 0xa6,
+ 0x8d, 0x3f, 0x6f, 0xac, 0x31, 0xbc, 0x3c, 0x59, 0xa7, 0xb7, 0x76, 0xf9,
+ 0x35, 0xb3, 0x2f, 0xe8, 0x5f, 0x7b, 0xfc, 0xaf, 0xbd, 0x3f, 0xaf, 0x6f,
+ 0xb5, 0x06, 0x1d, 0x58, 0xc9, 0x57, 0x28, 0x3e, 0x89, 0x9a, 0x81, 0x28,
+ 0xb3, 0x8c, 0xdc, 0x0d, 0x9e, 0x95, 0x75, 0x8d, 0xd1, 0xe8, 0xdd, 0x46,
+ 0xcf, 0x6e, 0x8e, 0x1e, 0x7c, 0x1b, 0x7c, 0x9d, 0x5e, 0x7a, 0x03, 0x05,
+ 0x63, 0x7d, 0xab, 0x67, 0x55, 0x0e, 0x84, 0xca, 0xa9, 0x0d, 0x6d, 0x82,
+ 0x59, 0x21, 0x93, 0xcd, 0x75, 0xfe, 0xcb, 0x9b, 0xb7, 0x07, 0x97, 0x47,
+ 0xf4, 0x82, 0x7e, 0x5e, 0xd0, 0x88, 0x36, 0x8d, 0x82, 0xfa, 0xb3, 0x29,
+ 0xa1, 0xe9, 0x37, 0x34, 0xa0, 0xf5, 0x2d, 0x8e, 0x65, 0x20, 0xa8, 0xde,
+ 0xe9, 0x57, 0x59, 0x28, 0x70, 0xdb, 0x65, 0x9c, 0xd7, 0x8a, 0x58, 0xd9,
+ 0x5c, 0xe7, 0xdf, 0xad, 0x5b, 0x0f, 0xae, 0x54, 0x3b, 0x91, 0x70, 0xe5,
+ 0x04, 0x49, 0x16, 0x41, 0x66, 0x2d, 0x43, 0xd2, 0xdc, 0xfa, 0x48, 0xb0,
+ 0x82, 0x3d, 0x4e, 0x1e, 0x6b, 0xbe, 0x5d, 0x78, 0x49, 0x69, 0x27, 0x1f,
+ 0x53, 0x59, 0xee, 0xee, 0x3d, 0xfb, 0x33, 0xe6, 0xf3, 0xcd, 0xfa, 0xb6,
+ 0xb9, 0x1b, 0xd6, 0xff, 0x4c, 0x9f, 0xce, 0x1b, 0xaf, 0xf6, 0x9b, 0x7c,
+ 0x86, 0xec, 0x29, 0xd9, 0x51, 0x0c, 0x97, 0xa1, 0x55, 0xf7, 0x98, 0x7a,
+ 0x30, 0xa1, 0xf7, 0x9c, 0x25, 0xa6, 0xbc, 0x36, 0x0a, 0x1e, 0xc0, 0x7a,
+ 0xa1, 0x68, 0x15, 0xca, 0x71, 0xb0, 0x53, 0x17, 0x9f, 0xf3, 0xef, 0x8f,
+ 0x1e, 0xbf, 0xcb, 0x63, 0x14, 0x2e, 0x20, 0xfa, 0xe6, 0xec, 0x41, 0x13,
+ 0xc9, 0xf0, 0x2d, 0xe8, 0xe4, 0xbc, 0x66, 0x81, 0x66, 0x3c, 0x12, 0xdf,
+ 0x8e, 0x1a, 0x23, 0xd0, 0x09, 0x8c, 0x68, 0x79, 0x80, 0xa2, 0x04, 0xb4,
+ 0x81, 0x0f, 0xb2, 0xd0, 0x3b, 0x3b, 0x1d, 0xe5, 0x46, 0x13, 0xb6, 0xa9,
+ 0x31, 0x9e, 0x55, 0x6e, 0xa7, 0x5e, 0x8f, 0x5f, 0xee, 0x91, 0x2c, 0xad,
+ 0x59, 0x6e, 0xd2, 0xda, 0xfa, 0x90, 0x10, 0x6d, 0x94, 0x67, 0xdb, 0xeb,
+ 0xd4, 0xc9, 0x47, 0xc3, 0x30, 0xd8, 0xa4, 0x67, 0xfb, 0xd8, 0x88, 0x9a,
+ 0x22, 0xab, 0x56, 0x02, 0x2c, 0x22, 0xc1, 0x28, 0x0c, 0xd1, 0xe7, 0xa0,
+ 0x37, 0xef, 0x0c, 0x06, 0x03, 0x6b, 0xee, 0x20, 0x90, 0x26, 0x31, 0x28,
+ 0xa2, 0xaf, 0xf3, 0x79, 0x81, 0x31, 0xc7, 0x9b, 0x50, 0xe6, 0xa1, 0x50,
+ 0x6f, 0x09, 0xf0, 0x46, 0xfc, 0x04, 0xf6, 0x68, 0x78, 0x3e, 0x8e, 0x0d,
+ 0xf9, 0xec, 0x86, 0xf2, 0x2f, 0xdc, 0xc6, 0x16, 0x61, 0x45, 0xdf, 0xd8,
+ 0xf7, 0x28, 0x45, 0x70, 0xac, 0x9c, 0xb2, 0x85, 0xe5, 0x61, 0xcf, 0x13,
+ 0x80, 0x9c, 0x8b, 0xb5, 0x3d, 0xd8, 0xe2, 0x37, 0xda, 0x95, 0x1e, 0x63,
+ 0x0f, 0x48, 0xc8, 0x95, 0xf7, 0xe0, 0x33, 0x00, 0x6b, 0x02, 0x61, 0x4f,
+ 0x0a, 0x76, 0x0f, 0xe8, 0x0d, 0x32, 0xb7, 0x6a, 0xb3, 0xb4, 0x23, 0x1c,
+ 0xd1, 0x64, 0x33, 0x43, 0xf7, 0x97, 0x2c, 0x47, 0x61, 0x96, 0xa9, 0x35,
+ 0x89, 0xc7, 0xa8, 0x6d, 0x25, 0xe8, 0x48, 0x75, 0xf0, 0xce, 0x5d, 0x45,
+ 0x68, 0xb3, 0x3e, 0x73, 0xb3, 0x68, 0x22, 0xa2, 0x4a, 0x0f, 0xe1, 0xe7,
+ 0x58, 0x15, 0x2f, 0x1f, 0x6b, 0x8b, 0x36, 0x58, 0xde, 0x99, 0x1b, 0x77,
+ 0x2b, 0xb7, 0x45, 0x97, 0x99, 0x51, 0xf6, 0x2e, 0xdb, 0x7a, 0x0d, 0x22,
+ 0xf7, 0x92, 0xf4, 0xde, 0x5c, 0x3d, 0x45, 0x46, 0xf8, 0x4c, 0x20, 0x1d,
+ 0xe0, 0x95, 0x39, 0xf1, 0xfc, 0x8c, 0x76, 0x84, 0x5a, 0x23, 0x29, 0x75,
+ 0x45, 0x92, 0x92, 0x4d, 0x36, 0x34, 0x98, 0x1e, 0x59, 0x1d, 0x7a, 0xa4,
+ 0x80, 0x97, 0x33, 0x62, 0x29, 0x15, 0x4d, 0x5d, 0xcd, 0x73, 0xea, 0xb9,
+ 0x11, 0xd1, 0x43, 0xd9, 0x37, 0x39, 0x70, 0x89, 0xe4, 0xe7, 0x60, 0x5c,
+ 0x85, 0xce, 0x56, 0x5a, 0x4c, 0xbc, 0x8f, 0xd8, 0xf8, 0xb4, 0xb8, 0x9f,
+ 0x08, 0xde, 0x5b, 0xf4, 0xc1, 0x59, 0xa1, 0x21, 0x61, 0x31, 0xaf, 0xae,
+ 0xaf, 0xd9, 0x6a, 0x4b, 0xba, 0x43, 0x8b, 0x6f, 0xb2, 0x13, 0x9a, 0x15,
+ 0x42, 0x41, 0x3f, 0x2c, 0x9b, 0xcd, 0x4b, 0x5b, 0x49, 0x4f, 0xbc, 0x2e,
+ 0xad, 0xcd, 0xac, 0x31, 0x49, 0x5e, 0xb7, 0xc6, 0x26, 0x5d, 0x21, 0x41,
+ 0xa3, 0x1d, 0x43, 0x3e, 0xbb, 0x58, 0x43, 0x01, 0x94, 0xc2, 0x11, 0x32,
+ 0xe8, 0xa2, 0x83, 0x68, 0xcf, 0x21, 0x50, 0x1c, 0x12, 0xf5, 0xde, 0x42,
+ 0xad, 0xb0, 0x5d, 0x93, 0x51, 0xea, 0x4c, 0xae, 0xb5, 0xa4, 0xe5, 0xed,
+ 0xa5, 0xaa, 0x4c, 0xc7, 0x85, 0xc8, 0xa1, 0xf2, 0x2e, 0x73, 0x3c, 0x8f,
+ 0xce, 0xe1, 0xe8, 0xc8, 0x7f, 0xe5, 0xf4, 0x5b, 0x61, 0xd2, 0x09, 0xf0,
+ 0x5a, 0x79, 0x85, 0x41, 0x76, 0x66, 0x65, 0x90, 0x78, 0x4d, 0xb2, 0xab,
+ 0xa4, 0x6c, 0x71, 0x28, 0xa3, 0x6f, 0x12, 0xb7, 0xd6, 0x16, 0x79, 0x8f,
+ 0x30, 0x5b, 0x8b, 0x67, 0x9a, 0x70, 0xf1, 0x20, 0xad, 0x80, 0x60, 0x31,
+ 0x7a, 0x2e, 0xfe, 0xab, 0xa3, 0x5c, 0xb7, 0x8b, 0xb4, 0xae, 0xb5, 0x26,
+ 0xb0, 0x09, 0xb0, 0x07, 0x48, 0xa1, 0xb3, 0x21, 0xfc, 0x4b, 0x59, 0x27,
+ 0xec, 0x64, 0x78, 0xd0, 0x3a, 0x82, 0x34, 0x38, 0x73, 0x16, 0xa2, 0x81,
+ 0x3c, 0x14, 0x23, 0x79, 0x81, 0x2b, 0xe8, 0x8f, 0xd6, 0x38, 0xdf, 0xa8,
+ 0x3f, 0x56, 0x89, 0xbe, 0x9a, 0xb0, 0x60, 0xd4, 0x3a, 0x98, 0x8f, 0x9d,
+ 0xd3, 0xf3, 0x8b, 0xb3, 0xaf, 0x2f, 0x8e, 0x86, 0xc3, 0xe4, 0xfd, 0xd1,
+ 0x25, 0xdb, 0xfa, 0x97, 0x0c, 0xbd, 0xbb, 0x46, 0xed, 0x68, 0xc4, 0x1a,
+ 0x94, 0x8c, 0x49, 0x21, 0x27, 0xea, 0x48, 0x40, 0xce, 0x13, 0x95, 0x44,
+ 0xc6, 0xed, 0xc8, 0x46, 0xfc, 0x54, 0x10, 0x7b, 0x37, 0xf0, 0xf6, 0x03,
+ 0xd3, 0x84, 0x80, 0xa4, 0x75, 0x9e, 0x3b, 0x37, 0x2a, 0x14, 0x63, 0x46,
+ 0x39, 0xd9, 0x9c, 0x43, 0xe7, 0x42, 0xa7, 0x2b, 0xdb, 0xfc, 0x89, 0xe1,
+ 0xfd, 0xd1, 0xcc, 0xa6, 0x94, 0x81, 0xfb, 0xa3, 0x31, 0x7e, 0x65, 0x53,
+ 0xfc, 0x31, 0xf9, 0xc1, 0xb4, 0x39, 0x31, 0xc6, 0xab, 0x94, 0xbc, 0x1d,
+ 0xa2, 0xd4, 0xad, 0xe3, 0x5a, 0xce, 0xbd, 0x62, 0xce, 0x09, 0xa7, 0x18,
+ 0x56, 0x8f, 0xd4, 0x99, 0x04, 0x57, 0x0c, 0x97, 0xd3, 0x15, 0x4c, 0x9d,
+ 0xfd, 0xb2, 0xd4, 0x1a, 0x4b, 0x92, 0x93, 0xec, 0x0a, 0x75, 0x58, 0xf0,
+ 0x39, 0xd3, 0xdc, 0x0e, 0x91, 0x52, 0xef, 0xbe, 0xa7, 0x1f, 0xed, 0x24,
+ 0xcf, 0x3e, 0x7f, 0xb9, 0xf3, 0x39, 0xff, 0x55, 0xff, 0xfb, 0xea, 0xf9,
+ 0x8e, 0xb0, 0xe3, 0x9b, 0x7f, 0x3d, 0xdf, 0x7f, 0xbe, 0xbb, 0x4f, 0x3c,
+ 0x8d, 0x3b, 0xfb, 0x3b, 0xe6, 0xff, 0x9e, 0xcb, 0x4f, 0x88, 0x8c, 0xf2,
+ 0xd5, 0xde, 0xe7, 0x9f, 0x01, 0x0d, 0x43, 0xfb, 0x63, 0x6a, 0x3e, 0xd2,
+ 0x6f, 0xca, 0x3e, 0xe8, 0xa2, 0xa0, 0xf9, 0xfc, 0xb1, 0xed, 0x89, 0xa4,
+ 0xf0, 0x3a, 0x95, 0xc1, 0xa6, 0x81, 0xdb, 0x1a, 0xa0, 0xea, 0x55, 0x65,
+ 0x0a, 0x1b, 0xbf, 0x72, 0xa1, 0x1d, 0x86, 0xbc, 0xcd, 0x95, 0xf4, 0xc0,
+ 0xbf, 0xd6, 0x7a, 0x87, 0x81, 0xe6, 0x1e, 0xd5, 0xdb, 0x2f, 0xfd, 0xb4,
+ 0x26, 0x92, 0xaf, 0x81, 0xc0, 0x4d, 0x96, 0x4a, 0xde, 0x1b, 0x6b, 0xb9,
+ 0x36, 0xbf, 0xb0, 0x74, 0xa7, 0x1a, 0xf3, 0x2f, 0xfd, 0x1e, 0x7b, 0xae,
+ 0xe8, 0x2d, 0xd9, 0x0d, 0x49, 0xf8, 0x35, 0x9b, 0x8b, 0x10, 0xf9, 0x56,
+ 0x6b, 0xf3, 0xac, 0xb9, 0xe5, 0x77, 0x33, 0xe5, 0xd5, 0x7a, 0xb6, 0x39,
+ 0x5c, 0x5c, 0x55, 0x39, 0x32, 0xe4, 0xa0, 0xb9, 0x0f, 0x73, 0xbf, 0xbd,
+ 0xa7, 0x34, 0xe7, 0x46, 0x84, 0x1d, 0x6c, 0x57, 0xae, 0xef, 0x2d, 0x4e,
+ 0xce, 0xc0, 0x36, 0x5b, 0x39, 0x53, 0x09, 0x42, 0x6d, 0x4d, 0x63, 0xbc,
+ 0x6a, 0xb7, 0x6c, 0x9f, 0xdf, 0x10, 0x9d, 0xd3, 0xe6, 0xc5, 0xa1, 0x5e,
+ 0x29, 0xae, 0x78, 0x7e, 0x5e, 0x77, 0x76, 0xf0, 0x29, 0xda, 0x8d, 0xde,
+ 0xf7, 0xe4, 0x1b, 0x38, 0x4f, 0xf6, 0xd0, 0xad, 0x1c, 0x9a, 0xc3, 0xd6,
+ 0x6b, 0xd1, 0x46, 0xc6, 0x71, 0x41, 0xf9, 0x8e, 0x1d, 0x49, 0xf7, 0x1c,
+ 0xe0, 0xeb, 0xb6, 0x39, 0xff, 0xf6, 0x99, 0x82, 0x07, 0x9c, 0xcb, 0x9d,
+ 0x10, 0xeb, 0x28, 0xd5, 0x72, 0xd8, 0x52, 0x11, 0xd6, 0xff, 0x83, 0x85,
+ 0x6d, 0xe1, 0x32, 0x63, 0x58, 0x1b, 0x35, 0x45, 0xf3, 0x39, 0xf5, 0x73,
+ 0x69, 0xad, 0xb4, 0x1b, 0xa5, 0x55, 0xab, 0x66, 0xc2, 0x1a, 0xd7, 0x08,
+ 0x31, 0xd7, 0xab, 0xb9, 0x2e, 0x90, 0xee, 0xc8, 0x7a, 0xc4, 0xbf, 0xac,
+ 0xad, 0x0d, 0xcf, 0x8f, 0x8e, 0xde, 0x26, 0x27, 0xc7, 0xef, 0x8f, 0x2f,
+ 0x3d, 0x2d, 0xdc, 0xde, 0x1e, 0xea, 0x69, 0xd5, 0xea, 0x71, 0x9d, 0xe9,
+ 0x70, 0xd4, 0xcb, 0xfc, 0x3d, 0xbd, 0xbf, 0x67, 0x99, 0x64, 0x51, 0x4c,
+ 0xbb, 0xef, 0xc1, 0xde, 0x06, 0xb3, 0x13, 0xd5, 0xe0, 0xf6, 0xb4, 0xb8,
+ 0xda, 0x68, 0x34, 0xa6, 0x77, 0x7d, 0x66, 0x17, 0xe8, 0xff, 0x45, 0x70,
+ 0x1a, 0x6d, 0x75, 0x49, 0x58, 0x64, 0x6d, 0x4a, 0x8f, 0x60, 0x5b, 0x3b,
+ 0xbd, 0xa2, 0xb9, 0xcd, 0x18, 0x5a, 0xed, 0xb9, 0xe5, 0x00, 0xdb, 0xbb,
+ 0xcf, 0xc0, 0x76, 0x30, 0xcb, 0x39, 0xd7, 0xd2, 0xc7, 0x14, 0xa3, 0x94,
+ 0x89, 0xdc, 0x78, 0x90, 0xe3, 0xfe, 0x17, 0xbd, 0xd3, 0x61, 0x01, 0xb5,
+ 0xfa, 0xad, 0x9a, 0xeb, 0xf1, 0x99, 0x09, 0x28, 0x92, 0x67, 0x3b, 0x36,
+ 0x5d, 0x61, 0x0e, 0x99, 0x23, 0xfa, 0x3d, 0x7d, 0x6c, 0x37, 0x31, 0x4a,
+ 0xc8, 0x82, 0x54, 0xf9, 0x6a, 0x51, 0x04, 0xd7, 0xdd, 0x5f, 0xf8, 0x5d,
+ 0x33, 0xfe, 0x97, 0x3b, 0xb8, 0xde, 0xae, 0xd2, 0xaa, 0x6f, 0xd4, 0xad,
+ 0x87, 0xbe, 0xba, 0x54, 0x79, 0x47, 0x08, 0xde, 0x98, 0xfd, 0x3d, 0x99,
+ 0xab, 0x73, 0xd9, 0x51, 0x11, 0x5d, 0xce, 0x49, 0x89, 0xb8, 0xe4, 0x54,
+ 0x0e, 0x00, 0x0d, 0x9d, 0x32, 0x7d, 0xd5, 0xc3, 0xe9, 0x14, 0x1c, 0xc7,
+ 0x30, 0xac, 0xab, 0xe8, 0x64, 0x14, 0x65, 0x20, 0x40, 0xac, 0x52, 0xab,
+ 0x39, 0x0d, 0x53, 0xc6, 0x12, 0xea, 0xd3, 0xb3, 0x64, 0xf7, 0x73, 0x1a,
+ 0xc7, 0xd3, 0xc6, 0xf3, 0xae, 0xac, 0xc6, 0x36, 0xa7, 0x18, 0x36, 0x82,
+ 0x97, 0x60, 0xca, 0x69, 0x11, 0xa8, 0xb9, 0xc6, 0xb3, 0xab, 0xa0, 0x58,
+ 0x80, 0xf6, 0xc8, 0x28, 0x91, 0x78, 0x3a, 0xdc, 0x51, 0x08, 0x70, 0xb3,
+ 0x5a, 0x44, 0x77, 0x8d, 0xcc, 0x8b, 0x57, 0xa1, 0xb4, 0xb2, 0x09, 0xa8,
+ 0x3c, 0x0d, 0xe4, 0x12, 0x31, 0x7b, 0xed, 0x3e, 0x9f, 0x40, 0x95, 0x76,
+ 0x5c, 0x73, 0x66, 0xbd, 0x78, 0xf3, 0x31, 0x56, 0x1a, 0x31, 0x4b, 0x04,
+ 0x3b, 0x6d, 0xcf, 0x44, 0x81, 0xa1, 0x69, 0x2d, 0xe1, 0x51, 0xd8, 0x84,
+ 0xfe, 0x40, 0xf9, 0xcd, 0x2e, 0x2e, 0x40, 0xf6, 0x13, 0x89, 0xe6, 0x75,
+ 0xf7, 0x15, 0xca, 0x15, 0x68, 0x9a, 0xa9, 0x3a, 0x13, 0xde, 0xdb, 0x8d,
+ 0xdd, 0x1e, 0x33, 0x31, 0xb5, 0x78, 0xc3, 0xde, 0xdd, 0x31, 0x4a, 0xeb,
+ 0xb4, 0x1c, 0x75, 0x4a, 0xd6, 0x87, 0x96, 0x28, 0x86, 0xd5, 0xc7, 0xec,
+ 0xec, 0xee, 0x7c, 0xbb, 0x7c, 0xd6, 0xc1, 0xa1, 0xbf, 0xf2, 0xe5, 0xbd,
+ 0xe7, 0x2b, 0x16, 0xed, 0xac, 0x82, 0x31, 0x9e, 0x29, 0x06, 0x12, 0x8a,
+ 0xa0, 0x8b, 0xbc, 0x04, 0xcb, 0x66, 0x36, 0x7e, 0x76, 0x9d, 0xa2, 0xf2,
+ 0xef, 0x8a, 0xde, 0x6b, 0x4e, 0x48, 0xa7, 0x2b, 0xef, 0x05, 0x95, 0xcd,
+ 0xbf, 0xac, 0xc9, 0x2d, 0x36, 0x07, 0xd3, 0x9e, 0xb3, 0x5d, 0x6d, 0x3a,
+ 0x39, 0x73, 0x33, 0x78, 0x6f, 0xb3, 0xe4, 0xec, 0xb5, 0x85, 0x84, 0xee,
+ 0x9e, 0x2a, 0xbb, 0x5e, 0x30, 0x13, 0x46, 0xc9, 0xb6, 0x3e, 0x11, 0x53,
+ 0xcb, 0x79, 0x35, 0xb2, 0x99, 0xe0, 0x43, 0xbc, 0x9f, 0x20, 0x78, 0xc7,
+ 0xa9, 0xaa, 0xac, 0x52, 0xbc, 0xb7, 0x73, 0x31, 0x90, 0x53, 0x76, 0x5c,
+ 0xce, 0xa4, 0xfa, 0x27, 0x1f, 0xaf, 0xc2, 0x4b, 0xec, 0x67, 0xe6, 0xc5,
+ 0x01, 0x32, 0x7d, 0x79, 0xa3, 0x58, 0x61, 0x4f, 0x69, 0x65, 0x14, 0x0d,
+ 0x6b, 0x38, 0x2c, 0x80, 0x06, 0x7a, 0xb2, 0x6b, 0xd1, 0x92, 0xfd, 0x14,
+ 0x49, 0xfc, 0x5a, 0x19, 0x30, 0x99, 0x29, 0x9f, 0x9c, 0xfd, 0x87, 0x67,
+ 0xa7, 0xef, 0x8e, 0xbf, 0xb6, 0x54, 0x46, 0x2c, 0xc4, 0x5b, 0x14, 0x1b,
+ 0xec, 0x3e, 0xf6, 0x23, 0xdd, 0x52, 0x54, 0x55, 0xd0, 0xb7, 0x46, 0x3c,
+ 0x7d, 0xf4, 0x7f, 0x00, 0x01, 0x52, 0x3c, 0x23, 0x07, 0x39, 0xf3, 0x7f,
+ 0xd4, 0x5b, 0xce, 0xdd, 0xd0, 0xa1, 0xaa, 0xe3, 0x2c, 0x8d, 0xb4, 0x6a,
+ 0x16, 0x73, 0x0b, 0x22, 0xf4, 0x8a, 0xb2, 0x0a, 0x8f, 0xb6, 0xa6, 0xa2,
+ 0x2f, 0xe6, 0x2c, 0x9a, 0x24, 0xa1, 0xb4, 0xe5, 0xcd, 0xe5, 0x3b, 0x80,
+ 0xdc, 0x09, 0xc2, 0xa5, 0x22, 0x17, 0x40, 0x80, 0xcb, 0x99, 0x12, 0xfb,
+ 0xa6, 0x8f, 0x97, 0xd7, 0xf8, 0xcd, 0x24, 0xad, 0x6f, 0x78, 0xa0, 0xb8,
+ 0x34, 0x72, 0x86, 0x69, 0x23, 0xd6, 0x96, 0x4e, 0xc8, 0x50, 0x77, 0x60,
+ 0x1c, 0x8b, 0xfe, 0x75, 0xf1, 0xa1, 0x3a, 0xd1, 0xac, 0x07, 0x8b, 0x4f,
+ 0xd2, 0x34, 0xd6, 0x14, 0xa1, 0x4a, 0xc4, 0x3a, 0xf1, 0x93, 0x37, 0x14,
+ 0x96, 0xd9, 0x27, 0x3e, 0xf9, 0x19, 0x13, 0xca, 0xf9, 0xe9, 0xa7, 0x22,
+ 0x25, 0x1d, 0xeb, 0xfb, 0xf1, 0x95, 0x97, 0xd1, 0xc6, 0x38, 0x41, 0xdd,
+ 0x74, 0xec, 0x23, 0x26, 0x07, 0xcb, 0xc6, 0x1f, 0x36, 0xfa, 0xf5, 0xc3,
+ 0x6c, 0x54, 0x4e, 0x35, 0xf1, 0xc2, 0x12, 0x48, 0xe8, 0x43, 0x7e, 0xc1,
+ 0xbc, 0x84, 0x23, 0xb5, 0x8d, 0xe7, 0x96, 0x74, 0x58, 0x29, 0xd7, 0x7f,
+ 0x2e, 0x66, 0x84, 0xf0, 0x90, 0x8e, 0x02, 0xdc, 0x3e, 0x24, 0xe3, 0xb3,
+ 0x62, 0x3c, 0x2d, 0x65, 0x57, 0x53, 0x82, 0x39, 0x66, 0xaa, 0x3d, 0x74,
+ 0x8a, 0xf8, 0x95, 0x0b, 0xf2, 0x70, 0xa0, 0x7e, 0x88, 0x51, 0x77, 0xd6,
+ 0x85, 0x51, 0x03, 0x03, 0xa4, 0xb7, 0xf9, 0x17, 0x82, 0xca, 0xf7, 0xf8,
+ 0x6d, 0xb8, 0xe0, 0x88, 0xe9, 0xea, 0x4f, 0xec, 0x50, 0xe4, 0xb8, 0xdf,
+ 0x5f, 0xf4, 0xe3, 0xfa, 0x68, 0x67, 0xea, 0xcd, 0x7e, 0x4a, 0xab, 0x6b,
+ 0x61, 0xe9, 0x93, 0x48, 0x1a, 0x8c, 0x44, 0x5b, 0xd6, 0xc6, 0x3a, 0x26,
+ 0x49, 0x29, 0xb1, 0xa8, 0x19, 0xa8, 0x4f, 0x0b, 0xce, 0x29, 0x94, 0x8c,
+ 0x2b, 0x76, 0x49, 0xda, 0x8d, 0xe8, 0x49, 0x9c, 0x3f, 0x58, 0x2c, 0x4a,
+ 0xea, 0xee, 0x32, 0xad, 0x4e, 0xe1, 0xfc, 0xb3, 0x72, 0x99, 0x79, 0xaf,
+ 0x91, 0x13, 0x0f, 0x96, 0x70, 0x26, 0x8e, 0x13, 0xfe, 0x94, 0x56, 0xba,
+ 0xd7, 0xfa, 0x91, 0xae, 0x09, 0xfe, 0xfd, 0x1b, 0xa9, 0x53, 0x66, 0xce,
+ 0xb3, 0x30, 0xa5, 0x08, 0x7d, 0xe0, 0xe7, 0x3b, 0xe2, 0x7e, 0x6b, 0x04,
+ 0xae, 0x5a, 0x27, 0x07, 0x17, 0x47, 0x46, 0xb3, 0xbd, 0x2e, 0xc0, 0x51,
+ 0x51, 0x34, 0x9a, 0x54, 0x97, 0x15, 0x52, 0x18, 0xad, 0xd0, 0xf3, 0x41,
+ 0x1f, 0xbc, 0xf7, 0xde, 0xa4, 0xcd, 0x24, 0xc0, 0x00, 0xce, 0xdf, 0x76,
+ 0x5b, 0x6e, 0xac, 0xbc, 0xc0, 0x90, 0x3a, 0x44, 0x93, 0xc0, 0x5b, 0x8a,
+ 0x42, 0x24, 0xe6, 0x53, 0xa5, 0x72, 0x02, 0x9f, 0x07, 0x62, 0xdd, 0x27,
+ 0x03, 0xd6, 0xb9, 0xc6, 0xa9, 0x76, 0xa9, 0x08, 0x7f, 0x53, 0x62, 0x4e,
+ 0xf9, 0x56, 0x2b, 0xec, 0xe9, 0xb6, 0x53, 0x2f, 0xee, 0x32, 0xfa, 0x1b,
+ 0xee, 0x19, 0xd2, 0x45, 0xba, 0x7a, 0x41, 0x66, 0x11, 0xf6, 0xec, 0xbd,
+ 0x9e, 0x78, 0xca, 0x2f, 0xa7, 0x00, 0x12, 0xc6, 0x9a, 0x1d, 0xd3, 0xc2,
+ 0x04, 0x24, 0x7e, 0x1d, 0x36, 0x07, 0x26, 0x72, 0x56, 0x69, 0x57, 0x10,
+ 0x5c, 0x78, 0x44, 0x6c, 0x49, 0xb7, 0xac, 0x00, 0xf8, 0xf2, 0x29, 0xea,
+ 0xdb, 0xfd, 0x83, 0x1d, 0xad, 0xeb, 0xc3, 0x9a, 0x57, 0x57, 0xdd, 0x2c,
+ 0xa9, 0xb2, 0xdb, 0x51, 0x2f, 0x06, 0xf4, 0x21, 0x88, 0x54, 0xc4, 0x4c,
+ 0xe9, 0x2f, 0xf8, 0x31, 0x50, 0x6f, 0x4a, 0x77, 0x0a, 0xa9, 0x63, 0x29,
+ 0xb4, 0x4a, 0x89, 0xa9, 0xba, 0x8e, 0x70, 0x60, 0x0f, 0x12, 0x7a, 0xe4,
+ 0xab, 0xc6, 0xfd, 0x6f, 0xb7, 0xb5, 0x9e, 0x35, 0xf9, 0x6f, 0x28, 0x81,
+ 0x58, 0x0f, 0x7c, 0x9d, 0xb5, 0x0a, 0x60, 0xdb, 0x4c, 0xa1, 0xf5, 0xfe,
+ 0xba, 0x99, 0x8b, 0x8d, 0xe9, 0xd4, 0x09, 0x7c, 0x7d, 0x8c, 0x56, 0x15,
+ 0x49, 0x75, 0x4e, 0x61, 0x12, 0xd9, 0x45, 0x45, 0x35, 0x1e, 0x5a, 0x29,
+ 0x0e, 0x54, 0xa6, 0x8e, 0x32, 0x80, 0x2c, 0xb1, 0x17, 0xd2, 0x44, 0x00,
+ 0x12, 0xb8, 0xcb, 0x6b, 0x0d, 0x3e, 0x9a, 0xbd, 0x3d, 0x66, 0x4c, 0x44,
+ 0xc3, 0x84, 0x04, 0x59, 0x33, 0xf6, 0xa6, 0x32, 0x1b, 0xdf, 0x94, 0x8c,
+ 0xa9, 0x35, 0x93, 0xe6, 0x65, 0x7a, 0xae, 0x27, 0xff, 0x4b, 0xf6, 0xc0,
+ 0xb7, 0x2e, 0x69, 0x8f, 0x36, 0xc2, 0x80, 0x79, 0x28, 0x07, 0x6e, 0x43,
+ 0x1c, 0xfd, 0x70, 0x79, 0x71, 0x90, 0x7c, 0x73, 0x74, 0xf0, 0xf6, 0xe8,
+ 0x62, 0xd8, 0xb9, 0xf4, 0x05, 0xfe, 0xc1, 0x1a, 0x1a, 0x39, 0x81, 0xa1,
+ 0x1a, 0x2b, 0xf1, 0x80, 0xe0, 0xf6, 0x55, 0xea, 0x99, 0xcd, 0x43, 0x07,
+ 0xc9, 0x9c, 0x0f, 0x32, 0x88, 0x38, 0x5a, 0x00, 0x02, 0xe3, 0x1a, 0xc2,
+ 0xc6, 0xb6, 0x31, 0x36, 0x12, 0x8a, 0x40, 0x0c, 0xea, 0x32, 0xf7, 0x33,
+ 0x66, 0x1c, 0x57, 0x9f, 0xbb, 0x4c, 0x26, 0xa5, 0x26, 0x03, 0xb6, 0x57,
+ 0xee, 0x1b, 0x97, 0xef, 0xed, 0x89, 0x2d, 0xb9, 0x64, 0xc4, 0x6b, 0xb8,
+ 0xfe, 0x43, 0xdf, 0x7c, 0xb7, 0x6f, 0x26, 0xbf, 0x4f, 0x64, 0x8e, 0x0f,
+ 0x59, 0xbd, 0xde, 0x71, 0x01, 0xb6, 0x3f, 0xbf, 0xc6, 0x95, 0x98, 0x82,
+ 0x93, 0xf4, 0x4d, 0xb4, 0x25, 0x3a, 0x5d, 0x53, 0xaa, 0x8f, 0xd4, 0xb5,
+ 0x20, 0x70, 0xa9, 0x7a, 0x4a, 0xb2, 0x9c, 0xa0, 0x20, 0xbd, 0x45, 0x00,
+ 0x4a, 0xce, 0xcc, 0x14, 0x3c, 0x18, 0x3a, 0x22, 0x43, 0x80, 0xae, 0x63,
+ 0xce, 0x1e, 0x5f, 0xea, 0x53, 0xe6, 0x5a, 0x66, 0x8f, 0x99, 0xe9, 0x96,
+ 0x3c, 0xe4, 0xdf, 0x0f, 0x08, 0x80, 0x08, 0x06, 0xbf, 0x6e, 0xc5, 0x47,
+ 0xc5, 0x19, 0x2a, 0x34, 0xdc, 0xd2, 0x1c, 0xf5, 0xc1, 0xee, 0x79, 0x85,
+ 0xee, 0xd3, 0x27, 0xb5, 0x42, 0x88, 0xbc, 0xcb, 0x28, 0x30, 0x32, 0xea,
+ 0xe1, 0xdf, 0xe4, 0xba, 0xb3, 0x5c, 0x7c, 0x92, 0x05, 0x9b, 0x97, 0x0b,
+ 0xe4, 0x6f, 0x66, 0x94, 0x66, 0x03, 0x7a, 0xdc, 0x3e, 0x97, 0x25, 0xdf,
+ 0x94, 0x35, 0xee, 0x82, 0xf0, 0x71, 0xba, 0xe4, 0x63, 0xd3, 0x8f, 0x37,
+ 0x24, 0xbe, 0x65, 0x49, 0x62, 0xd7, 0xd6, 0x34, 0xa5, 0xea, 0xfc, 0xe0,
+ 0xf2, 0x1b, 0x44, 0x57, 0xb1, 0x85, 0xdf, 0x82, 0x31, 0x45, 0x63, 0x6a,
+ 0x61, 0x4a, 0x96, 0x35, 0xe0, 0x58, 0xff, 0x55, 0x62, 0x46, 0xd5, 0x27,
+ 0x11, 0xbd, 0xcb, 0x19, 0x88, 0x34, 0xe5, 0x5a, 0xbf, 0x90, 0xd1, 0xad,
+ 0x4a, 0x8c, 0x80, 0xbe, 0xdb, 0x7c, 0x3b, 0x8b, 0xb7, 0xdc, 0xe0, 0x44,
+ 0xf8, 0x0d, 0x1e, 0x13, 0x36, 0x3d, 0x29, 0x73, 0x6b, 0x49, 0x9b, 0x79,
+ 0x18, 0xbf, 0xa0, 0x4c, 0x67, 0x0e, 0x40, 0x4d, 0xca, 0x38, 0xef, 0xa1,
+ 0x77, 0xa4, 0xbf, 0x9c, 0x3d, 0x0c, 0x42, 0x02, 0x9e, 0xe4, 0xab, 0x45,
+ 0xd3, 0x16, 0x2b, 0x1d, 0xfe, 0x63, 0xab, 0x59, 0x56, 0x65, 0xd9, 0x78,
+ 0x7d, 0x80, 0xf6, 0x93, 0x36, 0x72, 0xa2, 0x99, 0xe0, 0x92, 0xfb, 0x42,
+ 0x4d, 0x15, 0xa2, 0x77, 0xfb, 0x8a, 0x61, 0x3a, 0xaa, 0xcb, 0xe9, 0xa2,
+ 0xf1, 0xd0, 0xd7, 0xbf, 0xac, 0xcf, 0x5e, 0xa7, 0x37, 0x8f, 0x07, 0x4a,
+ 0xf6, 0x59, 0x30, 0x45, 0x9d, 0xb1, 0xf4, 0x8d, 0x7a, 0x89, 0x60, 0x63,
+ 0x55, 0x16, 0xed, 0x1a, 0x70, 0x00, 0x7a, 0x6f, 0xad, 0xad, 0x0d, 0x75,
+ 0xb1, 0x89, 0xee, 0x35, 0x5c, 0xf4, 0xef, 0xa1, 0x4d, 0x52, 0x1f, 0x38,
+ 0x58, 0x30, 0x36, 0x7f, 0x51, 0x12, 0xb8, 0x8c, 0xd7, 0x14, 0x22, 0x9c,
+ 0xd7, 0x38, 0xaf, 0xdb, 0x83, 0xc2, 0xaf, 0x6c, 0xb8, 0x42, 0xf3, 0xcb,
+ 0x2e, 0x4b, 0xe5, 0xe4, 0x97, 0x70, 0x9d, 0xdb, 0x10, 0xad, 0x6c, 0xf8,
+ 0x28, 0xc3, 0x34, 0x5d, 0x02, 0x5a, 0x41, 0xda, 0xc2, 0x71, 0xa9, 0x93,
+ 0xdb, 0xff, 0x7b, 0x3b, 0xe9, 0x71, 0x75, 0x82, 0x08, 0x69, 0xcf, 0x22,
+ 0xf9, 0xff, 0x00, 0x78, 0x25, 0xf4, 0xbe, 0xd4, 0xe6, 0xa0, 0x4d, 0x20,
+ 0x3b, 0x30, 0x26, 0xd4, 0x4d, 0x35, 0x76, 0xbb, 0xdf, 0x68, 0x07, 0xd9,
+ 0x3d, 0xd9, 0x2f, 0x6a, 0x23, 0x08, 0x5d, 0x08, 0x17, 0x71, 0xb6, 0x04,
+ 0x4c, 0xa0, 0xdb, 0xb8, 0xb2, 0x5e, 0x3d, 0xaa, 0xa7, 0xca, 0x55, 0x47,
+ 0x59, 0xad, 0x47, 0x39, 0x25, 0x0d, 0x9b, 0xae, 0x25, 0x2d, 0xbb, 0x9d,
+ 0xca, 0x11, 0xf2, 0x9f, 0x9a, 0x74, 0x24, 0xc0, 0x2e, 0xd9, 0xfe, 0x5e,
+ 0x89, 0x3e, 0xaf, 0xd8, 0xb1, 0x22, 0x4e, 0x19, 0x4d, 0xa7, 0xe1, 0x48,
+ 0xed, 0xa4, 0x6a, 0x01, 0x14, 0xad, 0x04, 0xad, 0xa5, 0x30, 0x8f, 0x10,
+ 0x92, 0x8c, 0x38, 0x8c, 0x39, 0x69, 0x9b, 0x8a, 0x49, 0xaa, 0x25, 0xa3,
+ 0x57, 0xaa, 0xa6, 0x71, 0xd8, 0x95, 0x72, 0xdd, 0x97, 0xbb, 0x1f, 0x49,
+ 0xf8, 0x88, 0xcc, 0x51, 0xf9, 0x4c, 0x5f, 0x25, 0xd0, 0x21, 0x49, 0x3d,
+ 0x5f, 0x06, 0x6f, 0xf8, 0x80, 0x14, 0x87, 0xd8, 0xbc, 0xa6, 0x2c, 0x0f,
+ 0x71, 0x49, 0x09, 0x97, 0x09, 0xfc, 0x5f, 0x37, 0xb9, 0xe0, 0x4a, 0x79,
+ 0xd6, 0xdb, 0x35, 0x54, 0xe1, 0xe1, 0x23, 0x48, 0x81, 0x8b, 0xaa, 0x5a,
+ 0xe0, 0xc3, 0x20, 0x3c, 0x30, 0x03, 0xcb, 0xaa, 0x2a, 0x97, 0xc8, 0xb1,
+ 0x9f, 0x53, 0xce, 0x28, 0x0c, 0x8b, 0x75, 0x7e, 0xe2, 0xd7, 0xfd, 0x4f,
+ 0x12, 0x88, 0xb5, 0x48, 0x38, 0x81, 0x44, 0xa8, 0xe2, 0xe8, 0x42, 0xd9,
+ 0xdb, 0x85, 0x61, 0xca, 0x98, 0x0d, 0xf0, 0x94, 0x6a, 0x0b, 0xca, 0x97,
+ 0xd6, 0x9d, 0xfc, 0xad, 0x9e, 0xcc, 0x92, 0xcd, 0xb8, 0x97, 0x10, 0x33,
+ 0xeb, 0x85, 0x5e, 0xdc, 0xa9, 0x55, 0x04, 0x8e, 0xb3, 0xb8, 0xeb, 0xa6,
+ 0x5a, 0x8c, 0x9b, 0xa0, 0x7c, 0x69, 0x2b, 0x34, 0x6f, 0xe7, 0xb8, 0xf4,
+ 0x6d, 0xfb, 0xe3, 0x73, 0x31, 0xef, 0xd9, 0xfa, 0xa0, 0x9e, 0x6d, 0xa6,
+ 0xad, 0x24, 0x17, 0x7e, 0x79, 0x2d, 0x69, 0x7d, 0x77, 0xcb, 0xee, 0xb2,
+ 0xfe, 0xb9, 0xcd, 0xa8, 0x6f, 0xd3, 0x1f, 0x21, 0x3b, 0xc1, 0xbb, 0x7b,
+ 0x45, 0x11, 0x83, 0xe2, 0x51, 0x25, 0x42, 0xbe, 0x08, 0xb5, 0x86, 0x5c,
+ 0x96, 0x6b, 0x96, 0x20, 0xd1, 0x74, 0xa9, 0x2f, 0x50, 0x55, 0x8e, 0xfe,
+ 0x6e, 0x9b, 0x89, 0xd4, 0x4a, 0x3f, 0xb6, 0xc4, 0x55, 0xed, 0x48, 0x16,
+ 0x3b, 0x38, 0x55, 0x50, 0x34, 0x59, 0xfd, 0x50, 0xc8, 0xe2, 0x64, 0xfe,
+ 0x06, 0xc9, 0x5b, 0x39, 0x14, 0xf2, 0x85, 0xae, 0x3a, 0x11, 0xde, 0x8d,
+ 0xe7, 0x4c, 0x85, 0x12, 0xec, 0xa3, 0xb7, 0xea, 0x53, 0x85, 0xc8, 0xc1,
+ 0xdc, 0x90, 0x65, 0xa3, 0x8b, 0x64, 0xe6, 0x55, 0x3f, 0x61, 0xba, 0x40,
+ 0x23, 0xde, 0x98, 0x66, 0x3b, 0x1b, 0x5e, 0x8d, 0xae, 0x4d, 0x06, 0xfd,
+ 0x97, 0xb0, 0x7e, 0x2c, 0x59, 0x21, 0x7b, 0x2f, 0x08, 0xdc, 0xb6, 0x15,
+ 0xe9, 0x8a, 0x69, 0xe2, 0x97, 0x76, 0x66, 0xf7, 0xd5, 0xde, 0x60, 0xf7,
+ 0xe5, 0xe7, 0x83, 0x9d, 0xc1, 0xee, 0x0e, 0xc9, 0x17, 0xea, 0x8a, 0xd7,
+ 0x39, 0x9e, 0x97, 0xc8, 0xa7, 0x5a, 0xef, 0x85, 0xdf, 0x3c, 0x3d, 0xba,
+ 0xfc, 0xfe, 0xec, 0xe2, 0xdb, 0xe4, 0xf8, 0xf4, 0xf2, 0xe8, 0xe2, 0xdd,
+ 0xc1, 0xe1, 0x53, 0x09, 0xfb, 0x7d, 0xb7, 0xb5, 0x57, 0xb3, 0x3c, 0x73,
+ 0x13, 0x13, 0xfa, 0x06, 0xdd, 0x9c, 0x65, 0xcd, 0xcd, 0xce, 0xfe, 0xee,
+ 0x4a, 0x4a, 0xea, 0x88, 0x7b, 0xd0, 0xbd, 0xaf, 0x83, 0xda, 0xa5, 0x41,
+ 0x2d, 0x6f, 0xc5, 0x52, 0x33, 0x0e, 0x19, 0x5b, 0x65, 0x71, 0xb9, 0x10,
+ 0xf3, 0xa8, 0x82, 0x04, 0x46, 0x56, 0x11, 0xec, 0x23, 0x26, 0xbf, 0xe5,
+ 0xf4, 0x5a, 0x21, 0x99, 0x11, 0x0c, 0xba, 0xc8, 0xdc, 0x35, 0xae, 0x0f,
+ 0xde, 0x88, 0x3b, 0x85, 0xe9, 0x6c, 0x27, 0x50, 0xf1, 0x54, 0x2a, 0x4b,
+ 0xee, 0x1a, 0xed, 0x16, 0xa9, 0x50, 0xca, 0x84, 0x83, 0x13, 0x9b, 0x27,
+ 0x62, 0x59, 0x08, 0x00, 0x7d, 0x50, 0x3d, 0x1d, 0x7d, 0x6d, 0x97, 0x78,
+ 0xf7, 0xe1, 0xb3, 0x1d, 0xee, 0xd5, 0x5a, 0x71, 0xcd, 0x18, 0x58, 0xcb,
+ 0x35, 0x7a, 0x28, 0x1d, 0xc1, 0x69, 0xf0, 0x7a, 0xc3, 0x9f, 0x82, 0x42,
+ 0x45, 0x24, 0x69, 0xa0, 0x87, 0x6c, 0x31, 0x24, 0xf3, 0x1d, 0x85, 0xdc,
+ 0x09, 0xd6, 0xff, 0xb4, 0xac, 0x05, 0xb5, 0x5e, 0xb7, 0x48, 0x0a, 0x13,
+ 0xae, 0x4c, 0xe5, 0xbf, 0xce, 0xaa, 0x36, 0xd0, 0x99, 0x93, 0x2a, 0xbd,
+ 0x47, 0x79, 0x95, 0xdc, 0x51, 0x8e, 0xae, 0x25, 0xad, 0xf2, 0x5a, 0xa4,
+ 0x38, 0xb9, 0x39, 0x4f, 0xce, 0x8f, 0xde, 0xf7, 0xb5, 0xc0, 0xb1, 0xf9,
+ 0x3b, 0x3b, 0xa3, 0x94, 0x5f, 0x92, 0x73, 0x7b, 0xe6, 0x59, 0xa1, 0x58,
+ 0x1a, 0xc8, 0x44, 0x01, 0xff, 0xf8, 0x03, 0xa0, 0x43, 0x63, 0x19, 0x28,
+ 0x05, 0x32, 0xaa, 0x98, 0x4b, 0xce, 0x2d, 0xec, 0xd2, 0x72, 0xd2, 0x7a,
+ 0x0a, 0x60, 0x39, 0xd9, 0xb4, 0x20, 0x5d, 0xfa, 0x1e, 0x90, 0xa8, 0x40,
+ 0x0d, 0x58, 0x98, 0x40, 0xa9, 0x99, 0xd7, 0xe7, 0xdf, 0x1e, 0x0e, 0xff,
+ 0xb0, 0xbb, 0x27, 0xdd, 0xd9, 0x52, 0xab, 0x80, 0x64, 0x55, 0x37, 0x29,
+ 0x1f, 0xe2, 0xda, 0xef, 0xa3, 0xa6, 0x58, 0xe3, 0x80, 0x63, 0x31, 0x36,
+ 0x6d, 0x62, 0xd0, 0x56, 0x2b, 0x33, 0x08, 0xc8, 0xaf, 0x07, 0xab, 0x62,
+ 0xda, 0xa2, 0xbd, 0x14, 0x12, 0x41, 0x79, 0x27, 0x29, 0xb0, 0xd4, 0x58,
+ 0xa8, 0x5f, 0x5a, 0xe8, 0x8f, 0xb8, 0x65, 0x69, 0x0d, 0x39, 0xe4, 0x0e,
+ 0xce, 0xd2, 0x5d, 0x73, 0x9a, 0x6f, 0xf7, 0x5b, 0xe2, 0x89, 0x95, 0x9b,
+ 0x5d, 0x09, 0x81, 0xdc, 0x67, 0x70, 0x00, 0x04, 0xbd, 0x3e, 0xd1, 0x12,
+ 0x6e, 0x85, 0xab, 0x83, 0x42, 0x4f, 0x9f, 0x99, 0x85, 0x32, 0x27, 0x8b,
+ 0x79, 0x1b, 0x48, 0x28, 0x94, 0x53, 0x32, 0x5d, 0xec, 0x23, 0x6f, 0x2b,
+ 0x2a, 0x1d, 0x33, 0x67, 0x1c, 0xe9, 0xe9, 0x20, 0xf9, 0x26, 0x2b, 0x28,
+ 0x71, 0x9e, 0x10, 0x77, 0x9a, 0x7b, 0x05, 0x5c, 0x20, 0xd5, 0x90, 0x44,
+ 0x4d, 0xbd, 0x93, 0x2c, 0x15, 0x4e, 0x4e, 0x23, 0xeb, 0x6a, 0xb6, 0x70,
+ 0xb5, 0x9e, 0x54, 0x4a, 0xe8, 0x3c, 0x21, 0x10, 0xb5, 0x64, 0x17, 0x4c,
+ 0x12, 0x4d, 0x0d, 0x6c, 0xb6, 0x89, 0x35, 0x51, 0x12, 0x01, 0xcd, 0xc9,
+ 0x31, 0x47, 0xac, 0x49, 0xbc, 0xca, 0x37, 0xa0, 0xd3, 0x26, 0x6f, 0x21,
+ 0x5b, 0x5c, 0x4e, 0xa8, 0x4c, 0xaa, 0x1b, 0x72, 0x7d, 0xd4, 0xe6, 0xba,
+ 0x49, 0x8b, 0xf1, 0xc3, 0x60, 0x62, 0x74, 0x59, 0x72, 0x9e, 0x0d, 0x16,
+ 0xb7, 0xdb, 0xde, 0x31, 0x25, 0x91, 0x7f, 0xc3, 0x1c, 0x01, 0x6d, 0xc7,
+ 0xb7, 0x16, 0x2a, 0x0e, 0xa9, 0xc3, 0xd2, 0xd6, 0x99, 0xa0, 0x2d, 0xa1,
+ 0xd9, 0xfe, 0x7c, 0x3c, 0x97, 0x92, 0x6c, 0x1d, 0x25, 0x96, 0xe1, 0x98,
+ 0x5a, 0x18, 0xcc, 0xb3, 0xd9, 0xbe, 0xcd, 0x46, 0x56, 0xf9, 0x20, 0x55,
+ 0x35, 0xac, 0x61, 0xe1, 0x39, 0x69, 0x8b, 0xec, 0x7a, 0x2a, 0x0a, 0x85,
+ 0x6f, 0xba, 0xd8, 0x26, 0x22, 0x29, 0x20, 0x6c, 0xf0, 0x48, 0xb5, 0x23,
+ 0x68, 0xec, 0x66, 0x1f, 0x36, 0x02, 0xa9, 0xe5, 0x87, 0x2b, 0x52, 0xe8,
+ 0x5d, 0x23, 0xc2, 0x1c, 0x02, 0xb2, 0x65, 0x52, 0x86, 0xc5, 0xc5, 0xa3,
+ 0x48, 0x24, 0x09, 0x3f, 0x11, 0x11, 0x2c, 0x76, 0x08, 0x68, 0xdc, 0x05,
+ 0x15, 0x8d, 0xe0, 0xa7, 0xd6, 0x03, 0xe6, 0xb3, 0x62, 0x7e, 0x7d, 0xf7,
+ 0x8c, 0x3c, 0xde, 0x97, 0x27, 0x43, 0x8d, 0x8a, 0x14, 0xd9, 0xbd, 0xb7,
+ 0xb5, 0xb8, 0xf4, 0x80, 0xec, 0x3f, 0x72, 0x00, 0x31, 0xa5, 0x32, 0xd8,
+ 0x0e, 0xd0, 0x13, 0x96, 0x0a, 0x2e, 0x4c, 0xe6, 0x92, 0x1f, 0x74, 0x12,
+ 0x04, 0x46, 0x4c, 0x5d, 0xd1, 0xd2, 0x65, 0xac, 0x0c, 0x59, 0xa6, 0x17,
+ 0xe2, 0xee, 0x33, 0xca, 0xd2, 0xb3, 0x5e, 0xd2, 0xdf, 0x03, 0x7f, 0xce,
+ 0x6e, 0x7b, 0x12, 0xd3, 0x86, 0x69, 0x02, 0xa9, 0x0d, 0xd3, 0x92, 0xb6,
+ 0x22, 0xe2, 0x60, 0x53, 0xb6, 0xf4, 0x9d, 0x79, 0x9f, 0xfe, 0xd8, 0x93,
+ 0x01, 0xdd, 0xed, 0x02, 0xb1, 0xcd, 0xbc, 0x95, 0xd3, 0x87, 0x50, 0x65,
+ 0xd8, 0x5b, 0xb9, 0xaa, 0xc8, 0x8d, 0xb8, 0xcf, 0x2d, 0x81, 0x34, 0x17,
+ 0x4d, 0x80, 0x2b, 0x54, 0x28, 0x41, 0xb5, 0x03, 0x66, 0x0a, 0xc5, 0xc9,
+ 0x5d, 0x24, 0x77, 0x7b, 0x1a, 0x6b, 0xa6, 0xdf, 0xe8, 0xbc, 0xb1, 0xb3,
+ 0xde, 0x09, 0x91, 0x20, 0x6d, 0x91, 0x50, 0x6e, 0xde, 0xae, 0xa5, 0xac,
+ 0x27, 0xb3, 0x67, 0x8d, 0x14, 0x69, 0x49, 0x99, 0xb2, 0x10, 0xb7, 0x02,
+ 0xa7, 0xbc, 0x33, 0x1f, 0x3d, 0x19, 0xf0, 0x1e, 0xcc, 0x09, 0xc8, 0x6f,
+ 0x0f, 0x11, 0x79, 0x5c, 0xd8, 0x44, 0x09, 0x71, 0xe5, 0x83, 0xa2, 0x0f,
+ 0xcb, 0x7f, 0x93, 0xb3, 0x63, 0x02, 0x58, 0x53, 0x5c, 0xe7, 0xe6, 0xe4,
+ 0x6f, 0x24, 0xe6, 0x30, 0x2d, 0x48, 0xe2, 0x37, 0xb6, 0x8e, 0xda, 0x90,
+ 0xa9, 0x3d, 0x37, 0x7c, 0x31, 0xd7, 0xff, 0x82, 0x86, 0x52, 0x6f, 0xb8,
+ 0xb1, 0x0b, 0xc5, 0x79, 0x7b, 0x20, 0x12, 0xe7, 0xd0, 0xca, 0x61, 0xe7,
+ 0x95, 0x16, 0x47, 0xdf, 0x38, 0xfa, 0x44, 0x3a, 0xce, 0x86, 0x7c, 0x89,
+ 0x7f, 0xcd, 0x39, 0xfd, 0x98, 0xa3, 0xf3, 0xe3, 0x53, 0x2e, 0xf7, 0x6d,
+ 0xcf, 0x42, 0x46, 0xd4, 0x8b, 0x6b, 0x5c, 0x57, 0x1e, 0xfd, 0x49, 0x95,
+ 0x03, 0x9e, 0x1d, 0x47, 0xb4, 0x67, 0x68, 0x8f, 0xe7, 0xf2, 0xad, 0x8b,
+ 0x05, 0x7f, 0x7d, 0x83, 0xee, 0xb9, 0xba, 0x9e, 0x6e, 0x74, 0xca, 0xd8,
+ 0xda, 0x35, 0xe9, 0x5c, 0x28, 0xd6, 0x23, 0x35, 0x9e, 0x38, 0x05, 0x1f,
+ 0x65, 0xba, 0xa9, 0x95, 0x96, 0x9c, 0xeb, 0x75, 0x32, 0x1d, 0x7d, 0x57,
+ 0xf8, 0x1f, 0x92, 0xc1, 0xb6, 0xf9, 0x60, 0xbd, 0xad, 0x2f, 0xce, 0x6f,
+ 0xc7, 0xb5, 0xb9, 0xe1, 0x28, 0xad, 0xf7, 0x47, 0x18, 0xe4, 0x58, 0x0e,
+ 0xd3, 0xe3, 0xc9, 0xcf, 0x49, 0x7f, 0x3c, 0xc5, 0xf8, 0x12, 0x14, 0xcb,
+ 0xfe, 0xd1, 0xac, 0x3c, 0x3d, 0xf1, 0xb3, 0x5d, 0xc3, 0x77, 0x39, 0x9d,
+ 0xb7, 0x4f, 0x3d, 0x1d, 0xfa, 0x19, 0x1b, 0x0c, 0xcc, 0x6f, 0x9b, 0x1c,
+ 0x4c, 0xee, 0x28, 0xe9, 0x6e, 0x22, 0xff, 0xa4, 0xf1, 0x1c, 0x15, 0x28,
+ 0x35, 0x8a, 0x91, 0xa6, 0x23, 0xae, 0x2c, 0xfe, 0x5d, 0x6e, 0x8c, 0x8e,
+ 0xc3, 0x8e, 0x7e, 0x41, 0xf9, 0x7f, 0xd4, 0x41, 0xbc, 0xe5, 0xfd, 0x52,
+ 0x93, 0x39, 0x7a, 0x92, 0xb3, 0xe0, 0xa0, 0xa5, 0x24, 0x9d, 0x69, 0xe9,
+ 0x06, 0xc9, 0x57, 0x14, 0xe3, 0xac, 0x32, 0x8f, 0xfd, 0x55, 0x2e, 0x3e,
+ 0x2e, 0xc9, 0x47, 0x8b, 0x91, 0x32, 0xff, 0xc4, 0xc0, 0x8e, 0x24, 0xc8,
+ 0x81, 0xb1, 0x63, 0xb2, 0xbf, 0x69, 0x0f, 0x0e, 0xfd, 0xd2, 0x94, 0x76,
+ 0x33, 0x14, 0xcd, 0x97, 0x48, 0x82, 0xa1, 0x78, 0xbc, 0x94, 0xdc, 0x43,
+ 0xbe, 0x30, 0x27, 0x99, 0x26, 0xf6, 0x97, 0x3e, 0x9b, 0x8a, 0x7a, 0x8e,
+ 0xd1, 0x94, 0x6a, 0x04, 0x76, 0x4b, 0xe0, 0x0e, 0x77, 0xbd, 0x3e, 0xbc,
+ 0x31, 0xa2, 0x39, 0xb3, 0x5d, 0x1d, 0xb2, 0x4b, 0x4f, 0xbb, 0x38, 0xa4,
+ 0x3b, 0x4a, 0x17, 0xc1, 0xfe, 0x52, 0xb3, 0x23, 0xa1, 0x85, 0x6e, 0xb3,
+ 0xec, 0xb2, 0x7b, 0x97, 0x67, 0xb7, 0x3d, 0x04, 0x4a, 0x6a, 0x1c, 0x7e,
+ 0x78, 0x4f, 0xa5, 0x4d, 0x50, 0x81, 0xfa, 0xf2, 0xe2, 0xe0, 0x74, 0xf8,
+ 0x8e, 0x5d, 0xe3, 0x97, 0xa5, 0x57, 0xda, 0x5a, 0xe2, 0x0a, 0x1a, 0x3f,
+ 0xb6, 0x34, 0x71, 0xf7, 0x5c, 0x6f, 0x43, 0xf1, 0xf4, 0x52, 0xf7, 0xba,
+ 0xd7, 0xe5, 0xdb, 0xe7, 0xa2, 0xd9, 0x34, 0x1b, 0xd4, 0xb5, 0xcd, 0xe1,
+ 0x96, 0x55, 0x84, 0x6a, 0xbf, 0x28, 0x9b, 0xab, 0x3a, 0xaf, 0xcc, 0xd0,
+ 0xf2, 0x10, 0x4d, 0xcb, 0xa1, 0x76, 0x46, 0x7f, 0xca, 0x77, 0xef, 0x52,
+ 0x32, 0xd2, 0x43, 0x63, 0x2a, 0xf6, 0xa5, 0x52, 0x8d, 0xe3, 0x63, 0x73,
+ 0xee, 0x54, 0xbe, 0x7b, 0x85, 0xca, 0xcf, 0x36, 0xee, 0xe7, 0x7d, 0x6a,
+ 0xd3, 0x9b, 0xff, 0xb6, 0xbb, 0x15, 0x6f, 0xfe, 0xf2, 0x97, 0x36, 0x1f,
+ 0xef, 0xbb, 0xda, 0x66, 0x2e, 0xa5, 0x68, 0xf3, 0xdf, 0xf6, 0xb6, 0x56,
+ 0x8e, 0xc8, 0xcf, 0x8a, 0x74, 0xdf, 0x34, 0x6f, 0x50, 0x67, 0x93, 0x37,
+ 0x7c, 0xcc, 0xac, 0xce, 0x64, 0x11, 0x3a, 0x1e, 0xdf, 0x70, 0x8b, 0xb0,
+ 0x83, 0x60, 0xdb, 0x56, 0x53, 0x77, 0x81, 0x37, 0xc9, 0x2e, 0x39, 0xfe,
+ 0x9f, 0x47, 0x3e, 0x8d, 0x64, 0xb1, 0xd1, 0xf8, 0x57, 0x14, 0xb1, 0x03,
+ 0xd4, 0xe5, 0x00, 0xdf, 0xde, 0x5b, 0xf1, 0x6d, 0x37, 0x3a, 0xcf, 0x2d,
+ 0x41, 0x51, 0x6c, 0x82, 0xc1, 0x29, 0x1b, 0xb6, 0x7c, 0xc7, 0x7e, 0x7b,
+ 0xd5, 0xf7, 0x2e, 0x8f, 0xdf, 0x1f, 0x11, 0x6b, 0xf6, 0xdb, 0x63, 0x22,
+ 0x9f, 0x1b, 0x0a, 0xfd, 0xa3, 0x7a, 0x20, 0x2c, 0x23, 0xaf, 0x5f, 0x2d,
+ 0x85, 0xc3, 0xbb, 0x16, 0x6d, 0x66, 0x25, 0x87, 0x5d, 0x09, 0xfa, 0xb4,
+ 0x60, 0xa0, 0x6b, 0xcd, 0xb4, 0x3c, 0xbe, 0xea, 0xbf, 0x2f, 0x27, 0xb0,
+ 0x92, 0xfb, 0x43, 0x40, 0x05, 0xcd, 0x5b, 0xe6, 0x87, 0x1f, 0x8a, 0x59,
+ 0xeb, 0xc7, 0x83, 0x48, 0xa6, 0xee, 0xda, 0xb2, 0xa2, 0x3c, 0x7f, 0xdf,
+ 0xee, 0xf7, 0xa9, 0x33, 0x7d, 0x86, 0x75, 0x49, 0x70, 0xa7, 0xc5, 0xcf,
+ 0xa1, 0xa2, 0xc5, 0x4c, 0x50, 0x3e, 0x7d, 0x60, 0x20, 0x42, 0xea, 0xe0,
+ 0x63, 0x2e, 0x7b, 0xf3, 0x9a, 0x32, 0xc8, 0x9c, 0x8b, 0x8f, 0x9d, 0x78,
+ 0x6b, 0x3e, 0x79, 0x29, 0x0c, 0xa9, 0xec, 0xde, 0xe1, 0x9f, 0xa4, 0xfc,
+ 0x72, 0x39, 0x7f, 0xc0, 0x28, 0xef, 0x5b, 0xd0, 0x8a, 0x68, 0x7c, 0xf5,
+ 0xef, 0xfc, 0x4e, 0xab, 0x0c, 0x95, 0x70, 0x4c, 0x7b, 0x3b, 0x50, 0x7e,
+ 0x22, 0x55, 0x9b, 0xce, 0x2a, 0xef, 0xba, 0x92, 0x6e, 0x6b, 0x75, 0x3b,
+ 0x8f, 0xd8, 0xd4, 0xe3, 0x61, 0x6d, 0xf7, 0xd3, 0x27, 0x81, 0x2d, 0x29,
+ 0xf5, 0xf5, 0x6d, 0x69, 0x83, 0x63, 0x46, 0xec, 0xcc, 0xdb, 0x05, 0x8e,
+ 0xb3, 0x44, 0x93, 0xbc, 0x39, 0x87, 0x7f, 0xa3, 0xbf, 0x81, 0xba, 0x0c,
+ 0x79, 0x11, 0x19, 0x4c, 0xff, 0x97, 0x8f, 0x26, 0x08, 0xbd, 0x26, 0xeb,
+ 0x57, 0x44, 0x84, 0x41, 0x71, 0xac, 0x75, 0xee, 0x00, 0xf3, 0xc4, 0xf0,
+ 0xe6, 0x32, 0x17, 0x04, 0xc9, 0x35, 0x35, 0x24, 0xd9, 0xa8, 0xb6, 0xc8,
+ 0x58, 0xeb, 0x24, 0x67, 0xaf, 0x24, 0x09, 0xd2, 0xc5, 0x7c, 0x02, 0x50,
+ 0x06, 0xc3, 0x51, 0xff, 0x83, 0x48, 0xb1, 0xab, 0x87, 0x64, 0x77, 0xaf,
+ 0x97, 0xec, 0xed, 0xec, 0xee, 0x45, 0xc6, 0xb0, 0xfe, 0x1f, 0x04, 0x8a,
+ 0xda, 0xc3, 0xaf, 0xd7, 0x9f, 0x3a, 0x0a, 0x97, 0xcf, 0x80, 0x9b, 0x44,
+ 0x32, 0x7f, 0x8d, 0xf0, 0xa1, 0xf8, 0x2c, 0x88, 0x98, 0x51, 0xf5, 0x18,
+ 0x74, 0x76, 0xb8, 0xb6, 0xd8, 0x49, 0xa8, 0x35, 0x36, 0x6d, 0xe9, 0xb0,
+ 0x09, 0x2a, 0xe9, 0x70, 0xe1, 0x59, 0x20, 0x5f, 0xac, 0xa7, 0x34, 0xad,
+ 0x50, 0x0a, 0xb4, 0xbd, 0x46, 0x79, 0xa3, 0xcb, 0x42, 0xd0, 0x1a, 0x5a,
+ 0x1b, 0xb3, 0xdf, 0xdf, 0x1e, 0x1f, 0x5e, 0x2a, 0xdf, 0xe1, 0x15, 0x29,
+ 0x4f, 0xd5, 0xc3, 0xd3, 0x8a, 0x31, 0xae, 0x7c, 0x66, 0xb2, 0x7f, 0x93,
+ 0x19, 0x35, 0xba, 0x18, 0x2d, 0xae, 0xf7, 0xff, 0x9a, 0x56, 0xd7, 0x65,
+ 0xf1, 0xd8, 0xf3, 0x13, 0x24, 0x94, 0xed, 0x1b, 0x09, 0xb5, 0xfb, 0x6a,
+ 0xf7, 0x19, 0xf2, 0xbf, 0xa7, 0x39, 0x0a, 0x02, 0x91, 0x80, 0xd8, 0x98,
+ 0x6d, 0x30, 0xc1, 0x06, 0xd2, 0x24, 0x2c, 0xab, 0x46, 0x31, 0xd9, 0xe0,
+ 0xeb, 0x3e, 0xf5, 0x9f, 0x9d, 0xc8, 0xb3, 0x9c, 0x7a, 0xbe, 0x21, 0xb9,
+ 0x0a, 0x1b, 0x94, 0xa6, 0xb9, 0x98, 0x6f, 0xb4, 0x29, 0xe2, 0x1f, 0x19,
+ 0x2b, 0x7d, 0xc2, 0xd6, 0x9e, 0x3c, 0xb4, 0xc4, 0xf7, 0xc8, 0x20, 0xaa,
+ 0xb2, 0xf4, 0xd6, 0x95, 0x41, 0x76, 0xec, 0x1b, 0x1a, 0xf2, 0xb8, 0x78,
+ 0x77, 0xc8, 0x0c, 0xa6, 0x9a, 0x2f, 0x85, 0xa9, 0x4e, 0xac, 0x6b, 0x6a,
+ 0x8b, 0x7a, 0xf9, 0xc8, 0xf7, 0x29, 0xb7, 0x61, 0x7f, 0x32, 0x7a, 0xc2,
+ 0x43, 0xe6, 0xdc, 0x31, 0x59, 0xdc, 0x41, 0xbb, 0xf4, 0x0e, 0x19, 0x6a,
+ 0xa8, 0x1f, 0xa2, 0x35, 0x8f, 0x37, 0xb9, 0xa6, 0x2c, 0x47, 0x1c, 0xa8,
+ 0x6b, 0x5a, 0x49, 0x5a, 0xbd, 0x3b, 0xa6, 0xdf, 0x54, 0xe5, 0xf5, 0xed,
+ 0xc1, 0xb9, 0x67, 0xe8, 0xc2, 0x90, 0x74, 0x4e, 0x3d, 0x7a, 0x8e, 0x0c,
+ 0x1d, 0x94, 0x54, 0x97, 0x6a, 0x4c, 0x3d, 0x67, 0xa2, 0x34, 0x90, 0x93,
+ 0xa4, 0x1b, 0x01, 0x20, 0x5f, 0xca, 0x7d, 0x02, 0xff, 0x13, 0xaa, 0x19,
+ 0x4c, 0x27, 0x29, 0x02, 0xa1, 0x72, 0x0b, 0x51, 0x06, 0xc4, 0x59, 0xa1,
+ 0x59, 0xcc, 0xbd, 0x4e, 0xe9, 0x06, 0xf3, 0x63, 0x7c, 0x07, 0x57, 0xf4,
+ 0xb9, 0x51, 0xc2, 0x41, 0xe3, 0x32, 0x7c, 0xfb, 0x2d, 0xf5, 0x58, 0x82,
+ 0x3a, 0xd0, 0xda, 0xd4, 0x97, 0x6d, 0x23, 0x51, 0x6a, 0x35, 0xaa, 0xf3,
+ 0x4a, 0x7d, 0x8b, 0xd4, 0xdc, 0xdd, 0xb3, 0x01, 0xff, 0xb9, 0x67, 0x4b,
+ 0x0f, 0xe3, 0x31, 0xe0, 0x3c, 0xaf, 0xb4, 0xb0, 0xf1, 0x2c, 0xa3, 0x6a,
+ 0xbe, 0x79, 0x3d, 0x73, 0xb0, 0x94, 0x2b, 0x79, 0xdd, 0x95, 0xd4, 0x13,
+ 0x25, 0x92, 0x42, 0x0b, 0xe8, 0x07, 0x7a, 0x9b, 0x0b, 0xae, 0xcb, 0xec,
+ 0xb2, 0x4f, 0x89, 0xa4, 0xa3, 0x48, 0xde, 0x8d, 0x54, 0x4e, 0xc1, 0x63,
+ 0x94, 0x5f, 0xfd, 0xa0, 0x4b, 0xc1, 0x37, 0x8d, 0x59, 0x86, 0xb4, 0xbe,
+ 0x35, 0x97, 0x02, 0x43, 0x11, 0xcc, 0x3c, 0xe6, 0x12, 0xcc, 0x27, 0xf7,
+ 0x55, 0xce, 0x90, 0x20, 0x72, 0xa4, 0x81, 0xd1, 0xa9, 0xb5, 0xf5, 0xf8,
+ 0x32, 0x25, 0xdb, 0x79, 0x5a, 0x67, 0xcc, 0xbf, 0x08, 0x42, 0x20, 0x8a,
+ 0xfd, 0xd1, 0xd6, 0x83, 0xcd, 0xa4, 0x98, 0x5a, 0x88, 0x33, 0xda, 0xa5,
+ 0x7b, 0x7b, 0x2f, 0x5e, 0xf4, 0x92, 0x75, 0xf2, 0x3b, 0xa2, 0x4f, 0xb4,
+ 0xa1, 0xdf, 0x41, 0xf0, 0xac, 0x47, 0x2b, 0xec, 0x6e, 0x57, 0x57, 0x63,
+ 0xfa, 0x7f, 0x7a, 0x4f, 0x0b, 0x4b, 0x5e, 0x4a, 0x22, 0x0e, 0x75, 0x13,
+ 0x41, 0x56, 0x4b, 0x97, 0xc3, 0x3b, 0x8d, 0x7e, 0x77, 0x6c, 0x5d, 0x4b,
+ 0x14, 0x47, 0x9a, 0x67, 0xe5, 0x5c, 0x03, 0xc6, 0x33, 0x29, 0x19, 0x82,
+ 0xef, 0x7b, 0x51, 0x36, 0x84, 0xf8, 0x19, 0x21, 0x27, 0xbc, 0x08, 0xf5,
+ 0x62, 0xd4, 0x97, 0x04, 0x61, 0x36, 0x34, 0x73, 0x73, 0x98, 0x67, 0xb4,
+ 0x08, 0xe2, 0xc1, 0x0f, 0x84, 0xf4, 0x57, 0xc9, 0xba, 0x6c, 0x37, 0xfa,
+ 0x63, 0x80, 0x78, 0x6f, 0x36, 0xa6, 0x61, 0x94, 0x6f, 0xe4, 0x1f, 0xff,
+ 0xfe, 0xef, 0xa6, 0xd9, 0x7f, 0xa7, 0x56, 0xde, 0xfc, 0x5b, 0xdd, 0xdc,
+ 0x78, 0xcf, 0xac, 0xcb, 0x19, 0x38, 0x76, 0xd1, 0x6e, 0x20, 0xd8, 0xc0,
+ 0x3c, 0x8b, 0x3c, 0xb6, 0xf7, 0x27, 0x22, 0xa4, 0x7b, 0xde, 0xf8, 0x72,
+ 0x64, 0x18, 0xb2, 0xdf, 0xd4, 0x02, 0x48, 0xbe, 0xa2, 0x48, 0x74, 0x46,
+ 0x99, 0xe9, 0x66, 0x11, 0x40, 0x2c, 0xb8, 0xe5, 0x20, 0x25, 0x2c, 0xdf,
+ 0xe1, 0x1b, 0xe5, 0x92, 0x73, 0x9d, 0x12, 0x5a, 0xf7, 0x7a, 0x53, 0xf0,
+ 0x29, 0xc6, 0x3a, 0x99, 0x5f, 0xa5, 0xd3, 0xf2, 0xda, 0x8e, 0x38, 0x56,
+ 0xb4, 0xe6, 0x17, 0x8d, 0x7d, 0xdd, 0x6f, 0x48, 0xdf, 0xf4, 0xe3, 0xeb,
+ 0x4f, 0x6c, 0x85, 0x70, 0x02, 0xf6, 0x68, 0x02, 0xfe, 0x1a, 0x16, 0x29,
+ 0x13, 0x46, 0x62, 0x63, 0xa9, 0xa8, 0x20, 0xd9, 0xd6, 0x83, 0x6e, 0x4f,
+ 0x3e, 0x41, 0x77, 0xc7, 0x74, 0x04, 0x3a, 0x55, 0x73, 0x9c, 0xac, 0xb0,
+ 0xca, 0x8d, 0x14, 0x44, 0x11, 0xdd, 0x24, 0x33, 0xf2, 0x2a, 0x37, 0x67,
+ 0x01, 0x17, 0x20, 0x7d, 0x87, 0xe6, 0x0c, 0xa1, 0xc9, 0x8c, 0x09, 0x69,
+ 0x46, 0x5c, 0x73, 0xac, 0xdf, 0x2f, 0x9a, 0xe9, 0x8c, 0xf9, 0x9b, 0x27,
+ 0xa8, 0x3f, 0xa6, 0x19, 0x1a, 0x79, 0x11, 0x92, 0x0c, 0xb6, 0xe7, 0x99,
+ 0x5f, 0xfd, 0xc7, 0x66, 0xc9, 0x17, 0x7a, 0x5c, 0xd6, 0x93, 0xda, 0xd9,
+ 0x76, 0xc4, 0x8d, 0x8e, 0x1c, 0x8d, 0x7c, 0xa1, 0xfd, 0x42, 0x4a, 0xa2,
+ 0x01, 0xda, 0x6f, 0x45, 0x93, 0xb0, 0x8f, 0xf9, 0x90, 0x55, 0xcd, 0x34,
+ 0x22, 0x9e, 0x69, 0x72, 0xbe, 0x19, 0xf9, 0x9e, 0x01, 0x94, 0x5c, 0x27,
+ 0x9b, 0xc3, 0xe1, 0xf9, 0xf1, 0xb6, 0x56, 0x54, 0x5b, 0x5b, 0x3b, 0x3a,
+ 0xfd, 0xee, 0xf8, 0xe2, 0xec, 0xf4, 0xfd, 0xd1, 0xe9, 0x65, 0xf2, 0xdd,
+ 0xc1, 0xc5, 0xf1, 0xc1, 0x57, 0x27, 0x42, 0xbe, 0x40, 0xc3, 0x24, 0xcc,
+ 0x19, 0x9b, 0x82, 0x1d, 0x52, 0x62, 0x2f, 0x2f, 0x2e, 0x5a, 0xca, 0xa6,
+ 0x53, 0xa5, 0xfb, 0xa3, 0x30, 0xea, 0xc3, 0x30, 0xfe, 0x88, 0xaa, 0x5c,
+ 0x3d, 0xb2, 0x85, 0x3e, 0x6a, 0x81, 0x2e, 0xb2, 0xe5, 0x1f, 0xbc, 0x74,
+ 0x7e, 0x82, 0xc3, 0x91, 0x38, 0x53, 0x61, 0xee, 0x4a, 0x53, 0xda, 0x5a,
+ 0x2f, 0x5f, 0x33, 0x23, 0x84, 0x16, 0xbe, 0xd1, 0x57, 0x21, 0x3f, 0x58,
+ 0xd7, 0x71, 0x7d, 0x38, 0x38, 0x39, 0x71, 0x9f, 0x5a, 0x5d, 0x13, 0x49,
+ 0xd8, 0xc0, 0x38, 0x97, 0x10, 0x8d, 0x52, 0x9c, 0xfa, 0xba, 0x74, 0xe5,
+ 0x01, 0x8a, 0x07, 0xbf, 0x12, 0x00, 0x7d, 0xcc, 0x6c, 0x97, 0x4d, 0xa6,
+ 0x71, 0x21, 0xd0, 0x42, 0x93, 0x55, 0x79, 0x7d, 0xdb, 0x4b, 0x36, 0xfe,
+ 0x6d, 0x43, 0x2a, 0xd4, 0x83, 0xbb, 0x9a, 0x2b, 0x2e, 0x6d, 0xb9, 0x4e,
+ 0x9d, 0x9e, 0xb9, 0x3e, 0x49, 0x1c, 0xde, 0x76, 0xc0, 0xbe, 0xe8, 0x50,
+ 0x14, 0xb5, 0xaa, 0xd7, 0x80, 0x2f, 0xbb, 0xc7, 0xa5, 0x2c, 0x89, 0x65,
+ 0xa7, 0x10, 0xf9, 0x48, 0x71, 0xd6, 0xe8, 0xbb, 0x70, 0x22, 0xa4, 0x63,
+ 0x8f, 0xa2, 0x1c, 0x63, 0x2d, 0xc8, 0xf3, 0x66, 0x4b, 0xc5, 0xa9, 0x73,
+ 0xda, 0x4c, 0xf5, 0x44, 0x08, 0x17, 0x53, 0x6d, 0x59, 0x52, 0x99, 0x91,
+ 0x2a, 0x6e, 0x23, 0x50, 0x9e, 0x93, 0x31, 0x15, 0x40, 0xfb, 0xc0, 0xcc,
+ 0x34, 0x4e, 0x3e, 0x3b, 0x91, 0x5a, 0xde, 0x5d, 0xc4, 0x84, 0x3a, 0xb9,
+ 0x9f, 0x12, 0xeb, 0x28, 0x5b, 0x3f, 0x93, 0x75, 0x95, 0x20, 0x14, 0x93,
+ 0x76, 0xf3, 0xec, 0x83, 0x05, 0x83, 0xdd, 0x99, 0x3a, 0x93, 0x00, 0x4c,
+ 0xfa, 0xaf, 0xaf, 0x23, 0x37, 0x89, 0x63, 0x2d, 0x96, 0x14, 0x91, 0x28,
+ 0x87, 0x30, 0xc7, 0x0e, 0x97, 0x9e, 0x7d, 0x62, 0x2e, 0x21, 0xbb, 0xcb,
+ 0xdc, 0x4e, 0xe0, 0x6a, 0x7a, 0x02, 0x43, 0xef, 0xf6, 0x58, 0x2b, 0x65,
+ 0xa5, 0x5a, 0x99, 0x09, 0x71, 0x33, 0x56, 0xb9, 0xa0, 0x34, 0x75, 0x87,
+ 0x03, 0xa7, 0x21, 0x03, 0x9e, 0x5b, 0x9d, 0xee, 0x34, 0xbc, 0xae, 0x78,
+ 0x82, 0x45, 0x2d, 0x2a, 0x14, 0xee, 0x90, 0x4f, 0xdb, 0x5a, 0xeb, 0x0a,
+ 0x20, 0x03, 0x4a, 0x08, 0xaa, 0x8c, 0x14, 0xad, 0x97, 0x97, 0x94, 0x1a,
+ 0x20, 0x36, 0x7d, 0x71, 0x88, 0x9a, 0x0c, 0x05, 0x55, 0x65, 0x75, 0xb5,
+ 0x74, 0x90, 0x3c, 0x50, 0x64, 0x4d, 0x45, 0x19, 0xb9, 0x85, 0x58, 0x21,
+ 0x00, 0xe4, 0xc3, 0x48, 0x4f, 0xaf, 0x4b, 0x35, 0xc0, 0x53, 0x8b, 0x9a,
+ 0xb1, 0x15, 0x07, 0x3d, 0xa3, 0xde, 0x32, 0x07, 0x5a, 0xc1, 0x05, 0x7c,
+ 0x8d, 0x46, 0x08, 0x09, 0x5f, 0x4a, 0x87, 0x4c, 0x2b, 0xc8, 0xd7, 0x1e,
+ 0x37, 0x83, 0x4b, 0x5f, 0x22, 0x49, 0xce, 0x59, 0x3a, 0x4a, 0xe5, 0x07,
+ 0xfa, 0x44, 0xe5, 0x72, 0x00, 0xd2, 0x19, 0xdd, 0xa2, 0x07, 0xd1, 0xa4,
+ 0x80, 0xd6, 0xd1, 0xa4, 0x06, 0xaf, 0x8c, 0xbc, 0x9a, 0x52, 0x06, 0xa9,
+ 0xea, 0x1d, 0x69, 0x32, 0xca, 0xaf, 0x99, 0x13, 0x84, 0x08, 0x28, 0xe8,
+ 0x5c, 0x82, 0xe2, 0xb1, 0x9c, 0x65, 0x74, 0x38, 0x40, 0xe0, 0x08, 0xe3,
+ 0xfd, 0xa6, 0x9c, 0xfa, 0x2c, 0x83, 0x3a, 0x12, 0x59, 0x7d, 0x1b, 0xfb,
+ 0x40, 0xec, 0x73, 0x41, 0xf3, 0xa8, 0x70, 0x54, 0x29, 0x4f, 0x20, 0xe0,
+ 0x5c, 0x0a, 0xaa, 0x81, 0x2b, 0xb5, 0x40, 0x2a, 0xa0, 0x72, 0x29, 0x60,
+ 0x1e, 0x34, 0x71, 0x81, 0x36, 0x2e, 0x1c, 0xe9, 0x54, 0xe7, 0x75, 0xd3,
+ 0xd6, 0x17, 0xa0, 0x56, 0xc6, 0xcc, 0xd0, 0x4c, 0x62, 0x86, 0x21, 0x25,
+ 0xed, 0x82, 0x60, 0xb2, 0x58, 0xc2, 0x9d, 0x67, 0xf6, 0x04, 0x75, 0xda,
+ 0xcc, 0xd4, 0xa6, 0xa7, 0x66, 0x14, 0x66, 0x8b, 0xf0, 0x63, 0xec, 0x41,
+ 0x92, 0x7f, 0xf5, 0x6d, 0x2d, 0x43, 0x01, 0x9e, 0x6c, 0x39, 0xe0, 0x11,
+ 0x9b, 0x01, 0x24, 0x1f, 0xc6, 0x52, 0x4d, 0x16, 0x10, 0x1d, 0x2a, 0x85,
+ 0x0b, 0x42, 0xb8, 0x56, 0xf0, 0x21, 0xd1, 0x84, 0xbb, 0xe9, 0xd4, 0x2b,
+ 0x30, 0xc0, 0xfe, 0xc8, 0x34, 0x30, 0x3e, 0x48, 0x4e, 0x0c, 0x58, 0xe6,
+ 0x32, 0xf4, 0x8f, 0xc9, 0xc8, 0xbd, 0x81, 0x48, 0x52, 0x09, 0x99, 0x67,
+ 0x9d, 0x98, 0x86, 0x77, 0x85, 0x28, 0x3c, 0xc6, 0x57, 0x43, 0xa5, 0x9e,
+ 0x4e, 0x9e, 0xce, 0xd8, 0x78, 0x74, 0xbb, 0x6f, 0xf6, 0xc0, 0xb0, 0xe3,
+ 0xb5, 0xb5, 0xc3, 0x0f, 0xc3, 0xcb, 0xb3, 0xf7, 0xc9, 0xd9, 0x87, 0xcb,
+ 0xf3, 0x0f, 0x97, 0xa2, 0xa7, 0x8e, 0x38, 0x69, 0x83, 0xa1, 0x4b, 0xac,
+ 0x3b, 0xeb, 0x62, 0xce, 0x04, 0xe0, 0x03, 0x8c, 0x59, 0x09, 0x5a, 0x51,
+ 0x8f, 0x51, 0xcc, 0x26, 0x65, 0x82, 0x6b, 0x8f, 0xf9, 0xca, 0x31, 0xe5,
+ 0xf7, 0x66, 0xca, 0x91, 0x50, 0x0f, 0x4f, 0xbe, 0xe6, 0x78, 0xc2, 0xef,
+ 0xa1, 0x67, 0xad, 0x5d, 0xab, 0xea, 0xa1, 0xed, 0xc7, 0x00, 0x3a, 0xa7,
+ 0xcd, 0xe0, 0xe6, 0x97, 0xcc, 0x65, 0xe7, 0xae, 0xf3, 0xfd, 0xfa, 0x98,
+ 0x6e, 0x29, 0xb8, 0xab, 0x11, 0x28, 0x85, 0xd5, 0x03, 0x6b, 0xd8, 0xce,
+ 0x2c, 0xf6, 0x13, 0x9c, 0x9b, 0xd2, 0x8c, 0xf0, 0xc6, 0xa6, 0xc4, 0x10,
+ 0x8c, 0x10, 0x50, 0x60, 0x46, 0x50, 0x11, 0xe6, 0x96, 0x5d, 0x06, 0x45,
+ 0x76, 0x4f, 0x8a, 0x4f, 0xa0, 0x53, 0xdf, 0x27, 0x1b, 0xdf, 0x67, 0x7e,
+ 0x83, 0x7f, 0xfc, 0x4f, 0xca, 0xdb, 0xfe, 0xa8, 0x3f, 0xf9, 0x2f, 0xfe,
+ 0xe4, 0x4f, 0xc5, 0x06, 0x04, 0x66, 0x1b, 0x2a, 0xf3, 0xed, 0xd1, 0xc5,
+ 0x57, 0x47, 0x17, 0x67, 0x43, 0xc8, 0x03, 0xf5, 0x77, 0x87, 0x7b, 0xfd,
+ 0x36, 0xab, 0x46, 0x59, 0x55, 0x4a, 0x1d, 0x3d, 0xfd, 0xd7, 0x8b, 0xed,
+ 0xaf, 0x87, 0xc3, 0x83, 0xf3, 0x63, 0x5b, 0xa9, 0xca, 0x66, 0x90, 0xb2,
+ 0x8f, 0xa4, 0xe0, 0x1c, 0x67, 0x1a, 0xbf, 0xbe, 0x62, 0xf6, 0xc5, 0xf8,
+ 0x96, 0x33, 0x0b, 0x02, 0x50, 0x8a, 0x06, 0xd6, 0x08, 0x8d, 0x22, 0x89,
+ 0xc5, 0xd4, 0xb0, 0x32, 0xc1, 0xf9, 0xd5, 0x26, 0xb8, 0x2c, 0x04, 0x05,
+ 0x03, 0x7b, 0x16, 0x82, 0x7b, 0x5b, 0x8d, 0xfa, 0x66, 0xb7, 0xdf, 0x6a,
+ 0xe1, 0x76, 0x4e, 0x84, 0x32, 0xa2, 0x92, 0x33, 0x24, 0x9c, 0xb3, 0xf1,
+ 0x36, 0x2f, 0xf2, 0x66, 0xfb, 0x96, 0xce, 0x07, 0x55, 0x51, 0x9a, 0x0e,
+ 0x58, 0xba, 0xf3, 0x81, 0x52, 0xd8, 0x3b, 0x89, 0xd8, 0x55, 0xec, 0x34,
+ 0xe6, 0x6b, 0xb6, 0xf4, 0x29, 0x3b, 0xbc, 0xcd, 0x4f, 0x9e, 0x5b, 0x9a,
+ 0x3e, 0xd1, 0xfc, 0x81, 0x94, 0xbd, 0x32, 0x77, 0xd5, 0xfc, 0x7e, 0x22,
+ 0x97, 0x08, 0x58, 0xea, 0x59, 0xb9, 0x14, 0x19, 0xde, 0x8d, 0x50, 0x53,
+ 0x79, 0x56, 0x64, 0x6c, 0x49, 0x3e, 0x4a, 0x32, 0x9a, 0xa6, 0xc5, 0x2d,
+ 0xf4, 0x07, 0x68, 0x04, 0x74, 0xf7, 0x29, 0xf9, 0x1c, 0x95, 0xcd, 0x05,
+ 0x20, 0x41, 0xf8, 0x60, 0x60, 0xf2, 0x4d, 0x49, 0xb8, 0x3d, 0x70, 0x30,
+ 0xcf, 0x72, 0xec, 0x79, 0xa1, 0x77, 0x1c, 0x27, 0x37, 0x09, 0xe4, 0x3b,
+ 0x3e, 0x3a, 0x31, 0x17, 0x93, 0xcd, 0x32, 0x83, 0x8f, 0x2e, 0x9b, 0x52,
+ 0x2c, 0x48, 0x21, 0x81, 0x9c, 0x58, 0x9d, 0x43, 0x90, 0xb1, 0xf4, 0xd0,
+ 0x02, 0x0a, 0x08, 0x20, 0x63, 0xbb, 0x20, 0x7f, 0xbc, 0xb6, 0x65, 0x86,
+ 0x44, 0x72, 0xb3, 0x10, 0x03, 0x3b, 0xb0, 0xab, 0x3a, 0xe4, 0xd7, 0xbf,
+ 0x12, 0xbc, 0xed, 0xa1, 0x03, 0x04, 0xda, 0x82, 0x80, 0xdc, 0x09, 0x67,
+ 0x84, 0x5a, 0x88, 0x41, 0x2b, 0xbd, 0x6d, 0xe9, 0x32, 0xf1, 0xeb, 0x31,
+ 0x2f, 0x20, 0x93, 0x1a, 0x4e, 0x24, 0xe0, 0x69, 0xf9, 0xc0, 0x34, 0x67,
+ 0xa1, 0x9d, 0x27, 0xa0, 0x1d, 0x67, 0x38, 0x10, 0x45, 0x6f, 0xa6, 0x8d,
+ 0x75, 0x54, 0xd4, 0xcc, 0xb0, 0x06, 0xa5, 0x6b, 0x02, 0x91, 0x53, 0xb5,
+ 0xa8, 0xaa, 0x7d, 0x78, 0x3e, 0x53, 0xd6, 0x94, 0xd6, 0xc8, 0x64, 0xeb,
+ 0xdf, 0x5a, 0xb3, 0xfd, 0x53, 0xba, 0x2e, 0xca, 0xfe, 0x68, 0x01, 0xc7,
+ 0x8c, 0x57, 0xa8, 0x8f, 0x93, 0xb8, 0xcb, 0x2b, 0xd6, 0x3c, 0xf8, 0xf7,
+ 0x14, 0x90, 0x06, 0x3d, 0x06, 0xc7, 0xa8, 0x91, 0x2f, 0xdd, 0x66, 0xda,
+ 0xb2, 0xfc, 0x4a, 0x9c, 0x84, 0xe4, 0x2a, 0x88, 0xdb, 0x01, 0xca, 0x22,
+ 0x5b, 0x27, 0x8d, 0x67, 0xd3, 0xf4, 0x3a, 0x29, 0x17, 0x8d, 0x2d, 0x78,
+ 0x71, 0x09, 0x35, 0x21, 0x93, 0x32, 0x10, 0x9a, 0x4b, 0xa1, 0x99, 0x5b,
+ 0x77, 0x0d, 0x95, 0x96, 0x63, 0x6a, 0x98, 0x74, 0xca, 0x75, 0x7a, 0x96,
+ 0x5e, 0x25, 0x7c, 0x98, 0x9a, 0xcb, 0xcb, 0xbf, 0x9c, 0x1f, 0xbd, 0xd1,
+ 0x37, 0x57, 0xad, 0x19, 0x33, 0x26, 0x02, 0x34, 0x97, 0x09, 0x43, 0xb1,
+ 0xe6, 0xd0, 0xb0, 0xa8, 0xe8, 0x37, 0x0a, 0xe6, 0xe1, 0xcf, 0xf4, 0x93,
+ 0x1f, 0xde, 0x1e, 0x0f, 0xcf, 0x4f, 0xce, 0x0e, 0xdf, 0xbc, 0xfe, 0x41,
+ 0x45, 0xf2, 0x17, 0x14, 0x23, 0x64, 0x3d, 0xcd, 0xfe, 0xcc, 0x31, 0xba,
+ 0xc8, 0x7b, 0xa7, 0x47, 0xdf, 0x7f, 0x34, 0xf6, 0xd8, 0x1b, 0xaa, 0xeb,
+ 0xd0, 0xbb, 0x4b, 0xa7, 0xf2, 0x12, 0xe9, 0xa7, 0x11, 0xdd, 0x6e, 0xd0,
+ 0xa6, 0xe0, 0xec, 0x4e, 0xac, 0xad, 0x4f, 0xec, 0x12, 0x95, 0x1e, 0x14,
+ 0x47, 0xeb, 0x95, 0xa2, 0x4b, 0x5b, 0x79, 0xf5, 0x91, 0x6a, 0xe2, 0xee,
+ 0xfa, 0xdf, 0x68, 0x18, 0x54, 0x4d, 0x18, 0x22, 0x1f, 0x9a, 0x03, 0xe0,
+ 0xba, 0xfc, 0xc6, 0x01, 0xfa, 0x85, 0x3f, 0xbd, 0x22, 0x3f, 0x9a, 0x25,
+ 0xa0, 0x95, 0x12, 0xf5, 0x00, 0xbd, 0x08, 0x4b, 0xad, 0x50, 0xaf, 0x11,
+ 0x86, 0x5e, 0xd3, 0x69, 0x54, 0x8e, 0x89, 0x0a, 0x63, 0xfb, 0x92, 0x6a,
+ 0xb1, 0x6c, 0x54, 0xe4, 0x3a, 0x3f, 0xba, 0x18, 0x1e, 0x0f, 0x2f, 0xc9,
+ 0x70, 0x95, 0xca, 0xad, 0x12, 0x84, 0xd2, 0xb2, 0xba, 0x20, 0x6d, 0x69,
+ 0x13, 0x0e, 0xfb, 0xd5, 0x82, 0x5a, 0x27, 0xda, 0x8a, 0xb9, 0x76, 0x16,
+ 0x37, 0xdd, 0x00, 0x9c, 0x1a, 0x4e, 0x8a, 0x28, 0xd3, 0x66, 0xa7, 0x57,
+ 0x7a, 0x80, 0x4b, 0xd9, 0x1a, 0x9d, 0xa2, 0x39, 0x28, 0x78, 0x85, 0xd5,
+ 0x99, 0xe6, 0x23, 0xe7, 0xcc, 0xec, 0x60, 0x48, 0x08, 0x9e, 0x24, 0x14,
+ 0x3d, 0xfe, 0x11, 0xd2, 0x80, 0x98, 0xa3, 0x46, 0x90, 0x62, 0xde, 0x72,
+ 0xad, 0x49, 0x5a, 0xb3, 0x9f, 0xc0, 0x6e, 0xdd, 0x52, 0x30, 0x5a, 0x54,
+ 0x4f, 0xb3, 0x3f, 0xf5, 0x50, 0xe8, 0xc2, 0xfa, 0x06, 0xc2, 0x6a, 0x11,
+ 0xd9, 0x24, 0x94, 0x73, 0x4e, 0x45, 0x25, 0xff, 0xa4, 0xd1, 0x5a, 0x40,
+ 0xad, 0x01, 0xa0, 0xa0, 0x8c, 0x2c, 0x50, 0x41, 0x44, 0x75, 0xbc, 0xa6,
+ 0x1c, 0x56, 0x50, 0xeb, 0x4d, 0x48, 0xdf, 0x82, 0x0b, 0xde, 0xff, 0x98,
+ 0x5e, 0xa7, 0x34, 0x83, 0xa3, 0x85, 0x5f, 0x0a, 0xd2, 0xf6, 0x9e, 0xab,
+ 0x12, 0x61, 0xe2, 0x01, 0x91, 0x4e, 0x2b, 0x78, 0x32, 0x1a, 0x29, 0x15,
+ 0xa1, 0x86, 0x8f, 0xe0, 0x9d, 0x07, 0x6d, 0x16, 0x2f, 0xdd, 0x97, 0x6a,
+ 0x84, 0xad, 0x9a, 0x51, 0xaf, 0x76, 0x2c, 0x6d, 0xdf, 0x2a, 0x53, 0xe0,
+ 0x22, 0x3b, 0x15, 0x6b, 0x8a, 0x38, 0x16, 0x63, 0x7b, 0x19, 0x53, 0xd6,
+ 0x21, 0x01, 0x0c, 0x2a, 0x61, 0x48, 0x33, 0xe2, 0x8f, 0x42, 0x4b, 0x28,
+ 0x38, 0x8b, 0x4a, 0xec, 0x14, 0x76, 0x57, 0xf6, 0x4c, 0x97, 0xc7, 0xc1,
+ 0xd3, 0xed, 0x6d, 0x2b, 0x8e, 0xaf, 0x3d, 0xc8, 0x07, 0x2d, 0x43, 0x86,
+ 0x2e, 0x56, 0x8f, 0x13, 0x2e, 0x53, 0xe4, 0xf7, 0x69, 0x60, 0xc7, 0xcb,
+ 0x13, 0xaf, 0x25, 0xfb, 0xde, 0xe2, 0x53, 0x20, 0xf0, 0x5a, 0x55, 0xb7,
+ 0x69, 0x74, 0x2d, 0x6c, 0x80, 0xd1, 0x2f, 0xe7, 0x28, 0xa1, 0x36, 0x96,
+ 0x1a, 0x12, 0x40, 0xed, 0xdb, 0x06, 0xf5, 0x12, 0x71, 0x93, 0x65, 0x66,
+ 0xf5, 0xfd, 0x87, 0x93, 0xcb, 0xe3, 0x73, 0x1f, 0x7f, 0x90, 0x7c, 0x7f,
+ 0x7c, 0xf9, 0x8d, 0xd1, 0xda, 0x87, 0xc7, 0xa7, 0x5f, 0x9f, 0x50, 0x90,
+ 0xf7, 0xfd, 0xfb, 0x83, 0x53, 0xa2, 0x17, 0x39, 0x05, 0xb4, 0xf9, 0x00,
+ 0x86, 0x03, 0x89, 0x23, 0x33, 0xc5, 0xb4, 0x77, 0x88, 0x78, 0xa2, 0x17,
+ 0xc6, 0x1a, 0x3b, 0xc7, 0x8f, 0xab, 0xaa, 0x17, 0xed, 0x49, 0xa2, 0x15,
+ 0x17, 0xcb, 0xe0, 0x81, 0xdc, 0xb8, 0x38, 0xb6, 0x64, 0x6c, 0xd1, 0x44,
+ 0x77, 0x8b, 0x47, 0x20, 0xc9, 0x99, 0x35, 0x74, 0xe0, 0x68, 0xf8, 0xee,
+ 0x76, 0xf1, 0x4b, 0xac, 0xa8, 0xa5, 0x9e, 0x86, 0x1d, 0x63, 0x74, 0xa6,
+ 0x42, 0xec, 0x1a, 0xbe, 0x2f, 0xdb, 0x49, 0x47, 0xe6, 0x8b, 0xe8, 0x12,
+ 0x80, 0x44, 0xa5, 0x73, 0xa4, 0x93, 0xc5, 0x49, 0x46, 0xf3, 0xc5, 0x89,
+ 0x7f, 0xa1, 0x0e, 0x5a, 0x35, 0x07, 0x15, 0x1f, 0x7c, 0x5d, 0x66, 0xee,
+ 0xe4, 0xf6, 0xcf, 0xb4, 0x19, 0x8d, 0xff, 0xc0, 0x0c, 0xe3, 0xcb, 0xa5,
+ 0x4f, 0x72, 0xad, 0x6f, 0x96, 0x64, 0xcb, 0xd6, 0x19, 0x13, 0xb3, 0x7f,
+ 0x9f, 0xd5, 0x4a, 0x4b, 0xae, 0xae, 0xe5, 0x39, 0x4d, 0x73, 0xda, 0xb2,
+ 0x60, 0xd1, 0x90, 0x90, 0x21, 0x79, 0x8d, 0x32, 0x66, 0x48, 0x4b, 0x7d,
+ 0xac, 0x45, 0xcb, 0xc0, 0xf7, 0xdd, 0x99, 0x06, 0x27, 0x35, 0xaf, 0xd5,
+ 0x16, 0x7e, 0x74, 0xd0, 0x09, 0x94, 0x56, 0x84, 0xbb, 0x22, 0x23, 0x94,
+ 0x03, 0xfd, 0xf5, 0xaf, 0xf3, 0x6b, 0x3f, 0xe5, 0x95, 0x0b, 0xcb, 0xcf,
+ 0x63, 0x2b, 0x2b, 0x4c, 0xee, 0xac, 0x16, 0x49, 0x31, 0xcb, 0x56, 0x0f,
+ 0xa4, 0x42, 0xe5, 0xee, 0xb2, 0x0f, 0xca, 0xef, 0xf7, 0xc2, 0xdf, 0xef,
+ 0x71, 0x90, 0xe1, 0xf8, 0xfc, 0xee, 0xa5, 0x65, 0x40, 0x66, 0x22, 0x07,
+ 0x5f, 0x7d, 0x53, 0xa5, 0x80, 0x76, 0x18, 0x3d, 0x2a, 0x2e, 0x73, 0x96,
+ 0x89, 0x1c, 0xfc, 0x23, 0x08, 0xe9, 0xa2, 0x42, 0x82, 0x3a, 0x1e, 0x41,
+ 0x74, 0x85, 0x71, 0xff, 0xf0, 0x3c, 0x41, 0x4e, 0xd1, 0x75, 0x65, 0x1a,
+ 0x34, 0xbf, 0x7f, 0x6e, 0x93, 0x71, 0x9c, 0x4c, 0x43, 0x91, 0x46, 0x49,
+ 0x87, 0xec, 0xe7, 0xf3, 0x3b, 0xad, 0xf2, 0x6d, 0xfe, 0xfa, 0xd2, 0x16,
+ 0xe8, 0xaa, 0x5b, 0x41, 0xea, 0x16, 0xdb, 0xb8, 0x0a, 0x7f, 0x74, 0x0e,
+ 0x3e, 0x30, 0x92, 0x0c, 0xce, 0xc8, 0xe8, 0xf4, 0x2b, 0x6b, 0x67, 0x64,
+ 0x78, 0x65, 0x8a, 0x91, 0xf5, 0x35, 0x45, 0x6a, 0x3c, 0xe4, 0x91, 0x27,
+ 0x5c, 0xfc, 0x4a, 0x1f, 0xb2, 0xea, 0x3f, 0xee, 0xed, 0xec, 0xec, 0xee,
+ 0xef, 0x7e, 0xfe, 0x6a, 0x67, 0x7f, 0x77, 0x77, 0x77, 0x6f, 0x7f, 0x77,
+ 0x7f, 0x7f, 0x6f, 0xe7, 0xe7, 0x6d, 0xf2, 0x1f, 0xdd, 0xe5, 0xd9, 0xbd,
+ 0x46, 0xa6, 0xd9, 0xcf, 0x87, 0x6d, 0x5d, 0x37, 0x0f, 0x0c, 0x06, 0x60,
+ 0x4f, 0x1f, 0xf6, 0xb5, 0x6a, 0x3e, 0x96, 0x56, 0x86, 0x73, 0x66, 0x98,
+ 0x42, 0x72, 0xee, 0x52, 0xcd, 0x71, 0x06, 0x3d, 0x9a, 0x7b, 0xf4, 0xea,
+ 0x6f, 0x0b, 0x1a, 0xe9, 0x88, 0xd4, 0x01, 0xe8, 0x34, 0xb5, 0x4d, 0xec,
+ 0xbd, 0x9e, 0x96, 0xa3, 0x11, 0x52, 0x97, 0x6c, 0x6e, 0xfb, 0x20, 0x21,
+ 0x2e, 0xe5, 0x5b, 0xde, 0x12, 0x12, 0x3a, 0x04, 0xaa, 0x98, 0x0f, 0xba,
+ 0x9b, 0x1d, 0xe7, 0xd9, 0x33, 0x3b, 0x60, 0x5c, 0x52, 0x5d, 0x11, 0x78,
+ 0xba, 0xcd, 0x24, 0x55, 0x36, 0xe7, 0x2d, 0xb9, 0xca, 0x3e, 0xdf, 0xd9,
+ 0xdf, 0xa7, 0xd2, 0x3f, 0x7f, 0xdc, 0xed, 0x09, 0x20, 0xdc, 0xcf, 0x72,
+ 0xe9, 0xd9, 0xeb, 0x89, 0xdb, 0x20, 0xf3, 0xc3, 0x1f, 0x67, 0xb1, 0x98,
+ 0x65, 0x95, 0x31, 0x44, 0xa8, 0x78, 0x34, 0x10, 0xd1, 0xf0, 0x18, 0x32,
+ 0xc7, 0x22, 0x18, 0x99, 0x3a, 0xd9, 0x38, 0x74, 0x23, 0x30, 0x57, 0xb4,
+ 0x65, 0xa1, 0x60, 0xbe, 0x30, 0x37, 0x44, 0xdb, 0x36, 0xca, 0x5f, 0x01,
+ 0xac, 0xc9, 0xb9, 0x6c, 0x9c, 0xc5, 0xc7, 0xf7, 0xad, 0x48, 0x06, 0x1c,
+ 0xae, 0x82, 0x4b, 0x1a, 0xd3, 0xe3, 0xac, 0xc3, 0xc3, 0x63, 0xe2, 0x29,
+ 0xb7, 0x92, 0xc0, 0xf7, 0xa3, 0x37, 0xd8, 0xbd, 0x17, 0xbb, 0x3f, 0x33,
+ 0x5e, 0x99, 0x0e, 0x84, 0x9b, 0x35, 0x0d, 0xbe, 0xf8, 0x29, 0x5a, 0xba,
+ 0x91, 0x36, 0xb3, 0xc1, 0xf5, 0x40, 0xb5, 0x0a, 0xf1, 0x36, 0xf6, 0xfc,
+ 0xac, 0x11, 0xae, 0x53, 0xc0, 0x85, 0xca, 0x61, 0xa7, 0xa9, 0x43, 0xc9,
+ 0x77, 0xd5, 0xea, 0xc0, 0x6c, 0x39, 0xba, 0xf7, 0x47, 0x97, 0x07, 0xe6,
+ 0xf2, 0xf8, 0x36, 0x34, 0xf4, 0xdf, 0x67, 0xc6, 0x2a, 0xa7, 0xc5, 0xde,
+ 0xc4, 0x79, 0xb8, 0xb3, 0xec, 0xe0, 0x34, 0x77, 0xcf, 0x93, 0x4d, 0x0a,
+ 0x51, 0xbe, 0xf8, 0xfc, 0xc5, 0xf3, 0x2d, 0x2e, 0xc5, 0xc2, 0xaf, 0x65,
+ 0x94, 0x20, 0x06, 0xaf, 0xa4, 0xb0, 0x53, 0x91, 0x03, 0xdf, 0x8a, 0xa4,
+ 0x0f, 0x17, 0xc7, 0x7c, 0xa4, 0x6f, 0x98, 0x44, 0x84, 0x8d, 0xde, 0x2e,
+ 0x9b, 0x24, 0xee, 0x5b, 0x4f, 0xc9, 0x98, 0xe5, 0xc4, 0x74, 0x0a, 0xf2,
+ 0x05, 0xba, 0x18, 0x2d, 0xf9, 0x07, 0x6e, 0x58, 0x73, 0x40, 0x4b, 0x14,
+ 0x28, 0x95, 0xba, 0x6f, 0xe8, 0x0c, 0xa8, 0x51, 0x89, 0x99, 0x59, 0xf6,
+ 0x99, 0xb5, 0xc0, 0xc8, 0x0e, 0x62, 0x79, 0xc4, 0xd2, 0xbf, 0xc3, 0xc6,
+ 0xbf, 0xc5, 0x90, 0x1f, 0x28, 0x85, 0xb4, 0x0d, 0xcd, 0x83, 0x8a, 0x1d,
+ 0xa7, 0x1e, 0xb7, 0xd2, 0x51, 0x9d, 0xb6, 0xe9, 0x91, 0xba, 0x29, 0x9f,
+ 0x93, 0x88, 0x22, 0x3b, 0x85, 0x8c, 0x67, 0x69, 0xe0, 0x59, 0xcc, 0x5b,
+ 0x2e, 0x1f, 0x21, 0xd3, 0x00, 0xa9, 0x05, 0x72, 0x0e, 0x66, 0xe6, 0x3a,
+ 0xaa, 0x1e, 0x44, 0xc3, 0x86, 0x99, 0x60, 0xeb, 0x29, 0x76, 0x10, 0x41,
+ 0x4c, 0x1b, 0xe3, 0xa7, 0xd2, 0x58, 0xd6, 0x24, 0x35, 0x9a, 0x5b, 0x1d,
+ 0x68, 0x89, 0xfd, 0xfe, 0x4c, 0x7f, 0xe5, 0x01, 0xe6, 0xfc, 0xfc, 0x52,
+ 0xfd, 0xbb, 0x3e, 0xe7, 0x61, 0xa9, 0xd3, 0xee, 0xc0, 0x96, 0x74, 0x8d,
+ 0x19, 0x75, 0x81, 0x9f, 0xb4, 0xd6, 0xcf, 0x26, 0x7a, 0xb2, 0xbd, 0xbd,
+ 0xb5, 0xa4, 0x37, 0xf2, 0xeb, 0xd8, 0xd7, 0xcf, 0x41, 0x4a, 0xe4, 0xa5,
+ 0x74, 0x9b, 0x35, 0x6f, 0x37, 0x4e, 0x53, 0x9b, 0xd7, 0xb4, 0x92, 0x13,
+ 0x01, 0xc6, 0xb3, 0x1b, 0x55, 0xcd, 0x2b, 0xee, 0xbc, 0x0a, 0xaf, 0xf6,
+ 0x20, 0x04, 0x8b, 0xa7, 0x24, 0x71, 0x5c, 0x55, 0x9e, 0x51, 0x01, 0x83,
+ 0xe4, 0x80, 0x76, 0x43, 0xeb, 0xc3, 0x5e, 0x97, 0xd5, 0x9f, 0xab, 0x75,
+ 0x0f, 0x54, 0x89, 0xb5, 0xee, 0xbc, 0x9e, 0xf7, 0x4b, 0x55, 0xf3, 0x94,
+ 0x13, 0xc4, 0x3a, 0x7b, 0x47, 0x19, 0xf3, 0x1f, 0x59, 0xc9, 0xe9, 0xf1,
+ 0x99, 0xe7, 0x45, 0xab, 0x50, 0xb0, 0x34, 0x02, 0xa4, 0x8b, 0x1d, 0x04,
+ 0xa8, 0x52, 0x2b, 0xa5, 0xe0, 0xf6, 0x8b, 0x87, 0x82, 0x82, 0x44, 0xb2,
+ 0x5a, 0x58, 0xb1, 0xb6, 0x9b, 0x98, 0x41, 0x0a, 0x23, 0xde, 0x5e, 0xad,
+ 0xf9, 0xe8, 0xf1, 0x8e, 0x67, 0x14, 0x93, 0x85, 0x54, 0x90, 0xc0, 0x38,
+ 0x38, 0x3e, 0x21, 0x58, 0xec, 0x89, 0x31, 0xf1, 0x86, 0xaa, 0x2a, 0x01,
+ 0x26, 0x0e, 0xc0, 0x6e, 0x91, 0x93, 0xba, 0xde, 0xb3, 0x05, 0x87, 0x34,
+ 0x5b, 0x12, 0x76, 0x0b, 0x85, 0x58, 0xd9, 0xf4, 0x17, 0x92, 0x50, 0xb3,
+ 0x5a, 0x46, 0x5f, 0xaa, 0xd9, 0x69, 0x0b, 0x02, 0x6e, 0x2a, 0x4d, 0x71,
+ 0x97, 0x4d, 0xcb, 0x39, 0x4c, 0x6a, 0x16, 0xd3, 0xa8, 0x77, 0x56, 0x65,
+ 0xd3, 0xec, 0x4e, 0xbc, 0xab, 0x4c, 0x67, 0xfc, 0xb5, 0x20, 0x16, 0xb8,
+ 0xe0, 0x71, 0x23, 0x59, 0x2d, 0x01, 0x2a, 0x82, 0x3e, 0xba, 0xcd, 0xac,
+ 0x50, 0x8e, 0xec, 0x87, 0xbe, 0xef, 0x8a, 0x70, 0x98, 0x19, 0xb2, 0x45,
+ 0x1c, 0xfa, 0x64, 0xe4, 0x0a, 0xb8, 0xfd, 0x43, 0x2d, 0x7c, 0x2e, 0xdd,
+ 0x6c, 0x11, 0x76, 0x16, 0x6a, 0xcd, 0x4c, 0xf6, 0xbe, 0xf7, 0x94, 0x26,
+ 0x9d, 0x43, 0x06, 0x74, 0xf3, 0xf4, 0xc8, 0x53, 0x8b, 0x96, 0xae, 0x8c,
+ 0x45, 0x46, 0x05, 0x71, 0x7a, 0x9c, 0x3a, 0x8e, 0xcd, 0x51, 0x4e, 0xcd,
+ 0x3f, 0x01, 0xa8, 0x64, 0x88, 0xb5, 0x79, 0x96, 0xe2, 0xcd, 0x1e, 0xa6,
+ 0x9d, 0x30, 0x37, 0x48, 0x87, 0x92, 0x7f, 0xa1, 0xa9, 0x6a, 0x01, 0x36,
+ 0xf1, 0x1e, 0xdf, 0x86, 0x14, 0xe7, 0x6d, 0xc6, 0x03, 0xdb, 0x7b, 0x41,
+ 0xfd, 0x70, 0xff, 0xdf, 0xf2, 0x54, 0xd2, 0x20, 0x58, 0x0f, 0x29, 0x2b,
+ 0x9d, 0x5e, 0x5e, 0x86, 0x11, 0x97, 0x38, 0xfd, 0x6a, 0x41, 0xf1, 0x47,
+ 0x5b, 0xc0, 0x8b, 0x7a, 0x31, 0xa3, 0xbb, 0x28, 0xe3, 0x6a, 0xc2, 0xb6,
+ 0x71, 0x32, 0xe9, 0x16, 0x66, 0x79, 0xb9, 0xf5, 0x93, 0xf2, 0x9e, 0x4a,
+ 0x21, 0x5f, 0x5d, 0xe5, 0x63, 0x8a, 0xfd, 0x3b, 0xd6, 0x70, 0x92, 0xf1,
+ 0xfc, 0xe0, 0x4c, 0xab, 0xaf, 0x99, 0xb1, 0x25, 0xf3, 0xc5, 0x68, 0x6a,
+ 0x2e, 0x6b, 0xcd, 0x67, 0x31, 0xa7, 0x0a, 0xb3, 0x64, 0xac, 0x2d, 0x34,
+ 0xc7, 0xf4, 0x86, 0x30, 0x38, 0x3b, 0x39, 0x14, 0x08, 0x97, 0x56, 0x50,
+ 0xc1, 0x67, 0xa8, 0x09, 0x4d, 0x89, 0x06, 0xb3, 0xb2, 0xd0, 0x74, 0xb8,
+ 0x45, 0xcd, 0x74, 0xb2, 0x88, 0xe6, 0x70, 0x95, 0xac, 0x04, 0x4f, 0x4a,
+ 0xd1, 0x06, 0x31, 0xcd, 0xf1, 0x86, 0x3f, 0x98, 0x49, 0x7f, 0x7e, 0x33,
+ 0xd7, 0x95, 0x56, 0x85, 0x88, 0xb5, 0x25, 0x49, 0xc0, 0xc2, 0xd1, 0x3b,
+ 0xff, 0xe6, 0x7c, 0x90, 0x1c, 0x51, 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, 0x66, 0x71, 0x8e, 0xbf, 0x9b, 0xb3, 0x62, 0xd4, 0x2f, 0xbb, 0x4c,
+ 0xee, 0x0b, 0x65, 0xd5, 0x22, 0xdf, 0xe2, 0x37, 0x13, 0xa3, 0x95, 0x41,
+ 0xb7, 0x9a, 0x3f, 0x60, 0xfd, 0x3c, 0xe1, 0xc8, 0xfa, 0x27, 0x37, 0xe0,
+ 0x6d, 0x2d, 0xd9, 0x7e, 0x16, 0xc0, 0xcb, 0x07, 0xab, 0x62, 0xda, 0xa9,
+ 0x2a, 0x13, 0xb8, 0x73, 0x29, 0x81, 0x69, 0xf6, 0x68, 0xd4, 0x59, 0xe7,
+ 0xbc, 0x7a, 0xf6, 0x9b, 0xfe, 0x82, 0xcc, 0x6e, 0xea, 0x8b, 0xd1, 0x5a,
+ 0xcc, 0x12, 0x0c, 0xd6, 0xfe, 0xbf, 0xb5, 0x1a, 0x50, 0x96, 0x53, 0xe7,
0x02, 0x00,
};
#define BUF_SIZE 0x10000
diff --git a/src/tool_main.c b/src/tool_main.c
index 7e742ffc..089a317d 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index f4173562..7646a7fd 100644
--- a/src/tool_metalink.c
+++ b/src/tool_metalink.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -812,7 +812,7 @@ int parse_metalink(struct OperationConfig *config, struct OutStruct *outs,
if(!(*files)->resources) {
fprintf(config->global->errors, "Metalink: parsing (%s) WARNING "
"(missing or invalid resource)\n",
- metalink_url, (*files)->name);
+ metalink_url);
continue;
}
if(config->url_get ||
diff --git a/src/tool_msgs.c b/src/tool_msgs.c
index 1454903a..d06708a1 100644
--- a/src/tool_msgs.c
+++ b/src/tool_msgs.c
@@ -38,7 +38,7 @@ static void voutf(struct GlobalConfig *config,
const char *fmt,
va_list ap)
{
- size_t width = (79 - (int)strlen(prefix));
+ size_t width = (79 - strlen(prefix));
if(!config->mute) {
size_t len;
char *ptr;
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 54a11f65..1e8d0073 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -35,10 +35,6 @@
# include <locale.h>
#endif
-#ifdef HAVE_NETINET_TCP_H
-# include <netinet/tcp.h>
-#endif
-
#ifdef __VMS
# include <fabdef.h>
#endif
@@ -75,7 +71,6 @@
#include "tool_sleep.h"
#include "tool_urlglob.h"
#include "tool_util.h"
-#include "tool_writeenv.h"
#include "tool_writeout.h"
#include "tool_xattr.h"
#include "tool_vms.h"
@@ -188,6 +183,81 @@ static curl_off_t VmsSpecialSize(const char *name,
}
#endif /* __VMS */
+#if defined(HAVE_UTIME) || \
+ (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8))
+static void setfiletime(long filetime, const char *filename,
+ FILE *error_stream)
+{
+ if(filetime >= 0) {
+/* Windows utime() may attempt to adjust our unix gmt 'filetime' by a daylight
+ saving time offset and since it's GMT that is bad behavior. When we have
+ access to a 64-bit type we can bypass utime and set the times directly. */
+#if defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)
+ HANDLE hfile;
+
+#if (CURL_SIZEOF_LONG >= 8)
+ /* 910670515199 is the maximum unix filetime that can be used as a
+ Windows FILETIME without overflow: 30827-12-31T23:59:59. */
+ if(filetime > CURL_OFF_T_C(910670515199)) {
+ fprintf(error_stream,
+ "Failed to set filetime %ld on outfile: overflow\n",
+ filetime);
+ return;
+ }
+#endif /* CURL_SIZEOF_LONG >= 8 */
+
+ hfile = CreateFileA(filename, FILE_WRITE_ATTRIBUTES,
+ (FILE_SHARE_READ | FILE_SHARE_WRITE |
+ FILE_SHARE_DELETE),
+ NULL, OPEN_EXISTING, 0, NULL);
+ if(hfile != INVALID_HANDLE_VALUE) {
+ curl_off_t converted = ((curl_off_t)filetime * 10000000) +
+ CURL_OFF_T_C(116444736000000000);
+ FILETIME ft;
+ ft.dwLowDateTime = (DWORD)(converted & 0xFFFFFFFF);
+ ft.dwHighDateTime = (DWORD)(converted >> 32);
+ if(!SetFileTime(hfile, NULL, &ft, &ft)) {
+ fprintf(error_stream,
+ "Failed to set filetime %ld on outfile: "
+ "SetFileTime failed: GetLastError %u\n",
+ filetime, GetLastError());
+ }
+ CloseHandle(hfile);
+ }
+ else {
+ fprintf(error_stream,
+ "Failed to set filetime %ld on outfile: "
+ "CreateFile failed: GetLastError %u\n",
+ filetime, GetLastError());
+ }
+
+#elif defined(HAVE_UTIMES)
+ struct timeval times[2];
+ times[0].tv_sec = times[1].tv_sec = filetime;
+ times[0].tv_usec = times[1].tv_usec = 0;
+ if(utimes(filename, times)) {
+ fprintf(error_stream,
+ "Failed to set filetime %ld on outfile: errno %d\n",
+ filetime, errno);
+ }
+
+#elif defined(HAVE_UTIME)
+ struct utimbuf times;
+ times.actime = (time_t)filetime;
+ times.modtime = (time_t)filetime;
+ if(utime(filename, &times)) {
+ fprintf(error_stream,
+ "Failed to set filetime %ld on outfile: errno %d\n",
+ filetime, errno);
+ }
+#endif
+ }
+}
+#endif /* defined(HAVE_UTIME) || \
+ (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)) */
+
+#define BUFFER_SIZE (100*1024)
+
static CURLcode operate_do(struct GlobalConfig *global,
struct OperationConfig *config)
{
@@ -792,6 +862,9 @@ static CURLcode operate_do(struct GlobalConfig *global,
set_binmode(stdout);
}
+ /* explicitly passed to stdout means okaying binary gunk */
+ config->terminal_binary_ok = (outfile && !strcmp(outfile, "-"));
+
if(!config->tcp_nodelay)
my_setopt(curl, CURLOPT_TCP_NODELAY, 0L);
@@ -830,10 +903,12 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_SEEKDATA, &input);
my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb);
- if(config->recvpersecond)
- /* tell libcurl to use a smaller sized buffer as it allows us to
- make better sleeps! 7.9.9 stuff! */
+ if(config->recvpersecond &&
+ (config->recvpersecond < BUFFER_SIZE))
+ /* use a smaller sized buffer for better sleeps */
my_setopt(curl, CURLOPT_BUFFERSIZE, (long)config->recvpersecond);
+ else
+ my_setopt(curl, CURLOPT_BUFFERSIZE, (long)BUFFER_SIZE);
/* size of uploaded file: */
if(uploadfilesize != -1)
@@ -890,10 +965,14 @@ static CURLcode operate_do(struct GlobalConfig *global,
/* new in libcurl 7.19.4 */
my_setopt_str(curl, CURLOPT_NOPROXY, config->noproxy);
+
+ my_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS,
+ config->suppress_connect_headers?1L:0L);
}
-#endif
+#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_DIRLISTONLY, config->dirlistonly?1L:0L);
my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);
@@ -1018,6 +1097,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_CAINFO, config->cacert);
if(config->proxy_cacert)
my_setopt_str(curl, CURLOPT_PROXY_CAINFO, config->proxy_cacert);
+
if(config->capath) {
result = res_setopt_str(curl, CURLOPT_CAPATH, config->capath);
if(result == CURLE_NOT_BUILT_IN) {
@@ -1028,10 +1108,22 @@ static CURLcode operate_do(struct GlobalConfig *global,
else if(result)
goto show_error;
}
- if(config->proxy_capath)
- my_setopt_str(curl, CURLOPT_PROXY_CAPATH, config->proxy_capath);
- else if(config->capath) /* CURLOPT_PROXY_CAPATH default is capath */
- my_setopt_str(curl, CURLOPT_PROXY_CAPATH, config->capath);
+ /* 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) {
+ result = res_setopt_str(curl, CURLOPT_PROXY_CAPATH,
+ (config->proxy_capath ?
+ config->proxy_capath :
+ config->capath));
+ if(result == CURLE_NOT_BUILT_IN) {
+ if(config->proxy_capath) {
+ warnf(config->global,
+ "ignoring --proxy-capath, not supported by libcurl\n");
+ }
+ }
+ else if(result)
+ goto show_error;
+ }
if(config->crlfile)
my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile);
@@ -1078,7 +1170,8 @@ static CURLcode operate_do(struct GlobalConfig *global,
if(config->falsestart)
my_setopt(curl, CURLOPT_SSL_FALSESTART, 1L);
- my_setopt_enum(curl, CURLOPT_SSLVERSION, config->ssl_version);
+ my_setopt_enum(curl, CURLOPT_SSLVERSION,
+ config->ssl_version | config->ssl_version_max);
my_setopt_enum(curl, CURLOPT_PROXY_SSLVERSION,
config->proxy_ssl_version);
}
@@ -1250,6 +1343,11 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_NEC,
config->socks5_gssapi_nec);
+ /* new in curl 7.55.0 */
+ if(config->socks5_auth)
+ my_setopt_bitmask(curl, CURLOPT_SOCKS5_AUTH,
+ (long)config->socks5_auth);
+
/* new in curl 7.43.0 */
if(config->proxy_service_name)
my_setopt_str(curl, CURLOPT_PROXY_SERVICE_NAME,
@@ -1397,11 +1495,17 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L);
}
- /* new in 7.40.0 */
- if(config->unix_socket_path)
- my_setopt_str(curl, CURLOPT_UNIX_SOCKET_PATH,
- config->unix_socket_path);
-
+ /* new in 7.40.0, abstract support added in 7.53.0 */
+ if(config->unix_socket_path) {
+ if(config->abstract_unix_socket) {
+ my_setopt_str(curl, CURLOPT_ABSTRACT_UNIX_SOCKET,
+ config->unix_socket_path);
+ }
+ else {
+ my_setopt_str(curl, CURLOPT_UNIX_SOCKET_PATH,
+ config->unix_socket_path);
+ }
+ }
/* new in 7.45.0 */
if(config->proto_default)
my_setopt_str(curl, CURLOPT_DEFAULT_PROTOCOL, config->proto_default);
@@ -1620,7 +1724,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
metalink_next_res = 1;
fprintf(global->errors,
"Metalink: fetching (%s) from (%s) FAILED "
- "(HTTP status code %d)\n",
+ "(HTTP status code %ld)\n",
mlfile->filename, this_url, response);
}
}
@@ -1652,9 +1756,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
if(config->writeout)
ourWriteOut(curl, &outs, config->writeout);
- if(config->writeenv)
- ourWriteEnv(curl);
-
/*
** Code within this loop may jump directly here to label 'show_error'
** in order to display an error message for CURLcode stored in 'res'
@@ -1672,12 +1773,19 @@ static CURLcode operate_do(struct GlobalConfig *global,
}
else
#endif
- if(result && global->showerror) {
+ 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)
- fprintf(global->errors, "%s%s",
- CURL_CA_CERT_ERRORMSG1, CURL_CA_CERT_ERRORMSG2);
+ fprintf(global->errors, "%s%s%s",
+ CURL_CA_CERT_ERRORMSG1, CURL_CA_CERT_ERRORMSG2,
+ ((curlinfo->features & CURL_VERSION_HTTPS_PROXY) ?
+ "HTTPS-proxy has similar options --proxy-cacert "
+ "and --proxy-insecure.\n" :
+ ""));
}
/* Fall through comment to 'quit_urls' label */
@@ -1731,20 +1839,18 @@ static CURLcode operate_do(struct GlobalConfig *global,
}
#endif
-#ifdef HAVE_UTIME
+#if defined(HAVE_UTIME) || \
+ (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8))
/* 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 */
long filetime = -1;
curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
- if(filetime >= 0) {
- struct utimbuf times;
- times.actime = (time_t)filetime;
- times.modtime = (time_t)filetime;
- utime(outs.filename, &times); /* set the time we got */
- }
+ if(filetime >= 0)
+ setfiletime(filetime, outs.filename, config->global->errors);
}
-#endif
+#endif /* defined(HAVE_UTIME) || \
+ (defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8)) */
#ifdef USE_METALINK
if(!metalink && config->use_metalink && result == CURLE_OK) {
@@ -1958,6 +2064,9 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
result = operate_do(config, config->current);
config->current = config->current->next;
+
+ if(config->current && config->current->easy)
+ curl_easy_reset(config->current->easy);
}
#ifndef CURL_DISABLE_LIBCURL_OPTION
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index 257e5c69..b9dedc98 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -164,7 +164,11 @@ ParameterError str2num(long *val, const char *str)
{
if(str) {
char *endptr;
- long num = strtol(str, &endptr, 10);
+ long num;
+ errno = 0;
+ num = strtol(str, &endptr, 10);
+ if(errno == ERANGE)
+ return PARAM_NUMBER_TOO_LARGE;
if((endptr != str) && (endptr == str + strlen(str))) {
*val = num;
return PARAM_OK; /* Ok */
@@ -197,16 +201,27 @@ ParameterError str2unum(long *val, const char *str)
* Parse the string and write the double in the given address. Return PARAM_OK
* on success, otherwise a parameter specific error enum.
*
+ * The 'max' argument is the maximum value allowed, as the numbers are often
+ * multiplied when later used.
+ *
* 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 str2double(double *val, const char *str)
+static ParameterError str2double(double *val, const char *str, long max)
{
if(str) {
char *endptr;
- double num = strtod(str, &endptr);
+ double num;
+ errno = 0;
+ num = strtod(str, &endptr);
+ if(errno == ERANGE)
+ return PARAM_NUMBER_TOO_LARGE;
+ if((long)num > max) {
+ /* too large */
+ return PARAM_NUMBER_TOO_LARGE;
+ }
if((endptr != str) && (endptr == str + strlen(str))) {
*val = num;
return PARAM_OK; /* Ok */
@@ -219,14 +234,17 @@ ParameterError str2double(double *val, const char *str)
* Parse the string and write the double in the given address. Return PARAM_OK
* on success, otherwise a parameter error enum. ONLY ACCEPTS POSITIVE NUMBERS!
*
+ * The 'max' argument is the maximum value allowed, as the numbers are often
+ * multiplied when later used.
+ *
* 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 str2udouble(double *val, const char *str)
+ParameterError str2udouble(double *val, const char *str, long max)
{
- ParameterError result = str2double(val, str);
+ ParameterError result = str2double(val, str, max);
if(result != PARAM_OK)
return result;
if(*val < 0)
@@ -383,12 +401,13 @@ ParameterError str2offset(curl_off_t *val, const char *str)
#if(CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
*val = curlx_strtoofft(str, &endptr, 0);
- if((*val == CURL_OFF_T_MAX || *val == CURL_OFF_T_MIN) && (ERRNO == ERANGE))
- return PARAM_BAD_NUMERIC;
+ if((*val == CURL_OFF_T_MAX || *val == CURL_OFF_T_MIN) && (errno == ERANGE))
+ return PARAM_NUMBER_TOO_LARGE;
#else
+ errno = 0;
*val = strtol(str, &endptr, 0);
- if((*val == LONG_MIN || *val == LONG_MAX) && ERRNO == ERANGE)
- return PARAM_BAD_NUMERIC;
+ if((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)
+ return PARAM_NUMBER_TOO_LARGE;
#endif
if((endptr != str) && (endptr == str + strlen(str)))
return PARAM_OK;
@@ -550,3 +569,36 @@ CURLcode get_args(struct OperationConfig *config, const size_t i)
return result;
}
+
+/*
+ * Parse the string and modify ssl_version in the val argument. 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 str2tls_max(long *val, const char *str)
+{
+ static struct s_tls_max {
+ const char *tls_max_str;
+ long tls_max;
+ } const tls_max_array[] = {
+ { "default", CURL_SSLVERSION_MAX_DEFAULT },
+ { "1.0", CURL_SSLVERSION_MAX_TLSv1_0 },
+ { "1.1", CURL_SSLVERSION_MAX_TLSv1_1 },
+ { "1.2", CURL_SSLVERSION_MAX_TLSv1_2 },
+ { "1.3", CURL_SSLVERSION_MAX_TLSv1_3 }
+ };
+ size_t i = 0;
+ if(!str)
+ return PARAM_REQUIRES_PARAMETER;
+ for(i = 0; i < sizeof(tls_max_array)/sizeof(tls_max_array[0]); i++) {
+ if(!strcmp(str, tls_max_array[i].tls_max_str)) {
+ *val = tls_max_array[i].tls_max;
+ return PARAM_OK;
+ }
+ }
+ return PARAM_BAD_USE;
+}
diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h
index 89a99b2b..854f5225 100644
--- a/src/tool_paramhlp.h
+++ b/src/tool_paramhlp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,8 +33,7 @@ void cleanarg(char *str);
ParameterError str2num(long *val, const char *str);
ParameterError str2unum(long *val, const char *str);
-ParameterError str2double(double *val, const char *str);
-ParameterError str2udouble(double *val, const char *str);
+ParameterError str2udouble(double *val, const char *str, long max);
long proto2num(struct OperationConfig *config, long *val, const char *str);
@@ -52,4 +51,6 @@ int ftpcccmethod(struct OperationConfig *config, const char *str);
long delegation(struct OperationConfig *config, char *str);
+ParameterError str2tls_max(long *val, const char *str);
+
#endif /* HEADER_CURL_TOOL_PARAMHLP_H */
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 7cf11d8a..93814f45 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -49,7 +49,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
int res;
FILE *file;
char filebuffer[512];
- bool usedarg;
+ bool usedarg = FALSE;
char *home;
int rc = 0;
struct OperationConfig *operation = global->first;
@@ -79,7 +79,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
* already declared via inclusions done in setup header file.
* We assume that we are using the ASCII version here.
*/
- int n = GetModuleFileName(0, filebuffer, sizeof(filebuffer));
+ 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, '\\');
@@ -220,7 +220,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
#endif
res = getparameter(option, param, &usedarg, global, operation);
- if(param && *param && !usedarg)
+ if(!res && param && *param && !usedarg)
/* we passed in a parameter that wasn't used! */
res = PARAM_GOT_EXTRA_PARAMETER;
@@ -253,7 +253,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(res != PARAM_OK && res != PARAM_NEXT_OPERATION) {
/* the help request isn't really an error */
if(!strcmp(filename, "-")) {
- filename = (char *)"<stdin>";
+ filename = "<stdin>";
}
if(res != PARAM_HELP_REQUESTED &&
res != PARAM_MANUAL_REQUESTED &&
diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index ad3d3073..694d3ffa 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -170,6 +170,7 @@ static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
NV1(CURLOPT_TCP_NODELAY, 1),
NV1(CURLOPT_PROXY_SSL_VERIFYPEER, 1),
NV1(CURLOPT_PROXY_SSL_VERIFYHOST, 1),
+ NV1(CURLOPT_SOCKS5_AUTH, 1),
NVEND
};
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index fecf24fa..da67deeb 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -71,8 +71,8 @@ extern const NameValueUnsigned setopt_nv_CURLAUTH[];
#define setopt_nv_CURLOPT_PROTOCOLS setopt_nv_CURLPROTO
#define setopt_nv_CURLOPT_REDIR_PROTOCOLS setopt_nv_CURLPROTO
#define setopt_nv_CURLOPT_PROXYTYPE setopt_nv_CURLPROXY
-#define setopt_nv_CURLOPT_SOCKS_PROXYTYPE setopt_nv_CURL_SOCKS_PROXY
#define setopt_nv_CURLOPT_PROXYAUTH setopt_nv_CURLAUTH
+#define setopt_nv_CURLOPT_SOCKS5_AUTH setopt_nv_CURLAUTH
/* Intercept setopt calls for --libcurl */
diff --git a/src/tool_sleep.c b/src/tool_sleep.c
index d878512a..a63d85ff 100644
--- a/src/tool_sleep.c
+++ b/src/tool_sleep.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -25,10 +25,10 @@
# include <sys/select.h>
#endif
-#ifdef HAVE_SYS_POLL_H
-# include <sys/poll.h>
-#elif defined(HAVE_POLL_H)
+#ifdef HAVE_POLL_H
# include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+# include <sys/poll.h>
#endif
#ifdef MSDOS
@@ -51,7 +51,7 @@ void tool_go_sleep(long ms)
struct timeval timeout;
timeout.tv_sec = ms / 1000L;
ms = ms % 1000L;
- timeout.tv_usec = ms * 1000L;
+ timeout.tv_usec = (int)ms * 1000;
select(0, NULL, NULL, NULL, &timeout);
#endif
}
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c
index 0edfac6f..d56dcd91 100644
--- a/src/tool_urlglob.c
+++ b/src/tool_urlglob.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -66,6 +66,10 @@ static CURLcode glob_fixed(URLGlob *glob, char *fixed, size_t len)
static int multiply(unsigned long *amount, long with)
{
unsigned long sum = *amount * with;
+ if(!with) {
+ *amount = 0;
+ return 0;
+ }
if(sum/with != *amount)
return 1; /* didn't fit, bail out */
*amount = sum;
@@ -189,7 +193,7 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
char min_c;
char max_c;
char end_c;
- int step=1;
+ unsigned long step = 1;
pat->type = UPTCharRange;
@@ -198,17 +202,12 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
if(rc == 3) {
if(end_c == ':') {
char *endp;
- unsigned long lstep;
errno = 0;
- lstep = strtoul(&pattern[4], &endp, 10);
+ step = strtoul(&pattern[4], &endp, 10);
if(errno || &pattern[4] == endp || *endp != ']')
- step = -1;
- else {
+ step = 0;
+ else
pattern = endp+1;
- step = (int)lstep;
- if(step > (max_c - min_c))
- step = -1;
- }
}
else if(end_c != ']')
/* then this is wrong */
@@ -220,19 +219,21 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
*posp += (pattern - *patternp);
- if((rc != 3) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a')) ||
- (step <= 0) )
+ if(rc != 3 || !step || step > (unsigned)INT_MAX ||
+ (min_c == max_c && step != 1) ||
+ (min_c != max_c && (min_c > max_c || step > (unsigned)(max_c - min_c) ||
+ (max_c - min_c) > ('z' - 'a'))))
/* the pattern is not well-formed */
return GLOBERROR("bad range", *posp, CURLE_URL_MALFORMAT);
/* if there was a ":[num]" thing, use that as step or else use 1 */
- pat->content.CharRange.step = step;
+ pat->content.CharRange.step = (int)step;
pat->content.CharRange.ptr_c = pat->content.CharRange.min_c = min_c;
pat->content.CharRange.max_c = max_c;
- if(multiply(amount, (pat->content.CharRange.max_c -
+ if(multiply(amount, ((pat->content.CharRange.max_c -
pat->content.CharRange.min_c) /
- pat->content.CharRange.step + 1) )
+ pat->content.CharRange.step + 1)))
return GLOBERROR("range overflow", *posp, CURLE_URL_MALFORMAT);
}
else if(ISDIGIT(*pattern)) {
@@ -272,7 +273,10 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
}
errno = 0;
max_n = strtoul(pattern, &endp, 10);
- if(errno || (*endp == ':')) {
+ if(errno)
+ /* overflow */
+ endp = NULL;
+ else if(*endp == ':') {
pattern = endp+1;
errno = 0;
step_n = strtoul(pattern, &endp, 10);
@@ -293,7 +297,9 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
fail:
*posp += (pattern - *patternp);
- if(!endp || (min_n > max_n) || (step_n > (max_n - min_n)) || !step_n)
+ if(!endp || !step_n ||
+ (min_n == max_n && step_n != 1) ||
+ (min_n != max_n && (min_n > max_n || step_n > (max_n - min_n))))
/* the pattern is not well-formed */
return GLOBERROR("bad range", *posp, CURLE_URL_MALFORMAT);
@@ -303,9 +309,9 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
pat->content.NumRange.max_n = max_n;
pat->content.NumRange.step = step_n;
- if(multiply(amount, (pat->content.NumRange.max_n -
- pat->content.NumRange.min_n) /
- pat->content.NumRange.step + 1) )
+ if(multiply(amount, ((pat->content.NumRange.max_n -
+ pat->content.NumRange.min_n) /
+ pat->content.NumRange.step + 1)))
return GLOBERROR("range overflow", *posp, CURLE_URL_MALFORMAT);
}
else
@@ -646,7 +652,7 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
appendlen = 1;
break;
case UPTNumRange:
- snprintf(numbuf, sizeof(numbuf), "%0*d",
+ snprintf(numbuf, sizeof(numbuf), "%0*lu",
pat->content.NumRange.padlength,
pat->content.NumRange.ptr_n);
appendthis = numbuf;
diff --git a/src/tool_util.c b/src/tool_util.c
index 8af15ff0..875411e3 100644
--- a/src/tool_util.c
+++ b/src/tool_util.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -27,7 +27,7 @@
#if defined(WIN32) && !defined(MSDOS)
-struct timeval tool_tvnow(void)
+struct timeval tvnow(void)
{
/*
** GetTickCount() is available on _all_ Windows versions from W95 up
@@ -52,7 +52,7 @@ struct timeval tool_tvnow(void)
#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
-struct timeval tool_tvnow(void)
+struct timeval tvnow(void)
{
/*
** clock_gettime() is granted to be increased monotonically when the
@@ -86,7 +86,7 @@ struct timeval tool_tvnow(void)
#elif defined(HAVE_GETTIMEOFDAY)
-struct timeval tool_tvnow(void)
+struct timeval tvnow(void)
{
/*
** gettimeofday() is not granted to be increased monotonically, due to
@@ -100,7 +100,7 @@ struct timeval tool_tvnow(void)
#else
-struct timeval tool_tvnow(void)
+struct timeval tvnow(void)
{
/*
** time() returns the value of time in seconds since the Epoch.
@@ -119,29 +119,8 @@ struct timeval tool_tvnow(void)
*
* Returns: the time difference in number of milliseconds.
*/
-long tool_tvdiff(struct timeval newer, struct timeval older)
+long tvdiff(struct timeval newer, struct timeval older)
{
- return (newer.tv_sec-older.tv_sec)*1000+
- (newer.tv_usec-older.tv_usec)/1000;
+ return (long)(newer.tv_sec-older.tv_sec)*1000+
+ (long)(newer.tv_usec-older.tv_usec)/1000;
}
-
-/*
- * Same as tool_tvdiff but with full usec resolution.
- *
- * Returns: the time difference in seconds with subsecond resolution.
- */
-double tool_tvdiff_secs(struct timeval newer, struct timeval older)
-{
- if(newer.tv_sec != older.tv_sec)
- return (double)(newer.tv_sec-older.tv_sec)+
- (double)(newer.tv_usec-older.tv_usec)/1000000.0;
- else
- return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
-}
-
-/* return the number of seconds in the given input timeval struct */
-long tool_tvlong(struct timeval t1)
-{
- return t1.tv_sec;
-}
-
diff --git a/src/tool_util.h b/src/tool_util.h
index 8f72d626..fda1e61b 100644
--- a/src/tool_util.h
+++ b/src/tool_util.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,7 +23,7 @@
***************************************************************************/
#include "tool_setup.h"
-struct timeval tool_tvnow(void);
+struct timeval tvnow(void);
/*
* Make sure that the first argument (t1) is the more recent time and t2 is
@@ -31,26 +31,7 @@ struct timeval tool_tvnow(void);
*
* Returns: the time difference in number of milliseconds.
*/
-long tool_tvdiff(struct timeval t1, struct timeval t2);
-
-/*
- * Same as tool_tvdiff but with full usec resolution.
- *
- * Returns: the time difference in seconds with subsecond resolution.
- */
-double tool_tvdiff_secs(struct timeval t1, struct timeval t2);
-
-long tool_tvlong(struct timeval t1);
-
-#undef tvnow
-#undef tvdiff
-#undef tvdiff_secs
-#undef tvlong
-
-#define tvnow() tool_tvnow()
-#define tvdiff(a,b) tool_tvdiff((a), (b))
-#define tvdiff_secs(a,b) tool_tvdiff_secs((a), (b))
-#define tvlong(a) tool_tvlong((a))
+long tvdiff(struct timeval t1, struct timeval t2);
#endif /* HEADER_CURL_TOOL_UTIL_H */
diff --git a/src/tool_version.h b/src/tool_version.h
index 3493f9cb..b1647403 100644
--- a/src/tool_version.h
+++ b/src/tool_version.h
@@ -25,7 +25,7 @@
#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.52.1"
+#define CURL_VERSION "7.55.0"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
diff --git a/src/tool_writeenv.c b/src/tool_writeenv.c
deleted file mode 100644
index 0bc075ab..00000000
--- a/src/tool_writeenv.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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"
-
-#ifdef USE_ENVIRONMENT
-
-#ifdef __riscos__
-# include <kernel.h>
-#endif
-
-#include <curl/mprintf.h>
-#include "tool_writeenv.h"
-#include "memdebug.h" /* keep this as LAST include */
-
-static const struct
-{
- const char *name;
- CURLINFO id;
- enum {
- writeenv_NONE,
- writeenv_DOUBLE,
- writeenv_LONG,
- writeenv_STRING
- } type;
-} variables[14] =
-{
- {"curl_url_effective", CURLINFO_EFFECTIVE_URL, writeenv_STRING},
- {"curl_http_code", CURLINFO_RESPONSE_CODE, writeenv_LONG},
- {"curl_time_total", CURLINFO_TOTAL_TIME, writeenv_DOUBLE},
- {"curl_time_namelookup", CURLINFO_NAMELOOKUP_TIME, writeenv_DOUBLE},
- {"curl_time_connect", CURLINFO_CONNECT_TIME, writeenv_DOUBLE},
- {"curl_time_pretransfer", CURLINFO_PRETRANSFER_TIME, writeenv_DOUBLE},
- {"curl_time_starttransfer", CURLINFO_STARTTRANSFER_TIME, writeenv_DOUBLE},
- {"curl_size_header", CURLINFO_HEADER_SIZE, writeenv_LONG},
- {"curl_size_request", CURLINFO_REQUEST_SIZE, writeenv_LONG},
- {"curl_size_download", CURLINFO_SIZE_DOWNLOAD, writeenv_DOUBLE},
- {"curl_size_upload", CURLINFO_SIZE_UPLOAD, writeenv_DOUBLE},
- {"curl_speed_download", CURLINFO_SPEED_DOWNLOAD, writeenv_DOUBLE},
- {"curl_speed_upload", CURLINFO_SPEED_UPLOAD, writeenv_DOUBLE},
- {NULL, 0, writeenv_NONE}
- };
-
-static void internalSetEnv(const char *name, char *value)
-{
- /* Add your OS-specific code here. */
-#ifdef __riscos__
- _kernel_setenv(name, value);
-#elif defined (CURLDEBUG)
- curl_memlog("ENV %s = %s\n", name, value);
-#endif
- return;
-}
-
-void ourWriteEnv(CURL *curl)
-{
- unsigned int i;
- char *string, numtext[10];
- long longinfo;
- double doubleinfo;
-
- for(i=0; variables[i].name; i++) {
- switch(variables[i].type) {
- case writeenv_STRING:
- if(curl_easy_getinfo(curl, variables[i].id, &string) == CURLE_OK)
- internalSetEnv(variables[i].name, string);
- else
- internalSetEnv(variables[i].name, NULL);
- break;
-
- case writeenv_LONG:
- if(curl_easy_getinfo(curl, variables[i].id, &longinfo) == CURLE_OK) {
- curl_msprintf(numtext, "%5ld", longinfo);
- internalSetEnv(variables[i].name, numtext);
- }
- else
- internalSetEnv(variables[i].name, NULL);
- break;
- case writeenv_DOUBLE:
- if(curl_easy_getinfo(curl, variables[i].id, &doubleinfo) == CURLE_OK) {
- curl_msprintf(numtext, "%6.2f", doubleinfo);
- internalSetEnv(variables[i].name, numtext);
- }
- else
- internalSetEnv(variables[i].name, NULL);
- break;
- default:
- break;
- }
- }
-
- return;
-}
-
-#endif
diff --git a/src/tool_writeout.c b/src/tool_writeout.c
index 2fb77742..5d92bd27 100644
--- a/src/tool_writeout.c
+++ b/src/tool_writeout.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -113,7 +113,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
double doubleinfo;
while(ptr && *ptr) {
- if('%' == *ptr) {
+ if('%' == *ptr && ptr[1]) {
if('%' == ptr[1]) {
/* an escaped %-letter */
fputc('%', stream);
@@ -341,7 +341,7 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
}
}
}
- else if('\\' == *ptr) {
+ else if('\\' == *ptr && ptr[1]) {
switch(ptr[1]) {
case 'r':
fputc('\r', stream);
diff --git a/src/tool_xattr.c b/src/tool_xattr.c
index f49fd571..92b99db6 100644
--- a/src/tool_xattr.c
+++ b/src/tool_xattr.c
@@ -42,7 +42,7 @@ static const struct xattr_mapping {
CURLINFO info;
} mappings[] = {
/* mappings proposed by
- * http://freedesktop.org/wiki/CommonExtendedAttributes
+ * https://freedesktop.org/wiki/CommonExtendedAttributes/
*/
{ "user.xdg.origin.url", CURLINFO_EFFECTIVE_URL },
{ "user.mime_type", CURLINFO_CONTENT_TYPE },
diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT
index 04a6daeb..75e561ae 100644
--- a/tests/FILEFORMAT
+++ b/tests/FILEFORMAT
@@ -86,11 +86,18 @@ The connect section is used instead of the 'data' for all CONNECT
requests. The remainder of the rules for the data section then apply but with
a connect prefix.
</connect>
-<datacheck [nonewline="yes"]>
+<datacheck [mode="text"] [nonewline="yes"]>
if the data is sent but this is what should be checked afterwards. If
'nonewline' is set, we will cut off the trailing newline of this given data
-before comparing with the one actually received by the client
+before comparing with the one actually received by the client.
+
+Use the mode="text" attribute if the output is in text mode on platforms that
+have a text/binary difference.
</datacheck>
+<datacheckNUM [nonewline="yes"] [mode="text"]>
+The contents of numbered datacheck sections are appended to the non-numbered
+one.
+</datacheckNUM>
<size>
number to return on a ftp SIZE command (set to -1 to make this command fail)
</size>
@@ -176,6 +183,7 @@ ftp-ipv6
ftps
http
http-ipv6
+http-pipe
http-proxy
http-unix
https
@@ -231,6 +239,7 @@ SSLpinning
SSPI
TLS-SRP
TrackMemory
+threaded-resolver
unittest
unix-sockets
WinSSL
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d9dbf0e1..d058eecc 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -22,14 +22,21 @@
HTMLPAGES = testcurl.html runtests.html
PDFPAGES = testcurl.pdf runtests.pdf
+MANDISTPAGES = runtests.1.dist testcurl.1.dist
+
+# the path to the impacket python lib used for SMB tests
+IMP = python_dependencies/impacket
+SMBDEPS = $(IMP)/__init__.py $(IMP)/nmb.py $(IMP)/nt_errors.py \
+ $(IMP)/ntlm.py $(IMP)/smb.py $(IMP)/smb3.py $(IMP)/smb3structs.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 \
- $(HTMLPAGES) $(PDFPAGES) \
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
+ manpage-scan.pl nroff-scan.pl http2-server.pl $(SMBDEPS)
DISTCLEANFILES = configurehelp.pm
@@ -45,11 +52,11 @@ DIST_UNIT = unit
endif
SUBDIRS = certs data server libtest $(BUILD_UNIT)
-DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT)
+DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT) fuzz
PERLFLAGS = -I$(srcdir)
-CLEANFILES = .http.pid .https.pid .ftp.pid .ftps.pid
+CLEANFILES = .http.pid .https.pid .ftp.pid .ftps.pid $(MANDISTPAGES)
MAN2HTML= roffit $< >$@
@@ -64,6 +71,10 @@ TEST_Q = -a -s
TEST_AM = -a -am
TEST_F = -a -p -r
TEST_T = -a -t
+TEST_E = -a -e
+
+# !flaky means that it'll skip all tests using the flaky keyword
+TEST_NF = -a -p -r !flaky
endif
# make sure that PERL is pointing to an executable
@@ -71,19 +82,25 @@ perlcheck:
@if ! test -x "$(PERL)"; then echo "No perl!"; exit 2; fi
test: perlcheck all
- $(TEST)
+ $(TEST) $(TFLAGS)
quiet-test: perlcheck all
- $(TEST) $(TEST_Q)
+ $(TEST) $(TEST_Q) $(TFLAGS)
am-test: perlcheck all
- $(TEST) $(TEST_AM)
+ $(TEST) $(TEST_AM) $(TFLAGS)
full-test: perlcheck all
- $(TEST) $(TEST_F)
+ $(TEST) $(TEST_F) $(TFLAGS)
+
+nonflaky-test: perlcheck all
+ $(TEST) $(TEST_NF) $(TFLAGS)
torture-test: perlcheck all
- $(TEST) $(TEST_T)
+ $(TEST) $(TEST_T) $(TFLAGS)
+
+event-test: perlcheck all
+ $(TEST) $(TEST_E) $(TFLAGS)
.1.html:
$(MAN2HTML)
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 5f9ebcb1..e8f668cc 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -111,7 +111,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = tests
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -132,8 +133,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -231,6 +231,12 @@ 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@
@@ -270,6 +276,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -282,6 +290,7 @@ 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@
@@ -409,13 +418,21 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
HTMLPAGES = testcurl.html runtests.html
PDFPAGES = testcurl.pdf runtests.pdf
+MANDISTPAGES = runtests.1.dist testcurl.1.dist
+
+# the path to the impacket python lib used for SMB tests
+IMP = python_dependencies/impacket
+SMBDEPS = $(IMP)/__init__.py $(IMP)/nmb.py $(IMP)/nt_errors.py \
+ $(IMP)/ntlm.py $(IMP)/smb.py $(IMP)/smb3.py $(IMP)/smb3structs.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 \
- $(HTMLPAGES) $(PDFPAGES) \
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
+ manpage-scan.pl nroff-scan.pl http2-server.pl $(SMBDEPS)
DISTCLEANFILES = configurehelp.pm
@BUILD_UNITTESTS_FALSE@BUILD_UNIT =
@@ -427,9 +444,9 @@ DISTCLEANFILES = configurehelp.pm
@BUILD_UNITTESTS_FALSE@DIST_UNIT = unit
@BUILD_UNITTESTS_TRUE@DIST_UNIT =
SUBDIRS = certs data server libtest $(BUILD_UNIT)
-DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT)
+DIST_SUBDIRS = $(SUBDIRS) $(DIST_UNIT) fuzz
PERLFLAGS = -I$(srcdir)
-CLEANFILES = .http.pid .https.pid .ftp.pid .ftps.pid
+CLEANFILES = .http.pid .https.pid .ftp.pid .ftps.pid $(MANDISTPAGES)
MAN2HTML = roffit $< >$@
@CROSSCOMPILING_FALSE@TEST = srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl
@CROSSCOMPILING_TRUE@TEST = @echo "NOTICE: we can't run the tests when cross-compiling!"
@@ -437,6 +454,10 @@ MAN2HTML = roffit $< >$@
@CROSSCOMPILING_FALSE@TEST_AM = -a -am
@CROSSCOMPILING_FALSE@TEST_F = -a -p -r
@CROSSCOMPILING_FALSE@TEST_T = -a -t
+@CROSSCOMPILING_FALSE@TEST_E = -a -e
+
+# !flaky means that it'll skip all tests using the flaky keyword
+@CROSSCOMPILING_FALSE@TEST_NF = -a -p -r !flaky
all: all-recursive
.SUFFIXES:
@@ -450,9 +471,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/Makefile
+ $(AUTOMAKE) --foreign tests/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -761,19 +782,25 @@ perlcheck:
@if ! test -x "$(PERL)"; then echo "No perl!"; exit 2; fi
test: perlcheck all
- $(TEST)
+ $(TEST) $(TFLAGS)
quiet-test: perlcheck all
- $(TEST) $(TEST_Q)
+ $(TEST) $(TEST_Q) $(TFLAGS)
am-test: perlcheck all
- $(TEST) $(TEST_AM)
+ $(TEST) $(TEST_AM) $(TFLAGS)
full-test: perlcheck all
- $(TEST) $(TEST_F)
+ $(TEST) $(TEST_F) $(TFLAGS)
+
+nonflaky-test: perlcheck all
+ $(TEST) $(TEST_NF) $(TFLAGS)
torture-test: perlcheck all
- $(TEST) $(TEST_T)
+ $(TEST) $(TEST_T) $(TFLAGS)
+
+event-test: perlcheck all
+ $(TEST) $(TEST_E) $(TFLAGS)
.1.html:
$(MAN2HTML)
diff --git a/tests/README b/tests/README
index 8f52688c..16a8f06e 100644
--- a/tests/README
+++ b/tests/README
@@ -44,6 +44,7 @@ The curl Test Suite
stunnel (for HTTPS and FTPS tests)
OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests)
nghttpx (for HTTP/2 tests)
+ nroff (for --manual tests)
1.2 Port numbers used by test servers
@@ -59,14 +60,24 @@ The curl Test Suite
- TCP/8999 for SCP/SFTP
- TCP/9000 for SOCKS
- TCP/9001 for POP3
- - TCP/9002 for IMAP
- - TCP/9003 for SMTP
- - TCP/9004 for SMTP IPv6
- - TCP/9005 for RTSP
- - TCP/9006 for RTSP IPv6
- - TCP/9007 for GOPHER
- - TCP/9008 for GOPHER IPv6
- - TCP/9008 for HTTPS server with TLS-SRP support
+ - TCP/9002 for POP3 IPv6
+ - TCP/9003 for IMAP
+ - TCP/9004 for IMAP IPv6
+ - TCP/9005 for SMTP
+ - TCP/9006 for SMTP IPv6
+ - TCP/9007 for RTSP
+ - TCP/9008 for RTSP IPv6
+ - TCP/9009 for GOPHER
+ - TCP/9010 for GOPHER IPv6
+ - TCP/9011 for HTTPS server with TLS-SRP support
+ - TCP/9012 for HTTPS IPv6 server with TLS-SRP support
+ - TCP/9013 for HTTP proxy server for CONNECT
+ - TCP/9014 for HTTP pipelining server
+ - TCP/9015 for HTTP/2 server
+ - TCP/9016 for DICT server
+ - TCP/9017 for SMB server
+ - TCP/9018 for SMBS server (reserved)
+ - TCP/9019 for TELNET server with negotiation support
1.3 Test servers
@@ -87,10 +98,10 @@ The curl Test Suite
1.4 Run
- 'make test'. This builds the test suite support code and invokes the
- 'runtests.pl' perl script to run all the tests. Edit the top variables
- of that script in case you have some specific needs, or run the script
- manually (after the support code has been built).
+ './configure && make && make test'. This builds the test suite support code
+ and invokes the 'runtests.pl' perl script to run all the tests. Edit the top
+ variables of that script in case you have some specific needs, or run the
+ script manually (after the support code has been built).
The script breaks on the first test that doesn't do OK. Use -a to prevent
the script from aborting on the first error. Run the script with -v for more
diff --git a/tests/certs/Makefile.in b/tests/certs/Makefile.in
index 140bf3c5..1c690562 100644
--- a/tests/certs/Makefile.in
+++ b/tests/certs/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = tests/certs
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -210,6 +210,12 @@ 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@
@@ -249,6 +255,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -261,6 +269,7 @@ 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@
diff --git a/tests/certs/Server-localhost-sv.pem b/tests/certs/Server-localhost-sv.pem
index 6ef1fd51..a6d9b035 100644
--- a/tests/certs/Server-localhost-sv.pem
+++ b/tests/certs/Server-localhost-sv.pem
@@ -21,7 +21,7 @@ commonName_value = localhost
[something]
# The key
-# the certficate
+# the certificate
# some dhparam
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC6X0tpdDGZTfS0typluLcxwTjPNje7XhjjUh9SqlolLwxmiDKw
diff --git a/tests/certs/Server-localhost-sv.prm b/tests/certs/Server-localhost-sv.prm
index 97e64cec..50ccfd85 100644
--- a/tests/certs/Server-localhost-sv.prm
+++ b/tests/certs/Server-localhost-sv.prm
@@ -21,5 +21,5 @@ commonName_value = localhost
[something]
# The key
-# the certficate
+# the certificate
# some dhparam
diff --git a/tests/certs/Server-localhost.nn-sv.pem b/tests/certs/Server-localhost.nn-sv.pem
index b3712f74..7dfd4e6e 100644
--- a/tests/certs/Server-localhost.nn-sv.pem
+++ b/tests/certs/Server-localhost.nn-sv.pem
@@ -21,7 +21,7 @@ commonName_value = localhost.nn
[something]
# The key
-# the certficate
+# the certificate
# some dhparam
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCszBFwdCntewBEisBHA1Cdb1G3yXvdfu4pZ1uRm8fF5p1ZPmsz
diff --git a/tests/certs/Server-localhost.nn-sv.prm b/tests/certs/Server-localhost.nn-sv.prm
index 399e38a4..093d4756 100644
--- a/tests/certs/Server-localhost.nn-sv.prm
+++ b/tests/certs/Server-localhost.nn-sv.prm
@@ -21,5 +21,5 @@ commonName_value = localhost.nn
[something]
# The key
-# the certficate
+# the certificate
# some dhparam
diff --git a/tests/certs/scripts/Makefile.in b/tests/certs/scripts/Makefile.in
index 395420e6..7d99feab 100644
--- a/tests/certs/scripts/Makefile.in
+++ b/tests/certs/scripts/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -89,7 +89,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = tests/certs/scripts
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -110,8 +111,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -150,6 +150,12 @@ 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@
@@ -189,6 +195,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -201,6 +209,7 @@ 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@
diff --git a/tests/certs/scripts/genserv.sh b/tests/certs/scripts/genserv.sh
index e7845c5c..50bac011 100755
--- a/tests/certs/scripts/genserv.sh
+++ b/tests/certs/scripts/genserv.sh
@@ -39,7 +39,7 @@ if [ ".$CAPREFIX" = . ] ; then
NOTOK=1
else
if [ ! -f $CAPREFIX-ca.cacert ] ; then
- echo No CA certficate file $CAPREFIX-ca.caert
+ echo No CA certificate file $CAPREFIX-ca.caert
NOTOK=1
fi
if [ ! -f $CAPREFIX-ca.key ] ; then
diff --git a/tests/curl_test_data.py b/tests/curl_test_data.py
new file mode 100755
index 00000000..bfe1287d
--- /dev/null
+++ b/tests/curl_test_data.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 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.
+#
+"""Module for extracting test data from the test data folder"""
+
+from __future__ import (absolute_import, division, print_function,
+ unicode_literals)
+import os
+import xml.etree.ElementTree as ET
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class TestData(object):
+ def __init__(self, data_folder):
+ self.data_folder = data_folder
+
+ def get_test_data(self, test_number):
+ # Create the test file name
+ filename = os.path.join(self.data_folder,
+ "test{0}".format(test_number))
+
+ # The user should handle the exception from failing to find the file.
+ tree = ET.parse(filename)
+
+ # We need the <reply><data> text.
+ reply = tree.find("reply")
+ data = reply.find("data")
+
+ # Return the text contents of the data
+ return data.text
+
+
+if __name__ == '__main__':
+ td = TestData("./data")
+ data = td.get_test_data(1)
+ print(data)
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index 50544aba..11d54b46 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -13,6 +13,8 @@
# test 1801 causes problems on Mac OS X and github
# https://github.com/curl/curl/issues/380
1801
-# test 1510 casues problems on the CI on github
+# test 1510 causes problems on the CI on github
# example: https://travis-ci.org/curl/curl/builds/81633600
1510
+# Pipelining test that is causing false positives a little too often
+1903
diff --git a/tests/data/Makefile.in b/tests/data/Makefile.in
index 9b855b1a..8176b775 100644
--- a/tests/data/Makefile.in
+++ b/tests/data/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -21,7 +21,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -111,7 +111,8 @@ build_triplet = @build@
host_triplet = @host@
subdir = tests/data
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -132,8 +133,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
@@ -172,6 +172,12 @@ 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@
@@ -211,6 +217,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -223,6 +231,7 @@ 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@
@@ -397,7 +406,7 @@ 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 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
-test554 test555 test556 test557 test558 test560 test561 test562 \
+test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
test572 test573 test574 test575 test576 test578 test579 test580 \
test581 test582 test583 test584 test585 test586 test587 test588 \
@@ -409,7 +418,7 @@ test626 test627 test628 test629 test630 test631 test632 test633 test634 \
test635 test636 test637 test638 test639 test640 test641 \
\
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
-test709 test710 test711 test712 \
+test709 test710 test711 test712 test713 test714 test715 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
@@ -449,20 +458,23 @@ test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
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 \
+test1144 test1145 test1146 test1147 test1148 \
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
-test1244 test1245 test1246 test1247 \
-\
-test1280 test1281 \
+test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
+test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
+test1260 test1261 test1262 \
\
+test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
+test1288 test1289 \
+test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
-test1316 test1317 test1318 test1319 test1320 test1321 test1322 \
+test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
@@ -472,25 +484,27 @@ test1364 test1365 test1366 test1367 test1368 test1369 test1370 test1371 \
test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \
test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \
test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \
-test1396 test1397 test1398 \
+test1396 test1397 test1398 test1399 \
\
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \
test1416 test1417 test1418 test1419 test1420 test1421 test1422 test1423 \
-test1424 \
+test1424 test1425 test1426 test1427 \
test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
-test1436 test1437 test1438 test1439 \
-\
+test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
+test1444 test1445 test1446 test1450 test1451 \
+test1452 \
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 \
\
-test1520 \
+test1520 test1521 \
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
-test1533 test1534 test1535 test1536 \
-\
-test1600 test1601 test1602 test1603 test1604 test1605 \
+test1533 test1534 test1535 test1536 test1537 test1538 \
+test1540 \
+test1550 test1551 \
+test1600 test1601 test1602 test1603 test1604 test1605 test1606 \
\
test1700 test1701 test1702 \
\
@@ -504,7 +518,7 @@ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
-test2048 test2049 test2050 test2051 test2052 test2053 test2054
+test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055
# TESTCASES are taken from Makefile.inc
@@ -521,9 +535,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Ma
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/data/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/data/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu tests/data/Makefile
+ $(AUTOMAKE) --foreign tests/data/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index deabaacc..1c637f8f 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -68,7 +68,7 @@ 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 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
-test554 test555 test556 test557 test558 test560 test561 test562 \
+test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
test572 test573 test574 test575 test576 test578 test579 test580 \
test581 test582 test583 test584 test585 test586 test587 test588 \
@@ -80,7 +80,7 @@ test626 test627 test628 test629 test630 test631 test632 test633 test634 \
test635 test636 test637 test638 test639 test640 test641 \
\
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
-test709 test710 test711 test712 \
+test709 test710 test711 test712 test713 test714 test715 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
@@ -120,20 +120,23 @@ test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
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 \
+test1144 test1145 test1146 test1147 test1148 \
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
-test1244 test1245 test1246 test1247 \
-\
-test1280 test1281 \
+test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
+test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
+test1260 test1261 test1262 \
\
+test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
+test1288 test1289 \
+test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
-test1316 test1317 test1318 test1319 test1320 test1321 test1322 \
+test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
@@ -143,25 +146,27 @@ test1364 test1365 test1366 test1367 test1368 test1369 test1370 test1371 \
test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \
test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \
test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \
-test1396 test1397 test1398 \
+test1396 test1397 test1398 test1399 \
\
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \
test1416 test1417 test1418 test1419 test1420 test1421 test1422 test1423 \
-test1424 \
+test1424 test1425 test1426 test1427 \
test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
-test1436 test1437 test1438 test1439 \
-\
+test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
+test1444 test1445 test1446 test1450 test1451 \
+test1452 \
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 \
\
-test1520 \
+test1520 test1521 \
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
-test1533 test1534 test1535 test1536 \
-\
-test1600 test1601 test1602 test1603 test1604 test1605 \
+test1533 test1534 test1535 test1536 test1537 test1538 \
+test1540 \
+test1550 test1551 \
+test1600 test1601 test1602 test1603 test1604 test1605 test1606 \
\
test1700 test1701 test1702 \
\
@@ -175,4 +180,4 @@ test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
-test2048 test2049 test2050 test2051 test2052 test2053 test2054
+test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055
diff --git a/tests/data/test1 b/tests/data/test1
index b8827351..7c0e1602 100644
--- a/tests/data/test1
+++ b/tests/data/test1
@@ -8,7 +8,7 @@ HTTP GET
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test1007 b/tests/data/test1007
index 6baf221e..db2717ae 100644
--- a/tests/data/test1007
+++ b/tests/data/test1007
@@ -17,7 +17,7 @@ tftp
TFTP send with invalid permission on server
</name>
<command>
--T log/test1007.txt tftp://%HOSTIP:%TFTPPORT//invalid-file --trace-ascii log/traceit
+-T log/test1007.txt tftp://%HOSTIP:%TFTPPORT//invalid-file
</command>
<file name="log/test1007.txt">
This data will not be sent
diff --git a/tests/data/test1008 b/tests/data/test1008
index bcc503e5..0bc41310 100644
--- a/tests/data/test1008
+++ b/tests/data/test1008
@@ -6,6 +6,7 @@ HTTP GET
HTTP CONNECT
HTTP proxy
HTTP proxy NTLM auth
+chunked Transfer-Encoding
</keywords>
</info>
@@ -118,7 +119,7 @@ Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1008:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
Proxy-Connection: Keep-Alive
GET /path/10080002 HTTP/1.1
diff --git a/tests/data/test1010 b/tests/data/test1010
index a51d68ab..b2083af7 100644
--- a/tests/data/test1010
+++ b/tests/data/test1010
@@ -36,7 +36,7 @@ ftp
FTP dir list nocwd
</name>
<command>
-ftp://%HOSTIP:%FTPPORT//list/this/path/1010/ --ftp-method nocwd
+ftp://%HOSTIP:%FTPPORT//list/this/path/1010/ ftp://%HOSTIP:%FTPPORT//list/this/path/1010/ --ftp-method nocwd
</command>
</client>
@@ -50,6 +50,8 @@ PWD
EPSV
TYPE A
LIST /list/this/path/1010/
+EPSV
+LIST /list/this/path/1010/
QUIT
</protocol>
</verify>
diff --git a/tests/data/test1021 b/tests/data/test1021
index 2705730e..85845a5b 100644
--- a/tests/data/test1021
+++ b/tests/data/test1021
@@ -15,7 +15,7 @@ HTTP proxy NTLM auth
<connect>
HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
Proxy-Authenticate: NTLM
-Content-Length: 21
+Content-Length: 16
Connection: close
data to discard
@@ -62,7 +62,7 @@ Nice proxy auth sir!
<datacheck>
HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
Proxy-Authenticate: NTLM
-Content-Length: 21
+Content-Length: 16
Connection: close
HTTP/1.1 407 Authorization Required to proxy me my dear
@@ -128,7 +128,7 @@ Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
Proxy-Connection: Keep-Alive
GET /path/10210002 HTTP/1.1
diff --git a/tests/data/test1034 b/tests/data/test1034
index c4757405..6c1beb67 100644
--- a/tests/data/test1034
+++ b/tests/data/test1034
@@ -6,6 +6,7 @@ HTTP GET
HTTP proxy
IDN
FAILURE
+config file
</keywords>
</info>
@@ -32,16 +33,23 @@ http
idn
</features>
<setenv>
-CHARSET=UTF-8
+LC_ALL=
+LC_CTYPE=en_US.UTF-8
</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
<name>
HTTP over proxy with malformatted IDN host name
</name>
# This host name contains an invalid UTF-8 byte sequence that can't be
# converted into an IDN name
+<stdin>
+url = "http://invalid-utf8-â.local/page/1034"
+</stdin>
<command>
-http://invalid-utf8-â.local/page/1034 -x %HOSTIP:%HTTPPORT
+-K - -x %HOSTIP:%HTTPPORT
</command>
</client>
diff --git a/tests/data/test1035 b/tests/data/test1035
index 20b434c3..033a48a7 100644
--- a/tests/data/test1035
+++ b/tests/data/test1035
@@ -32,13 +32,17 @@ http
idn
</features>
<setenv>
-CHARSET=ISO8859-1
+LC_ALL=
+LC_CTYPE=en_US.UTF-8
</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
<name>
HTTP over proxy with too long IDN host name
</name>
<command>
-http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 -x %HOSTIP:%HTTPPORT
+http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 -x %HOSTIP:%HTTPPORT
</command>
</client>
@@ -49,8 +53,8 @@ http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035
^User-Agent:.*
</strip>
<protocol>
-GET http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 HTTP/1.1
-Host: too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local
+GET http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 HTTP/1.1
+Host: too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1049 b/tests/data/test1049
index 60f41366..de18bee3 100644
--- a/tests/data/test1049
+++ b/tests/data/test1049
@@ -28,7 +28,7 @@ tftp
TFTP retrieve with localhost --interface
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT//1049 --trace-ascii log/traceit --interface %CLIENTIP
+tftp://%HOSTIP:%TFTPPORT//1049 --interface %CLIENTIP
</command>
</client>
diff --git a/tests/data/test1063 b/tests/data/test1063
index cc07e6bf..2979094d 100644
--- a/tests/data/test1063
+++ b/tests/data/test1063
@@ -41,7 +41,5 @@ Invalid large X- range on a file://
<errorcode>
36
</errorcode>
-<stdout>
-</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1068 b/tests/data/test1068
index ff26d78c..f9bfec90 100644
--- a/tests/data/test1068
+++ b/tests/data/test1068
@@ -4,6 +4,7 @@
<keywords>
HTTP
HTTP PUT
+chunked Transfer-Encoding
</keywords>
</info>
diff --git a/tests/data/test1093 b/tests/data/test1093
index 2087c827..da2d83cd 100644
--- a/tests/data/test1093
+++ b/tests/data/test1093
@@ -28,7 +28,7 @@ tftp
TFTP retrieve with mode=i
</name>
<command>
-"tftp://%HOSTIP:%TFTPPORT//1093;mode=i" --use-ascii --trace-ascii log/traceit
+"tftp://%HOSTIP:%TFTPPORT//1093;mode=i" --use-ascii
</command>
</client>
diff --git a/tests/data/test1094 b/tests/data/test1094
index 91317226..c7b09caa 100644
--- a/tests/data/test1094
+++ b/tests/data/test1094
@@ -34,7 +34,7 @@ tftp
TFTP retrieve with mode=netascii
</name>
<command>
-"tftp://%HOSTIP:%TFTPPORT//1094;mode=netascii" --trace-ascii log/traceit
+"tftp://%HOSTIP:%TFTPPORT//1094;mode=netascii"
</command>
</client>
diff --git a/tests/data/test1099 b/tests/data/test1099
index 7aacc11d..4a33189e 100644
--- a/tests/data/test1099
+++ b/tests/data/test1099
@@ -23,7 +23,7 @@ tftp
TFTP get first a non-existing file then an existing
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT/an/invalid-file tftp://%HOSTIP:%TFTPPORT//1099 --trace-ascii log/traceit
+tftp://%HOSTIP:%TFTPPORT/an/invalid-file tftp://%HOSTIP:%TFTPPORT//1099
</command>
</client>
diff --git a/tests/data/test1100 b/tests/data/test1100
index cd616918..2e8d761a 100644
--- a/tests/data/test1100
+++ b/tests/data/test1100
@@ -102,7 +102,7 @@ Content-Type: application/x-www-form-urlencoded
POST /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Content-Length: 18
diff --git a/tests/data/test1104 b/tests/data/test1104
index 21efe3c1..102d5228 100644
--- a/tests/data/test1104
+++ b/tests/data/test1104
@@ -59,7 +59,7 @@ http
HTTP cookie expiry date at Jan 1 00:00:00 GMT 1970
</name>
<command>
-http://%HOSTIP:%HTTPPORT/want/1104 -L -x %HOSTIP:%HTTPPORT -c log/cookies.jar
+http://%HOSTIP:%HTTPPORT/want/1104 -L -x %HOSTIP:%HTTPPORT -c log/cookies1104.jar
</command>
</client>
diff --git a/tests/data/test1105 b/tests/data/test1105
index 76ac4500..4b5e0c83 100644
--- a/tests/data/test1105
+++ b/tests/data/test1105
@@ -35,7 +35,7 @@ HTTP with cookie parser and header recording
"http://%HOSTIP:%HTTPPORT/we/want/1105?parm1=this*that/other/thing&parm2=foobar/1105" -c log/cookie1105.txt -d "userid=myname&password=mypassword"
</command>
<precheck>
-perl -e 'if ("%HOSTIP" !~ /127\.0\.0\.1$/) {print "Test only works for HOSTIP 127.0.0.1"; exit(1)}'
+perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );"
</precheck>
</client>
diff --git a/tests/data/test1109 b/tests/data/test1109
index c18ae46c..b68b5a22 100644
--- a/tests/data/test1109
+++ b/tests/data/test1109
@@ -8,7 +8,7 @@ CURLOPT_URL
</info>
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
diff --git a/tests/data/test1110 b/tests/data/test1110
index 90ffc41e..94cfe910 100644
--- a/tests/data/test1110
+++ b/tests/data/test1110
@@ -9,7 +9,7 @@ CURLOPT_URL
</info>
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
diff --git a/tests/data/test1111 b/tests/data/test1111
index 77b78f75..d9db12c7 100644
--- a/tests/data/test1111
+++ b/tests/data/test1111
@@ -9,7 +9,7 @@ CURLOPT_URL
</info>
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
diff --git a/tests/data/test1139 b/tests/data/test1139
index 30f730c2..72761c67 100644
--- a/tests/data/test1139
+++ b/tests/data/test1139
@@ -4,6 +4,7 @@
source analysis
symbols-in-versions
documentation
+--manual
</keywords>
</info>
@@ -19,7 +20,7 @@ Verify that all libcurl options have man pages
</name>
<command type="perl">
-%SRCDIR/manpage-scan.pl %SRCDIR/..
+%SRCDIR/manpage-scan.pl %SRCDIR/.. %PWD/..
</command>
</client>
diff --git a/tests/data/test1145 b/tests/data/test1145
new file mode 100644
index 00000000..287bebfc
--- /dev/null
+++ b/tests/data/test1145
@@ -0,0 +1,40 @@
+<testcase>
+<info>
+<keywords>
+FILE
+</keywords>
+</info>
+
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+<name>
+file:// bad host
+</name>
+# This command should not succeed since we only accept
+# file:/// file://localhost/ file://127.0.0.1/
+<command>
+file://bad-host%PWD/log/test1145.txt
+</command>
+<file name="log/test1145.txt">
+foo
+ bar
+bar
+ foo
+moo
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# CURLE_URL_MALFORMAT is error code 3
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1146 b/tests/data/test1146
new file mode 100644
index 00000000..43f33b79
--- /dev/null
+++ b/tests/data/test1146
@@ -0,0 +1,45 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--proto-default
+</keywords>
+</info>
+
+<reply>
+<data>
+foo
+ bar
+bar
+ foo
+moo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+<name>
+--proto-default file
+</name>
+<command>
+--proto-default file %PWD/log/test1146.txt
+</command>
+<file name="log/test1146.txt">
+foo
+ bar
+bar
+ foo
+moo
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1147 b/tests/data/test1147
new file mode 100644
index 00000000..faad8999
--- /dev/null
+++ b/tests/data/test1147
@@ -0,0 +1,64 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+-H
+</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>
+Get -H headers from a file
+ </name>
+<file name="log/heads1147.txt">
+One: 1
+Two: 2
+no-colon
+
+ And A Funny One : wohoo
+User-Agent:
+</file>
+ <command>
+http://%HOSTIP:%HTTPPORT/1147 -H @log/heads1147.txt
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1147 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+One: 1
+Two: 2
+ And A Funny One : wohoo
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1148 b/tests/data/test1148
new file mode 100644
index 00000000..52f6c7eb
--- /dev/null
+++ b/tests/data/test1148
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+progressbar
+</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: 60
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+progress-bar
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1148 -# --stderr log/stderrlog1148
+</command>
+</client>
+
+#
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1148 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/stderrlog1148">
+ ######################################################################## 100.0%
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1205 b/tests/data/test1205
index 6d7bb7b0..7e4a882c 100644
--- a/tests/data/test1205
+++ b/tests/data/test1205
@@ -8,7 +8,7 @@ HTTP GET
#
# Server-side
-<reply name="1205">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test1215 b/tests/data/test1215
index f8c52a9a..262910ad 100644
--- a/tests/data/test1215
+++ b/tests/data/test1215
@@ -96,7 +96,7 @@ Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
User-Agent: curl/7.30.0-DEV
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1231 b/tests/data/test1231
index 16533a85..61998d1c 100644
--- a/tests/data/test1231
+++ b/tests/data/test1231
@@ -9,7 +9,7 @@ dotdot removal
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
diff --git a/tests/data/test1232 b/tests/data/test1232
index ead43365..d0659f12 100644
--- a/tests/data/test1232
+++ b/tests/data/test1232
@@ -11,7 +11,7 @@ dotdot removal
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
diff --git a/tests/data/test1238 b/tests/data/test1238
index 4c976c77..a0eef417 100644
--- a/tests/data/test1238
+++ b/tests/data/test1238
@@ -10,7 +10,7 @@ TFTP RRQ
# Server-side
<reply>
<servercmd>
-writedelay: 1
+writedelay: 2
</servercmd>
# ~1200 bytes (so that they don't fit in two 512 byte chunks)
<data nocheck="yes">
diff --git a/tests/data/test1242 b/tests/data/test1242
index c8bc3d4a..80111eba 100644
--- a/tests/data/test1242
+++ b/tests/data/test1242
@@ -27,7 +27,7 @@ tftp
TFTP retrieve without TFTP options requests
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT//1242 --tftp-no-options --trace-ascii log/traceit
+tftp://%HOSTIP:%TFTPPORT//1242 --tftp-no-options
</command>
</client>
diff --git a/tests/data/test1243 b/tests/data/test1243
index 0303a5de..8a89af05 100644
--- a/tests/data/test1243
+++ b/tests/data/test1243
@@ -16,7 +16,7 @@ tftp
TFTP send without TFTP options requests
</name>
<command>
--T log/test1243.txt tftp://%HOSTIP:%TFTPPORT// --tftp-no-options --trace-ascii log/traceit
+-T log/test1243.txt tftp://%HOSTIP:%TFTPPORT// --tftp-no-options
</command>
<file name="log/test1243.txt">
a chunk of
diff --git a/tests/data/test1245 b/tests/data/test1245
index 34d6549d..851d78d3 100644
--- a/tests/data/test1245
+++ b/tests/data/test1245
@@ -28,8 +28,8 @@ Connection: close
# Client-side
<client>
<server>
-ftp
http
+ftp
</server>
<name>
--proto deny must override --proto-redir allow
diff --git a/tests/data/test1248 b/tests/data/test1248
new file mode 100644
index 00000000..28e7a852
--- /dev/null
+++ b/tests/data/test1248
@@ -0,0 +1,49 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Access a non-proxied host with using the combination of --proxy option and --noproxy option
+</name>
+<command>
+http://user:secret@%HOSTIP:%HTTPPORT/1248 --proxy http://dummy:%PROXYPORT/ --noproxy %HOSTIP --max-time 5
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1248 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcjpzZWNyZXQ=
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1249 b/tests/data/test1249
new file mode 100644
index 00000000..ab561406
--- /dev/null
+++ b/tests/data/test1249
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_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
+Content-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Access a non-proxied host with using the combination of --proxy option and NO_PROXY env var
+</name>
+<setenv>
+NO_PROXY=%HOSTIP
+</setenv>
+<command>
+http://user:secret@%HOSTIP:%HTTPPORT/1249 --proxy http://dummy:%PROXYPORT/ --max-time 5
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1249 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcjpzZWNyZXQ=
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1250 b/tests/data/test1250
new file mode 100644
index 00000000..bf67b7fe
--- /dev/null
+++ b/tests/data/test1250
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+http_proxy
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Access a non-proxied host with using the combination of http_proxy env var and --noproxy option
+</name>
+<setenv>
+http_proxy=http://dummy:%PROXYPORT/
+</setenv>
+<command>
+http://user:secret@%HOSTIP:%HTTPPORT/1250 --noproxy %HOSTIP --max-time 5
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1250 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcjpzZWNyZXQ=
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1251 b/tests/data/test1251
new file mode 100644
index 00000000..f37a685e
--- /dev/null
+++ b/tests/data/test1251
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+http_proxy
+NO_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
+Content-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Access a non-proxied host with using the combination of http_proxy env var and NO_PROXY env var
+</name>
+<setenv>
+http_proxy=http://dummy:%PROXYPORT/
+NO_PROXY=%HOSTIP
+</setenv>
+<command>
+http://user:secret@%HOSTIP:%HTTPPORT/1251 --max-time 5
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1251 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcjpzZWNyZXQ=
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1252 b/tests/data/test1252
new file mode 100644
index 00000000..cbaef48b
--- /dev/null
+++ b/tests/data/test1252
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using --proxy, override NO_PROXY by --nproxy and access target URL directly
+</name>
+<setenv>
+NO_PROXY=example.com
+</setenv>
+<command>
+http://%HOSTIP:%HTTPPORT/1252 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1252 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1253 b/tests/data/test1253
new file mode 100644
index 00000000..74002994
--- /dev/null
+++ b/tests/data/test1253
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using --proxy, override NO_PROXY by --nproxy and access target URL through proxy
+</name>
+<setenv>
+NO_PROXY=example.com
+</setenv>
+<command>
+http://somewhere.example.com/1253 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://somewhere.example.com/1253 HTTP/1.1
+Host: somewhere.example.com
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1254 b/tests/data/test1254
new file mode 100644
index 00000000..817b9342
--- /dev/null
+++ b/tests/data/test1254
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using --proxy, override NO_PROXY by --nproxy and access target URL through proxy
+</name>
+<setenv>
+NO_PROXY=example.com
+</setenv>
+<command>
+http://somewhere.example.com/1254 --proxy http://%HOSTIP:%HTTPPORT --noproxy ""
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://somewhere.example.com/1254 HTTP/1.1
+Host: somewhere.example.com
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1255 b/tests/data/test1255
new file mode 100644
index 00000000..d82310f6
--- /dev/null
+++ b/tests/data/test1255
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using http_proxy, override NO_PROXY by --nproxy and access target URL directly
+</name>
+<setenv>
+http_proxy=http://%HOSTIP:%HTTPPORT
+NO_PROXY=example.com
+</setenv>
+<command>
+http://%HOSTIP:%HTTPPORT/1255 --noproxy %HOSTIP
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1255 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1256 b/tests/data/test1256
new file mode 100644
index 00000000..09c59f4f
--- /dev/null
+++ b/tests/data/test1256
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using http_proxy, override NO_PROXY by --nproxy and access target URL through proxy
+</name>
+<setenv>
+http_proxy=http://%HOSTIP:%HTTPPORT
+NO_PROXY=example.com
+</setenv>
+<command>
+http://somewhere.example.com/1256 --noproxy %HOSTIP
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://somewhere.example.com/1256 HTTP/1.1
+Host: somewhere.example.com
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1257 b/tests/data/test1257
new file mode 100644
index 00000000..6b7e9373
--- /dev/null
+++ b/tests/data/test1257
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP proxy
+NO_PROXY
+noproxy
+</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-Length: 4
+Content-Type: text/html
+
+foo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Under condition using http_proxy, override NO_PROXY by --nproxy and access target URL through proxy
+</name>
+<setenv>
+http_proxy=http://%HOSTIP:%HTTPPORT
+NO_PROXY=example.com
+</setenv>
+<command>
+http://somewhere.example.com/1257 --noproxy ""
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://somewhere.example.com/1257 HTTP/1.1
+Host: somewhere.example.com
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1258 b/tests/data/test1258
new file mode 100644
index 00000000..6fa88e16
--- /dev/null
+++ b/tests/data/test1258
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP replaced headers
+cookies
+httponly
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.0 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Type: text/html
+Set-Cookie: I-am=here; domain=localhost;
+
+boo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP, use cookies with localhost
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/1258 http://%HOSTIP:%HTTPPORT/we/want?hoge=fuga -b non-existing -H "Host: localhost"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/1258 HTTP/1.1
+Host: localhost
+Accept: */*
+
+GET /we/want?hoge=fuga HTTP/1.1
+Host: localhost
+Accept: */*
+Cookie: I-am=here
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1259 b/tests/data/test1259
new file mode 100644
index 00000000..bad4ee25
--- /dev/null
+++ b/tests/data/test1259
@@ -0,0 +1,47 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.0 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Type: text/html
+Set-Cookie: I-am=here; domain=localhost;
+
+boo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP URL with semicolon in password
+ </name>
+ <command>
+"http://user:pass;word@%HOSTIP:%HTTPPORT/we/want/1259"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/1259 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcjpwYXNzO3dvcmQ=
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1260 b/tests/data/test1260
new file mode 100644
index 00000000..1d86ecd4
--- /dev/null
+++ b/tests/data/test1260
@@ -0,0 +1,36 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+http
+</features>
+ <name>
+HTTP URL with rubbish after port number
+ </name>
+ <command>
+-g "http://[%HOSTIP]:%HTTPPORT:80/we/want/1260" "http://%HOSTIP:%HTTPPORT:80/we/want/1260" "http://user@example.com:80@localhost"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# CURLE_URL_MALFORMAT == 3
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1261 b/tests/data/test1261
new file mode 100644
index 00000000..7f887994
--- /dev/null
+++ b/tests/data/test1261
@@ -0,0 +1,61 @@
+<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
+Location: data/10290002.txt?coolsite=yes
+Content-Length: 62
+Connection: close
+
+This server reply is for testing a simple Location: following
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+'redirect_url' with --location and --max-redir
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1261 -w '%{redirect_url}\n' --location --max-redir 0
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1261 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+# CURLE_TOO_MANY_REDIRECTS
+<errorcode>
+47
+</errorcode>
+<stdout>
+HTTP/1.1 301 This is a weirdo text message swsclose
+Location: data/10290002.txt?coolsite=yes
+Content-Length: 62
+Connection: close
+
+http://%HOSTIP:%HTTPPORT/we/want/our/data/10290002.txt?coolsite=yes
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1262 b/tests/data/test1262
new file mode 100644
index 00000000..4b08a2cf
--- /dev/null
+++ b/tests/data/test1262
@@ -0,0 +1,40 @@
+# similar to test 139 but with a reversed time condition
+<testcase>
+<info>
+<keywords>
+FTP
+RETR
+-z
+</keywords>
+</info>
+# Server-side
+<reply>
+<mdtm>
+213 20030409102659
+</mdtm>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP request and denied to download an older file with -z
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/blalbla/1262 -z "-1 jan 2001"
+</command>
+</client>
+
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+CWD blalbla
+MDTM 1262
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1282 b/tests/data/test1282
new file mode 100644
index 00000000..197356c6
--- /dev/null
+++ b/tests/data/test1282
@@ -0,0 +1,45 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+RETR
+</keywords>
+</info>
+# Server-side
+<reply>
+<servercmd>
+REPLY PASS 633 XXXXXXXX\x00\x00XXXXXXXX
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+<features>
+GSS-API
+</features>
+ <name>
+FTP with 633 response before gss initialized
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/1282
+</command>
+
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+</protocol>
+
+# 67 == CURLE_LOGIN_DENIED
+<errorcode>
+67
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1283 b/tests/data/test1283
new file mode 100644
index 00000000..ac275e92
--- /dev/null
+++ b/tests/data/test1283
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+globbing
+[] range
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+
+bytes
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+globbing range with same start and stop
+</name>
+<command option="no-output">
+http://%HOSTIP:%HTTPPORT/[a-a][1-1][b-b:1][2-2:1]/1283 -o "log/outfile1283_#1#2#3#4.dump"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /a1b2/1283 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/outfile1283_a1b2.dump">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+
+bytes
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1284 b/tests/data/test1284
new file mode 100644
index 00000000..8437a408
--- /dev/null
+++ b/tests/data/test1284
@@ -0,0 +1,89 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP Digest auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP POST --digest with user-specified Content-Length header
+</name>
+# This test is to ensure 'Content-Length: 0' is sent while negotiating auth
+# even when there is a user-specified Content-Length header.
+# https://github.com/curl/curl/pull/1242
+<command>
+-H "Content-Length: 11" -u auser:apasswd --digest -d "junkelijunk" http://%HOSTIP:%HTTPPORT/1284
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /1284 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+Content-Type: application/x-www-form-urlencoded
+
+POST /1284 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1284", response="5763079608de439072861a59ac733515"
+Accept: */*
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+junkelijunk
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1285 b/tests/data/test1285
new file mode 100644
index 00000000..16c66238
--- /dev/null
+++ b/tests/data/test1285
@@ -0,0 +1,97 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+HTTP Digest auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 200 A OK
+Server: Microsoft-IIS/6.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 3
+
+ok
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP PUT --digest with user-specified Content-Length header
+</name>
+# This test is to ensure 'Content-Length: 0' is sent while negotiating auth
+# even when there is a user-specified Content-Length header.
+# https://github.com/curl/curl/pull/1242
+<command>
+-H "Content-Length: 85" -u auser:apasswd --digest -T log/put1285 http://%HOSTIP:%HTTPPORT/1285
+</command>
+<file name="log/put1285">
+This is data we upload with PUT
+a second line
+line three
+four is the number of lines
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /1285 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 0
+
+PUT /1285 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1285", response="dc185587d5e8391b347eef194c2a3cd6"
+Accept: */*
+Content-Length: 85
+Expect: 100-continue
+
+This is data we upload with PUT
+a second line
+line three
+four is the number of lines
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1286 b/tests/data/test1286
new file mode 100644
index 00000000..41782cb0
--- /dev/null
+++ b/tests/data/test1286
@@ -0,0 +1,110 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+followlocation
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", qop="auth"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data>
+<data1000>
+HTTP/1.1 302 Thanks for this, but we want to redir you!
+Server: Microsoft-IIS/5.0
+Content-Type: text/html; charset=iso-8859-1
+Location: /12860001
+Content-Length: 0
+
+</data1000>
+<data1001>
+HTTP/1.1 404 Not Found
+Server: Microsoft-IIS/5.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</data1001>
+
+<datacheck>
+HTTP/1.1 401 authentication please swsbounce
+Server: Microsoft-IIS/6.0
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604144", qop="auth"
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+HTTP/1.1 302 Thanks for this, but we want to redir you!
+Server: Microsoft-IIS/5.0
+Content-Type: text/html; charset=iso-8859-1
+Location: /12860001
+Content-Length: 0
+
+HTTP/1.1 404 Not Found
+Server: Microsoft-IIS/5.0
+Content-Type: text/html; charset=iso-8859-1
+Content-Length: 0
+
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+#
+<server>
+http
+</server>
+<features>
+crypto
+</features>
+<name>
+HTTP GET --digest increasing nonce-count
+</name>
+# This test is to ensure the nonce-count (nc) increases
+# https://github.com/curl/curl/pull/1251
+<command>
+-u auser:apasswd --location --digest http://%HOSTIP:%HTTPPORT/1286
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+# Reorder the fields in 'Authorization: Digest' header.
+# Since regular and SSPI digest auth header fields may not have the same order
+# or whitespace we homogenize so that both may be tested. Also:
+# - Remove the unique value from cnonce if in RFC format
+# - Remove the unique value from response if in RFC format
+# - Remove quotes from qop="auth" used by SSPI
+# The if statement is one line because runtests evaluates one line at a time.
+<strippart>
+if(s/^(Authorization: Digest )([^\r\n]+)(\r?\n)$//) { $_ = $1 . join(', ', map { s/^(cnonce=)"[a-zA-Z0-9+\/=]+"$/$1REMOVED/; s/^(response=)"[a-f0-9]{32}"$/$1REMOVED/; s/^qop="auth"$/qop=auth/; $_ } sort split(/, */, $2)) . $3; }
+</strippart>
+<protocol>
+GET /1286 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /1286 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest cnonce=REMOVED, nc=00000001, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/1286", username="auser"
+Accept: */*
+
+GET /12860001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Digest cnonce=REMOVED, nc=00000002, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/12860001", username="auser"
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1287 b/tests/data/test1287
new file mode 100644
index 00000000..46c29249
--- /dev/null
+++ b/tests/data/test1287
@@ -0,0 +1,91 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+proxytunnel
+verbose logs
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+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
+</data>
+
+# The purpose of this test is to make sure curl ignores headers
+# Content-Length and Transfer-Encoding in a successful CONNECT 2xx reply.
+<connect>
+HTTP/1.1 200 Mighty fine indeed
+Content-Length: 123
+Transfer-Encoding: chunked
+
+</connect>
+
+<datacheck>
+HTTP/1.1 200 Mighty fine indeed
+Content-Length: 123
+Transfer-Encoding: chunked
+
+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
+http-proxy
+</server>
+<name>
+HTTP over proxy-tunnel ignore TE and CL in CONNECT 2xx responses
+</name>
+<command>
+-v --proxytunnel -x %HOSTIP:%PROXYPORT http://test.1287:%HTTPPORT/we/want/that/page/1287
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<proxy>
+CONNECT test.1287:%HTTPPORT HTTP/1.1
+Host: test.1287:%HTTPPORT
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /we/want/that/page/1287 HTTP/1.1
+Host: test.1287:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/stderr1287" mode="text">
+* Ignoring Content-Length in CONNECT 200 response
+* Ignoring Transfer-Encoding in CONNECT 200 response
+</file>
+<stripfile>
+s/^.*(?=\* Ignoring (?:Content-Length|Transfer-Encoding) )// or $_ = ''
+</stripfile>
+</verify>
+</testcase>
diff --git a/tests/data/test1288 b/tests/data/test1288
new file mode 100644
index 00000000..543aa3d6
--- /dev/null
+++ b/tests/data/test1288
@@ -0,0 +1,96 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+HTTP proxy
+proxytunnel
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Mighty fine indeed
+Server: test tunnel 2000
+
+</connect>
+
+<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
+Content-Length: 9
+Connection: keep-alive
+
+contents
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+http-proxy
+</server>
+<name>
+Suppress proxy CONNECT response headers
+</name>
+<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>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<proxy>
+CONNECT %HOSTIP.1288:%HTTPPORT HTTP/1.1
+Host: %HOSTIP.1288:%HTTPPORT
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /we/want/that/page/1288 HTTP/1.1
+Host: %HOSTIP.1288:%HTTPPORT
+Accept: */*
+
+</protocol>
+
+# This test is structured to test all the expectations of
+# --suppress-connect-headers, which are:
+# Must suppress in --include and --dump-header
+# Must not suppress in --verbose and --trace
+# Must not suppress in statistics (eg received header byte total)
+<stdout>
+HTTP/1.1 200 OK
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Server: test-server/fake
+Content-Type: text/html
+Content-Type: text/html
+Funny-head: yesyes
+Funny-head: yesyes
+Content-Length: 9
+Content-Length: 9
+Connection: keep-alive
+Connection: keep-alive
+
+
+contents
+
+CONNECT CODE: 200
+RECEIVED HEADER BYTE TOTAL: 231
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1289 b/tests/data/test1289
new file mode 100644
index 00000000..d679cc0b
--- /dev/null
+++ b/tests/data/test1289
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+globbing
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+globbing with overflow and bad syntxx
+</name>
+<command>
+http://ur%20[0-60000000000000000000
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+# curl: (3) [globbing] bad range in column
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1298 b/tests/data/test1298
new file mode 100644
index 00000000..061a4e1e
--- /dev/null
+++ b/tests/data/test1298
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--request-target
+</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: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET special path with --request-target
+ </name>
+ <command>
+--request-target "XXX" "http://%HOSTIP:%HTTPPORT/" -H "Testno: 1298"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET XXX HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Testno: 1298
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1299 b/tests/data/test1299
new file mode 100644
index 00000000..5ed92da5
--- /dev/null
+++ b/tests/data/test1299
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+--request-target
+</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: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Send "OPTIONS *" with --request-target
+ </name>
+ <command>
+--request-target "*" -X OPTIONS http://%HOSTIP:%HTTPPORT/ -H "Testno: 1299"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+OPTIONS * HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Testno: 1299
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test130 b/tests/data/test130
index 6e6d9c16..85892f1e 100644
--- a/tests/data/test130
+++ b/tests/data/test130
@@ -41,6 +41,7 @@ FTP (optional .netrc; no user/pass) dir list PASV
</command>
<file name="log/netrc130" >
# the following two lines were created while testing curl
+# machine %HOSTIP login user1 password commented
machine %HOSTIP login user1 password passwd1
machine %HOSTIP login user2 password passwd2
default login userdef password passwddef
diff --git a/tests/data/test1309 b/tests/data/test1309
index c2f67ff1..0e0cad1e 100644
--- a/tests/data/test1309
+++ b/tests/data/test1309
@@ -1451,6 +1451,117 @@ remove pointer 5, payload 659
Tree look:
0.177[0]
remove pointer 6, payload 177
+Removing nodes not larger than 0
+removed payload 0[0]
+Removing nodes not larger than 100
+removed payload 39[0]
+removed payload 49[0]
+removed payload 49[1]
+removed payload 59[0]
+removed payload 59[1]
+removed payload 59[2]
+removed payload 98[0]
+removed payload 98[1]
+removed payload 98[2]
+Removing nodes not larger than 200
+removed payload 108[0]
+removed payload 118[0]
+removed payload 118[1]
+removed payload 157[0]
+removed payload 157[1]
+removed payload 167[0]
+removed payload 167[1]
+removed payload 167[2]
+removed payload 177[0]
+Removing nodes not larger than 300
+removed payload 216[0]
+removed payload 226[0]
+removed payload 226[1]
+removed payload 236[0]
+removed payload 236[1]
+removed payload 236[2]
+removed payload 275[0]
+removed payload 275[1]
+removed payload 275[2]
+removed payload 285[0]
+removed payload 295[0]
+removed payload 295[1]
+Removing nodes not larger than 400
+removed payload 334[0]
+removed payload 334[1]
+removed payload 344[0]
+removed payload 344[1]
+removed payload 344[2]
+removed payload 354[0]
+removed payload 393[0]
+Removing nodes not larger than 500
+removed payload 403[0]
+removed payload 403[1]
+removed payload 413[0]
+removed payload 413[1]
+removed payload 413[2]
+removed payload 462[0]
+removed payload 472[0]
+removed payload 472[1]
+Removing nodes not larger than 600
+removed payload 521[0]
+removed payload 521[1]
+removed payload 521[2]
+removed payload 531[0]
+removed payload 541[0]
+removed payload 541[1]
+removed payload 580[0]
+removed payload 580[1]
+removed payload 590[0]
+removed payload 590[1]
+removed payload 590[2]
+removed payload 600[0]
+Removing nodes not larger than 700
+removed payload 639[0]
+removed payload 649[0]
+removed payload 649[1]
+removed payload 659[0]
+removed payload 659[1]
+removed payload 659[2]
+removed payload 698[0]
+removed payload 698[1]
+removed payload 698[2]
+Removing nodes not larger than 800
+removed payload 708[0]
+removed payload 718[0]
+removed payload 718[1]
+removed payload 757[0]
+removed payload 757[1]
+removed payload 767[0]
+removed payload 767[1]
+removed payload 767[2]
+removed payload 777[0]
+Removing nodes not larger than 900
+removed payload 816[0]
+removed payload 826[0]
+removed payload 826[1]
+removed payload 836[0]
+removed payload 836[1]
+removed payload 836[2]
+removed payload 875[0]
+removed payload 875[1]
+removed payload 875[2]
+removed payload 885[0]
+removed payload 895[0]
+removed payload 895[1]
+Removing nodes not larger than 1000
+removed payload 934[0]
+removed payload 934[1]
+removed payload 944[0]
+removed payload 944[1]
+removed payload 944[2]
+removed payload 954[0]
+Removing nodes not larger than 1100
+removed payload 1003[0]
+removed payload 1003[1]
+removed payload 1013[0]
+removed payload 1013[1]
+removed payload 1013[2]
</stdout>
</verify>
diff --git a/tests/data/test1323 b/tests/data/test1323
new file mode 100644
index 00000000..c5e598cc
--- /dev/null
+++ b/tests/data/test1323
@@ -0,0 +1,32 @@
+<testcase>
+<info>
+<keywords>
+unittest
+curlx_tvdiff
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<name>
+curlx_tvdiff
+</name>
+<tool>
+unit1323
+</tool>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1333 b/tests/data/test1333
index a2ea3014..50ca42a2 100644
--- a/tests/data/test1333
+++ b/tests/data/test1333
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP GET
+chunked Transfer-Encoding
</keywords>
</info>
diff --git a/tests/data/test1399 b/tests/data/test1399
new file mode 100644
index 00000000..fe3879df
--- /dev/null
+++ b/tests/data/test1399
@@ -0,0 +1,26 @@
+<testcase>
+<info>
+<keywords>
+unittest
+Curl_pgrsTime
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+ <name>
+Curl_pgrsTime unit tests
+ </name>
+<tool>
+unit1399
+</tool>
+</client>
+
+</testcase>
diff --git a/tests/data/test1400 b/tests/data/test1400
index 838fe638..0cef18df 100644
--- a/tests/data/test1400
+++ b/tests/data/test1400
@@ -27,6 +27,9 @@ http
<name>
--libcurl for simple HTTP GET
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/1400 --libcurl log/test1400.c
</command>
@@ -65,6 +68,7 @@ int main(int argc, char *argv[])
CURL *hnd;
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1400");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
diff --git a/tests/data/test1401 b/tests/data/test1401
index 1e2b4a77..2217ed8c 100644
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@ -31,6 +31,9 @@ http
<name>
--libcurl for GET with various options
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/1401 --libcurl log/test1401.c --basic -u fake:user -H "X-Files: Mulder" -H "X-Men: cyclops, iceman" -A MyUA -b chocolate=chip --proto "=http,ftp,file"
</command>
@@ -77,6 +80,7 @@ int main(int argc, char *argv[])
slist1 = curl_slist_append(slist1, "X-Men: cyclops, iceman");
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1401");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_USERPWD, "fake:user");
@@ -122,7 +126,5 @@ int main(int argc, char *argv[])
}
/**** End of sample code ****/
</file>
-<stdout>
-</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1402 b/tests/data/test1402
index 07c3f491..d2b05f56 100644
--- a/tests/data/test1402
+++ b/tests/data/test1402
@@ -28,6 +28,9 @@ http
<name>
--libcurl for simple POST
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/1402 --libcurl log/test1402.c -d "foo=bar" -d "baz=quux"
</command>
@@ -70,6 +73,7 @@ int main(int argc, char *argv[])
CURL *hnd;
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1402");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "foo=bar&baz=quux");
@@ -108,7 +112,5 @@ int main(int argc, char *argv[])
}
/**** End of sample code ****/
</file>
-<stdout>
-</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1403 b/tests/data/test1403
index 18167b4f..b0872831 100644
--- a/tests/data/test1403
+++ b/tests/data/test1403
@@ -28,6 +28,9 @@ http
<name>
--libcurl for GET with query
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/1403 --libcurl log/test1403.c -G -d "foo=bar" -d "baz=quux"
</command>
@@ -67,6 +70,7 @@ int main(int argc, char *argv[])
CURL *hnd;
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1403?foo=bar&baz=quux");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
@@ -103,7 +107,5 @@ int main(int argc, char *argv[])
}
/**** End of sample code ****/
</file>
-<stdout>
-</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1404 b/tests/data/test1404
index 6f53ca8c..c86d2602 100644
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@ -29,6 +29,9 @@ http
<name>
--libcurl for HTTP RFC1867-type formposting - -F with three files, one with explicit type
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content,log/test1404.txt' --libcurl log/test1404.c
</command>
@@ -120,6 +123,7 @@ int main(int argc, char *argv[])
CURLFORM_END);
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1404");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_HTTPPOST, post1);
diff --git a/tests/data/test1405 b/tests/data/test1405
index 4e8d46d7..f3ad3e79 100644
--- a/tests/data/test1405
+++ b/tests/data/test1405
@@ -32,6 +32,9 @@ ftp
<name>
--libcurl for FTP with quote ops
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<command>
ftp://%HOSTIP:%FTPPORT/1405 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3" -Q "*FAIL" -Q "+*FAIL HARD" --libcurl log/test1405.c
</command>
@@ -80,6 +83,7 @@ int main(int argc, char *argv[])
slist3 = curl_slist_append(slist3, "*FAIL HARD");
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "ftp://%HOSTIP:%FTPPORT/1405");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_QUOTE, slist1);
diff --git a/tests/data/test1406 b/tests/data/test1406
index 0ccb08a7..033957f6 100644
--- a/tests/data/test1406
+++ b/tests/data/test1406
@@ -25,6 +25,9 @@ smtp
<name>
--libcurl for SMTP
</name>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
<file name="log/test1406.eml">
From: different
To: another
@@ -72,12 +75,11 @@ int main(int argc, char *argv[])
slist1 = curl_slist_append(slist1, "recipient.two@example.com");
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_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
- curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
- curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
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");
@@ -115,10 +117,9 @@ int main(int argc, char *argv[])
/**** End of sample code ****/
</file>
<stripfile>
-# curl's default user-agent varies with version, libraries etc.
-s/(USERAGENT, \")[^\"]+/${1}stripped/
-# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
-# configurations - just ignore them
+# These options vary with configurations - just ignore them
+$_ = '' if /CURLOPT_USERAGENT/
+$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
diff --git a/tests/data/test1407 b/tests/data/test1407
index 981e4e41..5a3de1b1 100644
--- a/tests/data/test1407
+++ b/tests/data/test1407
@@ -26,7 +26,10 @@ pop3
<name>
--libcurl for POP3 LIST one message
</name>
- <command>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
+<command>
pop3://%HOSTIP:%POP3PORT/1407 -l -u user:secret --libcurl log/test1407.c
</command>
</client>
@@ -54,12 +57,11 @@ int main(int argc, char *argv[])
CURL *hnd;
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "pop3://%HOSTIP:%POP3PORT/1407");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_DIRLISTONLY, 1L);
curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret");
- curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
- curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -93,10 +95,9 @@ int main(int argc, char *argv[])
/**** End of sample code ****/
</file>
<stripfile>
-# curl's default user-agent varies with version, libraries etc.
-s/(USERAGENT, \")[^\"]+/${1}stripped/
-# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
-# configurations - just ignore them
+# These options vary with configurations - just ignore them
+$_ = '' if /CURLOPT_USERAGENT/
+$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
diff --git a/tests/data/test1420 b/tests/data/test1420
index a20f8986..38139e0b 100644
--- a/tests/data/test1420
+++ b/tests/data/test1420
@@ -32,7 +32,10 @@ imap
<name>
--libcurl for IMAP FETCH message
</name>
- <command>
+<setenv>
+SSL_CERT_FILE=
+</setenv>
+<command>
'imap://%HOSTIP:%IMAPPORT/1420/;UID=1' -u user:secret --libcurl log/test1420.c
</command>
</client>
@@ -60,11 +63,10 @@ int main(int argc, char *argv[])
CURL *hnd;
hnd = curl_easy_init();
+ curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;UID=1");
curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret");
- curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
- curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
@@ -98,10 +100,9 @@ int main(int argc, char *argv[])
/**** End of sample code ****/
</file>
<stripfile>
-# curl's default user-agent varies with version, libraries etc.
-s/(USERAGENT, \")[^\"]+/${1}stripped/
-# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
-# configurations - just ignore them
+# These options vary with configurations - just ignore them
+$_ = '' if /CURLOPT_USERAGENT/
+$_ = '' if /CURLOPT_MAXREDIRS/
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
diff --git a/tests/data/test1425 b/tests/data/test1425
new file mode 100644
index 00000000..0044c69d
--- /dev/null
+++ b/tests/data/test1425
Binary files differ
diff --git a/tests/data/test1426 b/tests/data/test1426
new file mode 100644
index 00000000..dd6a8d11
--- /dev/null
+++ b/tests/data/test1426
Binary files differ
diff --git a/tests/data/test1427 b/tests/data/test1427
new file mode 100644
index 00000000..03cab4b9
--- /dev/null
+++ b/tests/data/test1427
@@ -0,0 +1,29 @@
+<testcase>
+<info>
+<keywords>
+integer overflow
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+too large -m timeout value
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1427 -m 184467440737095510
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+2
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1429 b/tests/data/test1429
index da09dca4..114dc0db 100644
--- a/tests/data/test1429
+++ b/tests/data/test1429
@@ -31,7 +31,7 @@ http
</server>
<name>
-HTTP GET with 4-digit reponse code
+HTTP GET with 4-digit response code
</name>
<command>
http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}'
@@ -54,7 +54,7 @@ Content-Type: text/html
Funny-head: yesyes
-foo-
-1234
+123
</stdout>
<strip>
^User-Agent:.*
diff --git a/tests/data/test1430 b/tests/data/test1430
index c5f65cfc..e3c9b1d6 100644
--- a/tests/data/test1430
+++ b/tests/data/test1430
@@ -30,7 +30,7 @@ Funny-head: yesyes
http
</server>
<name>
-HTTP GET with negative reponse code
+HTTP GET with negative response code
</name>
<command>
http://%HOSTIP:%HTTPPORT/1430
diff --git a/tests/data/test1431 b/tests/data/test1431
index 4ea33edc..bec3ebbd 100644
--- a/tests/data/test1431
+++ b/tests/data/test1431
@@ -30,7 +30,7 @@ Funny-head: yesyes
http
</server>
<name>
-HTTP GET with single-digit reponse code
+HTTP GET with single-digit response code
</name>
<command>
http://%HOSTIP:%HTTPPORT/1431
diff --git a/tests/data/test1432 b/tests/data/test1432
index eb1d0c2a..7f41c65b 100644
--- a/tests/data/test1432
+++ b/tests/data/test1432
@@ -31,7 +31,7 @@ http
</server>
<name>
-HTTP GET with 100-digit reponse code and survive
+HTTP GET with 100-digit response code and survive
</name>
<command>
http://%HOSTIP:%HTTPPORT/1432
diff --git a/tests/data/test1433 b/tests/data/test1433
index 8634db2c..a159daff 100644
--- a/tests/data/test1433
+++ b/tests/data/test1433
@@ -34,28 +34,13 @@ http
HTTP GET with 100-digit subversion number in response
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1433 --write-out '%{response_code}'
+http://%HOSTIP:%HTTPPORT/1433
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<stdout nonewline="yes">
-HTTP/1.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 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-
-200
-</stdout>
<strip>
^User-Agent:.*
</strip>
@@ -65,5 +50,8 @@ Host: %HOSTIP:%HTTPPORT
Accept: */*
</protocol>
+<errorcode>
+1
+</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test1440 b/tests/data/test1440
new file mode 100644
index 00000000..e87cafb0
--- /dev/null
+++ b/tests/data/test1440
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+--write-out
+FILE
+</keywords>
+</info>
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+
+<name>
+Check --write-out with trailing %{
+</name>
+<command>
+file://localhost/%PWD/log/non-existent-file.txt --write-out '%{'
+</command>
+</client>
+
+# Verify data
+<verify>
+<errorcode>
+37
+</errorcode>
+<stdout nonewline="yes">
+%{
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1441 b/tests/data/test1441
new file mode 100644
index 00000000..8d841df5
--- /dev/null
+++ b/tests/data/test1441
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+--write-out
+FILE
+</keywords>
+</info>
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+
+<name>
+Check --write-out with trailing %
+</name>
+<command>
+file://localhost/%PWD/log/non-existent-file.txt --write-out '%'
+</command>
+</client>
+
+# Verify data
+<verify>
+<errorcode>
+37
+</errorcode>
+<stdout nonewline="yes">
+%
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1442 b/tests/data/test1442
new file mode 100644
index 00000000..255a4c9f
--- /dev/null
+++ b/tests/data/test1442
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+--write-out
+FILE
+</keywords>
+</info>
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+
+<name>
+Check --write-out with trailing \
+</name>
+<command>
+file://localhost/%PWD/log/non-existent-file.txt --write-out '\'
+</command>
+</client>
+
+# Verify data
+<verify>
+<errorcode>
+37
+</errorcode>
+<stdout nonewline="yes">
+\
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1443 b/tests/data/test1443
new file mode 100644
index 00000000..69688670
--- /dev/null
+++ b/tests/data/test1443
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+-O
+--remote-time
+</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
+Content-Length: 6
+Connection: close
+
+12345
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+# This relies on the debug feature to allow us to set a directory
+# in which to store the -O output
+<features>
+debug
+</features>
+<server>
+http
+</server>
+<name>
+HTTP GET with -O and --remote-time
+</name>
+<setenv>
+CURL_TESTDIR=%PWD/log
+</setenv>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/1443 -O --remote-time
+</command>
+# Verify the mtime of the file. The mtime is specifically chosen to be an even
+# number so that it can be represented exactly on a FAT filesystem.
+<postcheck>
+perl -e 'exit((stat("log/1443"))[9] != 960898200)'
+</postcheck>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1443 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<file name="log/1443">
+12345
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1444 b/tests/data/test1444
new file mode 100644
index 00000000..7eec21b9
--- /dev/null
+++ b/tests/data/test1444
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+FTP
+EPSV
+RETR
+--remote-time
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+file data
+</data>
+<mdtm>
+213 20090213233130
+</mdtm>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP with --remote-time
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/1444 --remote-time
+</command>
+# Verify the mtime of the file. The mtime is specifically chosen to be an even
+# number so that it can be represented exactly on a FAT filesystem.
+<postcheck>
+perl -e 'exit((stat("log/curl1444.out"))[9] != 1234567890)'
+</postcheck>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+MDTM 1444
+EPSV
+TYPE I
+SIZE 1444
+RETR 1444
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1445 b/tests/data/test1445
new file mode 100644
index 00000000..f60483dc
--- /dev/null
+++ b/tests/data/test1445
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--remote-time
+</keywords>
+</info>
+
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+file
+</server>
+<precheck>
+perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test1445.dir
+</precheck>
+ <name>
+file:// with --remote-time
+ </name>
+ <command>
+file://localhost/%PWD/log/test1445.dir/plainfile.txt --remote-time
+</command>
+<postcheck>
+perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test1445.dir && \
+perl -e 'exit((stat("log/curl1445.out"))[9] != 946728000)'
+</postcheck>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1446 b/tests/data/test1446
new file mode 100644
index 00000000..7d5ec9fc
--- /dev/null
+++ b/tests/data/test1446
@@ -0,0 +1,42 @@
+<testcase>
+<info>
+<keywords>
+SFTP
+--remote-time
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+sftp
+</server>
+<precheck>
+perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test1446.dir
+</precheck>
+ <name>
+SFTP with --remote-time
+ </name>
+ <command>
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%PWD/log/test1446.dir/rofile.txt --insecure --remote-time
+</command>
+<postcheck>
+perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test1446.dir && \
+perl -e 'exit((stat("log/curl1446.out"))[9] != 978264000)'
+</postcheck>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
diff --git a/tests/data/test1450 b/tests/data/test1450
new file mode 100644
index 00000000..ca3ac884
--- /dev/null
+++ b/tests/data/test1450
@@ -0,0 +1,34 @@
+<testcase>
+<info>
+<keywords>
+DICT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+dict
+</server>
+<features>
+dict
+</features>
+ <name>
+Basic DICT lookup
+ </name>
+ <command>
+dict://%HOSTIP:%DICTPORT/d:basic
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1451 b/tests/data/test1451
new file mode 100644
index 00000000..0c114e18
--- /dev/null
+++ b/tests/data/test1451
@@ -0,0 +1,36 @@
+<testcase>
+<info>
+<keywords>
+SMB
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>Basic SMB test complete</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smb
+</server>
+<features>
+smb
+</features>
+ <name>
+Basic SMB request
+ </name>
+ <command>
+-u 'curltest:curltest' smb://%HOSTIP:%SMBPORT/TESTS/1451
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>Basic SMB test complete</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1452 b/tests/data/test1452
new file mode 100755
index 00000000..dbbb7d6c
--- /dev/null
+++ b/tests/data/test1452
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+TELNET
+UPLOAD
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+telnet
+</server>
+<features>
+telnet
+</features>
+ <name>
+Basic TELNET negotiation
+ </name>
+<stdin>
+test1452
+</stdin>
+ <command>
+telnet://%HOSTIP:%NEGTELNETPORT --upload-file -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>test1452</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test150 b/tests/data/test150
index 69c5835c..e19826e3 100644
--- a/tests/data/test150
+++ b/tests/data/test150
@@ -94,7 +94,7 @@ Accept: */*
GET /150 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test1521 b/tests/data/test1521
new file mode 100644
index 00000000..791a50dc
--- /dev/null
+++ b/tests/data/test1521
@@ -0,0 +1,30 @@
+<testcase>
+<info>
+<keywords>
+curl_easy_setopt
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1521
+</tool>
+
+ <name>
+Test all curl_easy_setopt and curl_easy_getinfo options
+ </name>
+ <command>
+unused
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1534 b/tests/data/test1534
index f3cd2f0e..5ebf57d3 100644
--- a/tests/data/test1534
+++ b/tests/data/test1534
@@ -27,7 +27,7 @@ http
lib1534
</tool>
<name>
-Test CURLINFO_RESPONSE_CODE
+CURLINFO_FILETIME init and reset
</name>
<command>
http://%HOSTIP:%HTTPPORT/1534
diff --git a/tests/data/test1537 b/tests/data/test1537
new file mode 100644
index 00000000..33d8ab3d
--- /dev/null
+++ b/tests/data/test1537
@@ -0,0 +1,45 @@
+<testcase>
+<info>
+<keywords>
+URL escape
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1537
+</tool>
+
+<name>
+libcurl URL escape/unescape tests
+</name>
+<command>
+nothing
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+%2F%3A%3B%3C%3D%3E%3F%91%A2%B3%C4%D5%E6%F7
+%2F%3A%3B%3C%3D%3E%3F%91%A2%B3%C4%D5%E6%F7
+outlen == 14
+unescape == original? YES
+[old] outlen == 14
+[old] unescape == original? YES
+escape -1 length: (nil)
+unescape -1 length: (nil) 2017
+</stdout>
+</verify>
+
+</testcase>
diff --git a/tests/data/test1538 b/tests/data/test1538
new file mode 100644
index 00000000..25b39a6f
--- /dev/null
+++ b/tests/data/test1538
@@ -0,0 +1,149 @@
+<testcase>
+<info>
+<keywords>
+strerror
+verbose logs
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1538
+</tool>
+
+<name>
+libcurl strerror API call tests
+</name>
+<command>
+nothing
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+e0: No error
+e1: Unsupported protocol
+e2: Failed initialization
+e3: URL using bad/illegal format or missing URL
+e4: A requested feature, protocol or option was not found built-in in this libcurl due to a build-time decision.
+e5: Couldn't resolve proxy name
+e6: Couldn't resolve host name
+e7: Couldn't connect to server
+e8: Weird server reply
+e9: Access denied to remote resource
+e10: FTP: The server failed to connect to data port
+e11: FTP: unknown PASS reply
+e12: FTP: Accepting server connect has timed out
+e13: FTP: unknown PASV reply
+e14: FTP: unknown 227 response format
+e15: FTP: can't figure out the host in the PASV response
+e16: Error in the HTTP2 framing layer
+e17: FTP: couldn't set file type
+e18: Transferred a partial file
+e19: FTP: couldn't retrieve (RETR failed) the specified file
+e20: Unknown error
+e21: Quote command returned error
+e22: HTTP response code said error
+e23: Failed writing received data to disk/application
+e24: Unknown error
+e25: Upload failed (at start/before it took off)
+e26: Failed to open/read local data from file/application
+e27: Out of memory
+e28: Timeout was reached
+e29: Unknown error
+e30: FTP: command PORT failed
+e31: FTP: command REST failed
+e32: Unknown error
+e33: Requested range was not delivered by the server
+e34: Internal problem setting up the POST
+e35: SSL connect error
+e36: Couldn't resume download
+e37: Couldn't read a file:// file
+e38: LDAP: cannot bind
+e39: LDAP: search failed
+e40: Unknown error
+e41: A required function in the library was not found
+e42: Operation was aborted by an application callback
+e43: A libcurl function was given a bad argument
+e44: Unknown error
+e45: Failed binding local connection end
+e46: Unknown error
+e47: Number of redirects hit maximum amount
+e48: An unknown option was passed in to libcurl
+e49: Malformed telnet option
+e50: Unknown error
+e51: SSL peer certificate or SSH remote key was not OK
+e52: Server returned nothing (no headers, no data)
+e53: SSL crypto engine not found
+e54: Can not set SSL crypto engine as default
+e55: Failed sending data to the peer
+e56: Failure when receiving data from the peer
+e57: Unknown error
+e58: Problem with the local SSL certificate
+e59: Couldn't use specified SSL cipher
+e60: Peer certificate cannot be authenticated with given CA certificates
+e61: Unrecognized or bad HTTP Content or Transfer-Encoding
+e62: Invalid LDAP URL
+e63: Maximum file size exceeded
+e64: Requested SSL level failed
+e65: Send failed since rewinding of the data stream failed
+e66: Failed to initialise SSL crypto engine
+e67: Login denied
+e68: TFTP: File Not Found
+e69: TFTP: Access Violation
+e70: Disk full or allocation exceeded
+e71: TFTP: Illegal operation
+e72: TFTP: Unknown transfer ID
+e73: Remote file already exists
+e74: TFTP: No such user
+e75: Conversion failed
+e76: Caller must register CURLOPT_CONV_ callback options
+e77: Problem with the SSL CA cert (path? access rights?)
+e78: Remote file not found
+e79: Error in the SSH layer
+e80: Failed to shut down the SSL connection
+e81: Socket not ready for send/recv
+e82: Failed to load CRL file (path? access rights?, format?)
+e83: Issuer check against peer certificate failed
+e84: FTP: The server did not accept the PRET command.
+e85: RTSP CSeq mismatch or invalid CSeq
+e86: RTSP session error
+e87: Unable to parse FTP file list
+e88: Chunk callback failed
+e89: The max connection limit is reached
+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: Unknown error
+m-1: Please call curl_multi_perform() soon
+m0: No error
+m1: Invalid multi handle
+m2: Invalid easy handle
+m3: Out of memory
+m4: Internal error
+m5: Invalid socket argument
+m6: Unknown option
+m7: The easy handle is already added to a multi handle
+m8: Unknown error
+s0: No error
+s1: Unknown share option
+s2: Share currently in use
+s3: Invalid share handle
+s4: Out of memory
+s5: Feature not enabled in this library
+s6: CURLSHcode unknown
+</stdout>
+</verify>
+
+</testcase>
diff --git a/tests/data/test1540 b/tests/data/test1540
new file mode 100644
index 00000000..1c1cf5db
--- /dev/null
+++ b/tests/data/test1540
@@ -0,0 +1,64 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+CURLPAUSE_RECV
+chunked Transfer-Encoding
+Trailer:
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK swsclose
+Transfer-Encoding: chunked
+Trailer: MyCoolTrailerHeader
+
+4
+data
+5
+d474
+
+0
+MyCoolTrailerHeader: amazingtrailer
+
+</data>
+<datacheck>
+HTTP/1.1 200 OK swsclose
+Transfer-Encoding: chunked
+Trailer: MyCoolTrailerHeader
+
+Got 4 bytes but pausing!
+datad474
+MyCoolTrailerHeader: amazingtrailer
+</datacheck>
+
+</reply>
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1540
+</tool>
+ <name>
+chunked with trailers and pausing the receive
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1540
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1540 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test155 b/tests/data/test155
index 46f890fc..b6451ec2 100644
--- a/tests/data/test155
+++ b/tests/data/test155
@@ -125,7 +125,7 @@ Content-Length: 0
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*
Content-Length: 85
diff --git a/tests/data/test1550 b/tests/data/test1550
new file mode 100644
index 00000000..b78756e9
--- /dev/null
+++ b/tests/data/test1550
@@ -0,0 +1,29 @@
+<testcase>
+<info>
+<keywords>
+multi
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib1550
+</tool>
+
+ <name>
+verify setting pipeling blacklisting options
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1550
+</command>
+</client>
+</testcase>
diff --git a/tests/data/test1551 b/tests/data/test1551
new file mode 100644
index 00000000..507266a8
--- /dev/null
+++ b/tests/data/test1551
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+multi
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 302 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Location: /15510002
+
+-foo-
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 11
+
+redirected
+</data2>
+<datacheck>
+redirected
+redirected
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib1551
+</tool>
+
+ <name>
+re-run redirected transfer without setting URL again
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1551
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1551 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /15510002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /1551 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /15510002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1606 b/tests/data/test1606
new file mode 100644
index 00000000..15488d40
--- /dev/null
+++ b/tests/data/test1606
@@ -0,0 +1,26 @@
+<testcase>
+<info>
+<keywords>
+unittest
+speedcheck
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+ <name>
+verify speedcheck
+ </name>
+<tool>
+unit1606
+</tool>
+</client>
+
+</testcase>
diff --git a/tests/data/test165 b/tests/data/test165
index 6fc0ad2d..b9a1ed78 100644
--- a/tests/data/test165
+++ b/tests/data/test165
@@ -31,9 +31,12 @@ http
idn
</features>
<setenv>
-CHARSET=UTF-8
-LANG=en_US.UTF-8
+LC_ALL=
+LC_CTYPE=en_US.UTF-8
</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
<name>
HTTP over proxy with IDN host name
</name>
diff --git a/tests/data/test169 b/tests/data/test169
index 73ca9bd2..c1f1b376 100644
--- a/tests/data/test169
+++ b/tests/data/test169
@@ -112,7 +112,7 @@ Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1800 b/tests/data/test1800
index 0a2bb1f6..01101840 100644
--- a/tests/data/test1800
+++ b/tests/data/test1800
@@ -48,7 +48,7 @@ Host: %HOSTIP:%HTTPPORT
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
-HTTP2-Settings: AAMAAABkAARAAAAA
+HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
</protocol>
</verify>
diff --git a/tests/data/test1801 b/tests/data/test1801
index 9e1900b9..b827ab51 100644
--- a/tests/data/test1801
+++ b/tests/data/test1801
@@ -58,7 +58,7 @@ Host: %HOSTIP:%HTTPPORT
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
-HTTP2-Settings: AAMAAABkAARAAAAA
+HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
</protocol>
# CURLE_HTTP2: Send failure: Broken pipe
diff --git a/tests/data/test1900 b/tests/data/test1900
index 04c59a82..2e3c93a0 100644
--- a/tests/data/test1900
+++ b/tests/data/test1900
@@ -42,9 +42,9 @@ lib1900
HTTP GET using pipelining
</name>
<command>
-http://%HOSTIP:%HTTPPIPEPORT/
+http://%HOSTIP:%HTTPPIPEPORT/ log/urls1900.txt
</command>
-<file name="log/urls.txt">
+<file name="log/urls1900.txt">
0 1k.txt
1000 100k.txt
0 1k.txt
diff --git a/tests/data/test1901 b/tests/data/test1901
index 17c04d14..83cdf729 100644
--- a/tests/data/test1901
+++ b/tests/data/test1901
@@ -43,9 +43,9 @@ lib1900
HTTP GET using pipelining, blacklisted site
</name>
<command>
-http://%HOSTIP:%HTTPPIPEPORT/
+http://%HOSTIP:%HTTPPIPEPORT/ log/urls1901.txt
</command>
-<file name="log/urls.txt">
+<file name="log/urls1901.txt">
blacklist_site 127.0.0.1:%HTTPPIPEPORT
0 1k.txt
1000 100k.txt
diff --git a/tests/data/test1902 b/tests/data/test1902
index 533ed55a..3c999316 100644
--- a/tests/data/test1902
+++ b/tests/data/test1902
@@ -43,9 +43,9 @@ lib1900
HTTP GET using pipelining, broken pipe
</name>
<command>
-http://%HOSTIP:%HTTPPIPEPORT/
+http://%HOSTIP:%HTTPPIPEPORT/ log/urls1902.txt
</command>
-<file name="log/urls.txt">
+<file name="log/urls1902.txt">
0 1k.txt
1000 connection_close.txt
1 1k.txt
diff --git a/tests/data/test1903 b/tests/data/test1903
index c7256183..219ffe11 100644
--- a/tests/data/test1903
+++ b/tests/data/test1903
@@ -43,9 +43,9 @@ lib1900
HTTP GET using pipelining, penalized on content-length
</name>
<command>
-http://%HOSTIP:%HTTPPIPEPORT/
+http://%HOSTIP:%HTTPPIPEPORT/ log/urls1903.txt
</command>
-<file name="log/urls.txt">
+<file name="log/urls1903.txt">
0 1k.txt
1000 100k.txt
550 alphabet.txt
diff --git a/tests/data/test199 b/tests/data/test199
index 881ee03a..72675b53 100644
--- a/tests/data/test199
+++ b/tests/data/test199
@@ -8,7 +8,7 @@ globbing
</info>
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test2031 b/tests/data/test2031
index bd5aa074..23b1a521 100644
--- a/tests/data/test2031
+++ b/tests/data/test2031
@@ -40,7 +40,7 @@ WWW-Authenticate: NTLM
This is a bad password page!
</data1102>
-<!-- Second request has NTML auth, right password -->
+<!-- Second request has NTLM auth, right password -->
<data200>
HTTP/1.1 401 Need NTLM auth (2)
Server: Microsoft-IIS/5.0
diff --git a/tests/data/test2032 b/tests/data/test2032
index 12fdbee3..8776c3b0 100644
--- a/tests/data/test2032
+++ b/tests/data/test2032
@@ -5,7 +5,6 @@ HTTP
HTTP GET
HTTP Basic auth
HTTP NTLM auth
-flaky
</keywords>
</info>
# Server-side
@@ -23,7 +22,7 @@ WWW-Authenticate: Basic realm="testrealm"
This is a bad password page!
</data100>
-<!-- NTML auth -->
+<!-- NTLM auth -->
<data200>
HTTP/1.1 401 Need Basic or NTLM auth (2)
Server: Microsoft-IIS/5.0
@@ -55,34 +54,9 @@ Finally, this is the real page!
</data1202>
<datacheck>
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-HTTP/1.1 401 NTLM intermediate (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 33
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=
-
-HTTP/1.1 200 Things are fine in server land
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 32
-
-Finally, this is the real page!
+Data connection 0: 228
+Data connection 1: 228
+Data connection 2: 402
</datacheck>
</reply>
diff --git a/tests/data/test2033 b/tests/data/test2033
index 6c41700a..405d12a2 100644
--- a/tests/data/test2033
+++ b/tests/data/test2033
@@ -23,7 +23,7 @@ WWW-Authenticate: Basic realm="testrealm"
This is a bad password page!
</data100>
-<!-- NTML auth -->
+<!-- NTLM auth -->
<data200>
HTTP/1.1 401 Need Basic or NTLM auth (2)
Server: Microsoft-IIS/5.0
@@ -55,34 +55,9 @@ Finally, this is the real page!
</data1202>
<datacheck>
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-HTTP/1.1 401 NTLM intermediate (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 33
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=
-
-HTTP/1.1 200 Things are fine in server land
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 32
-
-Finally, this is the real page!
+Data connection 0: 228
+Data connection 1: 228
+Data connection 2: 402
</datacheck>
</reply>
diff --git a/tests/data/test2046 b/tests/data/test2046
index 133c14d7..dcd202f0 100644
--- a/tests/data/test2046
+++ b/tests/data/test2046
@@ -41,8 +41,12 @@ http
idn
</features>
<setenv>
-CHARSET=UTF-8
+LC_ALL=
+LC_CTYPE=en_US.UTF-8
</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
<name>
Connection re-use with IDN host name
</name>
diff --git a/tests/data/test2047 b/tests/data/test2047
index 44229780..fc140486 100644
--- a/tests/data/test2047
+++ b/tests/data/test2047
@@ -42,8 +42,12 @@ http
idn
</features>
<setenv>
-CHARSET=UTF-8
+LC_ALL=
+LC_CTYPE=en_US.UTF-8
</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
<name>
Connection re-use with IDN host name over HTTP proxy
</name>
diff --git a/tests/data/test2055 b/tests/data/test2055
new file mode 100755
index 00000000..cca44942
--- /dev/null
+++ b/tests/data/test2055
@@ -0,0 +1,80 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+HTTP proxy
+proxytunnel
+CURLOPT_CONNECT_TO
+SOCKS5
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Connection established
+
+</connect>
+
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 3
+Content-Type: text/plain
+
+OK
+</data>
+
+<datacheck>
+HTTP/1.1 200 Connection established
+
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 3
+Content-Type: text/plain
+
+OK
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+http-proxy
+socks5
+</server>
+ <name>
+Connect to specific host via SOCKS proxy and HTTP proxy (switch to tunnel mode automatically)
+ </name>
+
+ <command>
+http://www.example.com.2055/2055 --connect-to ::connect.example.com.2055:%HTTPPORT -x %HOSTIP:%PROXYPORT --preproxy socks5://%HOSTIP:%SOCKSPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<proxy>
+CONNECT connect.example.com.2055:%HTTPPORT HTTP/1.1
+Host: connect.example.com.2055:%HTTPPORT
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /2055 HTTP/1.1
+Host: www.example.com.2055
+Accept: */*
+
+</protocol>
+
+</verify>
+</testcase>
diff --git a/tests/data/test207 b/tests/data/test207
index e44385f1..caff8105 100644
--- a/tests/data/test207
+++ b/tests/data/test207
@@ -5,6 +5,7 @@ HTTP
HTTP GET
CURLE_PARTIAL_FILE
FAILURE
+chunked Transfer-Encoding
</keywords>
</info>
#
@@ -37,7 +38,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
http
</server>
<name>
-HTTP GET with chunked Transfer-Encoding closed pre-maturely
+HTTP GET with chunked Transfer-Encoding closed prematurely
</name>
<command>
http://%HOSTIP:%HTTPPORT/207
diff --git a/tests/data/test209 b/tests/data/test209
index 3aefac4e..37c9ad22 100644
--- a/tests/data/test209
+++ b/tests/data/test209
@@ -110,7 +110,7 @@ Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.209:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
Proxy-Connection: Keep-Alive
GET /path/2090002 HTTP/1.1
diff --git a/tests/data/test213 b/tests/data/test213
index a0de1fad..93aaf64b 100644
--- a/tests/data/test213
+++ b/tests/data/test213
@@ -110,7 +110,7 @@ Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0
Host: test.remote.example.com.213:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
Proxy-Connection: Keep-Alive
POST /path/2130002 HTTP/1.1
diff --git a/tests/data/test216 b/tests/data/test216
index 0c4de0a6..404e9c98 100644
--- a/tests/data/test216
+++ b/tests/data/test216
@@ -18,7 +18,7 @@ ftp
FTP upload two files to the same dir
</name>
<command>
--T log/upload.216 ftp://%HOSTIP:%FTPPORT/a/path/216/ -T log/upload.216 ftp://%HOSTIP:%FTPPORT/a/path/216/%2e%2eanotherup
+-T log/upload.216 ftp://%HOSTIP:%FTPPORT/a/path/216/ -T log/upload.216 ftp://%HOSTIP:%FTPPORT/a/path/216/%2e%2eanotherup.216
</command>
<file name="log/upload.216">
upload this file twice
@@ -38,7 +38,7 @@ EPSV
TYPE I
STOR upload.216
EPSV
-STOR ..anotherup
+STOR ..anotherup.216
QUIT
</protocol>
</verify>
diff --git a/tests/data/test218 b/tests/data/test218
index c201e77a..138c4b7b 100644
--- a/tests/data/test218
+++ b/tests/data/test218
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP PUT
+chunked Transfer-Encoding
</keywords>
</info>
#
diff --git a/tests/data/test239 b/tests/data/test239
index 6b92f07f..e8fcb770 100644
--- a/tests/data/test239
+++ b/tests/data/test239
@@ -89,7 +89,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test243 b/tests/data/test243
index 3496055d..5f852989 100644
--- a/tests/data/test243
+++ b/tests/data/test243
@@ -118,7 +118,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test256 b/tests/data/test256
index 2b96ecf3..17ae807d 100644
--- a/tests/data/test256
+++ b/tests/data/test256
@@ -29,9 +29,9 @@ http
HTTP resume request over proxy with auth without server supporting it
</name>
<command option="no-output">
--x http://%HOSTIP:%HTTPPORT http://%HOSTIP:%HTTPPORT/want/256 -C - --no-include -o log/fewl.txt -U daniel:stenberg
+-x http://%HOSTIP:%HTTPPORT http://%HOSTIP:%HTTPPORT/want/256 -C - --no-include -o log/fewl256.txt -U daniel:stenberg
</command>
-<file name="log/fewl.txt">
+<file name="log/fewl256.txt">
This text is here to simulate a partly downloaded file to resume
download on.
</file>
@@ -56,7 +56,7 @@ Proxy-Connection: Keep-Alive
</protocol>
# the download target file must remain untouched
-<file name="log/fewl.txt">
+<file name="log/fewl256.txt">
This text is here to simulate a partly downloaded file to resume
download on.
</file>
diff --git a/tests/data/test265 b/tests/data/test265
index a7c456cc..17176ddd 100644
--- a/tests/data/test265
+++ b/tests/data/test265
@@ -111,7 +111,7 @@ Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.265:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
Proxy-Connection: Keep-Alive
POST /path/2650002 HTTP/1.1
diff --git a/tests/data/test267 b/tests/data/test267
index 7cc8375a..7a45d122 100644
--- a/tests/data/test267
+++ b/tests/data/test267
@@ -97,7 +97,7 @@ Content-Type: application/x-www-form-urlencoded
POST /267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Header1: yes
diff --git a/tests/data/test271 b/tests/data/test271
index 06d5a8b4..1557fd0f 100644
--- a/tests/data/test271
+++ b/tests/data/test271
@@ -27,7 +27,7 @@ tftp
TFTP retrieve
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT//271 --trace-ascii log/traceit
+tftp://%HOSTIP:%TFTPPORT//271
</command>
</client>
diff --git a/tests/data/test283 b/tests/data/test283
index 0dc1270f..201df9f7 100644
--- a/tests/data/test283
+++ b/tests/data/test283
@@ -17,7 +17,7 @@ tftp
TFTP retrieve on invalid file
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT//invalid-file --trace-ascii log/traceit --tftp-blksize 1024
+tftp://%HOSTIP:%TFTPPORT//invalid-file --tftp-blksize 1024
</command>
</client>
diff --git a/tests/data/test284 b/tests/data/test284
index 954c9026..9b946ecd 100644
--- a/tests/data/test284
+++ b/tests/data/test284
@@ -51,7 +51,7 @@ tftp
TFTP retrieve of boundary case 512 byte file
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT//284 --trace-ascii log/traceit
+tftp://%HOSTIP:%TFTPPORT//284
</command>
</client>
diff --git a/tests/data/test285 b/tests/data/test285
index d7a4a390..09bfe319 100644
--- a/tests/data/test285
+++ b/tests/data/test285
@@ -16,7 +16,7 @@ tftp
TFTP send
</name>
<command>
--T log/test285.txt tftp://%HOSTIP:%TFTPPORT// --trace-ascii log/traceit
+-T log/test285.txt tftp://%HOSTIP:%TFTPPORT//
</command>
<file name="log/test285.txt">
a chunk of
diff --git a/tests/data/test286 b/tests/data/test286
index b909fd3d..505352a7 100644
--- a/tests/data/test286
+++ b/tests/data/test286
@@ -16,7 +16,7 @@ tftp
TFTP send of boundary case 512 byte file
</name>
<command>
--T log/test286.txt tftp://%HOSTIP:%TFTPPORT// --trace-ascii log/traceit
+-T log/test286.txt tftp://%HOSTIP:%TFTPPORT//
</command>
<file name="log/test286.txt">
A chunk of data which exactly fits into
diff --git a/tests/data/test31 b/tests/data/test31
index 2289d56d..54e360a4 100644
--- a/tests/data/test31
+++ b/tests/data/test31
@@ -80,7 +80,7 @@ TZ=GMT
http://%HOSTIP:%HTTPPORT/we/want/31 -b none -c log/jar31.txt
</command>
<precheck>
-perl -e 'if ("%HOSTIP" !~ /127\.0\.0\.1$/) {print "Test only works for HOSTIP 127.0.0.1"; exit(1)}'
+perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );"
</precheck>
</client>
diff --git a/tests/data/test38 b/tests/data/test38
index 848150a3..db257f2f 100644
--- a/tests/data/test38
+++ b/tests/data/test38
@@ -28,9 +28,9 @@ http
HTTP resume request without server supporting it
</name>
<command option="no-output">
-http://%HOSTIP:%HTTPPORT/want/38 -C - --no-include -o log/fewl.txt
+http://%HOSTIP:%HTTPPORT/want/38 -C - --no-include -o log/fewl38.txt
</command>
-<file name="log/fewl.txt">
+<file name="log/fewl38.txt">
This text is here to simulate a partly downloaded file to resume
download on.
</file>
@@ -53,7 +53,7 @@ Accept: */*
</protocol>
# the download target file must remain untouched
-<file name="log/fewl.txt">
+<file name="log/fewl38.txt">
This text is here to simulate a partly downloaded file to resume
download on.
</file>
diff --git a/tests/data/test47 b/tests/data/test47
index 0a6d4da3..bd779d34 100644
--- a/tests/data/test47
+++ b/tests/data/test47
@@ -8,7 +8,7 @@ HTTP/1.0
</info>
#
# Server-side
-<reply name="47">
+<reply>
<data>
HTTP/1.0 200 OK swsclose
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test500 b/tests/data/test500
index faf3d727..56a5c913 100644
--- a/tests/data/test500
+++ b/tests/data/test500
@@ -7,7 +7,7 @@ HTTP GET
</info>
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test501 b/tests/data/test501
index 9c9dcc9e..674bc43b 100644
--- a/tests/data/test501
+++ b/tests/data/test501
@@ -6,7 +6,7 @@ missing URL
</info>
#
# Server-side
-<reply name="1">
+<reply>
</reply>
# Client-side
diff --git a/tests/data/test506 b/tests/data/test506
index 96e690b2..40eee253 100644
--- a/tests/data/test506
+++ b/tests/data/test506
@@ -55,6 +55,11 @@ run 3: overwrite cookie 1 and 4, set cookie 6 with and without tailmatch
<server>
http
</server>
+# don't run this with the threaded-resolver since the events might trigger in
+# a different order!
+<features>
+!threaded-resolver
+</features>
<name>
HTTP with shared cookie list (and dns cache)
</name>
diff --git a/tests/data/test510 b/tests/data/test510
index 5ba0a7fe..a7acbe80 100644
--- a/tests/data/test510
+++ b/tests/data/test510
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP POST
+chunked Transfer-Encoding
</keywords>
</info>
diff --git a/tests/data/test540 b/tests/data/test540
index 8decaea9..8391cbe7 100644
--- a/tests/data/test540
+++ b/tests/data/test540
@@ -11,6 +11,9 @@ multi
# Server-side
<reply>
+<servercmd>
+connection-monitor
+</servercmd>
# this is returned first since we get no proxy-auth
<data>
@@ -40,6 +43,10 @@ Content-Length: 21
Server: no
Nice proxy auth sir!
+HTTP/1.1 407 Authorization Required to proxy me my dear
+Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
+Content-Length: 33
+
HTTP/1.1 200 OK
Content-Length: 21
Server: no
@@ -88,10 +95,16 @@ Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/540 HTTP/1.1
Host: custom.set.host.name
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+GET http://test.remote.example.com/path/540 HTTP/1.1
+Host: custom.set.host.name
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="/path/540", response="ca507dcf189196b6a5374d3233042261"
Accept: */*
Proxy-Connection: Keep-Alive
+[DISCONNECT]
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test547 b/tests/data/test547
index cee22c6f..841c3ff7 100644
--- a/tests/data/test547
+++ b/tests/data/test547
@@ -122,7 +122,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test548 b/tests/data/test548
index 34cf5e2e..9d1f258a 100644
--- a/tests/data/test548
+++ b/tests/data/test548
@@ -122,7 +122,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test552 b/tests/data/test552
index b44ca345..5d1478bd 100644
--- a/tests/data/test552
+++ b/tests/data/test552
Binary files differ
diff --git a/tests/data/test554 b/tests/data/test554
index fdbd1868..3419e5e0 100644
--- a/tests/data/test554
+++ b/tests/data/test554
@@ -61,7 +61,7 @@ http://%HOSTIP:%HTTPPORT/554
s/^--------------------------[a-z0-9]*/------------------------------/
s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
</strippart>
-# Note that the stripping above removes 12 bytes from every occurance of the
+# Note that the stripping above removes 12 bytes from every occurrence of the
# boundary string and since 5 of them are in the body contents, we see
# (5*12) == 60 bytes less
<protocol>
diff --git a/tests/data/test555 b/tests/data/test555
index 0f3bb07f..3aa2ef14 100644
--- a/tests/data/test555
+++ b/tests/data/test555
@@ -1,6 +1,6 @@
<testcase>
# NOTE: this test case is a duplicate of 547 but the tool is built to use the
-# multi interface instead of easy, but that shouldn't be noticable at all in
+# multi interface instead of easy, but that shouldn't be noticeable at all in
# this file!
<info>
<keywords>
@@ -131,7 +131,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test559 b/tests/data/test559
new file mode 100644
index 00000000..f08a5f8f
--- /dev/null
+++ b/tests/data/test559
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+CURLOPT_BUFFERSIZE
+</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: 2049
+Connection: close
+Content-Type: text/html
+Silly-header: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+
+ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib559
+</tool>
+
+<name>
+use tiny CURLOPT_BUFFERSIZE
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/559
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+
+</testcase>
diff --git a/tests/data/test563 b/tests/data/test563
index 78515231..cecbedc2 100644
--- a/tests/data/test563
+++ b/tests/data/test563
@@ -23,8 +23,8 @@ hello
# Client-side
<client>
<server>
-ftp
http
+ftp
</server>
<tool>
lib562
diff --git a/tests/data/test565 b/tests/data/test565
index 6e215a24..ae8518c7 100644
--- a/tests/data/test565
+++ b/tests/data/test565
@@ -4,6 +4,7 @@
HTTP
HTTP POST
HTTP Digest auth
+chunked Transfer-Encoding
</keywords>
</info>
#
diff --git a/tests/data/test569 b/tests/data/test569
index c4c62a4c..ea6cd0bb 100644
--- a/tests/data/test569
+++ b/tests/data/test569
@@ -66,7 +66,7 @@ lib569
RTSP Session ID parsing
</name>
<command>
-rtsp://%HOSTIP:%RTSPPORT/569 log/idfile.txt
+rtsp://%HOSTIP:%RTSPPORT/569 log/idfile569.txt
</command>
</client>
@@ -100,7 +100,7 @@ CSeq: 6
Session: A
</protocol>
-<file name="log/idfile.txt">
+<file name="log/idfile569.txt">
Got Session ID: [00.+1-am-aSe55ion_id\$yes-i-am\$]
Got Session ID: [\$extraspaces]
Got Session ID: [A]
diff --git a/tests/data/test571 b/tests/data/test571
index 5e138cdf..494ac416 100644
--- a/tests/data/test571
+++ b/tests/data/test571
@@ -78,7 +78,7 @@ lib571
RTSP RTP Interleaving Test
</name>
<command>
-rtsp://%HOSTIP:%RTSPPORT/571 log/protofile.txt
+rtsp://%HOSTIP:%RTSPPORT/571 log/protofile571.txt
</command>
</client>
@@ -99,7 +99,7 @@ RTP: message size 85, channel 0
RTP: message size 24, channel 1
</stdout>
-<file name="log/protofile.txt">
+<file name="log/protofile571.txt">
$99
</file>
</verify>
diff --git a/tests/data/test578 b/tests/data/test578
index e4ee4ac1..abbe49a3 100644
--- a/tests/data/test578
+++ b/tests/data/test578
@@ -7,7 +7,7 @@ HTTP POST
</info>
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test59 b/tests/data/test59
index 1924650f..9c960177 100644
--- a/tests/data/test59
+++ b/tests/data/test59
@@ -7,7 +7,7 @@ HTTP GET
</info>
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.0 200 OK swsclose
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test590 b/tests/data/test590
index 55ea4f0e..48144d40 100644
--- a/tests/data/test590
+++ b/tests/data/test590
@@ -115,7 +115,7 @@ Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAAAgACAPYAAAAIAAgA+AAAAAAAAAAAAAAABoKBAB3Hr6SDn3NDNkgebbaP88ExMjM0MjIzNFIW4N7aYT44bAIg1jt2blUBAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbWVjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAAAgACAPYAAAAIAAgA+AAAAAAAAAAAAAAABoKBAPfkdFqeIuYPjDr2ZbNxCag0MzIxNTMyMQjxxEdSYaUsgjpD8o53NrMBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbWVjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test599 b/tests/data/test599
index 9ce8b234..9a6c4126 100644
--- a/tests/data/test599
+++ b/tests/data/test599
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP POST
+chunked Transfer-Encoding
</keywords>
</info>
#
diff --git a/tests/data/test60 b/tests/data/test60
index df9eeee1..0dd717f8 100644
--- a/tests/data/test60
+++ b/tests/data/test60
@@ -3,6 +3,7 @@
<keywords>
HTTP
HTTP PUT
+chunked Transfer-Encoding
</keywords>
</info>
diff --git a/tests/data/test67 b/tests/data/test67
index b3431111..739b82c2 100644
--- a/tests/data/test67
+++ b/tests/data/test67
@@ -93,7 +93,7 @@ Accept: */*
GET /67 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test68 b/tests/data/test68
index acd710fe..239da781 100644
--- a/tests/data/test68
+++ b/tests/data/test68
@@ -92,7 +92,7 @@ Accept: */*
GET /68 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test69 b/tests/data/test69
index 887a4603..c0503f7f 100644
--- a/tests/data/test69
+++ b/tests/data/test69
@@ -114,7 +114,7 @@ Accept: */*
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test700 b/tests/data/test700
index ce6f894f..ac63fa59 100644
--- a/tests/data/test700
+++ b/tests/data/test700
@@ -9,7 +9,7 @@ SOCKS4
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test701 b/tests/data/test701
index 014aca24..799597f3 100644
--- a/tests/data/test701
+++ b/tests/data/test701
@@ -9,7 +9,7 @@ SOCKS5
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test708 b/tests/data/test708
index 716d9aec..e8bffc36 100644
--- a/tests/data/test708
+++ b/tests/data/test708
@@ -9,7 +9,7 @@ SOCKS4
#
# Server-side
-<reply name="1">
+<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
diff --git a/tests/data/test712 b/tests/data/test712
index c62e9f2c..252c9ef0 100644
--- a/tests/data/test712
+++ b/tests/data/test712
@@ -6,7 +6,6 @@ FTP
PASV
RETR
SOCKS5
-all_proxy
</keywords>
</info>
#
diff --git a/tests/data/test713 b/tests/data/test713
new file mode 100755
index 00000000..bb79994f
--- /dev/null
+++ b/tests/data/test713
@@ -0,0 +1,49 @@
+<testcase>
+#based off test 712
+<info>
+<keywords>
+FTP
+PASV
+RETR
+SOCKS5
+CURLOPT_CONNECT_TO
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+silly content
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+socks5
+</server>
+ <name>
+FTP fetch with --proxy set to socks5:// and with --connect-to
+ </name>
+ <command>
+ftp://ftp.example.com/713 --connect-to ::%HOSTIP:%FTPPORT --proxy socks5://%HOSTIP:%SOCKSPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE 713
+RETR 713
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test714 b/tests/data/test714
new file mode 100755
index 00000000..efec0322
--- /dev/null
+++ b/tests/data/test714
@@ -0,0 +1,67 @@
+<testcase>
+#based off test 712
+<info>
+<keywords>
+FTP
+PASV
+RETR
+HTTP
+HTTP CONNECT
+proxytunnel
+CURLOPT_CONNECT_TO
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Connection established
+
+</connect>
+
+<data nocheck="yes">
+silly content
+</data>
+
+<datacheck>
+HTTP/1.1 200 Connection established
+
+HTTP/1.1 200 Connection established
+
+silly content
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+http-proxy
+</server>
+<features>
+http
+</features>
+ <name>
+FTP fetch with --proxy set to http:// and with --connect-to
+ </name>
+ <command>
+ftp://ftp.example.com.714/714 --connect-to ::connect.example.com.714:%FTPPORT --proxytunnel --proxy http://%HOSTIP:%PROXYPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE 714
+RETR 714
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test715 b/tests/data/test715
new file mode 100755
index 00000000..56936b94
--- /dev/null
+++ b/tests/data/test715
@@ -0,0 +1,69 @@
+<testcase>
+#based off test 712
+<info>
+<keywords>
+FTP
+PASV
+RETR
+HTTP
+HTTP CONNECT
+proxytunnel
+SOCKS5
+CURLOPT_CONNECT_TO
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Connection established
+
+</connect>
+
+<data nocheck="yes">
+silly content
+</data>
+
+<datacheck>
+HTTP/1.1 200 Connection established
+
+HTTP/1.1 200 Connection established
+
+silly content
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+http-proxy
+socks5
+</server>
+<features>
+http
+</features>
+ <name>
+FTP fetch with --preproxy, --proxy and --connect-to
+ </name>
+ <command>
+ftp://ftp.example.com.715/715 --connect-to ::connect.example.com.715:%FTPPORT --proxytunnel --proxy %HOSTIP:%PROXYPORT --preproxy socks5://%HOSTIP:%SOCKSPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE 715
+RETR 715
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test81 b/tests/data/test81
index dc054d29..7483bfb3 100644
--- a/tests/data/test81
+++ b/tests/data/test81
@@ -93,7 +93,7 @@ Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test822 b/tests/data/test822
index 65ac43e5..a6c0407e 100644
--- a/tests/data/test822
+++ b/tests/data/test822
@@ -14,7 +14,7 @@ SASL AUTH NTLM
AUTH NTLM
REPLY AUTHENTICATE +
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -62,7 +62,7 @@ chkhostname curlhost
A001 CAPABILITY
A002 AUTHENTICATE NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
A003 SELECT 822
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test823 b/tests/data/test823
index 6f8249b1..25c59ec6 100644
--- a/tests/data/test823
+++ b/tests/data/test823
@@ -14,7 +14,7 @@ RFC2831
<servercmd>
AUTH DIGEST-MD5
REPLY AUTHENTICATE + cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
-REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPWJlYjMzYmY2MWFhMDgzNzZmZWE4ZjJkM2MwODliMjFmLHFvcD1hdXRo +
+REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPTVlNzk5N2ZhZDZjMzNiZWJmZjk3OWJkY2I4ZmU3MTZiLHFvcD1hdXRo +
REPLY A002 OK AUTHENTICATE completed
</servercmd>
<data>
@@ -53,7 +53,7 @@ IMAP DIGEST-MD5 authentication
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE DIGEST-MD5
-dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPWJlYjMzYmY2MWFhMDgzNzZmZWE4ZjJkM2MwODliMjFmLHFvcD1hdXRo
+dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJpbWFwL2N1cmwiLHJlc3BvbnNlPTVlNzk5N2ZhZDZjMzNiZWJmZjk3OWJkY2I4ZmU3MTZiLHFvcD1hdXRo
A003 SELECT 823
A004 FETCH 1 BODY[]
diff --git a/tests/data/test827 b/tests/data/test827
index 778e7658..5005271e 100644
--- a/tests/data/test827
+++ b/tests/data/test827
@@ -15,7 +15,7 @@ SASL-IR
AUTH NTLM
CAPA SASL-IR
REPLY AUTHENTICATE + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -62,7 +62,7 @@ chkhostname curlhost
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
A003 SELECT 827
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test842 b/tests/data/test842
index b98d5a25..d5aabbca 100644
--- a/tests/data/test842
+++ b/tests/data/test842
@@ -40,7 +40,7 @@ IMAP OAuth 2.0 (OAUTHBEARER) authentication
<command>
'imap://%HOSTIP:%IMAPPORT/842/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
diff --git a/tests/data/test843 b/tests/data/test843
index 266aaa7c..a1c31a45 100644
--- a/tests/data/test843
+++ b/tests/data/test843
@@ -41,7 +41,7 @@ IMAP OAuth 2.0 (OAUTHBEARER) authentication with initial response
<command>
'imap://%HOSTIP:%IMAPPORT/843/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
diff --git a/tests/data/test844 b/tests/data/test844
index 4acd6672..055a9d2f 100644
--- a/tests/data/test844
+++ b/tests/data/test844
@@ -32,7 +32,7 @@ IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation
<command>
'imap://%HOSTIP:%IMAPPORT/844/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
diff --git a/tests/data/test845 b/tests/data/test845
index 152ab582..e23b3d69 100644
--- a/tests/data/test845
+++ b/tests/data/test845
@@ -33,7 +33,7 @@ IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation with initial response
<command>
'imap://%HOSTIP:%IMAPPORT/845/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
diff --git a/tests/data/test868 b/tests/data/test868
index 591bd509..30426fb6 100644
--- a/tests/data/test868
+++ b/tests/data/test868
@@ -16,7 +16,7 @@ RFC5034
AUTH NTLM
REPLY AUTH +
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -64,7 +64,7 @@ chkhostname curlhost
CAPA
AUTH NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
RETR 868
QUIT
</protocol>
diff --git a/tests/data/test869 b/tests/data/test869
index cba33b35..ecc422ca 100644
--- a/tests/data/test869
+++ b/tests/data/test869
@@ -16,7 +16,7 @@ RFC5034
<servercmd>
AUTH DIGEST-MD5
REPLY AUTH + cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
-REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9MDE2MTNmOWEwNTgxODNmYTc2NmFkNWEwOThiNmE3MTUscW9wPWF1dGg= +
+REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9YzNhMGFiZTc5NDYyNTIyNGY5Njg3YTYzMTc3ZmRhNWIscW9wPWF1dGg= +
REPLY +OK Login successful
</servercmd>
<data>
@@ -55,7 +55,7 @@ pop3://%HOSTIP:%POP3PORT/869 -u user:secret
<protocol>
CAPA
AUTH DIGEST-MD5
-dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9MDE2MTNmOWEwNTgxODNmYTc2NmFkNWEwOThiNmE3MTUscW9wPWF1dGg=
+dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJwb3AvY3VybCIscmVzcG9uc2U9YzNhMGFiZTc5NDYyNTIyNGY5Njg3YTYzMTc3ZmRhNWIscW9wPWF1dGg=
RETR 869
QUIT
diff --git a/tests/data/test87 b/tests/data/test87
index 5e6aef30..ee5be78c 100644
--- a/tests/data/test87
+++ b/tests/data/test87
@@ -40,7 +40,7 @@ http
urlglob with out of range -o #[num] usage
</name>
<command option="no-output">
-"http://%HOSTIP:%HTTPPORT/[870001-870002]" -o "log/dumpit#2.dump"
+"http://%HOSTIP:%HTTPPORT/[870001-870002]" -o "log/dumpit87-#2.dump"
</command>
</client>
@@ -50,7 +50,7 @@ urlglob with out of range -o #[num] usage
# survives
#
<verify>
-<file name="log/dumpit#2.dump">
+<file name="log/dumpit87-#2.dump">
HTTP/1.1 200 OK
Funny-head: yesyes
Content-Length: 16
diff --git a/tests/data/test873 b/tests/data/test873
index a91b3608..448e8e20 100644
--- a/tests/data/test873
+++ b/tests/data/test873
@@ -16,7 +16,7 @@ RFC5034
<servercmd>
AUTH NTLM
REPLY AUTH + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -63,7 +63,7 @@ chkhostname curlhost
<protocol>
CAPA
AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
RETR 873
QUIT
</protocol>
diff --git a/tests/data/test887 b/tests/data/test887
index b39dc21c..fed4e3d9 100644
--- a/tests/data/test887
+++ b/tests/data/test887
@@ -42,7 +42,7 @@ POP3 OAuth 2.0 (OAUTHBEARER) authentication
<command>
pop3://%HOSTIP:%POP3PORT/887 -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
diff --git a/tests/data/test888 b/tests/data/test888
index 1a359df2..c52974f1 100644
--- a/tests/data/test888
+++ b/tests/data/test888
@@ -42,7 +42,7 @@ POP3 OAuth 2.0 (OAUTHBEARER) authentication with initial response
<command>
pop3://%HOSTIP:%POP3PORT/888 -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
diff --git a/tests/data/test889 b/tests/data/test889
index 5fbd0ca8..da26a372 100644
--- a/tests/data/test889
+++ b/tests/data/test889
@@ -34,7 +34,7 @@ POP3 OAuth 2.0 (OAUTHBEARER) failure as continuation
<command>
pop3://%HOSTIP:%POP3PORT/889 -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
diff --git a/tests/data/test89 b/tests/data/test89
index c7f69a2b..1443a976 100644
--- a/tests/data/test89
+++ b/tests/data/test89
@@ -126,7 +126,7 @@ Accept: */*
GET /89 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
@@ -138,7 +138,7 @@ Accept: */*
GET /you/890010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBALIBPdoGahtQQ8gQ7TJrKTYzMjM0NDIzNBFnpKw8B1BLcb456sVeozgBAQAAAAAAAACAPtXesZ0BMzIzNDQyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAOv8cm3wOKJ5nhWWScOgdUI2MzIxNzMyMVgNcU0f3zxHeccvitN7zHkBAQAAAAAAAACAPtXesZ0BNjMyMTczMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test890 b/tests/data/test890
index 6392dfa0..30aa0b23 100644
--- a/tests/data/test890
+++ b/tests/data/test890
@@ -34,7 +34,7 @@ POP3 OAuth 2.0 (OAUTHBEARER) failure as continuation with initial response
<command>
pop3://%HOSTIP:%POP3PORT/890 -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
diff --git a/tests/data/test90 b/tests/data/test90
index 3b1231a3..f18e3dfa 100644
--- a/tests/data/test90
+++ b/tests/data/test90
@@ -168,7 +168,7 @@ Accept: */*
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
@@ -184,7 +184,7 @@ Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBALIBPdoGahtQQ8gQ7TJrKTYzMjM0NDIzNBFnpKw8B1BLcb456sVeozgBAQAAAAAAAACAPtXesZ0BMzIzNDQyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAOv8cm3wOKJ5nhWWScOgdUI2MzIxNzMyMVgNcU0f3zxHeccvitN7zHkBAQAAAAAAAACAPtXesZ0BNjMyMTczMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test906 b/tests/data/test906
index 3c04d15e..67745613 100644
--- a/tests/data/test906
+++ b/tests/data/test906
@@ -15,7 +15,7 @@ RFC4954
AUTH NTLM
REPLY AUTH 334 NTLM supported
REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
</servercmd>
</reply>
@@ -57,7 +57,7 @@ chkhostname curlhost
EHLO 906
AUTH NTLM
TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test907 b/tests/data/test907
index 65c87b40..c19e1e11 100644
--- a/tests/data/test907
+++ b/tests/data/test907
@@ -15,7 +15,7 @@ RFC4954
<servercmd>
AUTH DIGEST-MD5
REPLY AUTH 334 cmVhbG09ImN1cmwiLG5vbmNlPSI1MzAwZDE3YTFkNjk1YmQ0MTFlNGNkZjk2Zjk1NDhjMjNjZWQ2MTc1IixhbGdvcml0aG09bWQ1LXNlc3MscW9wPSJhdXRoIg==
-REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPWJkYmExNzYwOGY4NmMyZjEzYTczMTM1NzdkZjkyMzNkLHFvcD1hdXRo 334
+REPLY dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPTk0M2YxNjk1OWYxY2M2ZjA3ZTZmMDk0ZjVkYmQ0NzNlLHFvcD1hdXRo 334
REPLY 235 Authenticated
</servercmd>
</reply>
@@ -48,7 +48,7 @@ smtp://%HOSTIP:%SMTPPORT/907 --mail-rcpt recipient@example.com --mail-from sende
<protocol>
EHLO 907
AUTH DIGEST-MD5
-dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM0MzMzMjMyMzQzMzMyMzMzNDMzMzIzNCIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPWJkYmExNzYwOGY4NmMyZjEzYTczMTM1NzdkZjkyMzNkLHFvcD1hdXRo
+dXNlcm5hbWU9InVzZXIiLHJlYWxtPSJjdXJsIixub25jZT0iNTMwMGQxN2ExZDY5NWJkNDExZTRjZGY5NmY5NTQ4YzIzY2VkNjE3NSIsY25vbmNlPSIzNDMzMzIzMTM1MzMzMjMxMzYzMzMyMzEzNzMzMzIzMSIsbmM9IjAwMDAwMDAxIixkaWdlc3QtdXJpPSJzbXRwL2N1cmwiLHJlc3BvbnNlPTk0M2YxNjk1OWYxY2M2ZjA3ZTZmMDk0ZjVkYmQ0NzNlLHFvcD1hdXRo
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
diff --git a/tests/data/test91 b/tests/data/test91
index 35195ad3..cd281425 100644
--- a/tests/data/test91
+++ b/tests/data/test91
@@ -115,7 +115,7 @@ Accept: */*
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAgACAD2AAAABgAGAP4AAAAIAAgABAEAAAAAAAAAAAAABoKBAI9byKoy6qyyS+1JCYN1XYoxMjM0MjIzNEYCr85trkciZ2j/7/T8MmUBAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbXlkb21haW5teXNlbGZjdXJsaG9zdA==
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAgACAD2AAAABgAGAP4AAAAIAAgABAEAAAAAAAAAAAAABoKBALJ3z6fQtyQwuFxoPXldKtQ0MzIxNTMyMWnrkzKLCbw9LP1SuH/yJwABAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbXlkb21haW5teXNlbGZjdXJsaG9zdA==
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
Accept: */*
diff --git a/tests/data/test921 b/tests/data/test921
index 91a7c6f4..e11fe4fb 100644
--- a/tests/data/test921
+++ b/tests/data/test921
@@ -15,7 +15,7 @@ RFC4954
<servercmd>
AUTH NTLM
REPLY AUTH 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
</servercmd>
</reply>
@@ -56,7 +56,7 @@ chkhostname curlhost
<protocol>
EHLO 921
AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAL9LNW5+nkyHZRmyFaL/LJ4xMjM0MjIzNGUCyhgQ9hw6eWAT13EbDa0BAQAAAAAAAACAPtXesZ0BMTIzNDIyMzQAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
+TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test946 b/tests/data/test946
index d34bd914..da4b924f 100644
--- a/tests/data/test946
+++ b/tests/data/test946
@@ -35,7 +35,7 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/946 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM -T -
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
diff --git a/tests/data/test947 b/tests/data/test947
index 03648a41..d33a5593 100644
--- a/tests/data/test947
+++ b/tests/data/test947
@@ -35,7 +35,7 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/947 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir -T -
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
diff --git a/tests/data/test948 b/tests/data/test948
index 51bb41ad..9c1e31de 100644
--- a/tests/data/test948
+++ b/tests/data/test948
@@ -36,7 +36,7 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/948 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM -T -
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
diff --git a/tests/data/test949 b/tests/data/test949
index f84c42b4..9145d61e 100644
--- a/tests/data/test949
+++ b/tests/data/test949
@@ -36,7 +36,7 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/949 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir -T -
</command>
-# The protocol section doesn't support ways of specifing the raw data in the
+# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
<precheck>
perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
diff --git a/tests/extern-scan.pl b/tests/extern-scan.pl
index 7a5c2914..88594ed6 100755
--- a/tests/extern-scan.pl
+++ b/tests/extern-scan.pl
@@ -49,7 +49,9 @@ sub scanheader {
open H, "<$f" || die;
while(<H>) {
if (/^(CURL_EXTERN.*)/) {
- print "$1\n";
+ my $decl = $1;
+ $decl =~ s/\r$//;
+ print "$decl\n";
}
}
close H;
diff --git a/tests/fuzz/CMakeLists.txt b/tests/fuzz/CMakeLists.txt
new file mode 100644
index 00000000..aefedf26
--- /dev/null
+++ b/tests/fuzz/CMakeLists.txt
@@ -0,0 +1 @@
+# FIXME, probably adapt from file in ../unit
diff --git a/tests/fuzz/Makefile.am b/tests/fuzz/Makefile.am
new file mode 100644
index 00000000..0d20d792
--- /dev/null
+++ b/tests/fuzz/Makefile.am
@@ -0,0 +1,57 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 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.
+#
+###########################################################################
+AUTOMAKE_OPTIONS = foreign nostdinc
+
+# Specify our include paths here, and do it relative to $(top_srcdir) and
+# $(top_builddir), to ensure that these paths which belong to the library
+# being currently built and tested are searched before the library which
+# might possibly already be installed in the system.
+#
+# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
+# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
+# $(top_srcdir)/include is for libcurl's external include files
+# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
+# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
+
+AM_CPPFLAGS = -I$(top_builddir)/include/curl \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/lib \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/tests/fuzz
+
+EXTRA_DIST = Makefile.inc CMakeLists.txt
+
+LIBS = -lpthread -lFuzzer -lstdc++ -lm
+LDFLAGS = -L/usr/lib/llvm-5.0/lib #-L/home/daniel/src/Fuzzer/
+
+LDADD = $(top_builddir)/lib/libcurl.la \
+ @LDFLAGS@ @LIBCURL_LIBS@
+
+# Makefile.inc provides neat definitions
+include Makefile.inc
+
+checksrc:
+ @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+
+noinst_PROGRAMS = $(FUZZPROGS)
+
diff --git a/tests/fuzz/Makefile.in b/tests/fuzz/Makefile.in
new file mode 100644
index 00000000..8bce86b3
--- /dev/null
+++ b/tests/fuzz/Makefile.in
@@ -0,0 +1,880 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 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@
+noinst_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/fuzz
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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__EXEEXT_1 = http11$(EXEEXT) ftp$(EXEEXT) imap$(EXEEXT) \
+ pop3$(EXEEXT) httpupload$(EXEEXT) http2$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_ftp_OBJECTS = ftp-curl_fuzzer.$(OBJEXT)
+ftp_OBJECTS = $(am_ftp_OBJECTS)
+ftp_LDADD = $(LDADD)
+ftp_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+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_http11_OBJECTS = http11-curl_fuzzer.$(OBJEXT)
+http11_OBJECTS = $(am_http11_OBJECTS)
+http11_LDADD = $(LDADD)
+http11_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+am_http2_OBJECTS = http2-curl_fuzzer.$(OBJEXT)
+http2_OBJECTS = $(am_http2_OBJECTS)
+http2_LDADD = $(LDADD)
+http2_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+am_httpupload_OBJECTS = httpupload-curl_fuzzer.$(OBJEXT)
+httpupload_OBJECTS = $(am_httpupload_OBJECTS)
+httpupload_LDADD = $(LDADD)
+httpupload_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+am_imap_OBJECTS = imap-curl_fuzzer.$(OBJEXT)
+imap_OBJECTS = $(am_imap_OBJECTS)
+imap_LDADD = $(LDADD)
+imap_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+am_pop3_OBJECTS = pop3-curl_fuzzer.$(OBJEXT)
+pop3_OBJECTS = $(am_pop3_OBJECTS)
+pop3_LDADD = $(LDADD)
+pop3_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
+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 =
+DEFAULT_INCLUDES =
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+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 = $(ftp_SOURCES) $(http11_SOURCES) $(http2_SOURCES) \
+ $(httpupload_SOURCES) $(imap_SOURCES) $(pop3_SOURCES)
+DIST_SOURCES = $(ftp_SOURCES) $(http11_SOURCES) $(http2_SOURCES) \
+ $(httpupload_SOURCES) $(imap_SOURCES) $(pop3_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)
+# 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
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \
+ $(top_srcdir)/depcomp README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+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@
+CYGPATH_W = @CYGPATH_W@
+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_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 = -L/usr/lib/llvm-5.0/lib #-L/home/daniel/src/Fuzzer/
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
+LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
+LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = -lpthread -lFuzzer -lstdc++ -lm
+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_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_LIBSSH2 = @USE_LIBSSH2@
+USE_MBEDTLS = @USE_MBEDTLS@
+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@
+
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 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.
+#
+###########################################################################
+AUTOMAKE_OPTIONS = foreign nostdinc
+
+# Specify our include paths here, and do it relative to $(top_srcdir) and
+# $(top_builddir), to ensure that these paths which belong to the library
+# being currently built and tested are searched before the library which
+# might possibly already be installed in the system.
+#
+# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
+# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
+# $(top_srcdir)/include is for libcurl's external include files
+# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
+# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
+AM_CPPFLAGS = -I$(top_builddir)/include/curl \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/lib \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/tests/fuzz
+
+EXTRA_DIST = Makefile.inc CMakeLists.txt
+LDADD = $(top_builddir)/lib/libcurl.la \
+ @LDFLAGS@ @LIBCURL_LIBS@
+
+FUZZPROGS = http11 ftp imap pop3 httpupload http2
+http11_SOURCES = curl_fuzzer.c
+http11_CPPFLAGS = $(AM_CPPFLAGS)
+ftp_SOURCES = curl_fuzzer.c
+ftp_CPPFLAGS = -DFUZZER_FTP $(AM_CPPFLAGS)
+imap_SOURCES = curl_fuzzer.c
+imap_CPPFLAGS = -DFUZZER_IMAP $(AM_CPPFLAGS)
+pop3_SOURCES = curl_fuzzer.c
+pop3_CPPFLAGS = -DFUZZER_POP3 $(AM_CPPFLAGS)
+httpupload_SOURCES = curl_fuzzer.c
+httpupload_CPPFLAGS = -DFUZZER_HTTP_UPLOAD $(AM_CPPFLAGS)
+http2_SOURCES = curl_fuzzer.c
+http2_CPPFLAGS = -DFUZZER_HTTP2 $(AM_CPPFLAGS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(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 tests/fuzz/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/fuzz/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__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+$(srcdir)/Makefile.inc $(am__empty):
+
+$(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):
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ftp$(EXEEXT): $(ftp_OBJECTS) $(ftp_DEPENDENCIES) $(EXTRA_ftp_DEPENDENCIES)
+ @rm -f ftp$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ftp_OBJECTS) $(ftp_LDADD) $(LIBS)
+
+http11$(EXEEXT): $(http11_OBJECTS) $(http11_DEPENDENCIES) $(EXTRA_http11_DEPENDENCIES)
+ @rm -f http11$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(http11_OBJECTS) $(http11_LDADD) $(LIBS)
+
+http2$(EXEEXT): $(http2_OBJECTS) $(http2_DEPENDENCIES) $(EXTRA_http2_DEPENDENCIES)
+ @rm -f http2$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(http2_OBJECTS) $(http2_LDADD) $(LIBS)
+
+httpupload$(EXEEXT): $(httpupload_OBJECTS) $(httpupload_DEPENDENCIES) $(EXTRA_httpupload_DEPENDENCIES)
+ @rm -f httpupload$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(httpupload_OBJECTS) $(httpupload_LDADD) $(LIBS)
+
+imap$(EXEEXT): $(imap_OBJECTS) $(imap_DEPENDENCIES) $(EXTRA_imap_DEPENDENCIES)
+ @rm -f imap$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(imap_OBJECTS) $(imap_LDADD) $(LIBS)
+
+pop3$(EXEEXT): $(pop3_OBJECTS) $(pop3_DEPENDENCIES) $(EXTRA_pop3_DEPENDENCIES)
+ @rm -f pop3$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pop3_OBJECTS) $(pop3_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp-curl_fuzzer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http11-curl_fuzzer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-curl_fuzzer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpupload-curl_fuzzer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-curl_fuzzer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-curl_fuzzer.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+ftp-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ftp-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/ftp-curl_fuzzer.Tpo -c -o ftp-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ftp-curl_fuzzer.Tpo $(DEPDIR)/ftp-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='ftp-curl_fuzzer.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) $(ftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ftp-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+ftp-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ftp-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/ftp-curl_fuzzer.Tpo -c -o ftp-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ftp-curl_fuzzer.Tpo $(DEPDIR)/ftp-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='ftp-curl_fuzzer.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) $(ftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ftp-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+http11-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(http11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http11-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/http11-curl_fuzzer.Tpo -c -o http11-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/http11-curl_fuzzer.Tpo $(DEPDIR)/http11-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='http11-curl_fuzzer.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) $(http11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http11-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+http11-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(http11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http11-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/http11-curl_fuzzer.Tpo -c -o http11-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/http11-curl_fuzzer.Tpo $(DEPDIR)/http11-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='http11-curl_fuzzer.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) $(http11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http11-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+http2-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(http2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http2-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/http2-curl_fuzzer.Tpo -c -o http2-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/http2-curl_fuzzer.Tpo $(DEPDIR)/http2-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='http2-curl_fuzzer.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) $(http2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http2-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+http2-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(http2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http2-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/http2-curl_fuzzer.Tpo -c -o http2-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/http2-curl_fuzzer.Tpo $(DEPDIR)/http2-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='http2-curl_fuzzer.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) $(http2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http2-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+httpupload-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(httpupload_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpupload-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/httpupload-curl_fuzzer.Tpo -c -o httpupload-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpupload-curl_fuzzer.Tpo $(DEPDIR)/httpupload-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='httpupload-curl_fuzzer.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) $(httpupload_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpupload-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+httpupload-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(httpupload_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT httpupload-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/httpupload-curl_fuzzer.Tpo -c -o httpupload-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/httpupload-curl_fuzzer.Tpo $(DEPDIR)/httpupload-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='httpupload-curl_fuzzer.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) $(httpupload_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o httpupload-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+imap-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(imap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT imap-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/imap-curl_fuzzer.Tpo -c -o imap-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/imap-curl_fuzzer.Tpo $(DEPDIR)/imap-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='imap-curl_fuzzer.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) $(imap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o imap-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+imap-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(imap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT imap-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/imap-curl_fuzzer.Tpo -c -o imap-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/imap-curl_fuzzer.Tpo $(DEPDIR)/imap-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='imap-curl_fuzzer.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) $(imap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o imap-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+pop3-curl_fuzzer.o: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pop3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pop3-curl_fuzzer.o -MD -MP -MF $(DEPDIR)/pop3-curl_fuzzer.Tpo -c -o pop3-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pop3-curl_fuzzer.Tpo $(DEPDIR)/pop3-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='pop3-curl_fuzzer.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) $(pop3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pop3-curl_fuzzer.o `test -f 'curl_fuzzer.c' || echo '$(srcdir)/'`curl_fuzzer.c
+
+pop3-curl_fuzzer.obj: curl_fuzzer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(pop3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pop3-curl_fuzzer.obj -MD -MP -MF $(DEPDIR)/pop3-curl_fuzzer.Tpo -c -o pop3-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pop3-curl_fuzzer.Tpo $(DEPDIR)/pop3-curl_fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curl_fuzzer.c' object='pop3-curl_fuzzer.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) $(pop3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pop3-curl_fuzzer.obj `if test -f 'curl_fuzzer.c'; then $(CYGPATH_W) 'curl_fuzzer.c'; else $(CYGPATH_W) '$(srcdir)/curl_fuzzer.c'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(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-am
+
+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-am
+
+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: $(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 $(PROGRAMS)
+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 clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+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 -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ ctags-am distclean distclean-compile 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 maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Makefile.inc provides neat definitions
+
+checksrc:
+ @PERL@ $(top_srcdir)/lib/checksrc.pl $(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.
+.NOEXPORT:
diff --git a/tests/fuzz/Makefile.inc b/tests/fuzz/Makefile.inc
new file mode 100644
index 00000000..fb6cdb11
--- /dev/null
+++ b/tests/fuzz/Makefile.inc
@@ -0,0 +1,19 @@
+FUZZPROGS = http11 ftp imap pop3 httpupload http2
+
+http11_SOURCES = curl_fuzzer.c
+http11_CPPFLAGS = $(AM_CPPFLAGS)
+
+ftp_SOURCES = curl_fuzzer.c
+ftp_CPPFLAGS = -DFUZZER_FTP $(AM_CPPFLAGS)
+
+imap_SOURCES = curl_fuzzer.c
+imap_CPPFLAGS = -DFUZZER_IMAP $(AM_CPPFLAGS)
+
+pop3_SOURCES = curl_fuzzer.c
+pop3_CPPFLAGS = -DFUZZER_POP3 $(AM_CPPFLAGS)
+
+httpupload_SOURCES = curl_fuzzer.c
+httpupload_CPPFLAGS = -DFUZZER_HTTP_UPLOAD $(AM_CPPFLAGS)
+
+http2_SOURCES = curl_fuzzer.c
+http2_CPPFLAGS = -DFUZZER_HTTP2 $(AM_CPPFLAGS)
diff --git a/tests/fuzz/README b/tests/fuzz/README
new file mode 100644
index 00000000..459bda46
--- /dev/null
+++ b/tests/fuzz/README
@@ -0,0 +1,14 @@
+Fuzz tests
+==========
+
+The goal is to add tests for *ALL* protocols supported in libcurl.
+We will need some additional patches in the future, to increase coverage.
+
+Building the fuzz target
+========================
+
+CC=clang-5.0 CFLAGS="-fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp" ./configure --disable-shared --enable-debug --enable-maintainer-mode
+make -sj
+
+cd tests/fuzz
+make
diff --git a/tests/fuzz/curl_fuzzer.c b/tests/fuzz/curl_fuzzer.c
new file mode 100644
index 00000000..2ccf1b36
--- /dev/null
+++ b/tests/fuzz/curl_fuzzer.c
@@ -0,0 +1,128 @@
+/*
+# Copyright 2016 Google Inc.
+#
+# 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.
+#
+################################################################################
+*/
+
+#include <errno.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <curl/curl.h>
+
+static const void *cur_data;
+static int cur_size = -1;
+static int server_fd = -1;
+static int client_fd = -1;
+static int wrote = 0;
+
+static void fail(const char *why) {
+ perror(why);
+ exit(1);
+}
+
+static curl_socket_t open_sock(void *ctx, curlsocktype purpose,
+ struct curl_sockaddr *address) {
+ if(cur_size == -1) {
+ fail("not fuzzing");
+ }
+ if(server_fd != -1 || client_fd != -1) {
+ fail("already connected");
+ }
+ int fds[2];
+ if(socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) {
+ fail("socketpair");
+ }
+ server_fd = fds[0];
+ client_fd = fds[1];
+ if(write(server_fd, cur_data, cur_size) != cur_size) {
+ fail("write");
+ }
+ if(shutdown(server_fd, SHUT_WR)) {
+ fail("shutdown");
+ }
+ return client_fd;
+}
+
+static int set_opt(void *ctx, curl_socket_t curlfd, curlsocktype purpose) {
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+static size_t write_callback(char *ptr, size_t size, size_t n, void *ctx) {
+ return size * n;
+}
+
+static size_t read_callback(char *buf, size_t size, size_t n, void *ctx) {
+ if(wrote || size * n == 0) {
+ return 0;
+ }
+ wrote = 1;
+ buf[0] = 'a';
+ return 1;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+ cur_data = Data;
+ cur_size = Size;
+ wrote = 0;
+ CURL *curl = curl_easy_init();
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, open_sock);
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, set_opt);
+#if defined(FUZZER_FTP)
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://user@localhost/file.txt");
+#elif defined(FUZZER_IMAP)
+ curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+ curl_easy_setopt(curl, CURLOPT_URL, "imap://localhost");
+#elif defined(FUZZER_POP3)
+ curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+ curl_easy_setopt(curl, CURLOPT_URL, "pop3://localhost");
+#elif defined(FUZZER_HTTP_UPLOAD)
+ curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+#elif defined(FUZZER_HTTP2)
+ curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
+ /* use non-TLS HTTP/2 without HTTP/1.1 Upgrade: */
+ curl_easy_setopt(curl, CURLOPT_HTTP_VERSION,
+ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
+#else
+ curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+#endif
+ curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ close(server_fd);
+ close(client_fd);
+ server_fd = -1;
+ client_fd = -1;
+ cur_data = NULL;
+ cur_size = -1;
+ return 0;
+}
diff --git a/tests/http2-server.pl b/tests/http2-server.pl
index 72ed12e8..086d5aa7 100755
--- a/tests/http2-server.pl
+++ b/tests/http2-server.pl
@@ -28,6 +28,7 @@ my $pidfile = "log/nghttpx.pid";
my $logfile = "log/http2.log";
my $nghttpx = "nghttpx";
my $listenport = 9015;
+my $connect = "127.0.0.1,8990";
#***************************************************************************
# Process command line options
@@ -54,6 +55,13 @@ while(@ARGV) {
shift @ARGV;
}
}
+ elsif($ARGV[0] eq '--connect') {
+ if($ARGV[1]) {
+ $connect = $ARGV[1];
+ $connect =~ s/:/,/;
+ shift @ARGV;
+ }
+ }
elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) {
$logfile = $ARGV[1];
@@ -66,7 +74,7 @@ while(@ARGV) {
shift @ARGV;
}
-my $cmdline="$nghttpx --backend=127.0.0.1,8990 ".
+my $cmdline="$nghttpx --backend=$connect ".
"--frontend=\"*,$listenport;no-tls\" ".
"--log-level=INFO ".
"--pid-file=$pidfile ".
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 0be5667f..7f6c86a8 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -38,7 +38,7 @@ my $verbose = 0; # set to 1 for debugging
my $port = 8990; # just a default
my $unix_socket; # location to place a listening Unix socket
my $ipvnum = 4; # default IP version of http server
-my $idnum = 1; # dafault http server instance number
+my $idnum = 1; # default http server instance number
my $proto = 'http'; # protocol the http server speaks
my $pidfile; # http server pid file
my $logfile; # http server log file
diff --git a/tests/libtest/CMakeLists.txt b/tests/libtest/CMakeLists.txt
index a7449c37..4d42aa51 100644
--- a/tests/libtest/CMakeLists.txt
+++ b/tests/libtest/CMakeLists.txt
@@ -7,7 +7,8 @@ function(SETUP_TEST TEST_NAME) # ARGN are the files in the test
include_directories(
${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h"
${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
- ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h"
+ ${CURL_BINARY_DIR}/include # To be able to reach "curl/curl.h"
+ ${CURL_SOURCE_DIR}/tests/libtest # To be able to build generated tests
)
if(USE_ARES)
include_directories(${CARES_INCLUDE_DIR})
@@ -49,7 +50,15 @@ if(NOT WIN32)
endif()
endif()
-# # files used only in some libcurl test programs
+add_custom_command(
+ OUTPUT lib1521.c
+ COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/mk-lib1521.pl < ${CMAKE_SOURCE_DIR}/include/curl/curl.h > lib1521.c
+ DEPENDS
+ "${CMAKE_CURRENT_SOURCE_DIR}/mk-lib1521.pl"
+ "${CMAKE_SOURCE_DIR}/include/curl/curl.h"
+ VERBATIM)
+
+ # # files used only in some libcurl test programs
# SET(TESTUTIL testutil.c testutil.h)
# # these files are used in every single test program below
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index 826b3d4f..9128a453 100644
--- a/tests/libtest/Makefile.am
+++ b/tests/libtest/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -26,8 +26,6 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
@@ -35,23 +33,19 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# $(top_srcdir)/ares is for in-tree c-ares's external include files
if USE_EMBEDDED_ARES
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
-I$(top_builddir)/ares \
-I$(top_srcdir)/ares
else
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib
endif
EXTRA_DIST = test75.pl test307.pl test610.pl test613.pl test1013.pl \
-test1022.pl Makefile.inc notexists.pl CMakeLists.txt
+test1022.pl Makefile.inc notexists.pl CMakeLists.txt mk-lib1521.pl
CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
@@ -66,9 +60,8 @@ SUPPORTFILES_LIBS = $(top_builddir)/lib/libcurl.la @CURL_NETWORK_LIBS@ @NSS_LIBS
TESTUTIL_LIBS = $(top_builddir)/lib/libcurl.la @CURL_NETWORK_AND_TIME_LIBS@ @NSS_LIBS@
endif
-# Dependencies (may need to be overriden)
+# Dependencies (may need to be overridden)
LDADD = $(SUPPORTFILES_LIBS)
-DEPENDENCIES = $(top_builddir)/lib/libcurl.la
# Makefile.inc provides the source defines (TESTUTIL, SUPPORTFILES,
# noinst_PROGRAMS, lib*_SOURCES, and lib*_CFLAGS)
@@ -116,5 +109,11 @@ libhostname_la_SOURCES = sethostname.c sethostname.h
libhostname_la_LIBADD =
libhostname_la_DEPENDENCIES =
+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:
@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+
+dist:
+ rm lib1521.c
diff --git a/tests/libtest/Makefile.in b/tests/libtest/Makefile.in
index 4820f21a..1f3587d6 100644
--- a/tests/libtest/Makefile.in
+++ b/tests/libtest/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -107,26 +107,28 @@ noinst_PROGRAMS = chkhostname$(EXEEXT) libauthretry$(EXEEXT) \
lib548$(EXEEXT) lib549$(EXEEXT) lib552$(EXEEXT) \
lib553$(EXEEXT) lib554$(EXEEXT) lib555$(EXEEXT) \
lib556$(EXEEXT) lib557$(EXEEXT) lib558$(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) lib590$(EXEEXT) lib591$(EXEEXT) \
- lib597$(EXEEXT) lib598$(EXEEXT) lib599$(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) \
- lib1525$(EXEEXT) lib1526$(EXEEXT) lib1527$(EXEEXT) \
- lib1528$(EXEEXT) lib1529$(EXEEXT) lib1530$(EXEEXT) \
- lib1531$(EXEEXT) lib1532$(EXEEXT) lib1533$(EXEEXT) \
- lib1534$(EXEEXT) lib1535$(EXEEXT) lib1536$(EXEEXT) \
- lib1900$(EXEEXT) lib2033$(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) lib590$(EXEEXT) \
+ lib591$(EXEEXT) lib597$(EXEEXT) lib598$(EXEEXT) \
+ lib599$(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) 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) lib1900$(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
@@ -134,7 +136,8 @@ noinst_PROGRAMS = chkhostname$(EXEEXT) libauthretry$(EXEEXT) \
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_5 = $(CFLAG_CURL_SYMBOL_HIDING)
subdir = tests/libtest
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -155,8 +158,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
@@ -301,557 +303,598 @@ am_lib1520_OBJECTS = lib1520-lib1520.$(OBJEXT) $(am__objects_49)
lib1520_OBJECTS = $(am_lib1520_OBJECTS)
lib1520_LDADD = $(LDADD)
lib1520_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_50 = lib1525-first.$(OBJEXT)
-am__objects_51 = lib1525-testutil.$(OBJEXT)
-am__objects_52 = ../../lib/lib1525-warnless.$(OBJEXT)
-am_lib1525_OBJECTS = lib1525-lib1525.$(OBJEXT) $(am__objects_50) \
- $(am__objects_51) $(am__objects_52)
+am__objects_50 = lib1521-first.$(OBJEXT)
+am_lib1521_OBJECTS = lib1521-lib1521.$(OBJEXT) $(am__objects_50)
+lib1521_OBJECTS = $(am_lib1521_OBJECTS)
+lib1521_LDADD = $(LDADD)
+lib1521_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_51 = lib1525-first.$(OBJEXT)
+am__objects_52 = lib1525-testutil.$(OBJEXT)
+am__objects_53 = ../../lib/lib1525-warnless.$(OBJEXT)
+am_lib1525_OBJECTS = lib1525-lib1525.$(OBJEXT) $(am__objects_51) \
+ $(am__objects_52) $(am__objects_53)
lib1525_OBJECTS = $(am_lib1525_OBJECTS)
lib1525_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_53 = lib1526-first.$(OBJEXT)
-am__objects_54 = lib1526-testutil.$(OBJEXT)
-am__objects_55 = ../../lib/lib1526-warnless.$(OBJEXT)
-am_lib1526_OBJECTS = lib1526-lib1526.$(OBJEXT) $(am__objects_53) \
- $(am__objects_54) $(am__objects_55)
+am__objects_54 = lib1526-first.$(OBJEXT)
+am__objects_55 = lib1526-testutil.$(OBJEXT)
+am__objects_56 = ../../lib/lib1526-warnless.$(OBJEXT)
+am_lib1526_OBJECTS = lib1526-lib1526.$(OBJEXT) $(am__objects_54) \
+ $(am__objects_55) $(am__objects_56)
lib1526_OBJECTS = $(am_lib1526_OBJECTS)
lib1526_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_56 = lib1527-first.$(OBJEXT)
-am__objects_57 = lib1527-testutil.$(OBJEXT)
-am__objects_58 = ../../lib/lib1527-warnless.$(OBJEXT)
-am_lib1527_OBJECTS = lib1527-lib1527.$(OBJEXT) $(am__objects_56) \
- $(am__objects_57) $(am__objects_58)
+am__objects_57 = lib1527-first.$(OBJEXT)
+am__objects_58 = lib1527-testutil.$(OBJEXT)
+am__objects_59 = ../../lib/lib1527-warnless.$(OBJEXT)
+am_lib1527_OBJECTS = lib1527-lib1527.$(OBJEXT) $(am__objects_57) \
+ $(am__objects_58) $(am__objects_59)
lib1527_OBJECTS = $(am_lib1527_OBJECTS)
lib1527_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_59 = lib1528-first.$(OBJEXT)
-am__objects_60 = lib1528-testutil.$(OBJEXT)
-am__objects_61 = ../../lib/lib1528-warnless.$(OBJEXT)
-am_lib1528_OBJECTS = lib1528-lib1528.$(OBJEXT) $(am__objects_59) \
- $(am__objects_60) $(am__objects_61)
+am__objects_60 = lib1528-first.$(OBJEXT)
+am__objects_61 = lib1528-testutil.$(OBJEXT)
+am__objects_62 = ../../lib/lib1528-warnless.$(OBJEXT)
+am_lib1528_OBJECTS = lib1528-lib1528.$(OBJEXT) $(am__objects_60) \
+ $(am__objects_61) $(am__objects_62)
lib1528_OBJECTS = $(am_lib1528_OBJECTS)
lib1528_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_62 = lib1529-first.$(OBJEXT)
-am__objects_63 = lib1529-testutil.$(OBJEXT)
-am__objects_64 = ../../lib/lib1529-warnless.$(OBJEXT)
-am_lib1529_OBJECTS = lib1529-lib1529.$(OBJEXT) $(am__objects_62) \
- $(am__objects_63) $(am__objects_64)
+am__objects_63 = lib1529-first.$(OBJEXT)
+am__objects_64 = lib1529-testutil.$(OBJEXT)
+am__objects_65 = ../../lib/lib1529-warnless.$(OBJEXT)
+am_lib1529_OBJECTS = lib1529-lib1529.$(OBJEXT) $(am__objects_63) \
+ $(am__objects_64) $(am__objects_65)
lib1529_OBJECTS = $(am_lib1529_OBJECTS)
lib1529_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_65 = lib1530-first.$(OBJEXT)
-am__objects_66 = lib1530-testutil.$(OBJEXT)
-am__objects_67 = ../../lib/lib1530-warnless.$(OBJEXT)
-am_lib1530_OBJECTS = lib1530-lib1530.$(OBJEXT) $(am__objects_65) \
- $(am__objects_66) $(am__objects_67)
+am__objects_66 = lib1530-first.$(OBJEXT)
+am__objects_67 = lib1530-testutil.$(OBJEXT)
+am__objects_68 = ../../lib/lib1530-warnless.$(OBJEXT)
+am_lib1530_OBJECTS = lib1530-lib1530.$(OBJEXT) $(am__objects_66) \
+ $(am__objects_67) $(am__objects_68)
lib1530_OBJECTS = $(am_lib1530_OBJECTS)
lib1530_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_68 = lib1531-first.$(OBJEXT)
-am__objects_69 = lib1531-testutil.$(OBJEXT)
-am__objects_70 = ../../lib/lib1531-warnless.$(OBJEXT)
-am_lib1531_OBJECTS = lib1531-lib1531.$(OBJEXT) $(am__objects_68) \
- $(am__objects_69) $(am__objects_70)
+am__objects_69 = lib1531-first.$(OBJEXT)
+am__objects_70 = lib1531-testutil.$(OBJEXT)
+am__objects_71 = ../../lib/lib1531-warnless.$(OBJEXT)
+am_lib1531_OBJECTS = lib1531-lib1531.$(OBJEXT) $(am__objects_69) \
+ $(am__objects_70) $(am__objects_71)
lib1531_OBJECTS = $(am_lib1531_OBJECTS)
lib1531_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_71 = lib1532-first.$(OBJEXT)
-am__objects_72 = lib1532-testutil.$(OBJEXT)
-am__objects_73 = ../../lib/lib1532-warnless.$(OBJEXT)
-am_lib1532_OBJECTS = lib1532-lib1532.$(OBJEXT) $(am__objects_71) \
- $(am__objects_72) $(am__objects_73)
+am__objects_72 = lib1532-first.$(OBJEXT)
+am__objects_73 = lib1532-testutil.$(OBJEXT)
+am__objects_74 = ../../lib/lib1532-warnless.$(OBJEXT)
+am_lib1532_OBJECTS = lib1532-lib1532.$(OBJEXT) $(am__objects_72) \
+ $(am__objects_73) $(am__objects_74)
lib1532_OBJECTS = $(am_lib1532_OBJECTS)
lib1532_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_74 = lib1533-first.$(OBJEXT)
-am__objects_75 = lib1533-testutil.$(OBJEXT)
-am__objects_76 = ../../lib/lib1533-warnless.$(OBJEXT)
-am_lib1533_OBJECTS = lib1533-lib1533.$(OBJEXT) $(am__objects_74) \
- $(am__objects_75) $(am__objects_76)
+am__objects_75 = lib1533-first.$(OBJEXT)
+am__objects_76 = lib1533-testutil.$(OBJEXT)
+am__objects_77 = ../../lib/lib1533-warnless.$(OBJEXT)
+am_lib1533_OBJECTS = lib1533-lib1533.$(OBJEXT) $(am__objects_75) \
+ $(am__objects_76) $(am__objects_77)
lib1533_OBJECTS = $(am_lib1533_OBJECTS)
lib1533_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_77 = lib1534-first.$(OBJEXT)
-am__objects_78 = lib1534-testutil.$(OBJEXT)
-am__objects_79 = ../../lib/lib1534-warnless.$(OBJEXT)
-am_lib1534_OBJECTS = lib1534-lib1534.$(OBJEXT) $(am__objects_77) \
- $(am__objects_78) $(am__objects_79)
+am__objects_78 = lib1534-first.$(OBJEXT)
+am__objects_79 = lib1534-testutil.$(OBJEXT)
+am__objects_80 = ../../lib/lib1534-warnless.$(OBJEXT)
+am_lib1534_OBJECTS = lib1534-lib1534.$(OBJEXT) $(am__objects_78) \
+ $(am__objects_79) $(am__objects_80)
lib1534_OBJECTS = $(am_lib1534_OBJECTS)
lib1534_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_80 = lib1535-first.$(OBJEXT)
-am__objects_81 = lib1535-testutil.$(OBJEXT)
-am__objects_82 = ../../lib/lib1535-warnless.$(OBJEXT)
-am_lib1535_OBJECTS = lib1535-lib1535.$(OBJEXT) $(am__objects_80) \
- $(am__objects_81) $(am__objects_82)
+am__objects_81 = lib1535-first.$(OBJEXT)
+am__objects_82 = lib1535-testutil.$(OBJEXT)
+am__objects_83 = ../../lib/lib1535-warnless.$(OBJEXT)
+am_lib1535_OBJECTS = lib1535-lib1535.$(OBJEXT) $(am__objects_81) \
+ $(am__objects_82) $(am__objects_83)
lib1535_OBJECTS = $(am_lib1535_OBJECTS)
lib1535_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_83 = lib1536-first.$(OBJEXT)
-am__objects_84 = lib1536-testutil.$(OBJEXT)
-am__objects_85 = ../../lib/lib1536-warnless.$(OBJEXT)
-am_lib1536_OBJECTS = lib1536-lib1536.$(OBJEXT) $(am__objects_83) \
- $(am__objects_84) $(am__objects_85)
+am__objects_84 = lib1536-first.$(OBJEXT)
+am__objects_85 = lib1536-testutil.$(OBJEXT)
+am__objects_86 = ../../lib/lib1536-warnless.$(OBJEXT)
+am_lib1536_OBJECTS = lib1536-lib1536.$(OBJEXT) $(am__objects_84) \
+ $(am__objects_85) $(am__objects_86)
lib1536_OBJECTS = $(am_lib1536_OBJECTS)
lib1536_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_86 = lib1900-first.$(OBJEXT)
-am__objects_87 = lib1900-testutil.$(OBJEXT)
-am__objects_88 = ../../lib/lib1900-warnless.$(OBJEXT)
-am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_86) \
- $(am__objects_87) $(am__objects_88)
+am__objects_87 = lib1537-first.$(OBJEXT)
+am__objects_88 = lib1537-testutil.$(OBJEXT)
+am__objects_89 = ../../lib/lib1537-warnless.$(OBJEXT)
+am_lib1537_OBJECTS = lib1537-lib1537.$(OBJEXT) $(am__objects_87) \
+ $(am__objects_88) $(am__objects_89)
+lib1537_OBJECTS = $(am_lib1537_OBJECTS)
+lib1537_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_90 = lib1538-first.$(OBJEXT)
+am__objects_91 = lib1538-testutil.$(OBJEXT)
+am__objects_92 = ../../lib/lib1538-warnless.$(OBJEXT)
+am_lib1538_OBJECTS = lib1538-lib1538.$(OBJEXT) $(am__objects_90) \
+ $(am__objects_91) $(am__objects_92)
+lib1538_OBJECTS = $(am_lib1538_OBJECTS)
+lib1538_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_93 = lib1540-first.$(OBJEXT)
+am__objects_94 = lib1540-testutil.$(OBJEXT)
+am__objects_95 = ../../lib/lib1540-warnless.$(OBJEXT)
+am_lib1540_OBJECTS = lib1540-lib1540.$(OBJEXT) $(am__objects_93) \
+ $(am__objects_94) $(am__objects_95)
+lib1540_OBJECTS = $(am_lib1540_OBJECTS)
+lib1540_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_96 = lib1550-first.$(OBJEXT)
+am_lib1550_OBJECTS = lib1550-lib1550.$(OBJEXT) $(am__objects_96)
+lib1550_OBJECTS = $(am_lib1550_OBJECTS)
+lib1550_LDADD = $(LDADD)
+lib1550_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_97 = lib1551-first.$(OBJEXT)
+am_lib1551_OBJECTS = lib1551-lib1551.$(OBJEXT) $(am__objects_97)
+lib1551_OBJECTS = $(am_lib1551_OBJECTS)
+lib1551_LDADD = $(LDADD)
+lib1551_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_98 = lib1900-first.$(OBJEXT)
+am__objects_99 = lib1900-testutil.$(OBJEXT)
+am__objects_100 = ../../lib/lib1900-warnless.$(OBJEXT)
+am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_98) \
+ $(am__objects_99) $(am__objects_100)
lib1900_OBJECTS = $(am_lib1900_OBJECTS)
lib1900_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_89 = lib2033-first.$(OBJEXT)
-am__objects_90 = lib2033-testutil.$(OBJEXT)
-am__objects_91 = ../../lib/lib2033-warnless.$(OBJEXT)
+am__objects_101 = lib2033-first.$(OBJEXT)
+am__objects_102 = lib2033-testutil.$(OBJEXT)
+am__objects_103 = ../../lib/lib2033-warnless.$(OBJEXT)
am_lib2033_OBJECTS = lib2033-libntlmconnect.$(OBJEXT) \
- $(am__objects_89) $(am__objects_90) $(am__objects_91)
+ $(am__objects_101) $(am__objects_102) $(am__objects_103)
lib2033_OBJECTS = $(am_lib2033_OBJECTS)
lib2033_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_92 = lib500-first.$(OBJEXT)
-am__objects_93 = lib500-testutil.$(OBJEXT)
-am__objects_94 = lib500-testtrace.$(OBJEXT)
-am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_92) \
- $(am__objects_93) $(am__objects_94)
+am__objects_104 = lib500-first.$(OBJEXT)
+am__objects_105 = lib500-testutil.$(OBJEXT)
+am__objects_106 = lib500-testtrace.$(OBJEXT)
+am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_104) \
+ $(am__objects_105) $(am__objects_106)
lib500_OBJECTS = $(am_lib500_OBJECTS)
lib500_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_95 = lib501-first.$(OBJEXT)
-am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_95)
+am__objects_107 = lib501-first.$(OBJEXT)
+am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_107)
lib501_OBJECTS = $(am_lib501_OBJECTS)
lib501_LDADD = $(LDADD)
lib501_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_96 = lib502-first.$(OBJEXT)
-am__objects_97 = lib502-testutil.$(OBJEXT)
-am__objects_98 = ../../lib/lib502-warnless.$(OBJEXT)
-am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_96) \
- $(am__objects_97) $(am__objects_98)
+am__objects_108 = lib502-first.$(OBJEXT)
+am__objects_109 = lib502-testutil.$(OBJEXT)
+am__objects_110 = ../../lib/lib502-warnless.$(OBJEXT)
+am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_108) \
+ $(am__objects_109) $(am__objects_110)
lib502_OBJECTS = $(am_lib502_OBJECTS)
lib502_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_99 = lib503-first.$(OBJEXT)
-am__objects_100 = lib503-testutil.$(OBJEXT)
-am__objects_101 = ../../lib/lib503-warnless.$(OBJEXT)
-am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_99) \
- $(am__objects_100) $(am__objects_101)
+am__objects_111 = lib503-first.$(OBJEXT)
+am__objects_112 = lib503-testutil.$(OBJEXT)
+am__objects_113 = ../../lib/lib503-warnless.$(OBJEXT)
+am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_111) \
+ $(am__objects_112) $(am__objects_113)
lib503_OBJECTS = $(am_lib503_OBJECTS)
lib503_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_102 = lib504-first.$(OBJEXT)
-am__objects_103 = lib504-testutil.$(OBJEXT)
-am__objects_104 = ../../lib/lib504-warnless.$(OBJEXT)
-am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_102) \
- $(am__objects_103) $(am__objects_104)
+am__objects_114 = lib504-first.$(OBJEXT)
+am__objects_115 = lib504-testutil.$(OBJEXT)
+am__objects_116 = ../../lib/lib504-warnless.$(OBJEXT)
+am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_114) \
+ $(am__objects_115) $(am__objects_116)
lib504_OBJECTS = $(am_lib504_OBJECTS)
lib504_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_105 = lib505-first.$(OBJEXT)
-am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_105)
+am__objects_117 = lib505-first.$(OBJEXT)
+am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_117)
lib505_OBJECTS = $(am_lib505_OBJECTS)
lib505_LDADD = $(LDADD)
lib505_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_106 = lib506-first.$(OBJEXT)
-am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_106)
+am__objects_118 = lib506-first.$(OBJEXT)
+am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_118)
lib506_OBJECTS = $(am_lib506_OBJECTS)
lib506_LDADD = $(LDADD)
lib506_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_107 = lib507-first.$(OBJEXT)
-am__objects_108 = lib507-testutil.$(OBJEXT)
-am__objects_109 = ../../lib/lib507-warnless.$(OBJEXT)
-am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_107) \
- $(am__objects_108) $(am__objects_109)
+am__objects_119 = lib507-first.$(OBJEXT)
+am__objects_120 = lib507-testutil.$(OBJEXT)
+am__objects_121 = ../../lib/lib507-warnless.$(OBJEXT)
+am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_119) \
+ $(am__objects_120) $(am__objects_121)
lib507_OBJECTS = $(am_lib507_OBJECTS)
lib507_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_110 = lib508-first.$(OBJEXT)
-am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_110)
+am__objects_122 = lib508-first.$(OBJEXT)
+am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_122)
lib508_OBJECTS = $(am_lib508_OBJECTS)
lib508_LDADD = $(LDADD)
lib508_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_111 = lib509-first.$(OBJEXT)
-am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_111)
+am__objects_123 = lib509-first.$(OBJEXT)
+am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_123)
lib509_OBJECTS = $(am_lib509_OBJECTS)
lib509_LDADD = $(LDADD)
lib509_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_112 = lib510-first.$(OBJEXT)
-am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_112)
+am__objects_124 = lib510-first.$(OBJEXT)
+am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_124)
lib510_OBJECTS = $(am_lib510_OBJECTS)
lib510_LDADD = $(LDADD)
lib510_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_113 = lib511-first.$(OBJEXT)
-am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_113)
+am__objects_125 = lib511-first.$(OBJEXT)
+am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_125)
lib511_OBJECTS = $(am_lib511_OBJECTS)
lib511_LDADD = $(LDADD)
lib511_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_114 = lib512-first.$(OBJEXT)
-am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_114)
+am__objects_126 = lib512-first.$(OBJEXT)
+am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_126)
lib512_OBJECTS = $(am_lib512_OBJECTS)
lib512_LDADD = $(LDADD)
lib512_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_115 = lib513-first.$(OBJEXT)
-am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_115)
+am__objects_127 = lib513-first.$(OBJEXT)
+am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_127)
lib513_OBJECTS = $(am_lib513_OBJECTS)
lib513_LDADD = $(LDADD)
lib513_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_116 = lib514-first.$(OBJEXT)
-am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_116)
+am__objects_128 = lib514-first.$(OBJEXT)
+am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_128)
lib514_OBJECTS = $(am_lib514_OBJECTS)
lib514_LDADD = $(LDADD)
lib514_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_117 = lib515-first.$(OBJEXT)
-am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_117)
+am__objects_129 = lib515-first.$(OBJEXT)
+am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_129)
lib515_OBJECTS = $(am_lib515_OBJECTS)
lib515_LDADD = $(LDADD)
lib515_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_118 = lib516-first.$(OBJEXT)
-am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_118)
+am__objects_130 = lib516-first.$(OBJEXT)
+am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_130)
lib516_OBJECTS = $(am_lib516_OBJECTS)
lib516_LDADD = $(LDADD)
lib516_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_119 = lib517-first.$(OBJEXT)
-am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_119)
+am__objects_131 = lib517-first.$(OBJEXT)
+am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_131)
lib517_OBJECTS = $(am_lib517_OBJECTS)
lib517_LDADD = $(LDADD)
lib517_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_120 = lib518-first.$(OBJEXT)
-am__objects_121 = ../../lib/lib518-warnless.$(OBJEXT)
-am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_120) \
- $(am__objects_121)
+am__objects_132 = lib518-first.$(OBJEXT)
+am__objects_133 = ../../lib/lib518-warnless.$(OBJEXT)
+am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_132) \
+ $(am__objects_133)
lib518_OBJECTS = $(am_lib518_OBJECTS)
lib518_LDADD = $(LDADD)
lib518_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_122 = lib519-first.$(OBJEXT)
-am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_122)
+am__objects_134 = lib519-first.$(OBJEXT)
+am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_134)
lib519_OBJECTS = $(am_lib519_OBJECTS)
lib519_LDADD = $(LDADD)
lib519_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_123 = lib520-first.$(OBJEXT)
-am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_123)
+am__objects_135 = lib520-first.$(OBJEXT)
+am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_135)
lib520_OBJECTS = $(am_lib520_OBJECTS)
lib520_LDADD = $(LDADD)
lib520_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_124 = lib521-first.$(OBJEXT)
-am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_124)
+am__objects_136 = lib521-first.$(OBJEXT)
+am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_136)
lib521_OBJECTS = $(am_lib521_OBJECTS)
lib521_LDADD = $(LDADD)
lib521_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_125 = lib523-first.$(OBJEXT)
-am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_125)
+am__objects_137 = lib523-first.$(OBJEXT)
+am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_137)
lib523_OBJECTS = $(am_lib523_OBJECTS)
lib523_LDADD = $(LDADD)
lib523_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_126 = lib524-first.$(OBJEXT)
-am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_126)
+am__objects_138 = lib524-first.$(OBJEXT)
+am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_138)
lib524_OBJECTS = $(am_lib524_OBJECTS)
lib524_LDADD = $(LDADD)
lib524_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_127 = lib525-first.$(OBJEXT)
-am__objects_128 = lib525-testutil.$(OBJEXT)
-am__objects_129 = ../../lib/lib525-warnless.$(OBJEXT)
-am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_127) \
- $(am__objects_128) $(am__objects_129)
+am__objects_139 = lib525-first.$(OBJEXT)
+am__objects_140 = lib525-testutil.$(OBJEXT)
+am__objects_141 = ../../lib/lib525-warnless.$(OBJEXT)
+am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_139) \
+ $(am__objects_140) $(am__objects_141)
lib525_OBJECTS = $(am_lib525_OBJECTS)
lib525_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_130 = lib526-first.$(OBJEXT)
-am__objects_131 = lib526-testutil.$(OBJEXT)
-am__objects_132 = ../../lib/lib526-warnless.$(OBJEXT)
-am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_130) \
- $(am__objects_131) $(am__objects_132)
+am__objects_142 = lib526-first.$(OBJEXT)
+am__objects_143 = lib526-testutil.$(OBJEXT)
+am__objects_144 = ../../lib/lib526-warnless.$(OBJEXT)
+am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_142) \
+ $(am__objects_143) $(am__objects_144)
lib526_OBJECTS = $(am_lib526_OBJECTS)
lib526_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_133 = lib527-first.$(OBJEXT)
-am__objects_134 = lib527-testutil.$(OBJEXT)
-am__objects_135 = ../../lib/lib527-warnless.$(OBJEXT)
-am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_133) \
- $(am__objects_134) $(am__objects_135)
+am__objects_145 = lib527-first.$(OBJEXT)
+am__objects_146 = lib527-testutil.$(OBJEXT)
+am__objects_147 = ../../lib/lib527-warnless.$(OBJEXT)
+am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_145) \
+ $(am__objects_146) $(am__objects_147)
lib527_OBJECTS = $(am_lib527_OBJECTS)
lib527_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_136 = lib529-first.$(OBJEXT)
-am__objects_137 = lib529-testutil.$(OBJEXT)
-am__objects_138 = ../../lib/lib529-warnless.$(OBJEXT)
-am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_136) \
- $(am__objects_137) $(am__objects_138)
+am__objects_148 = lib529-first.$(OBJEXT)
+am__objects_149 = lib529-testutil.$(OBJEXT)
+am__objects_150 = ../../lib/lib529-warnless.$(OBJEXT)
+am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_148) \
+ $(am__objects_149) $(am__objects_150)
lib529_OBJECTS = $(am_lib529_OBJECTS)
lib529_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_139 = lib530-first.$(OBJEXT)
-am__objects_140 = lib530-testutil.$(OBJEXT)
-am__objects_141 = ../../lib/lib530-warnless.$(OBJEXT)
-am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_139) \
- $(am__objects_140) $(am__objects_141)
+am__objects_151 = lib530-first.$(OBJEXT)
+am__objects_152 = lib530-testutil.$(OBJEXT)
+am__objects_153 = ../../lib/lib530-warnless.$(OBJEXT)
+am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_151) \
+ $(am__objects_152) $(am__objects_153)
lib530_OBJECTS = $(am_lib530_OBJECTS)
lib530_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_142 = lib532-first.$(OBJEXT)
-am__objects_143 = lib532-testutil.$(OBJEXT)
-am__objects_144 = ../../lib/lib532-warnless.$(OBJEXT)
-am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_142) \
- $(am__objects_143) $(am__objects_144)
+am__objects_154 = lib532-first.$(OBJEXT)
+am__objects_155 = lib532-testutil.$(OBJEXT)
+am__objects_156 = ../../lib/lib532-warnless.$(OBJEXT)
+am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_154) \
+ $(am__objects_155) $(am__objects_156)
lib532_OBJECTS = $(am_lib532_OBJECTS)
lib532_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_145 = lib533-first.$(OBJEXT)
-am__objects_146 = lib533-testutil.$(OBJEXT)
-am__objects_147 = ../../lib/lib533-warnless.$(OBJEXT)
-am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_145) \
- $(am__objects_146) $(am__objects_147)
+am__objects_157 = lib533-first.$(OBJEXT)
+am__objects_158 = lib533-testutil.$(OBJEXT)
+am__objects_159 = ../../lib/lib533-warnless.$(OBJEXT)
+am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_157) \
+ $(am__objects_158) $(am__objects_159)
lib533_OBJECTS = $(am_lib533_OBJECTS)
lib533_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_148 = lib536-first.$(OBJEXT)
-am__objects_149 = lib536-testutil.$(OBJEXT)
-am__objects_150 = ../../lib/lib536-warnless.$(OBJEXT)
-am_lib536_OBJECTS = lib536-lib536.$(OBJEXT) $(am__objects_148) \
- $(am__objects_149) $(am__objects_150)
+am__objects_160 = lib536-first.$(OBJEXT)
+am__objects_161 = lib536-testutil.$(OBJEXT)
+am__objects_162 = ../../lib/lib536-warnless.$(OBJEXT)
+am_lib536_OBJECTS = lib536-lib536.$(OBJEXT) $(am__objects_160) \
+ $(am__objects_161) $(am__objects_162)
lib536_OBJECTS = $(am_lib536_OBJECTS)
lib536_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_151 = lib537-first.$(OBJEXT)
-am__objects_152 = ../../lib/lib537-warnless.$(OBJEXT)
-am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_151) \
- $(am__objects_152)
+am__objects_163 = lib537-first.$(OBJEXT)
+am__objects_164 = ../../lib/lib537-warnless.$(OBJEXT)
+am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_163) \
+ $(am__objects_164)
lib537_OBJECTS = $(am_lib537_OBJECTS)
lib537_LDADD = $(LDADD)
lib537_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_153 = lib539-first.$(OBJEXT)
-am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_153)
+am__objects_165 = lib539-first.$(OBJEXT)
+am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_165)
lib539_OBJECTS = $(am_lib539_OBJECTS)
lib539_LDADD = $(LDADD)
lib539_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_154 = lib540-first.$(OBJEXT)
-am__objects_155 = lib540-testutil.$(OBJEXT)
-am__objects_156 = ../../lib/lib540-warnless.$(OBJEXT)
-am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_154) \
- $(am__objects_155) $(am__objects_156)
+am__objects_166 = lib540-first.$(OBJEXT)
+am__objects_167 = lib540-testutil.$(OBJEXT)
+am__objects_168 = ../../lib/lib540-warnless.$(OBJEXT)
+am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_166) \
+ $(am__objects_167) $(am__objects_168)
lib540_OBJECTS = $(am_lib540_OBJECTS)
lib540_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_157 = lib541-first.$(OBJEXT)
-am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_157)
+am__objects_169 = lib541-first.$(OBJEXT)
+am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_169)
lib541_OBJECTS = $(am_lib541_OBJECTS)
lib541_LDADD = $(LDADD)
lib541_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_158 = lib542-first.$(OBJEXT)
-am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_158)
+am__objects_170 = lib542-first.$(OBJEXT)
+am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_170)
lib542_OBJECTS = $(am_lib542_OBJECTS)
lib542_LDADD = $(LDADD)
lib542_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_159 = lib543-first.$(OBJEXT)
-am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_159)
+am__objects_171 = lib543-first.$(OBJEXT)
+am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_171)
lib543_OBJECTS = $(am_lib543_OBJECTS)
lib543_LDADD = $(LDADD)
lib543_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_160 = lib544-first.$(OBJEXT)
-am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_160)
+am__objects_172 = lib544-first.$(OBJEXT)
+am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_172)
lib544_OBJECTS = $(am_lib544_OBJECTS)
lib544_LDADD = $(LDADD)
lib544_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_161 = lib545-first.$(OBJEXT)
-am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_161)
+am__objects_173 = lib545-first.$(OBJEXT)
+am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_173)
lib545_OBJECTS = $(am_lib545_OBJECTS)
lib545_LDADD = $(LDADD)
lib545_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_162 = lib547-first.$(OBJEXT)
-am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_162)
+am__objects_174 = lib547-first.$(OBJEXT)
+am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_174)
lib547_OBJECTS = $(am_lib547_OBJECTS)
lib547_LDADD = $(LDADD)
lib547_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_163 = lib548-first.$(OBJEXT)
-am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_163)
+am__objects_175 = lib548-first.$(OBJEXT)
+am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_175)
lib548_OBJECTS = $(am_lib548_OBJECTS)
lib548_LDADD = $(LDADD)
lib548_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_164 = lib549-first.$(OBJEXT)
-am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_164)
+am__objects_176 = lib549-first.$(OBJEXT)
+am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_176)
lib549_OBJECTS = $(am_lib549_OBJECTS)
lib549_LDADD = $(LDADD)
lib549_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_165 = lib552-first.$(OBJEXT)
-am__objects_166 = ../../lib/lib552-warnless.$(OBJEXT)
-am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_165) \
- $(am__objects_166)
+am__objects_177 = lib552-first.$(OBJEXT)
+am__objects_178 = ../../lib/lib552-warnless.$(OBJEXT)
+am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_177) \
+ $(am__objects_178)
lib552_OBJECTS = $(am_lib552_OBJECTS)
lib552_LDADD = $(LDADD)
lib552_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_167 = lib553-first.$(OBJEXT)
-am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_167)
+am__objects_179 = lib553-first.$(OBJEXT)
+am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_179)
lib553_OBJECTS = $(am_lib553_OBJECTS)
lib553_LDADD = $(LDADD)
lib553_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_168 = lib554-first.$(OBJEXT)
-am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_168)
+am__objects_180 = lib554-first.$(OBJEXT)
+am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_180)
lib554_OBJECTS = $(am_lib554_OBJECTS)
lib554_LDADD = $(LDADD)
lib554_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_169 = lib555-first.$(OBJEXT)
-am__objects_170 = lib555-testutil.$(OBJEXT)
-am__objects_171 = ../../lib/lib555-warnless.$(OBJEXT)
-am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_169) \
- $(am__objects_170) $(am__objects_171)
+am__objects_181 = lib555-first.$(OBJEXT)
+am__objects_182 = lib555-testutil.$(OBJEXT)
+am__objects_183 = ../../lib/lib555-warnless.$(OBJEXT)
+am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_181) \
+ $(am__objects_182) $(am__objects_183)
lib555_OBJECTS = $(am_lib555_OBJECTS)
lib555_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_172 = lib556-first.$(OBJEXT)
-am__objects_173 = ../../lib/lib556-warnless.$(OBJEXT)
-am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_172) \
- $(am__objects_173)
+am__objects_184 = lib556-first.$(OBJEXT)
+am__objects_185 = ../../lib/lib556-warnless.$(OBJEXT)
+am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_184) \
+ $(am__objects_185)
lib556_OBJECTS = $(am_lib556_OBJECTS)
lib556_LDADD = $(LDADD)
lib556_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_174 = lib557-first.$(OBJEXT)
-am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_174)
+am__objects_186 = lib557-first.$(OBJEXT)
+am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_186)
lib557_OBJECTS = $(am_lib557_OBJECTS)
lib557_LDADD = $(LDADD)
lib557_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_175 = lib558-first.$(OBJEXT)
-am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_175)
+am__objects_187 = lib558-first.$(OBJEXT)
+am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_187)
lib558_OBJECTS = $(am_lib558_OBJECTS)
lib558_LDADD = $(LDADD)
lib558_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_176 = lib560-first.$(OBJEXT)
-am__objects_177 = lib560-testutil.$(OBJEXT)
-am__objects_178 = ../../lib/lib560-warnless.$(OBJEXT)
-am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_176) \
- $(am__objects_177) $(am__objects_178)
+am__objects_188 = lib559-first.$(OBJEXT)
+am_lib559_OBJECTS = lib559-lib559.$(OBJEXT) $(am__objects_188)
+lib559_OBJECTS = $(am_lib559_OBJECTS)
+lib559_LDADD = $(LDADD)
+lib559_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_189 = lib560-first.$(OBJEXT)
+am__objects_190 = lib560-testutil.$(OBJEXT)
+am__objects_191 = ../../lib/lib560-warnless.$(OBJEXT)
+am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_189) \
+ $(am__objects_190) $(am__objects_191)
lib560_OBJECTS = $(am_lib560_OBJECTS)
lib560_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_179 = lib562-first.$(OBJEXT)
-am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_179)
+am__objects_192 = lib562-first.$(OBJEXT)
+am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_192)
lib562_OBJECTS = $(am_lib562_OBJECTS)
lib562_LDADD = $(LDADD)
lib562_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_180 = lib564-first.$(OBJEXT)
-am__objects_181 = lib564-testutil.$(OBJEXT)
-am__objects_182 = ../../lib/lib564-warnless.$(OBJEXT)
-am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_180) \
- $(am__objects_181) $(am__objects_182)
+am__objects_193 = lib564-first.$(OBJEXT)
+am__objects_194 = lib564-testutil.$(OBJEXT)
+am__objects_195 = ../../lib/lib564-warnless.$(OBJEXT)
+am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_193) \
+ $(am__objects_194) $(am__objects_195)
lib564_OBJECTS = $(am_lib564_OBJECTS)
lib564_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_183 = lib565-first.$(OBJEXT)
-am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_183)
+am__objects_196 = lib565-first.$(OBJEXT)
+am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_196)
lib565_OBJECTS = $(am_lib565_OBJECTS)
lib565_LDADD = $(LDADD)
lib565_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_184 = lib566-first.$(OBJEXT)
-am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_184)
+am__objects_197 = lib566-first.$(OBJEXT)
+am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_197)
lib566_OBJECTS = $(am_lib566_OBJECTS)
lib566_LDADD = $(LDADD)
lib566_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_185 = lib567-first.$(OBJEXT)
-am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_185)
+am__objects_198 = lib567-first.$(OBJEXT)
+am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_198)
lib567_OBJECTS = $(am_lib567_OBJECTS)
lib567_LDADD = $(LDADD)
lib567_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_186 = lib568-first.$(OBJEXT)
-am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_186)
+am__objects_199 = lib568-first.$(OBJEXT)
+am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_199)
lib568_OBJECTS = $(am_lib568_OBJECTS)
lib568_LDADD = $(LDADD)
lib568_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_187 = lib569-first.$(OBJEXT)
-am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_187)
+am__objects_200 = lib569-first.$(OBJEXT)
+am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_200)
lib569_OBJECTS = $(am_lib569_OBJECTS)
lib569_LDADD = $(LDADD)
lib569_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_188 = lib570-first.$(OBJEXT)
-am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_188)
+am__objects_201 = lib570-first.$(OBJEXT)
+am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_201)
lib570_OBJECTS = $(am_lib570_OBJECTS)
lib570_LDADD = $(LDADD)
lib570_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_189 = lib571-first.$(OBJEXT)
-am__objects_190 = ../../lib/lib571-warnless.$(OBJEXT)
-am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_189) \
- $(am__objects_190)
+am__objects_202 = lib571-first.$(OBJEXT)
+am__objects_203 = ../../lib/lib571-warnless.$(OBJEXT)
+am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_202) \
+ $(am__objects_203)
lib571_OBJECTS = $(am_lib571_OBJECTS)
lib571_LDADD = $(LDADD)
lib571_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_191 = lib572-first.$(OBJEXT)
-am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_191)
+am__objects_204 = lib572-first.$(OBJEXT)
+am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_204)
lib572_OBJECTS = $(am_lib572_OBJECTS)
lib572_LDADD = $(LDADD)
lib572_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_192 = lib573-first.$(OBJEXT)
-am__objects_193 = lib573-testutil.$(OBJEXT)
-am__objects_194 = ../../lib/lib573-warnless.$(OBJEXT)
-am__objects_195 = lib573-testtrace.$(OBJEXT)
-am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_192) \
- $(am__objects_193) $(am__objects_194) $(am__objects_195)
+am__objects_205 = lib573-first.$(OBJEXT)
+am__objects_206 = lib573-testutil.$(OBJEXT)
+am__objects_207 = ../../lib/lib573-warnless.$(OBJEXT)
+am__objects_208 = lib573-testtrace.$(OBJEXT)
+am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_205) \
+ $(am__objects_206) $(am__objects_207) $(am__objects_208)
lib573_OBJECTS = $(am_lib573_OBJECTS)
lib573_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_196 = lib574-first.$(OBJEXT)
-am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_196)
+am__objects_209 = lib574-first.$(OBJEXT)
+am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_209)
lib574_OBJECTS = $(am_lib574_OBJECTS)
lib574_LDADD = $(LDADD)
lib574_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_197 = lib575-first.$(OBJEXT)
-am__objects_198 = lib575-testutil.$(OBJEXT)
-am__objects_199 = ../../lib/lib575-warnless.$(OBJEXT)
-am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_197) \
- $(am__objects_198) $(am__objects_199)
+am__objects_210 = lib575-first.$(OBJEXT)
+am__objects_211 = lib575-testutil.$(OBJEXT)
+am__objects_212 = ../../lib/lib575-warnless.$(OBJEXT)
+am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_210) \
+ $(am__objects_211) $(am__objects_212)
lib575_OBJECTS = $(am_lib575_OBJECTS)
lib575_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_200 = lib576-first.$(OBJEXT)
-am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_200)
+am__objects_213 = lib576-first.$(OBJEXT)
+am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_213)
lib576_OBJECTS = $(am_lib576_OBJECTS)
lib576_LDADD = $(LDADD)
lib576_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_201 = lib578-first.$(OBJEXT)
-am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_201)
+am__objects_214 = lib578-first.$(OBJEXT)
+am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_214)
lib578_OBJECTS = $(am_lib578_OBJECTS)
lib578_LDADD = $(LDADD)
lib578_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_202 = lib579-first.$(OBJEXT)
-am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_202)
+am__objects_215 = lib579-first.$(OBJEXT)
+am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_215)
lib579_OBJECTS = $(am_lib579_OBJECTS)
lib579_LDADD = $(LDADD)
lib579_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_203 = lib582-first.$(OBJEXT)
-am__objects_204 = lib582-testutil.$(OBJEXT)
-am__objects_205 = ../../lib/lib582-warnless.$(OBJEXT)
-am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_203) \
- $(am__objects_204) $(am__objects_205)
+am__objects_216 = lib582-first.$(OBJEXT)
+am__objects_217 = lib582-testutil.$(OBJEXT)
+am__objects_218 = ../../lib/lib582-warnless.$(OBJEXT)
+am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_216) \
+ $(am__objects_217) $(am__objects_218)
lib582_OBJECTS = $(am_lib582_OBJECTS)
lib582_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_206 = lib583-first.$(OBJEXT)
-am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_206)
+am__objects_219 = lib583-first.$(OBJEXT)
+am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_219)
lib583_OBJECTS = $(am_lib583_OBJECTS)
lib583_LDADD = $(LDADD)
lib583_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_207 = lib585-first.$(OBJEXT)
-am__objects_208 = lib585-testutil.$(OBJEXT)
-am__objects_209 = lib585-testtrace.$(OBJEXT)
-am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_207) \
- $(am__objects_208) $(am__objects_209)
+am__objects_220 = lib585-first.$(OBJEXT)
+am__objects_221 = lib585-testutil.$(OBJEXT)
+am__objects_222 = lib585-testtrace.$(OBJEXT)
+am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_220) \
+ $(am__objects_221) $(am__objects_222)
lib585_OBJECTS = $(am_lib585_OBJECTS)
lib585_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_210 = lib586-first.$(OBJEXT)
-am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_210)
+am__objects_223 = lib586-first.$(OBJEXT)
+am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_223)
lib586_OBJECTS = $(am_lib586_OBJECTS)
lib586_LDADD = $(LDADD)
lib586_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_211 = lib587-first.$(OBJEXT)
-am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_211)
+am__objects_224 = lib587-first.$(OBJEXT)
+am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_224)
lib587_OBJECTS = $(am_lib587_OBJECTS)
lib587_LDADD = $(LDADD)
lib587_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_212 = lib590-first.$(OBJEXT)
-am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_212)
+am__objects_225 = lib590-first.$(OBJEXT)
+am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_225)
lib590_OBJECTS = $(am_lib590_OBJECTS)
lib590_LDADD = $(LDADD)
lib590_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_213 = lib591-first.$(OBJEXT)
-am__objects_214 = lib591-testutil.$(OBJEXT)
-am__objects_215 = ../../lib/lib591-warnless.$(OBJEXT)
-am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_213) \
- $(am__objects_214) $(am__objects_215)
+am__objects_226 = lib591-first.$(OBJEXT)
+am__objects_227 = lib591-testutil.$(OBJEXT)
+am__objects_228 = ../../lib/lib591-warnless.$(OBJEXT)
+am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_226) \
+ $(am__objects_227) $(am__objects_228)
lib591_OBJECTS = $(am_lib591_OBJECTS)
lib591_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_216 = lib597-first.$(OBJEXT)
-am__objects_217 = lib597-testutil.$(OBJEXT)
-am__objects_218 = ../../lib/lib597-warnless.$(OBJEXT)
-am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_216) \
- $(am__objects_217) $(am__objects_218)
+am__objects_229 = lib597-first.$(OBJEXT)
+am__objects_230 = lib597-testutil.$(OBJEXT)
+am__objects_231 = ../../lib/lib597-warnless.$(OBJEXT)
+am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_229) \
+ $(am__objects_230) $(am__objects_231)
lib597_OBJECTS = $(am_lib597_OBJECTS)
lib597_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_219 = lib598-first.$(OBJEXT)
-am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_219)
+am__objects_232 = lib598-first.$(OBJEXT)
+am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_232)
lib598_OBJECTS = $(am_lib598_OBJECTS)
lib598_LDADD = $(LDADD)
lib598_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_220 = lib599-first.$(OBJEXT)
-am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_220)
+am__objects_233 = lib599-first.$(OBJEXT)
+am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_233)
lib599_OBJECTS = $(am_lib599_OBJECTS)
lib599_LDADD = $(LDADD)
lib599_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_221 = libauthretry-first.$(OBJEXT)
+am__objects_234 = libauthretry-first.$(OBJEXT)
am_libauthretry_OBJECTS = libauthretry-libauthretry.$(OBJEXT) \
- $(am__objects_221)
+ $(am__objects_234)
libauthretry_OBJECTS = $(am_libauthretry_OBJECTS)
libauthretry_LDADD = $(LDADD)
libauthretry_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_222 = libntlmconnect-first.$(OBJEXT)
-am__objects_223 = libntlmconnect-testutil.$(OBJEXT)
-am__objects_224 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
+am__objects_235 = libntlmconnect-first.$(OBJEXT)
+am__objects_236 = libntlmconnect-testutil.$(OBJEXT)
+am__objects_237 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
am_libntlmconnect_OBJECTS = libntlmconnect-libntlmconnect.$(OBJEXT) \
- $(am__objects_222) $(am__objects_223) $(am__objects_224)
+ $(am__objects_235) $(am__objects_236) $(am__objects_237)
libntlmconnect_OBJECTS = $(am_libntlmconnect_OBJECTS)
libntlmconnect_DEPENDENCIES = $(am__DEPENDENCIES_1)
AM_V_P = $(am__v_P_@AM_V@)
@@ -895,10 +938,12 @@ SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
$(lib1509_SOURCES) $(lib1510_SOURCES) $(lib1511_SOURCES) \
$(lib1512_SOURCES) $(lib1513_SOURCES) $(lib1514_SOURCES) \
$(lib1515_SOURCES) $(lib1517_SOURCES) $(lib1520_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) \
+ $(lib1521_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) \
$(lib1900_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
$(lib501_SOURCES) $(lib502_SOURCES) $(lib503_SOURCES) \
$(lib504_SOURCES) $(lib505_SOURCES) $(lib506_SOURCES) \
@@ -916,16 +961,16 @@ SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
$(lib547_SOURCES) $(lib548_SOURCES) $(lib549_SOURCES) \
$(lib552_SOURCES) $(lib553_SOURCES) $(lib554_SOURCES) \
$(lib555_SOURCES) $(lib556_SOURCES) $(lib557_SOURCES) \
- $(lib558_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) $(lib590_SOURCES) \
- $(lib591_SOURCES) $(lib597_SOURCES) $(lib598_SOURCES) \
- $(lib599_SOURCES) $(libauthretry_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) \
+ $(lib590_SOURCES) $(lib591_SOURCES) $(lib597_SOURCES) \
+ $(lib598_SOURCES) $(lib599_SOURCES) $(libauthretry_SOURCES) \
$(libntlmconnect_SOURCES)
DIST_SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
$(lib1500_SOURCES) $(lib1501_SOURCES) $(lib1502_SOURCES) \
@@ -934,10 +979,12 @@ DIST_SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
$(lib1509_SOURCES) $(lib1510_SOURCES) $(lib1511_SOURCES) \
$(lib1512_SOURCES) $(lib1513_SOURCES) $(lib1514_SOURCES) \
$(lib1515_SOURCES) $(lib1517_SOURCES) $(lib1520_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) \
+ $(lib1521_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) \
$(lib1900_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
$(lib501_SOURCES) $(lib502_SOURCES) $(lib503_SOURCES) \
$(lib504_SOURCES) $(lib505_SOURCES) $(lib506_SOURCES) \
@@ -955,16 +1002,16 @@ DIST_SOURCES = $(libhostname_la_SOURCES) $(chkhostname_SOURCES) \
$(lib547_SOURCES) $(lib548_SOURCES) $(lib549_SOURCES) \
$(lib552_SOURCES) $(lib553_SOURCES) $(lib554_SOURCES) \
$(lib555_SOURCES) $(lib556_SOURCES) $(lib557_SOURCES) \
- $(lib558_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) $(lib590_SOURCES) \
- $(lib591_SOURCES) $(lib597_SOURCES) $(lib598_SOURCES) \
- $(lib599_SOURCES) $(libauthretry_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) \
+ $(lib590_SOURCES) $(lib591_SOURCES) $(lib597_SOURCES) \
+ $(lib598_SOURCES) $(lib599_SOURCES) $(libauthretry_SOURCES) \
$(libntlmconnect_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
@@ -1007,6 +1054,12 @@ 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@
@@ -1046,6 +1099,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -1058,6 +1113,7 @@ 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@
@@ -1193,7 +1249,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -1208,9 +1264,7 @@ top_srcdir = @top_srcdir@
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
-@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/lib $(am__append_1)
@@ -1219,31 +1273,26 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
# $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file
# $(top_srcdir)/ares is for in-tree c-ares's external include files
-@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/ares \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/ares $(am__append_1)
EXTRA_DIST = test75.pl test307.pl test610.pl test613.pl test1013.pl \
-test1022.pl Makefile.inc notexists.pl CMakeLists.txt
+test1022.pl Makefile.inc notexists.pl CMakeLists.txt mk-lib1521.pl
@USE_EXPLICIT_LIB_DEPS_FALSE@SUPPORTFILES_LIBS = $(top_builddir)/lib/libcurl.la @CURL_NETWORK_LIBS@ @NSS_LIBS@
@USE_EXPLICIT_LIB_DEPS_TRUE@SUPPORTFILES_LIBS = $(top_builddir)/lib/libcurl.la @LIBCURL_LIBS@
@USE_EXPLICIT_LIB_DEPS_FALSE@TESTUTIL_LIBS = $(top_builddir)/lib/libcurl.la @CURL_NETWORK_AND_TIME_LIBS@ @NSS_LIBS@
@USE_EXPLICIT_LIB_DEPS_TRUE@TESTUTIL_LIBS = $(top_builddir)/lib/libcurl.la @LIBCURL_LIBS@
-# Dependencies (may need to be overriden)
+# Dependencies (may need to be overridden)
LDADD = $(SUPPORTFILES_LIBS)
-DEPENDENCIES = $(top_builddir)/lib/libcurl.la
# files used only in some libcurl test programs
TESTUTIL = testutil.c testutil.h
@@ -1380,6 +1429,8 @@ lib557_SOURCES = lib557.c $(SUPPORTFILES)
lib557_CPPFLAGS = $(AM_CPPFLAGS)
lib558_SOURCES = lib558.c $(SUPPORTFILES)
lib558_CPPFLAGS = $(AM_CPPFLAGS)
+lib559_SOURCES = lib559.c $(SUPPORTFILES)
+lib559_CPPFLAGS = $(AM_CPPFLAGS)
lib560_SOURCES = lib560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib560_LDADD = $(TESTUTIL_LIBS)
lib560_CPPFLAGS = $(AM_CPPFLAGS)
@@ -1494,6 +1545,8 @@ lib1517_SOURCES = lib1517.c $(SUPPORTFILES)
lib1517_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
+lib1521_SOURCES = lib1521.c $(SUPPORTFILES)
+lib1521_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)
lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1525_LDADD = $(TESTUTIL_LIBS)
lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
@@ -1530,6 +1583,19 @@ lib1535_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1535
lib1536_SOURCES = lib1536.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1536_LDADD = $(TESTUTIL_LIBS)
lib1536_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1536
+lib1537_SOURCES = lib1537.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1537_LDADD = $(TESTUTIL_LIBS)
+lib1537_CPPFLAGS = $(AM_CPPFLAGS)
+lib1538_SOURCES = lib1538.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1538_LDADD = $(TESTUTIL_LIBS)
+lib1538_CPPFLAGS = $(AM_CPPFLAGS)
+lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1540_LDADD = $(TESTUTIL_LIBS)
+lib1540_CPPFLAGS = $(AM_CPPFLAGS)
+lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
+lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
+lib1551_SOURCES = lib1551.c $(SUPPORTFILES)
+lib1551_CPPFLAGS = $(AM_CPPFLAGS)
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
@@ -1727,6 +1793,10 @@ lib1517$(EXEEXT): $(lib1517_OBJECTS) $(lib1517_DEPENDENCIES) $(EXTRA_lib1517_DEP
lib1520$(EXEEXT): $(lib1520_OBJECTS) $(lib1520_DEPENDENCIES) $(EXTRA_lib1520_DEPENDENCIES)
@rm -f lib1520$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lib1520_OBJECTS) $(lib1520_LDADD) $(LIBS)
+
+lib1521$(EXEEXT): $(lib1521_OBJECTS) $(lib1521_DEPENDENCIES) $(EXTRA_lib1521_DEPENDENCIES)
+ @rm -f lib1521$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1521_OBJECTS) $(lib1521_LDADD) $(LIBS)
../../lib/lib1525-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
../../lib/$(DEPDIR)/$(am__dirstamp)
@@ -1799,6 +1869,32 @@ lib1535$(EXEEXT): $(lib1535_OBJECTS) $(lib1535_DEPENDENCIES) $(EXTRA_lib1535_DEP
lib1536$(EXEEXT): $(lib1536_OBJECTS) $(lib1536_DEPENDENCIES) $(EXTRA_lib1536_DEPENDENCIES)
@rm -f lib1536$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lib1536_OBJECTS) $(lib1536_LDADD) $(LIBS)
+../../lib/lib1537-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+ ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1537$(EXEEXT): $(lib1537_OBJECTS) $(lib1537_DEPENDENCIES) $(EXTRA_lib1537_DEPENDENCIES)
+ @rm -f lib1537$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1537_OBJECTS) $(lib1537_LDADD) $(LIBS)
+../../lib/lib1538-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+ ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1538$(EXEEXT): $(lib1538_OBJECTS) $(lib1538_DEPENDENCIES) $(EXTRA_lib1538_DEPENDENCIES)
+ @rm -f lib1538$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1538_OBJECTS) $(lib1538_LDADD) $(LIBS)
+../../lib/lib1540-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+ ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1540$(EXEEXT): $(lib1540_OBJECTS) $(lib1540_DEPENDENCIES) $(EXTRA_lib1540_DEPENDENCIES)
+ @rm -f lib1540$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1540_OBJECTS) $(lib1540_LDADD) $(LIBS)
+
+lib1550$(EXEEXT): $(lib1550_OBJECTS) $(lib1550_DEPENDENCIES) $(EXTRA_lib1550_DEPENDENCIES)
+ @rm -f lib1550$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1550_OBJECTS) $(lib1550_LDADD) $(LIBS)
+
+lib1551$(EXEEXT): $(lib1551_OBJECTS) $(lib1551_DEPENDENCIES) $(EXTRA_lib1551_DEPENDENCIES)
+ @rm -f lib1551$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib1551_OBJECTS) $(lib1551_LDADD) $(LIBS)
../../lib/lib1900-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
../../lib/$(DEPDIR)/$(am__dirstamp)
@@ -2047,6 +2143,10 @@ lib557$(EXEEXT): $(lib557_OBJECTS) $(lib557_DEPENDENCIES) $(EXTRA_lib557_DEPENDE
lib558$(EXEEXT): $(lib558_OBJECTS) $(lib558_DEPENDENCIES) $(EXTRA_lib558_DEPENDENCIES)
@rm -f lib558$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lib558_OBJECTS) $(lib558_LDADD) $(LIBS)
+
+lib559$(EXEEXT): $(lib559_OBJECTS) $(lib559_DEPENDENCIES) $(EXTRA_lib559_DEPENDENCIES)
+ @rm -f lib559$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lib559_OBJECTS) $(lib559_LDADD) $(LIBS)
../../lib/lib560-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
../../lib/$(DEPDIR)/$(am__dirstamp)
@@ -2217,6 +2317,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1534-warnless.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1535-warnless.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1536-warnless.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1537-warnless.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1538-warnless.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1540-warnless.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1900-warnless.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib2033-warnless.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib502-warnless.Po@am__quote@
@@ -2299,6 +2402,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1517-lib1517.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-lib1520.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1521-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1521-lib1521.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-lib1525.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-testutil.Po@am__quote@
@@ -2335,6 +2440,19 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1536-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1536-lib1536.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1536-testutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1537-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1537-lib1537.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1537-testutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1538-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1538-lib1538.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1538-testutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-lib1540.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-testutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1550-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1550-lib1550.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1551-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1551-lib1551.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-lib1900.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-testutil.Po@am__quote@
@@ -2457,6 +2575,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib557-lib557.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib558-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib558-lib558.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib559-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib559-lib559.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-lib560.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib560-testutil.Po@am__quote@
@@ -3525,6 +3645,34 @@ lib1520-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) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1520-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+lib1521-lib1521.o: lib1521.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1521-lib1521.o -MD -MP -MF $(DEPDIR)/lib1521-lib1521.Tpo -c -o lib1521-lib1521.o `test -f 'lib1521.c' || echo '$(srcdir)/'`lib1521.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1521-lib1521.Tpo $(DEPDIR)/lib1521-lib1521.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1521.c' object='lib1521-lib1521.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) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1521-lib1521.o `test -f 'lib1521.c' || echo '$(srcdir)/'`lib1521.c
+
+lib1521-lib1521.obj: lib1521.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1521-lib1521.obj -MD -MP -MF $(DEPDIR)/lib1521-lib1521.Tpo -c -o lib1521-lib1521.obj `if test -f 'lib1521.c'; then $(CYGPATH_W) 'lib1521.c'; else $(CYGPATH_W) '$(srcdir)/lib1521.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1521-lib1521.Tpo $(DEPDIR)/lib1521-lib1521.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1521.c' object='lib1521-lib1521.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) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1521-lib1521.obj `if test -f 'lib1521.c'; then $(CYGPATH_W) 'lib1521.c'; else $(CYGPATH_W) '$(srcdir)/lib1521.c'; fi`
+
+lib1521-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1521-first.o -MD -MP -MF $(DEPDIR)/lib1521-first.Tpo -c -o lib1521-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1521-first.Tpo $(DEPDIR)/lib1521-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1521-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) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1521-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1521-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1521-first.obj -MD -MP -MF $(DEPDIR)/lib1521-first.Tpo -c -o lib1521-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)/lib1521-first.Tpo $(DEPDIR)/lib1521-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1521-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) $(lib1521_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1521-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
@@ -4197,6 +4345,230 @@ lib1536-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) $(lib1536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+lib1537-lib1537.o: lib1537.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-lib1537.o -MD -MP -MF $(DEPDIR)/lib1537-lib1537.Tpo -c -o lib1537-lib1537.o `test -f 'lib1537.c' || echo '$(srcdir)/'`lib1537.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1537-lib1537.Tpo $(DEPDIR)/lib1537-lib1537.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1537.c' object='lib1537-lib1537.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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-lib1537.o `test -f 'lib1537.c' || echo '$(srcdir)/'`lib1537.c
+
+lib1537-lib1537.obj: lib1537.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-lib1537.obj -MD -MP -MF $(DEPDIR)/lib1537-lib1537.Tpo -c -o lib1537-lib1537.obj `if test -f 'lib1537.c'; then $(CYGPATH_W) 'lib1537.c'; else $(CYGPATH_W) '$(srcdir)/lib1537.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1537-lib1537.Tpo $(DEPDIR)/lib1537-lib1537.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1537.c' object='lib1537-lib1537.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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-lib1537.obj `if test -f 'lib1537.c'; then $(CYGPATH_W) 'lib1537.c'; else $(CYGPATH_W) '$(srcdir)/lib1537.c'; fi`
+
+lib1537-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-first.o -MD -MP -MF $(DEPDIR)/lib1537-first.Tpo -c -o lib1537-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1537-first.Tpo $(DEPDIR)/lib1537-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1537-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-first.obj -MD -MP -MF $(DEPDIR)/lib1537-first.Tpo -c -o lib1537-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)/lib1537-first.Tpo $(DEPDIR)/lib1537-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1537-testutil.o: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-testutil.o -MD -MP -MF $(DEPDIR)/lib1537-testutil.Tpo -c -o lib1537-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1537-testutil.Tpo $(DEPDIR)/lib1537-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1537-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1537-testutil.obj -MD -MP -MF $(DEPDIR)/lib1537-testutil.Tpo -c -o lib1537-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)/lib1537-testutil.Tpo $(DEPDIR)/lib1537-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1537-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1537-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1537-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1537-warnless.Tpo -c -o ../../lib/lib1537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1537-warnless.Tpo ../../lib/$(DEPDIR)/lib1537-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1537-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1537-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1537-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1537-warnless.Tpo -c -o ../../lib/lib1537-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)/lib1537-warnless.Tpo ../../lib/$(DEPDIR)/lib1537-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1537-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) $(lib1537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1537-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1538-lib1538.o: lib1538.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-lib1538.o -MD -MP -MF $(DEPDIR)/lib1538-lib1538.Tpo -c -o lib1538-lib1538.o `test -f 'lib1538.c' || echo '$(srcdir)/'`lib1538.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1538-lib1538.Tpo $(DEPDIR)/lib1538-lib1538.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1538.c' object='lib1538-lib1538.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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-lib1538.o `test -f 'lib1538.c' || echo '$(srcdir)/'`lib1538.c
+
+lib1538-lib1538.obj: lib1538.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-lib1538.obj -MD -MP -MF $(DEPDIR)/lib1538-lib1538.Tpo -c -o lib1538-lib1538.obj `if test -f 'lib1538.c'; then $(CYGPATH_W) 'lib1538.c'; else $(CYGPATH_W) '$(srcdir)/lib1538.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1538-lib1538.Tpo $(DEPDIR)/lib1538-lib1538.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1538.c' object='lib1538-lib1538.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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-lib1538.obj `if test -f 'lib1538.c'; then $(CYGPATH_W) 'lib1538.c'; else $(CYGPATH_W) '$(srcdir)/lib1538.c'; fi`
+
+lib1538-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-first.o -MD -MP -MF $(DEPDIR)/lib1538-first.Tpo -c -o lib1538-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1538-first.Tpo $(DEPDIR)/lib1538-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1538-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-first.obj -MD -MP -MF $(DEPDIR)/lib1538-first.Tpo -c -o lib1538-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)/lib1538-first.Tpo $(DEPDIR)/lib1538-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1538-testutil.o: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-testutil.o -MD -MP -MF $(DEPDIR)/lib1538-testutil.Tpo -c -o lib1538-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1538-testutil.Tpo $(DEPDIR)/lib1538-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1538-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1538-testutil.obj -MD -MP -MF $(DEPDIR)/lib1538-testutil.Tpo -c -o lib1538-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)/lib1538-testutil.Tpo $(DEPDIR)/lib1538-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1538-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1538-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1538-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1538-warnless.Tpo -c -o ../../lib/lib1538-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1538-warnless.Tpo ../../lib/$(DEPDIR)/lib1538-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1538-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1538-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1538-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1538-warnless.Tpo -c -o ../../lib/lib1538-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)/lib1538-warnless.Tpo ../../lib/$(DEPDIR)/lib1538-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1538-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) $(lib1538_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1538-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1540-lib1540.o: lib1540.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-lib1540.o -MD -MP -MF $(DEPDIR)/lib1540-lib1540.Tpo -c -o lib1540-lib1540.o `test -f 'lib1540.c' || echo '$(srcdir)/'`lib1540.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1540-lib1540.Tpo $(DEPDIR)/lib1540-lib1540.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1540.c' object='lib1540-lib1540.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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-lib1540.o `test -f 'lib1540.c' || echo '$(srcdir)/'`lib1540.c
+
+lib1540-lib1540.obj: lib1540.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-lib1540.obj -MD -MP -MF $(DEPDIR)/lib1540-lib1540.Tpo -c -o lib1540-lib1540.obj `if test -f 'lib1540.c'; then $(CYGPATH_W) 'lib1540.c'; else $(CYGPATH_W) '$(srcdir)/lib1540.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1540-lib1540.Tpo $(DEPDIR)/lib1540-lib1540.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1540.c' object='lib1540-lib1540.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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-lib1540.obj `if test -f 'lib1540.c'; then $(CYGPATH_W) 'lib1540.c'; else $(CYGPATH_W) '$(srcdir)/lib1540.c'; fi`
+
+lib1540-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-first.o -MD -MP -MF $(DEPDIR)/lib1540-first.Tpo -c -o lib1540-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1540-first.Tpo $(DEPDIR)/lib1540-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1540-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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1540-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-first.obj -MD -MP -MF $(DEPDIR)/lib1540-first.Tpo -c -o lib1540-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)/lib1540-first.Tpo $(DEPDIR)/lib1540-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1540-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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1540-testutil.o: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-testutil.o -MD -MP -MF $(DEPDIR)/lib1540-testutil.Tpo -c -o lib1540-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1540-testutil.Tpo $(DEPDIR)/lib1540-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1540-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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1540-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1540-testutil.obj -MD -MP -MF $(DEPDIR)/lib1540-testutil.Tpo -c -o lib1540-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)/lib1540-testutil.Tpo $(DEPDIR)/lib1540-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testutil.c' object='lib1540-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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1540-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1540-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1540-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1540-warnless.Tpo -c -o ../../lib/lib1540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1540-warnless.Tpo ../../lib/$(DEPDIR)/lib1540-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1540-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) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1540-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1540-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1540-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1540-warnless.Tpo -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`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1540-warnless.Tpo ../../lib/$(DEPDIR)/lib1540-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1540-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) $(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`
+
+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
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1550.c' object='lib1550-lib1550.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) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1550-lib1550.o `test -f 'lib1550.c' || echo '$(srcdir)/'`lib1550.c
+
+lib1550-lib1550.obj: lib1550.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1550-lib1550.obj -MD -MP -MF $(DEPDIR)/lib1550-lib1550.Tpo -c -o lib1550-lib1550.obj `if test -f 'lib1550.c'; then $(CYGPATH_W) 'lib1550.c'; else $(CYGPATH_W) '$(srcdir)/lib1550.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1550-lib1550.Tpo $(DEPDIR)/lib1550-lib1550.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1550.c' object='lib1550-lib1550.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) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1550-lib1550.obj `if test -f 'lib1550.c'; then $(CYGPATH_W) 'lib1550.c'; else $(CYGPATH_W) '$(srcdir)/lib1550.c'; fi`
+
+lib1550-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1550-first.o -MD -MP -MF $(DEPDIR)/lib1550-first.Tpo -c -o lib1550-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1550-first.Tpo $(DEPDIR)/lib1550-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1550-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) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1550-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1550-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1550-first.obj -MD -MP -MF $(DEPDIR)/lib1550-first.Tpo -c -o lib1550-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)/lib1550-first.Tpo $(DEPDIR)/lib1550-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1550-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) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1550-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1551-lib1551.o: lib1551.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1551-lib1551.o -MD -MP -MF $(DEPDIR)/lib1551-lib1551.Tpo -c -o lib1551-lib1551.o `test -f 'lib1551.c' || echo '$(srcdir)/'`lib1551.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1551-lib1551.Tpo $(DEPDIR)/lib1551-lib1551.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1551.c' object='lib1551-lib1551.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) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1551-lib1551.o `test -f 'lib1551.c' || echo '$(srcdir)/'`lib1551.c
+
+lib1551-lib1551.obj: lib1551.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1551-lib1551.obj -MD -MP -MF $(DEPDIR)/lib1551-lib1551.Tpo -c -o lib1551-lib1551.obj `if test -f 'lib1551.c'; then $(CYGPATH_W) 'lib1551.c'; else $(CYGPATH_W) '$(srcdir)/lib1551.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1551-lib1551.Tpo $(DEPDIR)/lib1551-lib1551.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib1551.c' object='lib1551-lib1551.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) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1551-lib1551.obj `if test -f 'lib1551.c'; then $(CYGPATH_W) 'lib1551.c'; else $(CYGPATH_W) '$(srcdir)/lib1551.c'; fi`
+
+lib1551-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1551-first.o -MD -MP -MF $(DEPDIR)/lib1551-first.Tpo -c -o lib1551-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib1551-first.Tpo $(DEPDIR)/lib1551-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1551-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) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1551-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1551-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1551-first.obj -MD -MP -MF $(DEPDIR)/lib1551-first.Tpo -c -o lib1551-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)/lib1551-first.Tpo $(DEPDIR)/lib1551-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib1551-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) $(lib1551_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1551-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.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
@@ -6185,6 +6557,34 @@ lib558-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) $(lib558_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib558-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+lib559-lib559.o: lib559.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib559-lib559.o -MD -MP -MF $(DEPDIR)/lib559-lib559.Tpo -c -o lib559-lib559.o `test -f 'lib559.c' || echo '$(srcdir)/'`lib559.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib559-lib559.Tpo $(DEPDIR)/lib559-lib559.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib559.c' object='lib559-lib559.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) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib559-lib559.o `test -f 'lib559.c' || echo '$(srcdir)/'`lib559.c
+
+lib559-lib559.obj: lib559.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib559-lib559.obj -MD -MP -MF $(DEPDIR)/lib559-lib559.Tpo -c -o lib559-lib559.obj `if test -f 'lib559.c'; then $(CYGPATH_W) 'lib559.c'; else $(CYGPATH_W) '$(srcdir)/lib559.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib559-lib559.Tpo $(DEPDIR)/lib559-lib559.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lib559.c' object='lib559-lib559.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) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib559-lib559.obj `if test -f 'lib559.c'; then $(CYGPATH_W) 'lib559.c'; else $(CYGPATH_W) '$(srcdir)/lib559.c'; fi`
+
+lib559-first.o: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib559-first.o -MD -MP -MF $(DEPDIR)/lib559-first.Tpo -c -o lib559-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib559-first.Tpo $(DEPDIR)/lib559-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib559-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) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib559-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib559-first.obj: first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib559-first.obj -MD -MP -MF $(DEPDIR)/lib559-first.Tpo -c -o lib559-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)/lib559-first.Tpo $(DEPDIR)/lib559-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='first.c' object='lib559-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) $(lib559_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib559-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
lib560-lib560.o: lib560.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib560_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib560-lib560.o -MD -MP -MF $(DEPDIR)/lib560-lib560.Tpo -c -o lib560-lib560.o `test -f 'lib560.c' || echo '$(srcdir)/'`lib560.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lib560-lib560.Tpo $(DEPDIR)/lib560-lib560.Po
@@ -7491,9 +7891,15 @@ uninstall-am:
.PRECIOUS: Makefile
+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:
@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+dist:
+ rm lib1521.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.
.NOEXPORT:
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 66628aae..727582bd 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -17,14 +17,16 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532 \
lib533 lib536 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
- lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
+ lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
lib583 lib585 lib586 lib587 lib590 lib591 lib597 lib598 lib599 \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
- lib1520 \
+ lib1520 lib1521 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
- lib1534 lib1535 lib1536 \
+ lib1534 lib1535 lib1536 lib1537 lib1538 \
+ lib1540 \
+ lib1550 lib1551 \
lib1900 \
lib2033
@@ -205,6 +207,9 @@ lib557_CPPFLAGS = $(AM_CPPFLAGS)
lib558_SOURCES = lib558.c $(SUPPORTFILES)
lib558_CPPFLAGS = $(AM_CPPFLAGS)
+lib559_SOURCES = lib559.c $(SUPPORTFILES)
+lib559_CPPFLAGS = $(AM_CPPFLAGS)
+
lib560_SOURCES = lib560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib560_LDADD = $(TESTUTIL_LIBS)
lib560_CPPFLAGS = $(AM_CPPFLAGS)
@@ -364,6 +369,9 @@ lib1517_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
+lib1521_SOURCES = lib1521.c $(SUPPORTFILES)
+lib1521_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)
+
lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1525_LDADD = $(TESTUTIL_LIBS)
lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
@@ -412,6 +420,24 @@ lib1536_SOURCES = lib1536.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1536_LDADD = $(TESTUTIL_LIBS)
lib1536_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1536
+lib1537_SOURCES = lib1537.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1537_LDADD = $(TESTUTIL_LIBS)
+lib1537_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1538_SOURCES = lib1538.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1538_LDADD = $(TESTUTIL_LIBS)
+lib1538_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1540_LDADD = $(TESTUTIL_LIBS)
+lib1540_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
+lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
+
+lib1551_SOURCES = lib1551.c $(SUPPORTFILES)
+lib1551_CPPFLAGS = $(AM_CPPFLAGS)
+
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/libtest/first.c b/tests/libtest/first.c
index 231ae368..72140e31 100644
--- a/tests/libtest/first.c
+++ b/tests/libtest/first.c
@@ -116,7 +116,7 @@ static void memory_tracking_init(void)
#endif
/* returns a hexdump in a static memory area */
-char *hexdump(unsigned char *buffer, size_t len)
+char *hexdump(const unsigned char *buffer, size_t len)
{
static char dump[200*3+1];
char *p = dump;
diff --git a/tests/libtest/lib1501.c b/tests/libtest/lib1501.c
index cc442b52..8a6ef517 100644
--- a/tests/libtest/lib1501.c
+++ b/tests/libtest/lib1501.c
@@ -31,22 +31,7 @@
/* 500 milliseconds allowed. An extreme number but lets be really conservative
to allow old and slow machines to run this test too */
-#define MAX_BLOCKED_TIME_US 500000
-
-/* return the number of microseconds between two time stamps */
-static int elapsed(struct timeval *before,
- struct timeval *after)
-{
- ssize_t result;
-
- result = (after->tv_sec - before->tv_sec) * 1000000 +
- after->tv_usec - before->tv_usec;
- if(result < 0)
- result = 0;
-
- return curlx_sztosi(result);
-}
-
+#define MAX_BLOCKED_TIME_MS 500
int test(char *URL)
{
@@ -80,7 +65,7 @@ int test(char *URL)
int maxfd = -99;
struct timeval before;
struct timeval after;
- int e;
+ long e;
timeout.tv_sec = 0;
timeout.tv_usec = 100000L; /* 100 ms */
@@ -105,10 +90,10 @@ int test(char *URL)
abort_on_test_timeout();
after = tutil_tvnow();
- e = elapsed(&before, &after);
- fprintf(stderr, "pong = %d\n", e);
+ e = tutil_tvdiff(after, before);
+ fprintf(stderr, "pong = %ld\n", e);
- if(e > MAX_BLOCKED_TIME_US) {
+ if(e > MAX_BLOCKED_TIME_MS) {
res = 100;
break;
}
diff --git a/tests/libtest/lib1507.c b/tests/libtest/lib1507.c
index 7ab30571..cd850019 100644
--- a/tests/libtest/lib1507.c
+++ b/tests/libtest/lib1507.c
@@ -44,23 +44,6 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
return CURL_READFUNC_ABORT;
}
-static struct timeval tvnow(void)
-{
- /*
- ** time() returns the value of time in seconds since the Epoch.
- */
- struct timeval now;
- now.tv_sec = (long)time(NULL);
- now.tv_usec = 0;
- return now;
-}
-
-static long tvdiff(struct timeval newer, struct timeval older)
-{
- return (newer.tv_sec-older.tv_sec)*1000+
- (newer.tv_usec-older.tv_usec)/1000;
-}
-
int test(char *URL)
{
int res = 0;
@@ -93,7 +76,7 @@ int test(char *URL)
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
multi_add_handle(mcurl, curl);
- mp_start = tvnow();
+ mp_start = tutil_tvnow();
/* we start some action by calling perform right away */
curl_multi_perform(mcurl, &still_running);
@@ -137,7 +120,7 @@ int test(char *URL)
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
- if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
+ if(tutil_tvdiff(tutil_tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
fprintf(stderr, "ABORTING TEST, since it seems "
"that it would have run forever.\n");
break;
diff --git a/tests/libtest/lib1509.c b/tests/libtest/lib1509.c
index df428a0d..ccb66830 100644
--- a/tests/libtest/lib1509.c
+++ b/tests/libtest/lib1509.c
@@ -28,7 +28,7 @@
size_t WriteOutput(void *ptr, size_t size, size_t nmemb, void *stream);
size_t WriteHeader(void *ptr, size_t size, size_t nmemb, void *stream);
-unsigned long realHeaderSize = 0;
+static unsigned long realHeaderSize = 0;
int test(char *URL)
{
diff --git a/tests/libtest/lib1515.c b/tests/libtest/lib1515.c
index 7763c223..c1499381 100644
--- a/tests/libtest/lib1515.c
+++ b/tests/libtest/lib1515.c
@@ -95,12 +95,13 @@ static int do_one_request(CURLM *m, char *URL, char *resolve)
abort_on_test_timeout();
}
- while((msg = curl_multi_info_read(m, &msgs_left))) {
- if(msg->msg == CURLMSG_DONE && msg->easy_handle == curls) {
+ do {
+ msg = curl_multi_info_read(m, &msgs_left);
+ if(msg && msg->msg == CURLMSG_DONE && msg->easy_handle == curls) {
res = msg->data.result;
break;
}
- }
+ } while(msg);
test_cleanup:
diff --git a/tests/libtest/lib1521.c b/tests/libtest/lib1521.c
new file mode 100644
index 00000000..519922b6
--- /dev/null
+++ b/tests/libtest/lib1521.c
@@ -0,0 +1,2512 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2017, Daniel Stenberg, <daniel.se>, 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"
+#include <limits.h>
+
+/* This source code is generated by mk-lib1521.pl ! */
+
+struct data {
+ char *blaha;
+};
+
+#define LO LONG_MIN
+#define HI LONG_MAX
+#define OFF_LO (curl_off_t) LO
+#define OFF_HI (curl_off_t) ULONG_MAX
+#define OFF_NO (curl_off_t) 0
+
+/* Unexpected error.
+ CURLE_NOT_BUILT_IN - means disabled at build
+ CURLE_UNKNOWN_OPTION - means no such option (anymore?)
+ CURLE_SSL_ENGINE_NOTFOUND - set unkown ssl engine
+ CURLE_UNSUPPORTED_PROTOCOL - set bad HTTP version
+ CURLE_BAD_FUNCTION_ARGUMENT - unsupported value
+ */
+#define UNEX(x) ((x) && \
+ ((x) != CURLE_NOT_BUILT_IN) && \
+ ((x) != CURLE_UNKNOWN_OPTION) && \
+ ((x) != CURLE_SSL_ENGINE_NOTFOUND) && \
+ ((x) != CURLE_UNSUPPORTED_PROTOCOL) && \
+ ((x) != CURLE_BAD_FUNCTION_ARGUMENT) )
+
+static size_t writecb(char *buffer, size_t size, size_t nitems,
+ void *outstream)
+{
+ (void)buffer;
+ (void)size;
+ (void)nitems;
+ (void)outstream;
+ return 0;
+}
+
+static size_t readcb(char *buffer,
+ size_t size,
+ size_t nitems,
+ void *instream)
+{
+ (void)buffer;
+ (void)size;
+ (void)nitems;
+ (void)instream;
+ return 0;
+}
+
+static int err(const char *name, CURLcode val, int lineno)
+{
+ printf("CURLOPT_%s returned %d, \"%s\" on line %d\n",
+ name, val, curl_easy_strerror(val), lineno);
+ return (int)val;
+}
+
+static int geterr(const char *name, CURLcode val, int lineno)
+{
+ printf("CURLINFO_%s returned %d, \"%s\" on line %d\n",
+ name, val, curl_easy_strerror(val), lineno);
+ return (int)val;
+}
+
+static curl_progress_callback progresscb;
+static curl_write_callback headercb;
+static curl_debug_callback debugcb;
+static curl_ssl_ctx_callback ssl_ctx_cb;
+static curl_ioctl_callback ioctlcb;
+static curl_sockopt_callback sockoptcb;
+static curl_opensocket_callback opensocketcb;
+static curl_seek_callback seekcb;
+static curl_sshkeycallback ssh_keycb;
+static curl_chunk_bgn_callback chunk_bgn_cb;
+static curl_chunk_end_callback chunk_end_cb;
+static curl_fnmatch_callback fnmatch_cb;
+static curl_closesocket_callback closesocketcb;
+static curl_xferinfo_callback xferinfocb;
+
+int test(char *URL)
+{
+ CURL *curl = NULL;
+ CURL *dep = NULL;
+ CURLSH *share = NULL;
+ char errorbuffer[CURL_ERROR_SIZE];
+ void *conv_from_network_cb = NULL;
+ void *conv_to_network_cb = NULL;
+ void *conv_from_utf8_cb = NULL;
+ void *interleavecb = NULL;
+ char *stringpointerextra=(char *)"moooo";
+ struct curl_slist *slist=NULL;
+ struct curl_httppost *httppost=NULL;
+ FILE *stream = stderr;
+ struct data object;
+ char *charp;
+ long val;
+ curl_off_t oval;
+ double dval;
+ curl_socket_t sockfd;
+ struct curl_certinfo *certinfo;
+ struct curl_tlssessioninfo *tlssession;
+ CURLcode res = CURLE_OK;
+ (void)URL; /* not used */
+ easy_init(dep);
+ easy_init(curl);
+ share = curl_share_init();
+ if(!share) {
+ res = CURLE_OUT_OF_MEMORY;
+ goto test_cleanup;
+ }
+
+ res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &object);
+ if(UNEX(res)) {
+ err("WRITEDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);
+ if(UNEX(res)) {
+ err("WRITEDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_URL, "string");
+ if(UNEX(res)) {
+ err("URL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_URL, NULL);
+ if(UNEX(res)) {
+ err("URL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PORT, 0L);
+ if(UNEX(res)) {
+ err("PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PORT, 22L);
+ if(UNEX(res)) {
+ err("PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PORT, LO);
+ if(UNEX(res)) {
+ err("PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PORT, HI);
+ if(UNEX(res)) {
+ err("PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY, "string");
+ if(UNEX(res)) {
+ err("PROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY, NULL);
+ if(UNEX(res)) {
+ err("PROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERPWD, "string");
+ if(UNEX(res)) {
+ err("USERPWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERPWD, NULL);
+ if(UNEX(res)) {
+ err("USERPWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "string");
+ if(UNEX(res)) {
+ err("PROXYUSERPWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, NULL);
+ if(UNEX(res)) {
+ err("PROXYUSERPWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RANGE, "string");
+ if(UNEX(res)) {
+ err("RANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RANGE, NULL);
+ if(UNEX(res)) {
+ err("RANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_READDATA, &object);
+ if(UNEX(res)) {
+ err("READDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_READDATA, NULL);
+ if(UNEX(res)) {
+ err("READDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
+ if(UNEX(res)) {
+ err("ERRORBUFFER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, NULL);
+ if(UNEX(res)) {
+ err("ERRORBUFFER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
+ writecb);
+ if(UNEX(res)) {
+ err("WRITEFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("WRITEFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_READFUNCTION,
+ readcb);
+ if(UNEX(res)) {
+ err("READFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("READFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 0L);
+ if(UNEX(res)) {
+ err("TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 22L);
+ if(UNEX(res)) {
+ err("TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT, LO);
+ if(UNEX(res)) {
+ err("TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT, HI);
+ if(UNEX(res)) {
+ err("TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE, 0L);
+ if(UNEX(res)) {
+ err("INFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE, 22L);
+ if(UNEX(res)) {
+ err("INFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE, LO);
+ if(UNEX(res)) {
+ err("INFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE, HI);
+ if(UNEX(res)) {
+ err("INFILESIZE", res, __LINE__); goto test_cleanup; }
+ (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, stringpointerextra);
+ if(UNEX(res)) {
+ err("POSTFIELDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL);
+ if(UNEX(res)) {
+ err("POSTFIELDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REFERER, "string");
+ if(UNEX(res)) {
+ err("REFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REFERER, NULL);
+ if(UNEX(res)) {
+ err("REFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPPORT, "string");
+ if(UNEX(res)) {
+ err("FTPPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPPORT, NULL);
+ if(UNEX(res)) {
+ err("FTPPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERAGENT, "string");
+ if(UNEX(res)) {
+ err("USERAGENT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERAGENT, NULL);
+ if(UNEX(res)) {
+ err("USERAGENT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 0L);
+ if(UNEX(res)) {
+ err("LOW_SPEED_LIMIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 22L);
+ if(UNEX(res)) {
+ err("LOW_SPEED_LIMIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, LO);
+ if(UNEX(res)) {
+ err("LOW_SPEED_LIMIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, HI);
+ if(UNEX(res)) {
+ err("LOW_SPEED_LIMIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 0L);
+ if(UNEX(res)) {
+ err("LOW_SPEED_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 22L);
+ if(UNEX(res)) {
+ err("LOW_SPEED_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, LO);
+ if(UNEX(res)) {
+ err("LOW_SPEED_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, HI);
+ if(UNEX(res)) {
+ err("LOW_SPEED_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 0L);
+ if(UNEX(res)) {
+ err("RESUME_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 22L);
+ if(UNEX(res)) {
+ err("RESUME_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM, LO);
+ if(UNEX(res)) {
+ err("RESUME_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM, HI);
+ if(UNEX(res)) {
+ err("RESUME_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIE, "string");
+ if(UNEX(res)) {
+ err("COOKIE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIE, NULL);
+ if(UNEX(res)) {
+ err("COOKIE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
+ if(UNEX(res)) {
+ err("HTTPHEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, NULL);
+ if(UNEX(res)) {
+ err("HTTPHEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPOST, httppost);
+ if(UNEX(res)) {
+ err("HTTPPOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPOST, NULL);
+ if(UNEX(res)) {
+ err("HTTPPOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLCERT, "string");
+ if(UNEX(res)) {
+ err("SSLCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLCERT, NULL);
+ if(UNEX(res)) {
+ err("SSLCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "string");
+ if(UNEX(res)) {
+ err("KEYPASSWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEYPASSWD, NULL);
+ if(UNEX(res)) {
+ err("KEYPASSWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLF, 0L);
+ if(UNEX(res)) {
+ err("CRLF", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLF, 22L);
+ if(UNEX(res)) {
+ err("CRLF", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLF, LO);
+ if(UNEX(res)) {
+ err("CRLF", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLF, HI);
+ if(UNEX(res)) {
+ err("CRLF", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_QUOTE, slist);
+ if(UNEX(res)) {
+ err("QUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_QUOTE, NULL);
+ if(UNEX(res)) {
+ err("QUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADERDATA, &object);
+ if(UNEX(res)) {
+ err("HEADERDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADERDATA, NULL);
+ if(UNEX(res)) {
+ err("HEADERDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "string");
+ if(UNEX(res)) {
+ err("COOKIEFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIEFILE, NULL);
+ if(UNEX(res)) {
+ err("COOKIEFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLVERSION, 0L);
+ if(UNEX(res)) {
+ err("SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLVERSION, 22L);
+ if(UNEX(res)) {
+ err("SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLVERSION, LO);
+ if(UNEX(res)) {
+ err("SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLVERSION, HI);
+ if(UNEX(res)) {
+ err("SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMECONDITION, 0L);
+ if(UNEX(res)) {
+ err("TIMECONDITION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMECONDITION, 22L);
+ if(UNEX(res)) {
+ err("TIMECONDITION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMECONDITION, LO);
+ if(UNEX(res)) {
+ err("TIMECONDITION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMECONDITION, HI);
+ if(UNEX(res)) {
+ err("TIMECONDITION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 0L);
+ if(UNEX(res)) {
+ err("TIMEVALUE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 22L);
+ if(UNEX(res)) {
+ err("TIMEVALUE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEVALUE, LO);
+ if(UNEX(res)) {
+ err("TIMEVALUE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEVALUE, HI);
+ if(UNEX(res)) {
+ err("TIMEVALUE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "string");
+ if(UNEX(res)) {
+ err("CUSTOMREQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, NULL);
+ if(UNEX(res)) {
+ err("CUSTOMREQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STDERR, stream);
+ if(UNEX(res)) {
+ err("STDERR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STDERR, NULL);
+ if(UNEX(res)) {
+ err("STDERR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTQUOTE, slist);
+ if(UNEX(res)) {
+ err("POSTQUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTQUOTE, NULL);
+ if(UNEX(res)) {
+ err("POSTQUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE40, &object);
+ if(UNEX(res)) {
+ err("OBSOLETE40", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE40, NULL);
+ if(UNEX(res)) {
+ err("OBSOLETE40", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+ if(UNEX(res)) {
+ err("VERBOSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_VERBOSE, 22L);
+ if(UNEX(res)) {
+ err("VERBOSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_VERBOSE, LO);
+ if(UNEX(res)) {
+ err("VERBOSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_VERBOSE, HI);
+ if(UNEX(res)) {
+ err("VERBOSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
+ if(UNEX(res)) {
+ err("HEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADER, 22L);
+ if(UNEX(res)) {
+ err("HEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADER, LO);
+ if(UNEX(res)) {
+ err("HEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADER, HI);
+ if(UNEX(res)) {
+ err("HEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+ if(UNEX(res)) {
+ err("NOPROGRESS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 22L);
+ if(UNEX(res)) {
+ err("NOPROGRESS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, LO);
+ if(UNEX(res)) {
+ err("NOPROGRESS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, HI);
+ if(UNEX(res)) {
+ err("NOPROGRESS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
+ if(UNEX(res)) {
+ err("NOBODY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOBODY, 22L);
+ if(UNEX(res)) {
+ err("NOBODY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOBODY, LO);
+ if(UNEX(res)) {
+ err("NOBODY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOBODY, HI);
+ if(UNEX(res)) {
+ err("NOBODY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FAILONERROR, 0L);
+ if(UNEX(res)) {
+ err("FAILONERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FAILONERROR, 22L);
+ if(UNEX(res)) {
+ err("FAILONERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FAILONERROR, LO);
+ if(UNEX(res)) {
+ err("FAILONERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FAILONERROR, HI);
+ if(UNEX(res)) {
+ err("FAILONERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UPLOAD, 0L);
+ if(UNEX(res)) {
+ err("UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UPLOAD, 22L);
+ if(UNEX(res)) {
+ err("UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UPLOAD, LO);
+ if(UNEX(res)) {
+ err("UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UPLOAD, HI);
+ if(UNEX(res)) {
+ err("UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POST, 0L);
+ if(UNEX(res)) {
+ err("POST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POST, 22L);
+ if(UNEX(res)) {
+ err("POST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POST, LO);
+ if(UNEX(res)) {
+ err("POST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POST, HI);
+ if(UNEX(res)) {
+ err("POST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 0L);
+ if(UNEX(res)) {
+ err("DIRLISTONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 22L);
+ if(UNEX(res)) {
+ err("DIRLISTONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, LO);
+ if(UNEX(res)) {
+ err("DIRLISTONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, HI);
+ if(UNEX(res)) {
+ err("DIRLISTONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_APPEND, 0L);
+ if(UNEX(res)) {
+ err("APPEND", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_APPEND, 22L);
+ if(UNEX(res)) {
+ err("APPEND", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_APPEND, LO);
+ if(UNEX(res)) {
+ err("APPEND", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_APPEND, HI);
+ if(UNEX(res)) {
+ err("APPEND", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC, 0L);
+ if(UNEX(res)) {
+ err("NETRC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC, 22L);
+ if(UNEX(res)) {
+ err("NETRC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC, LO);
+ if(UNEX(res)) {
+ err("NETRC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC, HI);
+ if(UNEX(res)) {
+ err("NETRC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L);
+ if(UNEX(res)) {
+ err("FOLLOWLOCATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 22L);
+ if(UNEX(res)) {
+ err("FOLLOWLOCATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, LO);
+ if(UNEX(res)) {
+ err("FOLLOWLOCATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, HI);
+ if(UNEX(res)) {
+ err("FOLLOWLOCATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 0L);
+ if(UNEX(res)) {
+ err("TRANSFERTEXT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 22L);
+ if(UNEX(res)) {
+ err("TRANSFERTEXT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, LO);
+ if(UNEX(res)) {
+ err("TRANSFERTEXT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, HI);
+ if(UNEX(res)) {
+ err("TRANSFERTEXT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PUT, 0L);
+ if(UNEX(res)) {
+ err("PUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PUT, 22L);
+ if(UNEX(res)) {
+ err("PUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PUT, LO);
+ if(UNEX(res)) {
+ err("PUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PUT, HI);
+ if(UNEX(res)) {
+ err("PUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION,
+ progresscb);
+ if(UNEX(res)) {
+ err("PROGRESSFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("PROGRESSFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &object);
+ if(UNEX(res)) {
+ err("PROGRESSDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
+ if(UNEX(res)) {
+ err("PROGRESSDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 0L);
+ if(UNEX(res)) {
+ err("AUTOREFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 22L);
+ if(UNEX(res)) {
+ err("AUTOREFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_AUTOREFERER, LO);
+ if(UNEX(res)) {
+ err("AUTOREFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_AUTOREFERER, HI);
+ if(UNEX(res)) {
+ err("AUTOREFERER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPORT, 0L);
+ if(UNEX(res)) {
+ err("PROXYPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPORT, 22L);
+ if(UNEX(res)) {
+ err("PROXYPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPORT, LO);
+ if(UNEX(res)) {
+ err("PROXYPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPORT, HI);
+ if(UNEX(res)) {
+ err("PROXYPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0L);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 22L);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, LO);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, HI);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 0L);
+ if(UNEX(res)) {
+ err("HTTPPROXYTUNNEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 22L);
+ if(UNEX(res)) {
+ err("HTTPPROXYTUNNEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, LO);
+ if(UNEX(res)) {
+ err("HTTPPROXYTUNNEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, HI);
+ if(UNEX(res)) {
+ err("HTTPPROXYTUNNEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERFACE, "string");
+ if(UNEX(res)) {
+ err("INTERFACE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERFACE, NULL);
+ if(UNEX(res)) {
+ err("INTERFACE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KRBLEVEL, "string");
+ if(UNEX(res)) {
+ err("KRBLEVEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KRBLEVEL, NULL);
+ if(UNEX(res)) {
+ err("KRBLEVEL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 22L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, LO);
+ if(UNEX(res)) {
+ err("SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, HI);
+ if(UNEX(res)) {
+ err("SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CAINFO, "string");
+ if(UNEX(res)) {
+ err("CAINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CAINFO, NULL);
+ if(UNEX(res)) {
+ err("CAINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 0L);
+ if(UNEX(res)) {
+ err("MAXREDIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 22L);
+ if(UNEX(res)) {
+ err("MAXREDIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, LO);
+ if(UNEX(res)) {
+ err("MAXREDIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, HI);
+ if(UNEX(res)) {
+ err("MAXREDIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FILETIME, 0L);
+ if(UNEX(res)) {
+ err("FILETIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FILETIME, 22L);
+ if(UNEX(res)) {
+ err("FILETIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FILETIME, LO);
+ if(UNEX(res)) {
+ err("FILETIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FILETIME, HI);
+ if(UNEX(res)) {
+ err("FILETIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TELNETOPTIONS, slist);
+ if(UNEX(res)) {
+ err("TELNETOPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TELNETOPTIONS, NULL);
+ if(UNEX(res)) {
+ err("TELNETOPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, 0L);
+ if(UNEX(res)) {
+ err("MAXCONNECTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, 22L);
+ if(UNEX(res)) {
+ err("MAXCONNECTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, LO);
+ if(UNEX(res)) {
+ err("MAXCONNECTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, HI);
+ if(UNEX(res)) {
+ err("MAXCONNECTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE72, 0L);
+ if(UNEX(res)) {
+ err("OBSOLETE72", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE72, 22L);
+ if(UNEX(res)) {
+ err("OBSOLETE72", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE72, LO);
+ if(UNEX(res)) {
+ err("OBSOLETE72", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OBSOLETE72, HI);
+ if(UNEX(res)) {
+ err("OBSOLETE72", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 0L);
+ if(UNEX(res)) {
+ err("FRESH_CONNECT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 22L);
+ if(UNEX(res)) {
+ err("FRESH_CONNECT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, LO);
+ if(UNEX(res)) {
+ err("FRESH_CONNECT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, HI);
+ if(UNEX(res)) {
+ err("FRESH_CONNECT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 0L);
+ if(UNEX(res)) {
+ err("FORBID_REUSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 22L);
+ if(UNEX(res)) {
+ err("FORBID_REUSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, LO);
+ if(UNEX(res)) {
+ err("FORBID_REUSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, HI);
+ if(UNEX(res)) {
+ err("FORBID_REUSE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, "string");
+ if(UNEX(res)) {
+ err("RANDOM_FILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, NULL);
+ if(UNEX(res)) {
+ err("RANDOM_FILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EGDSOCKET, "string");
+ if(UNEX(res)) {
+ err("EGDSOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EGDSOCKET, NULL);
+ if(UNEX(res)) {
+ err("EGDSOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 0L);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 22L);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, LO);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HI);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION,
+ headercb);
+ if(UNEX(res)) {
+ err("HEADERFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("HEADERFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPGET, 0L);
+ if(UNEX(res)) {
+ err("HTTPGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPGET, 22L);
+ if(UNEX(res)) {
+ err("HTTPGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPGET, LO);
+ if(UNEX(res)) {
+ err("HTTPGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPGET, HI);
+ if(UNEX(res)) {
+ err("HTTPGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 22L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, LO);
+ if(UNEX(res)) {
+ err("SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, HI);
+ if(UNEX(res)) {
+ err("SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "string");
+ if(UNEX(res)) {
+ err("COOKIEJAR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIEJAR, NULL);
+ if(UNEX(res)) {
+ err("COOKIEJAR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, "string");
+ if(UNEX(res)) {
+ err("SSL_CIPHER_LIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, NULL);
+ if(UNEX(res)) {
+ err("SSL_CIPHER_LIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, 0L);
+ if(UNEX(res)) {
+ err("HTTP_VERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, 22L);
+ if(UNEX(res)) {
+ err("HTTP_VERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, LO);
+ if(UNEX(res)) {
+ err("HTTP_VERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, HI);
+ if(UNEX(res)) {
+ err("HTTP_VERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L);
+ if(UNEX(res)) {
+ err("FTP_USE_EPSV", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 22L);
+ if(UNEX(res)) {
+ err("FTP_USE_EPSV", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, LO);
+ if(UNEX(res)) {
+ err("FTP_USE_EPSV", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, HI);
+ if(UNEX(res)) {
+ err("FTP_USE_EPSV", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "string");
+ if(UNEX(res)) {
+ err("SSLCERTTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, NULL);
+ if(UNEX(res)) {
+ err("SSLCERTTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLKEY, "string");
+ if(UNEX(res)) {
+ err("SSLKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLKEY, NULL);
+ if(UNEX(res)) {
+ err("SSLKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "string");
+ if(UNEX(res)) {
+ err("SSLKEYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, NULL);
+ if(UNEX(res)) {
+ err("SSLKEYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE, "string");
+ if(UNEX(res)) {
+ err("SSLENGINE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE, NULL);
+ if(UNEX(res)) {
+ err("SSLENGINE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 0L);
+ if(UNEX(res)) {
+ err("SSLENGINE_DEFAULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 22L);
+ if(UNEX(res)) {
+ err("SSLENGINE_DEFAULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, LO);
+ if(UNEX(res)) {
+ err("SSLENGINE_DEFAULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, HI);
+ if(UNEX(res)) {
+ err("SSLENGINE_DEFAULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 0L);
+ if(UNEX(res)) {
+ err("DNS_USE_GLOBAL_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 22L);
+ if(UNEX(res)) {
+ err("DNS_USE_GLOBAL_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, LO);
+ if(UNEX(res)) {
+ err("DNS_USE_GLOBAL_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, HI);
+ if(UNEX(res)) {
+ err("DNS_USE_GLOBAL_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 0L);
+ if(UNEX(res)) {
+ err("DNS_CACHE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 22L);
+ if(UNEX(res)) {
+ err("DNS_CACHE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, LO);
+ if(UNEX(res)) {
+ err("DNS_CACHE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, HI);
+ if(UNEX(res)) {
+ err("DNS_CACHE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PREQUOTE, slist);
+ if(UNEX(res)) {
+ err("PREQUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PREQUOTE, NULL);
+ if(UNEX(res)) {
+ err("PREQUOTE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION,
+ debugcb);
+ if(UNEX(res)) {
+ err("DEBUGFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("DEBUGFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &object);
+ if(UNEX(res)) {
+ err("DEBUGDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEBUGDATA, NULL);
+ if(UNEX(res)) {
+ err("DEBUGDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 0L);
+ if(UNEX(res)) {
+ err("COOKIESESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 22L);
+ if(UNEX(res)) {
+ err("COOKIESESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIESESSION, LO);
+ if(UNEX(res)) {
+ err("COOKIESESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIESESSION, HI);
+ if(UNEX(res)) {
+ err("COOKIESESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CAPATH, "string");
+ if(UNEX(res)) {
+ err("CAPATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CAPATH, NULL);
+ if(UNEX(res)) {
+ err("CAPATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 0L);
+ if(UNEX(res)) {
+ err("BUFFERSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 22L);
+ if(UNEX(res)) {
+ err("BUFFERSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, LO);
+ if(UNEX(res)) {
+ err("BUFFERSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, HI);
+ if(UNEX(res)) {
+ err("BUFFERSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 0L);
+ if(UNEX(res)) {
+ err("NOSIGNAL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 22L);
+ if(UNEX(res)) {
+ err("NOSIGNAL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOSIGNAL, LO);
+ if(UNEX(res)) {
+ err("NOSIGNAL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOSIGNAL, HI);
+ if(UNEX(res)) {
+ err("NOSIGNAL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SHARE, share);
+ if(UNEX(res)) {
+ err("SHARE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SHARE, NULL);
+ if(UNEX(res)) {
+ err("SHARE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, 0L);
+ if(UNEX(res)) {
+ err("PROXYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, 22L);
+ if(UNEX(res)) {
+ err("PROXYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, LO);
+ if(UNEX(res)) {
+ err("PROXYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYTYPE, HI);
+ if(UNEX(res)) {
+ err("PROXYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "string");
+ if(UNEX(res)) {
+ err("ACCEPT_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, NULL);
+ if(UNEX(res)) {
+ err("ACCEPT_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PRIVATE, &object);
+ if(UNEX(res)) {
+ err("PRIVATE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PRIVATE, NULL);
+ if(UNEX(res)) {
+ err("PRIVATE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, slist);
+ if(UNEX(res)) {
+ err("HTTP200ALIASES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, NULL);
+ if(UNEX(res)) {
+ err("HTTP200ALIASES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 0L);
+ if(UNEX(res)) {
+ err("UNRESTRICTED_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 22L);
+ if(UNEX(res)) {
+ err("UNRESTRICTED_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, LO);
+ if(UNEX(res)) {
+ err("UNRESTRICTED_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, HI);
+ if(UNEX(res)) {
+ err("UNRESTRICTED_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, 0L);
+ if(UNEX(res)) {
+ err("FTP_USE_EPRT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, 22L);
+ if(UNEX(res)) {
+ err("FTP_USE_EPRT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, LO);
+ if(UNEX(res)) {
+ err("FTP_USE_EPRT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, HI);
+ if(UNEX(res)) {
+ err("FTP_USE_EPRT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPAUTH, 0L);
+ if(UNEX(res)) {
+ err("HTTPAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPAUTH, 22L);
+ if(UNEX(res)) {
+ err("HTTPAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPAUTH, LO);
+ if(UNEX(res)) {
+ err("HTTPAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTPAUTH, HI);
+ if(UNEX(res)) {
+ err("HTTPAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION,
+ ssl_ctx_cb);
+ if(UNEX(res)) {
+ err("SSL_CTX_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("SSL_CTX_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CTX_DATA, &object);
+ if(UNEX(res)) {
+ err("SSL_CTX_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_CTX_DATA, NULL);
+ if(UNEX(res)) {
+ err("SSL_CTX_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 0L);
+ if(UNEX(res)) {
+ err("FTP_CREATE_MISSING_DIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 22L);
+ if(UNEX(res)) {
+ err("FTP_CREATE_MISSING_DIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, LO);
+ if(UNEX(res)) {
+ err("FTP_CREATE_MISSING_DIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, HI);
+ if(UNEX(res)) {
+ err("FTP_CREATE_MISSING_DIRS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYAUTH, 0L);
+ if(UNEX(res)) {
+ err("PROXYAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYAUTH, 22L);
+ if(UNEX(res)) {
+ err("PROXYAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYAUTH, LO);
+ if(UNEX(res)) {
+ err("PROXYAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYAUTH, HI);
+ if(UNEX(res)) {
+ err("PROXYAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, 0L);
+ if(UNEX(res)) {
+ err("FTP_RESPONSE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, 22L);
+ if(UNEX(res)) {
+ err("FTP_RESPONSE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, LO);
+ if(UNEX(res)) {
+ err("FTP_RESPONSE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, HI);
+ if(UNEX(res)) {
+ err("FTP_RESPONSE_TIMEOUT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, 0L);
+ if(UNEX(res)) {
+ err("IPRESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, 22L);
+ if(UNEX(res)) {
+ err("IPRESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, LO);
+ if(UNEX(res)) {
+ err("IPRESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, HI);
+ if(UNEX(res)) {
+ err("IPRESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, 0L);
+ if(UNEX(res)) {
+ err("MAXFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, 22L);
+ if(UNEX(res)) {
+ err("MAXFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, LO);
+ if(UNEX(res)) {
+ err("MAXFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, HI);
+ if(UNEX(res)) {
+ err("MAXFILESIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("INFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("INFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("INFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("RESUME_FROM_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("RESUME_FROM_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("RESUME_FROM_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("MAXFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("MAXFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("MAXFILESIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC_FILE, "string");
+ if(UNEX(res)) {
+ err("NETRC_FILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NETRC_FILE, NULL);
+ if(UNEX(res)) {
+ err("NETRC_FILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USE_SSL, 0L);
+ if(UNEX(res)) {
+ err("USE_SSL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USE_SSL, 22L);
+ if(UNEX(res)) {
+ err("USE_SSL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USE_SSL, LO);
+ if(UNEX(res)) {
+ err("USE_SSL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USE_SSL, HI);
+ if(UNEX(res)) {
+ err("USE_SSL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("POSTFIELDSIZE_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 0L);
+ if(UNEX(res)) {
+ err("TCP_NODELAY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 22L);
+ if(UNEX(res)) {
+ err("TCP_NODELAY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, LO);
+ if(UNEX(res)) {
+ err("TCP_NODELAY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, HI);
+ if(UNEX(res)) {
+ err("TCP_NODELAY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, 0L);
+ if(UNEX(res)) {
+ err("FTPSSLAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, 22L);
+ if(UNEX(res)) {
+ err("FTPSSLAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, LO);
+ if(UNEX(res)) {
+ err("FTPSSLAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, HI);
+ if(UNEX(res)) {
+ err("FTPSSLAUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION,
+ ioctlcb);
+ if(UNEX(res)) {
+ err("IOCTLFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("IOCTLFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &object);
+ if(UNEX(res)) {
+ err("IOCTLDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IOCTLDATA, NULL);
+ if(UNEX(res)) {
+ err("IOCTLDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, "string");
+ if(UNEX(res)) {
+ err("FTP_ACCOUNT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, NULL);
+ if(UNEX(res)) {
+ err("FTP_ACCOUNT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, "string");
+ if(UNEX(res)) {
+ err("COOKIELIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, NULL);
+ if(UNEX(res)) {
+ err("COOKIELIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 0L);
+ if(UNEX(res)) {
+ err("IGNORE_CONTENT_LENGTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 22L);
+ if(UNEX(res)) {
+ err("IGNORE_CONTENT_LENGTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, LO);
+ if(UNEX(res)) {
+ err("IGNORE_CONTENT_LENGTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, HI);
+ if(UNEX(res)) {
+ err("IGNORE_CONTENT_LENGTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, 0L);
+ if(UNEX(res)) {
+ err("FTP_SKIP_PASV_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, 22L);
+ if(UNEX(res)) {
+ err("FTP_SKIP_PASV_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, LO);
+ if(UNEX(res)) {
+ err("FTP_SKIP_PASV_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, HI);
+ if(UNEX(res)) {
+ err("FTP_SKIP_PASV_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, 0L);
+ if(UNEX(res)) {
+ err("FTP_FILEMETHOD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, 22L);
+ if(UNEX(res)) {
+ err("FTP_FILEMETHOD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, LO);
+ if(UNEX(res)) {
+ err("FTP_FILEMETHOD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, HI);
+ if(UNEX(res)) {
+ err("FTP_FILEMETHOD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORT, 0L);
+ if(UNEX(res)) {
+ err("LOCALPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORT, 22L);
+ if(UNEX(res)) {
+ err("LOCALPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORT, LO);
+ if(UNEX(res)) {
+ err("LOCALPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORT, HI);
+ if(UNEX(res)) {
+ err("LOCALPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 0L);
+ if(UNEX(res)) {
+ err("LOCALPORTRANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 22L);
+ if(UNEX(res)) {
+ err("LOCALPORTRANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, LO);
+ if(UNEX(res)) {
+ err("LOCALPORTRANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, HI);
+ if(UNEX(res)) {
+ err("LOCALPORTRANGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 0L);
+ if(UNEX(res)) {
+ err("CONNECT_ONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 22L);
+ if(UNEX(res)) {
+ err("CONNECT_ONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, LO);
+ if(UNEX(res)) {
+ err("CONNECT_ONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, HI);
+ if(UNEX(res)) {
+ err("CONNECT_ONLY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ conv_from_network_cb);
+ if(UNEX(res)) {
+ err("CONV_FROM_NETWORK_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CONV_FROM_NETWORK_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ conv_to_network_cb);
+ if(UNEX(res)) {
+ err("CONV_TO_NETWORK_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CONV_TO_NETWORK_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ conv_from_utf8_cb);
+ if(UNEX(res)) {
+ err("CONV_FROM_UTF8_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CONV_FROM_UTF8_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("MAX_SEND_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("MAX_SEND_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("MAX_SEND_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, OFF_NO);
+ if(UNEX(res)) {
+ err("MAX_RECV_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, OFF_HI);
+ if(UNEX(res)) {
+ err("MAX_RECV_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, OFF_LO);
+ if(UNEX(res)) {
+ err("MAX_RECV_SPEED_LARGE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, "string");
+ if(UNEX(res)) {
+ err("FTP_ALTERNATIVE_TO_USER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, NULL);
+ if(UNEX(res)) {
+ err("FTP_ALTERNATIVE_TO_USER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION,
+ sockoptcb);
+ if(UNEX(res)) {
+ err("SOCKOPTFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("SOCKOPTFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &object);
+ if(UNEX(res)) {
+ err("SOCKOPTDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, NULL);
+ if(UNEX(res)) {
+ err("SOCKOPTDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L);
+ if(UNEX(res)) {
+ err("SSL_SESSIONID_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 22L);
+ if(UNEX(res)) {
+ err("SSL_SESSIONID_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, LO);
+ if(UNEX(res)) {
+ err("SSL_SESSIONID_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, HI);
+ if(UNEX(res)) {
+ err("SSL_SESSIONID_CACHE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, 0L);
+ if(UNEX(res)) {
+ err("SSH_AUTH_TYPES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, 22L);
+ if(UNEX(res)) {
+ err("SSH_AUTH_TYPES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, LO);
+ if(UNEX(res)) {
+ err("SSH_AUTH_TYPES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, HI);
+ if(UNEX(res)) {
+ err("SSH_AUTH_TYPES", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE, "string");
+ if(UNEX(res)) {
+ err("SSH_PUBLIC_KEYFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE, NULL);
+ if(UNEX(res)) {
+ err("SSH_PUBLIC_KEYFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE, "string");
+ if(UNEX(res)) {
+ err("SSH_PRIVATE_KEYFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE, NULL);
+ if(UNEX(res)) {
+ err("SSH_PRIVATE_KEYFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, 0L);
+ if(UNEX(res)) {
+ err("FTP_SSL_CCC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, 22L);
+ if(UNEX(res)) {
+ err("FTP_SSL_CCC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, LO);
+ if(UNEX(res)) {
+ err("FTP_SSL_CCC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, HI);
+ if(UNEX(res)) {
+ err("FTP_SSL_CCC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 0L);
+ if(UNEX(res)) {
+ err("TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 22L);
+ if(UNEX(res)) {
+ err("TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, LO);
+ if(UNEX(res)) {
+ err("TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, HI);
+ if(UNEX(res)) {
+ err("TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 0L);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 22L);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, LO);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, HI);
+ if(UNEX(res)) {
+ err("CONNECTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0L);
+ if(UNEX(res)) {
+ err("HTTP_TRANSFER_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 22L);
+ if(UNEX(res)) {
+ err("HTTP_TRANSFER_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, LO);
+ if(UNEX(res)) {
+ err("HTTP_TRANSFER_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, HI);
+ if(UNEX(res)) {
+ err("HTTP_TRANSFER_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 0L);
+ if(UNEX(res)) {
+ err("HTTP_CONTENT_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 22L);
+ if(UNEX(res)) {
+ err("HTTP_CONTENT_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, LO);
+ if(UNEX(res)) {
+ err("HTTP_CONTENT_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, HI);
+ if(UNEX(res)) {
+ err("HTTP_CONTENT_DECODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, 0L);
+ if(UNEX(res)) {
+ err("NEW_FILE_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, 22L);
+ if(UNEX(res)) {
+ err("NEW_FILE_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, LO);
+ if(UNEX(res)) {
+ err("NEW_FILE_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, HI);
+ if(UNEX(res)) {
+ err("NEW_FILE_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, 0L);
+ if(UNEX(res)) {
+ err("NEW_DIRECTORY_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, 22L);
+ if(UNEX(res)) {
+ err("NEW_DIRECTORY_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, LO);
+ if(UNEX(res)) {
+ err("NEW_DIRECTORY_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, HI);
+ if(UNEX(res)) {
+ err("NEW_DIRECTORY_PERMS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTREDIR, 0L);
+ if(UNEX(res)) {
+ err("POSTREDIR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTREDIR, 22L);
+ if(UNEX(res)) {
+ err("POSTREDIR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTREDIR, LO);
+ if(UNEX(res)) {
+ err("POSTREDIR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_POSTREDIR, HI);
+ if(UNEX(res)) {
+ err("POSTREDIR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, "string");
+ if(UNEX(res)) {
+ err("SSH_HOST_PUBLIC_KEY_MD5", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, NULL);
+ if(UNEX(res)) {
+ err("SSH_HOST_PUBLIC_KEY_MD5", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION,
+ opensocketcb);
+ if(UNEX(res)) {
+ err("OPENSOCKETFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("OPENSOCKETFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &object);
+ if(UNEX(res)) {
+ err("OPENSOCKETDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, NULL);
+ if(UNEX(res)) {
+ err("OPENSOCKETDATA", res, __LINE__); goto test_cleanup; }
+ (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
+ res = curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, stringpointerextra);
+ if(UNEX(res)) {
+ err("COPYPOSTFIELDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, NULL);
+ if(UNEX(res)) {
+ err("COPYPOSTFIELDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, 0L);
+ if(UNEX(res)) {
+ err("PROXY_TRANSFER_MODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, 22L);
+ if(UNEX(res)) {
+ err("PROXY_TRANSFER_MODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, LO);
+ if(UNEX(res)) {
+ err("PROXY_TRANSFER_MODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, HI);
+ if(UNEX(res)) {
+ err("PROXY_TRANSFER_MODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION,
+ seekcb);
+ if(UNEX(res)) {
+ err("SEEKFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SEEKFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("SEEKFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SEEKDATA, &object);
+ if(UNEX(res)) {
+ err("SEEKDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SEEKDATA, NULL);
+ if(UNEX(res)) {
+ err("SEEKDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLFILE, "string");
+ if(UNEX(res)) {
+ err("CRLFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CRLFILE, NULL);
+ if(UNEX(res)) {
+ err("CRLFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ISSUERCERT, "string");
+ if(UNEX(res)) {
+ err("ISSUERCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ISSUERCERT, NULL);
+ if(UNEX(res)) {
+ err("ISSUERCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, 0L);
+ if(UNEX(res)) {
+ err("ADDRESS_SCOPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, 22L);
+ if(UNEX(res)) {
+ err("ADDRESS_SCOPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, LO);
+ if(UNEX(res)) {
+ err("ADDRESS_SCOPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, HI);
+ if(UNEX(res)) {
+ err("ADDRESS_SCOPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CERTINFO, 0L);
+ if(UNEX(res)) {
+ err("CERTINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CERTINFO, 22L);
+ if(UNEX(res)) {
+ err("CERTINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CERTINFO, LO);
+ if(UNEX(res)) {
+ err("CERTINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CERTINFO, HI);
+ if(UNEX(res)) {
+ err("CERTINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERNAME, "string");
+ if(UNEX(res)) {
+ err("USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_USERNAME, NULL);
+ if(UNEX(res)) {
+ err("USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PASSWORD, "string");
+ if(UNEX(res)) {
+ err("PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PASSWORD, NULL);
+ if(UNEX(res)) {
+ err("PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "string");
+ if(UNEX(res)) {
+ err("PROXYUSERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, NULL);
+ if(UNEX(res)) {
+ err("PROXYUSERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "string");
+ if(UNEX(res)) {
+ err("PROXYPASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, NULL);
+ if(UNEX(res)) {
+ err("PROXYPASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROXY, "string");
+ if(UNEX(res)) {
+ err("NOPROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_NOPROXY, NULL);
+ if(UNEX(res)) {
+ err("NOPROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, 0L);
+ if(UNEX(res)) {
+ err("TFTP_BLKSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, 22L);
+ if(UNEX(res)) {
+ err("TFTP_BLKSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, LO);
+ if(UNEX(res)) {
+ err("TFTP_BLKSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, HI);
+ if(UNEX(res)) {
+ err("TFTP_BLKSIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, "string");
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_SERVICE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, NULL);
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_SERVICE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, 0L);
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_NEC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, 22L);
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_NEC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, LO);
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_NEC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, HI);
+ if(UNEX(res)) {
+ err("SOCKS5_GSSAPI_NEC", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROTOCOLS, 0L);
+ if(UNEX(res)) {
+ err("PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROTOCOLS, 22L);
+ if(UNEX(res)) {
+ err("PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROTOCOLS, LO);
+ if(UNEX(res)) {
+ err("PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROTOCOLS, HI);
+ if(UNEX(res)) {
+ err("PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, 0L);
+ if(UNEX(res)) {
+ err("REDIR_PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, 22L);
+ if(UNEX(res)) {
+ err("REDIR_PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, LO);
+ if(UNEX(res)) {
+ err("REDIR_PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, HI);
+ if(UNEX(res)) {
+ err("REDIR_PROTOCOLS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "string");
+ if(UNEX(res)) {
+ err("SSH_KNOWNHOSTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, NULL);
+ if(UNEX(res)) {
+ err("SSH_KNOWNHOSTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION,
+ ssh_keycb);
+ if(UNEX(res)) {
+ err("SSH_KEYFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("SSH_KEYFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, &object);
+ if(UNEX(res)) {
+ err("SSH_KEYDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, NULL);
+ if(UNEX(res)) {
+ err("SSH_KEYDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "string");
+ if(UNEX(res)) {
+ err("MAIL_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_FROM, NULL);
+ if(UNEX(res)) {
+ err("MAIL_FROM", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, slist);
+ if(UNEX(res)) {
+ err("MAIL_RCPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, NULL);
+ if(UNEX(res)) {
+ err("MAIL_RCPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, 0L);
+ if(UNEX(res)) {
+ err("FTP_USE_PRET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, 22L);
+ if(UNEX(res)) {
+ err("FTP_USE_PRET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, LO);
+ if(UNEX(res)) {
+ err("FTP_USE_PRET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, HI);
+ if(UNEX(res)) {
+ err("FTP_USE_PRET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, 0L);
+ if(UNEX(res)) {
+ err("RTSP_REQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, 22L);
+ if(UNEX(res)) {
+ err("RTSP_REQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, LO);
+ if(UNEX(res)) {
+ err("RTSP_REQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, HI);
+ if(UNEX(res)) {
+ err("RTSP_REQUEST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SESSION_ID, "string");
+ if(UNEX(res)) {
+ err("RTSP_SESSION_ID", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SESSION_ID, NULL);
+ if(UNEX(res)) {
+ err("RTSP_SESSION_ID", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, "string");
+ if(UNEX(res)) {
+ err("RTSP_STREAM_URI", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, NULL);
+ if(UNEX(res)) {
+ err("RTSP_STREAM_URI", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT, "string");
+ if(UNEX(res)) {
+ err("RTSP_TRANSPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT, NULL);
+ if(UNEX(res)) {
+ err("RTSP_TRANSPORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, 0L);
+ if(UNEX(res)) {
+ err("RTSP_CLIENT_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, 22L);
+ if(UNEX(res)) {
+ err("RTSP_CLIENT_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, LO);
+ if(UNEX(res)) {
+ err("RTSP_CLIENT_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, HI);
+ if(UNEX(res)) {
+ err("RTSP_CLIENT_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, 0L);
+ if(UNEX(res)) {
+ err("RTSP_SERVER_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, 22L);
+ if(UNEX(res)) {
+ err("RTSP_SERVER_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, LO);
+ if(UNEX(res)) {
+ err("RTSP_SERVER_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, HI);
+ if(UNEX(res)) {
+ err("RTSP_SERVER_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, &object);
+ if(UNEX(res)) {
+ err("INTERLEAVEDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, NULL);
+ if(UNEX(res)) {
+ err("INTERLEAVEDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION,
+ interleavecb);
+ if(UNEX(res)) {
+ err("INTERLEAVEFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("INTERLEAVEFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 0L);
+ if(UNEX(res)) {
+ err("WILDCARDMATCH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 22L);
+ if(UNEX(res)) {
+ err("WILDCARDMATCH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, LO);
+ if(UNEX(res)) {
+ err("WILDCARDMATCH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, HI);
+ if(UNEX(res)) {
+ err("WILDCARDMATCH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION,
+ chunk_bgn_cb);
+ if(UNEX(res)) {
+ err("CHUNK_BGN_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CHUNK_BGN_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_END_FUNCTION,
+ chunk_end_cb);
+ if(UNEX(res)) {
+ err("CHUNK_END_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_END_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CHUNK_END_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION,
+ fnmatch_cb);
+ if(UNEX(res)) {
+ err("FNMATCH_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION, NULL);
+ if(UNEX(res)) {
+ err("FNMATCH_FUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &object);
+ if(UNEX(res)) {
+ err("CHUNK_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, NULL);
+ if(UNEX(res)) {
+ err("CHUNK_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, &object);
+ if(UNEX(res)) {
+ err("FNMATCH_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, NULL);
+ if(UNEX(res)) {
+ err("FNMATCH_DATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESOLVE, slist);
+ if(UNEX(res)) {
+ err("RESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_RESOLVE, NULL);
+ if(UNEX(res)) {
+ err("RESOLVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "string");
+ if(UNEX(res)) {
+ err("TLSAUTH_USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, NULL);
+ if(UNEX(res)) {
+ err("TLSAUTH_USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "string");
+ if(UNEX(res)) {
+ err("TLSAUTH_PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, NULL);
+ if(UNEX(res)) {
+ err("TLSAUTH_PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "string");
+ if(UNEX(res)) {
+ err("TLSAUTH_TYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, NULL);
+ if(UNEX(res)) {
+ err("TLSAUTH_TYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 0L);
+ if(UNEX(res)) {
+ err("TRANSFER_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 22L);
+ if(UNEX(res)) {
+ err("TRANSFER_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, LO);
+ if(UNEX(res)) {
+ err("TRANSFER_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, HI);
+ if(UNEX(res)) {
+ err("TRANSFER_ENCODING", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION,
+ closesocketcb);
+ if(UNEX(res)) {
+ err("CLOSESOCKETFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("CLOSESOCKETFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &object);
+ if(UNEX(res)) {
+ err("CLOSESOCKETDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, NULL);
+ if(UNEX(res)) {
+ err("CLOSESOCKETDATA", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION, 0L);
+ if(UNEX(res)) {
+ err("GSSAPI_DELEGATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION, 22L);
+ if(UNEX(res)) {
+ err("GSSAPI_DELEGATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION, LO);
+ if(UNEX(res)) {
+ err("GSSAPI_DELEGATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION, HI);
+ if(UNEX(res)) {
+ err("GSSAPI_DELEGATION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "string");
+ if(UNEX(res)) {
+ err("DNS_SERVERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, NULL);
+ if(UNEX(res)) {
+ err("DNS_SERVERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, 0L);
+ if(UNEX(res)) {
+ err("ACCEPTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, 22L);
+ if(UNEX(res)) {
+ err("ACCEPTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, LO);
+ if(UNEX(res)) {
+ err("ACCEPTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, HI);
+ if(UNEX(res)) {
+ err("ACCEPTTIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 0L);
+ if(UNEX(res)) {
+ err("TCP_KEEPALIVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 22L);
+ if(UNEX(res)) {
+ err("TCP_KEEPALIVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, LO);
+ if(UNEX(res)) {
+ err("TCP_KEEPALIVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, HI);
+ if(UNEX(res)) {
+ err("TCP_KEEPALIVE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 0L);
+ if(UNEX(res)) {
+ err("TCP_KEEPIDLE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 22L);
+ if(UNEX(res)) {
+ err("TCP_KEEPIDLE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, LO);
+ if(UNEX(res)) {
+ err("TCP_KEEPIDLE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, HI);
+ if(UNEX(res)) {
+ err("TCP_KEEPIDLE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 0L);
+ if(UNEX(res)) {
+ err("TCP_KEEPINTVL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 22L);
+ if(UNEX(res)) {
+ err("TCP_KEEPINTVL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, LO);
+ if(UNEX(res)) {
+ err("TCP_KEEPINTVL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, HI);
+ if(UNEX(res)) {
+ err("TCP_KEEPINTVL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, 0L);
+ if(UNEX(res)) {
+ err("SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, 22L);
+ if(UNEX(res)) {
+ err("SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, LO);
+ if(UNEX(res)) {
+ err("SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, HI);
+ if(UNEX(res)) {
+ err("SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_AUTH, "string");
+ if(UNEX(res)) {
+ err("MAIL_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_MAIL_AUTH, NULL);
+ if(UNEX(res)) {
+ err("MAIL_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SASL_IR, 0L);
+ if(UNEX(res)) {
+ err("SASL_IR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SASL_IR, 22L);
+ if(UNEX(res)) {
+ err("SASL_IR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SASL_IR, LO);
+ if(UNEX(res)) {
+ err("SASL_IR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SASL_IR, HI);
+ if(UNEX(res)) {
+ err("SASL_IR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION,
+ xferinfocb);
+ if(UNEX(res)) {
+ err("XFERINFOFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, NULL);
+ if(UNEX(res)) {
+ err("XFERINFOFUNCTION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "string");
+ if(UNEX(res)) {
+ err("XOAUTH2_BEARER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, NULL);
+ if(UNEX(res)) {
+ err("XOAUTH2_BEARER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, "string");
+ if(UNEX(res)) {
+ err("DNS_INTERFACE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, NULL);
+ if(UNEX(res)) {
+ err("DNS_INTERFACE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, "string");
+ if(UNEX(res)) {
+ err("DNS_LOCAL_IP4", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, NULL);
+ if(UNEX(res)) {
+ err("DNS_LOCAL_IP4", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, "string");
+ if(UNEX(res)) {
+ err("DNS_LOCAL_IP6", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, NULL);
+ if(UNEX(res)) {
+ err("DNS_LOCAL_IP6", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "string");
+ if(UNEX(res)) {
+ err("LOGIN_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, NULL);
+ if(UNEX(res)) {
+ err("LOGIN_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 0L);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_NPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 22L);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_NPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, LO);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_NPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, HI);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_NPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_ALPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 22L);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_ALPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, LO);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_ALPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, HI);
+ if(UNEX(res)) {
+ err("SSL_ENABLE_ALPN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);
+ if(UNEX(res)) {
+ err("EXPECT_100_TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 22L);
+ if(UNEX(res)) {
+ err("EXPECT_100_TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, LO);
+ if(UNEX(res)) {
+ err("EXPECT_100_TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, HI);
+ if(UNEX(res)) {
+ err("EXPECT_100_TIMEOUT_MS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYHEADER, slist);
+ if(UNEX(res)) {
+ err("PROXYHEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXYHEADER, NULL);
+ if(UNEX(res)) {
+ err("PROXYHEADER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADEROPT, 0L);
+ if(UNEX(res)) {
+ err("HEADEROPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADEROPT, 22L);
+ if(UNEX(res)) {
+ err("HEADEROPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADEROPT, LO);
+ if(UNEX(res)) {
+ err("HEADEROPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_HEADEROPT, HI);
+ if(UNEX(res)) {
+ err("HEADEROPT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY, "string");
+ if(UNEX(res)) {
+ err("PINNEDPUBLICKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY, NULL);
+ if(UNEX(res)) {
+ err("PINNEDPUBLICKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNIX_SOCKET_PATH, "string");
+ if(UNEX(res)) {
+ err("UNIX_SOCKET_PATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_UNIX_SOCKET_PATH, NULL);
+ if(UNEX(res)) {
+ err("UNIX_SOCKET_PATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 0L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYSTATUS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 22L);
+ if(UNEX(res)) {
+ err("SSL_VERIFYSTATUS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, LO);
+ if(UNEX(res)) {
+ err("SSL_VERIFYSTATUS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, HI);
+ if(UNEX(res)) {
+ err("SSL_VERIFYSTATUS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, 0L);
+ if(UNEX(res)) {
+ err("SSL_FALSESTART", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, 22L);
+ if(UNEX(res)) {
+ err("SSL_FALSESTART", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, LO);
+ if(UNEX(res)) {
+ err("SSL_FALSESTART", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, HI);
+ if(UNEX(res)) {
+ err("SSL_FALSESTART", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, 0L);
+ if(UNEX(res)) {
+ err("PATH_AS_IS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, 22L);
+ if(UNEX(res)) {
+ err("PATH_AS_IS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, LO);
+ if(UNEX(res)) {
+ err("PATH_AS_IS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, HI);
+ if(UNEX(res)) {
+ err("PATH_AS_IS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SERVICE_NAME, "string");
+ if(UNEX(res)) {
+ err("PROXY_SERVICE_NAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SERVICE_NAME, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SERVICE_NAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SERVICE_NAME, "string");
+ if(UNEX(res)) {
+ err("SERVICE_NAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SERVICE_NAME, NULL);
+ if(UNEX(res)) {
+ err("SERVICE_NAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 0L);
+ if(UNEX(res)) {
+ err("PIPEWAIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 22L);
+ if(UNEX(res)) {
+ err("PIPEWAIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PIPEWAIT, LO);
+ if(UNEX(res)) {
+ err("PIPEWAIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PIPEWAIT, HI);
+ if(UNEX(res)) {
+ err("PIPEWAIT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "string");
+ if(UNEX(res)) {
+ err("DEFAULT_PROTOCOL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, NULL);
+ if(UNEX(res)) {
+ err("DEFAULT_PROTOCOL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, 0L);
+ if(UNEX(res)) {
+ err("STREAM_WEIGHT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, 22L);
+ if(UNEX(res)) {
+ err("STREAM_WEIGHT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, LO);
+ if(UNEX(res)) {
+ err("STREAM_WEIGHT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, HI);
+ if(UNEX(res)) {
+ err("STREAM_WEIGHT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_DEPENDS, dep);
+ if(UNEX(res)) {
+ err("STREAM_DEPENDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_DEPENDS, NULL);
+ if(UNEX(res)) {
+ err("STREAM_DEPENDS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_DEPENDS_E, dep);
+ if(UNEX(res)) {
+ err("STREAM_DEPENDS_E", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_STREAM_DEPENDS_E, NULL);
+ if(UNEX(res)) {
+ err("STREAM_DEPENDS_E", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, 0L);
+ if(UNEX(res)) {
+ err("TFTP_NO_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, 22L);
+ if(UNEX(res)) {
+ err("TFTP_NO_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, LO);
+ if(UNEX(res)) {
+ err("TFTP_NO_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, HI);
+ if(UNEX(res)) {
+ err("TFTP_NO_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_TO, &object);
+ if(UNEX(res)) {
+ err("CONNECT_TO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_CONNECT_TO, NULL);
+ if(UNEX(res)) {
+ err("CONNECT_TO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 0L);
+ if(UNEX(res)) {
+ err("TCP_FASTOPEN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 22L);
+ if(UNEX(res)) {
+ err("TCP_FASTOPEN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, LO);
+ if(UNEX(res)) {
+ err("TCP_FASTOPEN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, HI);
+ if(UNEX(res)) {
+ err("TCP_FASTOPEN", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, 0L);
+ if(UNEX(res)) {
+ err("KEEP_SENDING_ON_ERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, 22L);
+ if(UNEX(res)) {
+ err("KEEP_SENDING_ON_ERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, LO);
+ if(UNEX(res)) {
+ err("KEEP_SENDING_ON_ERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, HI);
+ if(UNEX(res)) {
+ err("KEEP_SENDING_ON_ERROR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CAINFO, "string");
+ if(UNEX(res)) {
+ err("PROXY_CAINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CAINFO, NULL);
+ if(UNEX(res)) {
+ err("PROXY_CAINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CAPATH, "string");
+ if(UNEX(res)) {
+ err("PROXY_CAPATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CAPATH, NULL);
+ if(UNEX(res)) {
+ err("PROXY_CAPATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, 0L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, 22L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, LO);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, HI);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYPEER", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, 0L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, 22L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, LO);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, HI);
+ if(UNEX(res)) {
+ err("PROXY_SSL_VERIFYHOST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, 0L);
+ if(UNEX(res)) {
+ err("PROXY_SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, 22L);
+ if(UNEX(res)) {
+ err("PROXY_SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, LO);
+ if(UNEX(res)) {
+ err("PROXY_SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLVERSION, HI);
+ if(UNEX(res)) {
+ err("PROXY_SSLVERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "string");
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, NULL);
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_USERNAME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "string");
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, NULL);
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_PASSWORD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "string");
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_TYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, NULL);
+ if(UNEX(res)) {
+ err("PROXY_TLSAUTH_TYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "string");
+ if(UNEX(res)) {
+ err("PROXY_SSLCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SSLCERT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, "string");
+ if(UNEX(res)) {
+ err("PROXY_SSLCERTTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SSLCERTTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "string");
+ if(UNEX(res)) {
+ err("PROXY_SSLKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SSLKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEYTYPE, "string");
+ if(UNEX(res)) {
+ err("PROXY_SSLKEYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEYTYPE, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SSLKEYTYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "string");
+ if(UNEX(res)) {
+ err("PROXY_KEYPASSWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, NULL);
+ if(UNEX(res)) {
+ err("PROXY_KEYPASSWD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_CIPHER_LIST, "string");
+ if(UNEX(res)) {
+ err("PROXY_SSL_CIPHER_LIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_CIPHER_LIST, NULL);
+ if(UNEX(res)) {
+ err("PROXY_SSL_CIPHER_LIST", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CRLFILE, "string");
+ if(UNEX(res)) {
+ err("PROXY_CRLFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_CRLFILE, NULL);
+ if(UNEX(res)) {
+ err("PROXY_CRLFILE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, 0L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, 22L);
+ if(UNEX(res)) {
+ err("PROXY_SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, LO);
+ if(UNEX(res)) {
+ err("PROXY_SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, HI);
+ if(UNEX(res)) {
+ err("PROXY_SSL_OPTIONS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PRE_PROXY, "string");
+ if(UNEX(res)) {
+ err("PRE_PROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PRE_PROXY, NULL);
+ if(UNEX(res)) {
+ err("PRE_PROXY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_PINNEDPUBLICKEY, "string");
+ if(UNEX(res)) {
+ err("PROXY_PINNEDPUBLICKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_PROXY_PINNEDPUBLICKEY, NULL);
+ if(UNEX(res)) {
+ err("PROXY_PINNEDPUBLICKEY", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ABSTRACT_UNIX_SOCKET, "string");
+ if(UNEX(res)) {
+ err("ABSTRACT_UNIX_SOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_ABSTRACT_UNIX_SOCKET, NULL);
+ if(UNEX(res)) {
+ err("ABSTRACT_UNIX_SOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, 0L);
+ if(UNEX(res)) {
+ err("SUPPRESS_CONNECT_HEADERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, 22L);
+ if(UNEX(res)) {
+ err("SUPPRESS_CONNECT_HEADERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, LO);
+ if(UNEX(res)) {
+ err("SUPPRESS_CONNECT_HEADERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, HI);
+ if(UNEX(res)) {
+ err("SUPPRESS_CONNECT_HEADERS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REQUEST_TARGET, "string");
+ if(UNEX(res)) {
+ err("REQUEST_TARGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_REQUEST_TARGET, NULL);
+ if(UNEX(res)) {
+ err("REQUEST_TARGET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, 0L);
+ if(UNEX(res)) {
+ err("SOCKS5_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, 22L);
+ if(UNEX(res)) {
+ err("SOCKS5_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, LO);
+ if(UNEX(res)) {
+ err("SOCKS5_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, HI);
+ if(UNEX(res)) {
+ err("SOCKS5_AUTH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &charp);
+ if(UNEX(res)) {
+ geterr("EFFECTIVE_URL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &val);
+ if(UNEX(res)) {
+ geterr("RESPONSE_CODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("TOTAL_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("NAMELOOKUP_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("CONNECT_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("PRETRANSFER_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("SIZE_UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("SIZE_UPLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("SIZE_DOWNLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("SIZE_DOWNLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("SPEED_DOWNLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("SPEED_DOWNLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("SPEED_UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("SPEED_UPLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &val);
+ if(UNEX(res)) {
+ geterr("HEADER_SIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &val);
+ if(UNEX(res)) {
+ geterr("REQUEST_SIZE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT, &val);
+ if(UNEX(res)) {
+ geterr("SSL_VERIFYRESULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &val);
+ if(UNEX(res)) {
+ geterr("FILETIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("CONTENT_LENGTH_DOWNLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("CONTENT_LENGTH_DOWNLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &dval);
+ if(UNEX(res)) {
+ geterr("CONTENT_LENGTH_UPLOAD", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD_T, &oval);
+ if(UNEX(res)) {
+ geterr("CONTENT_LENGTH_UPLOAD_T", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("STARTTRANSFER_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &charp);
+ if(UNEX(res)) {
+ geterr("CONTENT_TYPE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("REDIRECT_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &val);
+ if(UNEX(res)) {
+ geterr("REDIRECT_COUNT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &charp);
+ if(UNEX(res)) {
+ geterr("PRIVATE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE, &val);
+ if(UNEX(res)) {
+ geterr("HTTP_CONNECTCODE", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_HTTPAUTH_AVAIL, &val);
+ if(UNEX(res)) {
+ geterr("HTTPAUTH_AVAIL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PROXYAUTH_AVAIL, &val);
+ if(UNEX(res)) {
+ geterr("PROXYAUTH_AVAIL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &val);
+ if(UNEX(res)) {
+ geterr("OS_ERRNO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_NUM_CONNECTS, &val);
+ if(UNEX(res)) {
+ geterr("NUM_CONNECTS", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &slist);
+ if(UNEX(res)) {
+ geterr("SSL_ENGINES", res, __LINE__); goto test_cleanup; }
+ if(slist)
+ curl_slist_free_all(slist);
+ res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &slist);
+ if(UNEX(res)) {
+ geterr("COOKIELIST", res, __LINE__); goto test_cleanup; }
+ if(slist)
+ curl_slist_free_all(slist);
+ res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &val);
+ if(UNEX(res)) {
+ geterr("LASTSOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &charp);
+ if(UNEX(res)) {
+ geterr("FTP_ENTRY_PATH", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &charp);
+ if(UNEX(res)) {
+ geterr("REDIRECT_URL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &charp);
+ if(UNEX(res)) {
+ geterr("PRIMARY_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME, &dval);
+ if(UNEX(res)) {
+ geterr("APPCONNECT_TIME", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &certinfo);
+ if(UNEX(res)) {
+ geterr("CERTINFO", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &val);
+ if(UNEX(res)) {
+ geterr("CONDITION_UNMET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_RTSP_SESSION_ID, &charp);
+ if(UNEX(res)) {
+ geterr("RTSP_SESSION_ID", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_RTSP_CLIENT_CSEQ, &val);
+ if(UNEX(res)) {
+ geterr("RTSP_CLIENT_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_RTSP_SERVER_CSEQ, &val);
+ if(UNEX(res)) {
+ geterr("RTSP_SERVER_CSEQ", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_RTSP_CSEQ_RECV, &val);
+ if(UNEX(res)) {
+ geterr("RTSP_CSEQ_RECV", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, &val);
+ if(UNEX(res)) {
+ geterr("PRIMARY_PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_LOCAL_IP, &charp);
+ if(UNEX(res)) {
+ geterr("LOCAL_IP", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, &val);
+ if(UNEX(res)) {
+ geterr("LOCAL_PORT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &tlssession);
+ if(UNEX(res)) {
+ geterr("TLS_SESSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
+ if(UNEX(res)) {
+ geterr("ACTIVESOCKET", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_TLS_SSL_PTR, &tlssession);
+ if(UNEX(res)) {
+ geterr("TLS_SSL_PTR", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION, &val);
+ if(UNEX(res)) {
+ geterr("HTTP_VERSION", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PROXY_SSL_VERIFYRESULT, &val);
+ if(UNEX(res)) {
+ geterr("PROXY_SSL_VERIFYRESULT", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &val);
+ if(UNEX(res)) {
+ geterr("PROTOCOL", res, __LINE__); goto test_cleanup; }
+ res = curl_easy_getinfo(curl, CURLINFO_SCHEME, &charp);
+ if(UNEX(res)) {
+ geterr("SCHEME", res, __LINE__); goto test_cleanup; }
+ curl_easy_setopt(curl, 1, 0);
+ res = CURLE_OK;
+test_cleanup:
+ curl_easy_cleanup(curl);
+ curl_easy_cleanup(dep);
+ curl_share_cleanup(share);
+
+ return (int)res;
+}
diff --git a/tests/libtest/lib1525.c b/tests/libtest/lib1525.c
index 39d51bb1..a7649458 100644
--- a/tests/libtest/lib1525.c
+++ b/tests/libtest/lib1525.c
@@ -82,7 +82,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
- test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
+ test_setopt(curl, CURLOPT_INFILESIZE, (long)strlen(data));
res = curl_easy_perform(curl);
diff --git a/tests/libtest/lib1526.c b/tests/libtest/lib1526.c
index b2d2a411..704ae497 100644
--- a/tests/libtest/lib1526.c
+++ b/tests/libtest/lib1526.c
@@ -85,7 +85,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
- test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
+ test_setopt(curl, CURLOPT_INFILESIZE, (long)strlen(data));
res = curl_easy_perform(curl);
diff --git a/tests/libtest/lib1527.c b/tests/libtest/lib1527.c
index 5dec7fcc..689839e3 100644
--- a/tests/libtest/lib1527.c
+++ b/tests/libtest/lib1527.c
@@ -83,7 +83,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
test_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
- test_setopt(curl, CURLOPT_INFILESIZE, strlen(data));
+ test_setopt(curl, CURLOPT_INFILESIZE, (long)strlen(data));
test_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_UNIFIED);
res = curl_easy_perform(curl);
diff --git a/tests/libtest/lib1531.c b/tests/libtest/lib1531.c
index b21d0673..287acd6c 100644
--- a/tests/libtest/lib1531.c
+++ b/tests/libtest/lib1531.c
@@ -27,8 +27,8 @@
#define TEST_HANG_TIMEOUT 60 * 1000
-char const testData[] = ".abc\0xyz";
-off_t const testDataSize = sizeof(testData) - 1;
+static char const testData[] = ".abc\0xyz";
+static off_t const testDataSize = sizeof(testData) - 1;
int test(char *URL)
{
@@ -127,12 +127,13 @@ int test(char *URL)
} while(still_running);
/* See how the transfers went */
- while((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
- if(msg->msg == CURLMSG_DONE) {
+ do {
+ msg = curl_multi_info_read(multi_handle, &msgs_left);
+ if(msg && msg->msg == CURLMSG_DONE) {
printf("HTTP transfer completed with status %d\n", msg->data.result);
break;
}
- }
+ } while(msg);
curl_multi_cleanup(multi_handle);
diff --git a/tests/libtest/lib1537.c b/tests/libtest/lib1537.c
new file mode 100644
index 00000000..b07d64fc
--- /dev/null
+++ b/tests/libtest/lib1537.c
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "memdebug.h"
+
+int test(char *URL)
+{
+ const unsigned char a[] = {0x2f, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe6, 0xf7};
+ CURLcode res = CURLE_OK;
+ char *ptr = NULL;
+ int asize;
+ int outlen;
+ char *raw;
+
+ (void)URL; /* we don't use this */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ asize = (int)sizeof(a);
+ ptr = curl_easy_escape(NULL, (char *)a, asize);
+ printf("%s\n", ptr);
+ if(ptr)
+ curl_free(ptr);
+
+ /* deprecated API */
+ ptr = curl_escape((char *)a, asize);
+ printf("%s\n", ptr);
+ if(!ptr) {
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ raw = curl_easy_unescape(NULL, ptr, (int)strlen(ptr), &outlen);
+ printf("outlen == %d\n", outlen);
+ printf("unescape == original? %s\n",
+ memcmp(raw, a, outlen) ? "no" : "YES");
+ if(raw)
+ curl_free(raw);
+
+ /* deprecated API */
+ raw = curl_unescape(ptr, (int)strlen(ptr));
+ if(!raw) {
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+ outlen = (int)strlen(raw);
+ printf("[old] outlen == %d\n", outlen);
+ printf("[old] unescape == original? %s\n",
+ memcmp(raw, a, outlen) ? "no" : "YES");
+ if(raw)
+ curl_free(raw);
+ if(ptr)
+ curl_free(ptr);
+
+ /* weird input length */
+ ptr = curl_easy_escape(NULL, (char *)a, -1);
+ printf("escape -1 length: %s\n", ptr);
+
+ /* weird input length */
+ outlen = 2017; /* just a value */
+ ptr = curl_easy_unescape(NULL, (char *)"moahahaha", -1, &outlen);
+ printf("unescape -1 length: %s %d\n", ptr, outlen);
+
+test_cleanup:
+ if(ptr)
+ curl_free(ptr);
+ curl_global_cleanup();
+
+ return (int)res;
+}
diff --git a/tests/libtest/lib1538.c b/tests/libtest/lib1538.c
new file mode 100644
index 00000000..e4e16f20
--- /dev/null
+++ b/tests/libtest/lib1538.c
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "memdebug.h"
+
+int test(char *URL)
+{
+ int res = 0;
+ CURLcode easyret;
+ CURLMcode multiret;
+ CURLSHcode shareret;
+ (void)URL;
+
+ curl_easy_strerror(INT_MAX);
+ curl_multi_strerror(INT_MAX);
+ curl_share_strerror(INT_MAX);
+ curl_easy_strerror(-INT_MAX);
+ curl_multi_strerror(-INT_MAX);
+ curl_share_strerror(-INT_MAX);
+ for(easyret=CURLE_OK; easyret <= CURL_LAST; easyret++) {
+ printf("e%d: %s\n", (int)easyret, curl_easy_strerror(easyret));
+ }
+ for(multiret=CURLM_CALL_MULTI_PERFORM; multiret <= CURLM_LAST; multiret++) {
+ printf("m%d: %s\n", (int)multiret, curl_multi_strerror(multiret));
+ }
+ for(shareret=CURLSHE_OK; shareret <= CURLSHE_LAST; shareret++) {
+ printf("s%d: %s\n", (int)shareret, curl_share_strerror(shareret));
+ }
+
+ return (int)res;
+}
diff --git a/tests/libtest/lib1540.c b/tests/libtest/lib1540.c
new file mode 100644
index 00000000..86ba085c
--- /dev/null
+++ b/tests/libtest/lib1540.c
@@ -0,0 +1,121 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+struct transfer_status {
+ CURL *easy;
+ int halted;
+ int counter; /* count write callback invokes */
+ int please; /* number of times xferinfo is called while halted */
+};
+
+static int please_continue(void *userp,
+ curl_off_t dltotal,
+ curl_off_t dlnow,
+ curl_off_t ultotal,
+ curl_off_t ulnow)
+{
+ struct transfer_status *st = (struct transfer_status *)userp;
+ (void)dltotal;
+ (void)dlnow;
+ (void)ultotal;
+ (void)ulnow;
+ if(st->halted) {
+ st->please++;
+ if(st->please == 2) {
+ /* waited enough, unpause! */
+ curl_easy_pause(st->easy, CURLPAUSE_CONT);
+ }
+ }
+ fprintf(stderr, "xferinfo: paused %d\n", st->halted);
+ return 0; /* go on */
+}
+
+static size_t header_callback(void *ptr, size_t size, size_t nmemb,
+ void *userp)
+{
+ size_t len = size * nmemb;
+ (void)userp;
+ (void)fwrite(ptr, size, nmemb, stdout);
+ return len;
+}
+
+static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+ struct transfer_status *st = (struct transfer_status *)userp;
+ size_t len = size * nmemb;
+ st->counter++;
+ if(st->counter > 1) {
+ /* the first call puts us on pause, so subsequent calls are after
+ unpause */
+ fwrite(ptr, size, nmemb, stdout);
+ return len;
+ }
+ printf("Got %d bytes but pausing!\n", (int)len);
+ st->halted = 1;
+ return CURL_WRITEFUNC_PAUSE;
+}
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+
+int test(char *URL)
+{
+ CURL *curls = NULL;
+ int i = 0;
+ int res = 0;
+ struct transfer_status st;
+
+ start_test_timing();
+
+ memset(&st, 0, sizeof(st));
+
+ global_init(CURL_GLOBAL_ALL);
+
+ easy_init(curls);
+ st.easy = curls; /* to allow callbacks access */
+
+ easy_setopt(curls, CURLOPT_URL, URL);
+ easy_setopt(curls, CURLOPT_WRITEFUNCTION, write_callback);
+ easy_setopt(curls, CURLOPT_WRITEDATA, &st);
+ easy_setopt(curls, CURLOPT_HEADERFUNCTION, header_callback);
+ easy_setopt(curls, CURLOPT_HEADERDATA, &st);
+
+ easy_setopt(curls, CURLOPT_XFERINFOFUNCTION, please_continue);
+ easy_setopt(curls, CURLOPT_XFERINFODATA, &st);
+ easy_setopt(curls, CURLOPT_NOPROGRESS, 0L);
+
+ res = curl_easy_perform(curls);
+
+test_cleanup:
+
+ curl_easy_cleanup(curls);
+ curl_global_cleanup();
+
+ if(res)
+ i = res;
+
+ return i; /* return the final return code */
+}
diff --git a/src/tool_writeenv.h b/tests/libtest/lib1550.c
index 55daf488..94ee576c 100644
--- a/src/tool_writeenv.h
+++ b/tests/libtest/lib1550.c
@@ -1,5 +1,3 @@
-#ifndef HEADER_CURL_TOOL_WRITEENV_H
-#define HEADER_CURL_TOOL_WRITEENV_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -21,15 +19,21 @@
* KIND, either express or implied.
*
***************************************************************************/
-#include "tool_setup.h"
+#include "test.h"
-#ifdef USE_ENVIRONMENT
+#include "memdebug.h"
-void ourWriteEnv(CURL *curl);
+#include <curl/multi.h>
-#else
-# define ourWriteEnv(x) Curl_nop_stmt
-#endif
-
-#endif /* HEADER_CURL_TOOL_WRITEENV_H */
+int test(char *URL)
+{
+ CURLM *handle = curl_multi_init();
+ const char *bl_servers[] = {"Microsoft-IIS/6.0", "nginx/0.8.54", NULL};
+ const char *bl_sites[] = {"curl.haxx.se:443", "example.com:80", NULL};
+ (void)URL; /* unused */
+ curl_multi_setopt(handle, CURLMOPT_PIPELINING_SERVER_BL, bl_servers);
+ curl_multi_setopt(handle, CURLMOPT_PIPELINING_SITE_BL, bl_sites);
+ curl_multi_cleanup(handle);
+ return 0;
+}
diff --git a/tests/libtest/lib1551.c b/tests/libtest/lib1551.c
new file mode 100644
index 00000000..16e27275
--- /dev/null
+++ b/tests/libtest/lib1551.c
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "memdebug.h"
+
+#include <curl/multi.h>
+
+int test(char *URL)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ res = curl_easy_perform(curl);
+
+ fprintf(stderr, "****************************** Do it again\n");
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ }
+ return (int)res;
+}
diff --git a/tests/libtest/lib1900.c b/tests/libtest/lib1900.c
index 4502fc0d..cac1dd1d 100644
--- a/tests/libtest/lib1900.c
+++ b/tests/libtest/lib1900.c
@@ -29,14 +29,14 @@
#define MAX_URLS 200
#define MAX_BLACKLIST 20
-int urltime[MAX_URLS];
-char *urlstring[MAX_URLS];
-CURL *handles[MAX_URLS];
-char *site_blacklist[MAX_BLACKLIST];
-char *server_blacklist[MAX_BLACKLIST];
-int num_handles;
-int blacklist_num_servers;
-int blacklist_num_sites;
+static int urltime[MAX_URLS];
+static char *urlstring[MAX_URLS];
+static CURL *handles[MAX_URLS];
+static char *site_blacklist[MAX_BLACKLIST];
+static char *server_blacklist[MAX_BLACKLIST];
+static int num_handles;
+static int blacklist_num_servers;
+static int blacklist_num_sites;
static size_t
write_callback(void *contents, size_t size, size_t nmemb, void *userp)
@@ -142,7 +142,7 @@ int test(char *URL)
int handlenum = 0;
struct timeval last_handle_add;
- if(parse_url_file("log/urls.txt") <= 0)
+ if(parse_url_file(libtest_arg2) <= 0)
goto test_cleanup;
start_test_timing();
@@ -167,7 +167,6 @@ int test(char *URL)
for(;;) {
struct timeval interval;
struct timeval now;
- long int msnow, mslast;
fd_set rd, wr, exc;
int maxfd = -99;
long timeout;
@@ -177,9 +176,7 @@ int test(char *URL)
if(handlenum < num_handles) {
now = tutil_tvnow();
- msnow = now.tv_sec * 1000 + now.tv_usec / 1000;
- mslast = last_handle_add.tv_sec * 1000 + last_handle_add.tv_usec / 1000;
- if((msnow - mslast) >= urltime[handlenum]) {
+ if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
fprintf(stdout, "Adding handle %d\n", handlenum);
setup_handle(URL, m, handlenum);
last_handle_add = now;
@@ -192,8 +189,9 @@ int test(char *URL)
abort_on_test_timeout();
/* See how the transfers went */
- while((msg = curl_multi_info_read(m, &msgs_left))) {
- if(msg->msg == CURLMSG_DONE) {
+ do {
+ msg = curl_multi_info_read(m, &msgs_left);
+ if(msg && msg->msg == CURLMSG_DONE) {
int i, found = 0;
/* Find out which handle this message is about */
@@ -206,7 +204,7 @@ int test(char *URL)
printf("Handle %d Completed with status %d\n", i, msg->data.result);
curl_multi_remove_handle(m, handles[i]);
}
- }
+ } while(msg);
if(handlenum == num_handles && !running) {
break; /* done */
diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c
index 127fde77..ad5d214c 100644
--- a/tests/libtest/lib505.c
+++ b/tests/libtest/lib505.c
@@ -42,7 +42,6 @@ int test(char *URL)
int hd;
struct_stat file_info;
struct curl_slist *hl;
- int error;
struct curl_slist *headerlist=NULL;
const char *buf_1 = "RNFR 505";
@@ -55,9 +54,8 @@ int test(char *URL)
hd_src = fopen(libtest_arg2, "rb");
if(NULL == hd_src) {
- error = ERRNO;
fprintf(stderr, "fopen failed with error: %d %s\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "Error opening file: %s\n", libtest_arg2);
return TEST_ERR_MAJOR_BAD; /* if this happens things are major weird */
}
@@ -66,9 +64,8 @@ int test(char *URL)
hd = fstat(fileno(hd_src), &file_info);
if(hd == -1) {
/* can't open file, bail out */
- error = ERRNO;
fprintf(stderr, "fstat() failed with error: %d %s\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c
index 20d94877..d26252b6 100644
--- a/tests/libtest/lib506.c
+++ b/tests/libtest/lib506.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -33,11 +33,11 @@ struct Tdata {
};
struct userdata {
- char *text;
+ const char *text;
int counter;
};
-int lock[3];
+static int locks[3];
/* lock callback */
static void my_lock(CURL *handle, curl_lock_data data,
@@ -69,11 +69,11 @@ static void my_lock(CURL *handle, curl_lock_data data,
}
/* detect locking of locked locks */
- if(lock[locknum]) {
+ if(locks[locknum]) {
printf("lock: double locked %s\n", what);
return;
}
- lock[locknum]++;
+ locks[locknum]++;
printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter);
user->counter++;
@@ -105,11 +105,11 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
}
/* detect unlocking of unlocked locks */
- if(!lock[locknum]) {
+ if(!locks[locknum]) {
printf("unlock: double unlocked %s\n", what);
return;
}
- lock[locknum]--;
+ locks[locknum]--;
printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
user->counter++;
@@ -184,7 +184,7 @@ int test(char *URL)
int i;
struct userdata user;
- user.text = (char *)"Pigs in space";
+ user.text = "Pigs in space";
user.counter = 0;
printf("GLOBAL_INIT\n");
diff --git a/tests/libtest/lib509.c b/tests/libtest/lib509.c
index a2522eb8..4f3e072a 100644
--- a/tests/libtest/lib509.c
+++ b/tests/libtest/lib509.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,7 +23,7 @@
/*
* This test uses these funny custom memory callbacks for the only purpose
- * of verifying that curl_global_init_mem() functionallity is present in
+ * of verifying that curl_global_init_mem() functionality is present in
* libcurl and that it works unconditionally no matter how libcurl is built,
* nothing more.
*
@@ -36,11 +36,11 @@
#include "memdebug.h"
*/
-int seen_malloc = 0;
-int seen_free = 0;
-int seen_realloc = 0;
-int seen_strdup = 0;
-int seen_calloc = 0;
+static int seen_malloc = 0;
+static int seen_free = 0;
+static int seen_realloc = 0;
+static int seen_strdup = 0;
+static int seen_calloc = 0;
void *custom_malloc(size_t size);
void custom_free(void *ptr);
diff --git a/tests/libtest/lib510.c b/tests/libtest/lib510.c
index 68588cfe..4c290f1e 100644
--- a/tests/libtest/lib510.c
+++ b/tests/libtest/lib510.c
@@ -48,6 +48,10 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
if(data) {
size_t len = strlen(data);
+ if(size*nmemb < len) {
+ fprintf(stderr, "read buffer is too small to run test\n");
+ return 0;
+ }
memcpy(ptr, data, len);
pooh->counter++; /* advance pointer */
return len;
diff --git a/tests/libtest/lib518.c b/tests/libtest/lib518.c
index 960fcfca..e2dcb440 100644
--- a/tests/libtest/lib518.c
+++ b/tests/libtest/lib518.c
@@ -86,7 +86,7 @@ static int fopen_works(void)
for(i = 0; i < 3; i++) {
fpa[i] = fopen(DEV_NULL, FOPEN_READTEXT);
if(fpa[i] == NULL) {
- store_errmsg("fopen failed", ERRNO);
+ store_errmsg("fopen failed", errno);
fprintf(stderr, "%s\n", msgbuff);
ret = 0;
break;
@@ -122,7 +122,7 @@ static int rlimit(int keep_open)
/* get initial open file limits */
if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
- store_errmsg("getrlimit() failed", ERRNO);
+ store_errmsg("getrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -1;
}
@@ -169,7 +169,7 @@ static int rlimit(int keep_open)
rl.rlim_cur = OPEN_MAX;
if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
/* on failure don't abort just issue a warning */
- store_errmsg("setrlimit() failed", ERRNO);
+ store_errmsg("setrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
msgbuff[0] = '\0';
}
@@ -180,7 +180,7 @@ static int rlimit(int keep_open)
rl.rlim_cur = rl.rlim_max;
if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
/* on failure don't abort just issue a warning */
- store_errmsg("setrlimit() failed", ERRNO);
+ store_errmsg("setrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
msgbuff[0] = '\0';
}
@@ -188,7 +188,7 @@ static int rlimit(int keep_open)
/* get current open file limits */
if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
- store_errmsg("getrlimit() failed", ERRNO);
+ store_errmsg("getrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -3;
}
@@ -268,7 +268,7 @@ static int rlimit(int keep_open)
}
} while(nitems && !memchunk);
if(!memchunk) {
- store_errmsg("memchunk, malloc() failed", ERRNO);
+ store_errmsg("memchunk, malloc() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -5;
}
@@ -303,7 +303,7 @@ static int rlimit(int keep_open)
fd = malloc(sizeof(*fd) * (size_t)(num_open.rlim_max));
if(!fd) {
- store_errmsg("fd, malloc() failed", ERRNO);
+ store_errmsg("fd, malloc() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
free(memchunk);
return -7;
@@ -326,7 +326,7 @@ static int rlimit(int keep_open)
fd[0] = open(DEV_NULL, O_RDONLY);
if(fd[0] < 0) {
snprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
- store_errmsg(strbuff, ERRNO);
+ store_errmsg(strbuff, errno);
fprintf(stderr, "%s\n", msgbuff);
free(fd);
fd = NULL;
diff --git a/tests/libtest/lib525.c b/tests/libtest/lib525.c
index 4bf259d2..715b7fbe 100644
--- a/tests/libtest/lib525.c
+++ b/tests/libtest/lib525.c
@@ -35,7 +35,6 @@ int test(char *URL)
CURL *curl = NULL;
FILE *hd_src = NULL;
int hd;
- int error;
struct_stat file_info;
CURLM *m = NULL;
int running;
@@ -55,9 +54,8 @@ int test(char *URL)
hd_src = fopen(libtest_arg2, "rb");
if(NULL == hd_src) {
- error = ERRNO;
fprintf(stderr, "fopen failed with error: %d (%s)\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2);
return TEST_ERR_FOPEN;
}
@@ -66,9 +64,8 @@ int test(char *URL)
hd = fstat(fileno(hd_src), &file_info);
if(hd == -1) {
/* can't open file, bail out */
- error = ERRNO;
fprintf(stderr, "fstat() failed with error: %d (%s)\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_FSTAT;
diff --git a/tests/libtest/lib526.c b/tests/libtest/lib526.c
index 0ce7ebbe..522cd742 100644
--- a/tests/libtest/lib526.c
+++ b/tests/libtest/lib526.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -29,7 +29,7 @@
* controlling the small differences.
*
* - lib526 closes all easy handles after
- * they all have transfered the file over the single connection
+ * they all have transferred the file over the single connection
* - lib527 closes each easy handle after each single transfer.
* - lib532 uses only a single easy handle that is removed, reset and then
* re-added for each transfer
diff --git a/tests/libtest/lib537.c b/tests/libtest/lib537.c
index 6d7c3e40..b5ee2ce5 100644
--- a/tests/libtest/lib537.c
+++ b/tests/libtest/lib537.c
@@ -87,7 +87,7 @@ static int fopen_works(void)
for(i = 0; i < 3; i++) {
fpa[i] = fopen(DEV_NULL, FOPEN_READTEXT);
if(fpa[i] == NULL) {
- store_errmsg("fopen failed", ERRNO);
+ store_errmsg("fopen failed", errno);
fprintf(stderr, "%s\n", msgbuff);
ret = 0;
break;
@@ -103,7 +103,7 @@ static int fopen_works(void)
static int rlimit(int keep_open)
{
int *tmpfd;
- int nitems, i;
+ rlim_t nitems, i;
int *memchunk = NULL;
char *fmt;
struct rlimit rl;
@@ -123,7 +123,7 @@ static int rlimit(int keep_open)
/* get initial open file limits */
if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
- store_errmsg("getrlimit() failed", ERRNO);
+ store_errmsg("getrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -1;
}
@@ -164,7 +164,7 @@ static int rlimit(int keep_open)
rl.rlim_cur = OPEN_MAX;
if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
/* on failure don't abort just issue a warning */
- store_errmsg("setrlimit() failed", ERRNO);
+ store_errmsg("setrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
msgbuff[0] = '\0';
}
@@ -175,7 +175,7 @@ static int rlimit(int keep_open)
rl.rlim_cur = rl.rlim_max;
if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
/* on failure don't abort just issue a warning */
- store_errmsg("setrlimit() failed", ERRNO);
+ store_errmsg("setrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
msgbuff[0] = '\0';
}
@@ -183,7 +183,7 @@ static int rlimit(int keep_open)
/* get current open file limits */
if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
- store_errmsg("getrlimit() failed", ERRNO);
+ store_errmsg("getrlimit() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -3;
}
@@ -232,7 +232,7 @@ static int rlimit(int keep_open)
if(nitems > 0x7fff)
nitems = 0x40000;
do {
- num_open.rlim_max = sizeof(*memchunk) * (size_t)nitems;
+ num_open.rlim_max = sizeof(*memchunk) * nitems;
snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
fprintf(stderr, "allocating memchunk %s byte array\n", strbuff);
memchunk = malloc(sizeof(*memchunk) * (size_t)nitems);
@@ -242,7 +242,7 @@ static int rlimit(int keep_open)
}
} while(nitems && !memchunk);
if(!memchunk) {
- store_errmsg("memchunk, malloc() failed", ERRNO);
+ store_errmsg("memchunk, malloc() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
return -4;
}
@@ -297,7 +297,7 @@ static int rlimit(int keep_open)
}
} while(num_open.rlim_max && !fd);
if(!fd) {
- store_errmsg("fd, malloc() failed", ERRNO);
+ store_errmsg("fd, malloc() failed", errno);
fprintf(stderr, "%s\n", msgbuff);
free(memchunk);
return -6;
@@ -320,7 +320,7 @@ static int rlimit(int keep_open)
fd[0] = open(DEV_NULL, O_RDONLY);
if(fd[0] < 0) {
snprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
- store_errmsg(strbuff, ERRNO);
+ store_errmsg(strbuff, errno);
fprintf(stderr, "%s\n", msgbuff);
free(fd);
fd = NULL;
diff --git a/tests/libtest/lib540.c b/tests/libtest/lib540.c
index f5d89c41..ac862092 100644
--- a/tests/libtest/lib540.c
+++ b/tests/libtest/lib540.c
@@ -46,7 +46,7 @@
#define NUM_HANDLES 2
-CURL *eh[NUM_HANDLES];
+static CURL *eh[NUM_HANDLES];
static int init(int num, CURLM *cm, const char *url, const char *userpwd,
struct curl_slist *headers)
diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c
index 3e9cb3cc..94a26a4b 100644
--- a/tests/libtest/lib541.c
+++ b/tests/libtest/lib541.c
@@ -38,7 +38,6 @@ int test(char *URL)
FILE *hd_src;
int hd;
struct_stat file_info;
- int error;
if(!libtest_arg2) {
fprintf(stderr, "Usage: <url> <file-to-upload>\n");
@@ -47,9 +46,8 @@ int test(char *URL)
hd_src = fopen(libtest_arg2, "rb");
if(NULL == hd_src) {
- error = ERRNO;
fprintf(stderr, "fopen failed with error: %d %s\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "Error opening file: %s\n", libtest_arg2);
return -2; /* if this happens things are major weird */
}
@@ -58,9 +56,8 @@ int test(char *URL)
hd = fstat(fileno(hd_src), &file_info);
if(hd == -1) {
/* can't open file, bail out */
- error = ERRNO;
fprintf(stderr, "fstat() failed with error: %d %s\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib552.c b/tests/libtest/lib552.c
index 967e2114..3a93dafa 100644
--- a/tests/libtest/lib552.c
+++ b/tests/libtest/lib552.c
@@ -92,6 +92,7 @@ int my_trace(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", (char *)data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
@@ -151,7 +152,7 @@ static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
{
(void)clientp;
if(cmd == CURLIOCMD_RESTARTREAD) {
- printf("APPLICATION: recieved a CURLIOCMD_RESTARTREAD request\n");
+ printf("APPLICATION: received a CURLIOCMD_RESTARTREAD request\n");
printf("APPLICATION: ** REWINDING! **\n");
current_offset = 0;
return CURLIOE_OK;
diff --git a/tests/libtest/lib555.c b/tests/libtest/lib555.c
index e84af87e..8156a95e 100644
--- a/tests/libtest/lib555.c
+++ b/tests/libtest/lib555.c
@@ -98,7 +98,7 @@ int test(char *URL)
easy_setopt(curl, CURLOPT_READDATA, &counter);
/* We CANNOT do the POST fine without setting the size (or choose
chunked)! */
- easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(UPLOADTHIS));
+ easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(UPLOADTHIS));
easy_setopt(curl, CURLOPT_POST, 1L);
#ifdef CURL_DOES_CONVERSIONS
diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c
index 68fdfa2b..4a598f22 100644
--- a/tests/libtest/lib557.c
+++ b/tests/libtest/lib557.c
@@ -26,8 +26,16 @@
*/
#include "test.h"
-#include "memdebug.h"
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h> /* for setlocale() */
+#endif
+
+#include "memdebug.h"
#if (CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG)
# define MPRNT_SUFFIX_CURL_OFF_T LL
@@ -1617,8 +1625,8 @@ static int test_float_formatting(void)
123456789123456789123456789.2987654);
errors += strlen_check(buf, 325);
- /* 1<<31 turns negative (-2147483648) when used signed */
- curl_msnprintf(buf, sizeof(buf), "%*f", (1<<31), 9.1);
+ /* check negative when used signed */
+ curl_msnprintf(buf, sizeof(buf), "%*f", INT_MIN, 9.1);
errors += string_check(buf, "9.100000");
/* curl_msnprintf() limits a single float output to 325 bytes maximum
@@ -1656,6 +1664,14 @@ int test(char *URL)
int errors = 0;
(void)URL; /* not used */
+#ifdef HAVE_SETLOCALE
+ /*
+ * The test makes assumptions about the numeric locale (specifically,
+ * RADIXCHAR) so set it to a known working (and portable) one.
+ */
+ setlocale(LC_NUMERIC, "C");
+#endif
+
errors += test_weird_arguments();
errors += test_unsigned_short_formatting();
diff --git a/tests/libtest/lib559.c b/tests/libtest/lib559.c
new file mode 100644
index 00000000..8c72dbd0
--- /dev/null
+++ b/tests/libtest/lib559.c
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "testtrace.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode res;
+ CURL *curl;
+
+ 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;
+ }
+
+ test_setopt(curl, CURLOPT_URL, URL);
+ test_setopt(curl, CURLOPT_HEADER, 1L);
+ test_setopt(curl, CURLOPT_BUFFERSIZE, 1L); /* the smallest! */
+
+ res = curl_easy_perform(curl);
+test_cleanup:
+
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+
+ return (int)res;
+}
+
diff --git a/tests/libtest/lib571.c b/tests/libtest/lib571.c
index 40a78fa8..f19b643f 100644
--- a/tests/libtest/lib571.c
+++ b/tests/libtest/lib571.c
@@ -56,7 +56,7 @@ static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *stream)
int channel = RTP_PKT_CHANNEL(data);
int message_size;
int coded_size = RTP_PKT_LENGTH(data);
- size_t failure = (size * nmemb) ? 0 : 1;
+ size_t failure = (size && nmemb) ? 0 : 1;
int i;
(void)stream;
diff --git a/tests/libtest/lib574.c b/tests/libtest/lib574.c
index a51cda05..f4fb850f 100644
--- a/tests/libtest/lib574.c
+++ b/tests/libtest/lib574.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,8 +23,10 @@
#include "memdebug.h"
-static int new_fnmatch(const char *pattern, const char *string)
+static int new_fnmatch(void *ptr,
+ const char *pattern, const char *string)
{
+ (void)ptr;
(void)pattern;
(void)string;
return CURL_FNMATCHFUNC_MATCH;
diff --git a/tests/libtest/lib578.c b/tests/libtest/lib578.c
index 9603b58d..41b23db3 100644
--- a/tests/libtest/lib578.c
+++ b/tests/libtest/lib578.c
@@ -77,7 +77,7 @@ int test(char *URL)
#endif
/* Set the expected POST size */
- test_setopt(curl, CURLOPT_POSTFIELDSIZE, data_size);
+ test_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)data_size);
test_setopt(curl, CURLOPT_POSTFIELDS, data);
/* we want to use our own progress function */
diff --git a/tests/libtest/lib582.c b/tests/libtest/lib582.c
index eec0455f..f55e5de7 100644
--- a/tests/libtest/lib582.c
+++ b/tests/libtest/lib582.c
@@ -174,8 +174,8 @@ static int getMicroSecondTimeout(struct timeval* timeout)
struct timeval now;
ssize_t result;
now = tutil_tvnow();
- result = (timeout->tv_sec - now.tv_sec) * 1000000 +
- timeout->tv_usec - now.tv_usec;
+ result = (ssize_t)((timeout->tv_sec - now.tv_sec) * 1000000 +
+ timeout->tv_usec - now.tv_usec);
if(result < 0)
result = 0;
@@ -228,7 +228,6 @@ int test(char *URL)
CURL *curl = NULL;
FILE *hd_src = NULL;
int hd;
- int error;
struct_stat file_info;
CURLM *m = NULL;
struct ReadWriteSockets sockets = {{NULL, 0, 0}, {NULL, 0, 0}};
@@ -244,9 +243,8 @@ int test(char *URL)
hd_src = fopen(libtest_arg2, "rb");
if(NULL == hd_src) {
- error = ERRNO;
fprintf(stderr, "fopen() failed with error: %d (%s)\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2);
return TEST_ERR_FOPEN;
}
@@ -255,9 +253,8 @@ int test(char *URL)
hd = fstat(fileno(hd_src), &file_info);
if(hd == -1) {
/* can't open file, bail out */
- error = ERRNO;
fprintf(stderr, "fstat() failed with error: %d (%s)\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_FSTAT;
@@ -320,7 +317,7 @@ int test(char *URL)
tv.tv_usec = 100000;
}
- select_test(maxFd, &readSet, &writeSet, NULL, &tv);
+ select_test((int)maxFd, &readSet, &writeSet, NULL, &tv);
/* Check the sockets for reading / writing */
checkFdSet(m, &sockets.read, &readSet, CURL_CSELECT_IN, "read");
diff --git a/tests/libtest/lib583.c b/tests/libtest/lib583.c
index 5b11fab2..f0a088b7 100644
--- a/tests/libtest/lib583.c
+++ b/tests/libtest/lib583.c
@@ -35,7 +35,7 @@ int test(char *URL)
int stillRunning;
CURLM *multiHandle = NULL;
CURL *curl = NULL;
- int res = 0;
+ CURLMcode res = CURLM_OK;
global_init(CURL_GLOBAL_ALL);
@@ -65,10 +65,10 @@ int test(char *URL)
fprintf(stderr, "curl_multi_perform() succeeded\n");
fprintf(stderr, "curl_multi_remove_handle()...\n");
- res = (int) curl_multi_remove_handle(multiHandle, curl);
+ res = curl_multi_remove_handle(multiHandle, curl);
if(res)
fprintf(stderr, "curl_multi_remove_handle() failed, "
- "with code %d\n", res);
+ "with code %d\n", (int)res);
else
fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
@@ -80,5 +80,5 @@ test_cleanup:
curl_multi_cleanup(multiHandle);
curl_global_cleanup();
- return res;
+ return (int)res;
}
diff --git a/tests/libtest/lib586.c b/tests/libtest/lib586.c
index a4fc6fee..859ef343 100644
--- a/tests/libtest/lib586.c
+++ b/tests/libtest/lib586.c
@@ -31,7 +31,7 @@ struct Tdata {
};
struct userdata {
- char *text;
+ const char *text;
int counter;
};
@@ -138,7 +138,7 @@ int test(char *URL)
int i;
struct userdata user;
- user.text = (char *)"Pigs in space";
+ user.text = "Pigs in space";
user.counter = 0;
printf("GLOBAL_INIT\n");
diff --git a/tests/libtest/lib591.c b/tests/libtest/lib591.c
index 7d50f894..53ede3fc 100644
--- a/tests/libtest/lib591.c
+++ b/tests/libtest/lib591.c
@@ -44,15 +44,13 @@ int test(char *URL)
int msgs_left;
CURLMsg *msg;
FILE *upload = NULL;
- int error;
start_test_timing();
upload = fopen(libtest_arg3, "rb");
if(!upload) {
- error = ERRNO;
fprintf(stderr, "fopen() failed with error: %d (%s)\n",
- error, strerror(error));
+ errno, strerror(errno));
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg3);
return TEST_ERR_FOPEN;
}
diff --git a/tests/libtest/libauthretry.c b/tests/libtest/libauthretry.c
index 139dab97..e9dc0508 100644
--- a/tests/libtest/libauthretry.c
+++ b/tests/libtest/libauthretry.c
@@ -111,12 +111,10 @@ int test(char *url)
res = send_wrong_password(curl, url, 100, main_auth_scheme);
if(res != CURLE_OK)
goto test_cleanup;
- curl_easy_reset(curl);
res = send_right_password(curl, url, 200, fallback_auth_scheme);
if(res != CURLE_OK)
goto test_cleanup;
- curl_easy_reset(curl);
curl_easy_cleanup(curl);
@@ -131,17 +129,14 @@ int test(char *url)
res = send_wrong_password(curl, url, 300, main_auth_scheme);
if(res != CURLE_OK)
goto test_cleanup;
- curl_easy_reset(curl);
res = send_wrong_password(curl, url, 400, fallback_auth_scheme);
if(res != CURLE_OK)
goto test_cleanup;
- curl_easy_reset(curl);
res = send_right_password(curl, url, 500, fallback_auth_scheme);
if(res != CURLE_OK)
goto test_cleanup;
- curl_easy_reset(curl);
test_cleanup:
diff --git a/tests/libtest/libntlmconnect.c b/tests/libtest/libntlmconnect.c
index 40a837ca..ad20e8b8 100644
--- a/tests/libtest/libntlmconnect.c
+++ b/tests/libtest/libntlmconnect.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 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
@@ -33,6 +33,7 @@
#define TEST_HANG_TIMEOUT 5 * 1000
#define MAX_EASY_HANDLES 3
+static int counter[MAX_EASY_HANDLES];
static CURL *easy[MAX_EASY_HANDLES];
static curl_socket_t sockets[MAX_EASY_HANDLES];
static int res = 0;
@@ -43,20 +44,10 @@ static size_t callback(char *ptr, size_t size, size_t nmemb, void *data)
curl_socket_t sock;
long longdata;
CURLcode code;
+ const size_t failure = (size && nmemb) ? 0 : 1;
+ (void)ptr;
- const size_t failure = (size * nmemb) ? 0 : 1;
-
- char *output = malloc(size * nmemb + 1);
- if(!output) {
- fprintf(stderr, "output, malloc() failed\n");
- res = TEST_ERR_MAJOR_BAD;
- return failure;
- }
-
- memcpy(output, ptr, size * nmemb);
- output[size * nmemb] = '\0';
- fprintf(stdout, "%s", output);
- free(output);
+ counter[idx] += (int)(size * nmemb);
/* Get socket being used for this easy handle, otherwise CURL_SOCKET_BAD */
code = curl_easy_getinfo(easy[idx], CURLINFO_LASTSOCKET, &longdata);
@@ -100,7 +91,7 @@ int test(char *url)
{
CURLM *multi = NULL;
int running;
- int i, j;
+ int i;
int num_handles = 0;
enum HandleState state = ReadyForNewHandle;
size_t urllen = strlen(url) + 4 + 1;
@@ -182,50 +173,6 @@ int test(char *url)
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
- /* Any socket which is new in fdread is associated with the new handle */
- for(i = 0; i <= maxfd; ++i) {
- bool socket_exists = FALSE;
- curl_socket_t curfd = (curl_socket_t)i;
-
- if(!FD_ISSET(curfd, &fdread)) {
- continue;
- }
-
- /* Check if this socket was already detected for an earlier handle (or
- for this handle, num_handles-1, in the callback */
- for(j = 0; j < num_handles; ++j) {
- if(sockets[j] == curfd) {
- socket_exists = TRUE;
- break;
- }
- }
- if(socket_exists) {
- continue;
- }
-
- if(found_new_socket || state != NeedSocketForNewHandle) {
- fprintf(stderr, "Unexpected new socket\n");
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
-
- /* Now we know the socket is for the most recent handle, num_handles-1 */
- if(sockets[num_handles-1] != CURL_SOCKET_BAD) {
- /* A socket for this handle was already detected in the callback; if it
- matched socket_exists should be true and we would never get here */
- assert(curfd != sockets[num_handles-1]);
- fprintf(stderr, "Handle %d wrote to socket %d then detected on %d\n",
- num_handles-1, (int)sockets[num_handles-1], (int)curfd);
- res = TEST_ERR_MAJOR_BAD;
- goto test_cleanup;
- }
- else {
- sockets[num_handles-1] = curfd;
- found_new_socket = TRUE;
- /* continue to make sure there's only one new handle */
- }
- }
-
if(state == NeedSocketForNewHandle) {
if(maxfd != -1 && !found_new_socket) {
fprintf(stderr, "Warning: socket did not open immediately for new "
@@ -270,6 +217,7 @@ test_cleanup:
/* proper cleanup sequence - type PB */
for(i = 0; i < MAX_EASY_HANDLES; i++) {
+ printf("Data connection %d: %d\n", i, counter[i]);
curl_multi_remove_handle(multi, easy[i]);
curl_easy_cleanup(easy[i]);
}
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
new file mode 100644
index 00000000..e60bce5c
--- /dev/null
+++ b/tests/libtest/mk-lib1521.pl
@@ -0,0 +1,303 @@
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 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.
+#
+###########################################################################
+
+# Usage:
+# perl mk-lib1521.pl < ../../include/curl/curl.h > lib1521.c
+
+# minimum and maximum long signed values
+my $minlong = "LONG_MIN";
+my $maxlong = "LONG_MAX";
+# maximum long unsigned value
+my $maxulong = "ULONG_MAX";
+
+print <<HEADER
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \\| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \\___|\\___/|_| \\_\\_____|
+ *
+ * Copyright (C) 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 "memdebug.h"
+#include <limits.h>
+
+/* This source code is generated by mk-lib1521.pl ! */
+
+struct data {
+ char *blaha;
+};
+
+#define LO $minlong
+#define HI $maxlong
+#define OFF_LO (curl_off_t) LO
+#define OFF_HI (curl_off_t) $maxulong
+#define OFF_NO (curl_off_t) 0
+
+/* Unexpected error.
+ CURLE_NOT_BUILT_IN - means disabled at build
+ CURLE_UNKNOWN_OPTION - means no such option (anymore?)
+ CURLE_SSL_ENGINE_NOTFOUND - set unkown ssl engine
+ CURLE_UNSUPPORTED_PROTOCOL - set bad HTTP version
+ CURLE_BAD_FUNCTION_ARGUMENT - unsupported value
+ */
+#define UNEX(x) ((x) && \\
+ ((x) != CURLE_NOT_BUILT_IN) && \\
+ ((x) != CURLE_UNKNOWN_OPTION) && \\
+ ((x) != CURLE_SSL_ENGINE_NOTFOUND) && \\
+ ((x) != CURLE_UNSUPPORTED_PROTOCOL) && \\
+ ((x) != CURLE_BAD_FUNCTION_ARGUMENT) )
+
+static size_t writecb(char *buffer, size_t size, size_t nitems,
+ void *outstream)
+{
+ (void)buffer;
+ (void)size;
+ (void)nitems;
+ (void)outstream;
+ return 0;
+}
+
+static size_t readcb(char *buffer,
+ size_t size,
+ size_t nitems,
+ void *instream)
+{
+ (void)buffer;
+ (void)size;
+ (void)nitems;
+ (void)instream;
+ return 0;
+}
+
+static int err(const char *name, CURLcode val, int lineno)
+{
+ printf("CURLOPT_%s returned %d, \\"%s\\" on line %d\\n",
+ name, val, curl_easy_strerror(val), lineno);
+ return (int)val;
+}
+
+static int geterr(const char *name, CURLcode val, int lineno)
+{
+ printf("CURLINFO_%s returned %d, \\"%s\\" on line %d\\n",
+ name, val, curl_easy_strerror(val), lineno);
+ return (int)val;
+}
+
+static curl_progress_callback progresscb;
+static curl_write_callback headercb;
+static curl_debug_callback debugcb;
+static curl_ssl_ctx_callback ssl_ctx_cb;
+static curl_ioctl_callback ioctlcb;
+static curl_sockopt_callback sockoptcb;
+static curl_opensocket_callback opensocketcb;
+static curl_seek_callback seekcb;
+static curl_sshkeycallback ssh_keycb;
+static curl_chunk_bgn_callback chunk_bgn_cb;
+static curl_chunk_end_callback chunk_end_cb;
+static curl_fnmatch_callback fnmatch_cb;
+static curl_closesocket_callback closesocketcb;
+static curl_xferinfo_callback xferinfocb;
+
+int test(char *URL)
+{
+ CURL *curl = NULL;
+ CURL *dep = NULL;
+ CURLSH *share = NULL;
+ char errorbuffer[CURL_ERROR_SIZE];
+ void *conv_from_network_cb = NULL;
+ void *conv_to_network_cb = NULL;
+ void *conv_from_utf8_cb = NULL;
+ void *interleavecb = NULL;
+ char *stringpointerextra=(char *)"moooo";
+ struct curl_slist *slist=NULL;
+ struct curl_httppost *httppost=NULL;
+ FILE *stream = stderr;
+ struct data object;
+ char *charp;
+ long val;
+ curl_off_t oval;
+ double dval;
+ curl_socket_t sockfd;
+ struct curl_certinfo *certinfo;
+ struct curl_tlssessioninfo *tlssession;
+ CURLcode res = CURLE_OK;
+ (void)URL; /* not used */
+ easy_init(dep);
+ easy_init(curl);
+ share = curl_share_init();
+ if(!share) {
+ res = CURLE_OUT_OF_MEMORY;
+ goto test_cleanup;
+ }
+
+HEADER
+ ;
+
+while(<STDIN>) {
+ if($_ =~ /^ CINIT\(([^ ]*), ([^ ]*), (\d*)\)/) {
+ my ($name, $type, $val)=($1, $2, $3);
+ my $w=" ";
+ my $pref = "${w}res = curl_easy_setopt(curl, CURLOPT_$name,";
+ my $i = ' ' x (length($w) + 23);
+ my $check = " if(UNEX(res)) {\n err(\"$name\", res, __LINE__); goto test_cleanup; }\n";
+ if($type eq "STRINGPOINT") {
+ print "${pref} \"string\");\n$check";
+ print "${pref} NULL);\n$check";
+ }
+ elsif($type eq "LONG") {
+ print "${pref} 0L);\n$check";
+ print "${pref} 22L);\n$check";
+ print "${pref} LO);\n$check";
+ print "${pref} HI);\n$check";
+ }
+ elsif($type eq "OBJECTPOINT") {
+ if($name =~ /DEPENDS/) {
+ print "${pref} dep);\n$check";
+ }
+ elsif($name =~ "SHARE") {
+ print "${pref} share);\n$check";
+ }
+ elsif($name eq "ERRORBUFFER") {
+ print "${pref} errorbuffer);\n$check";
+ }
+ elsif(($name eq "POSTFIELDS") ||
+ ($name eq "COPYPOSTFIELDS")) {
+ # set size to zero to avoid it being "illegal"
+ 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";
+ }
+ elsif($name eq "STDERR") {
+ print "${pref} stream);\n$check";
+ }
+ else {
+ print "${pref} &object);\n$check";
+ }
+ print "${pref} NULL);\n$check";
+ }
+ elsif($type eq "FUNCTIONPOINT") {
+ if($name =~ /([^ ]*)FUNCTION/) {
+ my $l=lc($1);
+ print "${pref}\n$i${l}cb);\n$check";
+ }
+ else {
+ print "${pref} &func);\n$check";
+ }
+ print "${pref} NULL);\n$check";
+ }
+ elsif($type eq "OFF_T") {
+ # play conservative to work with 32bit curl_off_t
+ print "${pref} OFF_NO);\n$check";
+ print "${pref} OFF_HI);\n$check";
+ print "${pref} OFF_LO);\n$check";
+ }
+ else {
+ print STDERR "\n---- $type\n";
+ }
+ }
+ elsif($_ =~ /^ CURLINFO_NONE/) {
+ $infomode = 1;
+ }
+ elsif($infomode &&
+ ($_ =~ /^ CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
+ my ($info, $type)=($1, $2);
+ my $c = " res = curl_easy_getinfo(curl, CURLINFO_$info,";
+ my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__); goto test_cleanup; }\n";
+ if($type eq "STRING") {
+ print "$c &charp);\n$check";
+ }
+ elsif($type eq "LONG") {
+ print "$c &val);\n$check";
+ }
+ elsif($type eq "OFF_T") {
+ print "$c &oval);\n$check";
+ }
+ elsif($type eq "DOUBLE") {
+ print "$c &dval);\n$check";
+ }
+ elsif($type eq "SLIST") {
+ print "$c &slist);\n$check";
+ print " if(slist)\n curl_slist_free_all(slist);\n";
+ }
+ elsif($type eq "SOCKET") {
+ print "$c &sockfd);\n$check";
+ }
+ elsif($type eq "PTR") {
+ if($info eq "CERTINFO") {
+ print "$c &certinfo);\n$check";
+ }
+ elsif(($info eq "TLS_SESSION") ||
+ ($info eq "TLS_SSL_PTR")) {
+ print "$c &tlssession);\n$check";
+ }
+ else {
+ print STDERR "$info/$type is unsupported\n";
+ }
+ }
+ else {
+ print STDERR "$type is unsupported\n";
+ }
+ }
+}
+
+
+print <<FOOTER
+ curl_easy_setopt(curl, 1, 0);
+ res = CURLE_OK;
+test_cleanup:
+ curl_easy_cleanup(curl);
+ curl_easy_cleanup(dep);
+ curl_share_cleanup(share);
+
+ return (int)res;
+}
+FOOTER
+ ;
diff --git a/tests/libtest/test.h b/tests/libtest/test.h
index 3da03b83..bb1acca0 100644
--- a/tests/libtest/test.h
+++ b/tests/libtest/test.h
@@ -67,7 +67,7 @@ extern void wait_ms(int ms); /* wait this many milliseconds */
extern int test(char *URL); /* the actual test function provided by each
individual libXXX.c file */
-extern char *hexdump(unsigned char *buffer, size_t len);
+extern char *hexdump(const unsigned char *buffer, size_t len);
#ifdef UNITTESTS
extern int unitfail;
diff --git a/tests/libtest/test613.pl b/tests/libtest/test613.pl
index b4caaae0..03d09cb5 100755
--- a/tests/libtest/test613.pl
+++ b/tests/libtest/test613.pl
@@ -30,6 +30,8 @@ if ($ARGV[0] eq "prepare")
binmode FILE;
print FILE "Test file to support curl test suite\n";
close(FILE);
+ # The mtime is specifically chosen to be an even number so that it can be
+ # represented exactly on a FAT filesystem.
utime time, timegm(0,0,12,1,0,100), "plainfile.txt";
chmod 0666, "plainfile.txt";
@@ -37,6 +39,8 @@ if ($ARGV[0] eq "prepare")
binmode FILE;
print FILE "Read-only test file to support curl test suite\n";
close(FILE);
+ # The mtime is specifically chosen to be an even number so that it can be
+ # represented exactly on a FAT filesystem.
utime time, timegm(0,0,12,31,11,100), "rofile.txt";
chmod 0444, "rofile.txt";
diff --git a/tests/libtest/testtrace.c b/tests/libtest/testtrace.c
index 5eeeeb65..62641e15 100644
--- a/tests/libtest/testtrace.c
+++ b/tests/libtest/testtrace.c
@@ -113,6 +113,7 @@ int libtest_debug_cb(CURL *handle, curl_infotype type,
switch(type) {
case CURLINFO_TEXT:
fprintf(stderr, "%s== Info: %s", timestr, (char *)data);
+ /* FALLTHROUGH */
default: /* in case a new one is introduced to shock us */
return 0;
diff --git a/tests/libtest/testutil.c b/tests/libtest/testutil.c
index b9c43de0..f3ad0ce5 100644
--- a/tests/libtest/testutil.c
+++ b/tests/libtest/testutil.c
@@ -111,10 +111,11 @@ struct timeval tutil_tvnow(void)
*/
long tutil_tvdiff(struct timeval newer, struct timeval older)
{
- return (newer.tv_sec-older.tv_sec)*1000+
- (newer.tv_usec-older.tv_usec)/1000;
+ return (long)(newer.tv_sec-older.tv_sec)*1000+
+ (long)(newer.tv_usec-older.tv_usec)/1000;
}
+
/*
* Same as tutil_tvdiff but with full usec resolution.
*
@@ -125,13 +126,5 @@ double tutil_tvdiff_secs(struct timeval newer, struct timeval older)
if(newer.tv_sec != older.tv_sec)
return (double)(newer.tv_sec-older.tv_sec)+
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
- else
- return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
-}
-
-/* return the number of seconds in the given input timeval struct */
-long tutil_tvlong(struct timeval t1)
-{
- return t1.tv_sec;
+ return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
}
-
diff --git a/tests/libtest/testutil.h b/tests/libtest/testutil.h
index 0bc5e03b..f2aeae64 100644
--- a/tests/libtest/testutil.h
+++ b/tests/libtest/testutil.h
@@ -40,8 +40,6 @@ long tutil_tvdiff(struct timeval t1, struct timeval t2);
*/
double tutil_tvdiff_secs(struct timeval t1, struct timeval t2);
-long tutil_tvlong(struct timeval t1);
-
#endif /* HEADER_CURL_LIBTEST_TESTUTIL_H */
diff --git a/tests/manpage-scan.pl b/tests/manpage-scan.pl
index f374be99..b6864c85 100644
--- a/tests/manpage-scan.pl
+++ b/tests/manpage-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016, 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
@@ -39,8 +39,9 @@
use strict;
use warnings;
-# we may get the dir root pointed out
+# we may get the dir roots pointed out
my $root=$ARGV[0] || ".";
+my $buildroot=$ARGV[1] || ".";
my $syms = "$root/docs/libcurl/symbols-in-versions";
my $curlh = "$root/include/curl/curl.h";
my $errors=0;
@@ -196,7 +197,8 @@ close(R);
#########################################################################
# parse the curl.1 man page, extract all documented command line options
-open(R, "<$root/docs/curl.1") ||
+# The man page may or may not be rebuilt, so check both possible locations
+open(R, "<$buildroot/docs/curl.1") || open(R, "<$root/docs/curl.1") ||
die "no input file";
my @manpage; # store all parsed parameters
while(<R>) {
@@ -230,7 +232,7 @@ my @toolhelp; # store all parsed parameters
while(<R>) {
chomp;
my $l= $_;
- if(/^ \" *(.*)/) {
+ if(/^ \{\" *(.*)/) {
my $str=$1;
my $combo;
if($str =~ /^-(.), --([a-z0-9.-]*)/) {
diff --git a/tests/python_dependencies/impacket/__init__.py b/tests/python_dependencies/impacket/__init__.py
new file mode 100644
index 00000000..92a5d6bb
--- /dev/null
+++ b/tests/python_dependencies/impacket/__init__.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (@agsolino)
+#
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+try: # Python 2.7+
+ from logging import NullHandler
+except ImportError:
+ class NullHandler(logging.Handler):
+ def emit(self, record):
+ pass
+
+# All modules inside this library MUST use this logger (impacket)
+# It is up to the library consumer to do whatever is wanted
+# with the logger output. By default it is forwarded to the
+# upstream logger
+
+LOG = logging.getLogger(__name__)
+LOG.addHandler(NullHandler())
diff --git a/tests/python_dependencies/impacket/nmb.py b/tests/python_dependencies/impacket/nmb.py
new file mode 100644
index 00000000..dc8777e6
--- /dev/null
+++ b/tests/python_dependencies/impacket/nmb.py
@@ -0,0 +1,980 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+
+
+# -*- mode: python; tab-width: 4 -*-
+#
+# Copyright (C) 2001 Michael Teo <michaelteo@bigfoot.com>
+# nmb.py - NetBIOS library
+#
+# This software is provided 'as-is', without any express or implied warranty.
+# In no event will the author be held liable for any damages arising from the
+# use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software
+# in a product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+#
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+#
+# 3. This notice cannot be removed or altered from any source distribution.
+#
+# Altered source done by Alberto Solino (@agsolino)
+
+import socket
+import string
+import re
+import select
+import errno
+from random import randint
+from struct import pack, unpack
+import time
+
+from structure import Structure
+
+CVS_REVISION = '$Revision: 526 $'
+
+# Taken from socket module reference
+INADDR_ANY = '0.0.0.0'
+BROADCAST_ADDR = '<broadcast>'
+
+# Default port for NetBIOS name service
+NETBIOS_NS_PORT = 137
+# Default port for NetBIOS session service
+NETBIOS_SESSION_PORT = 139
+
+# Default port for SMB session service
+SMB_SESSION_PORT = 445
+
+# Owner Node Type Constants
+NODE_B = 0x0000
+NODE_P = 0x2000
+NODE_M = 0x4000
+NODE_RESERVED = 0x6000
+NODE_GROUP = 0x8000
+NODE_UNIQUE = 0x0
+
+# Name Type Constants
+TYPE_UNKNOWN = 0x01
+TYPE_WORKSTATION = 0x00
+TYPE_CLIENT = 0x03
+TYPE_SERVER = 0x20
+TYPE_DOMAIN_MASTER = 0x1B
+TYPE_DOMAIN_CONTROLLER = 0x1C
+TYPE_MASTER_BROWSER = 0x1D
+TYPE_BROWSER = 0x1E
+TYPE_NETDDE = 0x1F
+TYPE_STATUS = 0x21
+
+# Opcodes values
+OPCODE_QUERY = 0
+OPCODE_REGISTRATION = 0x5
+OPCODE_RELEASE = 0x6
+OPCODE_WACK = 0x7
+OPCODE_REFRESH = 0x8
+OPCODE_REQUEST = 0
+OPCODE_RESPONSE = 0x10
+
+# NM_FLAGS
+NM_FLAGS_BROADCAST = 0x1
+NM_FLAGS_UNICAST = 0
+NM_FLAGS_RA = 0x8
+NM_FLAGS_RD = 0x10
+NM_FLAGS_TC = 0x20
+NM_FLAGS_AA = 0x40
+
+# QUESTION_TYPE
+QUESTION_TYPE_NB = 0x20 # NetBIOS general Name Service Resource Record
+QUESTION_TYPE_NBSTAT = 0x21 # NetBIOS NODE STATUS Resource Record
+# QUESTION_CLASS
+QUESTION_CLASS_IN = 0x1 # Internet class
+
+# RR_TYPE Resource Record Type code
+RR_TYPE_A = 0x1 # IP address Resource Record
+RR_TYPE_NS = 0x2 # Name Server Resource Record
+RR_TYPE_NULL = 0xA # NULL Resource Record
+RR_TYPE_NB = 0x20 # NetBIOS general Name Service Resource Record
+RR_TYPE_NBSTAT = 0x21 # NetBIOS NODE STATUS Resource Record
+
+# Resource Record Class
+RR_CLASS_IN = 1 # Internet class
+
+# RCODE values
+RCODE_FMT_ERR = 0x1 # Format Error. Request was invalidly formatted.
+RCODE_SRV_ERR = 0x2 # Server failure. Problem with NBNS, cannot process name.
+RCODE_IMP_ERR = 0x4 # Unsupported request error. Allowable only for challenging NBNS when gets an Update type
+ # registration request.
+RCODE_RFS_ERR = 0x5 # Refused error. For policy reasons server will not register this name from this host.
+RCODE_ACT_ERR = 0x6 # Active error. Name is owned by another node.
+RCODE_CFT_ERR = 0x7 # Name in conflict error. A UNIQUE name is owned by more than one node.
+
+# NAME_FLAGS
+NAME_FLAGS_PRM = 0x0200 # Permanent Name Flag. If one (1) then entry is for the permanent node name. Flag is zero
+ # (0) for all other names.
+NAME_FLAGS_ACT = 0x0400 # Active Name Flag. All entries have this flag set to one (1).
+NAME_FLAG_CNF = 0x0800 # Conflict Flag. If one (1) then name on this node is in conflict.
+NAME_FLAG_DRG = 0x1000 # Deregister Flag. If one (1) then this name is in the process of being deleted.
+
+NAME_TYPES = { TYPE_UNKNOWN: 'Unknown', TYPE_WORKSTATION: 'Workstation', TYPE_CLIENT: 'Client',
+ TYPE_SERVER: 'Server', TYPE_MASTER_BROWSER: 'Master Browser', TYPE_BROWSER: 'Browser Server',
+ TYPE_DOMAIN_MASTER: 'Domain Master' , TYPE_NETDDE: 'NetDDE Server'}
+# NetBIOS Session Types
+NETBIOS_SESSION_MESSAGE = 0x0
+NETBIOS_SESSION_REQUEST = 0x81
+NETBIOS_SESSION_POSITIVE_RESPONSE = 0x82
+NETBIOS_SESSION_NEGATIVE_RESPONSE = 0x83
+NETBIOS_SESSION_RETARGET_RESPONSE = 0x84
+NETBIOS_SESSION_KEEP_ALIVE = 0x85
+
+
+def strerror(errclass, errcode):
+ if errclass == ERRCLASS_OS:
+ return 'OS Error', str(errcode)
+ elif errclass == ERRCLASS_QUERY:
+ return 'Query Error', QUERY_ERRORS.get(errcode, 'Unknown error')
+ elif errclass == ERRCLASS_SESSION:
+ return 'Session Error', SESSION_ERRORS.get(errcode, 'Unknown error')
+ else:
+ return 'Unknown Error Class', 'Unknown Error'
+
+
+
+class NetBIOSError(Exception): pass
+class NetBIOSTimeout(Exception):
+ def __init__(self, message = 'The NETBIOS connection with the remote host timed out.'):
+ Exception.__init__(self, message)
+
+class NBResourceRecord:
+ def __init__(self, data = 0):
+ self._data = data
+ try:
+ if self._data:
+ self.rr_name = (re.split('\x00',data))[0]
+ offset = len(self.rr_name)+1
+ self.rr_type = unpack('>H', self._data[offset:offset+2])[0]
+ self.rr_class = unpack('>H', self._data[offset+2: offset+4])[0]
+ self.ttl = unpack('>L',self._data[offset+4:offset+8])[0]
+ self.rdlength = unpack('>H', self._data[offset+8:offset+10])[0]
+ self.rdata = self._data[offset+10:offset+10+self.rdlength]
+ offset = self.rdlength - 2
+ self.unit_id = data[offset:offset+6]
+ else:
+ self.rr_name = ''
+ self.rr_type = 0
+ self.rr_class = 0
+ self.ttl = 0
+ self.rdlength = 0
+ self.rdata = ''
+ self.unit_id = ''
+ except Exception:
+ raise NetBIOSError( 'Wrong packet format ' )
+
+ def set_rr_name(self, name):
+ self.rr_name = name
+ def set_rr_type(self, name):
+ self.rr_type = name
+ def set_rr_class(self,cl):
+ self.rr_class = cl
+ def set_ttl(self,ttl):
+ self.ttl = ttl
+ def set_rdata(self,rdata):
+ self.rdata = rdata
+ self.rdlength = len(rdata)
+ def get_unit_id(self):
+ return self.unit_id
+ def get_rr_name(self):
+ return self.rr_name
+ def get_rr_class(self):
+ return self.rr_class
+ def get_ttl(self):
+ return self.ttl
+ def get_rdlength(self):
+ return self.rdlength
+ def get_rdata(self):
+ return self.rdata
+ def rawData(self):
+ return self.rr_name + pack('!HHLH',self.rr_type, self.rr_class, self.ttl, self.rdlength) + self.rdata
+
+class NBNodeStatusResponse(NBResourceRecord):
+ def __init__(self, data = 0):
+ NBResourceRecord.__init__(self,data)
+ self.num_names = 0
+ self.node_names = [ ]
+ self.statstics = ''
+ self.mac = '00-00-00-00-00-00'
+ try:
+ if data:
+ self._data = self.get_rdata()
+ self.num_names = unpack('>B',self._data[:1])[0]
+ offset = 1
+ for i in range(0, self.num_names):
+ name = self._data[offset:offset + 15]
+ type,flags = unpack('>BH', self._data[offset + 15: offset + 18])
+ offset += 18
+ self.node_names.append(NBNodeEntry(name, type ,flags))
+ self.set_mac_in_hexa(self.get_unit_id())
+ except Exception:
+ raise NetBIOSError( 'Wrong packet format ' )
+
+ def set_mac_in_hexa(self, data):
+ data_aux = ''
+ for d in data:
+ if data_aux == '':
+ data_aux = '%02x' % ord(d)
+ else:
+ data_aux += '-%02x' % ord(d)
+ self.mac = string.upper(data_aux)
+
+ def get_num_names(self):
+ return self.num_names
+ def get_mac(self):
+ return self.mac
+ def set_num_names(self, num):
+ self.num_names = num
+ def get_node_names(self):
+ return self.node_names
+ def add_node_name(self,node_names):
+ self.node_names.append(node_names)
+ self.num_names += 1
+ def rawData(self):
+ res = pack('!B', self.num_names )
+ for i in range(0, self.num_names):
+ res += self.node_names[i].rawData()
+
+class NBPositiveNameQueryResponse(NBResourceRecord):
+ def __init__(self, data = 0):
+ NBResourceRecord.__init__(self, data)
+ self.addr_entries = [ ]
+ if data:
+ self._data = self.get_rdata()
+ _qn_length, qn_name, qn_scope = decode_name(data)
+ self._netbios_name = string.rstrip(qn_name[:-1]) + qn_scope
+ self._name_type = ord(qn_name[-1])
+ self._nb_flags = unpack('!H', self._data[:2])
+ offset = 2
+ while offset<len(self._data):
+ self.addr_entries.append('%d.%d.%d.%d' % unpack('4B', (self._data[offset:offset+4])))
+ offset += 4
+
+ def get_netbios_name(self):
+ return self._netbios_name
+
+ def get_name_type(self):
+ return self._name_type
+
+ def get_addr_entries(self):
+ return self.addr_entries
+
+class NetBIOSPacket:
+ """ This is a packet as defined in RFC 1002 """
+ def __init__(self, data = 0):
+ self.name_trn_id = 0x0 # Transaction ID for Name Service Transaction.
+ # Requestor places a unique value for each active
+ # transaction. Responder puts NAME_TRN_ID value
+ # from request packet in response packet.
+ self.opcode = 0 # Packet type code
+ self.nm_flags = 0 # Flags for operation
+ self.rcode = 0 # Result codes of request.
+ self.qdcount = 0 # Unsigned 16 bit integer specifying the number of entries in the question section of a Name
+ self.ancount = 0 # Unsigned 16 bit integer specifying the number of
+ # resource records in the answer section of a Name
+ # Service packet.
+ self.nscount = 0 # Unsigned 16 bit integer specifying the number of
+ # resource records in the authority section of a
+ # Name Service packet.
+ self.arcount = 0 # Unsigned 16 bit integer specifying the number of
+ # resource records in the additional records
+ # section of a Name Service packeT.
+ self.questions = ''
+ self.answers = ''
+ if data == 0:
+ self._data = ''
+ else:
+ try:
+ self._data = data
+ self.opcode = ord(data[2]) >> 3
+ self.nm_flags = ((ord(data[2]) & 0x3) << 4) | ((ord(data[3]) & 0xf0) >> 4)
+ self.name_trn_id = unpack('>H', self._data[:2])[0]
+ self.rcode = ord(data[3]) & 0x0f
+ self.qdcount = unpack('>H', self._data[4:6])[0]
+ self.ancount = unpack('>H', self._data[6:8])[0]
+ self.nscount = unpack('>H', self._data[8:10])[0]
+ self.arcount = unpack('>H', self._data[10:12])[0]
+ self.answers = self._data[12:]
+ except Exception:
+ raise NetBIOSError( 'Wrong packet format ' )
+
+ def set_opcode(self, opcode):
+ self.opcode = opcode
+ def set_trn_id(self, trn):
+ self.name_trn_id = trn
+ def set_nm_flags(self, nm_flags):
+ self.nm_flags = nm_flags
+ def set_rcode(self, rcode):
+ self.rcode = rcode
+ def addQuestion(self, question, qtype, qclass):
+ self.qdcount += 1
+ self.questions += question + pack('!HH',qtype,qclass)
+ def get_trn_id(self):
+ return self.name_trn_id
+ def get_rcode(self):
+ return self.rcode
+ def get_nm_flags(self):
+ return self.nm_flags
+ def get_opcode(self):
+ return self.opcode
+ def get_qdcount(self):
+ return self.qdcount
+ def get_ancount(self):
+ return self.ancount
+ def get_nscount(self):
+ return self.nscount
+ def get_arcount(self):
+ return self.arcount
+ def rawData(self):
+ secondWord = self.opcode << 11
+ secondWord |= self.nm_flags << 4
+ secondWord |= self.rcode
+ data = pack('!HHHHHH', self.name_trn_id, secondWord , self.qdcount, self.ancount, self.nscount, self.arcount) + self.questions + self.answers
+ return data
+ def get_answers(self):
+ return self.answers
+
+class NBHostEntry:
+
+ def __init__(self, nbname, nametype, ip):
+ self.__nbname = nbname
+ self.__nametype = nametype
+ self.__ip = ip
+
+ def get_nbname(self):
+ return self.__nbname
+
+ def get_nametype(self):
+ return self.__nametype
+
+ def get_ip(self):
+ return self.__ip
+
+ def __repr__(self):
+ return '<NBHostEntry instance: NBname="' + self.__nbname + '", IP="' + self.__ip + '">'
+
+class NBNodeEntry:
+
+ def __init__(self, nbname, nametype, flags):
+ self.__nbname = string.ljust(nbname,17)
+ self.__nametype = nametype
+ self.__flags = flags
+ self.__isgroup = flags & 0x8000
+ self.__nodetype = flags & 0x6000
+ self.__deleting = flags & 0x1000
+ self.__isconflict = flags & 0x0800
+ self.__isactive = flags & 0x0400
+ self.__ispermanent = flags & 0x0200
+
+ def get_nbname(self):
+ return self.__nbname
+
+ def get_nametype(self):
+ return self.__nametype
+
+ def is_group(self):
+ return self.__isgroup
+
+ def get_nodetype(self):
+ return self.__nodetype
+
+ def is_deleting(self):
+ return self.__deleting
+
+ def is_conflict(self):
+ return self.__isconflict
+
+ def is_active(self):
+ return self.__isactive
+
+ def is_permanent(self):
+ return self.__ispermanent
+
+ def set_nbname(self, name):
+ self.__nbname = string.ljust(name,17)
+
+ def set_nametype(self, type):
+ self.__nametype = type
+
+ def set_flags(self,flags):
+ self.__flags = flags
+
+ def __repr__(self):
+ s = '<NBNodeEntry instance: NBname="' + self.__nbname + '" NameType="' + NAME_TYPES[self.__nametype] + '"'
+ if self.__isactive:
+ s += ' ACTIVE'
+ if self.__isgroup:
+ s += ' GROUP'
+ if self.__isconflict:
+ s += ' CONFLICT'
+ if self.__deleting:
+ s += ' DELETING'
+ return s
+ def rawData(self):
+ return self.__nbname + pack('!BH',self.__nametype, self.__flags)
+
+
+class NetBIOS:
+
+ # Creates a NetBIOS instance without specifying any default NetBIOS domain nameserver.
+ # All queries will be sent through the servport.
+ def __init__(self, servport = NETBIOS_NS_PORT):
+ self.__servport = NETBIOS_NS_PORT
+ self.__nameserver = None
+ self.__broadcastaddr = BROADCAST_ADDR
+ self.mac = '00-00-00-00-00-00'
+
+ def _setup_connection(self, dstaddr):
+ port = randint(10000, 60000)
+ af, socktype, proto, _canonname, _sa = socket.getaddrinfo(dstaddr, port, socket.AF_INET, socket.SOCK_DGRAM)[0]
+ s = socket.socket(af, socktype, proto)
+ has_bind = 1
+ for _i in range(0, 10):
+ # We try to bind to a port for 10 tries
+ try:
+ s.bind(( INADDR_ANY, randint(10000, 60000) ))
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+ has_bind = 1
+ except socket.error:
+ pass
+ if not has_bind:
+ raise NetBIOSError, ( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN )
+ self.__sock = s
+
+ # Set the default NetBIOS domain nameserver.
+ def set_nameserver(self, nameserver):
+ self.__nameserver = nameserver
+
+ # Return the default NetBIOS domain nameserver, or None if none is specified.
+ def get_nameserver(self):
+ return self.__nameserver
+
+ # Set the broadcast address to be used for query.
+ def set_broadcastaddr(self, broadcastaddr):
+ self.__broadcastaddr = broadcastaddr
+
+ # Return the broadcast address to be used, or BROADCAST_ADDR if default broadcast address is used.
+ def get_broadcastaddr(self):
+ return self.__broadcastaddr
+
+ # Returns a NBPositiveNameQueryResponse instance containing the host information for nbname.
+ # If a NetBIOS domain nameserver has been specified, it will be used for the query.
+ # Otherwise, the query is broadcasted on the broadcast address.
+ def gethostbyname(self, nbname, qtype = TYPE_WORKSTATION, scope = None, timeout = 1):
+ return self.__queryname(nbname, self.__nameserver, qtype, scope, timeout)
+
+ # Returns a list of NBNodeEntry instances containing node status information for nbname.
+ # If destaddr contains an IP address, then this will become an unicast query on the destaddr.
+ # Raises NetBIOSTimeout if timeout (in secs) is reached.
+ # Raises NetBIOSError for other errors
+ def getnodestatus(self, nbname, destaddr = None, type = TYPE_WORKSTATION, scope = None, timeout = 1):
+ if destaddr:
+ return self.__querynodestatus(nbname, destaddr, type, scope, timeout)
+ else:
+ return self.__querynodestatus(nbname, self.__nameserver, type, scope, timeout)
+
+ def getnetbiosname(self, ip):
+ entries = self.getnodestatus('*',ip)
+ entries = filter(lambda x:x.get_nametype() == TYPE_SERVER, entries)
+ return entries[0].get_nbname().strip()
+
+ def getmacaddress(self):
+ return self.mac
+
+ def __queryname(self, nbname, destaddr, qtype, scope, timeout, retries = 0):
+ self._setup_connection(destaddr)
+ trn_id = randint(1, 32000)
+ p = NetBIOSPacket()
+ p.set_trn_id(trn_id)
+ netbios_name = nbname.upper()
+ qn_label = encode_name(netbios_name, qtype, scope)
+ p.addQuestion(qn_label, QUESTION_TYPE_NB, QUESTION_CLASS_IN)
+ p.set_nm_flags(NM_FLAGS_RD)
+ if not destaddr:
+ p.set_nm_flags(p.get_nm_flags() | NM_FLAGS_BROADCAST)
+ destaddr = self.__broadcastaddr
+ req = p.rawData()
+
+ tries = retries
+ while 1:
+ self.__sock.sendto(req, ( destaddr, self.__servport ))
+ try:
+ ready, _, _ = select.select([ self.__sock.fileno() ], [ ] , [ ], timeout)
+ if not ready:
+ if tries:
+ # Retry again until tries == 0
+ tries -= 1
+ else:
+ raise NetBIOSTimeout
+ else:
+ data, _ = self.__sock.recvfrom(65536, 0)
+
+ res = NetBIOSPacket(data)
+ if res.get_trn_id() == p.get_trn_id():
+ if res.get_rcode():
+ if res.get_rcode() == 0x03:
+ return None
+ else:
+ 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:
+ if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
+ raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
+ raise
+
+
+ def __querynodestatus(self, nbname, destaddr, type, scope, timeout):
+ self._setup_connection(destaddr)
+ trn_id = randint(1, 32000)
+ p = NetBIOSPacket()
+ p.set_trn_id(trn_id)
+ netbios_name = string.upper(nbname)
+ qn_label = encode_name(netbios_name, type, scope)
+ p.addQuestion(qn_label, QUESTION_TYPE_NBSTAT, QUESTION_CLASS_IN)
+
+ if not destaddr:
+ p.set_nm_flags(NM_FLAGS_BROADCAST)
+ destaddr = self.__broadcastaddr
+ req = p.rawData()
+ tries = 3
+ while 1:
+ try:
+ self.__sock.sendto(req, 0, ( destaddr, self.__servport ))
+ ready, _, _ = select.select([ self.__sock.fileno() ], [ ] , [ ], timeout)
+ if not ready:
+ if tries:
+ # Retry again until tries == 0
+ tries -= 1
+ else:
+ raise NetBIOSTimeout
+ else:
+ try:
+ data, _ = self.__sock.recvfrom(65536, 0)
+ except Exception, 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"
+ else:
+ 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:
+ 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)
+
+# Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
+def encode_name(name, type, scope):
+ if name == '*':
+ name += '\0' * 15
+ elif len(name) > 15:
+ name = name[:15] + chr(type)
+ else:
+ name = string.ljust(name, 15) + chr(type)
+
+ encoded_name = chr(len(name) * 2) + re.sub('.', _do_first_level_encoding, name)
+ if scope:
+ encoded_scope = ''
+ for s in string.split(scope, '.'):
+ encoded_scope = encoded_scope + chr(len(s)) + s
+ return encoded_name + encoded_scope + '\0'
+ else:
+ return encoded_name + '\0'
+
+# Internal method for use in encode_name()
+def _do_first_level_encoding(m):
+ s = ord(m.group(0))
+ return string.uppercase[s >> 4] + string.uppercase[s & 0x0f]
+
+def decode_name(name):
+ name_length = ord(name[0])
+ assert name_length == 32
+
+ decoded_name = re.sub('..', _do_first_level_decoding, name[1:33])
+ if name[33] == '\0':
+ return 34, decoded_name, ''
+ else:
+ decoded_domain = ''
+ offset = 34
+ while 1:
+ domain_length = ord(name[offset])
+ if domain_length == 0:
+ break
+ decoded_domain = '.' + name[offset:offset + domain_length]
+ offset += domain_length
+ return offset + 1, decoded_name, decoded_domain
+
+def _do_first_level_decoding(m):
+ s = m.group(0)
+ return chr(((ord(s[0]) - ord('A')) << 4) | (ord(s[1]) - ord('A')))
+
+
+
+class NetBIOSSessionPacket:
+ def __init__(self, data = 0):
+ self.type = 0x0
+ self.flags = 0x0
+ self.length = 0x0
+ if data == 0:
+ self._trailer = ''
+ else:
+ try:
+ self.type = ord(data[0])
+ if self.type == NETBIOS_SESSION_MESSAGE:
+ self.length = ord(data[1]) << 16 | (unpack('!H', data[2:4])[0])
+ else:
+ self.flags = ord(data[1])
+ self.length = unpack('!H', data[2:4])[0]
+
+ self._trailer = data[4:]
+ except:
+ raise NetBIOSError( 'Wrong packet format ' )
+
+ def set_type(self, type):
+ self.type = type
+ def get_type(self):
+ return self.type
+ def rawData(self):
+ if self.type == NETBIOS_SESSION_MESSAGE:
+ data = pack('!BBH',self.type,self.length >> 16,self.length & 0xFFFF) + self._trailer
+ else:
+ data = pack('!BBH',self.type,self.flags,self.length) + self._trailer
+ return data
+ def set_trailer(self,data):
+ self._trailer = data
+ self.length = len(data)
+ def get_length(self):
+ return self.length
+ def get_trailer(self):
+ return self._trailer
+
+class NetBIOSSession:
+ def __init__(self, myname, remote_name, remote_host, remote_type = TYPE_SERVER, sess_port = NETBIOS_SESSION_PORT, timeout = None, local_type = TYPE_WORKSTATION, sock = None):
+ if len(myname) > 15:
+ self.__myname = string.upper(myname[:15])
+ else:
+ self.__myname = string.upper(myname)
+ self.__local_type = local_type
+
+ assert remote_name
+ # if destination port SMB_SESSION_PORT and remote name *SMBSERVER, we're changing it to its IP address
+ # helping solving the client mistake ;)
+ if remote_name == '*SMBSERVER' and sess_port == SMB_SESSION_PORT:
+ remote_name = remote_host
+ # If remote name is *SMBSERVER let's try to query its name.. if can't be guessed, continue and hope for the best
+ if remote_name == '*SMBSERVER':
+ nb = NetBIOS()
+
+ try:
+ res = nb.getnetbiosname(remote_host)
+ except:
+ res = None
+ pass
+
+ if res is not None:
+ remote_name = res
+
+ if len(remote_name) > 15:
+ self.__remote_name = string.upper(remote_name[:15])
+ else:
+ self.__remote_name = string.upper(remote_name)
+ self.__remote_type = remote_type
+
+ self.__remote_host = remote_host
+
+ if sock is not None:
+ # We are acting as a server
+ self._sock = sock
+ else:
+ self._sock = self._setup_connection((remote_host, sess_port))
+
+ if sess_port == NETBIOS_SESSION_PORT:
+ self._request_session(remote_type, local_type, timeout)
+
+ def get_myname(self):
+ return self.__myname
+
+ def get_mytype(self):
+ return self.__local_type
+
+ def get_remote_host(self):
+ return self.__remote_host
+
+ def get_remote_name(self):
+ return self.__remote_name
+
+ def get_remote_type(self):
+ return self.__remote_type
+
+ def close(self):
+ self._sock.close()
+
+ def get_socket(self):
+ return self._sock
+
+class NetBIOSUDPSessionPacket(Structure):
+ TYPE_DIRECT_UNIQUE = 16
+ TYPE_DIRECT_GROUP = 17
+
+ FLAGS_MORE_FRAGMENTS = 1
+ FLAGS_FIRST_FRAGMENT = 2
+ FLAGS_B_NODE = 0
+
+ structure = (
+ ('Type','B=16'), # Direct Unique Datagram
+ ('Flags','B=2'), # FLAGS_FIRST_FRAGMENT
+ ('ID','<H'),
+ ('_SourceIP','>L'),
+ ('SourceIP','"'),
+ ('SourcePort','>H=138'),
+ ('DataLegth','>H-Data'),
+ ('Offset','>H=0'),
+ ('SourceName','z'),
+ ('DestinationName','z'),
+ ('Data',':'),
+ )
+
+ def getData(self):
+ addr = self['SourceIP'].split('.')
+ addr = [int(x) for x in addr]
+ addr = (((addr[0] << 8) + addr[1] << 8) + addr[2] << 8) + addr[3]
+ self['_SourceIP'] = addr
+ return Structure.getData(self)
+
+ def get_trailer(self):
+ return self['Data']
+
+class NetBIOSUDPSession(NetBIOSSession):
+ def _setup_connection(self, peer):
+ af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_DGRAM)[0]
+ sock = socket.socket(af, socktype, proto)
+ sock.connect(sa)
+
+ sock = socket.socket(af, socktype, proto)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock.bind((INADDR_ANY, 138))
+ self.peer = peer
+ return sock
+
+ def _request_session(self, remote_type, local_type, timeout = None):
+ pass
+
+ def next_id(self):
+ if hasattr(self, '__dgram_id'):
+ answer = self.__dgram_id
+ else:
+ self.__dgram_id = randint(1,65535)
+ answer = self.__dgram_id
+ self.__dgram_id += 1
+ return answer
+
+ def send_packet(self, data):
+ # Yes... I know...
+ self._sock.connect(self.peer)
+
+ p = NetBIOSUDPSessionPacket()
+ p['ID'] = self.next_id()
+ p['SourceIP'] = self._sock.getsockname()[0]
+ p['SourceName'] = encode_name(self.get_myname(), self.get_mytype(), '')[:-1]
+ p['DestinationName'] = encode_name(self.get_remote_name(), self.get_remote_type(), '')[:-1]
+ p['Data'] = data
+
+ self._sock.sendto(str(p), self.peer)
+ self._sock.close()
+
+ self._sock = self._setup_connection(self.peer)
+
+ def recv_packet(self, timeout = None):
+ # The next loop is a workaround for a bigger problem:
+ # When data reaches higher layers, the lower headers are lost,
+ # and with them, for example, the source IP. Hence, SMB users
+ # can't know where packets are comming from... we need a better
+ # solution, right now, we will filter everything except packets
+ # coming from the remote_host specified in __init__()
+
+ while 1:
+ data, peer = self._sock.recvfrom(8192)
+# print "peer: %r self.peer: %r" % (peer, self.peer)
+ if peer == self.peer: break
+
+ return NetBIOSUDPSessionPacket(data)
+
+class NetBIOSTCPSession(NetBIOSSession):
+ def __init__(self, myname, remote_name, remote_host, remote_type = TYPE_SERVER, sess_port = NETBIOS_SESSION_PORT, timeout = None, local_type = TYPE_WORKSTATION, sock = None, select_poll = False):
+ self.__select_poll = select_poll
+ if self.__select_poll:
+ self.read_function = self.polling_read
+ else:
+ self.read_function = self.non_polling_read
+ NetBIOSSession.__init__(self, myname, remote_name, remote_host, remote_type = remote_type, sess_port = sess_port, timeout = timeout, local_type = local_type, sock=sock)
+
+
+ def _setup_connection(self, peer):
+ try:
+ 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:
+ raise socket.error("Connection error (%s:%s)" % (peer[0], peer[1]), e)
+ return sock
+
+ def send_packet(self, data):
+ p = NetBIOSSessionPacket()
+ p.set_type(NETBIOS_SESSION_MESSAGE)
+ p.set_trailer(data)
+ self._sock.send(p.rawData())
+
+ def recv_packet(self, timeout = None):
+ data = self.__read(timeout)
+ return NetBIOSSessionPacket(data)
+
+ def _request_session(self, remote_type, local_type, timeout = None):
+ p = NetBIOSSessionPacket()
+ remote_name = encode_name(self.get_remote_name(), remote_type, '')
+ myname = encode_name(self.get_myname(), local_type, '')
+ p.set_type(NETBIOS_SESSION_REQUEST)
+ p.set_trailer(remote_name + myname)
+
+ self._sock.send(p.rawData())
+ 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]) )
+ elif p.get_type() == NETBIOS_SESSION_POSITIVE_RESPONSE:
+ break
+ else:
+ # Ignore all other messages, most probably keepalive messages
+ pass
+
+ def polling_read(self, read_length, timeout):
+ data = ''
+ if timeout is None:
+ timeout = 3600
+
+ time_left = timeout
+ CHUNK_TIME = 0.025
+ bytes_left = read_length
+
+ while bytes_left > 0:
+ try:
+ ready, _, _ = select.select([self._sock.fileno() ], [ ], [ ], 0)
+
+ if not ready:
+ if time_left <= 0:
+ raise NetBIOSTimeout
+ else:
+ time.sleep(CHUNK_TIME)
+ time_left -= CHUNK_TIME
+ continue
+
+ received = self._sock.recv(bytes_left)
+ if len(received) == 0:
+ raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
+
+ data = data + received
+ bytes_left = read_length - len(data)
+ except select.error, ex:
+ if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
+ raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
+
+ return data
+
+ def non_polling_read(self, read_length, timeout):
+ data = ''
+ bytes_left = read_length
+
+ while bytes_left > 0:
+ try:
+ ready, _, _ = select.select([self._sock.fileno() ], [ ], [ ], timeout)
+
+ if not ready:
+ raise NetBIOSTimeout
+
+ received = self._sock.recv(bytes_left)
+ if len(received) == 0:
+ raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
+
+ data = data + received
+ bytes_left = read_length - len(data)
+ except select.error, ex:
+ if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
+ raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
+
+ return data
+
+ def __read(self, timeout = None):
+ data = self.read_function(4, timeout)
+ type, flags, length = unpack('>ccH', data)
+ if ord(type) == NETBIOS_SESSION_MESSAGE:
+ length |= ord(flags) << 16
+ else:
+ if ord(flags) & 0x01:
+ length |= 0x10000
+ data2 = self.read_function(length, timeout)
+
+ return data + data2
+
+ERRCLASS_QUERY = 0x00
+ERRCLASS_SESSION = 0xf0
+ERRCLASS_OS = 0xff
+
+QUERY_ERRORS = { 0x01: 'Request format error. Please file a bug report.',
+ 0x02: 'Internal server error',
+ 0x03: 'Name does not exist',
+ 0x04: 'Unsupported request',
+ 0x05: 'Request refused'
+ }
+
+SESSION_ERRORS = { 0x80: 'Not listening on called name',
+ 0x81: 'Not listening for calling name',
+ 0x82: 'Called name not present',
+ 0x83: 'Sufficient resources',
+ 0x8f: 'Unspecified error'
+ }
+
+def main():
+ def get_netbios_host_by_name(name):
+ n = NetBIOS()
+ n.set_broadcastaddr('255.255.255.255') # To avoid use "<broadcast>" in socket
+ for qtype in (TYPE_WORKSTATION, TYPE_CLIENT, TYPE_SERVER, TYPE_DOMAIN_MASTER, TYPE_DOMAIN_CONTROLLER):
+ try:
+ addrs = n.gethostbyname(name, qtype = qtype).get_addr_entries()
+ except NetBIOSTimeout:
+ continue
+ else:
+ return addrs
+ raise Exception("Host not found")
+
+
+ n = get_netbios_host_by_name("some-host")
+ print n
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/python_dependencies/impacket/nt_errors.py b/tests/python_dependencies/impacket/nt_errors.py
new file mode 100644
index 00000000..cd7ef80a
--- /dev/null
+++ b/tests/python_dependencies/impacket/nt_errors.py
@@ -0,0 +1,3586 @@
+# Copyright (c) 2003-2016 CORE Security Technologies)
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (@agsolino)
+#
+# Description:
+# NT STATUS Errors from [MS-ERREF]. Ideally all the files
+# should grab the error codes from here (big ToDo)
+#
+
+ERROR_MESSAGES = {
+ 0x00000000: ("STATUS_SUCCESS","The operation completed successfully."),
+ 0x00000001: ("STATUS_WAIT_1","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
+ 0x00000002: ("STATUS_WAIT_2","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
+ 0x00000003: ("STATUS_WAIT_3","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
+ 0x0000003F: ("STATUS_WAIT_63","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
+ 0x00000080: ("STATUS_ABANDONED","The caller attempted to wait for a mutex that has been abandoned."),
+ 0x00000080: ("STATUS_ABANDONED_WAIT_0","The caller attempted to wait for a mutex that has been abandoned."),
+ 0x000000BF: ("STATUS_ABANDONED_WAIT_63","The caller attempted to wait for a mutex that has been abandoned."),
+ 0x000000C0: ("STATUS_USER_APC","A user-mode APC was delivered before the given Interval expired."),
+ 0x00000101: ("STATUS_ALERTED","The delay completed because the thread was alerted."),
+ 0x00000102: ("STATUS_TIMEOUT","The given Timeout interval expired."),
+ 0x00000103: ("STATUS_PENDING","The operation that was requested is pending completion."),
+ 0x00000104: ("STATUS_REPARSE","A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link."),
+ 0x00000105: ("STATUS_MORE_ENTRIES","Returned by enumeration APIs to indicate more information is available to successive calls."),
+ 0x00000106: ("STATUS_NOT_ALL_ASSIGNED","Indicates not all privileges or groups that are referenced are assigned to the caller. This allows, for example, all privileges to be disabled without having to know exactly which privileges are assigned."),
+ 0x00000107: ("STATUS_SOME_NOT_MAPPED","Some of the information to be translated has not been translated."),
+ 0x00000108: ("STATUS_OPLOCK_BREAK_IN_PROGRESS","An open/create operation completed while an opportunistic lock (oplock) break is underway."),
+ 0x00000109: ("STATUS_VOLUME_MOUNTED","A new volume has been mounted by a file system."),
+ 0x0000010A: ("STATUS_RXACT_COMMITTED","This success level status indicates that the transaction state already exists for the registry subtree but that a transaction commit was previously aborted. The commit has now been completed."),
+ 0x0000010B: ("STATUS_NOTIFY_CLEANUP","Indicates that a notify change request has been completed due to closing the handle that made the notify change request."),
+ 0x0000010C: ("STATUS_NOTIFY_ENUM_DIR","Indicates that a notify change request is being completed and that the information is not being returned in the caller's buffer. The caller now needs to enumerate the files to find the changes."),
+ 0x0000010D: ("STATUS_NO_QUOTAS_FOR_ACCOUNT","{No Quotas} No system quota limits are specifically set for this account."),
+ 0x0000010E: ("STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED","{Connect Failure on Primary Transport} An attempt was made to connect to the remote server %hs on the primary transport, but the connection failed. The computer WAS able to connect on a secondary transport."),
+ 0x00000110: ("STATUS_PAGE_FAULT_TRANSITION","The page fault was a transition fault."),
+ 0x00000111: ("STATUS_PAGE_FAULT_DEMAND_ZERO","The page fault was a demand zero fault."),
+ 0x00000112: ("STATUS_PAGE_FAULT_COPY_ON_WRITE","The page fault was a demand zero fault."),
+ 0x00000113: ("STATUS_PAGE_FAULT_GUARD_PAGE","The page fault was a demand zero fault."),
+ 0x00000114: ("STATUS_PAGE_FAULT_PAGING_FILE","The page fault was satisfied by reading from a secondary storage device."),
+ 0x00000115: ("STATUS_CACHE_PAGE_LOCKED","The cached page was locked during operation."),
+ 0x00000116: ("STATUS_CRASH_DUMP","The crash dump exists in a paging file."),
+ 0x00000117: ("STATUS_BUFFER_ALL_ZEROS","The specified buffer contains all zeros."),
+ 0x00000118: ("STATUS_REPARSE_OBJECT","A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link."),
+ 0x00000119: ("STATUS_RESOURCE_REQUIREMENTS_CHANGED","The device has succeeded a query-stop and its resource requirements have changed."),
+ 0x00000120: ("STATUS_TRANSLATION_COMPLETE","The translator has translated these resources into the global space and no additional translations should be performed."),
+ 0x00000121: ("STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY","The directory service evaluated group memberships locally, because it was unable to contact a global catalog server."),
+ 0x00000122: ("STATUS_NOTHING_TO_TERMINATE","A process being terminated has no threads to terminate."),
+ 0x00000123: ("STATUS_PROCESS_NOT_IN_JOB","The specified process is not part of a job."),
+ 0x00000124: ("STATUS_PROCESS_IN_JOB","The specified process is part of a job."),
+ 0x00000125: ("STATUS_VOLSNAP_HIBERNATE_READY","{Volume Shadow Copy Service} The system is now ready for hibernation."),
+ 0x00000126: ("STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY","A file system or file system filter driver has successfully completed an FsFilter operation."),
+ 0x00000127: ("STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED","The specified interrupt vector was already connected."),
+ 0x00000128: ("STATUS_INTERRUPT_STILL_CONNECTED","The specified interrupt vector is still connected."),
+ 0x00000129: ("STATUS_PROCESS_CLONED","The current process is a cloned process."),
+ 0x0000012A: ("STATUS_FILE_LOCKED_WITH_ONLY_READERS","The file was locked and all users of the file can only read."),
+ 0x0000012B: ("STATUS_FILE_LOCKED_WITH_WRITERS","The file was locked and at least one user of the file can write."),
+ 0x00000202: ("STATUS_RESOURCEMANAGER_READ_ONLY","The specified ResourceManager made no changes or updates to the resource under this transaction."),
+ 0x00000367: ("STATUS_WAIT_FOR_OPLOCK","An operation is blocked and waiting for an oplock."),
+ 0x00010001: ("DBG_EXCEPTION_HANDLED","Debugger handled the exception."),
+ 0x00010002: ("DBG_CONTINUE","The debugger continued."),
+ 0x001C0001: ("STATUS_FLT_IO_COMPLETE","The IO was completed by a filter."),
+ 0xC0000467: ("STATUS_FILE_NOT_AVAILABLE","The file is temporarily unavailable."),
+ 0xC0000721: ("STATUS_CALLBACK_RETURNED_THREAD_AFFINITY","A threadpool worker thread entered a callback at thread affinity %p and exited at affinity %p. This is unexpected, indicating that the callback missed restoring the priority."),
+ 0x40000000: ("STATUS_OBJECT_NAME_EXISTS","{Object Exists} An attempt was made to create an object but the object name already exists."),
+ 0x40000001: ("STATUS_THREAD_WAS_SUSPENDED","{Thread Suspended} A thread termination occurred while the thread was suspended. The thread resumed, and termination proceeded."),
+ 0x40000002: ("STATUS_WORKING_SET_LIMIT_RANGE","{Working Set Range Error} An attempt was made to set the working set minimum or maximum to values that are outside the allowable range."),
+ 0x40000003: ("STATUS_IMAGE_NOT_AT_BASE","{Image Relocated} An image file could not be mapped at the address that is specified in the image file. Local fixes must be performed on this image."),
+ 0x40000004: ("STATUS_RXACT_STATE_CREATED","This informational level status indicates that a specified registry subtree transaction state did not yet exist and had to be created."),
+ 0x40000005: ("STATUS_SEGMENT_NOTIFICATION","{Segment Load} A virtual DOS machine (VDM) is loading, unloading, or moving an MS-DOS or Win16 program segment image. An exception is raised so that a debugger can load, unload, or track symbols and breakpoints within these 16-bit segments."),
+ 0x40000006: ("STATUS_LOCAL_USER_SESSION_KEY","{Local Session Key} A user session key was requested for a local remote procedure call (RPC) connection. The session key that is returned is a constant value and not unique to this connection."),
+ 0x40000007: ("STATUS_BAD_CURRENT_DIRECTORY","{Invalid Current Directory} The process cannot switch to the startup current directory %hs. Select OK to set the current directory to %hs, or select CANCEL to exit."),
+ 0x40000008: ("STATUS_SERIAL_MORE_WRITES","{Serial IOCTL Complete} A serial I/O operation was completed by another write to a serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)"),
+ 0x40000009: ("STATUS_REGISTRY_RECOVERED","{Registry Recovery} One of the files that contains the system registry data had to be recovered by using a log or alternate copy. The recovery was successful."),
+ 0x4000000A: ("STATUS_FT_READ_RECOVERY_FROM_BACKUP","{Redundant Read} To satisfy a read request, the Windows NT fault-tolerant file system successfully read the requested data from a redundant copy. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device."),
+ 0x4000000B: ("STATUS_FT_WRITE_RECOVERY","{Redundant Write} To satisfy a write request, the Windows NT fault-tolerant file system successfully wrote a redundant copy of the information. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device."),
+ 0x4000000C: ("STATUS_SERIAL_COUNTER_TIMEOUT","{Serial IOCTL Timeout} A serial I/O operation completed because the time-out period expired. (The IOCTL_SERIAL_XOFF_COUNTER had not reached zero.)"),
+ 0x4000000D: ("STATUS_NULL_LM_PASSWORD","{Password Too Complex} The Windows password is too complex to be converted to a LAN Manager password. The LAN Manager password that returned is a NULL string."),
+ 0x4000000E: ("STATUS_IMAGE_MACHINE_TYPE_MISMATCH","{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine. Select OK to continue, or CANCEL to fail the DLL load."),
+ 0x4000000F: ("STATUS_RECEIVE_PARTIAL","{Partial Data Received} The network transport returned partial data to its client. The remaining data will be sent later."),
+ 0x40000010: ("STATUS_RECEIVE_EXPEDITED","{Expedited Data Received} The network transport returned data to its client that was marked as expedited by the remote system."),
+ 0x40000011: ("STATUS_RECEIVE_PARTIAL_EXPEDITED","{Partial Expedited Data Received} The network transport returned partial data to its client and this data was marked as expedited by the remote system. The remaining data will be sent later."),
+ 0x40000012: ("STATUS_EVENT_DONE","{TDI Event Done} The TDI indication has completed successfully."),
+ 0x40000013: ("STATUS_EVENT_PENDING","{TDI Event Pending} The TDI indication has entered the pending state."),
+ 0x40000014: ("STATUS_CHECKING_FILE_SYSTEM","Checking file system on %wZ."),
+ 0x40000015: ("STATUS_FATAL_APP_EXIT","{Fatal Application Exit} %hs"),
+ 0x40000016: ("STATUS_PREDEFINED_HANDLE","The specified registry key is referenced by a predefined handle."),
+ 0x40000017: ("STATUS_WAS_UNLOCKED","{Page Unlocked} The page protection of a locked page was changed to 'No Access' and the page was unlocked from memory and from the process."),
+ 0x40000018: ("STATUS_SERVICE_NOTIFICATION","%hs"),
+ 0x40000019: ("STATUS_WAS_LOCKED","{Page Locked} One of the pages to lock was already locked."),
+ 0x4000001A: ("STATUS_LOG_HARD_ERROR","Application popup: %1 : %2"),
+ 0x4000001B: ("STATUS_ALREADY_WIN32","A Win32 process already exists."),
+ 0x4000001C: ("STATUS_WX86_UNSIMULATE","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x4000001D: ("STATUS_WX86_CONTINUE","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x4000001E: ("STATUS_WX86_SINGLE_STEP","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x4000001F: ("STATUS_WX86_BREAKPOINT","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x40000020: ("STATUS_WX86_EXCEPTION_CONTINUE","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x40000021: ("STATUS_WX86_EXCEPTION_LASTCHANCE","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x40000022: ("STATUS_WX86_EXCEPTION_CHAIN","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x40000023: ("STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE","{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine."),
+ 0x40000024: ("STATUS_NO_YIELD_PERFORMED","A yield execution was performed and no thread was available to run."),
+ 0x40000025: ("STATUS_TIMER_RESUME_IGNORED","The resume flag to a timer API was ignored."),
+ 0x40000026: ("STATUS_ARBITRATION_UNHANDLED","The arbiter has deferred arbitration of these resources to its parent."),
+ 0x40000027: ("STATUS_CARDBUS_NOT_SUPPORTED","The device has detected a CardBus card in its slot."),
+ 0x40000028: ("STATUS_WX86_CREATEWX86TIB","An exception status code that is used by the Win32 x86 emulation subsystem."),
+ 0x40000029: ("STATUS_MP_PROCESSOR_MISMATCH","The CPUs in this multiprocessor system are not all the same revision level. To use all processors, the operating system restricts itself to the features of the least capable processor in the system. If problems occur with this system, contact the CPU manufacturer to see if this mix of processors is supported."),
+ 0x4000002A: ("STATUS_HIBERNATED","The system was put into hibernation."),
+ 0x4000002B: ("STATUS_RESUME_HIBERNATION","The system was resumed from hibernation."),
+ 0x4000002C: ("STATUS_FIRMWARE_UPDATED","Windows has detected that the system firmware (BIOS) was updated [previous firmware date = %2, current firmware date %3]."),
+ 0x4000002D: ("STATUS_DRIVERS_LEAKING_LOCKED_PAGES","A device driver is leaking locked I/O pages and is causing system degradation. The system has automatically enabled the tracking code to try and catch the culprit."),
+ 0x4000002E: ("STATUS_MESSAGE_RETRIEVED","The ALPC message being canceled has already been retrieved from the queue on the other side."),
+ 0x4000002F: ("STATUS_SYSTEM_POWERSTATE_TRANSITION","The system power state is transitioning from %2 to %3."),
+ 0x40000030: ("STATUS_ALPC_CHECK_COMPLETION_LIST","The receive operation was successful. Check the ALPC completion list for the received message."),
+ 0x40000031: ("STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION","The system power state is transitioning from %2 to %3 but could enter %4."),
+ 0x40000032: ("STATUS_ACCESS_AUDIT_BY_POLICY","Access to %1 is monitored by policy rule %2."),
+ 0x40000033: ("STATUS_ABANDON_HIBERFILE","A valid hibernation file has been invalidated and should be abandoned."),
+ 0x40000034: ("STATUS_BIZRULES_NOT_ENABLED","Business rule scripts are disabled for the calling application."),
+ 0x40000294: ("STATUS_WAKE_SYSTEM","The system has awoken."),
+ 0x40000370: ("STATUS_DS_SHUTTING_DOWN","The directory service is shutting down."),
+ 0x40010001: ("DBG_REPLY_LATER","Debugger will reply later."),
+ 0x40010002: ("DBG_UNABLE_TO_PROVIDE_HANDLE","Debugger cannot provide a handle."),
+ 0x40010003: ("DBG_TERMINATE_THREAD","Debugger terminated the thread."),
+ 0x40010004: ("DBG_TERMINATE_PROCESS","Debugger terminated the process."),
+ 0x40010005: ("DBG_CONTROL_C","Debugger obtained control of C."),
+ 0x40010006: ("DBG_PRINTEXCEPTION_C","Debugger printed an exception on control C."),
+ 0x40010007: ("DBG_RIPEXCEPTION","Debugger received a RIP exception."),
+ 0x40010008: ("DBG_CONTROL_BREAK","Debugger received a control break."),
+ 0x40010009: ("DBG_COMMAND_EXCEPTION","Debugger command communication exception."),
+ 0x40020056: ("RPC_NT_UUID_LOCAL_ONLY","A UUID that is valid only on this computer has been allocated."),
+ 0x400200AF: ("RPC_NT_SEND_INCOMPLETE","Some data remains to be sent in the request buffer."),
+ 0x400A0004: ("STATUS_CTX_CDM_CONNECT","The Client Drive Mapping Service has connected on Terminal Connection."),
+ 0x400A0005: ("STATUS_CTX_CDM_DISCONNECT","The Client Drive Mapping Service has disconnected on Terminal Connection."),
+ 0x4015000D: ("STATUS_SXS_RELEASE_ACTIVATION_CONTEXT","A kernel mode component is releasing a reference on an activation context."),
+ 0x40190034: ("STATUS_RECOVERY_NOT_NEEDED","The transactional resource manager is already consistent. Recovery is not needed."),
+ 0x40190035: ("STATUS_RM_ALREADY_STARTED","The transactional resource manager has already been started."),
+ 0x401A000C: ("STATUS_LOG_NO_RESTART","The log service encountered a log stream with no restart area."),
+ 0x401B00EC: ("STATUS_VIDEO_DRIVER_DEBUG_REPORT_REQUEST","{Display Driver Recovered From Failure} The %hs display driver has detected a failure and recovered from it. Some graphical operations may have failed. The next time you restart the machine, a dialog box appears, giving you an opportunity to upload data about this failure to Microsoft."),
+ 0x401E000A: ("STATUS_GRAPHICS_PARTIAL_DATA_POPULATED","The specified buffer is not big enough to contain the entire requested dataset. Partial data is populated up to the size of the buffer. The caller needs to provide a buffer of the size as specified in the partially populated buffer's content (interface specific)."),
+ 0x401E0117: ("STATUS_GRAPHICS_DRIVER_MISMATCH","The kernel driver detected a version mismatch between it and the user mode driver."),
+ 0x401E0307: ("STATUS_GRAPHICS_MODE_NOT_PINNED","No mode is pinned on the specified VidPN source/target."),
+ 0x401E031E: ("STATUS_GRAPHICS_NO_PREFERRED_MODE","The specified mode set does not specify a preference for one of its modes."),
+ 0x401E034B: ("STATUS_GRAPHICS_DATASET_IS_EMPTY","The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) is empty."),
+ 0x401E034C: ("STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET","The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) does not contain any more elements."),
+ 0x401E0351: ("STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PINNED","The specified content transformation is not pinned on the specified VidPN present path."),
+ 0x401E042F: ("STATUS_GRAPHICS_UNKNOWN_CHILD_STATUS","The child device presence was not reliably detected."),
+ 0x401E0437: ("STATUS_GRAPHICS_LEADLINK_START_DEFERRED","Starting the lead adapter in a linked configuration has been temporarily deferred."),
+ 0x401E0439: ("STATUS_GRAPHICS_POLLING_TOO_FREQUENTLY","The display adapter is being polled for children too frequently at the same polling level."),
+ 0x401E043A: ("STATUS_GRAPHICS_START_DEFERRED","Starting the adapter has been temporarily deferred."),
+ 0x40230001: ("STATUS_NDIS_INDICATION_REQUIRED","The request will be completed later by an NDIS status indication."),
+ 0x80000001: ("STATUS_GUARD_PAGE_VIOLATION","{EXCEPTION} Guard Page Exception A page of memory that marks the end of a data structure, such as a stack or an array, has been accessed."),
+ 0x80000002: ("STATUS_DATATYPE_MISALIGNMENT","{EXCEPTION} Alignment Fault A data type misalignment was detected in a load or store instruction."),
+ 0x80000003: ("STATUS_BREAKPOINT","{EXCEPTION} Breakpoint A breakpoint has been reached."),
+ 0x80000004: ("STATUS_SINGLE_STEP","{EXCEPTION} Single Step A single step or trace operation has just been completed."),
+ 0x80000005: ("STATUS_BUFFER_OVERFLOW","{Buffer Overflow} The data was too large to fit into the specified buffer."),
+ 0x80000006: ("STATUS_NO_MORE_FILES","{No More Files} No more files were found which match the file specification."),
+ 0x80000007: ("STATUS_WAKE_SYSTEM_DEBUGGER","{Kernel Debugger Awakened} The system debugger was awakened by an interrupt."),
+ 0x8000000A: ("STATUS_HANDLES_CLOSED","{Handles Closed} Handles to objects have been automatically closed because of the requested operation."),
+ 0x8000000B: ("STATUS_NO_INHERITANCE","{Non-Inheritable ACL} An access control list (ACL) contains no components that can be inherited."),
+ 0x8000000C: ("STATUS_GUID_SUBSTITUTION_MADE","{GUID Substitution} During the translation of a globally unique identifier (GUID) to a Windows security ID (SID), no administratively defined GUID prefix was found. A substitute prefix was used, which will not compromise system security. However, this may provide a more restrictive access than intended."),
+ 0x8000000D: ("STATUS_PARTIAL_COPY","Because of protection conflicts, not all the requested bytes could be copied."),
+ 0x8000000E: ("STATUS_DEVICE_PAPER_EMPTY","{Out of Paper} The printer is out of paper."),
+ 0x8000000F: ("STATUS_DEVICE_POWERED_OFF","{Device Power Is Off} The printer power has been turned off."),
+ 0x80000010: ("STATUS_DEVICE_OFF_LINE","{Device Offline} The printer has been taken offline."),
+ 0x80000011: ("STATUS_DEVICE_BUSY","{Device Busy} The device is currently busy."),
+ 0x80000012: ("STATUS_NO_MORE_EAS","{No More EAs} No more extended attributes (EAs) were found for the file."),
+ 0x80000013: ("STATUS_INVALID_EA_NAME","{Illegal EA} The specified extended attribute (EA) name contains at least one illegal character."),
+ 0x80000014: ("STATUS_EA_LIST_INCONSISTENT","{Inconsistent EA List} The extended attribute (EA) list is inconsistent."),
+ 0x80000015: ("STATUS_INVALID_EA_FLAG","{Invalid EA Flag} An invalid extended attribute (EA) flag was set."),
+ 0x80000016: ("STATUS_VERIFY_REQUIRED","{Verifying Disk} The media has changed and a verify operation is in progress; therefore, no reads or writes may be performed to the device, except those that are used in the verify operation."),
+ 0x80000017: ("STATUS_EXTRANEOUS_INFORMATION","{Too Much Information} The specified access control list (ACL) contained more information than was expected."),
+ 0x80000018: ("STATUS_RXACT_COMMIT_NECESSARY","This warning level status indicates that the transaction state already exists for the registry subtree, but that a transaction commit was previously aborted. The commit has NOT been completed but has not been rolled back either; therefore, it may still be committed, if needed."),
+ 0x8000001A: ("STATUS_NO_MORE_ENTRIES","{No More Entries} No more entries are available from an enumeration operation."),
+ 0x8000001B: ("STATUS_FILEMARK_DETECTED","{Filemark Found} A filemark was detected."),
+ 0x8000001C: ("STATUS_MEDIA_CHANGED","{Media Changed} The media may have changed."),
+ 0x8000001D: ("STATUS_BUS_RESET","{I/O Bus Reset} An I/O bus reset was detected."),
+ 0x8000001E: ("STATUS_END_OF_MEDIA","{End of Media} The end of the media was encountered."),
+ 0x8000001F: ("STATUS_BEGINNING_OF_MEDIA","The beginning of a tape or partition has been detected."),
+ 0x80000020: ("STATUS_MEDIA_CHECK","{Media Changed} The media may have changed."),
+ 0x80000021: ("STATUS_SETMARK_DETECTED","A tape access reached a set mark."),
+ 0x80000022: ("STATUS_NO_DATA_DETECTED","During a tape access, the end of the data written is reached."),
+ 0x80000023: ("STATUS_REDIRECTOR_HAS_OPEN_HANDLES","The redirector is in use and cannot be unloaded."),
+ 0x80000024: ("STATUS_SERVER_HAS_OPEN_HANDLES","The server is in use and cannot be unloaded."),
+ 0x80000025: ("STATUS_ALREADY_DISCONNECTED","The specified connection has already been disconnected."),
+ 0x80000026: ("STATUS_LONGJUMP","A long jump has been executed."),
+ 0x80000027: ("STATUS_CLEANER_CARTRIDGE_INSTALLED","A cleaner cartridge is present in the tape library."),
+ 0x80000028: ("STATUS_PLUGPLAY_QUERY_VETOED","The Plug and Play query operation was not successful."),
+ 0x80000029: ("STATUS_UNWIND_CONSOLIDATE","A frame consolidation has been executed."),
+ 0x8000002A: ("STATUS_REGISTRY_HIVE_RECOVERED","{Registry Hive Recovered} The registry hive (file): %hs was corrupted and it has been recovered. Some data might have been lost."),
+ 0x8000002B: ("STATUS_DLL_MIGHT_BE_INSECURE","The application is attempting to run executable code from the module %hs. This may be insecure. An alternative, %hs, is available. Should the application use the secure module %hs?"),
+ 0x8000002C: ("STATUS_DLL_MIGHT_BE_INCOMPATIBLE","The application is loading executable code from the module %hs. This is secure but may be incompatible with previous releases of the operating system. An alternative, %hs, is available. Should the application use the secure module %hs?"),
+ 0x8000002D: ("STATUS_STOPPED_ON_SYMLINK","The create operation stopped after reaching a symbolic link."),
+ 0x80000288: ("STATUS_DEVICE_REQUIRES_CLEANING","The device has indicated that cleaning is necessary."),
+ 0x80000289: ("STATUS_DEVICE_DOOR_OPEN","The device has indicated that its door is open. Further operations require it closed and secured."),
+ 0x80000803: ("STATUS_DATA_LOST_REPAIR","Windows discovered a corruption in the file %hs. This file has now been repaired. Check if any data in the file was lost because of the corruption."),
+ 0x80010001: ("DBG_EXCEPTION_NOT_HANDLED","Debugger did not handle the exception."),
+ 0x80130001: ("STATUS_CLUSTER_NODE_ALREADY_UP","The cluster node is already up."),
+ 0x80130002: ("STATUS_CLUSTER_NODE_ALREADY_DOWN","The cluster node is already down."),
+ 0x80130003: ("STATUS_CLUSTER_NETWORK_ALREADY_ONLINE","The cluster network is already online."),
+ 0x80130004: ("STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE","The cluster network is already offline."),
+ 0x80130005: ("STATUS_CLUSTER_NODE_ALREADY_MEMBER","The cluster node is already a member of the cluster."),
+ 0x80190009: ("STATUS_COULD_NOT_RESIZE_LOG","The log could not be set to the requested size."),
+ 0x80190029: ("STATUS_NO_TXF_METADATA","There is no transaction metadata on the file."),
+ 0x80190031: ("STATUS_CANT_RECOVER_WITH_HANDLE_OPEN","The file cannot be recovered because there is a handle still open on it."),
+ 0x80190041: ("STATUS_TXF_METADATA_ALREADY_PRESENT","Transaction metadata is already present on this file and cannot be superseded."),
+ 0x80190042: ("STATUS_TRANSACTION_SCOPE_CALLBACKS_NOT_SET","A transaction scope could not be entered because the scope handler has not been initialized."),
+ 0x801B00EB: ("STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD_RECOVERED","{Display Driver Stopped Responding and recovered} The %hs display driver has stopped working normally. The recovery had been performed."),
+ 0x801C0001: ("STATUS_FLT_BUFFER_TOO_SMALL","{Buffer too small} The buffer is too small to contain the entry. No information has been written to the buffer."),
+ 0x80210001: ("STATUS_FVE_PARTIAL_METADATA","Volume metadata read or write is incomplete."),
+ 0x80210002: ("STATUS_FVE_TRANSIENT_STATE","BitLocker encryption keys were ignored because the volume was in a transient state."),
+ 0xC0000001: ("STATUS_UNSUCCESSFUL","{Operation Failed} The requested operation was unsuccessful."),
+ 0xC0000002: ("STATUS_NOT_IMPLEMENTED","{Not Implemented} The requested operation is not implemented."),
+ 0xC0000003: ("STATUS_INVALID_INFO_CLASS","{Invalid Parameter} The specified information class is not a valid information class for the specified object."),
+ 0xC0000004: ("STATUS_INFO_LENGTH_MISMATCH","The specified information record length does not match the length that is required for the specified information class."),
+ 0xC0000005: ("STATUS_ACCESS_VIOLATION","The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s."),
+ 0xC0000006: ("STATUS_IN_PAGE_ERROR","The instruction at 0x%08lx referenced memory at 0x%08lx. The required data was not placed into memory because of an I/O error status of 0x%08lx."),
+ 0xC0000007: ("STATUS_PAGEFILE_QUOTA","The page file quota for the process has been exhausted."),
+ 0xC0000008: ("STATUS_INVALID_HANDLE","An invalid HANDLE was specified."),
+ 0xC0000009: ("STATUS_BAD_INITIAL_STACK","An invalid initial stack was specified in a call to NtCreateThread."),
+ 0xC000000A: ("STATUS_BAD_INITIAL_PC","An invalid initial start address was specified in a call to NtCreateThread."),
+ 0xC000000B: ("STATUS_INVALID_CID","An invalid client ID was specified."),
+ 0xC000000C: ("STATUS_TIMER_NOT_CANCELED","An attempt was made to cancel or set a timer that has an associated APC and the specified thread is not the thread that originally set the timer with an associated APC routine."),
+ 0xC000000D: ("STATUS_INVALID_PARAMETER","An invalid parameter was passed to a service or function."),
+ 0xC000000E: ("STATUS_NO_SUCH_DEVICE","A device that does not exist was specified."),
+ 0xC000000F: ("STATUS_NO_SUCH_FILE","{File Not Found} The file %hs does not exist."),
+ 0xC0000010: ("STATUS_INVALID_DEVICE_REQUEST","The specified request is not a valid operation for the target device."),
+ 0xC0000011: ("STATUS_END_OF_FILE","The end-of-file marker has been reached. There is no valid data in the file beyond this marker."),
+ 0xC0000012: ("STATUS_WRONG_VOLUME","{Wrong Volume} The wrong volume is in the drive. Insert volume %hs into drive %hs."),
+ 0xC0000013: ("STATUS_NO_MEDIA_IN_DEVICE","{No Disk} There is no disk in the drive. Insert a disk into drive %hs."),
+ 0xC0000014: ("STATUS_UNRECOGNIZED_MEDIA","{Unknown Disk Format} The disk in drive %hs is not formatted properly. Check the disk, and reformat it, if needed."),
+ 0xC0000015: ("STATUS_NONEXISTENT_SECTOR","{Sector Not Found} The specified sector does not exist."),
+ 0xC0000016: ("STATUS_MORE_PROCESSING_REQUIRED","{Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete."),
+ 0xC0000017: ("STATUS_NO_MEMORY","{Not Enough Quota} Not enough virtual memory or paging file quota is available to complete the specified operation."),
+ 0xC0000018: ("STATUS_CONFLICTING_ADDRESSES","{Conflicting Address Range} The specified address range conflicts with the address space."),
+ 0xC0000019: ("STATUS_NOT_MAPPED_VIEW","The address range to unmap is not a mapped view."),
+ 0xC000001A: ("STATUS_UNABLE_TO_FREE_VM","The virtual memory cannot be freed."),
+ 0xC000001B: ("STATUS_UNABLE_TO_DELETE_SECTION","The specified section cannot be deleted."),
+ 0xC000001C: ("STATUS_INVALID_SYSTEM_SERVICE","An invalid system service was specified in a system service call."),
+ 0xC000001D: ("STATUS_ILLEGAL_INSTRUCTION","{EXCEPTION} Illegal Instruction An attempt was made to execute an illegal instruction."),
+ 0xC000001E: ("STATUS_INVALID_LOCK_SEQUENCE","{Invalid Lock Sequence} An attempt was made to execute an invalid lock sequence."),
+ 0xC000001F: ("STATUS_INVALID_VIEW_SIZE","{Invalid Mapping} An attempt was made to create a view for a section that is bigger than the section."),
+ 0xC0000020: ("STATUS_INVALID_FILE_FOR_SECTION","{Bad File} The attributes of the specified mapping file for a section of memory cannot be read."),
+ 0xC0000021: ("STATUS_ALREADY_COMMITTED","{Already Committed} The specified address range is already committed."),
+ 0xC0000022: ("STATUS_ACCESS_DENIED","{Access Denied} A process has requested access to an object but has not been granted those access rights."),
+ 0xC0000023: ("STATUS_BUFFER_TOO_SMALL","{Buffer Too Small} The buffer is too small to contain the entry. No information has been written to the buffer."),
+ 0xC0000024: ("STATUS_OBJECT_TYPE_MISMATCH","{Wrong Type} There is a mismatch between the type of object that is required by the requested operation and the type of object that is specified in the request."),
+ 0xC0000025: ("STATUS_NONCONTINUABLE_EXCEPTION","{EXCEPTION} Cannot Continue Windows cannot continue from this exception."),
+ 0xC0000026: ("STATUS_INVALID_DISPOSITION","An invalid exception disposition was returned by an exception handler."),
+ 0xC0000027: ("STATUS_UNWIND","Unwind exception code."),
+ 0xC0000028: ("STATUS_BAD_STACK","An invalid or unaligned stack was encountered during an unwind operation."),
+ 0xC0000029: ("STATUS_INVALID_UNWIND_TARGET","An invalid unwind target was encountered during an unwind operation."),
+ 0xC000002A: ("STATUS_NOT_LOCKED","An attempt was made to unlock a page of memory that was not locked."),
+ 0xC000002B: ("STATUS_PARITY_ERROR","A device parity error on an I/O operation."),
+ 0xC000002C: ("STATUS_UNABLE_TO_DECOMMIT_VM","An attempt was made to decommit uncommitted virtual memory."),
+ 0xC000002D: ("STATUS_NOT_COMMITTED","An attempt was made to change the attributes on memory that has not been committed."),
+ 0xC000002E: ("STATUS_INVALID_PORT_ATTRIBUTES","Invalid object attributes specified to NtCreatePort or invalid port attributes specified to NtConnectPort."),
+ 0xC000002F: ("STATUS_PORT_MESSAGE_TOO_LONG","The length of the message that was passed to NtRequestPort or NtRequestWaitReplyPort is longer than the maximum message that is allowed by the port."),
+ 0xC0000030: ("STATUS_INVALID_PARAMETER_MIX","An invalid combination of parameters was specified."),
+ 0xC0000031: ("STATUS_INVALID_QUOTA_LOWER","An attempt was made to lower a quota limit below the current usage."),
+ 0xC0000032: ("STATUS_DISK_CORRUPT_ERROR","{Corrupt Disk} The file system structure on the disk is corrupt and unusable. Run the Chkdsk utility on the volume %hs."),
+ 0xC0000033: ("STATUS_OBJECT_NAME_INVALID","The object name is invalid."),
+ 0xC0000034: ("STATUS_OBJECT_NAME_NOT_FOUND","The object name is not found."),
+ 0xC0000035: ("STATUS_OBJECT_NAME_COLLISION","The object name already exists."),
+ 0xC0000037: ("STATUS_PORT_DISCONNECTED","An attempt was made to send a message to a disconnected communication port."),
+ 0xC0000038: ("STATUS_DEVICE_ALREADY_ATTACHED","An attempt was made to attach to a device that was already attached to another device."),
+ 0xC0000039: ("STATUS_OBJECT_PATH_INVALID","The object path component was not a directory object."),
+ 0xC000003A: ("STATUS_OBJECT_PATH_NOT_FOUND","{Path Not Found} The path %hs does not exist."),
+ 0xC000003B: ("STATUS_OBJECT_PATH_SYNTAX_BAD","The object path component was not a directory object."),
+ 0xC000003C: ("STATUS_DATA_OVERRUN","{Data Overrun} A data overrun error occurred."),
+ 0xC000003D: ("STATUS_DATA_LATE_ERROR","{Data Late} A data late error occurred."),
+ 0xC000003E: ("STATUS_DATA_ERROR","{Data Error} An error occurred in reading or writing data."),
+ 0xC000003F: ("STATUS_CRC_ERROR","{Bad CRC} A cyclic redundancy check (CRC) checksum error occurred."),
+ 0xC0000040: ("STATUS_SECTION_TOO_BIG","{Section Too Large} The specified section is too big to map the file."),
+ 0xC0000041: ("STATUS_PORT_CONNECTION_REFUSED","The NtConnectPort request is refused."),
+ 0xC0000042: ("STATUS_INVALID_PORT_HANDLE","The type of port handle is invalid for the operation that is requested."),
+ 0xC0000043: ("STATUS_SHARING_VIOLATION","A file cannot be opened because the share access flags are incompatible."),
+ 0xC0000044: ("STATUS_QUOTA_EXCEEDED","Insufficient quota exists to complete the operation."),
+ 0xC0000045: ("STATUS_INVALID_PAGE_PROTECTION","The specified page protection was not valid."),
+ 0xC0000046: ("STATUS_MUTANT_NOT_OWNED","An attempt to release a mutant object was made by a thread that was not the owner of the mutant object."),
+ 0xC0000047: ("STATUS_SEMAPHORE_LIMIT_EXCEEDED","An attempt was made to release a semaphore such that its maximum count would have been exceeded."),
+ 0xC0000048: ("STATUS_PORT_ALREADY_SET","An attempt was made to set the DebugPort or ExceptionPort of a process, but a port already exists in the process, or an attempt was made to set the CompletionPort of a file but a port was already set in the file, or an attempt was made to set the associated completion port of an ALPC port but it is already set."),
+ 0xC0000049: ("STATUS_SECTION_NOT_IMAGE","An attempt was made to query image information on a section that does not map an image."),
+ 0xC000004A: ("STATUS_SUSPEND_COUNT_EXCEEDED","An attempt was made to suspend a thread whose suspend count was at its maximum."),
+ 0xC000004B: ("STATUS_THREAD_IS_TERMINATING","An attempt was made to suspend a thread that has begun termination."),
+ 0xC000004C: ("STATUS_BAD_WORKING_SET_LIMIT","An attempt was made to set the working set limit to an invalid value (for example, the minimum greater than maximum)."),
+ 0xC000004D: ("STATUS_INCOMPATIBLE_FILE_MAP","A section was created to map a file that is not compatible with an already existing section that maps the same file."),
+ 0xC000004E: ("STATUS_SECTION_PROTECTION","A view to a section specifies a protection that is incompatible with the protection of the initial view."),
+ 0xC000004F: ("STATUS_EAS_NOT_SUPPORTED","An operation involving EAs failed because the file system does not support EAs."),
+ 0xC0000050: ("STATUS_EA_TOO_LARGE","An EA operation failed because the EA set is too large."),
+ 0xC0000051: ("STATUS_NONEXISTENT_EA_ENTRY","An EA operation failed because the name or EA index is invalid."),
+ 0xC0000052: ("STATUS_NO_EAS_ON_FILE","The file for which EAs were requested has no EAs."),
+ 0xC0000053: ("STATUS_EA_CORRUPT_ERROR","The EA is corrupt and cannot be read."),
+ 0xC0000054: ("STATUS_FILE_LOCK_CONFLICT","A requested read/write cannot be granted due to a conflicting file lock."),
+ 0xC0000055: ("STATUS_LOCK_NOT_GRANTED","A requested file lock cannot be granted due to other existing locks."),
+ 0xC0000056: ("STATUS_DELETE_PENDING","A non-close operation has been requested of a file object that has a delete pending."),
+ 0xC0000057: ("STATUS_CTL_FILE_NOT_SUPPORTED","An attempt was made to set the control attribute on a file. This attribute is not supported in the destination file system."),
+ 0xC0000058: ("STATUS_UNKNOWN_REVISION","Indicates a revision number that was encountered or specified is not one that is known by the service. It may be a more recent revision than the service is aware of."),
+ 0xC0000059: ("STATUS_REVISION_MISMATCH","Indicates that two revision levels are incompatible."),
+ 0xC000005A: ("STATUS_INVALID_OWNER","Indicates a particular security ID may not be assigned as the owner of an object."),
+ 0xC000005B: ("STATUS_INVALID_PRIMARY_GROUP","Indicates a particular security ID may not be assigned as the primary group of an object."),
+ 0xC000005C: ("STATUS_NO_IMPERSONATION_TOKEN","An attempt has been made to operate on an impersonation token by a thread that is not currently impersonating a client."),
+ 0xC000005D: ("STATUS_CANT_DISABLE_MANDATORY","A mandatory group may not be disabled."),
+ 0xC000005E: ("STATUS_NO_LOGON_SERVERS","No logon servers are currently available to service the logon request."),
+ 0xC000005F: ("STATUS_NO_SUCH_LOGON_SESSION","A specified logon session does not exist. It may already have been terminated."),
+ 0xC0000060: ("STATUS_NO_SUCH_PRIVILEGE","A specified privilege does not exist."),
+ 0xC0000061: ("STATUS_PRIVILEGE_NOT_HELD","A required privilege is not held by the client."),
+ 0xC0000062: ("STATUS_INVALID_ACCOUNT_NAME","The name provided is not a properly formed account name."),
+ 0xC0000063: ("STATUS_USER_EXISTS","The specified account already exists."),
+ 0xC0000064: ("STATUS_NO_SUCH_USER","The specified account does not exist."),
+ 0xC0000065: ("STATUS_GROUP_EXISTS","The specified group already exists."),
+ 0xC0000066: ("STATUS_NO_SUCH_GROUP","The specified group does not exist."),
+ 0xC0000067: ("STATUS_MEMBER_IN_GROUP","The specified user account is already in the specified group account. Also used to indicate a group cannot be deleted because it contains a member."),
+ 0xC0000068: ("STATUS_MEMBER_NOT_IN_GROUP","The specified user account is not a member of the specified group account."),
+ 0xC0000069: ("STATUS_LAST_ADMIN","Indicates the requested operation would disable or delete the last remaining administration account. This is not allowed to prevent creating a situation in which the system cannot be administrated."),
+ 0xC000006A: ("STATUS_WRONG_PASSWORD","When trying to update a password, this return status indicates that the value provided as the current password is not correct."),
+ 0xC000006B: ("STATUS_ILL_FORMED_PASSWORD","When trying to update a password, this return status indicates that the value provided for the new password contains values that are not allowed in passwords."),
+ 0xC000006C: ("STATUS_PASSWORD_RESTRICTION","When trying to update a password, this status indicates that some password update rule has been violated. For example, the password may not meet length criteria."),
+ 0xC000006D: ("STATUS_LOGON_FAILURE","The attempted logon is invalid. This is either due to a bad username or authentication information."),
+ 0xC000006E: ("STATUS_ACCOUNT_RESTRICTION","Indicates a referenced user name and authentication information are valid, but some user account restriction has prevented successful authentication (such as time-of-day restrictions)."),
+ 0xC000006F: ("STATUS_INVALID_LOGON_HOURS","The user account has time restrictions and may not be logged onto at this time."),
+ 0xC0000070: ("STATUS_INVALID_WORKSTATION","The user account is restricted so that it may not be used to log on from the source workstation."),
+ 0xC0000071: ("STATUS_PASSWORD_EXPIRED","The user account password has expired."),
+ 0xC0000072: ("STATUS_ACCOUNT_DISABLED","The referenced account is currently disabled and may not be logged on to."),
+ 0xC0000073: ("STATUS_NONE_MAPPED","None of the information to be translated has been translated."),
+ 0xC0000074: ("STATUS_TOO_MANY_LUIDS_REQUESTED","The number of LUIDs requested may not be allocated with a single allocation."),
+ 0xC0000075: ("STATUS_LUIDS_EXHAUSTED","Indicates there are no more LUIDs to allocate."),
+ 0xC0000076: ("STATUS_INVALID_SUB_AUTHORITY","Indicates the sub-authority value is invalid for the particular use."),
+ 0xC0000077: ("STATUS_INVALID_ACL","Indicates the ACL structure is not valid."),
+ 0xC0000078: ("STATUS_INVALID_SID","Indicates the SID structure is not valid."),
+ 0xC0000079: ("STATUS_INVALID_SECURITY_DESCR","Indicates the SECURITY_DESCRIPTOR structure is not valid."),
+ 0xC000007A: ("STATUS_PROCEDURE_NOT_FOUND","Indicates the specified procedure address cannot be found in the DLL."),
+ 0xC000007B: ("STATUS_INVALID_IMAGE_FORMAT","{Bad Image} %hs is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support."),
+ 0xC000007C: ("STATUS_NO_TOKEN","An attempt was made to reference a token that does not exist. This is typically done by referencing the token that is associated with a thread when the thread is not impersonating a client."),
+ 0xC000007D: ("STATUS_BAD_INHERITANCE_ACL","Indicates that an attempt to build either an inherited ACL or ACE was not successful. This can be caused by a number of things. One of the more probable causes is the replacement of a CreatorId with a SID that did not fit into the ACE or ACL."),
+ 0xC000007E: ("STATUS_RANGE_NOT_LOCKED","The range specified in NtUnlockFile was not locked."),
+ 0xC000007F: ("STATUS_DISK_FULL","An operation failed because the disk was full."),
+ 0xC0000080: ("STATUS_SERVER_DISABLED","The GUID allocation server is disabled at the moment."),
+ 0xC0000081: ("STATUS_SERVER_NOT_DISABLED","The GUID allocation server is enabled at the moment."),
+ 0xC0000082: ("STATUS_TOO_MANY_GUIDS_REQUESTED","Too many GUIDs were requested from the allocation server at once."),
+ 0xC0000083: ("STATUS_GUIDS_EXHAUSTED","The GUIDs could not be allocated because the Authority Agent was exhausted."),
+ 0xC0000084: ("STATUS_INVALID_ID_AUTHORITY","The value provided was an invalid value for an identifier authority."),
+ 0xC0000085: ("STATUS_AGENTS_EXHAUSTED","No more authority agent values are available for the particular identifier authority value."),
+ 0xC0000086: ("STATUS_INVALID_VOLUME_LABEL","An invalid volume label has been specified."),
+ 0xC0000087: ("STATUS_SECTION_NOT_EXTENDED","A mapped section could not be extended."),
+ 0xC0000088: ("STATUS_NOT_MAPPED_DATA","Specified section to flush does not map a data file."),
+ 0xC0000089: ("STATUS_RESOURCE_DATA_NOT_FOUND","Indicates the specified image file did not contain a resource section."),
+ 0xC000008A: ("STATUS_RESOURCE_TYPE_NOT_FOUND","Indicates the specified resource type cannot be found in the image file."),
+ 0xC000008B: ("STATUS_RESOURCE_NAME_NOT_FOUND","Indicates the specified resource name cannot be found in the image file."),
+ 0xC000008C: ("STATUS_ARRAY_BOUNDS_EXCEEDED","{EXCEPTION} Array bounds exceeded."),
+ 0xC000008D: ("STATUS_FLOAT_DENORMAL_OPERAND","{EXCEPTION} Floating-point denormal operand."),
+ 0xC000008E: ("STATUS_FLOAT_DIVIDE_BY_ZERO","{EXCEPTION} Floating-point division by zero."),
+ 0xC000008F: ("STATUS_FLOAT_INEXACT_RESULT","{EXCEPTION} Floating-point inexact result."),
+ 0xC0000090: ("STATUS_FLOAT_INVALID_OPERATION","{EXCEPTION} Floating-point invalid operation."),
+ 0xC0000091: ("STATUS_FLOAT_OVERFLOW","{EXCEPTION} Floating-point overflow."),
+ 0xC0000092: ("STATUS_FLOAT_STACK_CHECK","{EXCEPTION} Floating-point stack check."),
+ 0xC0000093: ("STATUS_FLOAT_UNDERFLOW","{EXCEPTION} Floating-point underflow."),
+ 0xC0000094: ("STATUS_INTEGER_DIVIDE_BY_ZERO","{EXCEPTION} Integer division by zero."),
+ 0xC0000095: ("STATUS_INTEGER_OVERFLOW","{EXCEPTION} Integer overflow."),
+ 0xC0000096: ("STATUS_PRIVILEGED_INSTRUCTION","{EXCEPTION} Privileged instruction."),
+ 0xC0000097: ("STATUS_TOO_MANY_PAGING_FILES","An attempt was made to install more paging files than the system supports."),
+ 0xC0000098: ("STATUS_FILE_INVALID","The volume for a file has been externally altered such that the opened file is no longer valid."),
+ 0xC0000099: ("STATUS_ALLOTTED_SPACE_EXCEEDED","When a block of memory is allotted for future updates, such as the memory allocated to hold discretionary access control and primary group information, successive updates may exceed the amount of memory originally allotted. Because a quota may already have been charged to several processes that have handles to the object, it is not reasonable to alter the size of the allocated memory. Instead, a request that requires more memory than has been allotted must fail and the STATUS_ALLOTTED_SPACE_EXCEEDED error returned."),
+ 0xC000009A: ("STATUS_INSUFFICIENT_RESOURCES","Insufficient system resources exist to complete the API."),
+ 0xC000009B: ("STATUS_DFS_EXIT_PATH_FOUND","An attempt has been made to open a DFS exit path control file."),
+ 0xC000009C: ("STATUS_DEVICE_DATA_ERROR","There are bad blocks (sectors) on the hard disk."),
+ 0xC000009D: ("STATUS_DEVICE_NOT_CONNECTED","There is bad cabling, non-termination, or the controller is not able to obtain access to the hard disk."),
+ 0xC000009F: ("STATUS_FREE_VM_NOT_AT_BASE","Virtual memory cannot be freed because the base address is not the base of the region and a region size of zero was specified."),
+ 0xC00000A0: ("STATUS_MEMORY_NOT_ALLOCATED","An attempt was made to free virtual memory that is not allocated."),
+ 0xC00000A1: ("STATUS_WORKING_SET_QUOTA","The working set is not big enough to allow the requested pages to be locked."),
+ 0xC00000A2: ("STATUS_MEDIA_WRITE_PROTECTED","{Write Protect Error} The disk cannot be written to because it is write-protected. Remove the write protection from the volume %hs in drive %hs."),
+ 0xC00000A3: ("STATUS_DEVICE_NOT_READY","{Drive Not Ready} The drive is not ready for use; its door may be open. Check drive %hs and make sure that a disk is inserted and that the drive door is closed."),
+ 0xC00000A4: ("STATUS_INVALID_GROUP_ATTRIBUTES","The specified attributes are invalid or are incompatible with the attributes for the group as a whole."),
+ 0xC00000A5: ("STATUS_BAD_IMPERSONATION_LEVEL","A specified impersonation level is invalid. Also used to indicate that a required impersonation level was not provided."),
+ 0xC00000A6: ("STATUS_CANT_OPEN_ANONYMOUS","An attempt was made to open an anonymous-level token. Anonymous tokens may not be opened."),
+ 0xC00000A7: ("STATUS_BAD_VALIDATION_CLASS","The validation information class requested was invalid."),
+ 0xC00000A8: ("STATUS_BAD_TOKEN_TYPE","The type of a token object is inappropriate for its attempted use."),
+ 0xC00000A9: ("STATUS_BAD_MASTER_BOOT_RECORD","The type of a token object is inappropriate for its attempted use."),
+ 0xC00000AA: ("STATUS_INSTRUCTION_MISALIGNMENT","An attempt was made to execute an instruction at an unaligned address and the host system does not support unaligned instruction references."),
+ 0xC00000AB: ("STATUS_INSTANCE_NOT_AVAILABLE","The maximum named pipe instance count has been reached."),
+ 0xC00000AC: ("STATUS_PIPE_NOT_AVAILABLE","An instance of a named pipe cannot be found in the listening state."),
+ 0xC00000AD: ("STATUS_INVALID_PIPE_STATE","The named pipe is not in the connected or closing state."),
+ 0xC00000AE: ("STATUS_PIPE_BUSY","The specified pipe is set to complete operations and there are current I/O operations queued so that it cannot be changed to queue operations."),
+ 0xC00000AF: ("STATUS_ILLEGAL_FUNCTION","The specified handle is not open to the server end of the named pipe."),
+ 0xC00000B0: ("STATUS_PIPE_DISCONNECTED","The specified named pipe is in the disconnected state."),
+ 0xC00000B1: ("STATUS_PIPE_CLOSING","The specified named pipe is in the closing state."),
+ 0xC00000B2: ("STATUS_PIPE_CONNECTED","The specified named pipe is in the connected state."),
+ 0xC00000B3: ("STATUS_PIPE_LISTENING","The specified named pipe is in the listening state."),
+ 0xC00000B4: ("STATUS_INVALID_READ_MODE","The specified named pipe is not in message mode."),
+ 0xC00000B5: ("STATUS_IO_TIMEOUT","{Device Timeout} The specified I/O operation on %hs was not completed before the time-out period expired."),
+ 0xC00000B6: ("STATUS_FILE_FORCED_CLOSED","The specified file has been closed by another process."),
+ 0xC00000B7: ("STATUS_PROFILING_NOT_STARTED","Profiling is not started."),
+ 0xC00000B8: ("STATUS_PROFILING_NOT_STOPPED","Profiling is not stopped."),
+ 0xC00000B9: ("STATUS_COULD_NOT_INTERPRET","The passed ACL did not contain the minimum required information."),
+ 0xC00000BA: ("STATUS_FILE_IS_A_DIRECTORY","The file that was specified as a target is a directory, and the caller specified that it could be anything but a directory."),
+ 0xC00000BB: ("STATUS_NOT_SUPPORTED","The request is not supported."),
+ 0xC00000BC: ("STATUS_REMOTE_NOT_LISTENING","This remote computer is not listening."),
+ 0xC00000BD: ("STATUS_DUPLICATE_NAME","A duplicate name exists on the network."),
+ 0xC00000BE: ("STATUS_BAD_NETWORK_PATH","The network path cannot be located."),
+ 0xC00000BF: ("STATUS_NETWORK_BUSY","The network is busy."),
+ 0xC00000C0: ("STATUS_DEVICE_DOES_NOT_EXIST","This device does not exist."),
+ 0xC00000C1: ("STATUS_TOO_MANY_COMMANDS","The network BIOS command limit has been reached."),
+ 0xC00000C2: ("STATUS_ADAPTER_HARDWARE_ERROR","An I/O adapter hardware error has occurred."),
+ 0xC00000C3: ("STATUS_INVALID_NETWORK_RESPONSE","The network responded incorrectly."),
+ 0xC00000C4: ("STATUS_UNEXPECTED_NETWORK_ERROR","An unexpected network error occurred."),
+ 0xC00000C5: ("STATUS_BAD_REMOTE_ADAPTER","The remote adapter is not compatible."),
+ 0xC00000C6: ("STATUS_PRINT_QUEUE_FULL","The print queue is full."),
+ 0xC00000C7: ("STATUS_NO_SPOOL_SPACE","Space to store the file that is waiting to be printed is not available on the server."),
+ 0xC00000C8: ("STATUS_PRINT_CANCELLED","The requested print file has been canceled."),
+ 0xC00000C9: ("STATUS_NETWORK_NAME_DELETED","The network name was deleted."),
+ 0xC00000CA: ("STATUS_NETWORK_ACCESS_DENIED","Network access is denied."),
+ 0xC00000CB: ("STATUS_BAD_DEVICE_TYPE","{Incorrect Network Resource Type} The specified device type (LPT, for example) conflicts with the actual device type on the remote resource."),
+ 0xC00000CC: ("STATUS_BAD_NETWORK_NAME","{Network Name Not Found} The specified share name cannot be found on the remote server."),
+ 0xC00000CD: ("STATUS_TOO_MANY_NAMES","The name limit for the network adapter card of the local computer was exceeded."),
+ 0xC00000CE: ("STATUS_TOO_MANY_SESSIONS","The network BIOS session limit was exceeded."),
+ 0xC00000CF: ("STATUS_SHARING_PAUSED","File sharing has been temporarily paused."),
+ 0xC00000D0: ("STATUS_REQUEST_NOT_ACCEPTED","No more connections can be made to this remote computer at this time because the computer has already accepted the maximum number of connections."),
+ 0xC00000D1: ("STATUS_REDIRECTOR_PAUSED","Print or disk redirection is temporarily paused."),
+ 0xC00000D2: ("STATUS_NET_WRITE_FAULT","A network data fault occurred."),
+ 0xC00000D3: ("STATUS_PROFILING_AT_LIMIT","The number of active profiling objects is at the maximum and no more may be started."),
+ 0xC00000D4: ("STATUS_NOT_SAME_DEVICE","{Incorrect Volume} The destination file of a rename request is located on a different device than the source of the rename request."),
+ 0xC00000D5: ("STATUS_FILE_RENAMED","The specified file has been renamed and thus cannot be modified."),
+ 0xC00000D6: ("STATUS_VIRTUAL_CIRCUIT_CLOSED","{Network Request Timeout} The session with a remote server has been disconnected because the time-out interval for a request has expired."),
+ 0xC00000D7: ("STATUS_NO_SECURITY_ON_OBJECT","Indicates an attempt was made to operate on the security of an object that does not have security associated with it."),
+ 0xC00000D8: ("STATUS_CANT_WAIT","Used to indicate that an operation cannot continue without blocking for I/O."),
+ 0xC00000D9: ("STATUS_PIPE_EMPTY","Used to indicate that a read operation was done on an empty pipe."),
+ 0xC00000DA: ("STATUS_CANT_ACCESS_DOMAIN_INFO","Configuration information could not be read from the domain controller, either because the machine is unavailable or access has been denied."),
+ 0xC00000DB: ("STATUS_CANT_TERMINATE_SELF","Indicates that a thread attempted to terminate itself by default (called NtTerminateThread with NULL) and it was the last thread in the current process."),
+ 0xC00000DC: ("STATUS_INVALID_SERVER_STATE","Indicates the Sam Server was in the wrong state to perform the desired operation."),
+ 0xC00000DD: ("STATUS_INVALID_DOMAIN_STATE","Indicates the domain was in the wrong state to perform the desired operation."),
+ 0xC00000DE: ("STATUS_INVALID_DOMAIN_ROLE","This operation is only allowed for the primary domain controller of the domain."),
+ 0xC00000DF: ("STATUS_NO_SUCH_DOMAIN","The specified domain did not exist."),
+ 0xC00000E0: ("STATUS_DOMAIN_EXISTS","The specified domain already exists."),
+ 0xC00000E1: ("STATUS_DOMAIN_LIMIT_EXCEEDED","An attempt was made to exceed the limit on the number of domains per server for this release."),
+ 0xC00000E2: ("STATUS_OPLOCK_NOT_GRANTED","An error status returned when the opportunistic lock (oplock) request is denied."),
+ 0xC00000E3: ("STATUS_INVALID_OPLOCK_PROTOCOL","An error status returned when an invalid opportunistic lock (oplock) acknowledgment is received by a file system."),
+ 0xC00000E4: ("STATUS_INTERNAL_DB_CORRUPTION","This error indicates that the requested operation cannot be completed due to a catastrophic media failure or an on-disk data structure corruption."),
+ 0xC00000E5: ("STATUS_INTERNAL_ERROR","An internal error occurred."),
+ 0xC00000E6: ("STATUS_GENERIC_NOT_MAPPED","Indicates generic access types were contained in an access mask which should already be mapped to non-generic access types."),
+ 0xC00000E7: ("STATUS_BAD_DESCRIPTOR_FORMAT","Indicates a security descriptor is not in the necessary format (absolute or self-relative)."),
+ 0xC00000E8: ("STATUS_INVALID_USER_BUFFER","An access to a user buffer failed at an expected point in time. This code is defined because the caller does not want to accept STATUS_ACCESS_VIOLATION in its filter."),
+ 0xC00000E9: ("STATUS_UNEXPECTED_IO_ERROR","If an I/O error that is not defined in the standard FsRtl filter is returned, it is converted to the following error, which is guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
+ 0xC00000EA: ("STATUS_UNEXPECTED_MM_CREATE_ERR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
+ 0xC00000EB: ("STATUS_UNEXPECTED_MM_MAP_ERROR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
+ 0xC00000EC: ("STATUS_UNEXPECTED_MM_EXTEND_ERR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
+ 0xC00000ED: ("STATUS_NOT_LOGON_PROCESS","The requested action is restricted for use by logon processes only. The calling process has not registered as a logon process."),
+ 0xC00000EE: ("STATUS_LOGON_SESSION_EXISTS","An attempt has been made to start a new session manager or LSA logon session by using an ID that is already in use."),
+ 0xC00000EF: ("STATUS_INVALID_PARAMETER_1","An invalid parameter was passed to a service or function as the first argument."),
+ 0xC00000F0: ("STATUS_INVALID_PARAMETER_2","An invalid parameter was passed to a service or function as the second argument."),
+ 0xC00000F1: ("STATUS_INVALID_PARAMETER_3","An invalid parameter was passed to a service or function as the third argument."),
+ 0xC00000F2: ("STATUS_INVALID_PARAMETER_4","An invalid parameter was passed to a service or function as the fourth argument."),
+ 0xC00000F3: ("STATUS_INVALID_PARAMETER_5","An invalid parameter was passed to a service or function as the fifth argument."),
+ 0xC00000F4: ("STATUS_INVALID_PARAMETER_6","An invalid parameter was passed to a service or function as the sixth argument."),
+ 0xC00000F5: ("STATUS_INVALID_PARAMETER_7","An invalid parameter was passed to a service or function as the seventh argument."),
+ 0xC00000F6: ("STATUS_INVALID_PARAMETER_8","An invalid parameter was passed to a service or function as the eighth argument."),
+ 0xC00000F7: ("STATUS_INVALID_PARAMETER_9","An invalid parameter was passed to a service or function as the ninth argument."),
+ 0xC00000F8: ("STATUS_INVALID_PARAMETER_10","An invalid parameter was passed to a service or function as the tenth argument."),
+ 0xC00000F9: ("STATUS_INVALID_PARAMETER_11","An invalid parameter was passed to a service or function as the eleventh argument."),
+ 0xC00000FA: ("STATUS_INVALID_PARAMETER_12","An invalid parameter was passed to a service or function as the twelfth argument."),
+ 0xC00000FB: ("STATUS_REDIRECTOR_NOT_STARTED","An attempt was made to access a network file, but the network software was not yet started."),
+ 0xC00000FC: ("STATUS_REDIRECTOR_STARTED","An attempt was made to start the redirector, but the redirector has already been started."),
+ 0xC00000FD: ("STATUS_STACK_OVERFLOW","A new guard page for the stack cannot be created."),
+ 0xC00000FE: ("STATUS_NO_SUCH_PACKAGE","A specified authentication package is unknown."),
+ 0xC00000FF: ("STATUS_BAD_FUNCTION_TABLE","A malformed function table was encountered during an unwind operation."),
+ 0xC0000100: ("STATUS_VARIABLE_NOT_FOUND","Indicates the specified environment variable name was not found in the specified environment block."),
+ 0xC0000101: ("STATUS_DIRECTORY_NOT_EMPTY","Indicates that the directory trying to be deleted is not empty."),
+ 0xC0000102: ("STATUS_FILE_CORRUPT_ERROR","{Corrupt File} The file or directory %hs is corrupt and unreadable. Run the Chkdsk utility."),
+ 0xC0000103: ("STATUS_NOT_A_DIRECTORY","A requested opened file is not a directory."),
+ 0xC0000104: ("STATUS_BAD_LOGON_SESSION_STATE","The logon session is not in a state that is consistent with the requested operation."),
+ 0xC0000105: ("STATUS_LOGON_SESSION_COLLISION","An internal LSA error has occurred. An authentication package has requested the creation of a logon session but the ID of an already existing logon session has been specified."),
+ 0xC0000106: ("STATUS_NAME_TOO_LONG","A specified name string is too long for its intended use."),
+ 0xC0000107: ("STATUS_FILES_OPEN","The user attempted to force close the files on a redirected drive, but there were opened files on the drive, and the user did not specify a sufficient level of force."),
+ 0xC0000108: ("STATUS_CONNECTION_IN_USE","The user attempted to force close the files on a redirected drive, but there were opened directories on the drive, and the user did not specify a sufficient level of force."),
+ 0xC0000109: ("STATUS_MESSAGE_NOT_FOUND","RtlFindMessage could not locate the requested message ID in the message table resource."),
+ 0xC000010A: ("STATUS_PROCESS_IS_TERMINATING","An attempt was made to duplicate an object handle into or out of an exiting process."),
+ 0xC000010B: ("STATUS_INVALID_LOGON_TYPE","Indicates an invalid value has been provided for the LogonType requested."),
+ 0xC000010C: ("STATUS_NO_GUID_TRANSLATION","Indicates that an attempt was made to assign protection to a file system file or directory and one of the SIDs in the security descriptor could not be translated into a GUID that could be stored by the file system. This causes the protection attempt to fail, which may cause a file creation attempt to fail."),
+ 0xC000010D: ("STATUS_CANNOT_IMPERSONATE","Indicates that an attempt has been made to impersonate via a named pipe that has not yet been read from."),
+ 0xC000010E: ("STATUS_IMAGE_ALREADY_LOADED","Indicates that the specified image is already loaded."),
+ 0xC0000117: ("STATUS_NO_LDT","Indicates that an attempt was made to change the size of the LDT for a process that has no LDT."),
+ 0xC0000118: ("STATUS_INVALID_LDT_SIZE","Indicates that an attempt was made to grow an LDT by setting its size, or that the size was not an even number of selectors."),
+ 0xC0000119: ("STATUS_INVALID_LDT_OFFSET","Indicates that the starting value for the LDT information was not an integral multiple of the selector size."),
+ 0xC000011A: ("STATUS_INVALID_LDT_DESCRIPTOR","Indicates that the user supplied an invalid descriptor when trying to set up LDT descriptors."),
+ 0xC000011B: ("STATUS_INVALID_IMAGE_NE_FORMAT","The specified image file did not have the correct format. It appears to be NE format."),
+ 0xC000011C: ("STATUS_RXACT_INVALID_STATE","Indicates that the transaction state of a registry subtree is incompatible with the requested operation. For example, a request has been made to start a new transaction with one already in progress, or a request has been made to apply a transaction when one is not currently in progress."),
+ 0xC000011D: ("STATUS_RXACT_COMMIT_FAILURE","Indicates an error has occurred during a registry transaction commit. The database has been left in an unknown, but probably inconsistent, state. The state of the registry transaction is left as COMMITTING."),
+ 0xC000011E: ("STATUS_MAPPED_FILE_SIZE_ZERO","An attempt was made to map a file of size zero with the maximum size specified as zero."),
+ 0xC000011F: ("STATUS_TOO_MANY_OPENED_FILES","Too many files are opened on a remote server. This error should only be returned by the Windows redirector on a remote drive."),
+ 0xC0000120: ("STATUS_CANCELLED","The I/O request was canceled."),
+ 0xC0000121: ("STATUS_CANNOT_DELETE","An attempt has been made to remove a file or directory that cannot be deleted."),
+ 0xC0000122: ("STATUS_INVALID_COMPUTER_NAME","Indicates a name that was specified as a remote computer name is syntactically invalid."),
+ 0xC0000123: ("STATUS_FILE_DELETED","An I/O request other than close was performed on a file after it was deleted, which can only happen to a request that did not complete before the last handle was closed via NtClose."),
+ 0xC0000124: ("STATUS_SPECIAL_ACCOUNT","Indicates an operation that is incompatible with built-in accounts has been attempted on a built-in (special) SAM account. For example, built-in accounts cannot be deleted."),
+ 0xC0000125: ("STATUS_SPECIAL_GROUP","The operation requested may not be performed on the specified group because it is a built-in special group."),
+ 0xC0000126: ("STATUS_SPECIAL_USER","The operation requested may not be performed on the specified user because it is a built-in special user."),
+ 0xC0000127: ("STATUS_MEMBERS_PRIMARY_GROUP","Indicates a member cannot be removed from a group because the group is currently the member's primary group."),
+ 0xC0000128: ("STATUS_FILE_CLOSED","An I/O request other than close and several other special case operations was attempted using a file object that had already been closed."),
+ 0xC0000129: ("STATUS_TOO_MANY_THREADS","Indicates a process has too many threads to perform the requested action. For example, assignment of a primary token may only be performed when a process has zero or one threads."),
+ 0xC000012A: ("STATUS_THREAD_NOT_IN_PROCESS","An attempt was made to operate on a thread within a specific process, but the specified thread is not in the specified process."),
+ 0xC000012B: ("STATUS_TOKEN_ALREADY_IN_USE","An attempt was made to establish a token for use as a primary token but the token is already in use. A token can only be the primary token of one process at a time."),
+ 0xC000012C: ("STATUS_PAGEFILE_QUOTA_EXCEEDED","The page file quota was exceeded."),
+ 0xC000012D: ("STATUS_COMMITMENT_LIMIT","{Out of Virtual Memory} Your system is low on virtual memory. To ensure that Windows runs correctly, increase the size of your virtual memory paging file. For more information, see Help."),
+ 0xC000012E: ("STATUS_INVALID_IMAGE_LE_FORMAT","The specified image file did not have the correct format: it appears to be LE format."),
+ 0xC000012F: ("STATUS_INVALID_IMAGE_NOT_MZ","The specified image file did not have the correct format: it did not have an initial MZ."),
+ 0xC0000130: ("STATUS_INVALID_IMAGE_PROTECT","The specified image file did not have the correct format: it did not have a proper e_lfarlc in the MZ header."),
+ 0xC0000131: ("STATUS_INVALID_IMAGE_WIN_16","The specified image file did not have the correct format: it appears to be a 16-bit Windows image."),
+ 0xC0000132: ("STATUS_LOGON_SERVER_CONFLICT","The Netlogon service cannot start because another Netlogon service running in the domain conflicts with the specified role."),
+ 0xC0000133: ("STATUS_TIME_DIFFERENCE_AT_DC","The time at the primary domain controller is different from the time at the backup domain controller or member server by too large an amount."),
+ 0xC0000134: ("STATUS_SYNCHRONIZATION_REQUIRED","The SAM database on a Windows Server is significantly out of synchronization with the copy on the domain controller. A complete synchronization is required."),
+ 0xC0000135: ("STATUS_DLL_NOT_FOUND","{Unable To Locate Component} This application has failed to start because %hs was not found. Reinstalling the application may fix this problem."),
+ 0xC0000136: ("STATUS_OPEN_FAILED","The NtCreateFile API failed. This error should never be returned to an application; it is a place holder for the Windows LAN Manager Redirector to use in its internal error-mapping routines."),
+ 0xC0000137: ("STATUS_IO_PRIVILEGE_FAILED","{Privilege Failed} The I/O permissions for the process could not be changed."),
+ 0xC0000138: ("STATUS_ORDINAL_NOT_FOUND","{Ordinal Not Found} The ordinal %ld could not be located in the dynamic link library %hs."),
+ 0xC0000139: ("STATUS_ENTRYPOINT_NOT_FOUND","{Entry Point Not Found} The procedure entry point %hs could not be located in the dynamic link library %hs."),
+ 0xC000013A: ("STATUS_CONTROL_C_EXIT","{Application Exit by CTRL+C} The application terminated as a result of a CTRL+C."),
+ 0xC000013B: ("STATUS_LOCAL_DISCONNECT","{Virtual Circuit Closed} The network transport on your computer has closed a network connection. There may or may not be I/O requests outstanding."),
+ 0xC000013C: ("STATUS_REMOTE_DISCONNECT","{Virtual Circuit Closed} The network transport on a remote computer has closed a network connection. There may or may not be I/O requests outstanding."),
+ 0xC000013D: ("STATUS_REMOTE_RESOURCES","{Insufficient Resources on Remote Computer} The remote computer has insufficient resources to complete the network request. For example, the remote computer may not have enough available memory to carry out the request at this time."),
+ 0xC000013E: ("STATUS_LINK_FAILED","{Virtual Circuit Closed} An existing connection (virtual circuit) has been broken at the remote computer. There is probably something wrong with the network software protocol or the network hardware on the remote computer."),
+ 0xC000013F: ("STATUS_LINK_TIMEOUT","{Virtual Circuit Closed} The network transport on your computer has closed a network connection because it had to wait too long for a response from the remote computer."),
+ 0xC0000140: ("STATUS_INVALID_CONNECTION","The connection handle that was given to the transport was invalid."),
+ 0xC0000141: ("STATUS_INVALID_ADDRESS","The address handle that was given to the transport was invalid."),
+ 0xC0000142: ("STATUS_DLL_INIT_FAILED","{DLL Initialization Failed} Initialization of the dynamic link library %hs failed. The process is terminating abnormally."),
+ 0xC0000143: ("STATUS_MISSING_SYSTEMFILE","{Missing System File} The required system file %hs is bad or missing."),
+ 0xC0000144: ("STATUS_UNHANDLED_EXCEPTION","{Application Error} The exception %s (0x%08lx) occurred in the application at location 0x%08lx."),
+ 0xC0000145: ("STATUS_APP_INIT_FAILURE","{Application Error} The application failed to initialize properly (0x%lx). Click OK to terminate the application."),
+ 0xC0000146: ("STATUS_PAGEFILE_CREATE_FAILED","{Unable to Create Paging File} The creation of the paging file %hs failed (%lx). The requested size was %ld."),
+ 0xC0000147: ("STATUS_NO_PAGEFILE","{No Paging File Specified} No paging file was specified in the system configuration."),
+ 0xC0000148: ("STATUS_INVALID_LEVEL","{Incorrect System Call Level} An invalid level was passed into the specified system call."),
+ 0xC0000149: ("STATUS_WRONG_PASSWORD_CORE","{Incorrect Password to LAN Manager Server} You specified an incorrect password to a LAN Manager 2.x or MS-NET server."),
+ 0xC000014A: ("STATUS_ILLEGAL_FLOAT_CONTEXT","{EXCEPTION} A real-mode application issued a floating-point instruction and floating-point hardware is not present."),
+ 0xC000014B: ("STATUS_PIPE_BROKEN","The pipe operation has failed because the other end of the pipe has been closed."),
+ 0xC000014C: ("STATUS_REGISTRY_CORRUPT","{The Registry Is Corrupt} The structure of one of the files that contains registry data is corrupt; the image of the file in memory is corrupt; or the file could not be recovered because the alternate copy or log was absent or corrupt."),
+ 0xC000014D: ("STATUS_REGISTRY_IO_FAILED","An I/O operation initiated by the Registry failed and cannot be recovered. The registry could not read in, write out, or flush one of the files that contain the system's image of the registry."),
+ 0xC000014E: ("STATUS_NO_EVENT_PAIR","An event pair synchronization operation was performed using the thread-specific client/server event pair object, but no event pair object was associated with the thread."),
+ 0xC000014F: ("STATUS_UNRECOGNIZED_VOLUME","The volume does not contain a recognized file system. Be sure that all required file system drivers are loaded and that the volume is not corrupt."),
+ 0xC0000150: ("STATUS_SERIAL_NO_DEVICE_INITED","No serial device was successfully initialized. The serial driver will unload."),
+ 0xC0000151: ("STATUS_NO_SUCH_ALIAS","The specified local group does not exist."),
+ 0xC0000152: ("STATUS_MEMBER_NOT_IN_ALIAS","The specified account name is not a member of the group."),
+ 0xC0000153: ("STATUS_MEMBER_IN_ALIAS","The specified account name is already a member of the group."),
+ 0xC0000154: ("STATUS_ALIAS_EXISTS","The specified local group already exists."),
+ 0xC0000155: ("STATUS_LOGON_NOT_GRANTED","A requested type of logon (for example, interactive, network, and service) is not granted by the local security policy of the target system. Ask the system administrator to grant the necessary form of logon."),
+ 0xC0000156: ("STATUS_TOO_MANY_SECRETS","The maximum number of secrets that may be stored in a single system was exceeded. The length and number of secrets is limited to satisfy U.S. State Department export restrictions."),
+ 0xC0000157: ("STATUS_SECRET_TOO_LONG","The length of a secret exceeds the maximum allowable length. The length and number of secrets is limited to satisfy U.S. State Department export restrictions."),
+ 0xC0000158: ("STATUS_INTERNAL_DB_ERROR","The local security authority (LSA) database contains an internal inconsistency."),
+ 0xC0000159: ("STATUS_FULLSCREEN_MODE","The requested operation cannot be performed in full-screen mode."),
+ 0xC000015A: ("STATUS_TOO_MANY_CONTEXT_IDS","During a logon attempt, the user's security context accumulated too many security IDs. This is a very unusual situation. Remove the user from some global or local groups to reduce the number of security IDs to incorporate into the security context."),
+ 0xC000015B: ("STATUS_LOGON_TYPE_NOT_GRANTED","A user has requested a type of logon (for example, interactive or network) that has not been granted. An administrator has control over who may logon interactively and through the network."),
+ 0xC000015C: ("STATUS_NOT_REGISTRY_FILE","The system has attempted to load or restore a file into the registry, and the specified file is not in the format of a registry file."),
+ 0xC000015D: ("STATUS_NT_CROSS_ENCRYPTION_REQUIRED","An attempt was made to change a user password in the security account manager without providing the necessary Windows cross-encrypted password."),
+ 0xC000015E: ("STATUS_DOMAIN_CTRLR_CONFIG_ERROR","A Windows Server has an incorrect configuration."),
+ 0xC000015F: ("STATUS_FT_MISSING_MEMBER","An attempt was made to explicitly access the secondary copy of information via a device control to the fault tolerance driver and the secondary copy is not present in the system."),
+ 0xC0000160: ("STATUS_ILL_FORMED_SERVICE_ENTRY","A configuration registry node that represents a driver service entry was ill-formed and did not contain the required value entries."),
+ 0xC0000161: ("STATUS_ILLEGAL_CHARACTER","An illegal character was encountered. For a multibyte character set, this includes a lead byte without a succeeding trail byte. For the Unicode character set this includes the characters 0xFFFF and 0xFFFE."),
+ 0xC0000162: ("STATUS_UNMAPPABLE_CHARACTER","No mapping for the Unicode character exists in the target multibyte code page."),
+ 0xC0000163: ("STATUS_UNDEFINED_CHARACTER","The Unicode character is not defined in the Unicode character set that is installed on the system."),
+ 0xC0000164: ("STATUS_FLOPPY_VOLUME","The paging file cannot be created on a floppy disk."),
+ 0xC0000165: ("STATUS_FLOPPY_ID_MARK_NOT_FOUND","{Floppy Disk Error} While accessing a floppy disk, an ID address mark was not found."),
+ 0xC0000166: ("STATUS_FLOPPY_WRONG_CYLINDER","{Floppy Disk Error} While accessing a floppy disk, the track address from the sector ID field was found to be different from the track address that is maintained by the controller."),
+ 0xC0000167: ("STATUS_FLOPPY_UNKNOWN_ERROR","{Floppy Disk Error} The floppy disk controller reported an error that is not recognized by the floppy disk driver."),
+ 0xC0000168: ("STATUS_FLOPPY_BAD_REGISTERS","{Floppy Disk Error} While accessing a floppy-disk, the controller returned inconsistent results via its registers."),
+ 0xC0000169: ("STATUS_DISK_RECALIBRATE_FAILED","{Hard Disk Error} While accessing the hard disk, a recalibrate operation failed, even after retries."),
+ 0xC000016A: ("STATUS_DISK_OPERATION_FAILED","{Hard Disk Error} While accessing the hard disk, a disk operation failed even after retries."),
+ 0xC000016B: ("STATUS_DISK_RESET_FAILED","{Hard Disk Error} While accessing the hard disk, a disk controller reset was needed, but even that failed."),
+ 0xC000016C: ("STATUS_SHARED_IRQ_BUSY","An attempt was made to open a device that was sharing an interrupt request (IRQ) with other devices. At least one other device that uses that IRQ was already opened. Two concurrent opens of devices that share an IRQ and only work via interrupts is not supported for the particular bus type that the devices use."),
+ 0xC000016D: ("STATUS_FT_ORPHANING","{FT Orphaning} A disk that is part of a fault-tolerant volume can no longer be accessed."),
+ 0xC000016E: ("STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT","The basic input/output system (BIOS) failed to connect a system interrupt to the device or bus for which the device is connected."),
+ 0xC0000172: ("STATUS_PARTITION_FAILURE","The tape could not be partitioned."),
+ 0xC0000173: ("STATUS_INVALID_BLOCK_LENGTH","When accessing a new tape of a multi-volume partition, the current blocksize is incorrect."),
+ 0xC0000174: ("STATUS_DEVICE_NOT_PARTITIONED","The tape partition information could not be found when loading a tape."),
+ 0xC0000175: ("STATUS_UNABLE_TO_LOCK_MEDIA","An attempt to lock the eject media mechanism failed."),
+ 0xC0000176: ("STATUS_UNABLE_TO_UNLOAD_MEDIA","An attempt to unload media failed."),
+ 0xC0000177: ("STATUS_EOM_OVERFLOW","The physical end of tape was detected."),
+ 0xC0000178: ("STATUS_NO_MEDIA","{No Media} There is no media in the drive. Insert media into drive %hs."),
+ 0xC000017A: ("STATUS_NO_SUCH_MEMBER","A member could not be added to or removed from the local group because the member does not exist."),
+ 0xC000017B: ("STATUS_INVALID_MEMBER","A new member could not be added to a local group because the member has the wrong account type."),
+ 0xC000017C: ("STATUS_KEY_DELETED","An illegal operation was attempted on a registry key that has been marked for deletion."),
+ 0xC000017D: ("STATUS_NO_LOG_SPACE","The system could not allocate the required space in a registry log."),
+ 0xC000017E: ("STATUS_TOO_MANY_SIDS","Too many SIDs have been specified."),
+ 0xC000017F: ("STATUS_LM_CROSS_ENCRYPTION_REQUIRED","An attempt was made to change a user password in the security account manager without providing the necessary LM cross-encrypted password."),
+ 0xC0000180: ("STATUS_KEY_HAS_CHILDREN","An attempt was made to create a symbolic link in a registry key that already has subkeys or values."),
+ 0xC0000181: ("STATUS_CHILD_MUST_BE_VOLATILE","An attempt was made to create a stable subkey under a volatile parent key."),
+ 0xC0000182: ("STATUS_DEVICE_CONFIGURATION_ERROR","The I/O device is configured incorrectly or the configuration parameters to the driver are incorrect."),
+ 0xC0000183: ("STATUS_DRIVER_INTERNAL_ERROR","An error was detected between two drivers or within an I/O driver."),
+ 0xC0000184: ("STATUS_INVALID_DEVICE_STATE","The device is not in a valid state to perform this request."),
+ 0xC0000185: ("STATUS_IO_DEVICE_ERROR","The I/O device reported an I/O error."),
+ 0xC0000186: ("STATUS_DEVICE_PROTOCOL_ERROR","A protocol error was detected between the driver and the device."),
+ 0xC0000187: ("STATUS_BACKUP_CONTROLLER","This operation is only allowed for the primary domain controller of the domain."),
+ 0xC0000188: ("STATUS_LOG_FILE_FULL","The log file space is insufficient to support this operation."),
+ 0xC0000189: ("STATUS_TOO_LATE","A write operation was attempted to a volume after it was dismounted."),
+ 0xC000018A: ("STATUS_NO_TRUST_LSA_SECRET","The workstation does not have a trust secret for the primary domain in the local LSA database."),
+ 0xC000018B: ("STATUS_NO_TRUST_SAM_ACCOUNT","The SAM database on the Windows Server does not have a computer account for this workstation trust relationship."),
+ 0xC000018C: ("STATUS_TRUSTED_DOMAIN_FAILURE","The logon request failed because the trust relationship between the primary domain and the trusted domain failed."),
+ 0xC000018D: ("STATUS_TRUSTED_RELATIONSHIP_FAILURE","The logon request failed because the trust relationship between this workstation and the primary domain failed."),
+ 0xC000018E: ("STATUS_EVENTLOG_FILE_CORRUPT","The Eventlog log file is corrupt."),
+ 0xC000018F: ("STATUS_EVENTLOG_CANT_START","No Eventlog log file could be opened. The Eventlog service did not start."),
+ 0xC0000190: ("STATUS_TRUST_FAILURE","The network logon failed. This may be because the validation authority cannot be reached."),
+ 0xC0000191: ("STATUS_MUTANT_LIMIT_EXCEEDED","An attempt was made to acquire a mutant such that its maximum count would have been exceeded."),
+ 0xC0000192: ("STATUS_NETLOGON_NOT_STARTED","An attempt was made to logon, but the NetLogon service was not started."),
+ 0xC0000193: ("STATUS_ACCOUNT_EXPIRED","The user account has expired."),
+ 0xC0000194: ("STATUS_POSSIBLE_DEADLOCK","{EXCEPTION} Possible deadlock condition."),
+ 0xC0000195: ("STATUS_NETWORK_CREDENTIAL_CONFLICT","Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again."),
+ 0xC0000196: ("STATUS_REMOTE_SESSION_LIMIT","An attempt was made to establish a session to a network server, but there are already too many sessions established to that server."),
+ 0xC0000197: ("STATUS_EVENTLOG_FILE_CHANGED","The log file has changed between reads."),
+ 0xC0000198: ("STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT","The account used is an interdomain trust account. Use your global user account or local user account to access this server."),
+ 0xC0000199: ("STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT","The account used is a computer account. Use your global user account or local user account to access this server."),
+ 0xC000019A: ("STATUS_NOLOGON_SERVER_TRUST_ACCOUNT","The account used is a server trust account. Use your global user account or local user account to access this server."),
+ 0xC000019B: ("STATUS_DOMAIN_TRUST_INCONSISTENT","The name or SID of the specified domain is inconsistent with the trust information for that domain."),
+ 0xC000019C: ("STATUS_FS_DRIVER_REQUIRED","A volume has been accessed for which a file system driver is required that has not yet been loaded."),
+ 0xC000019D: ("STATUS_IMAGE_ALREADY_LOADED_AS_DLL","Indicates that the specified image is already loaded as a DLL."),
+ 0xC000019E: ("STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING","Short name settings may not be changed on this volume due to the global registry setting."),
+ 0xC000019F: ("STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME","Short names are not enabled on this volume."),
+ 0xC00001A0: ("STATUS_SECURITY_STREAM_IS_INCONSISTENT","The security stream for the given volume is in an inconsistent state. Please run CHKDSK on the volume."),
+ 0xC00001A1: ("STATUS_INVALID_LOCK_RANGE","A requested file lock operation cannot be processed due to an invalid byte range."),
+ 0xC00001A2: ("STATUS_INVALID_ACE_CONDITION","The specified access control entry (ACE) contains an invalid condition."),
+ 0xC00001A3: ("STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT","The subsystem needed to support the image type is not present."),
+ 0xC00001A4: ("STATUS_NOTIFICATION_GUID_ALREADY_DEFINED","The specified file already has a notification GUID associated with it."),
+ 0xC0000201: ("STATUS_NETWORK_OPEN_RESTRICTION","A remote open failed because the network open restrictions were not satisfied."),
+ 0xC0000202: ("STATUS_NO_USER_SESSION_KEY","There is no user session key for the specified logon session."),
+ 0xC0000203: ("STATUS_USER_SESSION_DELETED","The remote user session has been deleted."),
+ 0xC0000204: ("STATUS_RESOURCE_LANG_NOT_FOUND","Indicates the specified resource language ID cannot be found in the image file."),
+ 0xC0000205: ("STATUS_INSUFF_SERVER_RESOURCES","Insufficient server resources exist to complete the request."),
+ 0xC0000206: ("STATUS_INVALID_BUFFER_SIZE","The size of the buffer is invalid for the specified operation."),
+ 0xC0000207: ("STATUS_INVALID_ADDRESS_COMPONENT","The transport rejected the specified network address as invalid."),
+ 0xC0000208: ("STATUS_INVALID_ADDRESS_WILDCARD","The transport rejected the specified network address due to invalid use of a wildcard."),
+ 0xC0000209: ("STATUS_TOO_MANY_ADDRESSES","The transport address could not be opened because all the available addresses are in use."),
+ 0xC000020A: ("STATUS_ADDRESS_ALREADY_EXISTS","The transport address could not be opened because it already exists."),
+ 0xC000020B: ("STATUS_ADDRESS_CLOSED","The transport address is now closed."),
+ 0xC000020C: ("STATUS_CONNECTION_DISCONNECTED","The transport connection is now disconnected."),
+ 0xC000020D: ("STATUS_CONNECTION_RESET","The transport connection has been reset."),
+ 0xC000020E: ("STATUS_TOO_MANY_NODES","The transport cannot dynamically acquire any more nodes."),
+ 0xC000020F: ("STATUS_TRANSACTION_ABORTED","The transport aborted a pending transaction."),
+ 0xC0000210: ("STATUS_TRANSACTION_TIMED_OUT","The transport timed out a request that is waiting for a response."),
+ 0xC0000211: ("STATUS_TRANSACTION_NO_RELEASE","The transport did not receive a release for a pending response."),
+ 0xC0000212: ("STATUS_TRANSACTION_NO_MATCH","The transport did not find a transaction that matches the specific token."),
+ 0xC0000213: ("STATUS_TRANSACTION_RESPONDED","The transport had previously responded to a transaction request."),
+ 0xC0000214: ("STATUS_TRANSACTION_INVALID_ID","The transport does not recognize the specified transaction request ID."),
+ 0xC0000215: ("STATUS_TRANSACTION_INVALID_TYPE","The transport does not recognize the specified transaction request type."),
+ 0xC0000216: ("STATUS_NOT_SERVER_SESSION","The transport can only process the specified request on the server side of a session."),
+ 0xC0000217: ("STATUS_NOT_CLIENT_SESSION","The transport can only process the specified request on the client side of a session."),
+ 0xC0000218: ("STATUS_CANNOT_LOAD_REGISTRY_FILE","{Registry File Failure} The registry cannot load the hive (file): %hs or its log or alternate. It is corrupt, absent, or not writable."),
+ 0xC0000219: ("STATUS_DEBUG_ATTACH_FAILED","{Unexpected Failure in DebugActiveProcess} An unexpected failure occurred while processing a DebugActiveProcess API request. You may choose OK to terminate the process, or Cancel to ignore the error."),
+ 0xC000021A: ("STATUS_SYSTEM_PROCESS_TERMINATED","{Fatal System Error} The %hs system process terminated unexpectedly with a status of 0x%08x (0x%08x 0x%08x). The system has been shut down."),
+ 0xC000021B: ("STATUS_DATA_NOT_ACCEPTED","{Data Not Accepted} The TDI client could not handle the data received during an indication."),
+ 0xC000021C: ("STATUS_NO_BROWSER_SERVERS_FOUND","{Unable to Retrieve Browser Server List} The list of servers for this workgroup is not currently available."),
+ 0xC000021D: ("STATUS_VDM_HARD_ERROR","NTVDM encountered a hard error."),
+ 0xC000021E: ("STATUS_DRIVER_CANCEL_TIMEOUT","{Cancel Timeout} The driver %hs failed to complete a canceled I/O request in the allotted time."),
+ 0xC000021F: ("STATUS_REPLY_MESSAGE_MISMATCH","{Reply Message Mismatch} An attempt was made to reply to an LPC message, but the thread specified by the client ID in the message was not waiting on that message."),
+ 0xC0000220: ("STATUS_MAPPED_ALIGNMENT","{Mapped View Alignment Incorrect} An attempt was made to map a view of a file, but either the specified base address or the offset into the file were not aligned on the proper allocation granularity."),
+ 0xC0000221: ("STATUS_IMAGE_CHECKSUM_MISMATCH","{Bad Image Checksum} The image %hs is possibly corrupt. The header checksum does not match the computed checksum."),
+ 0xC0000222: ("STATUS_LOST_WRITEBEHIND_DATA","{Delayed Write Failed} Windows was unable to save all the data for the file %hs. The data has been lost. This error may be caused by a failure of your computer hardware or network connection. Try to save this file elsewhere."),
+ 0xC0000223: ("STATUS_CLIENT_SERVER_PARAMETERS_INVALID","The parameters passed to the server in the client/server shared memory window were invalid. Too much data may have been put in the shared memory window."),
+ 0xC0000224: ("STATUS_PASSWORD_MUST_CHANGE","The user password must be changed before logging on the first time."),
+ 0xC0000225: ("STATUS_NOT_FOUND","The object was not found."),
+ 0xC0000226: ("STATUS_NOT_TINY_STREAM","The stream is not a tiny stream."),
+ 0xC0000227: ("STATUS_RECOVERY_FAILURE","A transaction recovery failed."),
+ 0xC0000228: ("STATUS_STACK_OVERFLOW_READ","The request must be handled by the stack overflow code."),
+ 0xC0000229: ("STATUS_FAIL_CHECK","A consistency check failed."),
+ 0xC000022A: ("STATUS_DUPLICATE_OBJECTID","The attempt to insert the ID in the index failed because the ID is already in the index."),
+ 0xC000022B: ("STATUS_OBJECTID_EXISTS","The attempt to set the object ID failed because the object already has an ID."),
+ 0xC000022C: ("STATUS_CONVERT_TO_LARGE","Internal OFS status codes indicating how an allocation operation is handled. Either it is retried after the containing oNode is moved or the extent stream is converted to a large stream."),
+ 0xC000022D: ("STATUS_RETRY","The request needs to be retried."),
+ 0xC000022E: ("STATUS_FOUND_OUT_OF_SCOPE","The attempt to find the object found an object on the volume that matches by ID; however, it is out of the scope of the handle that is used for the operation."),
+ 0xC000022F: ("STATUS_ALLOCATE_BUCKET","The bucket array must be grown. Retry the transaction after doing so."),
+ 0xC0000230: ("STATUS_PROPSET_NOT_FOUND","The specified property set does not exist on the object."),
+ 0xC0000231: ("STATUS_MARSHALL_OVERFLOW","The user/kernel marshaling buffer has overflowed."),
+ 0xC0000232: ("STATUS_INVALID_VARIANT","The supplied variant structure contains invalid data."),
+ 0xC0000233: ("STATUS_DOMAIN_CONTROLLER_NOT_FOUND","A domain controller for this domain was not found."),
+ 0xC0000234: ("STATUS_ACCOUNT_LOCKED_OUT","The user account has been automatically locked because too many invalid logon attempts or password change attempts have been requested."),
+ 0xC0000235: ("STATUS_HANDLE_NOT_CLOSABLE","NtClose was called on a handle that was protected from close via NtSetInformationObject."),
+ 0xC0000236: ("STATUS_CONNECTION_REFUSED","The transport-connection attempt was refused by the remote system."),
+ 0xC0000237: ("STATUS_GRACEFUL_DISCONNECT","The transport connection was gracefully closed."),
+ 0xC0000238: ("STATUS_ADDRESS_ALREADY_ASSOCIATED","The transport endpoint already has an address associated with it."),
+ 0xC0000239: ("STATUS_ADDRESS_NOT_ASSOCIATED","An address has not yet been associated with the transport endpoint."),
+ 0xC000023A: ("STATUS_CONNECTION_INVALID","An operation was attempted on a nonexistent transport connection."),
+ 0xC000023B: ("STATUS_CONNECTION_ACTIVE","An invalid operation was attempted on an active transport connection."),
+ 0xC000023C: ("STATUS_NETWORK_UNREACHABLE","The remote network is not reachable by the transport."),
+ 0xC000023D: ("STATUS_HOST_UNREACHABLE","The remote system is not reachable by the transport."),
+ 0xC000023E: ("STATUS_PROTOCOL_UNREACHABLE","The remote system does not support the transport protocol."),
+ 0xC000023F: ("STATUS_PORT_UNREACHABLE","No service is operating at the destination port of the transport on the remote system."),
+ 0xC0000240: ("STATUS_REQUEST_ABORTED","The request was aborted."),
+ 0xC0000241: ("STATUS_CONNECTION_ABORTED","The transport connection was aborted by the local system."),
+ 0xC0000242: ("STATUS_BAD_COMPRESSION_BUFFER","The specified buffer contains ill-formed data."),
+ 0xC0000243: ("STATUS_USER_MAPPED_FILE","The requested operation cannot be performed on a file with a user mapped section open."),
+ 0xC0000244: ("STATUS_AUDIT_FAILED","{Audit Failed} An attempt to generate a security audit failed."),
+ 0xC0000245: ("STATUS_TIMER_RESOLUTION_NOT_SET","The timer resolution was not previously set by the current process."),
+ 0xC0000246: ("STATUS_CONNECTION_COUNT_LIMIT","A connection to the server could not be made because the limit on the number of concurrent connections for this account has been reached."),
+ 0xC0000247: ("STATUS_LOGIN_TIME_RESTRICTION","Attempting to log on during an unauthorized time of day for this account."),
+ 0xC0000248: ("STATUS_LOGIN_WKSTA_RESTRICTION","The account is not authorized to log on from this station."),
+ 0xC0000249: ("STATUS_IMAGE_MP_UP_MISMATCH","{UP/MP Image Mismatch} The image %hs has been modified for use on a uniprocessor system, but you are running it on a multiprocessor machine. Reinstall the image file."),
+ 0xC0000250: ("STATUS_INSUFFICIENT_LOGON_INFO","There is insufficient account information to log you on."),
+ 0xC0000251: ("STATUS_BAD_DLL_ENTRYPOINT","{Invalid DLL Entrypoint} The dynamic link library %hs is not written correctly. The stack pointer has been left in an inconsistent state. The entry point should be declared as WINAPI or STDCALL. Select YES to fail the DLL load. Select NO to continue execution. Selecting NO may cause the application to operate incorrectly."),
+ 0xC0000252: ("STATUS_BAD_SERVICE_ENTRYPOINT","{Invalid Service Callback Entrypoint} The %hs service is not written correctly. The stack pointer has been left in an inconsistent state. The callback entry point should be declared as WINAPI or STDCALL. Selecting OK will cause the service to continue operation. However, the service process may operate incorrectly."),
+ 0xC0000253: ("STATUS_LPC_REPLY_LOST","The server received the messages but did not send a reply."),
+ 0xC0000254: ("STATUS_IP_ADDRESS_CONFLICT1","There is an IP address conflict with another system on the network."),
+ 0xC0000255: ("STATUS_IP_ADDRESS_CONFLICT2","There is an IP address conflict with another system on the network."),
+ 0xC0000256: ("STATUS_REGISTRY_QUOTA_LIMIT","{Low On Registry Space} The system has reached the maximum size that is allowed for the system part of the registry. Additional storage requests will be ignored."),
+ 0xC0000257: ("STATUS_PATH_NOT_COVERED","The contacted server does not support the indicated part of the DFS namespace."),
+ 0xC0000258: ("STATUS_NO_CALLBACK_ACTIVE","A callback return system service cannot be executed when no callback is active."),
+ 0xC0000259: ("STATUS_LICENSE_QUOTA_EXCEEDED","The service being accessed is licensed for a particular number of connections. No more connections can be made to the service at this time because the service has already accepted the maximum number of connections."),
+ 0xC000025A: ("STATUS_PWD_TOO_SHORT","The password provided is too short to meet the policy of your user account. Choose a longer password."),
+ 0xC000025B: ("STATUS_PWD_TOO_RECENT","The policy of your user account does not allow you to change passwords too frequently. This is done to prevent users from changing back to a familiar, but potentially discovered, password. If you feel your password has been compromised, contact your administrator immediately to have a new one assigned."),
+ 0xC000025C: ("STATUS_PWD_HISTORY_CONFLICT","You have attempted to change your password to one that you have used in the past. The policy of your user account does not allow this. Select a password that you have not previously used."),
+ 0xC000025E: ("STATUS_PLUGPLAY_NO_DEVICE","You have attempted to load a legacy device driver while its device instance had been disabled."),
+ 0xC000025F: ("STATUS_UNSUPPORTED_COMPRESSION","The specified compression format is unsupported."),
+ 0xC0000260: ("STATUS_INVALID_HW_PROFILE","The specified hardware profile configuration is invalid."),
+ 0xC0000261: ("STATUS_INVALID_PLUGPLAY_DEVICE_PATH","The specified Plug and Play registry device path is invalid."),
+ 0xC0000262: ("STATUS_DRIVER_ORDINAL_NOT_FOUND","{Driver Entry Point Not Found} The %hs device driver could not locate the ordinal %ld in driver %hs."),
+ 0xC0000263: ("STATUS_DRIVER_ENTRYPOINT_NOT_FOUND","{Driver Entry Point Not Found} The %hs device driver could not locate the entry point %hs in driver %hs."),
+ 0xC0000264: ("STATUS_RESOURCE_NOT_OWNED","{Application Error} The application attempted to release a resource it did not own. Click OK to terminate the application."),
+ 0xC0000265: ("STATUS_TOO_MANY_LINKS","An attempt was made to create more links on a file than the file system supports."),
+ 0xC0000266: ("STATUS_QUOTA_LIST_INCONSISTENT","The specified quota list is internally inconsistent with its descriptor."),
+ 0xC0000267: ("STATUS_FILE_IS_OFFLINE","The specified file has been relocated to offline storage."),
+ 0xC0000268: ("STATUS_EVALUATION_EXPIRATION","{Windows Evaluation Notification} The evaluation period for this installation of Windows has expired. This system will shutdown in 1 hour. To restore access to this installation of Windows, upgrade this installation by using a licensed distribution of this product."),
+ 0xC0000269: ("STATUS_ILLEGAL_DLL_RELOCATION","{Illegal System DLL Relocation} The system DLL %hs was relocated in memory. The application will not run properly. The relocation occurred because the DLL %hs occupied an address range that is reserved for Windows system DLLs. The vendor supplying the DLL should be contacted for a new DLL."),
+ 0xC000026A: ("STATUS_LICENSE_VIOLATION","{License Violation} The system has detected tampering with your registered product type. This is a violation of your software license. Tampering with the product type is not permitted."),
+ 0xC000026B: ("STATUS_DLL_INIT_FAILED_LOGOFF","{DLL Initialization Failed} The application failed to initialize because the window station is shutting down."),
+ 0xC000026C: ("STATUS_DRIVER_UNABLE_TO_LOAD","{Unable to Load Device Driver} %hs device driver could not be loaded. Error Status was 0x%x."),
+ 0xC000026D: ("STATUS_DFS_UNAVAILABLE","DFS is unavailable on the contacted server."),
+ 0xC000026E: ("STATUS_VOLUME_DISMOUNTED","An operation was attempted to a volume after it was dismounted."),
+ 0xC000026F: ("STATUS_WX86_INTERNAL_ERROR","An internal error occurred in the Win32 x86 emulation subsystem."),
+ 0xC0000270: ("STATUS_WX86_FLOAT_STACK_CHECK","Win32 x86 emulation subsystem floating-point stack check."),
+ 0xC0000271: ("STATUS_VALIDATE_CONTINUE","The validation process needs to continue on to the next step."),
+ 0xC0000272: ("STATUS_NO_MATCH","There was no match for the specified key in the index."),
+ 0xC0000273: ("STATUS_NO_MORE_MATCHES","There are no more matches for the current index enumeration."),
+ 0xC0000275: ("STATUS_NOT_A_REPARSE_POINT","The NTFS file or directory is not a reparse point."),
+ 0xC0000276: ("STATUS_IO_REPARSE_TAG_INVALID","The Windows I/O reparse tag passed for the NTFS reparse point is invalid."),
+ 0xC0000277: ("STATUS_IO_REPARSE_TAG_MISMATCH","The Windows I/O reparse tag does not match the one that is in the NTFS reparse point."),
+ 0xC0000278: ("STATUS_IO_REPARSE_DATA_INVALID","The user data passed for the NTFS reparse point is invalid."),
+ 0xC0000279: ("STATUS_IO_REPARSE_TAG_NOT_HANDLED","The layered file system driver for this I/O tag did not handle it when needed."),
+ 0xC0000280: ("STATUS_REPARSE_POINT_NOT_RESOLVED","The NTFS symbolic link could not be resolved even though the initial file name is valid."),
+ 0xC0000281: ("STATUS_DIRECTORY_IS_A_REPARSE_POINT","The NTFS directory is a reparse point."),
+ 0xC0000282: ("STATUS_RANGE_LIST_CONFLICT","The range could not be added to the range list because of a conflict."),
+ 0xC0000283: ("STATUS_SOURCE_ELEMENT_EMPTY","The specified medium changer source element contains no media."),
+ 0xC0000284: ("STATUS_DESTINATION_ELEMENT_FULL","The specified medium changer destination element already contains media."),
+ 0xC0000285: ("STATUS_ILLEGAL_ELEMENT_ADDRESS","The specified medium changer element does not exist."),
+ 0xC0000286: ("STATUS_MAGAZINE_NOT_PRESENT","The specified element is contained in a magazine that is no longer present."),
+ 0xC0000287: ("STATUS_REINITIALIZATION_NEEDED","The device requires re-initialization due to hardware errors."),
+ 0xC000028A: ("STATUS_ENCRYPTION_FAILED","The file encryption attempt failed."),
+ 0xC000028B: ("STATUS_DECRYPTION_FAILED","The file decryption attempt failed."),
+ 0xC000028C: ("STATUS_RANGE_NOT_FOUND","The specified range could not be found in the range list."),
+ 0xC000028D: ("STATUS_NO_RECOVERY_POLICY","There is no encryption recovery policy configured for this system."),
+ 0xC000028E: ("STATUS_NO_EFS","The required encryption driver is not loaded for this system."),
+ 0xC000028F: ("STATUS_WRONG_EFS","The file was encrypted with a different encryption driver than is currently loaded."),
+ 0xC0000290: ("STATUS_NO_USER_KEYS","There are no EFS keys defined for the user."),
+ 0xC0000291: ("STATUS_FILE_NOT_ENCRYPTED","The specified file is not encrypted."),
+ 0xC0000292: ("STATUS_NOT_EXPORT_FORMAT","The specified file is not in the defined EFS export format."),
+ 0xC0000293: ("STATUS_FILE_ENCRYPTED","The specified file is encrypted and the user does not have the ability to decrypt it."),
+ 0xC0000295: ("STATUS_WMI_GUID_NOT_FOUND","The GUID passed was not recognized as valid by a WMI data provider."),
+ 0xC0000296: ("STATUS_WMI_INSTANCE_NOT_FOUND","The instance name passed was not recognized as valid by a WMI data provider."),
+ 0xC0000297: ("STATUS_WMI_ITEMID_NOT_FOUND","The data item ID passed was not recognized as valid by a WMI data provider."),
+ 0xC0000298: ("STATUS_WMI_TRY_AGAIN","The WMI request could not be completed and should be retried."),
+ 0xC0000299: ("STATUS_SHARED_POLICY","The policy object is shared and can only be modified at the root."),
+ 0xC000029A: ("STATUS_POLICY_OBJECT_NOT_FOUND","The policy object does not exist when it should."),
+ 0xC000029B: ("STATUS_POLICY_ONLY_IN_DS","The requested policy information only lives in the Ds."),
+ 0xC000029C: ("STATUS_VOLUME_NOT_UPGRADED","The volume must be upgraded to enable this feature."),
+ 0xC000029D: ("STATUS_REMOTE_STORAGE_NOT_ACTIVE","The remote storage service is not operational at this time."),
+ 0xC000029E: ("STATUS_REMOTE_STORAGE_MEDIA_ERROR","The remote storage service encountered a media error."),
+ 0xC000029F: ("STATUS_NO_TRACKING_SERVICE","The tracking (workstation) service is not running."),
+ 0xC00002A0: ("STATUS_SERVER_SID_MISMATCH","The server process is running under a SID that is different from the SID that is required by client."),
+ 0xC00002A1: ("STATUS_DS_NO_ATTRIBUTE_OR_VALUE","The specified directory service attribute or value does not exist."),
+ 0xC00002A2: ("STATUS_DS_INVALID_ATTRIBUTE_SYNTAX","The attribute syntax specified to the directory service is invalid."),
+ 0xC00002A3: ("STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED","The attribute type specified to the directory service is not defined."),
+ 0xC00002A4: ("STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS","The specified directory service attribute or value already exists."),
+ 0xC00002A5: ("STATUS_DS_BUSY","The directory service is busy."),
+ 0xC00002A6: ("STATUS_DS_UNAVAILABLE","The directory service is unavailable."),
+ 0xC00002A7: ("STATUS_DS_NO_RIDS_ALLOCATED","The directory service was unable to allocate a relative identifier."),
+ 0xC00002A8: ("STATUS_DS_NO_MORE_RIDS","The directory service has exhausted the pool of relative identifiers."),
+ 0xC00002A9: ("STATUS_DS_INCORRECT_ROLE_OWNER","The requested operation could not be performed because the directory service is not the master for that type of operation."),
+ 0xC00002AA: ("STATUS_DS_RIDMGR_INIT_ERROR","The directory service was unable to initialize the subsystem that allocates relative identifiers."),
+ 0xC00002AB: ("STATUS_DS_OBJ_CLASS_VIOLATION","The requested operation did not satisfy one or more constraints that are associated with the class of the object."),
+ 0xC00002AC: ("STATUS_DS_CANT_ON_NON_LEAF","The directory service can perform the requested operation only on a leaf object."),
+ 0xC00002AD: ("STATUS_DS_CANT_ON_RDN","The directory service cannot perform the requested operation on the Relatively Defined Name (RDN) attribute of an object."),
+ 0xC00002AE: ("STATUS_DS_CANT_MOD_OBJ_CLASS","The directory service detected an attempt to modify the object class of an object."),
+ 0xC00002AF: ("STATUS_DS_CROSS_DOM_MOVE_FAILED","An error occurred while performing a cross domain move operation."),
+ 0xC00002B0: ("STATUS_DS_GC_NOT_AVAILABLE","Unable to contact the global catalog server."),
+ 0xC00002B1: ("STATUS_DIRECTORY_SERVICE_REQUIRED","The requested operation requires a directory service, and none was available."),
+ 0xC00002B2: ("STATUS_REPARSE_ATTRIBUTE_CONFLICT","The reparse attribute cannot be set because it is incompatible with an existing attribute."),
+ 0xC00002B3: ("STATUS_CANT_ENABLE_DENY_ONLY","A group marked \"use for deny only\" cannot be enabled."),
+ 0xC00002B4: ("STATUS_FLOAT_MULTIPLE_FAULTS","{EXCEPTION} Multiple floating-point faults."),
+ 0xC00002B5: ("STATUS_FLOAT_MULTIPLE_TRAPS","{EXCEPTION} Multiple floating-point traps."),
+ 0xC00002B6: ("STATUS_DEVICE_REMOVED","The device has been removed."),
+ 0xC00002B7: ("STATUS_JOURNAL_DELETE_IN_PROGRESS","The volume change journal is being deleted."),
+ 0xC00002B8: ("STATUS_JOURNAL_NOT_ACTIVE","The volume change journal is not active."),
+ 0xC00002B9: ("STATUS_NOINTERFACE","The requested interface is not supported."),
+ 0xC00002C1: ("STATUS_DS_ADMIN_LIMIT_EXCEEDED","A directory service resource limit has been exceeded."),
+ 0xC00002C2: ("STATUS_DRIVER_FAILED_SLEEP","{System Standby Failed} The driver %hs does not support standby mode. Updating this driver may allow the system to go to standby mode."),
+ 0xC00002C3: ("STATUS_MUTUAL_AUTHENTICATION_FAILED","Mutual Authentication failed. The server password is out of date at the domain controller."),
+ 0xC00002C4: ("STATUS_CORRUPT_SYSTEM_FILE","The system file %1 has become corrupt and has been replaced."),
+ 0xC00002C5: ("STATUS_DATATYPE_MISALIGNMENT_ERROR","{EXCEPTION} Alignment Error A data type misalignment error was detected in a load or store instruction."),
+ 0xC00002C6: ("STATUS_WMI_READ_ONLY","The WMI data item or data block is read-only."),
+ 0xC00002C7: ("STATUS_WMI_SET_FAILURE","The WMI data item or data block could not be changed."),
+ 0xC00002C8: ("STATUS_COMMITMENT_MINIMUM","{Virtual Memory Minimum Too Low} Your system is low on virtual memory. Windows is increasing the size of your virtual memory paging file. During this process, memory requests for some applications may be denied. For more information, see Help."),
+ 0xC00002C9: ("STATUS_REG_NAT_CONSUMPTION","{EXCEPTION} Register NaT consumption faults. A NaT value is consumed on a non-speculative instruction."),
+ 0xC00002CA: ("STATUS_TRANSPORT_FULL","The transport element of the medium changer contains media, which is causing the operation to fail."),
+ 0xC00002CB: ("STATUS_DS_SAM_INIT_FAILURE","Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information."),
+ 0xC00002CC: ("STATUS_ONLY_IF_CONNECTED","This operation is supported only when you are connected to the server."),
+ 0xC00002CD: ("STATUS_DS_SENSITIVE_GROUP_VIOLATION","Only an administrator can modify the membership list of an administrative group."),
+ 0xC00002CE: ("STATUS_PNP_RESTART_ENUMERATION","A device was removed so enumeration must be restarted."),
+ 0xC00002CF: ("STATUS_JOURNAL_ENTRY_DELETED","The journal entry has been deleted from the journal."),
+ 0xC00002D0: ("STATUS_DS_CANT_MOD_PRIMARYGROUPID","Cannot change the primary group ID of a domain controller account."),
+ 0xC00002D1: ("STATUS_SYSTEM_IMAGE_BAD_SIGNATURE","{Fatal System Error} The system image %s is not properly signed. The file has been replaced with the signed file. The system has been shut down."),
+ 0xC00002D2: ("STATUS_PNP_REBOOT_REQUIRED","The device will not start without a reboot."),
+ 0xC00002D3: ("STATUS_POWER_STATE_INVALID","The power state of the current device cannot support this request."),
+ 0xC00002D4: ("STATUS_DS_INVALID_GROUP_TYPE","The specified group type is invalid."),
+ 0xC00002D5: ("STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN","In a mixed domain, no nesting of a global group if the group is security enabled."),
+ 0xC00002D6: ("STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN","In a mixed domain, cannot nest local groups with other local groups, if the group is security enabled."),
+ 0xC00002D7: ("STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER","A global group cannot have a local group as a member."),
+ 0xC00002D8: ("STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER","A global group cannot have a universal group as a member."),
+ 0xC00002D9: ("STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER","A universal group cannot have a local group as a member."),
+ 0xC00002DA: ("STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER","A global group cannot have a cross-domain member."),
+ 0xC00002DB: ("STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER","A local group cannot have another cross-domain local group as a member."),
+ 0xC00002DC: ("STATUS_DS_HAVE_PRIMARY_MEMBERS","Cannot change to a security-disabled group because primary members are in this group."),
+ 0xC00002DD: ("STATUS_WMI_NOT_SUPPORTED","The WMI operation is not supported by the data block or method."),
+ 0xC00002DE: ("STATUS_INSUFFICIENT_POWER","There is not enough power to complete the requested operation."),
+ 0xC00002DF: ("STATUS_SAM_NEED_BOOTKEY_PASSWORD","The Security Accounts Manager needs to get the boot password."),
+ 0xC00002E0: ("STATUS_SAM_NEED_BOOTKEY_FLOPPY","The Security Accounts Manager needs to get the boot key from the floppy disk."),
+ 0xC00002E1: ("STATUS_DS_CANT_START","The directory service cannot start."),
+ 0xC00002E2: ("STATUS_DS_INIT_FAILURE","The directory service could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information."),
+ 0xC00002E3: ("STATUS_SAM_INIT_FAILURE","The Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Safe Mode. Check the event log for more detailed information."),
+ 0xC00002E4: ("STATUS_DS_GC_REQUIRED","The requested operation can be performed only on a global catalog server."),
+ 0xC00002E5: ("STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY","A local group can only be a member of other local groups in the same domain."),
+ 0xC00002E6: ("STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS","Foreign security principals cannot be members of universal groups."),
+ 0xC00002E7: ("STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED","Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."),
+ 0xC00002E9: ("STATUS_CURRENT_DOMAIN_NOT_ALLOWED","This operation cannot be performed on the current domain."),
+ 0xC00002EA: ("STATUS_CANNOT_MAKE","The directory or file cannot be created."),
+ 0xC00002EB: ("STATUS_SYSTEM_SHUTDOWN","The system is in the process of shutting down."),
+ 0xC00002EC: ("STATUS_DS_INIT_FAILURE_CONSOLE","Directory Services could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further."),
+ 0xC00002ED: ("STATUS_DS_SAM_INIT_FAILURE_CONSOLE","Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further."),
+ 0xC00002EE: ("STATUS_UNFINISHED_CONTEXT_DELETED","A security context was deleted before the context was completed. This is considered a logon failure."),
+ 0xC00002EF: ("STATUS_NO_TGT_REPLY","The client is trying to negotiate a context and the server requires user-to-user but did not send a TGT reply."),
+ 0xC00002F0: ("STATUS_OBJECTID_NOT_FOUND","An object ID was not found in the file."),
+ 0xC00002F1: ("STATUS_NO_IP_ADDRESSES","Unable to accomplish the requested task because the local machine does not have any IP addresses."),
+ 0xC00002F2: ("STATUS_WRONG_CREDENTIAL_HANDLE","The supplied credential handle does not match the credential that is associated with the security context."),
+ 0xC00002F3: ("STATUS_CRYPTO_SYSTEM_INVALID","The crypto system or checksum function is invalid because a required function is unavailable."),
+ 0xC00002F4: ("STATUS_MAX_REFERRALS_EXCEEDED","The number of maximum ticket referrals has been exceeded."),
+ 0xC00002F5: ("STATUS_MUST_BE_KDC","The local machine must be a Kerberos KDC (domain controller) and it is not."),
+ 0xC00002F6: ("STATUS_STRONG_CRYPTO_NOT_SUPPORTED","The other end of the security negotiation requires strong crypto but it is not supported on the local machine."),
+ 0xC00002F7: ("STATUS_TOO_MANY_PRINCIPALS","The KDC reply contained more than one principal name."),
+ 0xC00002F8: ("STATUS_NO_PA_DATA","Expected to find PA data for a hint of what etype to use, but it was not found."),
+ 0xC00002F9: ("STATUS_PKINIT_NAME_MISMATCH","The client certificate does not contain a valid UPN, or does not match the client name in the logon request. Contact your administrator."),
+ 0xC00002FA: ("STATUS_SMARTCARD_LOGON_REQUIRED","Smart card logon is required and was not used."),
+ 0xC00002FB: ("STATUS_KDC_INVALID_REQUEST","An invalid request was sent to the KDC."),
+ 0xC00002FC: ("STATUS_KDC_UNABLE_TO_REFER","The KDC was unable to generate a referral for the service requested."),
+ 0xC00002FD: ("STATUS_KDC_UNKNOWN_ETYPE","The encryption type requested is not supported by the KDC."),
+ 0xC00002FE: ("STATUS_SHUTDOWN_IN_PROGRESS","A system shutdown is in progress."),
+ 0xC00002FF: ("STATUS_SERVER_SHUTDOWN_IN_PROGRESS","The server machine is shutting down."),
+ 0xC0000300: ("STATUS_NOT_SUPPORTED_ON_SBS","This operation is not supported on a computer running Windows Server 2003 for Small Business Server."),
+ 0xC0000301: ("STATUS_WMI_GUID_DISCONNECTED","The WMI GUID is no longer available."),
+ 0xC0000302: ("STATUS_WMI_ALREADY_DISABLED","Collection or events for the WMI GUID is already disabled."),
+ 0xC0000303: ("STATUS_WMI_ALREADY_ENABLED","Collection or events for the WMI GUID is already enabled."),
+ 0xC0000304: ("STATUS_MFT_TOO_FRAGMENTED","The master file table on the volume is too fragmented to complete this operation."),
+ 0xC0000305: ("STATUS_COPY_PROTECTION_FAILURE","Copy protection failure."),
+ 0xC0000306: ("STATUS_CSS_AUTHENTICATION_FAILURE","Copy protection error-DVD CSS Authentication failed."),
+ 0xC0000307: ("STATUS_CSS_KEY_NOT_PRESENT","Copy protection error-The specified sector does not contain a valid key."),
+ 0xC0000308: ("STATUS_CSS_KEY_NOT_ESTABLISHED","Copy protection error-DVD session key not established."),
+ 0xC0000309: ("STATUS_CSS_SCRAMBLED_SECTOR","Copy protection error-The read failed because the sector is encrypted."),
+ 0xC000030A: ("STATUS_CSS_REGION_MISMATCH","Copy protection error-The region of the specified DVD does not correspond to the region setting of the drive."),
+ 0xC000030B: ("STATUS_CSS_RESETS_EXHAUSTED","Copy protection error-The region setting of the drive may be permanent."),
+ 0xC0000320: ("STATUS_PKINIT_FAILURE","The Kerberos protocol encountered an error while validating the KDC certificate during smart card logon. There is more information in the system event log."),
+ 0xC0000321: ("STATUS_SMARTCARD_SUBSYSTEM_FAILURE","The Kerberos protocol encountered an error while attempting to use the smart card subsystem."),
+ 0xC0000322: ("STATUS_NO_KERB_KEY","The target server does not have acceptable Kerberos credentials."),
+ 0xC0000350: ("STATUS_HOST_DOWN","The transport determined that the remote system is down."),
+ 0xC0000351: ("STATUS_UNSUPPORTED_PREAUTH","An unsupported pre-authentication mechanism was presented to the Kerberos package."),
+ 0xC0000352: ("STATUS_EFS_ALG_BLOB_TOO_BIG","The encryption algorithm that is used on the source file needs a bigger key buffer than the one that is used on the destination file."),
+ 0xC0000353: ("STATUS_PORT_NOT_SET","An attempt to remove a processes DebugPort was made, but a port was not already associated with the process."),
+ 0xC0000354: ("STATUS_DEBUGGER_INACTIVE","An attempt to do an operation on a debug port failed because the port is in the process of being deleted."),
+ 0xC0000355: ("STATUS_DS_VERSION_CHECK_FAILURE","This version of Windows is not compatible with the behavior version of the directory forest, domain, or domain controller."),
+ 0xC0000356: ("STATUS_AUDITING_DISABLED","The specified event is currently not being audited."),
+ 0xC0000357: ("STATUS_PRENT4_MACHINE_ACCOUNT","The machine account was created prior to Windows NT 4.0. The account needs to be recreated."),
+ 0xC0000358: ("STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER","An account group cannot have a universal group as a member."),
+ 0xC0000359: ("STATUS_INVALID_IMAGE_WIN_32","The specified image file did not have the correct format; it appears to be a 32-bit Windows image."),
+ 0xC000035A: ("STATUS_INVALID_IMAGE_WIN_64","The specified image file did not have the correct format; it appears to be a 64-bit Windows image."),
+ 0xC000035B: ("STATUS_BAD_BINDINGS","The client's supplied SSPI channel bindings were incorrect."),
+ 0xC000035C: ("STATUS_NETWORK_SESSION_EXPIRED","The client session has expired; so the client must re-authenticate to continue accessing the remote resources."),
+ 0xC000035D: ("STATUS_APPHELP_BLOCK","The AppHelp dialog box canceled; thus preventing the application from starting."),
+ 0xC000035E: ("STATUS_ALL_SIDS_FILTERED","The SID filtering operation removed all SIDs."),
+ 0xC000035F: ("STATUS_NOT_SAFE_MODE_DRIVER","The driver was not loaded because the system is starting in safe mode."),
+ 0xC0000361: ("STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT","Access to %1 has been restricted by your Administrator by the default software restriction policy level."),
+ 0xC0000362: ("STATUS_ACCESS_DISABLED_BY_POLICY_PATH","Access to %1 has been restricted by your Administrator by location with policy rule %2 placed on path %3."),
+ 0xC0000363: ("STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER","Access to %1 has been restricted by your Administrator by software publisher policy."),
+ 0xC0000364: ("STATUS_ACCESS_DISABLED_BY_POLICY_OTHER","Access to %1 has been restricted by your Administrator by policy rule %2."),
+ 0xC0000365: ("STATUS_FAILED_DRIVER_ENTRY","The driver was not loaded because it failed its initialization call."),
+ 0xC0000366: ("STATUS_DEVICE_ENUMERATION_ERROR","The device encountered an error while applying power or reading the device configuration. This may be caused by a failure of your hardware or by a poor connection."),
+ 0xC0000368: ("STATUS_MOUNT_POINT_NOT_RESOLVED","The create operation failed because the name contained at least one mount point that resolves to a volume to which the specified device object is not attached."),
+ 0xC0000369: ("STATUS_INVALID_DEVICE_OBJECT_PARAMETER","The device object parameter is either not a valid device object or is not attached to the volume that is specified by the file name."),
+ 0xC000036A: ("STATUS_MCA_OCCURED","A machine check error has occurred. Check the system event log for additional information."),
+ 0xC000036B: ("STATUS_DRIVER_BLOCKED_CRITICAL","Driver %2 has been blocked from loading."),
+ 0xC000036C: ("STATUS_DRIVER_BLOCKED","Driver %2 has been blocked from loading."),
+ 0xC000036D: ("STATUS_DRIVER_DATABASE_ERROR","There was error [%2] processing the driver database."),
+ 0xC000036E: ("STATUS_SYSTEM_HIVE_TOO_LARGE","System hive size has exceeded its limit."),
+ 0xC000036F: ("STATUS_INVALID_IMPORT_OF_NON_DLL","A dynamic link library (DLL) referenced a module that was neither a DLL nor the process's executable image."),
+ 0xC0000371: ("STATUS_NO_SECRETS","The local account store does not contain secret material for the specified account."),
+ 0xC0000372: ("STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY","Access to %1 has been restricted by your Administrator by policy rule %2."),
+ 0xC0000373: ("STATUS_FAILED_STACK_SWITCH","The system was not able to allocate enough memory to perform a stack switch."),
+ 0xC0000374: ("STATUS_HEAP_CORRUPTION","A heap has been corrupted."),
+ 0xC0000380: ("STATUS_SMARTCARD_WRONG_PIN","An incorrect PIN was presented to the smart card."),
+ 0xC0000381: ("STATUS_SMARTCARD_CARD_BLOCKED","The smart card is blocked."),
+ 0xC0000382: ("STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED","No PIN was presented to the smart card."),
+ 0xC0000383: ("STATUS_SMARTCARD_NO_CARD","No smart card is available."),
+ 0xC0000384: ("STATUS_SMARTCARD_NO_KEY_CONTAINER","The requested key container does not exist on the smart card."),
+ 0xC0000385: ("STATUS_SMARTCARD_NO_CERTIFICATE","The requested certificate does not exist on the smart card."),
+ 0xC0000386: ("STATUS_SMARTCARD_NO_KEYSET","The requested keyset does not exist."),
+ 0xC0000387: ("STATUS_SMARTCARD_IO_ERROR","A communication error with the smart card has been detected."),
+ 0xC0000388: ("STATUS_DOWNGRADE_DETECTED","The system detected a possible attempt to compromise security. Ensure that you can contact the server that authenticated you."),
+ 0xC0000389: ("STATUS_SMARTCARD_CERT_REVOKED","The smart card certificate used for authentication has been revoked. Contact your system administrator. There may be additional information in the event log."),
+ 0xC000038A: ("STATUS_ISSUING_CA_UNTRUSTED","An untrusted certificate authority was detected while processing the smart card certificate that is used for authentication. Contact your system administrator."),
+ 0xC000038B: ("STATUS_REVOCATION_OFFLINE_C","The revocation status of the smart card certificate that is used for authentication could not be determined. Contact your system administrator."),
+ 0xC000038C: ("STATUS_PKINIT_CLIENT_FAILURE","The smart card certificate used for authentication was not trusted. Contact your system administrator."),
+ 0xC000038D: ("STATUS_SMARTCARD_CERT_EXPIRED","The smart card certificate used for authentication has expired. Contact your system administrator."),
+ 0xC000038E: ("STATUS_DRIVER_FAILED_PRIOR_UNLOAD","The driver could not be loaded because a previous version of the driver is still in memory."),
+ 0xC000038F: ("STATUS_SMARTCARD_SILENT_CONTEXT","The smart card provider could not perform the action because the context was acquired as silent."),
+ 0xC0000401: ("STATUS_PER_USER_TRUST_QUOTA_EXCEEDED","The delegated trust creation quota of the current user has been exceeded."),
+ 0xC0000402: ("STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED","The total delegated trust creation quota has been exceeded."),
+ 0xC0000403: ("STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED","The delegated trust deletion quota of the current user has been exceeded."),
+ 0xC0000404: ("STATUS_DS_NAME_NOT_UNIQUE","The requested name already exists as a unique identifier."),
+ 0xC0000405: ("STATUS_DS_DUPLICATE_ID_FOUND","The requested object has a non-unique identifier and cannot be retrieved."),
+ 0xC0000406: ("STATUS_DS_GROUP_CONVERSION_ERROR","The group cannot be converted due to attribute restrictions on the requested group type."),
+ 0xC0000407: ("STATUS_VOLSNAP_PREPARE_HIBERNATE","{Volume Shadow Copy Service} Wait while the Volume Shadow Copy Service prepares volume %hs for hibernation."),
+ 0xC0000408: ("STATUS_USER2USER_REQUIRED","Kerberos sub-protocol User2User is required."),
+ 0xC0000409: ("STATUS_STACK_BUFFER_OVERRUN","The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application."),
+ 0xC000040A: ("STATUS_NO_S4U_PROT_SUPPORT","The Kerberos subsystem encountered an error. A service for user protocol request was made against a domain controller which does not support service for user."),
+ 0xC000040B: ("STATUS_CROSSREALM_DELEGATION_FAILURE","An attempt was made by this server to make a Kerberos constrained delegation request for a target that is outside the server realm. This action is not supported and the resulting error indicates a misconfiguration on the allowed-to-delegate-to list for this server. Contact your administrator."),
+ 0xC000040C: ("STATUS_REVOCATION_OFFLINE_KDC","The revocation status of the domain controller certificate used for smart card authentication could not be determined. There is additional information in the system event log. Contact your system administrator."),
+ 0xC000040D: ("STATUS_ISSUING_CA_UNTRUSTED_KDC","An untrusted certificate authority was detected while processing the domain controller certificate used for authentication. There is additional information in the system event log. Contact your system administrator."),
+ 0xC000040E: ("STATUS_KDC_CERT_EXPIRED","The domain controller certificate used for smart card logon has expired. Contact your system administrator with the contents of your system event log."),
+ 0xC000040F: ("STATUS_KDC_CERT_REVOKED","The domain controller certificate used for smart card logon has been revoked. Contact your system administrator with the contents of your system event log."),
+ 0xC0000410: ("STATUS_PARAMETER_QUOTA_EXCEEDED","Data present in one of the parameters is more than the function can operate on."),
+ 0xC0000411: ("STATUS_HIBERNATION_FAILURE","The system has failed to hibernate (The error code is %hs). Hibernation will be disabled until the system is restarted."),
+ 0xC0000412: ("STATUS_DELAY_LOAD_FAILED","An attempt to delay-load a .dll or get a function address in a delay-loaded .dll failed."),
+ 0xC0000413: ("STATUS_AUTHENTICATION_FIREWALL_FAILED","Logon Failure: The machine you are logging onto is protected by an authentication firewall. The specified account is not allowed to authenticate to the machine."),
+ 0xC0000414: ("STATUS_VDM_DISALLOWED","%hs is a 16-bit application. You do not have permissions to execute 16-bit applications. Check your permissions with your system administrator."),
+ 0xC0000415: ("STATUS_HUNG_DISPLAY_DRIVER_THREAD","{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the machine a dialog will be displayed giving you a chance to report this failure to Microsoft."),
+ 0xC0000416: ("STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE","The Desktop heap encountered an error while allocating session memory. There is more information in the system event log."),
+ 0xC0000417: ("STATUS_INVALID_CRUNTIME_PARAMETER","An invalid parameter was passed to a C runtime function."),
+ 0xC0000418: ("STATUS_NTLM_BLOCKED","The authentication failed because NTLM was blocked."),
+ 0xC0000419: ("STATUS_DS_SRC_SID_EXISTS_IN_FOREST","The source object's SID already exists in destination forest."),
+ 0xC000041A: ("STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST","The domain name of the trusted domain already exists in the forest."),
+ 0xC000041B: ("STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST","The flat name of the trusted domain already exists in the forest."),
+ 0xC000041C: ("STATUS_INVALID_USER_PRINCIPAL_NAME","The User Principal Name (UPN) is invalid."),
+ 0xC0000420: ("STATUS_ASSERTION_FAILURE","There has been an assertion failure."),
+ 0xC0000421: ("STATUS_VERIFIER_STOP","Application verifier has found an error in the current process."),
+ 0xC0000423: ("STATUS_CALLBACK_POP_STACK","A user mode unwind is in progress."),
+ 0xC0000424: ("STATUS_INCOMPATIBLE_DRIVER_BLOCKED","%2 has been blocked from loading due to incompatibility with this system. Contact your software vendor for a compatible version of the driver."),
+ 0xC0000425: ("STATUS_HIVE_UNLOADED","Illegal operation attempted on a registry key which has already been unloaded."),
+ 0xC0000426: ("STATUS_COMPRESSION_DISABLED","Compression is disabled for this volume."),
+ 0xC0000427: ("STATUS_FILE_SYSTEM_LIMITATION","The requested operation could not be completed due to a file system limitation."),
+ 0xC0000428: ("STATUS_INVALID_IMAGE_HASH","The hash for image %hs cannot be found in the system catalogs. The image is likely corrupt or the victim of tampering."),
+ 0xC0000429: ("STATUS_NOT_CAPABLE","The implementation is not capable of performing the request."),
+ 0xC000042A: ("STATUS_REQUEST_OUT_OF_SEQUENCE","The requested operation is out of order with respect to other operations."),
+ 0xC000042B: ("STATUS_IMPLEMENTATION_LIMIT","An operation attempted to exceed an implementation-defined limit."),
+ 0xC000042C: ("STATUS_ELEVATION_REQUIRED","The requested operation requires elevation."),
+ 0xC000042D: ("STATUS_NO_SECURITY_CONTEXT","The required security context does not exist."),
+ 0xC000042E: ("STATUS_PKU2U_CERT_FAILURE","The PKU2U protocol encountered an error while attempting to utilize the associated certificates."),
+ 0xC0000432: ("STATUS_BEYOND_VDL","The operation was attempted beyond the valid data length of the file."),
+ 0xC0000433: ("STATUS_ENCOUNTERED_WRITE_IN_PROGRESS","The attempted write operation encountered a write already in progress for some portion of the range."),
+ 0xC0000434: ("STATUS_PTE_CHANGED","The page fault mappings changed in the middle of processing a fault so the operation must be retried."),
+ 0xC0000435: ("STATUS_PURGE_FAILED","The attempt to purge this file from memory failed to purge some or all the data from memory."),
+ 0xC0000440: ("STATUS_CRED_REQUIRES_CONFIRMATION","The requested credential requires confirmation."),
+ 0xC0000441: ("STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE","The remote server sent an invalid response for a file being opened with Client Side Encryption."),
+ 0xC0000442: ("STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER","Client Side Encryption is not supported by the remote server even though it claims to support it."),
+ 0xC0000443: ("STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE","File is encrypted and should be opened in Client Side Encryption mode."),
+ 0xC0000444: ("STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE","A new encrypted file is being created and a $EFS needs to be provided."),
+ 0xC0000445: ("STATUS_CS_ENCRYPTION_FILE_NOT_CSE","The SMB client requested a CSE FSCTL on a non-CSE file."),
+ 0xC0000446: ("STATUS_INVALID_LABEL","Indicates a particular Security ID may not be assigned as the label of an object."),
+ 0xC0000450: ("STATUS_DRIVER_PROCESS_TERMINATED","The process hosting the driver for this device has terminated."),
+ 0xC0000451: ("STATUS_AMBIGUOUS_SYSTEM_DEVICE","The requested system device cannot be identified due to multiple indistinguishable devices potentially matching the identification criteria."),
+ 0xC0000452: ("STATUS_SYSTEM_DEVICE_NOT_FOUND","The requested system device cannot be found."),
+ 0xC0000453: ("STATUS_RESTART_BOOT_APPLICATION","This boot application must be restarted."),
+ 0xC0000454: ("STATUS_INSUFFICIENT_NVRAM_RESOURCES","Insufficient NVRAM resources exist to complete the API. A reboot might be required."),
+ 0xC0000500: ("STATUS_INVALID_TASK_NAME","The specified task name is invalid."),
+ 0xC0000501: ("STATUS_INVALID_TASK_INDEX","The specified task index is invalid."),
+ 0xC0000502: ("STATUS_THREAD_ALREADY_IN_TASK","The specified thread is already joining a task."),
+ 0xC0000503: ("STATUS_CALLBACK_BYPASS","A callback has requested to bypass native code."),
+ 0xC0000602: ("STATUS_FAIL_FAST_EXCEPTION","A fail fast exception occurred. Exception handlers will not be invoked and the process will be terminated immediately."),
+ 0xC0000603: ("STATUS_IMAGE_CERT_REVOKED","Windows cannot verify the digital signature for this file. The signing certificate for this file has been revoked."),
+ 0xC0000700: ("STATUS_PORT_CLOSED","The ALPC port is closed."),
+ 0xC0000701: ("STATUS_MESSAGE_LOST","The ALPC message requested is no longer available."),
+ 0xC0000702: ("STATUS_INVALID_MESSAGE","The ALPC message supplied is invalid."),
+ 0xC0000703: ("STATUS_REQUEST_CANCELED","The ALPC message has been canceled."),
+ 0xC0000704: ("STATUS_RECURSIVE_DISPATCH","Invalid recursive dispatch attempt."),
+ 0xC0000705: ("STATUS_LPC_RECEIVE_BUFFER_EXPECTED","No receive buffer has been supplied in a synchronous request."),
+ 0xC0000706: ("STATUS_LPC_INVALID_CONNECTION_USAGE","The connection port is used in an invalid context."),
+ 0xC0000707: ("STATUS_LPC_REQUESTS_NOT_ALLOWED","The ALPC port does not accept new request messages."),
+ 0xC0000708: ("STATUS_RESOURCE_IN_USE","The resource requested is already in use."),
+ 0xC0000709: ("STATUS_HARDWARE_MEMORY_ERROR","The hardware has reported an uncorrectable memory error."),
+ 0xC000070A: ("STATUS_THREADPOOL_HANDLE_EXCEPTION","Status 0x%08x was returned, waiting on handle 0x%x for wait 0x%p, in waiter 0x%p."),
+ 0xC000070B: ("STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to Set event(0x%p) failed with status 0x%08x."),
+ 0xC000070C: ("STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to ReleaseSemaphore(0x%p, %d) failed with status 0x%08x."),
+ 0xC000070D: ("STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to ReleaseMutex(%p) failed with status 0x%08x."),
+ 0xC000070E: ("STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to FreeLibrary(%p) failed with status 0x%08x."),
+ 0xC000070F: ("STATUS_THREADPOOL_RELEASED_DURING_OPERATION","The thread pool 0x%p was released while a thread was posting a callback to 0x%p(0x%p) to it."),
+ 0xC0000710: ("STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING","A thread pool worker thread is impersonating a client, after a callback to 0x%p(0x%p). This is unexpected, indicating that the callback is missing a call to revert the impersonation."),
+ 0xC0000711: ("STATUS_APC_RETURNED_WHILE_IMPERSONATING","A thread pool worker thread is impersonating a client, after executing an APC. This is unexpected, indicating that the APC is missing a call to revert the impersonation."),
+ 0xC0000712: ("STATUS_PROCESS_IS_PROTECTED","Either the target process, or the target thread's containing process, is a protected process."),
+ 0xC0000713: ("STATUS_MCA_EXCEPTION","A thread is getting dispatched with MCA EXCEPTION because of MCA."),
+ 0xC0000714: ("STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE","The client certificate account mapping is not unique."),
+ 0xC0000715: ("STATUS_SYMLINK_CLASS_DISABLED","The symbolic link cannot be followed because its type is disabled."),
+ 0xC0000716: ("STATUS_INVALID_IDN_NORMALIZATION","Indicates that the specified string is not valid for IDN normalization."),
+ 0xC0000717: ("STATUS_NO_UNICODE_TRANSLATION","No mapping for the Unicode character exists in the target multi-byte code page."),
+ 0xC0000718: ("STATUS_ALREADY_REGISTERED","The provided callback is already registered."),
+ 0xC0000719: ("STATUS_CONTEXT_MISMATCH","The provided context did not match the target."),
+ 0xC000071A: ("STATUS_PORT_ALREADY_HAS_COMPLETION_LIST","The specified port already has a completion list."),
+ 0xC000071B: ("STATUS_CALLBACK_RETURNED_THREAD_PRIORITY","A threadpool worker thread entered a callback at thread base priority 0x%x and exited at priority 0x%x. This is unexpected, indicating that the callback missed restoring the priority."),
+ 0xC000071C: ("STATUS_INVALID_THREAD","An invalid thread, handle %p, is specified for this operation. Possibly, a threadpool worker thread was specified."),
+ 0xC000071D: ("STATUS_CALLBACK_RETURNED_TRANSACTION","A threadpool worker thread entered a callback, which left transaction state. This is unexpected, indicating that the callback missed clearing the transaction."),
+ 0xC000071E: ("STATUS_CALLBACK_RETURNED_LDR_LOCK","A threadpool worker thread entered a callback, which left the loader lock held. This is unexpected, indicating that the callback missed releasing the lock."),
+ 0xC000071F: ("STATUS_CALLBACK_RETURNED_LANG","A threadpool worker thread entered a callback, which left with preferred languages set. This is unexpected, indicating that the callback missed clearing them."),
+ 0xC0000720: ("STATUS_CALLBACK_RETURNED_PRI_BACK","A threadpool worker thread entered a callback, which left with background priorities set. This is unexpected, indicating that the callback missed restoring the original priorities."),
+ 0xC0000800: ("STATUS_DISK_REPAIR_DISABLED","The attempted operation required self healing to be enabled."),
+ 0xC0000801: ("STATUS_DS_DOMAIN_RENAME_IN_PROGRESS","The directory service cannot perform the requested operation because a domain rename operation is in progress."),
+ 0xC0000802: ("STATUS_DISK_QUOTA_EXCEEDED","An operation failed because the storage quota was exceeded."),
+ 0xC0000804: ("STATUS_CONTENT_BLOCKED","An operation failed because the content was blocked."),
+ 0xC0000805: ("STATUS_BAD_CLUSTERS","The operation could not be completed due to bad clusters on disk."),
+ 0xC0000806: ("STATUS_VOLUME_DIRTY","The operation could not be completed because the volume is dirty. Please run the Chkdsk utility and try again."),
+ 0xC0000901: ("STATUS_FILE_CHECKED_OUT","This file is checked out or locked for editing by another user."),
+ 0xC0000902: ("STATUS_CHECKOUT_REQUIRED","The file must be checked out before saving changes."),
+ 0xC0000903: ("STATUS_BAD_FILE_TYPE","The file type being saved or retrieved has been blocked."),
+ 0xC0000904: ("STATUS_FILE_TOO_LARGE","The file size exceeds the limit allowed and cannot be saved."),
+ 0xC0000905: ("STATUS_FORMS_AUTH_REQUIRED","Access Denied. Before opening files in this location, you must first browse to the e.g. site and select the option to log on automatically."),
+ 0xC0000906: ("STATUS_VIRUS_INFECTED","The operation did not complete successfully because the file contains a virus."),
+ 0xC0000907: ("STATUS_VIRUS_DELETED","This file contains a virus and cannot be opened. Due to the nature of this virus, the file has been removed from this location."),
+ 0xC0000908: ("STATUS_BAD_MCFG_TABLE","The resources required for this device conflict with the MCFG table."),
+ 0xC0000909: ("STATUS_CANNOT_BREAK_OPLOCK","The operation did not complete successfully because it would cause an oplock to be broken. The caller has requested that existing oplocks not be broken."),
+ 0xC0009898: ("STATUS_WOW_ASSERTION","WOW Assertion Error."),
+ 0xC000A000: ("STATUS_INVALID_SIGNATURE","The cryptographic signature is invalid."),
+ 0xC000A001: ("STATUS_HMAC_NOT_SUPPORTED","The cryptographic provider does not support HMAC."),
+ 0xC000A010: ("STATUS_IPSEC_QUEUE_OVERFLOW","The IPsec queue overflowed."),
+ 0xC000A011: ("STATUS_ND_QUEUE_OVERFLOW","The neighbor discovery queue overflowed."),
+ 0xC000A012: ("STATUS_HOPLIMIT_EXCEEDED","An Internet Control Message Protocol (ICMP) hop limit exceeded error was received."),
+ 0xC000A013: ("STATUS_PROTOCOL_NOT_SUPPORTED","The protocol is not installed on the local machine."),
+ 0xC000A080: ("STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused by network connectivity issues. Try to save this file elsewhere."),
+ 0xC000A081: ("STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error was returned by the server on which the file exists. Try to save this file elsewhere."),
+ 0xC000A082: ("STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused if the device has been removed or the media is write-protected."),
+ 0xC000A083: ("STATUS_XML_PARSE_ERROR","Windows was unable to parse the requested XML data."),
+ 0xC000A084: ("STATUS_XMLDSIG_ERROR","An error was encountered while processing an XML digital signature."),
+ 0xC000A085: ("STATUS_WRONG_COMPARTMENT","This indicates that the caller made the connection request in the wrong routing compartment."),
+ 0xC000A086: ("STATUS_AUTHIP_FAILURE","This indicates that there was an AuthIP failure when attempting to connect to the remote host."),
+ 0xC000A087: ("STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS","OID mapped groups cannot have members."),
+ 0xC000A088: ("STATUS_DS_OID_NOT_FOUND","The specified OID cannot be found."),
+ 0xC000A100: ("STATUS_HASH_NOT_SUPPORTED","Hash generation for the specified version and hash type is not enabled on server."),
+ 0xC000A101: ("STATUS_HASH_NOT_PRESENT","The hash requests is not present or not up to date with the current file contents."),
+ 0xC0010001: ("DBG_NO_STATE_CHANGE","The debugger did not perform a state change."),
+ 0xC0010002: ("DBG_APP_NOT_IDLE","The debugger found that the application is not idle."),
+ 0xC0020001: ("RPC_NT_INVALID_STRING_BINDING","The string binding is invalid."),
+ 0xC0020002: ("RPC_NT_WRONG_KIND_OF_BINDING","The binding handle is not the correct type."),
+ 0xC0020003: ("RPC_NT_INVALID_BINDING","The binding handle is invalid."),
+ 0xC0020004: ("RPC_NT_PROTSEQ_NOT_SUPPORTED","The RPC protocol sequence is not supported."),
+ 0xC0020005: ("RPC_NT_INVALID_RPC_PROTSEQ","The RPC protocol sequence is invalid."),
+ 0xC0020006: ("RPC_NT_INVALID_STRING_UUID","The string UUID is invalid."),
+ 0xC0020007: ("RPC_NT_INVALID_ENDPOINT_FORMAT","The endpoint format is invalid."),
+ 0xC0020008: ("RPC_NT_INVALID_NET_ADDR","The network address is invalid."),
+ 0xC0020009: ("RPC_NT_NO_ENDPOINT_FOUND","No endpoint was found."),
+ 0xC002000A: ("RPC_NT_INVALID_TIMEOUT","The time-out value is invalid."),
+ 0xC002000B: ("RPC_NT_OBJECT_NOT_FOUND","The object UUID was not found."),
+ 0xC002000C: ("RPC_NT_ALREADY_REGISTERED","The object UUID has already been registered."),
+ 0xC002000D: ("RPC_NT_TYPE_ALREADY_REGISTERED","The type UUID has already been registered."),
+ 0xC002000E: ("RPC_NT_ALREADY_LISTENING","The RPC server is already listening."),
+ 0xC002000F: ("RPC_NT_NO_PROTSEQS_REGISTERED","No protocol sequences have been registered."),
+ 0xC0020010: ("RPC_NT_NOT_LISTENING","The RPC server is not listening."),
+ 0xC0020011: ("RPC_NT_UNKNOWN_MGR_TYPE","The manager type is unknown."),
+ 0xC0020012: ("RPC_NT_UNKNOWN_IF","The interface is unknown."),
+ 0xC0020013: ("RPC_NT_NO_BINDINGS","There are no bindings."),
+ 0xC0020014: ("RPC_NT_NO_PROTSEQS","There are no protocol sequences."),
+ 0xC0020015: ("RPC_NT_CANT_CREATE_ENDPOINT","The endpoint cannot be created."),
+ 0xC0020016: ("RPC_NT_OUT_OF_RESOURCES","Insufficient resources are available to complete this operation."),
+ 0xC0020017: ("RPC_NT_SERVER_UNAVAILABLE","The RPC server is unavailable."),
+ 0xC0020018: ("RPC_NT_SERVER_TOO_BUSY","The RPC server is too busy to complete this operation."),
+ 0xC0020019: ("RPC_NT_INVALID_NETWORK_OPTIONS","The network options are invalid."),
+ 0xC002001A: ("RPC_NT_NO_CALL_ACTIVE","No RPCs are active on this thread."),
+ 0xC002001B: ("RPC_NT_CALL_FAILED","The RPC failed."),
+ 0xC002001C: ("RPC_NT_CALL_FAILED_DNE","The RPC failed and did not execute."),
+ 0xC002001D: ("RPC_NT_PROTOCOL_ERROR","An RPC protocol error occurred."),
+ 0xC002001F: ("RPC_NT_UNSUPPORTED_TRANS_SYN","The RPC server does not support the transfer syntax."),
+ 0xC0020021: ("RPC_NT_UNSUPPORTED_TYPE","The type UUID is not supported."),
+ 0xC0020022: ("RPC_NT_INVALID_TAG","The tag is invalid."),
+ 0xC0020023: ("RPC_NT_INVALID_BOUND","The array bounds are invalid."),
+ 0xC0020024: ("RPC_NT_NO_ENTRY_NAME","The binding does not contain an entry name."),
+ 0xC0020025: ("RPC_NT_INVALID_NAME_SYNTAX","The name syntax is invalid."),
+ 0xC0020026: ("RPC_NT_UNSUPPORTED_NAME_SYNTAX","The name syntax is not supported."),
+ 0xC0020028: ("RPC_NT_UUID_NO_ADDRESS","No network address is available to construct a UUID."),
+ 0xC0020029: ("RPC_NT_DUPLICATE_ENDPOINT","The endpoint is a duplicate."),
+ 0xC002002A: ("RPC_NT_UNKNOWN_AUTHN_TYPE","The authentication type is unknown."),
+ 0xC002002B: ("RPC_NT_MAX_CALLS_TOO_SMALL","The maximum number of calls is too small."),
+ 0xC002002C: ("RPC_NT_STRING_TOO_LONG","The string is too long."),
+ 0xC002002D: ("RPC_NT_PROTSEQ_NOT_FOUND","The RPC protocol sequence was not found."),
+ 0xC002002E: ("RPC_NT_PROCNUM_OUT_OF_RANGE","The procedure number is out of range."),
+ 0xC002002F: ("RPC_NT_BINDING_HAS_NO_AUTH","The binding does not contain any authentication information."),
+ 0xC0020030: ("RPC_NT_UNKNOWN_AUTHN_SERVICE","The authentication service is unknown."),
+ 0xC0020031: ("RPC_NT_UNKNOWN_AUTHN_LEVEL","The authentication level is unknown."),
+ 0xC0020032: ("RPC_NT_INVALID_AUTH_IDENTITY","The security context is invalid."),
+ 0xC0020033: ("RPC_NT_UNKNOWN_AUTHZ_SERVICE","The authorization service is unknown."),
+ 0xC0020034: ("EPT_NT_INVALID_ENTRY","The entry is invalid."),
+ 0xC0020035: ("EPT_NT_CANT_PERFORM_OP","The operation cannot be performed."),
+ 0xC0020036: ("EPT_NT_NOT_REGISTERED","No more endpoints are available from the endpoint mapper."),
+ 0xC0020037: ("RPC_NT_NOTHING_TO_EXPORT","No interfaces have been exported."),
+ 0xC0020038: ("RPC_NT_INCOMPLETE_NAME","The entry name is incomplete."),
+ 0xC0020039: ("RPC_NT_INVALID_VERS_OPTION","The version option is invalid."),
+ 0xC002003A: ("RPC_NT_NO_MORE_MEMBERS","There are no more members."),
+ 0xC002003B: ("RPC_NT_NOT_ALL_OBJS_UNEXPORTED","There is nothing to unexport."),
+ 0xC002003C: ("RPC_NT_INTERFACE_NOT_FOUND","The interface was not found."),
+ 0xC002003D: ("RPC_NT_ENTRY_ALREADY_EXISTS","The entry already exists."),
+ 0xC002003E: ("RPC_NT_ENTRY_NOT_FOUND","The entry was not found."),
+ 0xC002003F: ("RPC_NT_NAME_SERVICE_UNAVAILABLE","The name service is unavailable."),
+ 0xC0020040: ("RPC_NT_INVALID_NAF_ID","The network address family is invalid."),
+ 0xC0020041: ("RPC_NT_CANNOT_SUPPORT","The requested operation is not supported."),
+ 0xC0020042: ("RPC_NT_NO_CONTEXT_AVAILABLE","No security context is available to allow impersonation."),
+ 0xC0020043: ("RPC_NT_INTERNAL_ERROR","An internal error occurred in the RPC."),
+ 0xC0020044: ("RPC_NT_ZERO_DIVIDE","The RPC server attempted to divide an integer by zero."),
+ 0xC0020045: ("RPC_NT_ADDRESS_ERROR","An addressing error occurred in the RPC server."),
+ 0xC0020046: ("RPC_NT_FP_DIV_ZERO","A floating point operation at the RPC server caused a divide by zero."),
+ 0xC0020047: ("RPC_NT_FP_UNDERFLOW","A floating point underflow occurred at the RPC server."),
+ 0xC0020048: ("RPC_NT_FP_OVERFLOW","A floating point overflow occurred at the RPC server."),
+ 0xC0020049: ("RPC_NT_CALL_IN_PROGRESS","An RPC is already in progress for this thread."),
+ 0xC002004A: ("RPC_NT_NO_MORE_BINDINGS","There are no more bindings."),
+ 0xC002004B: ("RPC_NT_GROUP_MEMBER_NOT_FOUND","The group member was not found."),
+ 0xC002004C: ("EPT_NT_CANT_CREATE","The endpoint mapper database entry could not be created."),
+ 0xC002004D: ("RPC_NT_INVALID_OBJECT","The object UUID is the nil UUID."),
+ 0xC002004F: ("RPC_NT_NO_INTERFACES","No interfaces have been registered."),
+ 0xC0020050: ("RPC_NT_CALL_CANCELLED","The RPC was canceled."),
+ 0xC0020051: ("RPC_NT_BINDING_INCOMPLETE","The binding handle does not contain all the required information."),
+ 0xC0020052: ("RPC_NT_COMM_FAILURE","A communications failure occurred during an RPC."),
+ 0xC0020053: ("RPC_NT_UNSUPPORTED_AUTHN_LEVEL","The requested authentication level is not supported."),
+ 0xC0020054: ("RPC_NT_NO_PRINC_NAME","No principal name was registered."),
+ 0xC0020055: ("RPC_NT_NOT_RPC_ERROR","The error specified is not a valid Windows RPC error code."),
+ 0xC0020057: ("RPC_NT_SEC_PKG_ERROR","A security package-specific error occurred."),
+ 0xC0020058: ("RPC_NT_NOT_CANCELLED","The thread was not canceled."),
+ 0xC0020062: ("RPC_NT_INVALID_ASYNC_HANDLE","Invalid asynchronous RPC handle."),
+ 0xC0020063: ("RPC_NT_INVALID_ASYNC_CALL","Invalid asynchronous RPC call handle for this operation."),
+ 0xC0020064: ("RPC_NT_PROXY_ACCESS_DENIED","Access to the HTTP proxy is denied."),
+ 0xC0030001: ("RPC_NT_NO_MORE_ENTRIES","The list of RPC servers available for auto-handle binding has been exhausted."),
+ 0xC0030002: ("RPC_NT_SS_CHAR_TRANS_OPEN_FAIL","The file designated by DCERPCCHARTRANS cannot be opened."),
+ 0xC0030003: ("RPC_NT_SS_CHAR_TRANS_SHORT_FILE","The file containing the character translation table has fewer than 512 bytes."),
+ 0xC0030004: ("RPC_NT_SS_IN_NULL_CONTEXT","A null context handle is passed as an [in] parameter."),
+ 0xC0030005: ("RPC_NT_SS_CONTEXT_MISMATCH","The context handle does not match any known context handles."),
+ 0xC0030006: ("RPC_NT_SS_CONTEXT_DAMAGED","The context handle changed during a call."),
+ 0xC0030007: ("RPC_NT_SS_HANDLES_MISMATCH","The binding handles passed to an RPC do not match."),
+ 0xC0030008: ("RPC_NT_SS_CANNOT_GET_CALL_HANDLE","The stub is unable to get the call handle."),
+ 0xC0030009: ("RPC_NT_NULL_REF_POINTER","A null reference pointer was passed to the stub."),
+ 0xC003000A: ("RPC_NT_ENUM_VALUE_OUT_OF_RANGE","The enumeration value is out of range."),
+ 0xC003000B: ("RPC_NT_BYTE_COUNT_TOO_SMALL","The byte count is too small."),
+ 0xC003000C: ("RPC_NT_BAD_STUB_DATA","The stub received bad data."),
+ 0xC0030059: ("RPC_NT_INVALID_ES_ACTION","Invalid operation on the encoding/decoding handle."),
+ 0xC003005A: ("RPC_NT_WRONG_ES_VERSION","Incompatible version of the serializing package."),
+ 0xC003005B: ("RPC_NT_WRONG_STUB_VERSION","Incompatible version of the RPC stub."),
+ 0xC003005C: ("RPC_NT_INVALID_PIPE_OBJECT","The RPC pipe object is invalid or corrupt."),
+ 0xC003005D: ("RPC_NT_INVALID_PIPE_OPERATION","An invalid operation was attempted on an RPC pipe object."),
+ 0xC003005E: ("RPC_NT_WRONG_PIPE_VERSION","Unsupported RPC pipe version."),
+ 0xC003005F: ("RPC_NT_PIPE_CLOSED","The RPC pipe object has already been closed."),
+ 0xC0030060: ("RPC_NT_PIPE_DISCIPLINE_ERROR","The RPC call completed before all pipes were processed."),
+ 0xC0030061: ("RPC_NT_PIPE_EMPTY","No more data is available from the RPC pipe."),
+ 0xC0040035: ("STATUS_PNP_BAD_MPS_TABLE","A device is missing in the system BIOS MPS table. This device will not be used. Contact your system vendor for a system BIOS update."),
+ 0xC0040036: ("STATUS_PNP_TRANSLATION_FAILED","A translator failed to translate resources."),
+ 0xC0040037: ("STATUS_PNP_IRQ_TRANSLATION_FAILED","An IRQ translator failed to translate resources."),
+ 0xC0040038: ("STATUS_PNP_INVALID_ID","Driver %2 returned an invalid ID for a child device (%3)."),
+ 0xC0040039: ("STATUS_IO_REISSUE_AS_CACHED","Reissue the given operation as a cached I/O operation"),
+ 0xC00A0001: ("STATUS_CTX_WINSTATION_NAME_INVALID","Session name %1 is invalid."),
+ 0xC00A0002: ("STATUS_CTX_INVALID_PD","The protocol driver %1 is invalid."),
+ 0xC00A0003: ("STATUS_CTX_PD_NOT_FOUND","The protocol driver %1 was not found in the system path."),
+ 0xC00A0006: ("STATUS_CTX_CLOSE_PENDING","A close operation is pending on the terminal connection."),
+ 0xC00A0007: ("STATUS_CTX_NO_OUTBUF","No free output buffers are available."),
+ 0xC00A0008: ("STATUS_CTX_MODEM_INF_NOT_FOUND","The MODEM.INF file was not found."),
+ 0xC00A0009: ("STATUS_CTX_INVALID_MODEMNAME","The modem (%1) was not found in the MODEM.INF file."),
+ 0xC00A000A: ("STATUS_CTX_RESPONSE_ERROR","The modem did not accept the command sent to it. Verify that the configured modem name matches the attached modem."),
+ 0xC00A000B: ("STATUS_CTX_MODEM_RESPONSE_TIMEOUT","The modem did not respond to the command sent to it. Verify that the modem cable is properly attached and the modem is turned on."),
+ 0xC00A000C: ("STATUS_CTX_MODEM_RESPONSE_NO_CARRIER","Carrier detection has failed or the carrier has been dropped due to disconnection."),
+ 0xC00A000D: ("STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE","A dial tone was not detected within the required time. Verify that the phone cable is properly attached and functional."),
+ 0xC00A000E: ("STATUS_CTX_MODEM_RESPONSE_BUSY","A busy signal was detected at a remote site on callback."),
+ 0xC00A000F: ("STATUS_CTX_MODEM_RESPONSE_VOICE","A voice was detected at a remote site on callback."),
+ 0xC00A0010: ("STATUS_CTX_TD_ERROR","Transport driver error."),
+ 0xC00A0012: ("STATUS_CTX_LICENSE_CLIENT_INVALID","The client you are using is not licensed to use this system. Your logon request is denied."),
+ 0xC00A0013: ("STATUS_CTX_LICENSE_NOT_AVAILABLE","The system has reached its licensed logon limit. Try again later."),
+ 0xC00A0014: ("STATUS_CTX_LICENSE_EXPIRED","The system license has expired. Your logon request is denied."),
+ 0xC00A0015: ("STATUS_CTX_WINSTATION_NOT_FOUND","The specified session cannot be found."),
+ 0xC00A0016: ("STATUS_CTX_WINSTATION_NAME_COLLISION","The specified session name is already in use."),
+ 0xC00A0017: ("STATUS_CTX_WINSTATION_BUSY","The requested operation cannot be completed because the terminal connection is currently processing a connect, disconnect, reset, or delete operation."),
+ 0xC00A0018: ("STATUS_CTX_BAD_VIDEO_MODE","An attempt has been made to connect to a session whose video mode is not supported by the current client."),
+ 0xC00A0022: ("STATUS_CTX_GRAPHICS_INVALID","The application attempted to enable DOS graphics mode. DOS graphics mode is not supported."),
+ 0xC00A0024: ("STATUS_CTX_NOT_CONSOLE","The requested operation can be performed only on the system console. This is most often the result of a driver or system DLL requiring direct console access."),
+ 0xC00A0026: ("STATUS_CTX_CLIENT_QUERY_TIMEOUT","The client failed to respond to the server connect message."),
+ 0xC00A0027: ("STATUS_CTX_CONSOLE_DISCONNECT","Disconnecting the console session is not supported."),
+ 0xC00A0028: ("STATUS_CTX_CONSOLE_CONNECT","Reconnecting a disconnected session to the console is not supported."),
+ 0xC00A002A: ("STATUS_CTX_SHADOW_DENIED","The request to control another session remotely was denied."),
+ 0xC00A002B: ("STATUS_CTX_WINSTATION_ACCESS_DENIED","A process has requested access to a session, but has not been granted those access rights."),
+ 0xC00A002E: ("STATUS_CTX_INVALID_WD","The terminal connection driver %1 is invalid."),
+ 0xC00A002F: ("STATUS_CTX_WD_NOT_FOUND","The terminal connection driver %1 was not found in the system path."),
+ 0xC00A0030: ("STATUS_CTX_SHADOW_INVALID","The requested session cannot be controlled remotely. You cannot control your own session, a session that is trying to control your session, a session that has no user logged on, or other sessions from the console."),
+ 0xC00A0031: ("STATUS_CTX_SHADOW_DISABLED","The requested session is not configured to allow remote control."),
+ 0xC00A0032: ("STATUS_RDP_PROTOCOL_ERROR","The RDP protocol component %2 detected an error in the protocol stream and has disconnected the client."),
+ 0xC00A0033: ("STATUS_CTX_CLIENT_LICENSE_NOT_SET","Your request to connect to this terminal server has been rejected. Your terminal server client license number has not been entered for this copy of the terminal client. Contact your system administrator for help in entering a valid, unique license number for this terminal server client. Click OK to continue."),
+ 0xC00A0034: ("STATUS_CTX_CLIENT_LICENSE_IN_USE","Your request to connect to this terminal server has been rejected. Your terminal server client license number is currently being used by another user. Contact your system administrator to obtain a new copy of the terminal server client with a valid, unique license number. Click OK to continue."),
+ 0xC00A0035: ("STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE","The remote control of the console was terminated because the display mode was changed. Changing the display mode in a remote control session is not supported."),
+ 0xC00A0036: ("STATUS_CTX_SHADOW_NOT_RUNNING","Remote control could not be terminated because the specified session is not currently being remotely controlled."),
+ 0xC00A0037: ("STATUS_CTX_LOGON_DISABLED","Your interactive logon privilege has been disabled. Contact your system administrator."),
+ 0xC00A0038: ("STATUS_CTX_SECURITY_LAYER_ERROR","The terminal server security layer detected an error in the protocol stream and has disconnected the client."),
+ 0xC00A0039: ("STATUS_TS_INCOMPATIBLE_SESSIONS","The target session is incompatible with the current session."),
+ 0xC00B0001: ("STATUS_MUI_FILE_NOT_FOUND","The resource loader failed to find an MUI file."),
+ 0xC00B0002: ("STATUS_MUI_INVALID_FILE","The resource loader failed to load an MUI file because the file failed to pass validation."),
+ 0xC00B0003: ("STATUS_MUI_INVALID_RC_CONFIG","The RC manifest is corrupted with garbage data, is an unsupported version, or is missing a required item."),
+ 0xC00B0004: ("STATUS_MUI_INVALID_LOCALE_NAME","The RC manifest has an invalid culture name."),
+ 0xC00B0005: ("STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME","The RC manifest has and invalid ultimate fallback name."),
+ 0xC00B0006: ("STATUS_MUI_FILE_NOT_LOADED","The resource loader cache does not have a loaded MUI entry."),
+ 0xC00B0007: ("STATUS_RESOURCE_ENUM_USER_STOP","The user stopped resource enumeration."),
+ 0xC0130001: ("STATUS_CLUSTER_INVALID_NODE","The cluster node is not valid."),
+ 0xC0130002: ("STATUS_CLUSTER_NODE_EXISTS","The cluster node already exists."),
+ 0xC0130003: ("STATUS_CLUSTER_JOIN_IN_PROGRESS","A node is in the process of joining the cluster."),
+ 0xC0130004: ("STATUS_CLUSTER_NODE_NOT_FOUND","The cluster node was not found."),
+ 0xC0130005: ("STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND","The cluster local node information was not found."),
+ 0xC0130006: ("STATUS_CLUSTER_NETWORK_EXISTS","The cluster network already exists."),
+ 0xC0130007: ("STATUS_CLUSTER_NETWORK_NOT_FOUND","The cluster network was not found."),
+ 0xC0130008: ("STATUS_CLUSTER_NETINTERFACE_EXISTS","The cluster network interface already exists."),
+ 0xC0130009: ("STATUS_CLUSTER_NETINTERFACE_NOT_FOUND","The cluster network interface was not found."),
+ 0xC013000A: ("STATUS_CLUSTER_INVALID_REQUEST","The cluster request is not valid for this object."),
+ 0xC013000B: ("STATUS_CLUSTER_INVALID_NETWORK_PROVIDER","The cluster network provider is not valid."),
+ 0xC013000C: ("STATUS_CLUSTER_NODE_DOWN","The cluster node is down."),
+ 0xC013000D: ("STATUS_CLUSTER_NODE_UNREACHABLE","The cluster node is not reachable."),
+ 0xC013000E: ("STATUS_CLUSTER_NODE_NOT_MEMBER","The cluster node is not a member of the cluster."),
+ 0xC013000F: ("STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS","A cluster join operation is not in progress."),
+ 0xC0130010: ("STATUS_CLUSTER_INVALID_NETWORK","The cluster network is not valid."),
+ 0xC0130011: ("STATUS_CLUSTER_NO_NET_ADAPTERS","No network adapters are available."),
+ 0xC0130012: ("STATUS_CLUSTER_NODE_UP","The cluster node is up."),
+ 0xC0130013: ("STATUS_CLUSTER_NODE_PAUSED","The cluster node is paused."),
+ 0xC0130014: ("STATUS_CLUSTER_NODE_NOT_PAUSED","The cluster node is not paused."),
+ 0xC0130015: ("STATUS_CLUSTER_NO_SECURITY_CONTEXT","No cluster security context is available."),
+ 0xC0130016: ("STATUS_CLUSTER_NETWORK_NOT_INTERNAL","The cluster network is not configured for internal cluster communication."),
+ 0xC0130017: ("STATUS_CLUSTER_POISONED","The cluster node has been poisoned."),
+ 0xC0140001: ("STATUS_ACPI_INVALID_OPCODE","An attempt was made to run an invalid AML opcode."),
+ 0xC0140002: ("STATUS_ACPI_STACK_OVERFLOW","The AML interpreter stack has overflowed."),
+ 0xC0140003: ("STATUS_ACPI_ASSERT_FAILED","An inconsistent state has occurred."),
+ 0xC0140004: ("STATUS_ACPI_INVALID_INDEX","An attempt was made to access an array outside its bounds."),
+ 0xC0140005: ("STATUS_ACPI_INVALID_ARGUMENT","A required argument was not specified."),
+ 0xC0140006: ("STATUS_ACPI_FATAL","A fatal error has occurred."),
+ 0xC0140007: ("STATUS_ACPI_INVALID_SUPERNAME","An invalid SuperName was specified."),
+ 0xC0140008: ("STATUS_ACPI_INVALID_ARGTYPE","An argument with an incorrect type was specified."),
+ 0xC0140009: ("STATUS_ACPI_INVALID_OBJTYPE","An object with an incorrect type was specified."),
+ 0xC014000A: ("STATUS_ACPI_INVALID_TARGETTYPE","A target with an incorrect type was specified."),
+ 0xC014000B: ("STATUS_ACPI_INCORRECT_ARGUMENT_COUNT","An incorrect number of arguments was specified."),
+ 0xC014000C: ("STATUS_ACPI_ADDRESS_NOT_MAPPED","An address failed to translate."),
+ 0xC014000D: ("STATUS_ACPI_INVALID_EVENTTYPE","An incorrect event type was specified."),
+ 0xC014000E: ("STATUS_ACPI_HANDLER_COLLISION","A handler for the target already exists."),
+ 0xC014000F: ("STATUS_ACPI_INVALID_DATA","Invalid data for the target was specified."),
+ 0xC0140010: ("STATUS_ACPI_INVALID_REGION","An invalid region for the target was specified."),
+ 0xC0140011: ("STATUS_ACPI_INVALID_ACCESS_SIZE","An attempt was made to access a field outside the defined range."),
+ 0xC0140012: ("STATUS_ACPI_ACQUIRE_GLOBAL_LOCK","The global system lock could not be acquired."),
+ 0xC0140013: ("STATUS_ACPI_ALREADY_INITIALIZED","An attempt was made to reinitialize the ACPI subsystem."),
+ 0xC0140014: ("STATUS_ACPI_NOT_INITIALIZED","The ACPI subsystem has not been initialized."),
+ 0xC0140015: ("STATUS_ACPI_INVALID_MUTEX_LEVEL","An incorrect mutex was specified."),
+ 0xC0140016: ("STATUS_ACPI_MUTEX_NOT_OWNED","The mutex is not currently owned."),
+ 0xC0140017: ("STATUS_ACPI_MUTEX_NOT_OWNER","An attempt was made to access the mutex by a process that was not the owner."),
+ 0xC0140018: ("STATUS_ACPI_RS_ACCESS","An error occurred during an access to region space."),
+ 0xC0140019: ("STATUS_ACPI_INVALID_TABLE","An attempt was made to use an incorrect table."),
+ 0xC0140020: ("STATUS_ACPI_REG_HANDLER_FAILED","The registration of an ACPI event failed."),
+ 0xC0140021: ("STATUS_ACPI_POWER_REQUEST_FAILED","An ACPI power object failed to transition state."),
+ 0xC0150001: ("STATUS_SXS_SECTION_NOT_FOUND","The requested section is not present in the activation context."),
+ 0xC0150002: ("STATUS_SXS_CANT_GEN_ACTCTX","Windows was unble to process the application binding information. Refer to the system event log for further information."),
+ 0xC0150003: ("STATUS_SXS_INVALID_ACTCTXDATA_FORMAT","The application binding data format is invalid."),
+ 0xC0150004: ("STATUS_SXS_ASSEMBLY_NOT_FOUND","The referenced assembly is not installed on the system."),
+ 0xC0150005: ("STATUS_SXS_MANIFEST_FORMAT_ERROR","The manifest file does not begin with the required tag and format information."),
+ 0xC0150006: ("STATUS_SXS_MANIFEST_PARSE_ERROR","The manifest file contains one or more syntax errors."),
+ 0xC0150007: ("STATUS_SXS_ACTIVATION_CONTEXT_DISABLED","The application attempted to activate a disabled activation context."),
+ 0xC0150008: ("STATUS_SXS_KEY_NOT_FOUND","The requested lookup key was not found in any active activation context."),
+ 0xC0150009: ("STATUS_SXS_VERSION_CONFLICT","A component version required by the application conflicts with another component version that is already active."),
+ 0xC015000A: ("STATUS_SXS_WRONG_SECTION_TYPE","The type requested activation context section does not match the query API used."),
+ 0xC015000B: ("STATUS_SXS_THREAD_QUERIES_DISABLED","Lack of system resources has required isolated activation to be disabled for the current thread of execution."),
+ 0xC015000C: ("STATUS_SXS_ASSEMBLY_MISSING","The referenced assembly could not be found."),
+ 0xC015000E: ("STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET","An attempt to set the process default activation context failed because the process default activation context was already set."),
+ 0xC015000F: ("STATUS_SXS_EARLY_DEACTIVATION","The activation context being deactivated is not the most recently activated one."),
+ 0xC0150010: ("STATUS_SXS_INVALID_DEACTIVATION","The activation context being deactivated is not active for the current thread of execution."),
+ 0xC0150011: ("STATUS_SXS_MULTIPLE_DEACTIVATION","The activation context being deactivated has already been deactivated."),
+ 0xC0150012: ("STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY","The activation context of the system default assembly could not be generated."),
+ 0xC0150013: ("STATUS_SXS_PROCESS_TERMINATION_REQUESTED","A component used by the isolation facility has requested that the process be terminated."),
+ 0xC0150014: ("STATUS_SXS_CORRUPT_ACTIVATION_STACK","The activation context activation stack for the running thread of execution is corrupt."),
+ 0xC0150015: ("STATUS_SXS_CORRUPTION","The application isolation metadata for this process or thread has become corrupt."),
+ 0xC0150016: ("STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE","The value of an attribute in an identity is not within the legal range."),
+ 0xC0150017: ("STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME","The name of an attribute in an identity is not within the legal range."),
+ 0xC0150018: ("STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE","An identity contains two definitions for the same attribute."),
+ 0xC0150019: ("STATUS_SXS_IDENTITY_PARSE_ERROR","The identity string is malformed. This may be due to a trailing comma, more than two unnamed attributes, a missing attribute name, or a missing attribute value."),
+ 0xC015001A: ("STATUS_SXS_COMPONENT_STORE_CORRUPT","The component store has become corrupted."),
+ 0xC015001B: ("STATUS_SXS_FILE_HASH_MISMATCH","A component's file does not match the verification information present in the component manifest."),
+ 0xC015001C: ("STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT","The identities of the manifests are identical, but their contents are different."),
+ 0xC015001D: ("STATUS_SXS_IDENTITIES_DIFFERENT","The component identities are different."),
+ 0xC015001E: ("STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT","The assembly is not a deployment."),
+ 0xC015001F: ("STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY","The file is not a part of the assembly."),
+ 0xC0150020: ("STATUS_ADVANCED_INSTALLER_FAILED","An advanced installer failed during setup or servicing."),
+ 0xC0150021: ("STATUS_XML_ENCODING_MISMATCH","The character encoding in the XML declaration did not match the encoding used in the document."),
+ 0xC0150022: ("STATUS_SXS_MANIFEST_TOO_BIG","The size of the manifest exceeds the maximum allowed."),
+ 0xC0150023: ("STATUS_SXS_SETTING_NOT_REGISTERED","The setting is not registered."),
+ 0xC0150024: ("STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE","One or more required transaction members are not present."),
+ 0xC0150025: ("STATUS_SMI_PRIMITIVE_INSTALLER_FAILED","The SMI primitive installer failed during setup or servicing."),
+ 0xC0150026: ("STATUS_GENERIC_COMMAND_FAILED","A generic command executable returned a result that indicates failure."),
+ 0xC0150027: ("STATUS_SXS_FILE_HASH_MISSING","A component is missing file verification information in its manifest."),
+ 0xC0190001: ("STATUS_TRANSACTIONAL_CONFLICT","The function attempted to use a name that is reserved for use by another transaction."),
+ 0xC0190002: ("STATUS_INVALID_TRANSACTION","The transaction handle associated with this operation is invalid."),
+ 0xC0190003: ("STATUS_TRANSACTION_NOT_ACTIVE","The requested operation was made in the context of a transaction that is no longer active."),
+ 0xC0190004: ("STATUS_TM_INITIALIZATION_FAILED","The transaction manager was unable to be successfully initialized. Transacted operations are not supported."),
+ 0xC0190005: ("STATUS_RM_NOT_ACTIVE","Transaction support within the specified file system resource manager was not started or was shut down due to an error."),
+ 0xC0190006: ("STATUS_RM_METADATA_CORRUPT","The metadata of the resource manager has been corrupted. The resource manager will not function."),
+ 0xC0190007: ("STATUS_TRANSACTION_NOT_JOINED","The resource manager attempted to prepare a transaction that it has not successfully joined."),
+ 0xC0190008: ("STATUS_DIRECTORY_NOT_RM","The specified directory does not contain a file system resource manager."),
+ 0xC019000A: ("STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE","The remote server or share does not support transacted file operations."),
+ 0xC019000B: ("STATUS_LOG_RESIZE_INVALID_SIZE","The requested log size for the file system resource manager is invalid."),
+ 0xC019000C: ("STATUS_REMOTE_FILE_VERSION_MISMATCH","The remote server sent mismatching version number or Fid for a file opened with transactions."),
+ 0xC019000F: ("STATUS_CRM_PROTOCOL_ALREADY_EXISTS","The resource manager tried to register a protocol that already exists."),
+ 0xC0190010: ("STATUS_TRANSACTION_PROPAGATION_FAILED","The attempt to propagate the transaction failed."),
+ 0xC0190011: ("STATUS_CRM_PROTOCOL_NOT_FOUND","The requested propagation protocol was not registered as a CRM."),
+ 0xC0190012: ("STATUS_TRANSACTION_SUPERIOR_EXISTS","The transaction object already has a superior enlistment, and the caller attempted an operation that would have created a new superior. Only a single superior enlistment is allowed."),
+ 0xC0190013: ("STATUS_TRANSACTION_REQUEST_NOT_VALID","The requested operation is not valid on the transaction object in its current state."),
+ 0xC0190014: ("STATUS_TRANSACTION_NOT_REQUESTED","The caller has called a response API, but the response is not expected because the transaction manager did not issue the corresponding request to the caller."),
+ 0xC0190015: ("STATUS_TRANSACTION_ALREADY_ABORTED","It is too late to perform the requested operation, because the transaction has already been aborted."),
+ 0xC0190016: ("STATUS_TRANSACTION_ALREADY_COMMITTED","It is too late to perform the requested operation, because the transaction has already been committed."),
+ 0xC0190017: ("STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER","The buffer passed in to NtPushTransaction or NtPullTransaction is not in a valid format."),
+ 0xC0190018: ("STATUS_CURRENT_TRANSACTION_NOT_VALID","The current transaction context associated with the thread is not a valid handle to a transaction object."),
+ 0xC0190019: ("STATUS_LOG_GROWTH_FAILED","An attempt to create space in the transactional resource manager's log failed. The failure status has been recorded in the event log."),
+ 0xC0190021: ("STATUS_OBJECT_NO_LONGER_EXISTS","The object (file, stream, or link) that corresponds to the handle has been deleted by a transaction savepoint rollback."),
+ 0xC0190022: ("STATUS_STREAM_MINIVERSION_NOT_FOUND","The specified file miniversion was not found for this transacted file open."),
+ 0xC0190023: ("STATUS_STREAM_MINIVERSION_NOT_VALID","The specified file miniversion was found but has been invalidated. The most likely cause is a transaction savepoint rollback."),
+ 0xC0190024: ("STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION","A miniversion may be opened only in the context of the transaction that created it."),
+ 0xC0190025: ("STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT","It is not possible to open a miniversion with modify access."),
+ 0xC0190026: ("STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS","It is not possible to create any more miniversions for this stream."),
+ 0xC0190028: ("STATUS_HANDLE_NO_LONGER_VALID","The handle has been invalidated by a transaction. The most likely cause is the presence of memory mapping on a file or an open handle when the transaction ended or rolled back to savepoint."),
+ 0xC0190030: ("STATUS_LOG_CORRUPTION_DETECTED","The log data is corrupt."),
+ 0xC0190032: ("STATUS_RM_DISCONNECTED","The transaction outcome is unavailable because the resource manager responsible for it is disconnected."),
+ 0xC0190033: ("STATUS_ENLISTMENT_NOT_SUPERIOR","The request was rejected because the enlistment in question is not a superior enlistment."),
+ 0xC0190036: ("STATUS_FILE_IDENTITY_NOT_PERSISTENT","The file cannot be opened in a transaction because its identity depends on the outcome of an unresolved transaction."),
+ 0xC0190037: ("STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY","The operation cannot be performed because another transaction is depending on this property not changing."),
+ 0xC0190038: ("STATUS_CANT_CROSS_RM_BOUNDARY","The operation would involve a single file with two transactional resource managers and is, therefore, not allowed."),
+ 0xC0190039: ("STATUS_TXF_DIR_NOT_EMPTY","The $Txf directory must be empty for this operation to succeed."),
+ 0xC019003A: ("STATUS_INDOUBT_TRANSACTIONS_EXIST","The operation would leave a transactional resource manager in an inconsistent state and is therefore not allowed."),
+ 0xC019003B: ("STATUS_TM_VOLATILE","The operation could not be completed because the transaction manager does not have a log."),
+ 0xC019003C: ("STATUS_ROLLBACK_TIMER_EXPIRED","A rollback could not be scheduled because a previously scheduled rollback has already executed or been queued for execution."),
+ 0xC019003D: ("STATUS_TXF_ATTRIBUTE_CORRUPT","The transactional metadata attribute on the file or directory %hs is corrupt and unreadable."),
+ 0xC019003E: ("STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION","The encryption operation could not be completed because a transaction is active."),
+ 0xC019003F: ("STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED","This object is not allowed to be opened in a transaction."),
+ 0xC0190040: ("STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE","Memory mapping (creating a mapped section) a remote file under a transaction is not supported."),
+ 0xC0190043: ("STATUS_TRANSACTION_REQUIRED_PROMOTION","Promotion was required to allow the resource manager to enlist, but the transaction was set to disallow it."),
+ 0xC0190044: ("STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION","This file is open for modification in an unresolved transaction and may be opened for execute only by a transacted reader."),
+ 0xC0190045: ("STATUS_TRANSACTIONS_NOT_FROZEN","The request to thaw frozen transactions was ignored because transactions were not previously frozen."),
+ 0xC0190046: ("STATUS_TRANSACTION_FREEZE_IN_PROGRESS","Transactions cannot be frozen because a freeze is already in progress."),
+ 0xC0190047: ("STATUS_NOT_SNAPSHOT_VOLUME","The target volume is not a snapshot volume. This operation is valid only on a volume mounted as a snapshot."),
+ 0xC0190048: ("STATUS_NO_SAVEPOINT_WITH_OPEN_FILES","The savepoint operation failed because files are open on the transaction, which is not permitted."),
+ 0xC0190049: ("STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION","The sparse operation could not be completed because a transaction is active on the file."),
+ 0xC019004A: ("STATUS_TM_IDENTITY_MISMATCH","The call to create a transaction manager object failed because the Tm Identity that is stored in the log file does not match the Tm Identity that was passed in as an argument."),
+ 0xC019004B: ("STATUS_FLOATED_SECTION","I/O was attempted on a section object that has been floated as a result of a transaction ending. There is no valid data."),
+ 0xC019004C: ("STATUS_CANNOT_ACCEPT_TRANSACTED_WORK","The transactional resource manager cannot currently accept transacted work due to a transient condition, such as low resources."),
+ 0xC019004D: ("STATUS_CANNOT_ABORT_TRANSACTIONS","The transactional resource manager had too many transactions outstanding that could not be aborted. The transactional resource manager has been shut down."),
+ 0xC019004E: ("STATUS_TRANSACTION_NOT_FOUND","The specified transaction was unable to be opened because it was not found."),
+ 0xC019004F: ("STATUS_RESOURCEMANAGER_NOT_FOUND","The specified resource manager was unable to be opened because it was not found."),
+ 0xC0190050: ("STATUS_ENLISTMENT_NOT_FOUND","The specified enlistment was unable to be opened because it was not found."),
+ 0xC0190051: ("STATUS_TRANSACTIONMANAGER_NOT_FOUND","The specified transaction manager was unable to be opened because it was not found."),
+ 0xC0190052: ("STATUS_TRANSACTIONMANAGER_NOT_ONLINE","The specified resource manager was unable to create an enlistment because its associated transaction manager is not online."),
+ 0xC0190053: ("STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION","The specified transaction manager was unable to create the objects contained in its log file in the Ob namespace. Therefore, the transaction manager was unable to recover."),
+ 0xC0190054: ("STATUS_TRANSACTION_NOT_ROOT","The call to create a superior enlistment on this transaction object could not be completed because the transaction object specified for the enlistment is a subordinate branch of the transaction. Only the root of the transaction can be enlisted as a superior."),
+ 0xC0190055: ("STATUS_TRANSACTION_OBJECT_EXPIRED","Because the associated transaction manager or resource manager has been closed, the handle is no longer valid."),
+ 0xC0190056: ("STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION","The compression operation could not be completed because a transaction is active on the file."),
+ 0xC0190057: ("STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED","The specified operation could not be performed on this superior enlistment because the enlistment was not created with the corresponding completion response in the NotificationMask."),
+ 0xC0190058: ("STATUS_TRANSACTION_RECORD_TOO_LONG","The specified operation could not be performed because the record to be logged was too long. This can occur because either there are too many enlistments on this transaction or the combined RecoveryInformation being logged on behalf of those enlistments is too long."),
+ 0xC0190059: ("STATUS_NO_LINK_TRACKING_IN_TRANSACTION","The link-tracking operation could not be completed because a transaction is active."),
+ 0xC019005A: ("STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION","This operation cannot be performed in a transaction."),
+ 0xC019005B: ("STATUS_TRANSACTION_INTEGRITY_VIOLATED","The kernel transaction manager had to abort or forget the transaction because it blocked forward progress."),
+ 0xC0190060: ("STATUS_EXPIRED_HANDLE","The handle is no longer properly associated with its transaction. It may have been opened in a transactional resource manager that was subsequently forced to restart. Please close the handle and open a new one."),
+ 0xC0190061: ("STATUS_TRANSACTION_NOT_ENLISTED","The specified operation could not be performed because the resource manager is not enlisted in the transaction."),
+ 0xC01A0001: ("STATUS_LOG_SECTOR_INVALID","The log service found an invalid log sector."),
+ 0xC01A0002: ("STATUS_LOG_SECTOR_PARITY_INVALID","The log service encountered a log sector with invalid block parity."),
+ 0xC01A0003: ("STATUS_LOG_SECTOR_REMAPPED","The log service encountered a remapped log sector."),
+ 0xC01A0004: ("STATUS_LOG_BLOCK_INCOMPLETE","The log service encountered a partial or incomplete log block."),
+ 0xC01A0005: ("STATUS_LOG_INVALID_RANGE","The log service encountered an attempt to access data outside the active log range."),
+ 0xC01A0006: ("STATUS_LOG_BLOCKS_EXHAUSTED","The log service user-log marshaling buffers are exhausted."),
+ 0xC01A0007: ("STATUS_LOG_READ_CONTEXT_INVALID","The log service encountered an attempt to read from a marshaling area with an invalid read context."),
+ 0xC01A0008: ("STATUS_LOG_RESTART_INVALID","The log service encountered an invalid log restart area."),
+ 0xC01A0009: ("STATUS_LOG_BLOCK_VERSION","The log service encountered an invalid log block version."),
+ 0xC01A000A: ("STATUS_LOG_BLOCK_INVALID","The log service encountered an invalid log block."),
+ 0xC01A000B: ("STATUS_LOG_READ_MODE_INVALID","The log service encountered an attempt to read the log with an invalid read mode."),
+ 0xC01A000D: ("STATUS_LOG_METADATA_CORRUPT","The log service encountered a corrupted metadata file."),
+ 0xC01A000E: ("STATUS_LOG_METADATA_INVALID","The log service encountered a metadata file that could not be created by the log file system."),
+ 0xC01A000F: ("STATUS_LOG_METADATA_INCONSISTENT","The log service encountered a metadata file with inconsistent data."),
+ 0xC01A0010: ("STATUS_LOG_RESERVATION_INVALID","The log service encountered an attempt to erroneously allocate or dispose reservation space."),
+ 0xC01A0011: ("STATUS_LOG_CANT_DELETE","The log service cannot delete the log file or the file system container."),
+ 0xC01A0012: ("STATUS_LOG_CONTAINER_LIMIT_EXCEEDED","The log service has reached the maximum allowable containers allocated to a log file."),
+ 0xC01A0013: ("STATUS_LOG_START_OF_LOG","The log service has attempted to read or write backward past the start of the log."),
+ 0xC01A0014: ("STATUS_LOG_POLICY_ALREADY_INSTALLED","The log policy could not be installed because a policy of the same type is already present."),
+ 0xC01A0015: ("STATUS_LOG_POLICY_NOT_INSTALLED","The log policy in question was not installed at the time of the request."),
+ 0xC01A0016: ("STATUS_LOG_POLICY_INVALID","The installed set of policies on the log is invalid."),
+ 0xC01A0017: ("STATUS_LOG_POLICY_CONFLICT","A policy on the log in question prevented the operation from completing."),
+ 0xC01A0018: ("STATUS_LOG_PINNED_ARCHIVE_TAIL","The log space cannot be reclaimed because the log is pinned by the archive tail."),
+ 0xC01A0019: ("STATUS_LOG_RECORD_NONEXISTENT","The log record is not a record in the log file."),
+ 0xC01A001A: ("STATUS_LOG_RECORDS_RESERVED_INVALID","The number of reserved log records or the adjustment of the number of reserved log records is invalid."),
+ 0xC01A001B: ("STATUS_LOG_SPACE_RESERVED_INVALID","The reserved log space or the adjustment of the log space is invalid."),
+ 0xC01A001C: ("STATUS_LOG_TAIL_INVALID","A new or existing archive tail or the base of the active log is invalid."),
+ 0xC01A001D: ("STATUS_LOG_FULL","The log space is exhausted."),
+ 0xC01A001E: ("STATUS_LOG_MULTIPLEXED","The log is multiplexed; no direct writes to the physical log are allowed."),
+ 0xC01A001F: ("STATUS_LOG_DEDICATED","The operation failed because the log is dedicated."),
+ 0xC01A0020: ("STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS","The operation requires an archive context."),
+ 0xC01A0021: ("STATUS_LOG_ARCHIVE_IN_PROGRESS","Log archival is in progress."),
+ 0xC01A0022: ("STATUS_LOG_EPHEMERAL","The operation requires a nonephemeral log, but the log is ephemeral."),
+ 0xC01A0023: ("STATUS_LOG_NOT_ENOUGH_CONTAINERS","The log must have at least two containers before it can be read from or written to."),
+ 0xC01A0024: ("STATUS_LOG_CLIENT_ALREADY_REGISTERED","A log client has already registered on the stream."),
+ 0xC01A0025: ("STATUS_LOG_CLIENT_NOT_REGISTERED","A log client has not been registered on the stream."),
+ 0xC01A0026: ("STATUS_LOG_FULL_HANDLER_IN_PROGRESS","A request has already been made to handle the log full condition."),
+ 0xC01A0027: ("STATUS_LOG_CONTAINER_READ_FAILED","The log service encountered an error when attempting to read from a log container."),
+ 0xC01A0028: ("STATUS_LOG_CONTAINER_WRITE_FAILED","The log service encountered an error when attempting to write to a log container."),
+ 0xC01A0029: ("STATUS_LOG_CONTAINER_OPEN_FAILED","The log service encountered an error when attempting to open a log container."),
+ 0xC01A002A: ("STATUS_LOG_CONTAINER_STATE_INVALID","The log service encountered an invalid container state when attempting a requested action."),
+ 0xC01A002B: ("STATUS_LOG_STATE_INVALID","The log service is not in the correct state to perform a requested action."),
+ 0xC01A002C: ("STATUS_LOG_PINNED","The log space cannot be reclaimed because the log is pinned."),
+ 0xC01A002D: ("STATUS_LOG_METADATA_FLUSH_FAILED","The log metadata flush failed."),
+ 0xC01A002E: ("STATUS_LOG_INCONSISTENT_SECURITY","Security on the log and its containers is inconsistent."),
+ 0xC01A002F: ("STATUS_LOG_APPENDED_FLUSH_FAILED","Records were appended to the log or reservation changes were made, but the log could not be flushed."),
+ 0xC01A0030: ("STATUS_LOG_PINNED_RESERVATION","The log is pinned due to reservation consuming most of the log space. Free some reserved records to make space available."),
+ 0xC01B00EA: ("STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD","{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the computer, a dialog box will allow you to upload data about this failure to Microsoft."),
+ 0xC01C0001: ("STATUS_FLT_NO_HANDLER_DEFINED","A handler was not defined by the filter for this operation."),
+ 0xC01C0002: ("STATUS_FLT_CONTEXT_ALREADY_DEFINED","A context is already defined for this object."),
+ 0xC01C0003: ("STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST","Asynchronous requests are not valid for this operation."),
+ 0xC01C0004: ("STATUS_FLT_DISALLOW_FAST_IO","This is an internal error code used by the filter manager to determine if a fast I/O operation should be forced down the input/output request packet (IRP) path. Minifilters should never return this value."),
+ 0xC01C0005: ("STATUS_FLT_INVALID_NAME_REQUEST","An invalid name request was made. The name requested cannot be retrieved at this time."),
+ 0xC01C0006: ("STATUS_FLT_NOT_SAFE_TO_POST_OPERATION","Posting this operation to a worker thread for further processing is not safe at this time because it could lead to a system deadlock."),
+ 0xC01C0007: ("STATUS_FLT_NOT_INITIALIZED","The Filter Manager was not initialized when a filter tried to register. Make sure that the Filter Manager is loaded as a driver."),
+ 0xC01C0008: ("STATUS_FLT_FILTER_NOT_READY","The filter is not ready for attachment to volumes because it has not finished initializing (FltStartFiltering has not been called)."),
+ 0xC01C0009: ("STATUS_FLT_POST_OPERATION_CLEANUP","The filter must clean up any operation-specific context at this time because it is being removed from the system before the operation is completed by the lower drivers."),
+ 0xC01C000A: ("STATUS_FLT_INTERNAL_ERROR","The Filter Manager had an internal error from which it cannot recover; therefore, the operation has failed. This is usually the result of a filter returning an invalid value from a pre-operation callback."),
+ 0xC01C000B: ("STATUS_FLT_DELETING_OBJECT","The object specified for this action is in the process of being deleted; therefore, the action requested cannot be completed at this time."),
+ 0xC01C000C: ("STATUS_FLT_MUST_BE_NONPAGED_POOL","A nonpaged pool must be used for this type of context."),
+ 0xC01C000D: ("STATUS_FLT_DUPLICATE_ENTRY","A duplicate handler definition has been provided for an operation."),
+ 0xC01C000E: ("STATUS_FLT_CBDQ_DISABLED","The callback data queue has been disabled."),
+ 0xC01C000F: ("STATUS_FLT_DO_NOT_ATTACH","Do not attach the filter to the volume at this time."),
+ 0xC01C0010: ("STATUS_FLT_DO_NOT_DETACH","Do not detach the filter from the volume at this time."),
+ 0xC01C0011: ("STATUS_FLT_INSTANCE_ALTITUDE_COLLISION","An instance already exists at this altitude on the volume specified."),
+ 0xC01C0012: ("STATUS_FLT_INSTANCE_NAME_COLLISION","An instance already exists with this name on the volume specified."),
+ 0xC01C0013: ("STATUS_FLT_FILTER_NOT_FOUND","The system could not find the filter specified."),
+ 0xC01C0014: ("STATUS_FLT_VOLUME_NOT_FOUND","The system could not find the volume specified."),
+ 0xC01C0015: ("STATUS_FLT_INSTANCE_NOT_FOUND","The system could not find the instance specified."),
+ 0xC01C0016: ("STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND","No registered context allocation definition was found for the given request."),
+ 0xC01C0017: ("STATUS_FLT_INVALID_CONTEXT_REGISTRATION","An invalid parameter was specified during context registration."),
+ 0xC01C0018: ("STATUS_FLT_NAME_CACHE_MISS","The name requested was not found in the Filter Manager name cache and could not be retrieved from the file system."),
+ 0xC01C0019: ("STATUS_FLT_NO_DEVICE_OBJECT","The requested device object does not exist for the given volume."),
+ 0xC01C001A: ("STATUS_FLT_VOLUME_ALREADY_MOUNTED","The specified volume is already mounted."),
+ 0xC01C001B: ("STATUS_FLT_ALREADY_ENLISTED","The specified transaction context is already enlisted in a transaction."),
+ 0xC01C001C: ("STATUS_FLT_CONTEXT_ALREADY_LINKED","The specified context is already attached to another object."),
+ 0xC01C0020: ("STATUS_FLT_NO_WAITER_FOR_REPLY","No waiter is present for the filter's reply to this message."),
+ 0xC01D0001: ("STATUS_MONITOR_NO_DESCRIPTOR","A monitor descriptor could not be obtained."),
+ 0xC01D0002: ("STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT","This release does not support the format of the obtained monitor descriptor."),
+ 0xC01D0003: ("STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM","The checksum of the obtained monitor descriptor is invalid."),
+ 0xC01D0004: ("STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK","The monitor descriptor contains an invalid standard timing block."),
+ 0xC01D0005: ("STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED","WMI data-block registration failed for one of the MSMonitorClass WMI subclasses."),
+ 0xC01D0006: ("STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK","The provided monitor descriptor block is either corrupted or does not contain the monitor's detailed serial number."),
+ 0xC01D0007: ("STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK","The provided monitor descriptor block is either corrupted or does not contain the monitor's user-friendly name."),
+ 0xC01D0008: ("STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA","There is no monitor descriptor data at the specified (offset or size) region."),
+ 0xC01D0009: ("STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK","The monitor descriptor contains an invalid detailed timing block."),
+ 0xC01D000A: ("STATUS_MONITOR_INVALID_MANUFACTURE_DATE","Monitor descriptor contains invalid manufacture date."),
+ 0xC01E0000: ("STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER","Exclusive mode ownership is needed to create an unmanaged primary allocation."),
+ 0xC01E0001: ("STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER","The driver needs more DMA buffer space to complete the requested operation."),
+ 0xC01E0002: ("STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER","The specified display adapter handle is invalid."),
+ 0xC01E0003: ("STATUS_GRAPHICS_ADAPTER_WAS_RESET","The specified display adapter and all of its state have been reset."),
+ 0xC01E0004: ("STATUS_GRAPHICS_INVALID_DRIVER_MODEL","The driver stack does not match the expected driver model."),
+ 0xC01E0005: ("STATUS_GRAPHICS_PRESENT_MODE_CHANGED","Present happened but ended up into the changed desktop mode."),
+ 0xC01E0006: ("STATUS_GRAPHICS_PRESENT_OCCLUDED","Nothing to present due to desktop occlusion."),
+ 0xC01E0007: ("STATUS_GRAPHICS_PRESENT_DENIED","Not able to present due to denial of desktop access."),
+ 0xC01E0008: ("STATUS_GRAPHICS_CANNOTCOLORCONVERT","Not able to present with color conversion."),
+ 0xC01E000B: ("STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED","Present redirection is disabled (desktop windowing management subsystem is off)."),
+ 0xC01E000C: ("STATUS_GRAPHICS_PRESENT_UNOCCLUDED","Previous exclusive VidPn source owner has released its ownership"),
+ 0xC01E0100: ("STATUS_GRAPHICS_NO_VIDEO_MEMORY","Not enough video memory is available to complete the operation."),
+ 0xC01E0101: ("STATUS_GRAPHICS_CANT_LOCK_MEMORY","Could not probe and lock the underlying memory of an allocation."),
+ 0xC01E0102: ("STATUS_GRAPHICS_ALLOCATION_BUSY","The allocation is currently busy."),
+ 0xC01E0103: ("STATUS_GRAPHICS_TOO_MANY_REFERENCES","An object being referenced has already reached the maximum reference count and cannot be referenced further."),
+ 0xC01E0104: ("STATUS_GRAPHICS_TRY_AGAIN_LATER","A problem could not be solved due to an existing condition. Try again later."),
+ 0xC01E0105: ("STATUS_GRAPHICS_TRY_AGAIN_NOW","A problem could not be solved due to an existing condition. Try again now."),
+ 0xC01E0106: ("STATUS_GRAPHICS_ALLOCATION_INVALID","The allocation is invalid."),
+ 0xC01E0107: ("STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE","No more unswizzling apertures are currently available."),
+ 0xC01E0108: ("STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED","The current allocation cannot be unswizzled by an aperture."),
+ 0xC01E0109: ("STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION","The request failed because a pinned allocation cannot be evicted."),
+ 0xC01E0110: ("STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE","The allocation cannot be used from its current segment location for the specified operation."),
+ 0xC01E0111: ("STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION","A locked allocation cannot be used in the current command buffer."),
+ 0xC01E0112: ("STATUS_GRAPHICS_ALLOCATION_CLOSED","The allocation being referenced has been closed permanently."),
+ 0xC01E0113: ("STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE","An invalid allocation instance is being referenced."),
+ 0xC01E0114: ("STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE","An invalid allocation handle is being referenced."),
+ 0xC01E0115: ("STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE","The allocation being referenced does not belong to the current device."),
+ 0xC01E0116: ("STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST","The specified allocation lost its content."),
+ 0xC01E0200: ("STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE","A GPU exception was detected on the given device. The device cannot be scheduled."),
+ 0xC01E0300: ("STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY","The specified VidPN topology is invalid."),
+ 0xC01E0301: ("STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED","The specified VidPN topology is valid but is not supported by this model of the display adapter."),
+ 0xC01E0302: ("STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED","The specified VidPN topology is valid but is not currently supported by the display adapter due to allocation of its resources."),
+ 0xC01E0303: ("STATUS_GRAPHICS_INVALID_VIDPN","The specified VidPN handle is invalid."),
+ 0xC01E0304: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE","The specified video present source is invalid."),
+ 0xC01E0305: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET","The specified video present target is invalid."),
+ 0xC01E0306: ("STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED","The specified VidPN modality is not supported (for example, at least two of the pinned modes are not co-functional)."),
+ 0xC01E0308: ("STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET","The specified VidPN source mode set is invalid."),
+ 0xC01E0309: ("STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET","The specified VidPN target mode set is invalid."),
+ 0xC01E030A: ("STATUS_GRAPHICS_INVALID_FREQUENCY","The specified video signal frequency is invalid."),
+ 0xC01E030B: ("STATUS_GRAPHICS_INVALID_ACTIVE_REGION","The specified video signal active region is invalid."),
+ 0xC01E030C: ("STATUS_GRAPHICS_INVALID_TOTAL_REGION","The specified video signal total region is invalid."),
+ 0xC01E0310: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE","The specified video present source mode is invalid."),
+ 0xC01E0311: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE","The specified video present target mode is invalid."),
+ 0xC01E0312: ("STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET","The pinned mode must remain in the set on the VidPN's co-functional modality enumeration."),
+ 0xC01E0313: ("STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY","The specified video present path is already in the VidPN's topology."),
+ 0xC01E0314: ("STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET","The specified mode is already in the mode set."),
+ 0xC01E0315: ("STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET","The specified video present source set is invalid."),
+ 0xC01E0316: ("STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET","The specified video present target set is invalid."),
+ 0xC01E0317: ("STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET","The specified video present source is already in the video present source set."),
+ 0xC01E0318: ("STATUS_GRAPHICS_TARGET_ALREADY_IN_SET","The specified video present target is already in the video present target set."),
+ 0xC01E0319: ("STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH","The specified VidPN present path is invalid."),
+ 0xC01E031A: ("STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY","The miniport has no recommendation for augmenting the specified VidPN's topology."),
+ 0xC01E031B: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET","The specified monitor frequency range set is invalid."),
+ 0xC01E031C: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE","The specified monitor frequency range is invalid."),
+ 0xC01E031D: ("STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET","The specified frequency range is not in the specified monitor frequency range set."),
+ 0xC01E031F: ("STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET","The specified frequency range is already in the specified monitor frequency range set."),
+ 0xC01E0320: ("STATUS_GRAPHICS_STALE_MODESET","The specified mode set is stale. Reacquire the new mode set."),
+ 0xC01E0321: ("STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET","The specified monitor source mode set is invalid."),
+ 0xC01E0322: ("STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE","The specified monitor source mode is invalid."),
+ 0xC01E0323: ("STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN","The miniport does not have a recommendation regarding the request to provide a functional VidPN given the current display adapter configuration."),
+ 0xC01E0324: ("STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE","The ID of the specified mode is being used by another mode in the set."),
+ 0xC01E0325: ("STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION","The system failed to determine a mode that is supported by both the display adapter and the monitor connected to it."),
+ 0xC01E0326: ("STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES","The number of video present targets must be greater than or equal to the number of video present sources."),
+ 0xC01E0327: ("STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY","The specified present path is not in the VidPN's topology."),
+ 0xC01E0328: ("STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE","The display adapter must have at least one video present source."),
+ 0xC01E0329: ("STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET","The display adapter must have at least one video present target."),
+ 0xC01E032A: ("STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET","The specified monitor descriptor set is invalid."),
+ 0xC01E032B: ("STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR","The specified monitor descriptor is invalid."),
+ 0xC01E032C: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET","The specified descriptor is not in the specified monitor descriptor set."),
+ 0xC01E032D: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET","The specified descriptor is already in the specified monitor descriptor set."),
+ 0xC01E032E: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE","The ID of the specified monitor descriptor is being used by another descriptor in the set."),
+ 0xC01E032F: ("STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE","The specified video present target subset type is invalid."),
+ 0xC01E0330: ("STATUS_GRAPHICS_RESOURCES_NOT_RELATED","Two or more of the specified resources are not related to each other, as defined by the interface semantics."),
+ 0xC01E0331: ("STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE","The ID of the specified video present source is being used by another source in the set."),
+ 0xC01E0332: ("STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE","The ID of the specified video present target is being used by another target in the set."),
+ 0xC01E0333: ("STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET","The specified VidPN source cannot be used because there is no available VidPN target to connect it to."),
+ 0xC01E0334: ("STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER","The newly arrived monitor could not be associated with a display adapter."),
+ 0xC01E0335: ("STATUS_GRAPHICS_NO_VIDPNMGR","The particular display adapter does not have an associated VidPN manager."),
+ 0xC01E0336: ("STATUS_GRAPHICS_NO_ACTIVE_VIDPN","The VidPN manager of the particular display adapter does not have an active VidPN."),
+ 0xC01E0337: ("STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY","The specified VidPN topology is stale; obtain the new topology."),
+ 0xC01E0338: ("STATUS_GRAPHICS_MONITOR_NOT_CONNECTED","No monitor is connected on the specified video present target."),
+ 0xC01E0339: ("STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY","The specified source is not part of the specified VidPN's topology."),
+ 0xC01E033A: ("STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE","The specified primary surface size is invalid."),
+ 0xC01E033B: ("STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE","The specified visible region size is invalid."),
+ 0xC01E033C: ("STATUS_GRAPHICS_INVALID_STRIDE","The specified stride is invalid."),
+ 0xC01E033D: ("STATUS_GRAPHICS_INVALID_PIXELFORMAT","The specified pixel format is invalid."),
+ 0xC01E033E: ("STATUS_GRAPHICS_INVALID_COLORBASIS","The specified color basis is invalid."),
+ 0xC01E033F: ("STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE","The specified pixel value access mode is invalid."),
+ 0xC01E0340: ("STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY","The specified target is not part of the specified VidPN's topology."),
+ 0xC01E0341: ("STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT","Failed to acquire the display mode management interface."),
+ 0xC01E0342: ("STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE","The specified VidPN source is already owned by a DMM client and cannot be used until that client releases it."),
+ 0xC01E0343: ("STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN","The specified VidPN is active and cannot be accessed."),
+ 0xC01E0344: ("STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL","The specified VidPN's present path importance ordinal is invalid."),
+ 0xC01E0345: ("STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION","The specified VidPN's present path content geometry transformation is invalid."),
+ 0xC01E0346: ("STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED","The specified content geometry transformation is not supported on the respective VidPN present path."),
+ 0xC01E0347: ("STATUS_GRAPHICS_INVALID_GAMMA_RAMP","The specified gamma ramp is invalid."),
+ 0xC01E0348: ("STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED","The specified gamma ramp is not supported on the respective VidPN present path."),
+ 0xC01E0349: ("STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED","Multisampling is not supported on the respective VidPN present path."),
+ 0xC01E034A: ("STATUS_GRAPHICS_MODE_NOT_IN_MODESET","The specified mode is not in the specified mode set."),
+ 0xC01E034D: ("STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON","The specified VidPN topology recommendation reason is invalid."),
+ 0xC01E034E: ("STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE","The specified VidPN present path content type is invalid."),
+ 0xC01E034F: ("STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE","The specified VidPN present path copy protection type is invalid."),
+ 0xC01E0350: ("STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS","Only one unassigned mode set can exist at any one time for a particular VidPN source or target."),
+ 0xC01E0352: ("STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING","The specified scan line ordering type is invalid."),
+ 0xC01E0353: ("STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED","The topology changes are not allowed for the specified VidPN."),
+ 0xC01E0354: ("STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS","All available importance ordinals are being used in the specified topology."),
+ 0xC01E0355: ("STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT","The specified primary surface has a different private-format attribute than the current primary surface."),
+ 0xC01E0356: ("STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM","The specified mode-pruning algorithm is invalid."),
+ 0xC01E0357: ("STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN","The specified monitor-capability origin is invalid."),
+ 0xC01E0358: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT","The specified monitor-frequency range constraint is invalid."),
+ 0xC01E0359: ("STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED","The maximum supported number of present paths has been reached."),
+ 0xC01E035A: ("STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION","The miniport requested that augmentation be canceled for the specified source of the specified VidPN's topology."),
+ 0xC01E035B: ("STATUS_GRAPHICS_INVALID_CLIENT_TYPE","The specified client type was not recognized."),
+ 0xC01E035C: ("STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET","The client VidPN is not set on this adapter (for example, no user mode-initiated mode changes have taken place on this adapter)."),
+ 0xC01E0400: ("STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED","The specified display adapter child device already has an external device connected to it."),
+ 0xC01E0401: ("STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED","The display adapter child device does not support reporting a descriptor."),
+ 0xC01E0430: ("STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER","The display adapter is not linked to any other adapters."),
+ 0xC01E0431: ("STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED","The lead adapter in a linked configuration was not enumerated yet."),
+ 0xC01E0432: ("STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED","Some chain adapters in a linked configuration have not yet been enumerated."),
+ 0xC01E0433: ("STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY","The chain of linked adapters is not ready to start because of an unknown failure."),
+ 0xC01E0434: ("STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED","An attempt was made to start a lead link display adapter when the chain links had not yet started."),
+ 0xC01E0435: ("STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON","An attempt was made to turn on a lead link display adapter when the chain links were turned off."),
+ 0xC01E0436: ("STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE","The adapter link was found in an inconsistent state. Not all adapters are in an expected PNP/power state."),
+ 0xC01E0438: ("STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER","The driver trying to start is not the same as the driver for the posted display adapter."),
+ 0xC01E043B: ("STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED","An operation is being attempted that requires the display adapter to be in a quiescent state."),
+ 0xC01E0500: ("STATUS_GRAPHICS_OPM_NOT_SUPPORTED","The driver does not support OPM."),
+ 0xC01E0501: ("STATUS_GRAPHICS_COPP_NOT_SUPPORTED","The driver does not support COPP."),
+ 0xC01E0502: ("STATUS_GRAPHICS_UAB_NOT_SUPPORTED","The driver does not support UAB."),
+ 0xC01E0503: ("STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS","The specified encrypted parameters are invalid."),
+ 0xC01E0504: ("STATUS_GRAPHICS_OPM_PARAMETER_ARRAY_TOO_SMALL","An array passed to a function cannot hold all of the data that the function wants to put in it."),
+ 0xC01E0505: ("STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST","The GDI display device passed to this function does not have any active protected outputs."),
+ 0xC01E0506: ("STATUS_GRAPHICS_PVP_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME","The PVP cannot find an actual GDI display device that corresponds to the passed-in GDI display device name."),
+ 0xC01E0507: ("STATUS_GRAPHICS_PVP_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP","This function failed because the GDI display device passed to it was not attached to the Windows desktop."),
+ 0xC01E0508: ("STATUS_GRAPHICS_PVP_MIRRORING_DEVICES_NOT_SUPPORTED","The PVP does not support mirroring display devices because they do not have any protected outputs."),
+ 0xC01E050A: ("STATUS_GRAPHICS_OPM_INVALID_POINTER","The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or it points to an invalid address or a kernel mode address."),
+ 0xC01E050B: ("STATUS_GRAPHICS_OPM_INTERNAL_ERROR","An internal error caused an operation to fail."),
+ 0xC01E050C: ("STATUS_GRAPHICS_OPM_INVALID_HANDLE","The function failed because the caller passed in an invalid OPM user-mode handle."),
+ 0xC01E050D: ("STATUS_GRAPHICS_PVP_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE","This function failed because the GDI device passed to it did not have any monitors associated with it."),
+ 0xC01E050E: ("STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH","A certificate could not be returned because the certificate buffer passed to the function was too small."),
+ 0xC01E050F: ("STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED","DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present yarget is in spanning mode."),
+ 0xC01E0510: ("STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED","DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present target is in theater mode."),
+ 0xC01E0511: ("STATUS_GRAPHICS_PVP_HFS_FAILED","The function call failed because the display adapter's hardware functionality scan (HFS) failed to validate the graphics hardware."),
+ 0xC01E0512: ("STATUS_GRAPHICS_OPM_INVALID_SRM","The HDCP SRM passed to this function did not comply with section 5 of the HDCP 1.1 specification."),
+ 0xC01E0513: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP","The protected output cannot enable the HDCP system because it does not support it."),
+ 0xC01E0514: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP","The protected output cannot enable analog copy protection because it does not support it."),
+ 0xC01E0515: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA","The protected output cannot enable the CGMS-A protection technology because it does not support it."),
+ 0xC01E0516: ("STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET","DxgkDdiOPMGetInformation() cannot return the version of the SRM being used because the application never successfully passed an SRM to the protected output."),
+ 0xC01E0517: ("STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH","DxgkDdiOPMConfigureProtectedOutput() cannot enable the specified output protection technology because the output's screen resolution is too high."),
+ 0xC01E0518: ("STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE","DxgkDdiOPMConfigureProtectedOutput() cannot enable HDCP because other physical outputs are using the display adapter's HDCP hardware."),
+ 0xC01E051A: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS","The operating system asynchronously destroyed this OPM-protected output because the operating system state changed. This error typically occurs because the monitor PDO associated with this protected output was removed or stopped, the protected output's session became a nonconsole session, or the protected output's desktop became inactive."),
+ 0xC01E051B: ("STATUS_GRAPHICS_OPM_SESSION_TYPE_CHANGE_IN_PROGRESS","OPM functions cannot be called when a session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA)."),
+ 0xC01E051C: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS","The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has OPM semantics. DxgkDdiOPMGetCOPPCompatibleInformation always returns this error if a protected output has OPM semantics. DxgkDdiOPMGetInformation returns this error code if the caller requested COPP-specific information. DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use a COPP-specific command."),
+ 0xC01E051D: ("STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST","The DxgkDdiOPMGetInformation and DxgkDdiOPMGetCOPPCompatibleInformation functions return this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid."),
+ 0xC01E051E: ("STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR","The function failed because an unexpected error occurred inside a display driver."),
+ 0xC01E051F: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS","The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has COPP semantics. DxgkDdiOPMGetCOPPCompatibleInformation returns this error code if the caller requested OPM-specific information. DxgkDdiOPMGetInformation always returns this error if a protected output has COPP semantics. DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use an OPM-specific command."),
+ 0xC01E0520: ("STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED","The DxgkDdiOPMGetCOPPCompatibleInformation and DxgkDdiOPMConfigureProtectedOutput functions return this error if the display driver does not support the DXGKMDT_OPM_GET_ACP_AND_CGMSA_SIGNALING and DXGKMDT_OPM_SET_ACP_AND_CGMSA_SIGNALING GUIDs."),
+ 0xC01E0521: ("STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST","The DxgkDdiOPMConfigureProtectedOutput function returns this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid."),
+ 0xC01E0580: ("STATUS_GRAPHICS_I2C_NOT_SUPPORTED","The monitor connected to the specified video output does not have an I2C bus."),
+ 0xC01E0581: ("STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST","No device on the I2C bus has the specified address."),
+ 0xC01E0582: ("STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA","An error occurred while transmitting data to the device on the I2C bus."),
+ 0xC01E0583: ("STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA","An error occurred while receiving data from the device on the I2C bus."),
+ 0xC01E0584: ("STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED","The monitor does not support the specified VCP code."),
+ 0xC01E0585: ("STATUS_GRAPHICS_DDCCI_INVALID_DATA","The data received from the monitor is invalid."),
+ 0xC01E0586: ("STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE","A function call failed because a monitor returned an invalid timing status byte when the operating system used the DDC/CI get timing report and timing message command to get a timing report from a monitor."),
+ 0xC01E0587: ("STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING","A monitor returned a DDC/CI capabilities string that did not comply with the ACCESS.bus 3.0, DDC/CI 1.1, or MCCS 2 Revision 1 specification."),
+ 0xC01E0588: ("STATUS_GRAPHICS_MCA_INTERNAL_ERROR","An internal error caused an operation to fail."),
+ 0xC01E0589: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND","An operation failed because a DDC/CI message had an invalid value in its command field."),
+ 0xC01E058A: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH","This error occurred because a DDC/CI message had an invalid value in its length field."),
+ 0xC01E058B: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM","This error occurred because the value in a DDC/CI message's checksum field did not match the message's computed checksum value. This error implies that the data was corrupted while it was being transmitted from a monitor to a computer."),
+ 0xC01E058C: ("STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE","This function failed because an invalid monitor handle was passed to it."),
+ 0xC01E058D: ("STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS","The operating system asynchronously destroyed the monitor that corresponds to this handle because the operating system's state changed. This error typically occurs because the monitor PDO associated with this handle was removed or stopped, or a display mode change occurred. A display mode change occurs when Windows sends a WM_DISPLAYCHANGE message to applications."),
+ 0xC01E05E0: ("STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED","This function can be used only if a program is running in the local console session. It cannot be used if a program is running on a remote desktop session or on a terminal server session."),
+ 0xC01E05E1: ("STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME","This function cannot find an actual GDI display device that corresponds to the specified GDI display device name."),
+ 0xC01E05E2: ("STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP","The function failed because the specified GDI display device was not attached to the Windows desktop."),
+ 0xC01E05E3: ("STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED","This function does not support GDI mirroring display devices because GDI mirroring display devices do not have any physical monitors associated with them."),
+ 0xC01E05E4: ("STATUS_GRAPHICS_INVALID_POINTER","The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or points to an invalid address or to a kernel mode address."),
+ 0xC01E05E5: ("STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE","This function failed because the GDI device passed to it did not have a monitor associated with it."),
+ 0xC01E05E6: ("STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL","An array passed to the function cannot hold all of the data that the function must copy into the array."),
+ 0xC01E05E7: ("STATUS_GRAPHICS_INTERNAL_ERROR","An internal error caused an operation to fail."),
+ 0xC01E05E8: ("STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS","The function failed because the current session is changing its type. This function cannot be called when the current session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA)."),
+ 0xC0210000: ("STATUS_FVE_LOCKED_VOLUME","The volume must be unlocked before it can be used."),
+ 0xC0210001: ("STATUS_FVE_NOT_ENCRYPTED","The volume is fully decrypted and no key is available."),
+ 0xC0210002: ("STATUS_FVE_BAD_INFORMATION","The control block for the encrypted volume is not valid."),
+ 0xC0210003: ("STATUS_FVE_TOO_SMALL","Not enough free space remains on the volume to allow encryption."),
+ 0xC0210004: ("STATUS_FVE_FAILED_WRONG_FS","The partition cannot be encrypted because the file system is not supported."),
+ 0xC0210005: ("STATUS_FVE_FAILED_BAD_FS","The file system is inconsistent. Run the Check Disk utility."),
+ 0xC0210006: ("STATUS_FVE_FS_NOT_EXTENDED","The file system does not extend to the end of the volume."),
+ 0xC0210007: ("STATUS_FVE_FS_MOUNTED","This operation cannot be performed while a file system is mounted on the volume."),
+ 0xC0210008: ("STATUS_FVE_NO_LICENSE","BitLocker Drive Encryption is not included with this version of Windows."),
+ 0xC0210009: ("STATUS_FVE_ACTION_NOT_ALLOWED","The requested action was denied by the FVE control engine."),
+ 0xC021000A: ("STATUS_FVE_BAD_DATA","The data supplied is malformed."),
+ 0xC021000B: ("STATUS_FVE_VOLUME_NOT_BOUND","The volume is not bound to the system."),
+ 0xC021000C: ("STATUS_FVE_NOT_DATA_VOLUME","The volume specified is not a data volume."),
+ 0xC021000D: ("STATUS_FVE_CONV_READ_ERROR","A read operation failed while converting the volume."),
+ 0xC021000E: ("STATUS_FVE_CONV_WRITE_ERROR","A write operation failed while converting the volume."),
+ 0xC021000F: ("STATUS_FVE_OVERLAPPED_UPDATE","The control block for the encrypted volume was updated by another thread. Try again."),
+ 0xC0210010: ("STATUS_FVE_FAILED_SECTOR_SIZE","The volume encryption algorithm cannot be used on this sector size."),
+ 0xC0210011: ("STATUS_FVE_FAILED_AUTHENTICATION","BitLocker recovery authentication failed."),
+ 0xC0210012: ("STATUS_FVE_NOT_OS_VOLUME","The volume specified is not the boot operating system volume."),
+ 0xC0210013: ("STATUS_FVE_KEYFILE_NOT_FOUND","The BitLocker startup key or recovery password could not be read from external media."),
+ 0xC0210014: ("STATUS_FVE_KEYFILE_INVALID","The BitLocker startup key or recovery password file is corrupt or invalid."),
+ 0xC0210015: ("STATUS_FVE_KEYFILE_NO_VMK","The BitLocker encryption key could not be obtained from the startup key or the recovery password."),
+ 0xC0210016: ("STATUS_FVE_TPM_DISABLED","The TPM is disabled."),
+ 0xC0210017: ("STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO","The authorization data for the SRK of the TPM is not zero."),
+ 0xC0210018: ("STATUS_FVE_TPM_INVALID_PCR","The system boot information changed or the TPM locked out access to BitLocker encryption keys until the computer is restarted."),
+ 0xC0210019: ("STATUS_FVE_TPM_NO_VMK","The BitLocker encryption key could not be obtained from the TPM."),
+ 0xC021001A: ("STATUS_FVE_PIN_INVALID","The BitLocker encryption key could not be obtained from the TPM and PIN."),
+ 0xC021001B: ("STATUS_FVE_AUTH_INVALID_APPLICATION","A boot application hash does not match the hash computed when BitLocker was turned on."),
+ 0xC021001C: ("STATUS_FVE_AUTH_INVALID_CONFIG","The Boot Configuration Data (BCD) settings are not supported or have changed because BitLocker was enabled."),
+ 0xC021001D: ("STATUS_FVE_DEBUGGER_ENABLED","Boot debugging is enabled. Run Windows Boot Configuration Data Store Editor (bcdedit.exe) to turn it off."),
+ 0xC021001E: ("STATUS_FVE_DRY_RUN_FAILED","The BitLocker encryption key could not be obtained."),
+ 0xC021001F: ("STATUS_FVE_BAD_METADATA_POINTER","The metadata disk region pointer is incorrect."),
+ 0xC0210020: ("STATUS_FVE_OLD_METADATA_COPY","The backup copy of the metadata is out of date."),
+ 0xC0210021: ("STATUS_FVE_REBOOT_REQUIRED","No action was taken because a system restart is required."),
+ 0xC0210022: ("STATUS_FVE_RAW_ACCESS","No action was taken because BitLocker Drive Encryption is in RAW access mode."),
+ 0xC0210023: ("STATUS_FVE_RAW_BLOCKED","BitLocker Drive Encryption cannot enter RAW access mode for this volume."),
+ 0xC0210026: ("STATUS_FVE_NO_FEATURE_LICENSE","This feature of BitLocker Drive Encryption is not included with this version of Windows."),
+ 0xC0210027: ("STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED","Group policy does not permit turning off BitLocker Drive Encryption on roaming data volumes."),
+ 0xC0210028: ("STATUS_FVE_CONV_RECOVERY_FAILED","Bitlocker Drive Encryption failed to recover from aborted conversion. This could be due to either all conversion logs being corrupted or the media being write-protected."),
+ 0xC0210029: ("STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG","The requested virtualization size is too big."),
+ 0xC0210030: ("STATUS_FVE_VOLUME_TOO_SMALL","The drive is too small to be protected using BitLocker Drive Encryption."),
+ 0xC0220001: ("STATUS_FWP_CALLOUT_NOT_FOUND","The callout does not exist."),
+ 0xC0220002: ("STATUS_FWP_CONDITION_NOT_FOUND","The filter condition does not exist."),
+ 0xC0220003: ("STATUS_FWP_FILTER_NOT_FOUND","The filter does not exist."),
+ 0xC0220004: ("STATUS_FWP_LAYER_NOT_FOUND","The layer does not exist."),
+ 0xC0220005: ("STATUS_FWP_PROVIDER_NOT_FOUND","The provider does not exist."),
+ 0xC0220006: ("STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND","The provider context does not exist."),
+ 0xC0220007: ("STATUS_FWP_SUBLAYER_NOT_FOUND","The sublayer does not exist."),
+ 0xC0220008: ("STATUS_FWP_NOT_FOUND","The object does not exist."),
+ 0xC0220009: ("STATUS_FWP_ALREADY_EXISTS","An object with that GUID or LUID already exists."),
+ 0xC022000A: ("STATUS_FWP_IN_USE","The object is referenced by other objects and cannot be deleted."),
+ 0xC022000B: ("STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS","The call is not allowed from within a dynamic session."),
+ 0xC022000C: ("STATUS_FWP_WRONG_SESSION","The call was made from the wrong session and cannot be completed."),
+ 0xC022000D: ("STATUS_FWP_NO_TXN_IN_PROGRESS","The call must be made from within an explicit transaction."),
+ 0xC022000E: ("STATUS_FWP_TXN_IN_PROGRESS","The call is not allowed from within an explicit transaction."),
+ 0xC022000F: ("STATUS_FWP_TXN_ABORTED","The explicit transaction has been forcibly canceled."),
+ 0xC0220010: ("STATUS_FWP_SESSION_ABORTED","The session has been canceled."),
+ 0xC0220011: ("STATUS_FWP_INCOMPATIBLE_TXN","The call is not allowed from within a read-only transaction."),
+ 0xC0220012: ("STATUS_FWP_TIMEOUT","The call timed out while waiting to acquire the transaction lock."),
+ 0xC0220013: ("STATUS_FWP_NET_EVENTS_DISABLED","The collection of network diagnostic events is disabled."),
+ 0xC0220014: ("STATUS_FWP_INCOMPATIBLE_LAYER","The operation is not supported by the specified layer."),
+ 0xC0220015: ("STATUS_FWP_KM_CLIENTS_ONLY","The call is allowed for kernel-mode callers only."),
+ 0xC0220016: ("STATUS_FWP_LIFETIME_MISMATCH","The call tried to associate two objects with incompatible lifetimes."),
+ 0xC0220017: ("STATUS_FWP_BUILTIN_OBJECT","The object is built-in and cannot be deleted."),
+ 0xC0220018: ("STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS","The maximum number of boot-time filters has been reached."),
+ 0xC0220018: ("STATUS_FWP_TOO_MANY_CALLOUTS","The maximum number of callouts has been reached."),
+ 0xC0220019: ("STATUS_FWP_NOTIFICATION_DROPPED","A notification could not be delivered because a message queue has reached maximum capacity."),
+ 0xC022001A: ("STATUS_FWP_TRAFFIC_MISMATCH","The traffic parameters do not match those for the security association context."),
+ 0xC022001B: ("STATUS_FWP_INCOMPATIBLE_SA_STATE","The call is not allowed for the current security association state."),
+ 0xC022001C: ("STATUS_FWP_NULL_POINTER","A required pointer is null."),
+ 0xC022001D: ("STATUS_FWP_INVALID_ENUMERATOR","An enumerator is not valid."),
+ 0xC022001E: ("STATUS_FWP_INVALID_FLAGS","The flags field contains an invalid value."),
+ 0xC022001F: ("STATUS_FWP_INVALID_NET_MASK","A network mask is not valid."),
+ 0xC0220020: ("STATUS_FWP_INVALID_RANGE","An FWP_RANGE is not valid."),
+ 0xC0220021: ("STATUS_FWP_INVALID_INTERVAL","The time interval is not valid."),
+ 0xC0220022: ("STATUS_FWP_ZERO_LENGTH_ARRAY","An array that must contain at least one element has a zero length."),
+ 0xC0220023: ("STATUS_FWP_NULL_DISPLAY_NAME","The displayData.name field cannot be null."),
+ 0xC0220024: ("STATUS_FWP_INVALID_ACTION_TYPE","The action type is not one of the allowed action types for a filter."),
+ 0xC0220025: ("STATUS_FWP_INVALID_WEIGHT","The filter weight is not valid."),
+ 0xC0220026: ("STATUS_FWP_MATCH_TYPE_MISMATCH","A filter condition contains a match type that is not compatible with the operands."),
+ 0xC0220027: ("STATUS_FWP_TYPE_MISMATCH","An FWP_VALUE or FWPM_CONDITION_VALUE is of the wrong type."),
+ 0xC0220028: ("STATUS_FWP_OUT_OF_BOUNDS","An integer value is outside the allowed range."),
+ 0xC0220029: ("STATUS_FWP_RESERVED","A reserved field is nonzero."),
+ 0xC022002A: ("STATUS_FWP_DUPLICATE_CONDITION","A filter cannot contain multiple conditions operating on a single field."),
+ 0xC022002B: ("STATUS_FWP_DUPLICATE_KEYMOD","A policy cannot contain the same keying module more than once."),
+ 0xC022002C: ("STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER","The action type is not compatible with the layer."),
+ 0xC022002D: ("STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER","The action type is not compatible with the sublayer."),
+ 0xC022002E: ("STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER","The raw context or the provider context is not compatible with the layer."),
+ 0xC022002F: ("STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT","The raw context or the provider context is not compatible with the callout."),
+ 0xC0220030: ("STATUS_FWP_INCOMPATIBLE_AUTH_METHOD","The authentication method is not compatible with the policy type."),
+ 0xC0220031: ("STATUS_FWP_INCOMPATIBLE_DH_GROUP","The Diffie-Hellman group is not compatible with the policy type."),
+ 0xC0220032: ("STATUS_FWP_EM_NOT_SUPPORTED","An IKE policy cannot contain an Extended Mode policy."),
+ 0xC0220033: ("STATUS_FWP_NEVER_MATCH","The enumeration template or subscription will never match any objects."),
+ 0xC0220034: ("STATUS_FWP_PROVIDER_CONTEXT_MISMATCH","The provider context is of the wrong type."),
+ 0xC0220035: ("STATUS_FWP_INVALID_PARAMETER","The parameter is incorrect."),
+ 0xC0220036: ("STATUS_FWP_TOO_MANY_SUBLAYERS","The maximum number of sublayers has been reached."),
+ 0xC0220037: ("STATUS_FWP_CALLOUT_NOTIFICATION_FAILED","The notification function for a callout returned an error."),
+ 0xC0220038: ("STATUS_FWP_INCOMPATIBLE_AUTH_CONFIG","The IPsec authentication configuration is not compatible with the authentication type."),
+ 0xC0220039: ("STATUS_FWP_INCOMPATIBLE_CIPHER_CONFIG","The IPsec cipher configuration is not compatible with the cipher type."),
+ 0xC022003C: ("STATUS_FWP_DUPLICATE_AUTH_METHOD","A policy cannot contain the same auth method more than once."),
+ 0xC0220100: ("STATUS_FWP_TCPIP_NOT_READY","The TCP/IP stack is not ready."),
+ 0xC0220101: ("STATUS_FWP_INJECT_HANDLE_CLOSING","The injection handle is being closed by another thread."),
+ 0xC0220102: ("STATUS_FWP_INJECT_HANDLE_STALE","The injection handle is stale."),
+ 0xC0220103: ("STATUS_FWP_CANNOT_PEND","The classify cannot be pended."),
+ 0xC0230002: ("STATUS_NDIS_CLOSING","The binding to the network interface is being closed."),
+ 0xC0230004: ("STATUS_NDIS_BAD_VERSION","An invalid version was specified."),
+ 0xC0230005: ("STATUS_NDIS_BAD_CHARACTERISTICS","An invalid characteristics table was used."),
+ 0xC0230006: ("STATUS_NDIS_ADAPTER_NOT_FOUND","Failed to find the network interface or the network interface is not ready."),
+ 0xC0230007: ("STATUS_NDIS_OPEN_FAILED","Failed to open the network interface."),
+ 0xC0230008: ("STATUS_NDIS_DEVICE_FAILED","The network interface has encountered an internal unrecoverable failure."),
+ 0xC0230009: ("STATUS_NDIS_MULTICAST_FULL","The multicast list on the network interface is full."),
+ 0xC023000A: ("STATUS_NDIS_MULTICAST_EXISTS","An attempt was made to add a duplicate multicast address to the list."),
+ 0xC023000B: ("STATUS_NDIS_MULTICAST_NOT_FOUND","At attempt was made to remove a multicast address that was never added."),
+ 0xC023000C: ("STATUS_NDIS_REQUEST_ABORTED","The network interface aborted the request."),
+ 0xC023000D: ("STATUS_NDIS_RESET_IN_PROGRESS","The network interface cannot process the request because it is being reset."),
+ 0xC023000F: ("STATUS_NDIS_INVALID_PACKET","An attempt was made to send an invalid packet on a network interface."),
+ 0xC0230010: ("STATUS_NDIS_INVALID_DEVICE_REQUEST","The specified request is not a valid operation for the target device."),
+ 0xC0230011: ("STATUS_NDIS_ADAPTER_NOT_READY","The network interface is not ready to complete this operation."),
+ 0xC0230014: ("STATUS_NDIS_INVALID_LENGTH","The length of the buffer submitted for this operation is not valid."),
+ 0xC0230015: ("STATUS_NDIS_INVALID_DATA","The data used for this operation is not valid."),
+ 0xC0230016: ("STATUS_NDIS_BUFFER_TOO_SHORT","The length of the submitted buffer for this operation is too small."),
+ 0xC0230017: ("STATUS_NDIS_INVALID_OID","The network interface does not support this object identifier."),
+ 0xC0230018: ("STATUS_NDIS_ADAPTER_REMOVED","The network interface has been removed."),
+ 0xC0230019: ("STATUS_NDIS_UNSUPPORTED_MEDIA","The network interface does not support this media type."),
+ 0xC023001A: ("STATUS_NDIS_GROUP_ADDRESS_IN_USE","An attempt was made to remove a token ring group address that is in use by other components."),
+ 0xC023001B: ("STATUS_NDIS_FILE_NOT_FOUND","An attempt was made to map a file that cannot be found."),
+ 0xC023001C: ("STATUS_NDIS_ERROR_READING_FILE","An error occurred while NDIS tried to map the file."),
+ 0xC023001D: ("STATUS_NDIS_ALREADY_MAPPED","An attempt was made to map a file that is already mapped."),
+ 0xC023001E: ("STATUS_NDIS_RESOURCE_CONFLICT","An attempt to allocate a hardware resource failed because the resource is used by another component."),
+ 0xC023001F: ("STATUS_NDIS_MEDIA_DISCONNECTED","The I/O operation failed because the network media is disconnected or the wireless access point is out of range."),
+ 0xC0230022: ("STATUS_NDIS_INVALID_ADDRESS","The network address used in the request is invalid."),
+ 0xC023002A: ("STATUS_NDIS_PAUSED","The offload operation on the network interface has been paused."),
+ 0xC023002B: ("STATUS_NDIS_INTERFACE_NOT_FOUND","The network interface was not found."),
+ 0xC023002C: ("STATUS_NDIS_UNSUPPORTED_REVISION","The revision number specified in the structure is not supported."),
+ 0xC023002D: ("STATUS_NDIS_INVALID_PORT","The specified port does not exist on this network interface."),
+ 0xC023002E: ("STATUS_NDIS_INVALID_PORT_STATE","The current state of the specified port on this network interface does not support the requested operation."),
+ 0xC023002F: ("STATUS_NDIS_LOW_POWER_STATE","The miniport adapter is in a lower power state."),
+ 0xC02300BB: ("STATUS_NDIS_NOT_SUPPORTED","The network interface does not support this request."),
+ 0xC023100F: ("STATUS_NDIS_OFFLOAD_POLICY","The TCP connection is not offloadable because of a local policy setting."),
+ 0xC0231012: ("STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED","The TCP connection is not offloadable by the Chimney offload target."),
+ 0xC0231013: ("STATUS_NDIS_OFFLOAD_PATH_REJECTED","The IP Path object is not in an offloadable state."),
+ 0xC0232000: ("STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED","The wireless LAN interface is in auto-configuration mode and does not support the requested parameter change operation."),
+ 0xC0232001: ("STATUS_NDIS_DOT11_MEDIA_IN_USE","The wireless LAN interface is busy and cannot perform the requested operation."),
+ 0xC0232002: ("STATUS_NDIS_DOT11_POWER_STATE_INVALID","The wireless LAN interface is power down and does not support the requested operation."),
+ 0xC0232003: ("STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL","The list of wake on LAN patterns is full."),
+ 0xC0232004: ("STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL","The list of low power protocol offloads is full."),
+ 0xC0360001: ("STATUS_IPSEC_BAD_SPI","The SPI in the packet does not match a valid IPsec SA."),
+ 0xC0360002: ("STATUS_IPSEC_SA_LIFETIME_EXPIRED","The packet was received on an IPsec SA whose lifetime has expired."),
+ 0xC0360003: ("STATUS_IPSEC_WRONG_SA","The packet was received on an IPsec SA that does not match the packet characteristics."),
+ 0xC0360004: ("STATUS_IPSEC_REPLAY_CHECK_FAILED","The packet sequence number replay check failed."),
+ 0xC0360005: ("STATUS_IPSEC_INVALID_PACKET","The IPsec header and/or trailer in the packet is invalid."),
+ 0xC0360006: ("STATUS_IPSEC_INTEGRITY_CHECK_FAILED","The IPsec integrity check failed."),
+ 0xC0360007: ("STATUS_IPSEC_CLEAR_TEXT_DROP","IPsec dropped a clear text packet."),
+ 0xC0360008: ("STATUS_IPSEC_AUTH_FIREWALL_DROP","IPsec dropped an incoming ESP packet in authenticated firewall mode. This drop is benign."),
+ 0xC0360009: ("STATUS_IPSEC_THROTTLE_DROP","IPsec dropped a packet due to DOS throttle."),
+ 0xC0368000: ("STATUS_IPSEC_DOSP_BLOCK","IPsec Dos Protection matched an explicit block rule."),
+ 0xC0368001: ("STATUS_IPSEC_DOSP_RECEIVED_MULTICAST","IPsec Dos Protection received an IPsec specific multicast packet which is not allowed."),
+ 0xC0368002: ("STATUS_IPSEC_DOSP_INVALID_PACKET","IPsec Dos Protection received an incorrectly formatted packet."),
+ 0xC0368003: ("STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED","IPsec Dos Protection failed to lookup state."),
+ 0xC0368004: ("STATUS_IPSEC_DOSP_MAX_ENTRIES","IPsec Dos Protection failed to create state because there are already maximum number of entries allowed by policy."),
+ 0xC0368005: ("STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED","IPsec Dos Protection received an IPsec negotiation packet for a keying module which is not allowed by policy."),
+ 0xC0368006: ("STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES","IPsec Dos Protection failed to create per internal IP ratelimit queue because there is already maximum number of queues allowed by policy."),
+ 0xC038005B: ("STATUS_VOLMGR_MIRROR_NOT_SUPPORTED","The system does not support mirrored volumes."),
+ 0xC038005C: ("STATUS_VOLMGR_RAID5_NOT_SUPPORTED","The system does not support RAID-5 volumes."),
+ 0xC03A0014: ("STATUS_VIRTDISK_PROVIDER_NOT_FOUND","A virtual disk support provider for the specified file was not found."),
+ 0xC03A0015: ("STATUS_VIRTDISK_NOT_VIRTUAL_DISK","The specified disk is not a virtual disk."),
+ 0xC03A0016: ("STATUS_VHD_PARENT_VHD_ACCESS_DENIED","The chain of virtual hard disks is inaccessible. The process has not been granted access rights to the parent virtual hard disk for the differencing disk."),
+ 0xC03A0017: ("STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH","The chain of virtual hard disks is corrupted. There is a mismatch in the virtual sizes of the parent virtual hard disk and differencing disk."),
+ 0xC03A0018: ("STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED","The chain of virtual hard disks is corrupted. A differencing disk is indicated in its own parent chain."),
+ 0xC03A0019: ("STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT","The chain of virtual hard disks is inaccessible. There was an error opening a virtual hard disk further up the chain."),
+}
+
+# Error Codes
+
+STATUS_SUCCESS = 0x00000000
+STATUS_WAIT_1 = 0x00000001
+STATUS_WAIT_2 = 0x00000002
+STATUS_WAIT_3 = 0x00000003
+STATUS_WAIT_63 = 0x0000003F
+STATUS_ABANDONED = 0x00000080
+STATUS_ABANDONED_WAIT_0 = 0x00000080
+STATUS_ABANDONED_WAIT_63 = 0x000000BF
+STATUS_USER_APC = 0x000000C0
+STATUS_ALERTED = 0x00000101
+STATUS_TIMEOUT = 0x00000102
+STATUS_PENDING = 0x00000103
+STATUS_REPARSE = 0x00000104
+STATUS_MORE_ENTRIES = 0x00000105
+STATUS_NOT_ALL_ASSIGNED = 0x00000106
+STATUS_SOME_NOT_MAPPED = 0x00000107
+STATUS_OPLOCK_BREAK_IN_PROGRESS = 0x00000108
+STATUS_VOLUME_MOUNTED = 0x00000109
+STATUS_RXACT_COMMITTED = 0x0000010A
+STATUS_NOTIFY_CLEANUP = 0x0000010B
+STATUS_NOTIFY_ENUM_DIR = 0x0000010C
+STATUS_NO_QUOTAS_FOR_ACCOUNT = 0x0000010D
+STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED = 0x0000010E
+STATUS_PAGE_FAULT_TRANSITION = 0x00000110
+STATUS_PAGE_FAULT_DEMAND_ZERO = 0x00000111
+STATUS_PAGE_FAULT_COPY_ON_WRITE = 0x00000112
+STATUS_PAGE_FAULT_GUARD_PAGE = 0x00000113
+STATUS_PAGE_FAULT_PAGING_FILE = 0x00000114
+STATUS_CACHE_PAGE_LOCKED = 0x00000115
+STATUS_CRASH_DUMP = 0x00000116
+STATUS_BUFFER_ALL_ZEROS = 0x00000117
+STATUS_REPARSE_OBJECT = 0x00000118
+STATUS_RESOURCE_REQUIREMENTS_CHANGED = 0x00000119
+STATUS_TRANSLATION_COMPLETE = 0x00000120
+STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY = 0x00000121
+STATUS_NOTHING_TO_TERMINATE = 0x00000122
+STATUS_PROCESS_NOT_IN_JOB = 0x00000123
+STATUS_PROCESS_IN_JOB = 0x00000124
+STATUS_VOLSNAP_HIBERNATE_READY = 0x00000125
+STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY = 0x00000126
+STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED = 0x00000127
+STATUS_INTERRUPT_STILL_CONNECTED = 0x00000128
+STATUS_PROCESS_CLONED = 0x00000129
+STATUS_FILE_LOCKED_WITH_ONLY_READERS = 0x0000012A
+STATUS_FILE_LOCKED_WITH_WRITERS = 0x0000012B
+STATUS_RESOURCEMANAGER_READ_ONLY = 0x00000202
+STATUS_WAIT_FOR_OPLOCK = 0x00000367
+DBG_EXCEPTION_HANDLED = 0x00010001
+DBG_CONTINUE = 0x00010002
+STATUS_FLT_IO_COMPLETE = 0x001C0001
+STATUS_FILE_NOT_AVAILABLE = 0xC0000467
+STATUS_CALLBACK_RETURNED_THREAD_AFFINITY = 0xC0000721
+STATUS_OBJECT_NAME_EXISTS = 0x40000000
+STATUS_THREAD_WAS_SUSPENDED = 0x40000001
+STATUS_WORKING_SET_LIMIT_RANGE = 0x40000002
+STATUS_IMAGE_NOT_AT_BASE = 0x40000003
+STATUS_RXACT_STATE_CREATED = 0x40000004
+STATUS_SEGMENT_NOTIFICATION = 0x40000005
+STATUS_LOCAL_USER_SESSION_KEY = 0x40000006
+STATUS_BAD_CURRENT_DIRECTORY = 0x40000007
+STATUS_SERIAL_MORE_WRITES = 0x40000008
+STATUS_REGISTRY_RECOVERED = 0x40000009
+STATUS_FT_READ_RECOVERY_FROM_BACKUP = 0x4000000A
+STATUS_FT_WRITE_RECOVERY = 0x4000000B
+STATUS_SERIAL_COUNTER_TIMEOUT = 0x4000000C
+STATUS_NULL_LM_PASSWORD = 0x4000000D
+STATUS_IMAGE_MACHINE_TYPE_MISMATCH = 0x4000000E
+STATUS_RECEIVE_PARTIAL = 0x4000000F
+STATUS_RECEIVE_EXPEDITED = 0x40000010
+STATUS_RECEIVE_PARTIAL_EXPEDITED = 0x40000011
+STATUS_EVENT_DONE = 0x40000012
+STATUS_EVENT_PENDING = 0x40000013
+STATUS_CHECKING_FILE_SYSTEM = 0x40000014
+STATUS_FATAL_APP_EXIT = 0x40000015
+STATUS_PREDEFINED_HANDLE = 0x40000016
+STATUS_WAS_UNLOCKED = 0x40000017
+STATUS_SERVICE_NOTIFICATION = 0x40000018
+STATUS_WAS_LOCKED = 0x40000019
+STATUS_LOG_HARD_ERROR = 0x4000001A
+STATUS_ALREADY_WIN32 = 0x4000001B
+STATUS_WX86_UNSIMULATE = 0x4000001C
+STATUS_WX86_CONTINUE = 0x4000001D
+STATUS_WX86_SINGLE_STEP = 0x4000001E
+STATUS_WX86_BREAKPOINT = 0x4000001F
+STATUS_WX86_EXCEPTION_CONTINUE = 0x40000020
+STATUS_WX86_EXCEPTION_LASTCHANCE = 0x40000021
+STATUS_WX86_EXCEPTION_CHAIN = 0x40000022
+STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE = 0x40000023
+STATUS_NO_YIELD_PERFORMED = 0x40000024
+STATUS_TIMER_RESUME_IGNORED = 0x40000025
+STATUS_ARBITRATION_UNHANDLED = 0x40000026
+STATUS_CARDBUS_NOT_SUPPORTED = 0x40000027
+STATUS_WX86_CREATEWX86TIB = 0x40000028
+STATUS_MP_PROCESSOR_MISMATCH = 0x40000029
+STATUS_HIBERNATED = 0x4000002A
+STATUS_RESUME_HIBERNATION = 0x4000002B
+STATUS_FIRMWARE_UPDATED = 0x4000002C
+STATUS_DRIVERS_LEAKING_LOCKED_PAGES = 0x4000002D
+STATUS_MESSAGE_RETRIEVED = 0x4000002E
+STATUS_SYSTEM_POWERSTATE_TRANSITION = 0x4000002F
+STATUS_ALPC_CHECK_COMPLETION_LIST = 0x40000030
+STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION = 0x40000031
+STATUS_ACCESS_AUDIT_BY_POLICY = 0x40000032
+STATUS_ABANDON_HIBERFILE = 0x40000033
+STATUS_BIZRULES_NOT_ENABLED = 0x40000034
+STATUS_WAKE_SYSTEM = 0x40000294
+STATUS_DS_SHUTTING_DOWN = 0x40000370
+DBG_REPLY_LATER = 0x40010001
+DBG_UNABLE_TO_PROVIDE_HANDLE = 0x40010002
+DBG_TERMINATE_THREAD = 0x40010003
+DBG_TERMINATE_PROCESS = 0x40010004
+DBG_CONTROL_C = 0x40010005
+DBG_PRINTEXCEPTION_C = 0x40010006
+DBG_RIPEXCEPTION = 0x40010007
+DBG_CONTROL_BREAK = 0x40010008
+DBG_COMMAND_EXCEPTION = 0x40010009
+RPC_NT_UUID_LOCAL_ONLY = 0x40020056
+RPC_NT_SEND_INCOMPLETE = 0x400200AF
+STATUS_CTX_CDM_CONNECT = 0x400A0004
+STATUS_CTX_CDM_DISCONNECT = 0x400A0005
+STATUS_SXS_RELEASE_ACTIVATION_CONTEXT = 0x4015000D
+STATUS_RECOVERY_NOT_NEEDED = 0x40190034
+STATUS_RM_ALREADY_STARTED = 0x40190035
+STATUS_LOG_NO_RESTART = 0x401A000C
+STATUS_VIDEO_DRIVER_DEBUG_REPORT_REQUEST = 0x401B00EC
+STATUS_GRAPHICS_PARTIAL_DATA_POPULATED = 0x401E000A
+STATUS_GRAPHICS_DRIVER_MISMATCH = 0x401E0117
+STATUS_GRAPHICS_MODE_NOT_PINNED = 0x401E0307
+STATUS_GRAPHICS_NO_PREFERRED_MODE = 0x401E031E
+STATUS_GRAPHICS_DATASET_IS_EMPTY = 0x401E034B
+STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET = 0x401E034C
+STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PINNED = 0x401E0351
+STATUS_GRAPHICS_UNKNOWN_CHILD_STATUS = 0x401E042F
+STATUS_GRAPHICS_LEADLINK_START_DEFERRED = 0x401E0437
+STATUS_GRAPHICS_POLLING_TOO_FREQUENTLY = 0x401E0439
+STATUS_GRAPHICS_START_DEFERRED = 0x401E043A
+STATUS_NDIS_INDICATION_REQUIRED = 0x40230001
+STATUS_GUARD_PAGE_VIOLATION = 0x80000001
+STATUS_DATATYPE_MISALIGNMENT = 0x80000002
+STATUS_BREAKPOINT = 0x80000003
+STATUS_SINGLE_STEP = 0x80000004
+STATUS_BUFFER_OVERFLOW = 0x80000005
+STATUS_NO_MORE_FILES = 0x80000006
+STATUS_WAKE_SYSTEM_DEBUGGER = 0x80000007
+STATUS_HANDLES_CLOSED = 0x8000000A
+STATUS_NO_INHERITANCE = 0x8000000B
+STATUS_GUID_SUBSTITUTION_MADE = 0x8000000C
+STATUS_PARTIAL_COPY = 0x8000000D
+STATUS_DEVICE_PAPER_EMPTY = 0x8000000E
+STATUS_DEVICE_POWERED_OFF = 0x8000000F
+STATUS_DEVICE_OFF_LINE = 0x80000010
+STATUS_DEVICE_BUSY = 0x80000011
+STATUS_NO_MORE_EAS = 0x80000012
+STATUS_INVALID_EA_NAME = 0x80000013
+STATUS_EA_LIST_INCONSISTENT = 0x80000014
+STATUS_INVALID_EA_FLAG = 0x80000015
+STATUS_VERIFY_REQUIRED = 0x80000016
+STATUS_EXTRANEOUS_INFORMATION = 0x80000017
+STATUS_RXACT_COMMIT_NECESSARY = 0x80000018
+STATUS_NO_MORE_ENTRIES = 0x8000001A
+STATUS_FILEMARK_DETECTED = 0x8000001B
+STATUS_MEDIA_CHANGED = 0x8000001C
+STATUS_BUS_RESET = 0x8000001D
+STATUS_END_OF_MEDIA = 0x8000001E
+STATUS_BEGINNING_OF_MEDIA = 0x8000001F
+STATUS_MEDIA_CHECK = 0x80000020
+STATUS_SETMARK_DETECTED = 0x80000021
+STATUS_NO_DATA_DETECTED = 0x80000022
+STATUS_REDIRECTOR_HAS_OPEN_HANDLES = 0x80000023
+STATUS_SERVER_HAS_OPEN_HANDLES = 0x80000024
+STATUS_ALREADY_DISCONNECTED = 0x80000025
+STATUS_LONGJUMP = 0x80000026
+STATUS_CLEANER_CARTRIDGE_INSTALLED = 0x80000027
+STATUS_PLUGPLAY_QUERY_VETOED = 0x80000028
+STATUS_UNWIND_CONSOLIDATE = 0x80000029
+STATUS_REGISTRY_HIVE_RECOVERED = 0x8000002A
+STATUS_DLL_MIGHT_BE_INSECURE = 0x8000002B
+STATUS_DLL_MIGHT_BE_INCOMPATIBLE = 0x8000002C
+STATUS_STOPPED_ON_SYMLINK = 0x8000002D
+STATUS_DEVICE_REQUIRES_CLEANING = 0x80000288
+STATUS_DEVICE_DOOR_OPEN = 0x80000289
+STATUS_DATA_LOST_REPAIR = 0x80000803
+DBG_EXCEPTION_NOT_HANDLED = 0x80010001
+STATUS_CLUSTER_NODE_ALREADY_UP = 0x80130001
+STATUS_CLUSTER_NODE_ALREADY_DOWN = 0x80130002
+STATUS_CLUSTER_NETWORK_ALREADY_ONLINE = 0x80130003
+STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE = 0x80130004
+STATUS_CLUSTER_NODE_ALREADY_MEMBER = 0x80130005
+STATUS_COULD_NOT_RESIZE_LOG = 0x80190009
+STATUS_NO_TXF_METADATA = 0x80190029
+STATUS_CANT_RECOVER_WITH_HANDLE_OPEN = 0x80190031
+STATUS_TXF_METADATA_ALREADY_PRESENT = 0x80190041
+STATUS_TRANSACTION_SCOPE_CALLBACKS_NOT_SET = 0x80190042
+STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD_RECOVERED = 0x801B00EB
+STATUS_FLT_BUFFER_TOO_SMALL = 0x801C0001
+STATUS_FVE_PARTIAL_METADATA = 0x80210001
+STATUS_FVE_TRANSIENT_STATE = 0x80210002
+STATUS_UNSUCCESSFUL = 0xC0000001
+STATUS_NOT_IMPLEMENTED = 0xC0000002
+STATUS_INVALID_INFO_CLASS = 0xC0000003
+STATUS_INFO_LENGTH_MISMATCH = 0xC0000004
+STATUS_ACCESS_VIOLATION = 0xC0000005
+STATUS_IN_PAGE_ERROR = 0xC0000006
+STATUS_PAGEFILE_QUOTA = 0xC0000007
+STATUS_INVALID_HANDLE = 0xC0000008
+STATUS_BAD_INITIAL_STACK = 0xC0000009
+STATUS_BAD_INITIAL_PC = 0xC000000A
+STATUS_INVALID_CID = 0xC000000B
+STATUS_TIMER_NOT_CANCELED = 0xC000000C
+STATUS_INVALID_PARAMETER = 0xC000000D
+STATUS_NO_SUCH_DEVICE = 0xC000000E
+STATUS_NO_SUCH_FILE = 0xC000000F
+STATUS_INVALID_DEVICE_REQUEST = 0xC0000010
+STATUS_END_OF_FILE = 0xC0000011
+STATUS_WRONG_VOLUME = 0xC0000012
+STATUS_NO_MEDIA_IN_DEVICE = 0xC0000013
+STATUS_UNRECOGNIZED_MEDIA = 0xC0000014
+STATUS_NONEXISTENT_SECTOR = 0xC0000015
+STATUS_MORE_PROCESSING_REQUIRED = 0xC0000016
+STATUS_NO_MEMORY = 0xC0000017
+STATUS_CONFLICTING_ADDRESSES = 0xC0000018
+STATUS_NOT_MAPPED_VIEW = 0xC0000019
+STATUS_UNABLE_TO_FREE_VM = 0xC000001A
+STATUS_UNABLE_TO_DELETE_SECTION = 0xC000001B
+STATUS_INVALID_SYSTEM_SERVICE = 0xC000001C
+STATUS_ILLEGAL_INSTRUCTION = 0xC000001D
+STATUS_INVALID_LOCK_SEQUENCE = 0xC000001E
+STATUS_INVALID_VIEW_SIZE = 0xC000001F
+STATUS_INVALID_FILE_FOR_SECTION = 0xC0000020
+STATUS_ALREADY_COMMITTED = 0xC0000021
+STATUS_ACCESS_DENIED = 0xC0000022
+STATUS_BUFFER_TOO_SMALL = 0xC0000023
+STATUS_OBJECT_TYPE_MISMATCH = 0xC0000024
+STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025
+STATUS_INVALID_DISPOSITION = 0xC0000026
+STATUS_UNWIND = 0xC0000027
+STATUS_BAD_STACK = 0xC0000028
+STATUS_INVALID_UNWIND_TARGET = 0xC0000029
+STATUS_NOT_LOCKED = 0xC000002A
+STATUS_PARITY_ERROR = 0xC000002B
+STATUS_UNABLE_TO_DECOMMIT_VM = 0xC000002C
+STATUS_NOT_COMMITTED = 0xC000002D
+STATUS_INVALID_PORT_ATTRIBUTES = 0xC000002E
+STATUS_PORT_MESSAGE_TOO_LONG = 0xC000002F
+STATUS_INVALID_PARAMETER_MIX = 0xC0000030
+STATUS_INVALID_QUOTA_LOWER = 0xC0000031
+STATUS_DISK_CORRUPT_ERROR = 0xC0000032
+STATUS_OBJECT_NAME_INVALID = 0xC0000033
+STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034
+STATUS_OBJECT_NAME_COLLISION = 0xC0000035
+STATUS_PORT_DISCONNECTED = 0xC0000037
+STATUS_DEVICE_ALREADY_ATTACHED = 0xC0000038
+STATUS_OBJECT_PATH_INVALID = 0xC0000039
+STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A
+STATUS_OBJECT_PATH_SYNTAX_BAD = 0xC000003B
+STATUS_DATA_OVERRUN = 0xC000003C
+STATUS_DATA_LATE_ERROR = 0xC000003D
+STATUS_DATA_ERROR = 0xC000003E
+STATUS_CRC_ERROR = 0xC000003F
+STATUS_SECTION_TOO_BIG = 0xC0000040
+STATUS_PORT_CONNECTION_REFUSED = 0xC0000041
+STATUS_INVALID_PORT_HANDLE = 0xC0000042
+STATUS_SHARING_VIOLATION = 0xC0000043
+STATUS_QUOTA_EXCEEDED = 0xC0000044
+STATUS_INVALID_PAGE_PROTECTION = 0xC0000045
+STATUS_MUTANT_NOT_OWNED = 0xC0000046
+STATUS_SEMAPHORE_LIMIT_EXCEEDED = 0xC0000047
+STATUS_PORT_ALREADY_SET = 0xC0000048
+STATUS_SECTION_NOT_IMAGE = 0xC0000049
+STATUS_SUSPEND_COUNT_EXCEEDED = 0xC000004A
+STATUS_THREAD_IS_TERMINATING = 0xC000004B
+STATUS_BAD_WORKING_SET_LIMIT = 0xC000004C
+STATUS_INCOMPATIBLE_FILE_MAP = 0xC000004D
+STATUS_SECTION_PROTECTION = 0xC000004E
+STATUS_EAS_NOT_SUPPORTED = 0xC000004F
+STATUS_EA_TOO_LARGE = 0xC0000050
+STATUS_NONEXISTENT_EA_ENTRY = 0xC0000051
+STATUS_NO_EAS_ON_FILE = 0xC0000052
+STATUS_EA_CORRUPT_ERROR = 0xC0000053
+STATUS_FILE_LOCK_CONFLICT = 0xC0000054
+STATUS_LOCK_NOT_GRANTED = 0xC0000055
+STATUS_DELETE_PENDING = 0xC0000056
+STATUS_CTL_FILE_NOT_SUPPORTED = 0xC0000057
+STATUS_UNKNOWN_REVISION = 0xC0000058
+STATUS_REVISION_MISMATCH = 0xC0000059
+STATUS_INVALID_OWNER = 0xC000005A
+STATUS_INVALID_PRIMARY_GROUP = 0xC000005B
+STATUS_NO_IMPERSONATION_TOKEN = 0xC000005C
+STATUS_CANT_DISABLE_MANDATORY = 0xC000005D
+STATUS_NO_LOGON_SERVERS = 0xC000005E
+STATUS_NO_SUCH_LOGON_SESSION = 0xC000005F
+STATUS_NO_SUCH_PRIVILEGE = 0xC0000060
+STATUS_PRIVILEGE_NOT_HELD = 0xC0000061
+STATUS_INVALID_ACCOUNT_NAME = 0xC0000062
+STATUS_USER_EXISTS = 0xC0000063
+STATUS_NO_SUCH_USER = 0xC0000064
+STATUS_GROUP_EXISTS = 0xC0000065
+STATUS_NO_SUCH_GROUP = 0xC0000066
+STATUS_MEMBER_IN_GROUP = 0xC0000067
+STATUS_MEMBER_NOT_IN_GROUP = 0xC0000068
+STATUS_LAST_ADMIN = 0xC0000069
+STATUS_WRONG_PASSWORD = 0xC000006A
+STATUS_ILL_FORMED_PASSWORD = 0xC000006B
+STATUS_PASSWORD_RESTRICTION = 0xC000006C
+STATUS_LOGON_FAILURE = 0xC000006D
+STATUS_ACCOUNT_RESTRICTION = 0xC000006E
+STATUS_INVALID_LOGON_HOURS = 0xC000006F
+STATUS_INVALID_WORKSTATION = 0xC0000070
+STATUS_PASSWORD_EXPIRED = 0xC0000071
+STATUS_ACCOUNT_DISABLED = 0xC0000072
+STATUS_NONE_MAPPED = 0xC0000073
+STATUS_TOO_MANY_LUIDS_REQUESTED = 0xC0000074
+STATUS_LUIDS_EXHAUSTED = 0xC0000075
+STATUS_INVALID_SUB_AUTHORITY = 0xC0000076
+STATUS_INVALID_ACL = 0xC0000077
+STATUS_INVALID_SID = 0xC0000078
+STATUS_INVALID_SECURITY_DESCR = 0xC0000079
+STATUS_PROCEDURE_NOT_FOUND = 0xC000007A
+STATUS_INVALID_IMAGE_FORMAT = 0xC000007B
+STATUS_NO_TOKEN = 0xC000007C
+STATUS_BAD_INHERITANCE_ACL = 0xC000007D
+STATUS_RANGE_NOT_LOCKED = 0xC000007E
+STATUS_DISK_FULL = 0xC000007F
+STATUS_SERVER_DISABLED = 0xC0000080
+STATUS_SERVER_NOT_DISABLED = 0xC0000081
+STATUS_TOO_MANY_GUIDS_REQUESTED = 0xC0000082
+STATUS_GUIDS_EXHAUSTED = 0xC0000083
+STATUS_INVALID_ID_AUTHORITY = 0xC0000084
+STATUS_AGENTS_EXHAUSTED = 0xC0000085
+STATUS_INVALID_VOLUME_LABEL = 0xC0000086
+STATUS_SECTION_NOT_EXTENDED = 0xC0000087
+STATUS_NOT_MAPPED_DATA = 0xC0000088
+STATUS_RESOURCE_DATA_NOT_FOUND = 0xC0000089
+STATUS_RESOURCE_TYPE_NOT_FOUND = 0xC000008A
+STATUS_RESOURCE_NAME_NOT_FOUND = 0xC000008B
+STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C
+STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D
+STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E
+STATUS_FLOAT_INEXACT_RESULT = 0xC000008F
+STATUS_FLOAT_INVALID_OPERATION = 0xC0000090
+STATUS_FLOAT_OVERFLOW = 0xC0000091
+STATUS_FLOAT_STACK_CHECK = 0xC0000092
+STATUS_FLOAT_UNDERFLOW = 0xC0000093
+STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094
+STATUS_INTEGER_OVERFLOW = 0xC0000095
+STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096
+STATUS_TOO_MANY_PAGING_FILES = 0xC0000097
+STATUS_FILE_INVALID = 0xC0000098
+STATUS_ALLOTTED_SPACE_EXCEEDED = 0xC0000099
+STATUS_INSUFFICIENT_RESOURCES = 0xC000009A
+STATUS_DFS_EXIT_PATH_FOUND = 0xC000009B
+STATUS_DEVICE_DATA_ERROR = 0xC000009C
+STATUS_DEVICE_NOT_CONNECTED = 0xC000009D
+STATUS_FREE_VM_NOT_AT_BASE = 0xC000009F
+STATUS_MEMORY_NOT_ALLOCATED = 0xC00000A0
+STATUS_WORKING_SET_QUOTA = 0xC00000A1
+STATUS_MEDIA_WRITE_PROTECTED = 0xC00000A2
+STATUS_DEVICE_NOT_READY = 0xC00000A3
+STATUS_INVALID_GROUP_ATTRIBUTES = 0xC00000A4
+STATUS_BAD_IMPERSONATION_LEVEL = 0xC00000A5
+STATUS_CANT_OPEN_ANONYMOUS = 0xC00000A6
+STATUS_BAD_VALIDATION_CLASS = 0xC00000A7
+STATUS_BAD_TOKEN_TYPE = 0xC00000A8
+STATUS_BAD_MASTER_BOOT_RECORD = 0xC00000A9
+STATUS_INSTRUCTION_MISALIGNMENT = 0xC00000AA
+STATUS_INSTANCE_NOT_AVAILABLE = 0xC00000AB
+STATUS_PIPE_NOT_AVAILABLE = 0xC00000AC
+STATUS_INVALID_PIPE_STATE = 0xC00000AD
+STATUS_PIPE_BUSY = 0xC00000AE
+STATUS_ILLEGAL_FUNCTION = 0xC00000AF
+STATUS_PIPE_DISCONNECTED = 0xC00000B0
+STATUS_PIPE_CLOSING = 0xC00000B1
+STATUS_PIPE_CONNECTED = 0xC00000B2
+STATUS_PIPE_LISTENING = 0xC00000B3
+STATUS_INVALID_READ_MODE = 0xC00000B4
+STATUS_IO_TIMEOUT = 0xC00000B5
+STATUS_FILE_FORCED_CLOSED = 0xC00000B6
+STATUS_PROFILING_NOT_STARTED = 0xC00000B7
+STATUS_PROFILING_NOT_STOPPED = 0xC00000B8
+STATUS_COULD_NOT_INTERPRET = 0xC00000B9
+STATUS_FILE_IS_A_DIRECTORY = 0xC00000BA
+STATUS_NOT_SUPPORTED = 0xC00000BB
+STATUS_REMOTE_NOT_LISTENING = 0xC00000BC
+STATUS_DUPLICATE_NAME = 0xC00000BD
+STATUS_BAD_NETWORK_PATH = 0xC00000BE
+STATUS_NETWORK_BUSY = 0xC00000BF
+STATUS_DEVICE_DOES_NOT_EXIST = 0xC00000C0
+STATUS_TOO_MANY_COMMANDS = 0xC00000C1
+STATUS_ADAPTER_HARDWARE_ERROR = 0xC00000C2
+STATUS_INVALID_NETWORK_RESPONSE = 0xC00000C3
+STATUS_UNEXPECTED_NETWORK_ERROR = 0xC00000C4
+STATUS_BAD_REMOTE_ADAPTER = 0xC00000C5
+STATUS_PRINT_QUEUE_FULL = 0xC00000C6
+STATUS_NO_SPOOL_SPACE = 0xC00000C7
+STATUS_PRINT_CANCELLED = 0xC00000C8
+STATUS_NETWORK_NAME_DELETED = 0xC00000C9
+STATUS_NETWORK_ACCESS_DENIED = 0xC00000CA
+STATUS_BAD_DEVICE_TYPE = 0xC00000CB
+STATUS_BAD_NETWORK_NAME = 0xC00000CC
+STATUS_TOO_MANY_NAMES = 0xC00000CD
+STATUS_TOO_MANY_SESSIONS = 0xC00000CE
+STATUS_SHARING_PAUSED = 0xC00000CF
+STATUS_REQUEST_NOT_ACCEPTED = 0xC00000D0
+STATUS_REDIRECTOR_PAUSED = 0xC00000D1
+STATUS_NET_WRITE_FAULT = 0xC00000D2
+STATUS_PROFILING_AT_LIMIT = 0xC00000D3
+STATUS_NOT_SAME_DEVICE = 0xC00000D4
+STATUS_FILE_RENAMED = 0xC00000D5
+STATUS_VIRTUAL_CIRCUIT_CLOSED = 0xC00000D6
+STATUS_NO_SECURITY_ON_OBJECT = 0xC00000D7
+STATUS_CANT_WAIT = 0xC00000D8
+STATUS_PIPE_EMPTY = 0xC00000D9
+STATUS_CANT_ACCESS_DOMAIN_INFO = 0xC00000DA
+STATUS_CANT_TERMINATE_SELF = 0xC00000DB
+STATUS_INVALID_SERVER_STATE = 0xC00000DC
+STATUS_INVALID_DOMAIN_STATE = 0xC00000DD
+STATUS_INVALID_DOMAIN_ROLE = 0xC00000DE
+STATUS_NO_SUCH_DOMAIN = 0xC00000DF
+STATUS_DOMAIN_EXISTS = 0xC00000E0
+STATUS_DOMAIN_LIMIT_EXCEEDED = 0xC00000E1
+STATUS_OPLOCK_NOT_GRANTED = 0xC00000E2
+STATUS_INVALID_OPLOCK_PROTOCOL = 0xC00000E3
+STATUS_INTERNAL_DB_CORRUPTION = 0xC00000E4
+STATUS_INTERNAL_ERROR = 0xC00000E5
+STATUS_GENERIC_NOT_MAPPED = 0xC00000E6
+STATUS_BAD_DESCRIPTOR_FORMAT = 0xC00000E7
+STATUS_INVALID_USER_BUFFER = 0xC00000E8
+STATUS_UNEXPECTED_IO_ERROR = 0xC00000E9
+STATUS_UNEXPECTED_MM_CREATE_ERR = 0xC00000EA
+STATUS_UNEXPECTED_MM_MAP_ERROR = 0xC00000EB
+STATUS_UNEXPECTED_MM_EXTEND_ERR = 0xC00000EC
+STATUS_NOT_LOGON_PROCESS = 0xC00000ED
+STATUS_LOGON_SESSION_EXISTS = 0xC00000EE
+STATUS_INVALID_PARAMETER_1 = 0xC00000EF
+STATUS_INVALID_PARAMETER_2 = 0xC00000F0
+STATUS_INVALID_PARAMETER_3 = 0xC00000F1
+STATUS_INVALID_PARAMETER_4 = 0xC00000F2
+STATUS_INVALID_PARAMETER_5 = 0xC00000F3
+STATUS_INVALID_PARAMETER_6 = 0xC00000F4
+STATUS_INVALID_PARAMETER_7 = 0xC00000F5
+STATUS_INVALID_PARAMETER_8 = 0xC00000F6
+STATUS_INVALID_PARAMETER_9 = 0xC00000F7
+STATUS_INVALID_PARAMETER_10 = 0xC00000F8
+STATUS_INVALID_PARAMETER_11 = 0xC00000F9
+STATUS_INVALID_PARAMETER_12 = 0xC00000FA
+STATUS_REDIRECTOR_NOT_STARTED = 0xC00000FB
+STATUS_REDIRECTOR_STARTED = 0xC00000FC
+STATUS_STACK_OVERFLOW = 0xC00000FD
+STATUS_NO_SUCH_PACKAGE = 0xC00000FE
+STATUS_BAD_FUNCTION_TABLE = 0xC00000FF
+STATUS_VARIABLE_NOT_FOUND = 0xC0000100
+STATUS_DIRECTORY_NOT_EMPTY = 0xC0000101
+STATUS_FILE_CORRUPT_ERROR = 0xC0000102
+STATUS_NOT_A_DIRECTORY = 0xC0000103
+STATUS_BAD_LOGON_SESSION_STATE = 0xC0000104
+STATUS_LOGON_SESSION_COLLISION = 0xC0000105
+STATUS_NAME_TOO_LONG = 0xC0000106
+STATUS_FILES_OPEN = 0xC0000107
+STATUS_CONNECTION_IN_USE = 0xC0000108
+STATUS_MESSAGE_NOT_FOUND = 0xC0000109
+STATUS_PROCESS_IS_TERMINATING = 0xC000010A
+STATUS_INVALID_LOGON_TYPE = 0xC000010B
+STATUS_NO_GUID_TRANSLATION = 0xC000010C
+STATUS_CANNOT_IMPERSONATE = 0xC000010D
+STATUS_IMAGE_ALREADY_LOADED = 0xC000010E
+STATUS_NO_LDT = 0xC0000117
+STATUS_INVALID_LDT_SIZE = 0xC0000118
+STATUS_INVALID_LDT_OFFSET = 0xC0000119
+STATUS_INVALID_LDT_DESCRIPTOR = 0xC000011A
+STATUS_INVALID_IMAGE_NE_FORMAT = 0xC000011B
+STATUS_RXACT_INVALID_STATE = 0xC000011C
+STATUS_RXACT_COMMIT_FAILURE = 0xC000011D
+STATUS_MAPPED_FILE_SIZE_ZERO = 0xC000011E
+STATUS_TOO_MANY_OPENED_FILES = 0xC000011F
+STATUS_CANCELLED = 0xC0000120
+STATUS_CANNOT_DELETE = 0xC0000121
+STATUS_INVALID_COMPUTER_NAME = 0xC0000122
+STATUS_FILE_DELETED = 0xC0000123
+STATUS_SPECIAL_ACCOUNT = 0xC0000124
+STATUS_SPECIAL_GROUP = 0xC0000125
+STATUS_SPECIAL_USER = 0xC0000126
+STATUS_MEMBERS_PRIMARY_GROUP = 0xC0000127
+STATUS_FILE_CLOSED = 0xC0000128
+STATUS_TOO_MANY_THREADS = 0xC0000129
+STATUS_THREAD_NOT_IN_PROCESS = 0xC000012A
+STATUS_TOKEN_ALREADY_IN_USE = 0xC000012B
+STATUS_PAGEFILE_QUOTA_EXCEEDED = 0xC000012C
+STATUS_COMMITMENT_LIMIT = 0xC000012D
+STATUS_INVALID_IMAGE_LE_FORMAT = 0xC000012E
+STATUS_INVALID_IMAGE_NOT_MZ = 0xC000012F
+STATUS_INVALID_IMAGE_PROTECT = 0xC0000130
+STATUS_INVALID_IMAGE_WIN_16 = 0xC0000131
+STATUS_LOGON_SERVER_CONFLICT = 0xC0000132
+STATUS_TIME_DIFFERENCE_AT_DC = 0xC0000133
+STATUS_SYNCHRONIZATION_REQUIRED = 0xC0000134
+STATUS_DLL_NOT_FOUND = 0xC0000135
+STATUS_OPEN_FAILED = 0xC0000136
+STATUS_IO_PRIVILEGE_FAILED = 0xC0000137
+STATUS_ORDINAL_NOT_FOUND = 0xC0000138
+STATUS_ENTRYPOINT_NOT_FOUND = 0xC0000139
+STATUS_CONTROL_C_EXIT = 0xC000013A
+STATUS_LOCAL_DISCONNECT = 0xC000013B
+STATUS_REMOTE_DISCONNECT = 0xC000013C
+STATUS_REMOTE_RESOURCES = 0xC000013D
+STATUS_LINK_FAILED = 0xC000013E
+STATUS_LINK_TIMEOUT = 0xC000013F
+STATUS_INVALID_CONNECTION = 0xC0000140
+STATUS_INVALID_ADDRESS = 0xC0000141
+STATUS_DLL_INIT_FAILED = 0xC0000142
+STATUS_MISSING_SYSTEMFILE = 0xC0000143
+STATUS_UNHANDLED_EXCEPTION = 0xC0000144
+STATUS_APP_INIT_FAILURE = 0xC0000145
+STATUS_PAGEFILE_CREATE_FAILED = 0xC0000146
+STATUS_NO_PAGEFILE = 0xC0000147
+STATUS_INVALID_LEVEL = 0xC0000148
+STATUS_WRONG_PASSWORD_CORE = 0xC0000149
+STATUS_ILLEGAL_FLOAT_CONTEXT = 0xC000014A
+STATUS_PIPE_BROKEN = 0xC000014B
+STATUS_REGISTRY_CORRUPT = 0xC000014C
+STATUS_REGISTRY_IO_FAILED = 0xC000014D
+STATUS_NO_EVENT_PAIR = 0xC000014E
+STATUS_UNRECOGNIZED_VOLUME = 0xC000014F
+STATUS_SERIAL_NO_DEVICE_INITED = 0xC0000150
+STATUS_NO_SUCH_ALIAS = 0xC0000151
+STATUS_MEMBER_NOT_IN_ALIAS = 0xC0000152
+STATUS_MEMBER_IN_ALIAS = 0xC0000153
+STATUS_ALIAS_EXISTS = 0xC0000154
+STATUS_LOGON_NOT_GRANTED = 0xC0000155
+STATUS_TOO_MANY_SECRETS = 0xC0000156
+STATUS_SECRET_TOO_LONG = 0xC0000157
+STATUS_INTERNAL_DB_ERROR = 0xC0000158
+STATUS_FULLSCREEN_MODE = 0xC0000159
+STATUS_TOO_MANY_CONTEXT_IDS = 0xC000015A
+STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B
+STATUS_NOT_REGISTRY_FILE = 0xC000015C
+STATUS_NT_CROSS_ENCRYPTION_REQUIRED = 0xC000015D
+STATUS_DOMAIN_CTRLR_CONFIG_ERROR = 0xC000015E
+STATUS_FT_MISSING_MEMBER = 0xC000015F
+STATUS_ILL_FORMED_SERVICE_ENTRY = 0xC0000160
+STATUS_ILLEGAL_CHARACTER = 0xC0000161
+STATUS_UNMAPPABLE_CHARACTER = 0xC0000162
+STATUS_UNDEFINED_CHARACTER = 0xC0000163
+STATUS_FLOPPY_VOLUME = 0xC0000164
+STATUS_FLOPPY_ID_MARK_NOT_FOUND = 0xC0000165
+STATUS_FLOPPY_WRONG_CYLINDER = 0xC0000166
+STATUS_FLOPPY_UNKNOWN_ERROR = 0xC0000167
+STATUS_FLOPPY_BAD_REGISTERS = 0xC0000168
+STATUS_DISK_RECALIBRATE_FAILED = 0xC0000169
+STATUS_DISK_OPERATION_FAILED = 0xC000016A
+STATUS_DISK_RESET_FAILED = 0xC000016B
+STATUS_SHARED_IRQ_BUSY = 0xC000016C
+STATUS_FT_ORPHANING = 0xC000016D
+STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT = 0xC000016E
+STATUS_PARTITION_FAILURE = 0xC0000172
+STATUS_INVALID_BLOCK_LENGTH = 0xC0000173
+STATUS_DEVICE_NOT_PARTITIONED = 0xC0000174
+STATUS_UNABLE_TO_LOCK_MEDIA = 0xC0000175
+STATUS_UNABLE_TO_UNLOAD_MEDIA = 0xC0000176
+STATUS_EOM_OVERFLOW = 0xC0000177
+STATUS_NO_MEDIA = 0xC0000178
+STATUS_NO_SUCH_MEMBER = 0xC000017A
+STATUS_INVALID_MEMBER = 0xC000017B
+STATUS_KEY_DELETED = 0xC000017C
+STATUS_NO_LOG_SPACE = 0xC000017D
+STATUS_TOO_MANY_SIDS = 0xC000017E
+STATUS_LM_CROSS_ENCRYPTION_REQUIRED = 0xC000017F
+STATUS_KEY_HAS_CHILDREN = 0xC0000180
+STATUS_CHILD_MUST_BE_VOLATILE = 0xC0000181
+STATUS_DEVICE_CONFIGURATION_ERROR = 0xC0000182
+STATUS_DRIVER_INTERNAL_ERROR = 0xC0000183
+STATUS_INVALID_DEVICE_STATE = 0xC0000184
+STATUS_IO_DEVICE_ERROR = 0xC0000185
+STATUS_DEVICE_PROTOCOL_ERROR = 0xC0000186
+STATUS_BACKUP_CONTROLLER = 0xC0000187
+STATUS_LOG_FILE_FULL = 0xC0000188
+STATUS_TOO_LATE = 0xC0000189
+STATUS_NO_TRUST_LSA_SECRET = 0xC000018A
+STATUS_NO_TRUST_SAM_ACCOUNT = 0xC000018B
+STATUS_TRUSTED_DOMAIN_FAILURE = 0xC000018C
+STATUS_TRUSTED_RELATIONSHIP_FAILURE = 0xC000018D
+STATUS_EVENTLOG_FILE_CORRUPT = 0xC000018E
+STATUS_EVENTLOG_CANT_START = 0xC000018F
+STATUS_TRUST_FAILURE = 0xC0000190
+STATUS_MUTANT_LIMIT_EXCEEDED = 0xC0000191
+STATUS_NETLOGON_NOT_STARTED = 0xC0000192
+STATUS_ACCOUNT_EXPIRED = 0xC0000193
+STATUS_POSSIBLE_DEADLOCK = 0xC0000194
+STATUS_NETWORK_CREDENTIAL_CONFLICT = 0xC0000195
+STATUS_REMOTE_SESSION_LIMIT = 0xC0000196
+STATUS_EVENTLOG_FILE_CHANGED = 0xC0000197
+STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0xC0000198
+STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0xC0000199
+STATUS_NOLOGON_SERVER_TRUST_ACCOUNT = 0xC000019A
+STATUS_DOMAIN_TRUST_INCONSISTENT = 0xC000019B
+STATUS_FS_DRIVER_REQUIRED = 0xC000019C
+STATUS_IMAGE_ALREADY_LOADED_AS_DLL = 0xC000019D
+STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 0xC000019E
+STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 0xC000019F
+STATUS_SECURITY_STREAM_IS_INCONSISTENT = 0xC00001A0
+STATUS_INVALID_LOCK_RANGE = 0xC00001A1
+STATUS_INVALID_ACE_CONDITION = 0xC00001A2
+STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT = 0xC00001A3
+STATUS_NOTIFICATION_GUID_ALREADY_DEFINED = 0xC00001A4
+STATUS_NETWORK_OPEN_RESTRICTION = 0xC0000201
+STATUS_NO_USER_SESSION_KEY = 0xC0000202
+STATUS_USER_SESSION_DELETED = 0xC0000203
+STATUS_RESOURCE_LANG_NOT_FOUND = 0xC0000204
+STATUS_INSUFF_SERVER_RESOURCES = 0xC0000205
+STATUS_INVALID_BUFFER_SIZE = 0xC0000206
+STATUS_INVALID_ADDRESS_COMPONENT = 0xC0000207
+STATUS_INVALID_ADDRESS_WILDCARD = 0xC0000208
+STATUS_TOO_MANY_ADDRESSES = 0xC0000209
+STATUS_ADDRESS_ALREADY_EXISTS = 0xC000020A
+STATUS_ADDRESS_CLOSED = 0xC000020B
+STATUS_CONNECTION_DISCONNECTED = 0xC000020C
+STATUS_CONNECTION_RESET = 0xC000020D
+STATUS_TOO_MANY_NODES = 0xC000020E
+STATUS_TRANSACTION_ABORTED = 0xC000020F
+STATUS_TRANSACTION_TIMED_OUT = 0xC0000210
+STATUS_TRANSACTION_NO_RELEASE = 0xC0000211
+STATUS_TRANSACTION_NO_MATCH = 0xC0000212
+STATUS_TRANSACTION_RESPONDED = 0xC0000213
+STATUS_TRANSACTION_INVALID_ID = 0xC0000214
+STATUS_TRANSACTION_INVALID_TYPE = 0xC0000215
+STATUS_NOT_SERVER_SESSION = 0xC0000216
+STATUS_NOT_CLIENT_SESSION = 0xC0000217
+STATUS_CANNOT_LOAD_REGISTRY_FILE = 0xC0000218
+STATUS_DEBUG_ATTACH_FAILED = 0xC0000219
+STATUS_SYSTEM_PROCESS_TERMINATED = 0xC000021A
+STATUS_DATA_NOT_ACCEPTED = 0xC000021B
+STATUS_NO_BROWSER_SERVERS_FOUND = 0xC000021C
+STATUS_VDM_HARD_ERROR = 0xC000021D
+STATUS_DRIVER_CANCEL_TIMEOUT = 0xC000021E
+STATUS_REPLY_MESSAGE_MISMATCH = 0xC000021F
+STATUS_MAPPED_ALIGNMENT = 0xC0000220
+STATUS_IMAGE_CHECKSUM_MISMATCH = 0xC0000221
+STATUS_LOST_WRITEBEHIND_DATA = 0xC0000222
+STATUS_CLIENT_SERVER_PARAMETERS_INVALID = 0xC0000223
+STATUS_PASSWORD_MUST_CHANGE = 0xC0000224
+STATUS_NOT_FOUND = 0xC0000225
+STATUS_NOT_TINY_STREAM = 0xC0000226
+STATUS_RECOVERY_FAILURE = 0xC0000227
+STATUS_STACK_OVERFLOW_READ = 0xC0000228
+STATUS_FAIL_CHECK = 0xC0000229
+STATUS_DUPLICATE_OBJECTID = 0xC000022A
+STATUS_OBJECTID_EXISTS = 0xC000022B
+STATUS_CONVERT_TO_LARGE = 0xC000022C
+STATUS_RETRY = 0xC000022D
+STATUS_FOUND_OUT_OF_SCOPE = 0xC000022E
+STATUS_ALLOCATE_BUCKET = 0xC000022F
+STATUS_PROPSET_NOT_FOUND = 0xC0000230
+STATUS_MARSHALL_OVERFLOW = 0xC0000231
+STATUS_INVALID_VARIANT = 0xC0000232
+STATUS_DOMAIN_CONTROLLER_NOT_FOUND = 0xC0000233
+STATUS_ACCOUNT_LOCKED_OUT = 0xC0000234
+STATUS_HANDLE_NOT_CLOSABLE = 0xC0000235
+STATUS_CONNECTION_REFUSED = 0xC0000236
+STATUS_GRACEFUL_DISCONNECT = 0xC0000237
+STATUS_ADDRESS_ALREADY_ASSOCIATED = 0xC0000238
+STATUS_ADDRESS_NOT_ASSOCIATED = 0xC0000239
+STATUS_CONNECTION_INVALID = 0xC000023A
+STATUS_CONNECTION_ACTIVE = 0xC000023B
+STATUS_NETWORK_UNREACHABLE = 0xC000023C
+STATUS_HOST_UNREACHABLE = 0xC000023D
+STATUS_PROTOCOL_UNREACHABLE = 0xC000023E
+STATUS_PORT_UNREACHABLE = 0xC000023F
+STATUS_REQUEST_ABORTED = 0xC0000240
+STATUS_CONNECTION_ABORTED = 0xC0000241
+STATUS_BAD_COMPRESSION_BUFFER = 0xC0000242
+STATUS_USER_MAPPED_FILE = 0xC0000243
+STATUS_AUDIT_FAILED = 0xC0000244
+STATUS_TIMER_RESOLUTION_NOT_SET = 0xC0000245
+STATUS_CONNECTION_COUNT_LIMIT = 0xC0000246
+STATUS_LOGIN_TIME_RESTRICTION = 0xC0000247
+STATUS_LOGIN_WKSTA_RESTRICTION = 0xC0000248
+STATUS_IMAGE_MP_UP_MISMATCH = 0xC0000249
+STATUS_INSUFFICIENT_LOGON_INFO = 0xC0000250
+STATUS_BAD_DLL_ENTRYPOINT = 0xC0000251
+STATUS_BAD_SERVICE_ENTRYPOINT = 0xC0000252
+STATUS_LPC_REPLY_LOST = 0xC0000253
+STATUS_IP_ADDRESS_CONFLICT1 = 0xC0000254
+STATUS_IP_ADDRESS_CONFLICT2 = 0xC0000255
+STATUS_REGISTRY_QUOTA_LIMIT = 0xC0000256
+STATUS_PATH_NOT_COVERED = 0xC0000257
+STATUS_NO_CALLBACK_ACTIVE = 0xC0000258
+STATUS_LICENSE_QUOTA_EXCEEDED = 0xC0000259
+STATUS_PWD_TOO_SHORT = 0xC000025A
+STATUS_PWD_TOO_RECENT = 0xC000025B
+STATUS_PWD_HISTORY_CONFLICT = 0xC000025C
+STATUS_PLUGPLAY_NO_DEVICE = 0xC000025E
+STATUS_UNSUPPORTED_COMPRESSION = 0xC000025F
+STATUS_INVALID_HW_PROFILE = 0xC0000260
+STATUS_INVALID_PLUGPLAY_DEVICE_PATH = 0xC0000261
+STATUS_DRIVER_ORDINAL_NOT_FOUND = 0xC0000262
+STATUS_DRIVER_ENTRYPOINT_NOT_FOUND = 0xC0000263
+STATUS_RESOURCE_NOT_OWNED = 0xC0000264
+STATUS_TOO_MANY_LINKS = 0xC0000265
+STATUS_QUOTA_LIST_INCONSISTENT = 0xC0000266
+STATUS_FILE_IS_OFFLINE = 0xC0000267
+STATUS_EVALUATION_EXPIRATION = 0xC0000268
+STATUS_ILLEGAL_DLL_RELOCATION = 0xC0000269
+STATUS_LICENSE_VIOLATION = 0xC000026A
+STATUS_DLL_INIT_FAILED_LOGOFF = 0xC000026B
+STATUS_DRIVER_UNABLE_TO_LOAD = 0xC000026C
+STATUS_DFS_UNAVAILABLE = 0xC000026D
+STATUS_VOLUME_DISMOUNTED = 0xC000026E
+STATUS_WX86_INTERNAL_ERROR = 0xC000026F
+STATUS_WX86_FLOAT_STACK_CHECK = 0xC0000270
+STATUS_VALIDATE_CONTINUE = 0xC0000271
+STATUS_NO_MATCH = 0xC0000272
+STATUS_NO_MORE_MATCHES = 0xC0000273
+STATUS_NOT_A_REPARSE_POINT = 0xC0000275
+STATUS_IO_REPARSE_TAG_INVALID = 0xC0000276
+STATUS_IO_REPARSE_TAG_MISMATCH = 0xC0000277
+STATUS_IO_REPARSE_DATA_INVALID = 0xC0000278
+STATUS_IO_REPARSE_TAG_NOT_HANDLED = 0xC0000279
+STATUS_REPARSE_POINT_NOT_RESOLVED = 0xC0000280
+STATUS_DIRECTORY_IS_A_REPARSE_POINT = 0xC0000281
+STATUS_RANGE_LIST_CONFLICT = 0xC0000282
+STATUS_SOURCE_ELEMENT_EMPTY = 0xC0000283
+STATUS_DESTINATION_ELEMENT_FULL = 0xC0000284
+STATUS_ILLEGAL_ELEMENT_ADDRESS = 0xC0000285
+STATUS_MAGAZINE_NOT_PRESENT = 0xC0000286
+STATUS_REINITIALIZATION_NEEDED = 0xC0000287
+STATUS_ENCRYPTION_FAILED = 0xC000028A
+STATUS_DECRYPTION_FAILED = 0xC000028B
+STATUS_RANGE_NOT_FOUND = 0xC000028C
+STATUS_NO_RECOVERY_POLICY = 0xC000028D
+STATUS_NO_EFS = 0xC000028E
+STATUS_WRONG_EFS = 0xC000028F
+STATUS_NO_USER_KEYS = 0xC0000290
+STATUS_FILE_NOT_ENCRYPTED = 0xC0000291
+STATUS_NOT_EXPORT_FORMAT = 0xC0000292
+STATUS_FILE_ENCRYPTED = 0xC0000293
+STATUS_WMI_GUID_NOT_FOUND = 0xC0000295
+STATUS_WMI_INSTANCE_NOT_FOUND = 0xC0000296
+STATUS_WMI_ITEMID_NOT_FOUND = 0xC0000297
+STATUS_WMI_TRY_AGAIN = 0xC0000298
+STATUS_SHARED_POLICY = 0xC0000299
+STATUS_POLICY_OBJECT_NOT_FOUND = 0xC000029A
+STATUS_POLICY_ONLY_IN_DS = 0xC000029B
+STATUS_VOLUME_NOT_UPGRADED = 0xC000029C
+STATUS_REMOTE_STORAGE_NOT_ACTIVE = 0xC000029D
+STATUS_REMOTE_STORAGE_MEDIA_ERROR = 0xC000029E
+STATUS_NO_TRACKING_SERVICE = 0xC000029F
+STATUS_SERVER_SID_MISMATCH = 0xC00002A0
+STATUS_DS_NO_ATTRIBUTE_OR_VALUE = 0xC00002A1
+STATUS_DS_INVALID_ATTRIBUTE_SYNTAX = 0xC00002A2
+STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED = 0xC00002A3
+STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS = 0xC00002A4
+STATUS_DS_BUSY = 0xC00002A5
+STATUS_DS_UNAVAILABLE = 0xC00002A6
+STATUS_DS_NO_RIDS_ALLOCATED = 0xC00002A7
+STATUS_DS_NO_MORE_RIDS = 0xC00002A8
+STATUS_DS_INCORRECT_ROLE_OWNER = 0xC00002A9
+STATUS_DS_RIDMGR_INIT_ERROR = 0xC00002AA
+STATUS_DS_OBJ_CLASS_VIOLATION = 0xC00002AB
+STATUS_DS_CANT_ON_NON_LEAF = 0xC00002AC
+STATUS_DS_CANT_ON_RDN = 0xC00002AD
+STATUS_DS_CANT_MOD_OBJ_CLASS = 0xC00002AE
+STATUS_DS_CROSS_DOM_MOVE_FAILED = 0xC00002AF
+STATUS_DS_GC_NOT_AVAILABLE = 0xC00002B0
+STATUS_DIRECTORY_SERVICE_REQUIRED = 0xC00002B1
+STATUS_REPARSE_ATTRIBUTE_CONFLICT = 0xC00002B2
+STATUS_CANT_ENABLE_DENY_ONLY = 0xC00002B3
+STATUS_FLOAT_MULTIPLE_FAULTS = 0xC00002B4
+STATUS_FLOAT_MULTIPLE_TRAPS = 0xC00002B5
+STATUS_DEVICE_REMOVED = 0xC00002B6
+STATUS_JOURNAL_DELETE_IN_PROGRESS = 0xC00002B7
+STATUS_JOURNAL_NOT_ACTIVE = 0xC00002B8
+STATUS_NOINTERFACE = 0xC00002B9
+STATUS_DS_ADMIN_LIMIT_EXCEEDED = 0xC00002C1
+STATUS_DRIVER_FAILED_SLEEP = 0xC00002C2
+STATUS_MUTUAL_AUTHENTICATION_FAILED = 0xC00002C3
+STATUS_CORRUPT_SYSTEM_FILE = 0xC00002C4
+STATUS_DATATYPE_MISALIGNMENT_ERROR = 0xC00002C5
+STATUS_WMI_READ_ONLY = 0xC00002C6
+STATUS_WMI_SET_FAILURE = 0xC00002C7
+STATUS_COMMITMENT_MINIMUM = 0xC00002C8
+STATUS_REG_NAT_CONSUMPTION = 0xC00002C9
+STATUS_TRANSPORT_FULL = 0xC00002CA
+STATUS_DS_SAM_INIT_FAILURE = 0xC00002CB
+STATUS_ONLY_IF_CONNECTED = 0xC00002CC
+STATUS_DS_SENSITIVE_GROUP_VIOLATION = 0xC00002CD
+STATUS_PNP_RESTART_ENUMERATION = 0xC00002CE
+STATUS_JOURNAL_ENTRY_DELETED = 0xC00002CF
+STATUS_DS_CANT_MOD_PRIMARYGROUPID = 0xC00002D0
+STATUS_SYSTEM_IMAGE_BAD_SIGNATURE = 0xC00002D1
+STATUS_PNP_REBOOT_REQUIRED = 0xC00002D2
+STATUS_POWER_STATE_INVALID = 0xC00002D3
+STATUS_DS_INVALID_GROUP_TYPE = 0xC00002D4
+STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 0xC00002D5
+STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 0xC00002D6
+STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D7
+STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 0xC00002D8
+STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D9
+STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 0xC00002DA
+STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 0xC00002DB
+STATUS_DS_HAVE_PRIMARY_MEMBERS = 0xC00002DC
+STATUS_WMI_NOT_SUPPORTED = 0xC00002DD
+STATUS_INSUFFICIENT_POWER = 0xC00002DE
+STATUS_SAM_NEED_BOOTKEY_PASSWORD = 0xC00002DF
+STATUS_SAM_NEED_BOOTKEY_FLOPPY = 0xC00002E0
+STATUS_DS_CANT_START = 0xC00002E1
+STATUS_DS_INIT_FAILURE = 0xC00002E2
+STATUS_SAM_INIT_FAILURE = 0xC00002E3
+STATUS_DS_GC_REQUIRED = 0xC00002E4
+STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 0xC00002E5
+STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 0xC00002E6
+STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 0xC00002E7
+STATUS_CURRENT_DOMAIN_NOT_ALLOWED = 0xC00002E9
+STATUS_CANNOT_MAKE = 0xC00002EA
+STATUS_SYSTEM_SHUTDOWN = 0xC00002EB
+STATUS_DS_INIT_FAILURE_CONSOLE = 0xC00002EC
+STATUS_DS_SAM_INIT_FAILURE_CONSOLE = 0xC00002ED
+STATUS_UNFINISHED_CONTEXT_DELETED = 0xC00002EE
+STATUS_NO_TGT_REPLY = 0xC00002EF
+STATUS_OBJECTID_NOT_FOUND = 0xC00002F0
+STATUS_NO_IP_ADDRESSES = 0xC00002F1
+STATUS_WRONG_CREDENTIAL_HANDLE = 0xC00002F2
+STATUS_CRYPTO_SYSTEM_INVALID = 0xC00002F3
+STATUS_MAX_REFERRALS_EXCEEDED = 0xC00002F4
+STATUS_MUST_BE_KDC = 0xC00002F5
+STATUS_STRONG_CRYPTO_NOT_SUPPORTED = 0xC00002F6
+STATUS_TOO_MANY_PRINCIPALS = 0xC00002F7
+STATUS_NO_PA_DATA = 0xC00002F8
+STATUS_PKINIT_NAME_MISMATCH = 0xC00002F9
+STATUS_SMARTCARD_LOGON_REQUIRED = 0xC00002FA
+STATUS_KDC_INVALID_REQUEST = 0xC00002FB
+STATUS_KDC_UNABLE_TO_REFER = 0xC00002FC
+STATUS_KDC_UNKNOWN_ETYPE = 0xC00002FD
+STATUS_SHUTDOWN_IN_PROGRESS = 0xC00002FE
+STATUS_SERVER_SHUTDOWN_IN_PROGRESS = 0xC00002FF
+STATUS_NOT_SUPPORTED_ON_SBS = 0xC0000300
+STATUS_WMI_GUID_DISCONNECTED = 0xC0000301
+STATUS_WMI_ALREADY_DISABLED = 0xC0000302
+STATUS_WMI_ALREADY_ENABLED = 0xC0000303
+STATUS_MFT_TOO_FRAGMENTED = 0xC0000304
+STATUS_COPY_PROTECTION_FAILURE = 0xC0000305
+STATUS_CSS_AUTHENTICATION_FAILURE = 0xC0000306
+STATUS_CSS_KEY_NOT_PRESENT = 0xC0000307
+STATUS_CSS_KEY_NOT_ESTABLISHED = 0xC0000308
+STATUS_CSS_SCRAMBLED_SECTOR = 0xC0000309
+STATUS_CSS_REGION_MISMATCH = 0xC000030A
+STATUS_CSS_RESETS_EXHAUSTED = 0xC000030B
+STATUS_PKINIT_FAILURE = 0xC0000320
+STATUS_SMARTCARD_SUBSYSTEM_FAILURE = 0xC0000321
+STATUS_NO_KERB_KEY = 0xC0000322
+STATUS_HOST_DOWN = 0xC0000350
+STATUS_UNSUPPORTED_PREAUTH = 0xC0000351
+STATUS_EFS_ALG_BLOB_TOO_BIG = 0xC0000352
+STATUS_PORT_NOT_SET = 0xC0000353
+STATUS_DEBUGGER_INACTIVE = 0xC0000354
+STATUS_DS_VERSION_CHECK_FAILURE = 0xC0000355
+STATUS_AUDITING_DISABLED = 0xC0000356
+STATUS_PRENT4_MACHINE_ACCOUNT = 0xC0000357
+STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 0xC0000358
+STATUS_INVALID_IMAGE_WIN_32 = 0xC0000359
+STATUS_INVALID_IMAGE_WIN_64 = 0xC000035A
+STATUS_BAD_BINDINGS = 0xC000035B
+STATUS_NETWORK_SESSION_EXPIRED = 0xC000035C
+STATUS_APPHELP_BLOCK = 0xC000035D
+STATUS_ALL_SIDS_FILTERED = 0xC000035E
+STATUS_NOT_SAFE_MODE_DRIVER = 0xC000035F
+STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT = 0xC0000361
+STATUS_ACCESS_DISABLED_BY_POLICY_PATH = 0xC0000362
+STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER = 0xC0000363
+STATUS_ACCESS_DISABLED_BY_POLICY_OTHER = 0xC0000364
+STATUS_FAILED_DRIVER_ENTRY = 0xC0000365
+STATUS_DEVICE_ENUMERATION_ERROR = 0xC0000366
+STATUS_MOUNT_POINT_NOT_RESOLVED = 0xC0000368
+STATUS_INVALID_DEVICE_OBJECT_PARAMETER = 0xC0000369
+STATUS_MCA_OCCURED = 0xC000036A
+STATUS_DRIVER_BLOCKED_CRITICAL = 0xC000036B
+STATUS_DRIVER_BLOCKED = 0xC000036C
+STATUS_DRIVER_DATABASE_ERROR = 0xC000036D
+STATUS_SYSTEM_HIVE_TOO_LARGE = 0xC000036E
+STATUS_INVALID_IMPORT_OF_NON_DLL = 0xC000036F
+STATUS_NO_SECRETS = 0xC0000371
+STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 0xC0000372
+STATUS_FAILED_STACK_SWITCH = 0xC0000373
+STATUS_HEAP_CORRUPTION = 0xC0000374
+STATUS_SMARTCARD_WRONG_PIN = 0xC0000380
+STATUS_SMARTCARD_CARD_BLOCKED = 0xC0000381
+STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED = 0xC0000382
+STATUS_SMARTCARD_NO_CARD = 0xC0000383
+STATUS_SMARTCARD_NO_KEY_CONTAINER = 0xC0000384
+STATUS_SMARTCARD_NO_CERTIFICATE = 0xC0000385
+STATUS_SMARTCARD_NO_KEYSET = 0xC0000386
+STATUS_SMARTCARD_IO_ERROR = 0xC0000387
+STATUS_DOWNGRADE_DETECTED = 0xC0000388
+STATUS_SMARTCARD_CERT_REVOKED = 0xC0000389
+STATUS_ISSUING_CA_UNTRUSTED = 0xC000038A
+STATUS_REVOCATION_OFFLINE_C = 0xC000038B
+STATUS_PKINIT_CLIENT_FAILURE = 0xC000038C
+STATUS_SMARTCARD_CERT_EXPIRED = 0xC000038D
+STATUS_DRIVER_FAILED_PRIOR_UNLOAD = 0xC000038E
+STATUS_SMARTCARD_SILENT_CONTEXT = 0xC000038F
+STATUS_PER_USER_TRUST_QUOTA_EXCEEDED = 0xC0000401
+STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED = 0xC0000402
+STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED = 0xC0000403
+STATUS_DS_NAME_NOT_UNIQUE = 0xC0000404
+STATUS_DS_DUPLICATE_ID_FOUND = 0xC0000405
+STATUS_DS_GROUP_CONVERSION_ERROR = 0xC0000406
+STATUS_VOLSNAP_PREPARE_HIBERNATE = 0xC0000407
+STATUS_USER2USER_REQUIRED = 0xC0000408
+STATUS_STACK_BUFFER_OVERRUN = 0xC0000409
+STATUS_NO_S4U_PROT_SUPPORT = 0xC000040A
+STATUS_CROSSREALM_DELEGATION_FAILURE = 0xC000040B
+STATUS_REVOCATION_OFFLINE_KDC = 0xC000040C
+STATUS_ISSUING_CA_UNTRUSTED_KDC = 0xC000040D
+STATUS_KDC_CERT_EXPIRED = 0xC000040E
+STATUS_KDC_CERT_REVOKED = 0xC000040F
+STATUS_PARAMETER_QUOTA_EXCEEDED = 0xC0000410
+STATUS_HIBERNATION_FAILURE = 0xC0000411
+STATUS_DELAY_LOAD_FAILED = 0xC0000412
+STATUS_AUTHENTICATION_FIREWALL_FAILED = 0xC0000413
+STATUS_VDM_DISALLOWED = 0xC0000414
+STATUS_HUNG_DISPLAY_DRIVER_THREAD = 0xC0000415
+STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE = 0xC0000416
+STATUS_INVALID_CRUNTIME_PARAMETER = 0xC0000417
+STATUS_NTLM_BLOCKED = 0xC0000418
+STATUS_DS_SRC_SID_EXISTS_IN_FOREST = 0xC0000419
+STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST = 0xC000041A
+STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST = 0xC000041B
+STATUS_INVALID_USER_PRINCIPAL_NAME = 0xC000041C
+STATUS_ASSERTION_FAILURE = 0xC0000420
+STATUS_VERIFIER_STOP = 0xC0000421
+STATUS_CALLBACK_POP_STACK = 0xC0000423
+STATUS_INCOMPATIBLE_DRIVER_BLOCKED = 0xC0000424
+STATUS_HIVE_UNLOADED = 0xC0000425
+STATUS_COMPRESSION_DISABLED = 0xC0000426
+STATUS_FILE_SYSTEM_LIMITATION = 0xC0000427
+STATUS_INVALID_IMAGE_HASH = 0xC0000428
+STATUS_NOT_CAPABLE = 0xC0000429
+STATUS_REQUEST_OUT_OF_SEQUENCE = 0xC000042A
+STATUS_IMPLEMENTATION_LIMIT = 0xC000042B
+STATUS_ELEVATION_REQUIRED = 0xC000042C
+STATUS_NO_SECURITY_CONTEXT = 0xC000042D
+STATUS_PKU2U_CERT_FAILURE = 0xC000042E
+STATUS_BEYOND_VDL = 0xC0000432
+STATUS_ENCOUNTERED_WRITE_IN_PROGRESS = 0xC0000433
+STATUS_PTE_CHANGED = 0xC0000434
+STATUS_PURGE_FAILED = 0xC0000435
+STATUS_CRED_REQUIRES_CONFIRMATION = 0xC0000440
+STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE = 0xC0000441
+STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER = 0xC0000442
+STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE = 0xC0000443
+STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE = 0xC0000444
+STATUS_CS_ENCRYPTION_FILE_NOT_CSE = 0xC0000445
+STATUS_INVALID_LABEL = 0xC0000446
+STATUS_DRIVER_PROCESS_TERMINATED = 0xC0000450
+STATUS_AMBIGUOUS_SYSTEM_DEVICE = 0xC0000451
+STATUS_SYSTEM_DEVICE_NOT_FOUND = 0xC0000452
+STATUS_RESTART_BOOT_APPLICATION = 0xC0000453
+STATUS_INSUFFICIENT_NVRAM_RESOURCES = 0xC0000454
+STATUS_INVALID_TASK_NAME = 0xC0000500
+STATUS_INVALID_TASK_INDEX = 0xC0000501
+STATUS_THREAD_ALREADY_IN_TASK = 0xC0000502
+STATUS_CALLBACK_BYPASS = 0xC0000503
+STATUS_FAIL_FAST_EXCEPTION = 0xC0000602
+STATUS_IMAGE_CERT_REVOKED = 0xC0000603
+STATUS_PORT_CLOSED = 0xC0000700
+STATUS_MESSAGE_LOST = 0xC0000701
+STATUS_INVALID_MESSAGE = 0xC0000702
+STATUS_REQUEST_CANCELED = 0xC0000703
+STATUS_RECURSIVE_DISPATCH = 0xC0000704
+STATUS_LPC_RECEIVE_BUFFER_EXPECTED = 0xC0000705
+STATUS_LPC_INVALID_CONNECTION_USAGE = 0xC0000706
+STATUS_LPC_REQUESTS_NOT_ALLOWED = 0xC0000707
+STATUS_RESOURCE_IN_USE = 0xC0000708
+STATUS_HARDWARE_MEMORY_ERROR = 0xC0000709
+STATUS_THREADPOOL_HANDLE_EXCEPTION = 0xC000070A
+STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED = 0xC000070B
+STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED = 0xC000070C
+STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED = 0xC000070D
+STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED = 0xC000070E
+STATUS_THREADPOOL_RELEASED_DURING_OPERATION = 0xC000070F
+STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING = 0xC0000710
+STATUS_APC_RETURNED_WHILE_IMPERSONATING = 0xC0000711
+STATUS_PROCESS_IS_PROTECTED = 0xC0000712
+STATUS_MCA_EXCEPTION = 0xC0000713
+STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE = 0xC0000714
+STATUS_SYMLINK_CLASS_DISABLED = 0xC0000715
+STATUS_INVALID_IDN_NORMALIZATION = 0xC0000716
+STATUS_NO_UNICODE_TRANSLATION = 0xC0000717
+STATUS_ALREADY_REGISTERED = 0xC0000718
+STATUS_CONTEXT_MISMATCH = 0xC0000719
+STATUS_PORT_ALREADY_HAS_COMPLETION_LIST = 0xC000071A
+STATUS_CALLBACK_RETURNED_THREAD_PRIORITY = 0xC000071B
+STATUS_INVALID_THREAD = 0xC000071C
+STATUS_CALLBACK_RETURNED_TRANSACTION = 0xC000071D
+STATUS_CALLBACK_RETURNED_LDR_LOCK = 0xC000071E
+STATUS_CALLBACK_RETURNED_LANG = 0xC000071F
+STATUS_CALLBACK_RETURNED_PRI_BACK = 0xC0000720
+STATUS_DISK_REPAIR_DISABLED = 0xC0000800
+STATUS_DS_DOMAIN_RENAME_IN_PROGRESS = 0xC0000801
+STATUS_DISK_QUOTA_EXCEEDED = 0xC0000802
+STATUS_CONTENT_BLOCKED = 0xC0000804
+STATUS_BAD_CLUSTERS = 0xC0000805
+STATUS_VOLUME_DIRTY = 0xC0000806
+STATUS_FILE_CHECKED_OUT = 0xC0000901
+STATUS_CHECKOUT_REQUIRED = 0xC0000902
+STATUS_BAD_FILE_TYPE = 0xC0000903
+STATUS_FILE_TOO_LARGE = 0xC0000904
+STATUS_FORMS_AUTH_REQUIRED = 0xC0000905
+STATUS_VIRUS_INFECTED = 0xC0000906
+STATUS_VIRUS_DELETED = 0xC0000907
+STATUS_BAD_MCFG_TABLE = 0xC0000908
+STATUS_CANNOT_BREAK_OPLOCK = 0xC0000909
+STATUS_WOW_ASSERTION = 0xC0009898
+STATUS_INVALID_SIGNATURE = 0xC000A000
+STATUS_HMAC_NOT_SUPPORTED = 0xC000A001
+STATUS_IPSEC_QUEUE_OVERFLOW = 0xC000A010
+STATUS_ND_QUEUE_OVERFLOW = 0xC000A011
+STATUS_HOPLIMIT_EXCEEDED = 0xC000A012
+STATUS_PROTOCOL_NOT_SUPPORTED = 0xC000A013
+STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED = 0xC000A080
+STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR = 0xC000A081
+STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR = 0xC000A082
+STATUS_XML_PARSE_ERROR = 0xC000A083
+STATUS_XMLDSIG_ERROR = 0xC000A084
+STATUS_WRONG_COMPARTMENT = 0xC000A085
+STATUS_AUTHIP_FAILURE = 0xC000A086
+STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS = 0xC000A087
+STATUS_DS_OID_NOT_FOUND = 0xC000A088
+STATUS_HASH_NOT_SUPPORTED = 0xC000A100
+STATUS_HASH_NOT_PRESENT = 0xC000A101
+DBG_NO_STATE_CHANGE = 0xC0010001
+DBG_APP_NOT_IDLE = 0xC0010002
+RPC_NT_INVALID_STRING_BINDING = 0xC0020001
+RPC_NT_WRONG_KIND_OF_BINDING = 0xC0020002
+RPC_NT_INVALID_BINDING = 0xC0020003
+RPC_NT_PROTSEQ_NOT_SUPPORTED = 0xC0020004
+RPC_NT_INVALID_RPC_PROTSEQ = 0xC0020005
+RPC_NT_INVALID_STRING_UUID = 0xC0020006
+RPC_NT_INVALID_ENDPOINT_FORMAT = 0xC0020007
+RPC_NT_INVALID_NET_ADDR = 0xC0020008
+RPC_NT_NO_ENDPOINT_FOUND = 0xC0020009
+RPC_NT_INVALID_TIMEOUT = 0xC002000A
+RPC_NT_OBJECT_NOT_FOUND = 0xC002000B
+RPC_NT_ALREADY_REGISTERED = 0xC002000C
+RPC_NT_TYPE_ALREADY_REGISTERED = 0xC002000D
+RPC_NT_ALREADY_LISTENING = 0xC002000E
+RPC_NT_NO_PROTSEQS_REGISTERED = 0xC002000F
+RPC_NT_NOT_LISTENING = 0xC0020010
+RPC_NT_UNKNOWN_MGR_TYPE = 0xC0020011
+RPC_NT_UNKNOWN_IF = 0xC0020012
+RPC_NT_NO_BINDINGS = 0xC0020013
+RPC_NT_NO_PROTSEQS = 0xC0020014
+RPC_NT_CANT_CREATE_ENDPOINT = 0xC0020015
+RPC_NT_OUT_OF_RESOURCES = 0xC0020016
+RPC_NT_SERVER_UNAVAILABLE = 0xC0020017
+RPC_NT_SERVER_TOO_BUSY = 0xC0020018
+RPC_NT_INVALID_NETWORK_OPTIONS = 0xC0020019
+RPC_NT_NO_CALL_ACTIVE = 0xC002001A
+RPC_NT_CALL_FAILED = 0xC002001B
+RPC_NT_CALL_FAILED_DNE = 0xC002001C
+RPC_NT_PROTOCOL_ERROR = 0xC002001D
+RPC_NT_UNSUPPORTED_TRANS_SYN = 0xC002001F
+RPC_NT_UNSUPPORTED_TYPE = 0xC0020021
+RPC_NT_INVALID_TAG = 0xC0020022
+RPC_NT_INVALID_BOUND = 0xC0020023
+RPC_NT_NO_ENTRY_NAME = 0xC0020024
+RPC_NT_INVALID_NAME_SYNTAX = 0xC0020025
+RPC_NT_UNSUPPORTED_NAME_SYNTAX = 0xC0020026
+RPC_NT_UUID_NO_ADDRESS = 0xC0020028
+RPC_NT_DUPLICATE_ENDPOINT = 0xC0020029
+RPC_NT_UNKNOWN_AUTHN_TYPE = 0xC002002A
+RPC_NT_MAX_CALLS_TOO_SMALL = 0xC002002B
+RPC_NT_STRING_TOO_LONG = 0xC002002C
+RPC_NT_PROTSEQ_NOT_FOUND = 0xC002002D
+RPC_NT_PROCNUM_OUT_OF_RANGE = 0xC002002E
+RPC_NT_BINDING_HAS_NO_AUTH = 0xC002002F
+RPC_NT_UNKNOWN_AUTHN_SERVICE = 0xC0020030
+RPC_NT_UNKNOWN_AUTHN_LEVEL = 0xC0020031
+RPC_NT_INVALID_AUTH_IDENTITY = 0xC0020032
+RPC_NT_UNKNOWN_AUTHZ_SERVICE = 0xC0020033
+EPT_NT_INVALID_ENTRY = 0xC0020034
+EPT_NT_CANT_PERFORM_OP = 0xC0020035
+EPT_NT_NOT_REGISTERED = 0xC0020036
+RPC_NT_NOTHING_TO_EXPORT = 0xC0020037
+RPC_NT_INCOMPLETE_NAME = 0xC0020038
+RPC_NT_INVALID_VERS_OPTION = 0xC0020039
+RPC_NT_NO_MORE_MEMBERS = 0xC002003A
+RPC_NT_NOT_ALL_OBJS_UNEXPORTED = 0xC002003B
+RPC_NT_INTERFACE_NOT_FOUND = 0xC002003C
+RPC_NT_ENTRY_ALREADY_EXISTS = 0xC002003D
+RPC_NT_ENTRY_NOT_FOUND = 0xC002003E
+RPC_NT_NAME_SERVICE_UNAVAILABLE = 0xC002003F
+RPC_NT_INVALID_NAF_ID = 0xC0020040
+RPC_NT_CANNOT_SUPPORT = 0xC0020041
+RPC_NT_NO_CONTEXT_AVAILABLE = 0xC0020042
+RPC_NT_INTERNAL_ERROR = 0xC0020043
+RPC_NT_ZERO_DIVIDE = 0xC0020044
+RPC_NT_ADDRESS_ERROR = 0xC0020045
+RPC_NT_FP_DIV_ZERO = 0xC0020046
+RPC_NT_FP_UNDERFLOW = 0xC0020047
+RPC_NT_FP_OVERFLOW = 0xC0020048
+RPC_NT_CALL_IN_PROGRESS = 0xC0020049
+RPC_NT_NO_MORE_BINDINGS = 0xC002004A
+RPC_NT_GROUP_MEMBER_NOT_FOUND = 0xC002004B
+EPT_NT_CANT_CREATE = 0xC002004C
+RPC_NT_INVALID_OBJECT = 0xC002004D
+RPC_NT_NO_INTERFACES = 0xC002004F
+RPC_NT_CALL_CANCELLED = 0xC0020050
+RPC_NT_BINDING_INCOMPLETE = 0xC0020051
+RPC_NT_COMM_FAILURE = 0xC0020052
+RPC_NT_UNSUPPORTED_AUTHN_LEVEL = 0xC0020053
+RPC_NT_NO_PRINC_NAME = 0xC0020054
+RPC_NT_NOT_RPC_ERROR = 0xC0020055
+RPC_NT_SEC_PKG_ERROR = 0xC0020057
+RPC_NT_NOT_CANCELLED = 0xC0020058
+RPC_NT_INVALID_ASYNC_HANDLE = 0xC0020062
+RPC_NT_INVALID_ASYNC_CALL = 0xC0020063
+RPC_NT_PROXY_ACCESS_DENIED = 0xC0020064
+RPC_NT_NO_MORE_ENTRIES = 0xC0030001
+RPC_NT_SS_CHAR_TRANS_OPEN_FAIL = 0xC0030002
+RPC_NT_SS_CHAR_TRANS_SHORT_FILE = 0xC0030003
+RPC_NT_SS_IN_NULL_CONTEXT = 0xC0030004
+RPC_NT_SS_CONTEXT_MISMATCH = 0xC0030005
+RPC_NT_SS_CONTEXT_DAMAGED = 0xC0030006
+RPC_NT_SS_HANDLES_MISMATCH = 0xC0030007
+RPC_NT_SS_CANNOT_GET_CALL_HANDLE = 0xC0030008
+RPC_NT_NULL_REF_POINTER = 0xC0030009
+RPC_NT_ENUM_VALUE_OUT_OF_RANGE = 0xC003000A
+RPC_NT_BYTE_COUNT_TOO_SMALL = 0xC003000B
+RPC_NT_BAD_STUB_DATA = 0xC003000C
+RPC_NT_INVALID_ES_ACTION = 0xC0030059
+RPC_NT_WRONG_ES_VERSION = 0xC003005A
+RPC_NT_WRONG_STUB_VERSION = 0xC003005B
+RPC_NT_INVALID_PIPE_OBJECT = 0xC003005C
+RPC_NT_INVALID_PIPE_OPERATION = 0xC003005D
+RPC_NT_WRONG_PIPE_VERSION = 0xC003005E
+RPC_NT_PIPE_CLOSED = 0xC003005F
+RPC_NT_PIPE_DISCIPLINE_ERROR = 0xC0030060
+RPC_NT_PIPE_EMPTY = 0xC0030061
+STATUS_PNP_BAD_MPS_TABLE = 0xC0040035
+STATUS_PNP_TRANSLATION_FAILED = 0xC0040036
+STATUS_PNP_IRQ_TRANSLATION_FAILED = 0xC0040037
+STATUS_PNP_INVALID_ID = 0xC0040038
+STATUS_IO_REISSUE_AS_CACHED = 0xC0040039
+STATUS_CTX_WINSTATION_NAME_INVALID = 0xC00A0001
+STATUS_CTX_INVALID_PD = 0xC00A0002
+STATUS_CTX_PD_NOT_FOUND = 0xC00A0003
+STATUS_CTX_CLOSE_PENDING = 0xC00A0006
+STATUS_CTX_NO_OUTBUF = 0xC00A0007
+STATUS_CTX_MODEM_INF_NOT_FOUND = 0xC00A0008
+STATUS_CTX_INVALID_MODEMNAME = 0xC00A0009
+STATUS_CTX_RESPONSE_ERROR = 0xC00A000A
+STATUS_CTX_MODEM_RESPONSE_TIMEOUT = 0xC00A000B
+STATUS_CTX_MODEM_RESPONSE_NO_CARRIER = 0xC00A000C
+STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE = 0xC00A000D
+STATUS_CTX_MODEM_RESPONSE_BUSY = 0xC00A000E
+STATUS_CTX_MODEM_RESPONSE_VOICE = 0xC00A000F
+STATUS_CTX_TD_ERROR = 0xC00A0010
+STATUS_CTX_LICENSE_CLIENT_INVALID = 0xC00A0012
+STATUS_CTX_LICENSE_NOT_AVAILABLE = 0xC00A0013
+STATUS_CTX_LICENSE_EXPIRED = 0xC00A0014
+STATUS_CTX_WINSTATION_NOT_FOUND = 0xC00A0015
+STATUS_CTX_WINSTATION_NAME_COLLISION = 0xC00A0016
+STATUS_CTX_WINSTATION_BUSY = 0xC00A0017
+STATUS_CTX_BAD_VIDEO_MODE = 0xC00A0018
+STATUS_CTX_GRAPHICS_INVALID = 0xC00A0022
+STATUS_CTX_NOT_CONSOLE = 0xC00A0024
+STATUS_CTX_CLIENT_QUERY_TIMEOUT = 0xC00A0026
+STATUS_CTX_CONSOLE_DISCONNECT = 0xC00A0027
+STATUS_CTX_CONSOLE_CONNECT = 0xC00A0028
+STATUS_CTX_SHADOW_DENIED = 0xC00A002A
+STATUS_CTX_WINSTATION_ACCESS_DENIED = 0xC00A002B
+STATUS_CTX_INVALID_WD = 0xC00A002E
+STATUS_CTX_WD_NOT_FOUND = 0xC00A002F
+STATUS_CTX_SHADOW_INVALID = 0xC00A0030
+STATUS_CTX_SHADOW_DISABLED = 0xC00A0031
+STATUS_RDP_PROTOCOL_ERROR = 0xC00A0032
+STATUS_CTX_CLIENT_LICENSE_NOT_SET = 0xC00A0033
+STATUS_CTX_CLIENT_LICENSE_IN_USE = 0xC00A0034
+STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 0xC00A0035
+STATUS_CTX_SHADOW_NOT_RUNNING = 0xC00A0036
+STATUS_CTX_LOGON_DISABLED = 0xC00A0037
+STATUS_CTX_SECURITY_LAYER_ERROR = 0xC00A0038
+STATUS_TS_INCOMPATIBLE_SESSIONS = 0xC00A0039
+STATUS_MUI_FILE_NOT_FOUND = 0xC00B0001
+STATUS_MUI_INVALID_FILE = 0xC00B0002
+STATUS_MUI_INVALID_RC_CONFIG = 0xC00B0003
+STATUS_MUI_INVALID_LOCALE_NAME = 0xC00B0004
+STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME = 0xC00B0005
+STATUS_MUI_FILE_NOT_LOADED = 0xC00B0006
+STATUS_RESOURCE_ENUM_USER_STOP = 0xC00B0007
+STATUS_CLUSTER_INVALID_NODE = 0xC0130001
+STATUS_CLUSTER_NODE_EXISTS = 0xC0130002
+STATUS_CLUSTER_JOIN_IN_PROGRESS = 0xC0130003
+STATUS_CLUSTER_NODE_NOT_FOUND = 0xC0130004
+STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND = 0xC0130005
+STATUS_CLUSTER_NETWORK_EXISTS = 0xC0130006
+STATUS_CLUSTER_NETWORK_NOT_FOUND = 0xC0130007
+STATUS_CLUSTER_NETINTERFACE_EXISTS = 0xC0130008
+STATUS_CLUSTER_NETINTERFACE_NOT_FOUND = 0xC0130009
+STATUS_CLUSTER_INVALID_REQUEST = 0xC013000A
+STATUS_CLUSTER_INVALID_NETWORK_PROVIDER = 0xC013000B
+STATUS_CLUSTER_NODE_DOWN = 0xC013000C
+STATUS_CLUSTER_NODE_UNREACHABLE = 0xC013000D
+STATUS_CLUSTER_NODE_NOT_MEMBER = 0xC013000E
+STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS = 0xC013000F
+STATUS_CLUSTER_INVALID_NETWORK = 0xC0130010
+STATUS_CLUSTER_NO_NET_ADAPTERS = 0xC0130011
+STATUS_CLUSTER_NODE_UP = 0xC0130012
+STATUS_CLUSTER_NODE_PAUSED = 0xC0130013
+STATUS_CLUSTER_NODE_NOT_PAUSED = 0xC0130014
+STATUS_CLUSTER_NO_SECURITY_CONTEXT = 0xC0130015
+STATUS_CLUSTER_NETWORK_NOT_INTERNAL = 0xC0130016
+STATUS_CLUSTER_POISONED = 0xC0130017
+STATUS_ACPI_INVALID_OPCODE = 0xC0140001
+STATUS_ACPI_STACK_OVERFLOW = 0xC0140002
+STATUS_ACPI_ASSERT_FAILED = 0xC0140003
+STATUS_ACPI_INVALID_INDEX = 0xC0140004
+STATUS_ACPI_INVALID_ARGUMENT = 0xC0140005
+STATUS_ACPI_FATAL = 0xC0140006
+STATUS_ACPI_INVALID_SUPERNAME = 0xC0140007
+STATUS_ACPI_INVALID_ARGTYPE = 0xC0140008
+STATUS_ACPI_INVALID_OBJTYPE = 0xC0140009
+STATUS_ACPI_INVALID_TARGETTYPE = 0xC014000A
+STATUS_ACPI_INCORRECT_ARGUMENT_COUNT = 0xC014000B
+STATUS_ACPI_ADDRESS_NOT_MAPPED = 0xC014000C
+STATUS_ACPI_INVALID_EVENTTYPE = 0xC014000D
+STATUS_ACPI_HANDLER_COLLISION = 0xC014000E
+STATUS_ACPI_INVALID_DATA = 0xC014000F
+STATUS_ACPI_INVALID_REGION = 0xC0140010
+STATUS_ACPI_INVALID_ACCESS_SIZE = 0xC0140011
+STATUS_ACPI_ACQUIRE_GLOBAL_LOCK = 0xC0140012
+STATUS_ACPI_ALREADY_INITIALIZED = 0xC0140013
+STATUS_ACPI_NOT_INITIALIZED = 0xC0140014
+STATUS_ACPI_INVALID_MUTEX_LEVEL = 0xC0140015
+STATUS_ACPI_MUTEX_NOT_OWNED = 0xC0140016
+STATUS_ACPI_MUTEX_NOT_OWNER = 0xC0140017
+STATUS_ACPI_RS_ACCESS = 0xC0140018
+STATUS_ACPI_INVALID_TABLE = 0xC0140019
+STATUS_ACPI_REG_HANDLER_FAILED = 0xC0140020
+STATUS_ACPI_POWER_REQUEST_FAILED = 0xC0140021
+STATUS_SXS_SECTION_NOT_FOUND = 0xC0150001
+STATUS_SXS_CANT_GEN_ACTCTX = 0xC0150002
+STATUS_SXS_INVALID_ACTCTXDATA_FORMAT = 0xC0150003
+STATUS_SXS_ASSEMBLY_NOT_FOUND = 0xC0150004
+STATUS_SXS_MANIFEST_FORMAT_ERROR = 0xC0150005
+STATUS_SXS_MANIFEST_PARSE_ERROR = 0xC0150006
+STATUS_SXS_ACTIVATION_CONTEXT_DISABLED = 0xC0150007
+STATUS_SXS_KEY_NOT_FOUND = 0xC0150008
+STATUS_SXS_VERSION_CONFLICT = 0xC0150009
+STATUS_SXS_WRONG_SECTION_TYPE = 0xC015000A
+STATUS_SXS_THREAD_QUERIES_DISABLED = 0xC015000B
+STATUS_SXS_ASSEMBLY_MISSING = 0xC015000C
+STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET = 0xC015000E
+STATUS_SXS_EARLY_DEACTIVATION = 0xC015000F
+STATUS_SXS_INVALID_DEACTIVATION = 0xC0150010
+STATUS_SXS_MULTIPLE_DEACTIVATION = 0xC0150011
+STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 0xC0150012
+STATUS_SXS_PROCESS_TERMINATION_REQUESTED = 0xC0150013
+STATUS_SXS_CORRUPT_ACTIVATION_STACK = 0xC0150014
+STATUS_SXS_CORRUPTION = 0xC0150015
+STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 0xC0150016
+STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 0xC0150017
+STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 0xC0150018
+STATUS_SXS_IDENTITY_PARSE_ERROR = 0xC0150019
+STATUS_SXS_COMPONENT_STORE_CORRUPT = 0xC015001A
+STATUS_SXS_FILE_HASH_MISMATCH = 0xC015001B
+STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 0xC015001C
+STATUS_SXS_IDENTITIES_DIFFERENT = 0xC015001D
+STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 0xC015001E
+STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY = 0xC015001F
+STATUS_ADVANCED_INSTALLER_FAILED = 0xC0150020
+STATUS_XML_ENCODING_MISMATCH = 0xC0150021
+STATUS_SXS_MANIFEST_TOO_BIG = 0xC0150022
+STATUS_SXS_SETTING_NOT_REGISTERED = 0xC0150023
+STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE = 0xC0150024
+STATUS_SMI_PRIMITIVE_INSTALLER_FAILED = 0xC0150025
+STATUS_GENERIC_COMMAND_FAILED = 0xC0150026
+STATUS_SXS_FILE_HASH_MISSING = 0xC0150027
+STATUS_TRANSACTIONAL_CONFLICT = 0xC0190001
+STATUS_INVALID_TRANSACTION = 0xC0190002
+STATUS_TRANSACTION_NOT_ACTIVE = 0xC0190003
+STATUS_TM_INITIALIZATION_FAILED = 0xC0190004
+STATUS_RM_NOT_ACTIVE = 0xC0190005
+STATUS_RM_METADATA_CORRUPT = 0xC0190006
+STATUS_TRANSACTION_NOT_JOINED = 0xC0190007
+STATUS_DIRECTORY_NOT_RM = 0xC0190008
+STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE = 0xC019000A
+STATUS_LOG_RESIZE_INVALID_SIZE = 0xC019000B
+STATUS_REMOTE_FILE_VERSION_MISMATCH = 0xC019000C
+STATUS_CRM_PROTOCOL_ALREADY_EXISTS = 0xC019000F
+STATUS_TRANSACTION_PROPAGATION_FAILED = 0xC0190010
+STATUS_CRM_PROTOCOL_NOT_FOUND = 0xC0190011
+STATUS_TRANSACTION_SUPERIOR_EXISTS = 0xC0190012
+STATUS_TRANSACTION_REQUEST_NOT_VALID = 0xC0190013
+STATUS_TRANSACTION_NOT_REQUESTED = 0xC0190014
+STATUS_TRANSACTION_ALREADY_ABORTED = 0xC0190015
+STATUS_TRANSACTION_ALREADY_COMMITTED = 0xC0190016
+STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER = 0xC0190017
+STATUS_CURRENT_TRANSACTION_NOT_VALID = 0xC0190018
+STATUS_LOG_GROWTH_FAILED = 0xC0190019
+STATUS_OBJECT_NO_LONGER_EXISTS = 0xC0190021
+STATUS_STREAM_MINIVERSION_NOT_FOUND = 0xC0190022
+STATUS_STREAM_MINIVERSION_NOT_VALID = 0xC0190023
+STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION = 0xC0190024
+STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT = 0xC0190025
+STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS = 0xC0190026
+STATUS_HANDLE_NO_LONGER_VALID = 0xC0190028
+STATUS_LOG_CORRUPTION_DETECTED = 0xC0190030
+STATUS_RM_DISCONNECTED = 0xC0190032
+STATUS_ENLISTMENT_NOT_SUPERIOR = 0xC0190033
+STATUS_FILE_IDENTITY_NOT_PERSISTENT = 0xC0190036
+STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY = 0xC0190037
+STATUS_CANT_CROSS_RM_BOUNDARY = 0xC0190038
+STATUS_TXF_DIR_NOT_EMPTY = 0xC0190039
+STATUS_INDOUBT_TRANSACTIONS_EXIST = 0xC019003A
+STATUS_TM_VOLATILE = 0xC019003B
+STATUS_ROLLBACK_TIMER_EXPIRED = 0xC019003C
+STATUS_TXF_ATTRIBUTE_CORRUPT = 0xC019003D
+STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION = 0xC019003E
+STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED = 0xC019003F
+STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE = 0xC0190040
+STATUS_TRANSACTION_REQUIRED_PROMOTION = 0xC0190043
+STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION = 0xC0190044
+STATUS_TRANSACTIONS_NOT_FROZEN = 0xC0190045
+STATUS_TRANSACTION_FREEZE_IN_PROGRESS = 0xC0190046
+STATUS_NOT_SNAPSHOT_VOLUME = 0xC0190047
+STATUS_NO_SAVEPOINT_WITH_OPEN_FILES = 0xC0190048
+STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION = 0xC0190049
+STATUS_TM_IDENTITY_MISMATCH = 0xC019004A
+STATUS_FLOATED_SECTION = 0xC019004B
+STATUS_CANNOT_ACCEPT_TRANSACTED_WORK = 0xC019004C
+STATUS_CANNOT_ABORT_TRANSACTIONS = 0xC019004D
+STATUS_TRANSACTION_NOT_FOUND = 0xC019004E
+STATUS_RESOURCEMANAGER_NOT_FOUND = 0xC019004F
+STATUS_ENLISTMENT_NOT_FOUND = 0xC0190050
+STATUS_TRANSACTIONMANAGER_NOT_FOUND = 0xC0190051
+STATUS_TRANSACTIONMANAGER_NOT_ONLINE = 0xC0190052
+STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION = 0xC0190053
+STATUS_TRANSACTION_NOT_ROOT = 0xC0190054
+STATUS_TRANSACTION_OBJECT_EXPIRED = 0xC0190055
+STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION = 0xC0190056
+STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED = 0xC0190057
+STATUS_TRANSACTION_RECORD_TOO_LONG = 0xC0190058
+STATUS_NO_LINK_TRACKING_IN_TRANSACTION = 0xC0190059
+STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION = 0xC019005A
+STATUS_TRANSACTION_INTEGRITY_VIOLATED = 0xC019005B
+STATUS_EXPIRED_HANDLE = 0xC0190060
+STATUS_TRANSACTION_NOT_ENLISTED = 0xC0190061
+STATUS_LOG_SECTOR_INVALID = 0xC01A0001
+STATUS_LOG_SECTOR_PARITY_INVALID = 0xC01A0002
+STATUS_LOG_SECTOR_REMAPPED = 0xC01A0003
+STATUS_LOG_BLOCK_INCOMPLETE = 0xC01A0004
+STATUS_LOG_INVALID_RANGE = 0xC01A0005
+STATUS_LOG_BLOCKS_EXHAUSTED = 0xC01A0006
+STATUS_LOG_READ_CONTEXT_INVALID = 0xC01A0007
+STATUS_LOG_RESTART_INVALID = 0xC01A0008
+STATUS_LOG_BLOCK_VERSION = 0xC01A0009
+STATUS_LOG_BLOCK_INVALID = 0xC01A000A
+STATUS_LOG_READ_MODE_INVALID = 0xC01A000B
+STATUS_LOG_METADATA_CORRUPT = 0xC01A000D
+STATUS_LOG_METADATA_INVALID = 0xC01A000E
+STATUS_LOG_METADATA_INCONSISTENT = 0xC01A000F
+STATUS_LOG_RESERVATION_INVALID = 0xC01A0010
+STATUS_LOG_CANT_DELETE = 0xC01A0011
+STATUS_LOG_CONTAINER_LIMIT_EXCEEDED = 0xC01A0012
+STATUS_LOG_START_OF_LOG = 0xC01A0013
+STATUS_LOG_POLICY_ALREADY_INSTALLED = 0xC01A0014
+STATUS_LOG_POLICY_NOT_INSTALLED = 0xC01A0015
+STATUS_LOG_POLICY_INVALID = 0xC01A0016
+STATUS_LOG_POLICY_CONFLICT = 0xC01A0017
+STATUS_LOG_PINNED_ARCHIVE_TAIL = 0xC01A0018
+STATUS_LOG_RECORD_NONEXISTENT = 0xC01A0019
+STATUS_LOG_RECORDS_RESERVED_INVALID = 0xC01A001A
+STATUS_LOG_SPACE_RESERVED_INVALID = 0xC01A001B
+STATUS_LOG_TAIL_INVALID = 0xC01A001C
+STATUS_LOG_FULL = 0xC01A001D
+STATUS_LOG_MULTIPLEXED = 0xC01A001E
+STATUS_LOG_DEDICATED = 0xC01A001F
+STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS = 0xC01A0020
+STATUS_LOG_ARCHIVE_IN_PROGRESS = 0xC01A0021
+STATUS_LOG_EPHEMERAL = 0xC01A0022
+STATUS_LOG_NOT_ENOUGH_CONTAINERS = 0xC01A0023
+STATUS_LOG_CLIENT_ALREADY_REGISTERED = 0xC01A0024
+STATUS_LOG_CLIENT_NOT_REGISTERED = 0xC01A0025
+STATUS_LOG_FULL_HANDLER_IN_PROGRESS = 0xC01A0026
+STATUS_LOG_CONTAINER_READ_FAILED = 0xC01A0027
+STATUS_LOG_CONTAINER_WRITE_FAILED = 0xC01A0028
+STATUS_LOG_CONTAINER_OPEN_FAILED = 0xC01A0029
+STATUS_LOG_CONTAINER_STATE_INVALID = 0xC01A002A
+STATUS_LOG_STATE_INVALID = 0xC01A002B
+STATUS_LOG_PINNED = 0xC01A002C
+STATUS_LOG_METADATA_FLUSH_FAILED = 0xC01A002D
+STATUS_LOG_INCONSISTENT_SECURITY = 0xC01A002E
+STATUS_LOG_APPENDED_FLUSH_FAILED = 0xC01A002F
+STATUS_LOG_PINNED_RESERVATION = 0xC01A0030
+STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD = 0xC01B00EA
+STATUS_FLT_NO_HANDLER_DEFINED = 0xC01C0001
+STATUS_FLT_CONTEXT_ALREADY_DEFINED = 0xC01C0002
+STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST = 0xC01C0003
+STATUS_FLT_DISALLOW_FAST_IO = 0xC01C0004
+STATUS_FLT_INVALID_NAME_REQUEST = 0xC01C0005
+STATUS_FLT_NOT_SAFE_TO_POST_OPERATION = 0xC01C0006
+STATUS_FLT_NOT_INITIALIZED = 0xC01C0007
+STATUS_FLT_FILTER_NOT_READY = 0xC01C0008
+STATUS_FLT_POST_OPERATION_CLEANUP = 0xC01C0009
+STATUS_FLT_INTERNAL_ERROR = 0xC01C000A
+STATUS_FLT_DELETING_OBJECT = 0xC01C000B
+STATUS_FLT_MUST_BE_NONPAGED_POOL = 0xC01C000C
+STATUS_FLT_DUPLICATE_ENTRY = 0xC01C000D
+STATUS_FLT_CBDQ_DISABLED = 0xC01C000E
+STATUS_FLT_DO_NOT_ATTACH = 0xC01C000F
+STATUS_FLT_DO_NOT_DETACH = 0xC01C0010
+STATUS_FLT_INSTANCE_ALTITUDE_COLLISION = 0xC01C0011
+STATUS_FLT_INSTANCE_NAME_COLLISION = 0xC01C0012
+STATUS_FLT_FILTER_NOT_FOUND = 0xC01C0013
+STATUS_FLT_VOLUME_NOT_FOUND = 0xC01C0014
+STATUS_FLT_INSTANCE_NOT_FOUND = 0xC01C0015
+STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND = 0xC01C0016
+STATUS_FLT_INVALID_CONTEXT_REGISTRATION = 0xC01C0017
+STATUS_FLT_NAME_CACHE_MISS = 0xC01C0018
+STATUS_FLT_NO_DEVICE_OBJECT = 0xC01C0019
+STATUS_FLT_VOLUME_ALREADY_MOUNTED = 0xC01C001A
+STATUS_FLT_ALREADY_ENLISTED = 0xC01C001B
+STATUS_FLT_CONTEXT_ALREADY_LINKED = 0xC01C001C
+STATUS_FLT_NO_WAITER_FOR_REPLY = 0xC01C0020
+STATUS_MONITOR_NO_DESCRIPTOR = 0xC01D0001
+STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT = 0xC01D0002
+STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM = 0xC01D0003
+STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK = 0xC01D0004
+STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED = 0xC01D0005
+STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK = 0xC01D0006
+STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK = 0xC01D0007
+STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA = 0xC01D0008
+STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK = 0xC01D0009
+STATUS_MONITOR_INVALID_MANUFACTURE_DATE = 0xC01D000A
+STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER = 0xC01E0000
+STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER = 0xC01E0001
+STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER = 0xC01E0002
+STATUS_GRAPHICS_ADAPTER_WAS_RESET = 0xC01E0003
+STATUS_GRAPHICS_INVALID_DRIVER_MODEL = 0xC01E0004
+STATUS_GRAPHICS_PRESENT_MODE_CHANGED = 0xC01E0005
+STATUS_GRAPHICS_PRESENT_OCCLUDED = 0xC01E0006
+STATUS_GRAPHICS_PRESENT_DENIED = 0xC01E0007
+STATUS_GRAPHICS_CANNOTCOLORCONVERT = 0xC01E0008
+STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED = 0xC01E000B
+STATUS_GRAPHICS_PRESENT_UNOCCLUDED = 0xC01E000C
+STATUS_GRAPHICS_NO_VIDEO_MEMORY = 0xC01E0100
+STATUS_GRAPHICS_CANT_LOCK_MEMORY = 0xC01E0101
+STATUS_GRAPHICS_ALLOCATION_BUSY = 0xC01E0102
+STATUS_GRAPHICS_TOO_MANY_REFERENCES = 0xC01E0103
+STATUS_GRAPHICS_TRY_AGAIN_LATER = 0xC01E0104
+STATUS_GRAPHICS_TRY_AGAIN_NOW = 0xC01E0105
+STATUS_GRAPHICS_ALLOCATION_INVALID = 0xC01E0106
+STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE = 0xC01E0107
+STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED = 0xC01E0108
+STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION = 0xC01E0109
+STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE = 0xC01E0110
+STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION = 0xC01E0111
+STATUS_GRAPHICS_ALLOCATION_CLOSED = 0xC01E0112
+STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE = 0xC01E0113
+STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE = 0xC01E0114
+STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE = 0xC01E0115
+STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST = 0xC01E0116
+STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE = 0xC01E0200
+STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY = 0xC01E0300
+STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED = 0xC01E0301
+STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED = 0xC01E0302
+STATUS_GRAPHICS_INVALID_VIDPN = 0xC01E0303
+STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE = 0xC01E0304
+STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET = 0xC01E0305
+STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED = 0xC01E0306
+STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET = 0xC01E0308
+STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET = 0xC01E0309
+STATUS_GRAPHICS_INVALID_FREQUENCY = 0xC01E030A
+STATUS_GRAPHICS_INVALID_ACTIVE_REGION = 0xC01E030B
+STATUS_GRAPHICS_INVALID_TOTAL_REGION = 0xC01E030C
+STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE = 0xC01E0310
+STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE = 0xC01E0311
+STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET = 0xC01E0312
+STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY = 0xC01E0313
+STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET = 0xC01E0314
+STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET = 0xC01E0315
+STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET = 0xC01E0316
+STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET = 0xC01E0317
+STATUS_GRAPHICS_TARGET_ALREADY_IN_SET = 0xC01E0318
+STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH = 0xC01E0319
+STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY = 0xC01E031A
+STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET = 0xC01E031B
+STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE = 0xC01E031C
+STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET = 0xC01E031D
+STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET = 0xC01E031F
+STATUS_GRAPHICS_STALE_MODESET = 0xC01E0320
+STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET = 0xC01E0321
+STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE = 0xC01E0322
+STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN = 0xC01E0323
+STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE = 0xC01E0324
+STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION = 0xC01E0325
+STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES = 0xC01E0326
+STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY = 0xC01E0327
+STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE = 0xC01E0328
+STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET = 0xC01E0329
+STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET = 0xC01E032A
+STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR = 0xC01E032B
+STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET = 0xC01E032C
+STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET = 0xC01E032D
+STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE = 0xC01E032E
+STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE = 0xC01E032F
+STATUS_GRAPHICS_RESOURCES_NOT_RELATED = 0xC01E0330
+STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE = 0xC01E0331
+STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE = 0xC01E0332
+STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET = 0xC01E0333
+STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER = 0xC01E0334
+STATUS_GRAPHICS_NO_VIDPNMGR = 0xC01E0335
+STATUS_GRAPHICS_NO_ACTIVE_VIDPN = 0xC01E0336
+STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY = 0xC01E0337
+STATUS_GRAPHICS_MONITOR_NOT_CONNECTED = 0xC01E0338
+STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY = 0xC01E0339
+STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE = 0xC01E033A
+STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE = 0xC01E033B
+STATUS_GRAPHICS_INVALID_STRIDE = 0xC01E033C
+STATUS_GRAPHICS_INVALID_PIXELFORMAT = 0xC01E033D
+STATUS_GRAPHICS_INVALID_COLORBASIS = 0xC01E033E
+STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE = 0xC01E033F
+STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY = 0xC01E0340
+STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT = 0xC01E0341
+STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE = 0xC01E0342
+STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN = 0xC01E0343
+STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL = 0xC01E0344
+STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION = 0xC01E0345
+STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED = 0xC01E0346
+STATUS_GRAPHICS_INVALID_GAMMA_RAMP = 0xC01E0347
+STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED = 0xC01E0348
+STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED = 0xC01E0349
+STATUS_GRAPHICS_MODE_NOT_IN_MODESET = 0xC01E034A
+STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON = 0xC01E034D
+STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE = 0xC01E034E
+STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE = 0xC01E034F
+STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS = 0xC01E0350
+STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING = 0xC01E0352
+STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED = 0xC01E0353
+STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS = 0xC01E0354
+STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT = 0xC01E0355
+STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM = 0xC01E0356
+STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN = 0xC01E0357
+STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT = 0xC01E0358
+STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED = 0xC01E0359
+STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION = 0xC01E035A
+STATUS_GRAPHICS_INVALID_CLIENT_TYPE = 0xC01E035B
+STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET = 0xC01E035C
+STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED = 0xC01E0400
+STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED = 0xC01E0401
+STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER = 0xC01E0430
+STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED = 0xC01E0431
+STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED = 0xC01E0432
+STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY = 0xC01E0433
+STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED = 0xC01E0434
+STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON = 0xC01E0435
+STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE = 0xC01E0436
+STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER = 0xC01E0438
+STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED = 0xC01E043B
+STATUS_GRAPHICS_OPM_NOT_SUPPORTED = 0xC01E0500
+STATUS_GRAPHICS_COPP_NOT_SUPPORTED = 0xC01E0501
+STATUS_GRAPHICS_UAB_NOT_SUPPORTED = 0xC01E0502
+STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS = 0xC01E0503
+STATUS_GRAPHICS_OPM_PARAMETER_ARRAY_TOO_SMALL = 0xC01E0504
+STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST = 0xC01E0505
+STATUS_GRAPHICS_PVP_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E0506
+STATUS_GRAPHICS_PVP_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E0507
+STATUS_GRAPHICS_PVP_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E0508
+STATUS_GRAPHICS_OPM_INVALID_POINTER = 0xC01E050A
+STATUS_GRAPHICS_OPM_INTERNAL_ERROR = 0xC01E050B
+STATUS_GRAPHICS_OPM_INVALID_HANDLE = 0xC01E050C
+STATUS_GRAPHICS_PVP_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E050D
+STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH = 0xC01E050E
+STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED = 0xC01E050F
+STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED = 0xC01E0510
+STATUS_GRAPHICS_PVP_HFS_FAILED = 0xC01E0511
+STATUS_GRAPHICS_OPM_INVALID_SRM = 0xC01E0512
+STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP = 0xC01E0513
+STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP = 0xC01E0514
+STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA = 0xC01E0515
+STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET = 0xC01E0516
+STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH = 0xC01E0517
+STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE = 0xC01E0518
+STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS = 0xC01E051A
+STATUS_GRAPHICS_OPM_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E051B
+STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS = 0xC01E051C
+STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST = 0xC01E051D
+STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR = 0xC01E051E
+STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS = 0xC01E051F
+STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED = 0xC01E0520
+STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST = 0xC01E0521
+STATUS_GRAPHICS_I2C_NOT_SUPPORTED = 0xC01E0580
+STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST = 0xC01E0581
+STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA = 0xC01E0582
+STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA = 0xC01E0583
+STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED = 0xC01E0584
+STATUS_GRAPHICS_DDCCI_INVALID_DATA = 0xC01E0585
+STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE = 0xC01E0586
+STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING = 0xC01E0587
+STATUS_GRAPHICS_MCA_INTERNAL_ERROR = 0xC01E0588
+STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND = 0xC01E0589
+STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH = 0xC01E058A
+STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM = 0xC01E058B
+STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE = 0xC01E058C
+STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS = 0xC01E058D
+STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED = 0xC01E05E0
+STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E05E1
+STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E05E2
+STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E05E3
+STATUS_GRAPHICS_INVALID_POINTER = 0xC01E05E4
+STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E05E5
+STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL = 0xC01E05E6
+STATUS_GRAPHICS_INTERNAL_ERROR = 0xC01E05E7
+STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E05E8
+STATUS_FVE_LOCKED_VOLUME = 0xC0210000
+STATUS_FVE_NOT_ENCRYPTED = 0xC0210001
+STATUS_FVE_BAD_INFORMATION = 0xC0210002
+STATUS_FVE_TOO_SMALL = 0xC0210003
+STATUS_FVE_FAILED_WRONG_FS = 0xC0210004
+STATUS_FVE_FAILED_BAD_FS = 0xC0210005
+STATUS_FVE_FS_NOT_EXTENDED = 0xC0210006
+STATUS_FVE_FS_MOUNTED = 0xC0210007
+STATUS_FVE_NO_LICENSE = 0xC0210008
+STATUS_FVE_ACTION_NOT_ALLOWED = 0xC0210009
+STATUS_FVE_BAD_DATA = 0xC021000A
+STATUS_FVE_VOLUME_NOT_BOUND = 0xC021000B
+STATUS_FVE_NOT_DATA_VOLUME = 0xC021000C
+STATUS_FVE_CONV_READ_ERROR = 0xC021000D
+STATUS_FVE_CONV_WRITE_ERROR = 0xC021000E
+STATUS_FVE_OVERLAPPED_UPDATE = 0xC021000F
+STATUS_FVE_FAILED_SECTOR_SIZE = 0xC0210010
+STATUS_FVE_FAILED_AUTHENTICATION = 0xC0210011
+STATUS_FVE_NOT_OS_VOLUME = 0xC0210012
+STATUS_FVE_KEYFILE_NOT_FOUND = 0xC0210013
+STATUS_FVE_KEYFILE_INVALID = 0xC0210014
+STATUS_FVE_KEYFILE_NO_VMK = 0xC0210015
+STATUS_FVE_TPM_DISABLED = 0xC0210016
+STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO = 0xC0210017
+STATUS_FVE_TPM_INVALID_PCR = 0xC0210018
+STATUS_FVE_TPM_NO_VMK = 0xC0210019
+STATUS_FVE_PIN_INVALID = 0xC021001A
+STATUS_FVE_AUTH_INVALID_APPLICATION = 0xC021001B
+STATUS_FVE_AUTH_INVALID_CONFIG = 0xC021001C
+STATUS_FVE_DEBUGGER_ENABLED = 0xC021001D
+STATUS_FVE_DRY_RUN_FAILED = 0xC021001E
+STATUS_FVE_BAD_METADATA_POINTER = 0xC021001F
+STATUS_FVE_OLD_METADATA_COPY = 0xC0210020
+STATUS_FVE_REBOOT_REQUIRED = 0xC0210021
+STATUS_FVE_RAW_ACCESS = 0xC0210022
+STATUS_FVE_RAW_BLOCKED = 0xC0210023
+STATUS_FVE_NO_FEATURE_LICENSE = 0xC0210026
+STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED = 0xC0210027
+STATUS_FVE_CONV_RECOVERY_FAILED = 0xC0210028
+STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG = 0xC0210029
+STATUS_FVE_VOLUME_TOO_SMALL = 0xC0210030
+STATUS_FWP_CALLOUT_NOT_FOUND = 0xC0220001
+STATUS_FWP_CONDITION_NOT_FOUND = 0xC0220002
+STATUS_FWP_FILTER_NOT_FOUND = 0xC0220003
+STATUS_FWP_LAYER_NOT_FOUND = 0xC0220004
+STATUS_FWP_PROVIDER_NOT_FOUND = 0xC0220005
+STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND = 0xC0220006
+STATUS_FWP_SUBLAYER_NOT_FOUND = 0xC0220007
+STATUS_FWP_NOT_FOUND = 0xC0220008
+STATUS_FWP_ALREADY_EXISTS = 0xC0220009
+STATUS_FWP_IN_USE = 0xC022000A
+STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS = 0xC022000B
+STATUS_FWP_WRONG_SESSION = 0xC022000C
+STATUS_FWP_NO_TXN_IN_PROGRESS = 0xC022000D
+STATUS_FWP_TXN_IN_PROGRESS = 0xC022000E
+STATUS_FWP_TXN_ABORTED = 0xC022000F
+STATUS_FWP_SESSION_ABORTED = 0xC0220010
+STATUS_FWP_INCOMPATIBLE_TXN = 0xC0220011
+STATUS_FWP_TIMEOUT = 0xC0220012
+STATUS_FWP_NET_EVENTS_DISABLED = 0xC0220013
+STATUS_FWP_INCOMPATIBLE_LAYER = 0xC0220014
+STATUS_FWP_KM_CLIENTS_ONLY = 0xC0220015
+STATUS_FWP_LIFETIME_MISMATCH = 0xC0220016
+STATUS_FWP_BUILTIN_OBJECT = 0xC0220017
+STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS = 0xC0220018
+STATUS_FWP_TOO_MANY_CALLOUTS = 0xC0220018
+STATUS_FWP_NOTIFICATION_DROPPED = 0xC0220019
+STATUS_FWP_TRAFFIC_MISMATCH = 0xC022001A
+STATUS_FWP_INCOMPATIBLE_SA_STATE = 0xC022001B
+STATUS_FWP_NULL_POINTER = 0xC022001C
+STATUS_FWP_INVALID_ENUMERATOR = 0xC022001D
+STATUS_FWP_INVALID_FLAGS = 0xC022001E
+STATUS_FWP_INVALID_NET_MASK = 0xC022001F
+STATUS_FWP_INVALID_RANGE = 0xC0220020
+STATUS_FWP_INVALID_INTERVAL = 0xC0220021
+STATUS_FWP_ZERO_LENGTH_ARRAY = 0xC0220022
+STATUS_FWP_NULL_DISPLAY_NAME = 0xC0220023
+STATUS_FWP_INVALID_ACTION_TYPE = 0xC0220024
+STATUS_FWP_INVALID_WEIGHT = 0xC0220025
+STATUS_FWP_MATCH_TYPE_MISMATCH = 0xC0220026
+STATUS_FWP_TYPE_MISMATCH = 0xC0220027
+STATUS_FWP_OUT_OF_BOUNDS = 0xC0220028
+STATUS_FWP_RESERVED = 0xC0220029
+STATUS_FWP_DUPLICATE_CONDITION = 0xC022002A
+STATUS_FWP_DUPLICATE_KEYMOD = 0xC022002B
+STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER = 0xC022002C
+STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER = 0xC022002D
+STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER = 0xC022002E
+STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT = 0xC022002F
+STATUS_FWP_INCOMPATIBLE_AUTH_METHOD = 0xC0220030
+STATUS_FWP_INCOMPATIBLE_DH_GROUP = 0xC0220031
+STATUS_FWP_EM_NOT_SUPPORTED = 0xC0220032
+STATUS_FWP_NEVER_MATCH = 0xC0220033
+STATUS_FWP_PROVIDER_CONTEXT_MISMATCH = 0xC0220034
+STATUS_FWP_INVALID_PARAMETER = 0xC0220035
+STATUS_FWP_TOO_MANY_SUBLAYERS = 0xC0220036
+STATUS_FWP_CALLOUT_NOTIFICATION_FAILED = 0xC0220037
+STATUS_FWP_INCOMPATIBLE_AUTH_CONFIG = 0xC0220038
+STATUS_FWP_INCOMPATIBLE_CIPHER_CONFIG = 0xC0220039
+STATUS_FWP_DUPLICATE_AUTH_METHOD = 0xC022003C
+STATUS_FWP_TCPIP_NOT_READY = 0xC0220100
+STATUS_FWP_INJECT_HANDLE_CLOSING = 0xC0220101
+STATUS_FWP_INJECT_HANDLE_STALE = 0xC0220102
+STATUS_FWP_CANNOT_PEND = 0xC0220103
+STATUS_NDIS_CLOSING = 0xC0230002
+STATUS_NDIS_BAD_VERSION = 0xC0230004
+STATUS_NDIS_BAD_CHARACTERISTICS = 0xC0230005
+STATUS_NDIS_ADAPTER_NOT_FOUND = 0xC0230006
+STATUS_NDIS_OPEN_FAILED = 0xC0230007
+STATUS_NDIS_DEVICE_FAILED = 0xC0230008
+STATUS_NDIS_MULTICAST_FULL = 0xC0230009
+STATUS_NDIS_MULTICAST_EXISTS = 0xC023000A
+STATUS_NDIS_MULTICAST_NOT_FOUND = 0xC023000B
+STATUS_NDIS_REQUEST_ABORTED = 0xC023000C
+STATUS_NDIS_RESET_IN_PROGRESS = 0xC023000D
+STATUS_NDIS_INVALID_PACKET = 0xC023000F
+STATUS_NDIS_INVALID_DEVICE_REQUEST = 0xC0230010
+STATUS_NDIS_ADAPTER_NOT_READY = 0xC0230011
+STATUS_NDIS_INVALID_LENGTH = 0xC0230014
+STATUS_NDIS_INVALID_DATA = 0xC0230015
+STATUS_NDIS_BUFFER_TOO_SHORT = 0xC0230016
+STATUS_NDIS_INVALID_OID = 0xC0230017
+STATUS_NDIS_ADAPTER_REMOVED = 0xC0230018
+STATUS_NDIS_UNSUPPORTED_MEDIA = 0xC0230019
+STATUS_NDIS_GROUP_ADDRESS_IN_USE = 0xC023001A
+STATUS_NDIS_FILE_NOT_FOUND = 0xC023001B
+STATUS_NDIS_ERROR_READING_FILE = 0xC023001C
+STATUS_NDIS_ALREADY_MAPPED = 0xC023001D
+STATUS_NDIS_RESOURCE_CONFLICT = 0xC023001E
+STATUS_NDIS_MEDIA_DISCONNECTED = 0xC023001F
+STATUS_NDIS_INVALID_ADDRESS = 0xC0230022
+STATUS_NDIS_PAUSED = 0xC023002A
+STATUS_NDIS_INTERFACE_NOT_FOUND = 0xC023002B
+STATUS_NDIS_UNSUPPORTED_REVISION = 0xC023002C
+STATUS_NDIS_INVALID_PORT = 0xC023002D
+STATUS_NDIS_INVALID_PORT_STATE = 0xC023002E
+STATUS_NDIS_LOW_POWER_STATE = 0xC023002F
+STATUS_NDIS_NOT_SUPPORTED = 0xC02300BB
+STATUS_NDIS_OFFLOAD_POLICY = 0xC023100F
+STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED = 0xC0231012
+STATUS_NDIS_OFFLOAD_PATH_REJECTED = 0xC0231013
+STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED = 0xC0232000
+STATUS_NDIS_DOT11_MEDIA_IN_USE = 0xC0232001
+STATUS_NDIS_DOT11_POWER_STATE_INVALID = 0xC0232002
+STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL = 0xC0232003
+STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL = 0xC0232004
+STATUS_IPSEC_BAD_SPI = 0xC0360001
+STATUS_IPSEC_SA_LIFETIME_EXPIRED = 0xC0360002
+STATUS_IPSEC_WRONG_SA = 0xC0360003
+STATUS_IPSEC_REPLAY_CHECK_FAILED = 0xC0360004
+STATUS_IPSEC_INVALID_PACKET = 0xC0360005
+STATUS_IPSEC_INTEGRITY_CHECK_FAILED = 0xC0360006
+STATUS_IPSEC_CLEAR_TEXT_DROP = 0xC0360007
+STATUS_IPSEC_AUTH_FIREWALL_DROP = 0xC0360008
+STATUS_IPSEC_THROTTLE_DROP = 0xC0360009
+STATUS_IPSEC_DOSP_BLOCK = 0xC0368000
+STATUS_IPSEC_DOSP_RECEIVED_MULTICAST = 0xC0368001
+STATUS_IPSEC_DOSP_INVALID_PACKET = 0xC0368002
+STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED = 0xC0368003
+STATUS_IPSEC_DOSP_MAX_ENTRIES = 0xC0368004
+STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 0xC0368005
+STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 0xC0368006
+STATUS_VOLMGR_MIRROR_NOT_SUPPORTED = 0xC038005B
+STATUS_VOLMGR_RAID5_NOT_SUPPORTED = 0xC038005C
+STATUS_VIRTDISK_PROVIDER_NOT_FOUND = 0xC03A0014
+STATUS_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015
+STATUS_VHD_PARENT_VHD_ACCESS_DENIED = 0xC03A0016
+STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH = 0xC03A0017
+STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED = 0xC03A0018
+STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT = 0xC03A0019
diff --git a/tests/python_dependencies/impacket/ntlm.py b/tests/python_dependencies/impacket/ntlm.py
new file mode 100644
index 00000000..8376644b
--- /dev/null
+++ b/tests/python_dependencies/impacket/ntlm.py
@@ -0,0 +1,971 @@
+# Copyright (c) 2003-2016 CORE Security Technologies:
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+import base64
+import struct
+import calendar
+import time
+import hashlib
+import random
+import string
+import binascii
+
+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
+# NTLMv2 by default and fall back to NTLMv1 (with EXTENDED_SESSION_SECURITY or not)
+# Check the following links:
+# http://davenport.sourceforge.net/ntlm.html
+# http://blogs.msdn.com/b/openspecification/archive/2010/04/20/ntlm-keys-and-sundry-stuff.aspx
+# http://social.msdn.microsoft.com/Forums/en-US/os_interopscenarios/thread/c8f488ed-1b96-4e06-bd65-390aa41138d1/
+# So I'm setting a global variable to control this, this can also be set programmatically
+
+USE_NTLMv2 = True # if false will fall back to NTLMv1 (or NTLMv1 with ESS a.k.a NTLM2)
+
+
+def computeResponse(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='',
+ use_ntlmv2=USE_NTLMv2):
+ if use_ntlmv2:
+ return computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName, domain, user, password,
+ lmhash, nthash, use_ntlmv2=use_ntlmv2)
+ else:
+ return computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password,
+ lmhash, nthash, use_ntlmv2=use_ntlmv2)
+try:
+ POW = None
+ from Crypto.Cipher import ARC4
+ from Crypto.Cipher import DES
+ from Crypto.Hash import MD4
+except Exception:
+ try:
+ import POW
+ except Exception:
+ LOG.critical("Warning: You don't have any crypto installed. You need PyCrypto")
+ LOG.critical("See http://www.pycrypto.org/")
+
+NTLM_AUTH_NONE = 1
+NTLM_AUTH_CONNECT = 2
+NTLM_AUTH_CALL = 3
+NTLM_AUTH_PKT = 4
+NTLM_AUTH_PKT_INTEGRITY = 5
+NTLM_AUTH_PKT_PRIVACY = 6
+
+# If set, requests 56-bit encryption. If the client sends NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN
+# with NTLMSSP_NEGOTIATE_56 to the server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_56 to
+# the client in the CHALLENGE_MESSAGE. Otherwise it is ignored. If both NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128
+# are requested and supported by the client and server, NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 will both be
+# returned to the client. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD set NTLMSSP_NEGOTIATE_56 if it is
+# supported. An alternate name for this field is NTLMSSP_NEGOTIATE_56.
+NTLMSSP_NEGOTIATE_56 = 0x80000000
+
+# If set, requests an explicit key exchange. This capability SHOULD be used because it improves security for message
+# integrity or confidentiality. See sections 3.2.5.1.2, 3.2.5.2.1, and 3.2.5.2.2 for details. An alternate name for
+# this field is NTLMSSP_NEGOTIATE_KEY_EXCH.
+NTLMSSP_NEGOTIATE_KEY_EXCH = 0x40000000
+
+# If set, requests 128-bit session key negotiation. An alternate name for this field is NTLMSSP_NEGOTIATE_128.
+# If the client sends NTLMSSP_NEGOTIATE_128 to the server in the NEGOTIATE_MESSAGE, the server MUST return
+# NTLMSSP_NEGOTIATE_128 to the client in the CHALLENGE_MESSAGE only if the client sets NTLMSSP_NEGOTIATE_SEAL or
+# NTLMSSP_NEGOTIATE_SIGN. Otherwise it is ignored. If both NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 are
+# requested and supported by the client and server, NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 will both be
+# returned to the client. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD set NTLMSSP_NEGOTIATE_128 if it
+# is supported. An alternate name for this field is NTLMSSP_NEGOTIATE_128
+NTLMSSP_NEGOTIATE_128 = 0x20000000
+
+NTLMSSP_RESERVED_1 = 0x10000000
+NTLMSSP_RESERVED_2 = 0x08000000
+NTLMSSP_RESERVED_3 = 0x04000000
+
+# If set, requests the protocol version number. The data corresponding to this flag is provided in the Version field
+# of the NEGOTIATE_MESSAGE, the CHALLENGE_MESSAGE, and the AUTHENTICATE_MESSAGE.<22> An alternate name for this field
+# is NTLMSSP_NEGOTIATE_VERSION
+NTLMSSP_NEGOTIATE_VERSION = 0x02000000
+NTLMSSP_RESERVED_4 = 0x01000000
+
+# If set, indicates that the TargetInfo fields in the CHALLENGE_MESSAGE (section 2.2.1.2) are populated.
+# An alternate name for this field is NTLMSSP_NEGOTIATE_TARGET_INFO.
+NTLMSSP_NEGOTIATE_TARGET_INFO = 0x00800000
+
+# If set, requests the usage of the LMOWF (section 3.3). An alternate name for this field is
+# NTLMSSP_REQUEST_NON_NT_SESSION_KEY.
+NTLMSSP_REQUEST_NON_NT_SESSION_KEY = 0x00400000
+NTLMSSP_RESERVED_5 = 0x00200000
+
+# If set, requests an identify level token. An alternate name for this field is NTLMSSP_NEGOTIATE_IDENTIFY
+NTLMSSP_NEGOTIATE_IDENTIFY = 0x00100000
+
+# If set, requests usage of the NTLM v2 session security. 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. NTLMSSP_NEGOTIATE_LM_KEY and
+# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are mutually exclusive. If both NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+# and NTLMSSP_NEGOTIATE_LM_KEY are requested, NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY alone MUST be returned to the
+# client. NTLM v2 authentication session key generation MUST be supported by both the client and the DC in order to be
+# used, and extended session security signing and sealing requires support from the client and the server in order to
+# be used.<23> An alternate name for this field is NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY = 0x00080000
+NTLMSSP_NEGOTIATE_NTLM2 = 0x00080000
+NTLMSSP_TARGET_TYPE_SHARE = 0x00040000
+
+# If set, TargetName MUST be a server name. The data corresponding to this flag is provided by the server in the
+# TargetName field of the CHALLENGE_MESSAGE. If this bit is set, then NTLMSSP_TARGET_TYPE_DOMAIN MUST NOT be set.
+# This flag MUST be ignored in the NEGOTIATE_MESSAGE and the AUTHENTICATE_MESSAGE. An alternate name for this field
+# is NTLMSSP_TARGET_TYPE_SERVER
+NTLMSSP_TARGET_TYPE_SERVER = 0x00020000
+
+# If set, TargetName MUST be a domain name. The data corresponding to this flag is provided by the server in the
+# TargetName field of the CHALLENGE_MESSAGE. If set, then NTLMSSP_TARGET_TYPE_SERVER MUST NOT be set. This flag MUST
+# be ignored in the NEGOTIATE_MESSAGE and the AUTHENTICATE_MESSAGE. An alternate name for this field is
+# NTLMSSP_TARGET_TYPE_DOMAIN.
+NTLMSSP_TARGET_TYPE_DOMAIN = 0x00010000
+
+# If set, requests the presence of a signature block on all messages. NTLMSSP_NEGOTIATE_ALWAYS_SIGN MUST be set in the
+# NEGOTIATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. NTLMSSP_NEGOTIATE_ALWAYS_SIGN is overridden
+# by NTLMSSP_NEGOTIATE_SIGN and NTLMSSP_NEGOTIATE_SEAL, if they are supported. An alternate name for this field is
+# NTLMSSP_NEGOTIATE_ALWAYS_SIGN.
+NTLMSSP_NEGOTIATE_ALWAYS_SIGN = 0x00008000 # forces the other end to sign packets
+NTLMSSP_RESERVED_6 = 0x00004000
+
+# This flag indicates whether the Workstation field is present. If this flag is not set, the Workstation field MUST be
+# ignored. If this flag is set, the length field of the Workstation field specifies whether the workstation name is
+# nonempty or not.<24> An alternate name for this field is NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED.
+NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED = 0x00002000
+
+# If set, the domain name is provided (section 2.2.1.1).<25> An alternate name for this field is
+# NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED = 0x00001000
+NTLMSSP_RESERVED_7 = 0x00000800
+
+
+# If set, LM authentication is not allowed and only NT authentication is used.
+NTLMSSP_NEGOTIATE_NT_ONLY = 0x00000400
+
+# If set, requests usage of the NTLM v1 session security protocol. NTLMSSP_NEGOTIATE_NTLM MUST be set in the
+# NEGOTIATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. An alternate name for this field is
+# NTLMSSP_NEGOTIATE_NTLM
+NTLMSSP_NEGOTIATE_NTLM = 0x00000200
+NTLMSSP_RESERVED_8 = 0x00000100
+
+# If set, requests LAN Manager (LM) session key computation. NTLMSSP_NEGOTIATE_LM_KEY and
+# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are mutually exclusive. If both NTLMSSP_NEGOTIATE_LM_KEY and
+# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are requested, NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY alone MUST be
+# returned to the client. NTLM v2 authentication session key generation MUST be supported by both the client and the
+# DC in order to be used, and extended session security signing and sealing requires support from the client and the
+# server to be used. An alternate name for this field is NTLMSSP_NEGOTIATE_LM_KEY.
+NTLMSSP_NEGOTIATE_LM_KEY = 0x00000080
+
+# If set, requests connectionless authentication. If NTLMSSP_NEGOTIATE_DATAGRAM is set, then NTLMSSP_NEGOTIATE_KEY_EXCH
+# MUST always be set in the AUTHENTICATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. An alternate
+# name for this field is NTLMSSP_NEGOTIATE_DATAGRAM.
+NTLMSSP_NEGOTIATE_DATAGRAM = 0x00000040
+
+# If set, requests session key negotiation for message confidentiality. If the client sends NTLMSSP_NEGOTIATE_SEAL to
+# the server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_SEAL to the client in the
+# CHALLENGE_MESSAGE. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD always set NTLMSSP_NEGOTIATE_56 and
+# NTLMSSP_NEGOTIATE_128, if they are supported. An alternate name for this field is NTLMSSP_NEGOTIATE_SEAL.
+NTLMSSP_NEGOTIATE_SEAL = 0x00000020
+
+# If set, requests session key negotiation for message signatures. If the client sends NTLMSSP_NEGOTIATE_SIGN to the
+# server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_SIGN to the client in the CHALLENGE_MESSAGE.
+# An alternate name for this field is NTLMSSP_NEGOTIATE_SIGN.
+NTLMSSP_NEGOTIATE_SIGN = 0x00000010 # means packet is signed, if verifier is wrong it fails
+NTLMSSP_RESERVED_9 = 0x00000008
+
+# If set, a TargetName field of the CHALLENGE_MESSAGE (section 2.2.1.2) MUST be supplied. An alternate name for this
+# field is NTLMSSP_REQUEST_TARGET.
+NTLMSSP_REQUEST_TARGET = 0x00000004
+
+# If set, requests OEM character set encoding. An alternate name for this field is NTLM_NEGOTIATE_OEM. See bit A for
+# details.
+NTLM_NEGOTIATE_OEM = 0x00000002
+
+# If set, requests Unicode character set encoding. An alternate name for this field is NTLMSSP_NEGOTIATE_UNICODE.
+NTLMSSP_NEGOTIATE_UNICODE = 0x00000001
+
+# AV_PAIR constants
+NTLMSSP_AV_EOL = 0x00
+NTLMSSP_AV_HOSTNAME = 0x01
+NTLMSSP_AV_DOMAINNAME = 0x02
+NTLMSSP_AV_DNS_HOSTNAME = 0x03
+NTLMSSP_AV_DNS_DOMAINNAME = 0x04
+NTLMSSP_AV_DNS_TREENAME = 0x05
+NTLMSSP_AV_FLAGS = 0x06
+NTLMSSP_AV_TIME = 0x07
+NTLMSSP_AV_RESTRICTIONS = 0x08
+NTLMSSP_AV_TARGET_NAME = 0x09
+NTLMSSP_AV_CHANNEL_BINDINGS = 0x0a
+
+class AV_PAIRS():
+ def __init__(self, data = None):
+ self.fields = {}
+ if data is not None:
+ self.fromString(data)
+
+ def __setitem__(self,key,value):
+ self.fields[key] = (len(value),value)
+
+ def __getitem__(self, key):
+ if self.fields.has_key(key):
+ return self.fields[key]
+ return None
+
+ def __delitem__(self, key):
+ del self.fields[key]
+
+ def __len__(self):
+ return len(self.getData())
+
+ def __str__(self):
+ return len(self.getData())
+
+ def fromString(self, data):
+ tInfo = data
+ fType = 0xff
+ while fType is not NTLMSSP_AV_EOL:
+ fType = struct.unpack('<H',tInfo[:struct.calcsize('<H')])[0]
+ tInfo = tInfo[struct.calcsize('<H'):]
+ length = struct.unpack('<H',tInfo[:struct.calcsize('<H')])[0]
+ tInfo = tInfo[struct.calcsize('<H'):]
+ content = tInfo[:length]
+ self.fields[fType]=(length,content)
+ tInfo = tInfo[length:]
+
+ def dump(self):
+ for i in self.fields.keys():
+ print "%s: {%r}" % (i,self[i])
+
+ def getData(self):
+ if self.fields.has_key(NTLMSSP_AV_EOL):
+ 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)
+
+ return ans
+
+class NTLMAuthMixin:
+ def get_os_version(self):
+ if self['os_version'] == '':
+ return None
+ else:
+ mayor_v = struct.unpack('B',self['os_version'][0])[0]
+ 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 = (
+ ('','"NTLMSSP\x00'),
+ ('message_type','<L=1'),
+ ('flags','<L'),
+ ('domain_len','<H-domain_name'),
+ ('domain_max_len','<H-domain_name'),
+ ('domain_offset','<L=0'),
+ ('host_len','<H-host_name'),
+ ('host_maxlen','<H-host_name'),
+ ('host_offset','<L=0'),
+ ('os_version',':'),
+ ('host_name',':'),
+ ('domain_name',':'))
+
+ def __init__(self):
+ Structure.__init__(self)
+ self['flags']= (
+ NTLMSSP_NEGOTIATE_128 |
+ NTLMSSP_NEGOTIATE_KEY_EXCH|
+ # NTLMSSP_LM_KEY |
+ NTLMSSP_NEGOTIATE_NTLM |
+ NTLMSSP_NEGOTIATE_UNICODE |
+ # NTLMSSP_ALWAYS_SIGN |
+ NTLMSSP_NEGOTIATE_SIGN |
+ NTLMSSP_NEGOTIATE_SEAL |
+ # NTLMSSP_TARGET |
+ 0)
+ 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
+ if len(self.fields['domain_name']) > 0:
+ self['flags'] |= NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
+ if len(self.fields['os_version']) > 0:
+ self['flags'] |= NTLMSSP_NEGOTIATE_VERSION
+ if (self['flags'] & NTLMSSP_NEGOTIATE_VERSION) == NTLMSSP_NEGOTIATE_VERSION:
+ version_len = 8
+ else:
+ version_len = 0
+ if (self['flags'] & NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED) == NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED:
+ self['host_offset']=32 + version_len
+ if (self['flags'] & NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED) == NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED:
+ self['domain_offset']=32+len(self['host_name']) + version_len
+ return Structure.getData(self)
+
+ def fromString(self,data):
+ Structure.fromString(self,data)
+
+ domain_offset = self['domain_offset']
+ domain_end = self['domain_len'] + domain_offset
+ self['domain_name'] = data[ domain_offset : domain_end ]
+
+ host_offset = self['host_offset']
+ host_end = self['host_len'] + host_offset
+ self['host_name'] = data[ host_offset : host_end ]
+
+ hasOsInfo = self['flags'] & NTLMSSP_NEGOTIATE_VERSION
+ if len(data) >= 36 and hasOsInfo:
+ self['os_version'] = data[32:40]
+ else:
+ self['os_version'] = ''
+
+class NTLMAuthChallenge(Structure):
+
+ structure = (
+ ('','"NTLMSSP\x00'),
+ ('message_type','<L=2'),
+ ('domain_len','<H-domain_name'),
+ ('domain_max_len','<H-domain_name'),
+ ('domain_offset','<L=40'),
+ ('flags','<L=0'),
+ ('challenge','8s'),
+ ('reserved','8s=""'),
+ ('TargetInfoFields_len','<H-TargetInfoFields'),
+ ('TargetInfoFields_max_len','<H-TargetInfoFields'),
+ ('TargetInfoFields_offset','<L'),
+ ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
+ ('Version',':'),
+ ('domain_name',':'),
+ ('TargetInfoFields',':'))
+
+ def checkVersion(self, flags):
+ if flags is not None:
+ if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
+ return 0
+ return 8
+
+ def getData(self):
+ if self['TargetInfoFields'] is not None and type(self['TargetInfoFields']) is not str:
+ raw_av_fields = self['TargetInfoFields'].getData()
+ self['TargetInfoFields'] = raw_av_fields
+ return Structure.getData(self)
+
+ def fromString(self,data):
+ Structure.fromString(self,data)
+ # Just in case there's more data after the TargetInfoFields
+ 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']])
+ # self['TargetInfoFields'] = av_pairs
+
+ return self
+
+class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
+
+ structure = (
+ ('','"NTLMSSP\x00'),
+ ('message_type','<L=3'),
+ ('lanman_len','<H-lanman'),
+ ('lanman_max_len','<H-lanman'),
+ ('lanman_offset','<L'),
+ ('ntlm_len','<H-ntlm'),
+ ('ntlm_max_len','<H-ntlm'),
+ ('ntlm_offset','<L'),
+ ('domain_len','<H-domain_name'),
+ ('domain_max_len','<H-domain_name'),
+ ('domain_offset','<L'),
+ ('user_len','<H-user_name'),
+ ('user_max_len','<H-user_name'),
+ ('user_offset','<L'),
+ ('host_len','<H-host_name'),
+ ('host_max_len','<H-host_name'),
+ ('host_offset','<L'),
+ ('session_key_len','<H-session_key'),
+ ('session_key_max_len','<H-session_key'),
+ ('session_key_offset','<L'),
+ ('flags','<L'),
+ ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
+ ('Version',':=""'),
+ ('MICLen','_-MIC','self.checkMIC(self["flags"])'),
+ ('MIC',':=""'),
+ ('domain_name',':'),
+ ('user_name',':'),
+ ('host_name',':'),
+ ('lanman',':'),
+ ('ntlm',':'),
+ ('session_key',':'))
+
+ def __init__(self, username = '', password = '', challenge = '', lmhash = '', nthash = '', flags = 0):
+ Structure.__init__(self)
+ self['session_key']=''
+ self['user_name']=username.encode('utf-16le')
+ self['domain_name']='' #"CLON".encode('utf-16le')
+ self['host_name']='' #"BETS".encode('utf-16le')
+ self['flags'] = ( #authResp['flags']
+ # we think (beto & gera) that his flags force a memory conten leakage when a windows 2000 answers using uninitializaed verifiers
+ NTLMSSP_NEGOTIATE_128 |
+ NTLMSSP_NEGOTIATE_KEY_EXCH|
+ # NTLMSSP_LM_KEY |
+ NTLMSSP_NEGOTIATE_NTLM |
+ NTLMSSP_NEGOTIATE_UNICODE |
+ # NTLMSSP_ALWAYS_SIGN |
+ NTLMSSP_NEGOTIATE_SIGN |
+ NTLMSSP_NEGOTIATE_SEAL |
+ # NTLMSSP_TARGET |
+ 0)
+ # Here we do the stuff
+ if username and ( lmhash != '' or nthash != ''):
+ self['lanman'] = get_ntlmv1_response(lmhash, challenge)
+ self['ntlm'] = get_ntlmv1_response(nthash, challenge)
+ elif (username and password):
+ lmhash = compute_lmhash(password)
+ nthash = compute_nthash(password)
+ self['lanman']=get_ntlmv1_response(lmhash, challenge)
+ self['ntlm']=get_ntlmv1_response(nthash, challenge) # This is not used for LM_KEY nor NTLM_KEY
+ else:
+ self['lanman'] = ''
+ self['ntlm'] = ''
+ if not self['host_name']:
+ self['host_name'] = 'NULL'.encode('utf-16le') # for NULL session there must be a hostname
+
+ def checkVersion(self, flags):
+ if flags is not None:
+ if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
+ return 0
+ return 8
+
+ def checkMIC(self, flags):
+ # TODO: Find a proper way to check the MIC is in there
+ if flags is not None:
+ 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'])
+ self['host_offset']=self['user_offset']+len(self['user_name'])
+ self['lanman_offset']=self['host_offset']+len(self['host_name'])
+ self['ntlm_offset']=self['lanman_offset']+len(self['lanman'])
+ self['session_key_offset']=self['ntlm_offset']+len(self['ntlm'])
+ return Structure.getData(self)
+
+ def fromString(self,data):
+ Structure.fromString(self,data)
+ # [MS-NLMP] page 27
+ # 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']
+ domain_end = self['domain_len'] + domain_offset
+ self['domain_name'] = data[ domain_offset : domain_end ]
+
+ host_offset = self['host_offset']
+ host_end = self['host_len'] + host_offset
+ self['host_name'] = data[ host_offset: host_end ]
+
+ user_offset = self['user_offset']
+ 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
+ self['ntlm'] = data[ ntlm_offset : ntlm_end ]
+
+ lanman_offset = self['lanman_offset']
+ lanman_end = self['lanman_len'] + lanman_offset
+ self['lanman'] = data[ lanman_offset : lanman_end]
+
+ #if len(data) >= 36:
+ # self['os_version'] = data[32:36]
+ #else:
+ # self['os_version'] = ''
+
+class ImpacketStructure(Structure):
+ def set_parent(self, other):
+ self.parent = other
+
+ def get_packet(self):
+ return str(self)
+
+ def get_size(self):
+ return len(self)
+
+class ExtendedOrNotMessageSignature(Structure):
+ def __init__(self, flags = 0, **kargs):
+ if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ self.structure = self.extendedMessageSignature
+ else:
+ self.structure = self.MessageSignature
+ return Structure.__init__(self, **kargs)
+
+class NTLMMessageSignature(ExtendedOrNotMessageSignature):
+ extendedMessageSignature = (
+ ('Version','<L=1'),
+ ('Checksum','<q'),
+ ('SeqNum','<i'),
+ )
+
+ MessageSignature = (
+ ('Version','<L=1'),
+ ('RandomPad','<i=0'),
+ ('Checksum','<i'),
+ ('SeqNum','<i'),
+ )
+
+KNOWN_DES_INPUT = "KGS!@#$%"
+
+def __expand_DES_key( key):
+ # Expand the key from a 7-byte password key into a 8-byte DES key
+ key = key[:7]
+ key += '\x00'*(7-len(key))
+ s = chr(((ord(key[0]) >> 1) & 0x7f) << 1)
+ s = s + chr(((ord(key[0]) & 0x01) << 6 | ((ord(key[1]) >> 2) & 0x3f)) << 1)
+ s = s + chr(((ord(key[1]) & 0x03) << 5 | ((ord(key[2]) >> 3) & 0x1f)) << 1)
+ s = s + chr(((ord(key[2]) & 0x07) << 4 | ((ord(key[3]) >> 4) & 0x0f)) << 1)
+ s = s + chr(((ord(key[3]) & 0x0f) << 3 | ((ord(key[4]) >> 5) & 0x07)) << 1)
+ s = s + chr(((ord(key[4]) & 0x1f) << 2 | ((ord(key[5]) >> 6) & 0x03)) << 1)
+ s = s + chr(((ord(key[5]) & 0x3f) << 1 | ((ord(key[6]) >> 7) & 0x01)) << 1)
+ s = s + chr((ord(key[6]) & 0x7f) << 1)
+ return s
+
+def __DES_block(key, msg):
+ if POW:
+ cipher = POW.Symmetric(POW.DES_ECB)
+ cipher.encryptInit(__expand_DES_key(key))
+ return cipher.update(msg)
+ else:
+ cipher = DES.new(__expand_DES_key(key),DES.MODE_ECB)
+ return cipher.encrypt(msg)
+
+def ntlmssp_DES_encrypt(key, challenge):
+ answer = __DES_block(key[:7], challenge)
+ answer += __DES_block(key[7:14], challenge)
+ answer += __DES_block(key[14:], challenge)
+ return answer
+
+# High level functions to use NTLMSSP
+
+def getNTLMSSPType1(workstation='', domain='', signingRequired = False, use_ntlmv2 = USE_NTLMv2):
+ # Let's do some encoding checks before moving on. Kind of dirty, but found effective when dealing with
+ # international characters.
+ import sys
+ encoding = sys.getfilesystemencoding()
+ if encoding is not None:
+ try:
+ workstation.encode('utf-16le')
+ except:
+ workstation = workstation.decode(encoding)
+ try:
+ domain.encode('utf-16le')
+ except:
+ domain = domain.decode(encoding)
+
+ # Let's prepare a Type 1 NTLMSSP Message
+ auth = NTLMAuthNegotiate()
+ auth['flags']=0
+ if signingRequired:
+ auth['flags'] = NTLMSSP_NEGOTIATE_KEY_EXCH | NTLMSSP_NEGOTIATE_SIGN | NTLMSSP_NEGOTIATE_ALWAYS_SIGN | NTLMSSP_NEGOTIATE_SEAL
+ if use_ntlmv2:
+ auth['flags'] |= NTLMSSP_NEGOTIATE_TARGET_INFO
+ auth['flags'] |= NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY | NTLMSSP_NEGOTIATE_UNICODE | NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_56
+ auth['domain_name'] = domain.encode('utf-16le')
+ return auth
+
+def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash = '', use_ntlmv2 = USE_NTLMv2):
+
+ # Let's do some encoding checks before moving on. Kind of dirty, but found effective when dealing with
+ # international characters.
+ import sys
+ encoding = sys.getfilesystemencoding()
+ if encoding is not None:
+ try:
+ user.encode('utf-16le')
+ except:
+ user = user.decode(encoding)
+ try:
+ password.encode('utf-16le')
+ except:
+ password = password.decode(encoding)
+ try:
+ domain.encode('utf-16le')
+ except:
+ domain = user.decode(encoding)
+
+ ntlmChallenge = NTLMAuthChallenge(type2)
+
+ # Let's start with the original flags sent in the type1 message
+ responseFlags = type1['flags']
+
+ # 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)])
+
+ serverName = ntlmChallenge['TargetInfoFields']
+
+ ntResponse, lmResponse, sessionBaseKey = computeResponse(ntlmChallenge['flags'], ntlmChallenge['challenge'], clientChallenge, serverName, domain, user, password, lmhash, nthash, use_ntlmv2 )
+
+ # Let's check the return flags
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY) == 0:
+ # No extended session security, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_128 ) == 0:
+ # No support for 128 key len, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_128
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH) == 0:
+ # No key exchange supported, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_KEY_EXCH
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_SEAL) == 0:
+ # No sign available, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_SEAL
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_SIGN) == 0:
+ # No sign available, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_SIGN
+ if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_ALWAYS_SIGN) == 0:
+ # No sign available, taking it out
+ responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_ALWAYS_SIGN
+
+ keyExchangeKey = KXKEY(ntlmChallenge['flags'],sessionBaseKey, lmResponse, ntlmChallenge['challenge'], password, lmhash, nthash,use_ntlmv2)
+
+ # Special case for anonymous login
+ if user == '' and password == '' and lmhash == '' and nthash == '':
+ keyExchangeKey = '\x00'*16
+
+ # If we set up key exchange, let's fill the right variables
+ 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 = "A"*16
+ #print "keyExchangeKey %r" % keyExchangeKey
+ # Let's generate the right session key based on the challenge flags
+ #if responseFlags & NTLMSSP_NTLM2_KEY:
+ # Extended session security enabled
+ # if responseFlags & NTLMSSP_KEY_128:
+ # Full key
+ # exportedSessionKey = exportedSessionKey
+ # elif responseFlags & NTLMSSP_KEY_56:
+ # Only 56-bit key
+ # exportedSessionKey = exportedSessionKey[:7]
+ # else:
+ # exportedSessionKey = exportedSessionKey[:5]
+ #elif responseFlags & NTLMSSP_KEY_56:
+ # No extended session security, just 56 bits key
+ # exportedSessionKey = exportedSessionKey[:7] + '\xa0'
+ #else:
+ # exportedSessionKey = exportedSessionKey[:5] + '\xe5\x38\xb0'
+
+ encryptedRandomSessionKey = generateEncryptedSessionKey(keyExchangeKey, exportedSessionKey)
+ else:
+ encryptedRandomSessionKey = None
+ # [MS-NLMP] page 46
+ exportedSessionKey = keyExchangeKey
+
+ ntlmChallengeResponse['flags'] = responseFlags
+ ntlmChallengeResponse['domain_name'] = domain.encode('utf-16le')
+ ntlmChallengeResponse['lanman'] = lmResponse
+ ntlmChallengeResponse['ntlm'] = ntResponse
+ if encryptedRandomSessionKey is not None:
+ ntlmChallengeResponse['session_key'] = encryptedRandomSessionKey
+
+ return ntlmChallengeResponse, exportedSessionKey
+
+
+# NTLMv1 Algorithm
+
+def generateSessionKeyV1(password, lmhash, nthash):
+ if POW:
+ hash = POW.Digest(POW.MD4_DIGEST)
+ 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 == ''):
+ # Special case for anonymous authentication
+ lmResponse = ''
+ ntResponse = ''
+ else:
+ lmhash = LMOWFv1(password, lmhash, nthash)
+ nthash = NTOWFv1(password, lmhash, nthash)
+ if flags & NTLMSSP_NEGOTIATE_LM_KEY:
+ ntResponse = ''
+ lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
+ elif flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ md5 = hashlib.new('md5')
+ chall = (serverChallenge + clientChallenge)
+ md5.update(chall)
+ ntResponse = ntlmssp_DES_encrypt(nthash, md5.digest()[:8])
+ lmResponse = clientChallenge + '\x00'*16
+ else:
+ ntResponse = get_ntlmv1_response(nthash,serverChallenge)
+ lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
+
+ sessionBaseKey = generateSessionKeyV1(password, lmhash, nthash)
+ return ntResponse, lmResponse, sessionBaseKey
+
+def compute_lmhash(password):
+ # This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
+ password = password.upper()
+ lmhash = __DES_block(password[:7], KNOWN_DES_INPUT)
+ lmhash += __DES_block(password[7:14], KNOWN_DES_INPUT)
+ return lmhash
+
+def NTOWFv1(password, lmhash = '', nthash=''):
+ if nthash != '':
+ return nthash
+ return compute_nthash(password)
+
+def LMOWFv1(password, lmhash = '', nthash=''):
+ if lmhash != '':
+ return lmhash
+ return compute_lmhash(password)
+
+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 UnicodeDecodeError:
+ import sys
+ password = password.decode(sys.getfilesystemencoding()).encode('utf_16le')
+
+ if POW:
+ hash = POW.Digest(POW.MD4_DIGEST)
+ else:
+ hash = MD4.new()
+ hash.update(password)
+ return hash.digest()
+
+def get_ntlmv1_response(key, challenge):
+ return ntlmssp_DES_encrypt(key, challenge)
+
+# NTLMv2 Algorithm - as described in MS-NLMP Section 3.3.2
+
+# Crypto Stuff
+
+def MAC(flags, handle, signingKey, seqNum, message):
+ # [MS-NLMP] Section 3.4.4
+ # Returns the right messageSignature depending on the flags
+ messageSignature = NTLMMessageSignature(flags)
+ if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ if flags & NTLMSSP_NEGOTIATE_KEY_EXCH:
+ messageSignature['Version'] = 1
+ messageSignature['Checksum'] = struct.unpack('<q',handle(hmac_md5(signingKey, struct.pack('<i',seqNum)+message)[:8]))[0]
+ messageSignature['SeqNum'] = seqNum
+ seqNum += 1
+ else:
+ messageSignature['Version'] = 1
+ messageSignature['Checksum'] = struct.unpack('<q',hmac_md5(signingKey, struct.pack('<i',seqNum)+message)[:8])[0]
+ messageSignature['SeqNum'] = seqNum
+ seqNum += 1
+ else:
+ messageSignature['Version'] = 1
+ messageSignature['Checksum'] = struct.pack('<i',binascii.crc32(message))
+ messageSignature['RandomPad'] = 0
+ messageSignature['RandomPad'] = handle(struct.pack('<i',messageSignature['RandomPad']))
+ messageSignature['Checksum'] = struct.unpack('<i',handle(messageSignature['Checksum']))[0]
+ 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):
+ sealedMessage = handle(messageToEncrypt)
+ signature = MAC(flags, handle, signingKey, seqNum, messageToSign)
+ return sealedMessage, signature
+
+def SIGN(flags, signingKey, message, seqNum, handle):
+ return MAC(flags, handle, signingKey, seqNum, message)
+
+def SIGNKEY(flags, randomSessionKey, mode = 'Client'):
+ if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ if mode == 'Client':
+ md5 = hashlib.new('md5')
+ md5.update(randomSessionKey + "session key to client-to-server signing key magic constant\x00")
+ signKey = md5.digest()
+ else:
+ md5 = hashlib.new('md5')
+ md5.update(randomSessionKey + "session key to server-to-client signing key magic constant\x00")
+ signKey = md5.digest()
+ else:
+ signKey = None
+ return signKey
+
+def SEALKEY(flags, randomSessionKey, mode = 'Client'):
+ if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ if flags & NTLMSSP_NEGOTIATE_128:
+ sealKey = randomSessionKey
+ elif flags & NTLMSSP_NEGOTIATE_56:
+ sealKey = randomSessionKey[:7]
+ else:
+ sealKey = randomSessionKey[:5]
+
+ if mode == 'Client':
+ md5 = hashlib.new('md5')
+ md5.update(sealKey + 'session key to client-to-server sealing key magic constant\x00')
+ sealKey = md5.digest()
+ else:
+ md5 = hashlib.new('md5')
+ md5.update(sealKey + 'session key to server-to-client sealing key magic constant\x00')
+ sealKey = md5.digest()
+
+ elif flags & NTLMSSP_NEGOTIATE_56:
+ sealKey = randomSessionKey[:7] + '\xa0'
+ else:
+ sealKey = randomSessionKey[:5] + '\xe5\x38\xb0'
+
+ return sealKey
+
+
+def generateEncryptedSessionKey(keyExchangeKey, exportedSessionKey):
+ if POW:
+ cipher = POW.Symmetric(POW.RC4)
+ cipher.encryptInit(keyExchangeKey)
+ cipher_encrypt = cipher.update
+ else:
+ cipher = ARC4.new(keyExchangeKey)
+ cipher_encrypt = cipher.encrypt
+
+ sessionKey = cipher_encrypt(exportedSessionKey)
+ return sessionKey
+
+def KXKEY(flags, sessionBaseKey, lmChallengeResponse, serverChallenge, password, lmhash, nthash, use_ntlmv2 = USE_NTLMv2):
+ if use_ntlmv2:
+ return sessionBaseKey
+
+ if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ if flags & NTLMSSP_NEGOTIATE_NTLM:
+ keyExchangeKey = hmac_md5(sessionBaseKey, serverChallenge + lmChallengeResponse[:8])
+ else:
+ keyExchangeKey = sessionBaseKey
+ elif flags & NTLMSSP_NEGOTIATE_NTLM:
+ if flags & NTLMSSP_NEGOTIATE_LM_KEY:
+ keyExchangeKey = __DES_block(LMOWFv1(password,lmhash)[:7], lmChallengeResponse[:8]) + __DES_block(LMOWFv1(password,lmhash)[7] + '\xBD\xBD\xBD\xBD\xBD\xBD', lmChallengeResponse[:8])
+ elif flags & NTLMSSP_REQUEST_NON_NT_SESSION_KEY:
+ keyExchangeKey = LMOWFv1(password,lmhash)[:8] + '\x00'*8
+ else:
+ keyExchangeKey = sessionBaseKey
+ else:
+ raise "Can't create a valid KXKEY!"
+
+ return keyExchangeKey
+
+def hmac_md5(key, data):
+ if POW:
+ h = POW.Hmac(POW.MD5_DIGEST, key)
+ h.update(data)
+ result = h.mac()
+ else:
+ import hmac
+ h = hmac.new(key)
+ h.update(data)
+ result = h.digest()
+ return result
+
+def NTOWFv2( user, password, domain, hash = ''):
+ if hash != '':
+ theHash = hash
+ else:
+ theHash = compute_nthash(password)
+ return hmac_md5(theHash, user.upper().encode('utf-16le') + domain.encode('utf-16le'))
+
+def LMOWFv2( user, password, domain, lmhash = ''):
+ return NTOWFv2( user, password, domain, lmhash)
+
+
+def computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash = '', nthash = '', use_ntlmv2 = USE_NTLMv2):
+
+ responseServerVersion = '\x01'
+ hiResponseServerVersion = '\x01'
+ responseKeyNT = NTOWFv2(user, password, domain, nthash)
+ responseKeyLM = LMOWFv2(user, password, domain, lmhash)
+
+ # If you're running test-ntlm, comment the following lines and uncoment the ones that are commented. Don't forget to turn it back after the tests!
+ ######################
+ av_pairs = AV_PAIRS(serverName)
+ # In order to support SPN target name validation, we have to add this to the serverName av_pairs. Otherwise we will get access denied
+ # This is set at Local Security Policy -> Local Policies -> Security Options -> Server SPN target name validation level
+ av_pairs[NTLMSSP_AV_TARGET_NAME] = 'cifs/'.encode('utf-16le') + av_pairs[NTLMSSP_AV_HOSTNAME][1]
+ if av_pairs[NTLMSSP_AV_TIME] is not None:
+ aTime = av_pairs[NTLMSSP_AV_TIME][1]
+ else:
+ aTime = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
+ #aTime = '\x00'*8
+ av_pairs[NTLMSSP_AV_TIME] = aTime
+ serverName = av_pairs.getData()
+
+ ######################
+ #aTime = '\x00'*8
+ ######################
+ temp = responseServerVersion + hiResponseServerVersion + '\x00' * 6 + aTime + clientChallenge + '\x00' * 4 + serverName + '\x00' * 4
+
+ ntProofStr = hmac_md5(responseKeyNT, serverChallenge + temp)
+
+ ntChallengeResponse = ntProofStr + temp
+ lmChallengeResponse = hmac_md5(responseKeyNT, serverChallenge + clientChallenge) + clientChallenge
+ sessionBaseKey = hmac_md5(responseKeyNT, ntProofStr)
+
+ if (user == '' and password == ''):
+ # Special case for anonymous authentication
+ ntChallengeResponse = ''
+ lmChallengeResponse = ''
+
+ return ntChallengeResponse, lmChallengeResponse, sessionBaseKey
+
+class NTLM_HTTP(object):
+ '''Parent class for NTLM HTTP classes.'''
+ MSG_TYPE = None
+
+ @classmethod
+ def get_instace(cls,msg_64):
+ msg = None
+ msg_type = 0
+ 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):
+ pass
+
+
+class NTLM_HTTP_AuthNegotiate(NTLM_HTTP, NTLMAuthNegotiate):
+ commonHdr = ()
+ MSG_TYPE = 1
+
+ def __init__(self):
+ NTLMAuthNegotiate.__init__(self)
+
+
+class NTLM_HTTP_AuthChallengeResponse(NTLM_HTTP, NTLMAuthChallengeResponse):
+ commonHdr = ()
+ MSG_TYPE = 3
+
+ def __init__(self):
+ NTLMAuthChallengeResponse.__init__(self)
+
diff --git a/tests/python_dependencies/impacket/smb.py b/tests/python_dependencies/impacket/smb.py
new file mode 100644
index 00000000..95efb2c6
--- /dev/null
+++ b/tests/python_dependencies/impacket/smb.py
@@ -0,0 +1,4099 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Copyright (C) 2001 Michael Teo <michaelteo@bigfoot.com>
+# smb.py - SMB/CIFS library
+#
+# This software is provided 'as-is', without any express or implied warranty.
+# In no event will the author be held liable for any damages arising from the
+# use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software
+# in a product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+#
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+#
+# 3. This notice cannot be removed or altered from any source distribution.
+#
+# Altered source done by Alberto Solino (@agsolino)
+
+# Todo:
+# [ ] Try [SMB]transport fragmentation using Transact requests
+# [ ] Try other methods of doing write (write_raw, transact2, write, write_and_unlock, write_and_close, write_mpx)
+# [-] Try replacements for SMB_COM_NT_CREATE_ANDX (CREATE, T_TRANSACT_CREATE, OPEN_ANDX works
+# [x] Fix forceWriteAndx, which needs to send a RecvRequest, because recv() will not send it
+# [x] Fix Recv() when using RecvAndx and the answer comes splet in several packets
+# [ ] Try [SMB]transport fragmentation with overlaping segments
+# [ ] Try [SMB]transport fragmentation with out of order segments
+# [x] Do chained AndX requests
+# [ ] Transform the rest of the calls to structure
+# [X] Implement TRANS/TRANS2 reassembly for list_path
+
+import os
+import socket
+import string
+from binascii import a2b_hex
+import datetime
+from struct import pack, unpack
+from contextlib import contextmanager
+
+from impacket import nmb, ntlm, nt_errors, LOG
+from impacket.structure import Structure
+from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, SPNEGO_NegTokenResp
+
+# For signing
+import hashlib
+
+unicode_support = 0
+unicode_convert = 1
+
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+# Dialect for SMB1
+SMB_DIALECT = 'NT LM 0.12'
+
+# Shared Device Type
+SHARED_DISK = 0x00
+SHARED_DISK_HIDDEN = 0x80000000
+SHARED_PRINT_QUEUE = 0x01
+SHARED_DEVICE = 0x02
+SHARED_IPC = 0x03
+
+# Extended attributes mask
+ATTR_ARCHIVE = 0x020
+ATTR_COMPRESSED = 0x800
+ATTR_NORMAL = 0x080
+ATTR_HIDDEN = 0x002
+ATTR_READONLY = 0x001
+ATTR_TEMPORARY = 0x100
+ATTR_DIRECTORY = 0x010
+ATTR_SYSTEM = 0x004
+
+# Service Type
+SERVICE_DISK = 'A:'
+SERVICE_PRINTER = 'LPT1:'
+SERVICE_IPC = 'IPC'
+SERVICE_COMM = 'COMM'
+SERVICE_ANY = '?????'
+
+# Server Type (Can be used to mask with SMBMachine.get_type() or SMBDomain.get_type())
+SV_TYPE_WORKSTATION = 0x00000001
+SV_TYPE_SERVER = 0x00000002
+SV_TYPE_SQLSERVER = 0x00000004
+SV_TYPE_DOMAIN_CTRL = 0x00000008
+SV_TYPE_DOMAIN_BAKCTRL = 0x00000010
+SV_TYPE_TIME_SOURCE = 0x00000020
+SV_TYPE_AFP = 0x00000040
+SV_TYPE_NOVELL = 0x00000080
+SV_TYPE_DOMAIN_MEMBER = 0x00000100
+SV_TYPE_PRINTQ_SERVER = 0x00000200
+SV_TYPE_DIALIN_SERVER = 0x00000400
+SV_TYPE_XENIX_SERVER = 0x00000800
+SV_TYPE_NT = 0x00001000
+SV_TYPE_WFW = 0x00002000
+SV_TYPE_SERVER_NT = 0x00004000
+SV_TYPE_POTENTIAL_BROWSER = 0x00010000
+SV_TYPE_BACKUP_BROWSER = 0x00020000
+SV_TYPE_MASTER_BROWSER = 0x00040000
+SV_TYPE_DOMAIN_MASTER = 0x00080000
+SV_TYPE_LOCAL_LIST_ONLY = 0x40000000
+SV_TYPE_DOMAIN_ENUM = 0x80000000
+
+# Options values for SMB.stor_file and SMB.retr_file
+SMB_O_CREAT = 0x10 # Create the file if file does not exists. Otherwise, operation fails.
+SMB_O_EXCL = 0x00 # When used with SMB_O_CREAT, operation fails if file exists. Cannot be used with SMB_O_OPEN.
+SMB_O_OPEN = 0x01 # Open the file if the file exists
+SMB_O_TRUNC = 0x02 # Truncate the file if the file exists
+
+# Share Access Mode
+SMB_SHARE_COMPAT = 0x00
+SMB_SHARE_DENY_EXCL = 0x10
+SMB_SHARE_DENY_WRITE = 0x20
+SMB_SHARE_DENY_READEXEC = 0x30
+SMB_SHARE_DENY_NONE = 0x40
+SMB_ACCESS_READ = 0x00
+SMB_ACCESS_WRITE = 0x01
+SMB_ACCESS_READWRITE = 0x02
+SMB_ACCESS_EXEC = 0x03
+
+TRANS_DISCONNECT_TID = 1
+TRANS_NO_RESPONSE = 2
+
+STATUS_SUCCESS = 0x00000000
+STATUS_LOGON_FAILURE = 0xC000006D
+STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B
+MAX_TFRAG_SIZE = 5840
+EVASION_NONE = 0
+EVASION_LOW = 1
+EVASION_HIGH = 2
+EVASION_MAX = 3
+RPC_X_BAD_STUB_DATA = 0x6F7
+
+# SMB_FILE_ATTRIBUTES
+
+SMB_FILE_ATTRIBUTE_NORMAL = 0x0000
+SMB_FILE_ATTRIBUTE_READONLY = 0x0001
+SMB_FILE_ATTRIBUTE_HIDDEN = 0x0002
+SMB_FILE_ATTRIBUTE_SYSTEM = 0x0004
+SMB_FILE_ATTRIBUTE_VOLUME = 0x0008
+SMB_FILE_ATTRIBUTE_DIRECTORY = 0x0010
+SMB_FILE_ATTRIBUTE_ARCHIVE = 0x0020
+SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
+SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
+SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
+SMB_SEARCH_ATTRIBUTE_DIRECTORY = 0x1000
+SMB_SEARCH_ATTRIBUTE_ARCHIVE = 0x2000
+
+# Session SetupAndX Action flags
+SMB_SETUP_GUEST = 0x01
+SMB_SETUP_USE_LANMAN_KEY = 0x02
+
+# QUERY_INFORMATION levels
+SMB_INFO_ALLOCATION = 0x0001
+SMB_INFO_VOLUME = 0x0002
+FILE_FS_SIZE_INFORMATION = 0x0003
+SMB_QUERY_FS_VOLUME_INFO = 0x0102
+SMB_QUERY_FS_SIZE_INFO = 0x0103
+SMB_QUERY_FILE_EA_INFO = 0x0103
+SMB_QUERY_FS_DEVICE_INFO = 0x0104
+SMB_QUERY_FS_ATTRIBUTE_INFO = 0x0105
+SMB_QUERY_FILE_BASIC_INFO = 0x0101
+SMB_QUERY_FILE_STANDARD_INFO = 0x0102
+SMB_QUERY_FILE_ALL_INFO = 0x0107
+FILE_FS_FULL_SIZE_INFORMATION = 0x03EF
+
+# SET_INFORMATION levels
+SMB_SET_FILE_DISPOSITION_INFO = 0x0102
+SMB_SET_FILE_BASIC_INFO = 0x0101
+SMB_SET_FILE_END_OF_FILE_INFO = 0x0104
+
+
+# File System Attributes
+FILE_CASE_SENSITIVE_SEARCH = 0x00000001
+FILE_CASE_PRESERVED_NAMES = 0x00000002
+FILE_UNICODE_ON_DISK = 0x00000004
+FILE_PERSISTENT_ACLS = 0x00000008
+FILE_FILE_COMPRESSION = 0x00000010
+FILE_VOLUME_IS_COMPRESSED = 0x00008000
+
+# FIND_FIRST2 flags and levels
+SMB_FIND_CLOSE_AFTER_REQUEST = 0x0001
+SMB_FIND_CLOSE_AT_EOS = 0x0002
+SMB_FIND_RETURN_RESUME_KEYS = 0x0004
+SMB_FIND_CONTINUE_FROM_LAST = 0x0008
+SMB_FIND_WITH_BACKUP_INTENT = 0x0010
+
+FILE_DIRECTORY_FILE = 0x00000001
+FILE_DELETE_ON_CLOSE = 0x00001000
+FILE_NON_DIRECTORY_FILE = 0x00000040
+
+SMB_FIND_INFO_STANDARD = 0x0001
+SMB_FIND_FILE_DIRECTORY_INFO = 0x0101
+SMB_FIND_FILE_FULL_DIRECTORY_INFO= 0x0102
+SMB_FIND_FILE_NAMES_INFO = 0x0103
+SMB_FIND_FILE_BOTH_DIRECTORY_INFO= 0x0104
+SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO = 0x105
+SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO = 0x106
+
+
+# DesiredAccess flags
+FILE_READ_DATA = 0x00000001
+FILE_WRITE_DATA = 0x00000002
+FILE_APPEND_DATA = 0x00000004
+FILE_EXECUTE = 0x00000020
+MAXIMUM_ALLOWED = 0x02000000
+GENERIC_ALL = 0x10000000
+GENERIC_EXECUTE = 0x20000000
+GENERIC_WRITE = 0x40000000
+GENERIC_READ = 0x80000000
+
+# ShareAccess flags
+FILE_SHARE_NONE = 0x00000000
+FILE_SHARE_READ = 0x00000001
+FILE_SHARE_WRITE = 0x00000002
+FILE_SHARE_DELETE = 0x00000004
+
+# CreateDisposition flags
+FILE_SUPERSEDE = 0x00000000
+FILE_OPEN = 0x00000001
+FILE_CREATE = 0x00000002
+FILE_OPEN_IF = 0x00000003
+FILE_OVERWRITE = 0x00000004
+FILE_OVERWRITE_IF = 0x00000005
+
+def strerror(errclass, errcode):
+ if errclass == 0x01:
+ return 'OS error', ERRDOS.get(errcode, 'Unknown error')
+ elif errclass == 0x02:
+ return 'Server error', ERRSRV.get(errcode, 'Unknown error')
+ elif errclass == 0x03:
+ return 'Hardware error', ERRHRD.get(errcode, 'Unknown error')
+ # This is not a standard error class for SMB
+ #elif errclass == 0x80:
+ # return 'Browse error', ERRBROWSE.get(errcode, 'Unknown error')
+ elif errclass == 0xff:
+ return 'Bad command', 'Bad command. Please file bug report'
+ else:
+ return 'Unknown error', 'Unknown error'
+
+# Raised when an error has occured during a session
+class SessionError(Exception):
+ # SMB X/Open error codes for the ERRDOS error class
+ ERRsuccess = 0
+ ERRbadfunc = 1
+ ERRbadfile = 2
+ ERRbadpath = 3
+ ERRnofids = 4
+ ERRnoaccess = 5
+ ERRbadfid = 6
+ ERRbadmcb = 7
+ ERRnomem = 8
+ ERRbadmem = 9
+ ERRbadenv = 10
+ ERRbadaccess = 12
+ ERRbaddata = 13
+ ERRres = 14
+ ERRbaddrive = 15
+ ERRremcd = 16
+ ERRdiffdevice = 17
+ ERRnofiles = 18
+ ERRgeneral = 31
+ ERRbadshare = 32
+ ERRlock = 33
+ ERRunsup = 50
+ ERRnetnamedel = 64
+ ERRnosuchshare = 67
+ ERRfilexists = 80
+ ERRinvalidparam = 87
+ ERRcannotopen = 110
+ ERRinsufficientbuffer = 122
+ ERRinvalidname = 123
+ ERRunknownlevel = 124
+ ERRnotlocked = 158
+ ERRrename = 183
+ ERRbadpipe = 230
+ ERRpipebusy = 231
+ ERRpipeclosing = 232
+ ERRnotconnected = 233
+ ERRmoredata = 234
+ ERRnomoreitems = 259
+ ERRbaddirectory = 267
+ ERReasnotsupported = 282
+ ERRlogonfailure = 1326
+ ERRbuftoosmall = 2123
+ ERRunknownipc = 2142
+ ERRnosuchprintjob = 2151
+ ERRinvgroup = 2455
+
+ # here's a special one from observing NT
+ ERRnoipc = 66
+
+ # These errors seem to be only returned by the NT printer driver system
+ ERRdriveralreadyinstalled = 1795
+ ERRunknownprinterport = 1796
+ ERRunknownprinterdriver = 1797
+ ERRunknownprintprocessor = 1798
+ ERRinvalidseparatorfile = 1799
+ ERRinvalidjobpriority = 1800
+ ERRinvalidprintername = 1801
+ ERRprinteralreadyexists = 1802
+ ERRinvalidprintercommand = 1803
+ ERRinvaliddatatype = 1804
+ ERRinvalidenvironment = 1805
+
+ ERRunknownprintmonitor = 3000
+ ERRprinterdriverinuse = 3001
+ ERRspoolfilenotfound = 3002
+ ERRnostartdoc = 3003
+ ERRnoaddjob = 3004
+ ERRprintprocessoralreadyinstalled = 3005
+ ERRprintmonitoralreadyinstalled = 3006
+ ERRinvalidprintmonitor = 3007
+ ERRprintmonitorinuse = 3008
+ ERRprinterhasjobsqueued = 3009
+
+ # Error codes for the ERRSRV class
+
+ ERRerror = 1
+ ERRbadpw = 2
+ ERRbadtype = 3
+ ERRaccess = 4
+ ERRinvnid = 5
+ ERRinvnetname = 6
+ ERRinvdevice = 7
+ ERRqfull = 49
+ ERRqtoobig = 50
+ ERRinvpfid = 52
+ ERRsmbcmd = 64
+ ERRsrverror = 65
+ ERRfilespecs = 67
+ ERRbadlink = 68
+ ERRbadpermits = 69
+ ERRbadpid = 70
+ ERRsetattrmode = 71
+ ERRpaused = 81
+ ERRmsgoff = 82
+ ERRnoroom = 83
+ ERRrmuns = 87
+ ERRtimeout = 88
+ ERRnoresource = 89
+ ERRtoomanyuids = 90
+ ERRbaduid = 91
+ ERRuseMPX = 250
+ ERRuseSTD = 251
+ ERRcontMPX = 252
+ ERRbadPW = None
+ ERRnosupport = 0
+ ERRunknownsmb = 22
+
+ # Error codes for the ERRHRD class
+
+ ERRnowrite = 19
+ ERRbadunit = 20
+ ERRnotready = 21
+ ERRbadcmd = 22
+ ERRdata = 23
+ ERRbadreq = 24
+ ERRseek = 25
+ ERRbadmedia = 26
+ ERRbadsector = 27
+ ERRnopaper = 28
+ ERRwrite = 29
+ ERRread = 30
+ ERRwrongdisk = 34
+ ERRFCBunavail = 35
+ ERRsharebufexc = 36
+ ERRdiskfull = 39
+
+
+ hard_msgs = {
+ 19: ("ERRnowrite", "Attempt to write on write-protected diskette."),
+ 20: ("ERRbadunit", "Unknown unit."),
+ 21: ("ERRnotready", "Drive not ready."),
+ 22: ("ERRbadcmd", "Unknown command."),
+ 23: ("ERRdata", "Data error (CRC)."),
+ 24: ("ERRbadreq", "Bad request structure length."),
+ 25: ("ERRseek", "Seek error."),
+ 26: ("ERRbadmedia", "Unknown media type."),
+ 27: ("ERRbadsector", "Sector not found."),
+ 28: ("ERRnopaper", "Printer out of paper."),
+ 29: ("ERRwrite", "Write fault."),
+ 30: ("ERRread", "Read fault."),
+ 31: ("ERRgeneral", "General failure."),
+ 32: ("ERRbadshare", "An open conflicts with an existing open."),
+ 33: ("ERRlock", "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."),
+ 34: ("ERRwrongdisk", "The wrong disk was found in a drive."),
+ 35: ("ERRFCBUnavail", "No FCBs are available to process request."),
+ 36: ("ERRsharebufexc", "A sharing buffer has been exceeded.")
+ }
+
+ dos_msgs = {
+ ERRbadfunc: ("ERRbadfunc", "Invalid function."),
+ ERRbadfile: ("ERRbadfile", "File not found."),
+ ERRbadpath: ("ERRbadpath", "Directory invalid."),
+ ERRnofids: ("ERRnofids", "No file descriptors available"),
+ ERRnoaccess: ("ERRnoaccess", "Access denied."),
+ ERRbadfid: ("ERRbadfid", "Invalid file handle."),
+ ERRbadmcb: ("ERRbadmcb", "Memory control blocks destroyed."),
+ ERRnomem: ("ERRnomem", "Insufficient server memory to perform the requested function."),
+ ERRbadmem: ("ERRbadmem", "Invalid memory block address."),
+ ERRbadenv: ("ERRbadenv", "Invalid environment."),
+ 11: ("ERRbadformat", "Invalid format."),
+ ERRbadaccess: ("ERRbadaccess", "Invalid open mode."),
+ ERRbaddata: ("ERRbaddata", "Invalid data."),
+ ERRres: ("ERRres", "reserved."),
+ ERRbaddrive: ("ERRbaddrive", "Invalid drive specified."),
+ ERRremcd: ("ERRremcd", "A Delete Directory request attempted to remove the server's current directory."),
+ ERRdiffdevice: ("ERRdiffdevice", "Not same device."),
+ ERRnofiles: ("ERRnofiles", "A File Search command can find no more files matching the specified criteria."),
+ ERRbadshare: ("ERRbadshare", "The sharing mode specified for an Open conflicts with existing FIDs on the file."),
+ ERRlock: ("ERRlock", "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."),
+ ERRunsup: ("ERRunsup", "The operation is unsupported"),
+ ERRnosuchshare: ("ERRnosuchshare", "You specified an invalid share name"),
+ ERRfilexists: ("ERRfilexists", "The file named in a Create Directory, Make New File or Link request already exists."),
+ ERRinvalidname: ("ERRinvalidname", "Invalid name"),
+ ERRbadpipe: ("ERRbadpipe", "Pipe invalid."),
+ ERRpipebusy: ("ERRpipebusy", "All instances of the requested pipe are busy."),
+ ERRpipeclosing: ("ERRpipeclosing", "Pipe close in progress."),
+ ERRnotconnected: ("ERRnotconnected", "No process on other end of pipe."),
+ ERRmoredata: ("ERRmoredata", "There is more data to be returned."),
+ ERRinvgroup: ("ERRinvgroup", "Invalid workgroup (try the -W option)"),
+ ERRlogonfailure: ("ERRlogonfailure", "Logon failure"),
+ ERRdiskfull: ("ERRdiskfull", "Disk full"),
+ ERRgeneral: ("ERRgeneral", "General failure"),
+ ERRunknownlevel: ("ERRunknownlevel", "Unknown info level")
+ }
+
+ server_msgs = {
+ 1: ("ERRerror", "Non-specific error code."),
+ 2: ("ERRbadpw", "Bad password - name/password pair in a Tree Connect or Session Setup are invalid."),
+ 3: ("ERRbadtype", "reserved."),
+ 4: ("ERRaccess", "The requester does not have the necessary access rights within the specified context for the requested function. The context is defined by the TID or the UID."),
+ 5: ("ERRinvnid", "The tree ID (TID) specified in a command was invalid."),
+ 6: ("ERRinvnetname", "Invalid network name in tree connect."),
+ 7: ("ERRinvdevice", "Invalid device - printer request made to non-printer connection or non-printer request made to printer connection."),
+ 49: ("ERRqfull", "Print queue full (files) -- returned by open print file."),
+ 50: ("ERRqtoobig", "Print queue full -- no space."),
+ 51: ("ERRqeof", "EOF on print queue dump."),
+ 52: ("ERRinvpfid", "Invalid print file FID."),
+ 64: ("ERRsmbcmd", "The server did not recognize the command received."),
+ 65: ("ERRsrverror","The server encountered an internal error, e.g., system file unavailable."),
+ 67: ("ERRfilespecs", "The file handle (FID) and pathname parameters contained an invalid combination of values."),
+ 68: ("ERRreserved", "reserved."),
+ 69: ("ERRbadpermits", "The access permissions specified for a file or directory are not a valid combination. The server cannot set the requested attribute."),
+ 70: ("ERRreserved", "reserved."),
+ 71: ("ERRsetattrmode", "The attribute mode in the Set File Attribute request is invalid."),
+ 81: ("ERRpaused", "Server is paused."),
+ 82: ("ERRmsgoff", "Not receiving messages."),
+ 83: ("ERRnoroom", "No room to buffer message."),
+ 87: ("ERRrmuns", "Too many remote user names."),
+ 88: ("ERRtimeout", "Operation timed out."),
+ 89: ("ERRnoresource", "No resources currently available for request."),
+ 90: ("ERRtoomanyuids", "Too many UIDs active on this session."),
+ 91: ("ERRbaduid", "The UID is not known as a valid ID on this session."),
+ 250: ("ERRusempx","Temp unable to support Raw, use MPX mode."),
+ 251: ("ERRusestd","Temp unable to support Raw, use standard read/write."),
+ 252: ("ERRcontmpx", "Continue in MPX mode."),
+ 253: ("ERRreserved", "reserved."),
+ 254: ("ERRreserved", "reserved."),
+ 0xFFFF: ("ERRnosupport", "Function not supported.")
+ }
+ # Error clases
+
+ ERRDOS = 0x1
+ error_classes = { 0: ("SUCCESS", {}),
+ ERRDOS: ("ERRDOS", dos_msgs),
+ 0x02: ("ERRSRV",server_msgs),
+ 0x03: ("ERRHRD",hard_msgs),
+ 0x04: ("ERRXOS", {} ),
+ 0xE1: ("ERRRMX1", {} ),
+ 0xE2: ("ERRRMX2", {} ),
+ 0xE3: ("ERRRMX3", {} ),
+ 0xFF: ("ERRCMD", {} ) }
+
+
+
+ def __init__( self, error_string, error_class, error_code, nt_status = 0):
+ Exception.__init__(self, error_string)
+ self.nt_status = nt_status
+ self._args = error_string
+ if nt_status:
+ self.error_class = 0
+ self.error_code = (error_code << 16) + error_class
+ else:
+ self.error_class = error_class
+ self.error_code = error_code
+
+
+ def get_error_class( self ):
+ return self.error_class
+
+ def get_error_code( self ):
+ return self.error_code
+
+ def __str__( self ):
+ error_class = SessionError.error_classes.get( self.error_class, None )
+ if not error_class:
+ error_code_str = self.error_code
+ error_class_str = self.error_class
+ else:
+ error_class_str = error_class[0]
+ error_code = error_class[1].get( self.error_code, None )
+ if not error_code:
+ error_code_str = self.error_code
+ else:
+ error_code_str = '%s(%s)' % error_code
+
+ if self.nt_status:
+ return 'SMB SessionError: %s(%s)' % nt_errors.ERROR_MESSAGES[self.error_code]
+ else:
+ # Fall back to the old format
+ return 'SMB SessionError: class: %s, code: %s' % (error_class_str, error_code_str)
+
+
+# Raised when an supported feature is present/required in the protocol but is not
+# currently supported by pysmb
+class UnsupportedFeature(Exception): pass
+
+# Contains information about a SMB shared device/service
+class SharedDevice:
+ def __init__(self, name, share_type, comment):
+ self.__name = name
+ self.__type = share_type
+ self.__comment = comment
+
+ def get_name(self):
+ return self.__name
+
+ def get_type(self):
+ return self.__type
+
+ def get_comment(self):
+ return self.__comment
+
+ def __repr__(self):
+ return '<SharedDevice instance: name=' + self.__name + ', type=' + str(self.__type) + ', comment="' + self.__comment + '">'
+
+
+# Contains information about the shared file/directory
+class SharedFile:
+ def __init__(self, ctime, atime, mtime, filesize, allocsize, attribs, shortname, longname):
+ self.__ctime = ctime
+ self.__atime = atime
+ self.__mtime = mtime
+ self.__filesize = filesize
+ self.__allocsize = allocsize
+ self.__attribs = attribs
+ try:
+ self.__shortname = shortname[:string.index(shortname, '\0')]
+ except ValueError:
+ self.__shortname = shortname
+ try:
+ self.__longname = longname[:string.index(longname, '\0')]
+ except ValueError:
+ self.__longname = longname
+
+ def get_ctime(self):
+ return self.__ctime
+
+ def get_ctime_epoch(self):
+ return self.__convert_smbtime(self.__ctime)
+
+ def get_mtime(self):
+ return self.__mtime
+
+ def get_mtime_epoch(self):
+ return self.__convert_smbtime(self.__mtime)
+
+ def get_atime(self):
+ return self.__atime
+
+ def get_atime_epoch(self):
+ return self.__convert_smbtime(self.__atime)
+
+ def get_filesize(self):
+ return self.__filesize
+
+ def get_allocsize(self):
+ return self.__allocsize
+
+ def get_attributes(self):
+ return self.__attribs
+
+ def is_archive(self):
+ return self.__attribs & ATTR_ARCHIVE
+
+ def is_compressed(self):
+ return self.__attribs & ATTR_COMPRESSED
+
+ def is_normal(self):
+ return self.__attribs & ATTR_NORMAL
+
+ def is_hidden(self):
+ return self.__attribs & ATTR_HIDDEN
+
+ def is_readonly(self):
+ return self.__attribs & ATTR_READONLY
+
+ def is_temporary(self):
+ return self.__attribs & ATTR_TEMPORARY
+
+ def is_directory(self):
+ return self.__attribs & ATTR_DIRECTORY
+
+ def is_system(self):
+ return self.__attribs & ATTR_SYSTEM
+
+ def get_shortname(self):
+ return self.__shortname
+
+ def get_longname(self):
+ return self.__longname
+
+ def __repr__(self):
+ return '<SharedFile instance: shortname="' + self.__shortname + '", longname="' + self.__longname + '", filesize=' + str(self.__filesize) + '>'
+
+ @staticmethod
+ def __convert_smbtime(t):
+ x = t >> 32
+ y = t & 0xffffffffL
+ 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
+
+
+# Contain information about a SMB machine
+class SMBMachine:
+ def __init__(self, nbname, nbt_type, comment):
+ self.__nbname = nbname
+ self.__type = nbt_type
+ self.__comment = comment
+
+ def __repr__(self):
+ return '<SMBMachine instance: nbname="' + self.__nbname + '", type=' + hex(self.__type) + ', comment="' + self.__comment + '">'
+
+class SMBDomain:
+ def __init__(self, nbgroup, domain_type, master_browser):
+ self.__nbgroup = nbgroup
+ self.__type = domain_type
+ self.__master_browser = master_browser
+
+ def __repr__(self):
+ return '<SMBDomain instance: nbgroup="' + self.__nbgroup + '", type=' + hex(self.__type) + ', master browser="' + self.__master_browser + '">'
+
+# Represents a SMB Packet
+class NewSMBPacket(Structure):
+ structure = (
+ ('Signature', '"\xffSMB'),
+ ('Command','B=0'),
+ ('ErrorClass','B=0'),
+ ('_reserved','B=0'),
+ ('ErrorCode','<H=0'),
+ ('Flags1','B=0'),
+ ('Flags2','<H=0'),
+ ('PIDHigh','<H=0'),
+ ('SecurityFeatures','8s=""'),
+ ('Reserved','<H=0'),
+ ('Tid','<H=0xffff'),
+ ('Pid','<H=0'),
+ ('Uid','<H=0'),
+ ('Mid','<H=0'),
+ ('Data','*:'),
+ )
+
+ def __init__(self, **kargs):
+ Structure.__init__(self, **kargs)
+
+ if self.fields.has_key('Flags2') is False:
+ self['Flags2'] = 0
+ if self.fields.has_key('Flags1') is False:
+ self['Flags1'] = 0
+
+ if not kargs.has_key('data'):
+ self['Data'] = []
+
+ def addCommand(self, command):
+ if len(self['Data']) == 0:
+ self['Command'] = command.command
+ else:
+ self['Data'][-1]['Parameters']['AndXCommand'] = command.command
+ self['Data'][-1]['Parameters']['AndXOffset'] = len(self)
+ self['Data'].append(command)
+
+ def isMoreData(self):
+ return (self['Command'] in [SMB.SMB_COM_TRANSACTION, SMB.SMB_COM_READ_ANDX, SMB.SMB_COM_READ_RAW] and
+ self['ErrorClass'] == 1 and self['ErrorCode'] == SessionError.ERRmoredata)
+
+ def isMoreProcessingRequired(self):
+ return self['ErrorClass'] == 0x16 and self['ErrorCode'] == 0xc000
+
+ def isValidAnswer(self, cmd):
+ # this was inside a loop reading more from the net (with recv_packet(None))
+ if self['Command'] == cmd:
+ if (self['ErrorClass'] == 0x00 and
+ self['ErrorCode'] == 0x00):
+ return 1
+ elif self.isMoreData():
+ 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)
+ else:
+ raise UnsupportedFeature, ("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
+
+
+class SMBCommand(Structure):
+ structure = (
+ ('WordCount', 'B=len(Parameters)/2'),
+ ('_ParametersLength','_-Parameters','WordCount*2'),
+ ('Parameters',':'), # default set by constructor
+ ('ByteCount','<H-Data'),
+ ('Data',':'), # default set by constructor
+ )
+
+ def __init__(self, commandOrData = None, data = None, **kargs):
+ if type(commandOrData) == type(0):
+ self.command = commandOrData
+ else:
+ data = data or commandOrData
+
+ Structure.__init__(self, data = data, **kargs)
+
+ if data is None:
+ self['Parameters'] = ''
+ self['Data'] = ''
+
+class AsciiOrUnicodeStructure(Structure):
+ UnicodeStructure = ()
+ AsciiStructure = ()
+ def __init__(self, flags = 0, **kargs):
+ if flags & SMB.FLAGS2_UNICODE:
+ self.structure = self.UnicodeStructure
+ else:
+ self.structure = self.AsciiStructure
+ Structure.__init__(self, **kargs)
+
+class SMBCommand_Parameters(Structure):
+ pass
+
+class SMBAndXCommand_Parameters(Structure):
+ commonHdr = (
+ ('AndXCommand','B=0xff'),
+ ('_reserved','B=0'),
+ ('AndXOffset','<H=0'),
+ )
+ structure = ( # default structure, overriden by subclasses
+ ('Data',':=""'),
+ )
+
+############# TRANSACTIONS RELATED
+# TRANS2_QUERY_FS_INFORMATION
+# QUERY_FS Information Levels
+# SMB_QUERY_FS_ATTRIBUTE_INFO
+class SMBQueryFsAttributeInfo(Structure):
+ structure = (
+ ('FileSystemAttributes','<L'),
+ ('MaxFilenNameLengthInBytes','<L'),
+ ('LengthOfFileSystemName','<L-FileSystemName'),
+ ('FileSystemName',':'),
+ )
+
+class SMBQueryFsInfoVolume(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('ulVolSerialNbr','<L=0xABCDEFAA'),
+ ('cCharCount','<B-VolumeLabel'),
+ )
+ AsciiStructure = (
+ ('VolumeLabel','z'),
+ )
+ UnicodeStructure = (
+ ('VolumeLabel','u'),
+ )
+
+# FILE_FS_SIZE_INFORMATION
+class FileFsSizeInformation(Structure):
+ structure = (
+ ('TotalAllocationUnits','<q=148529400'),
+ ('AvailableAllocationUnits','<q=14851044'),
+ ('SectorsPerAllocationUnit','<L=2'),
+ ('BytesPerSector','<L=512'),
+ )
+
+# SMB_QUERY_FS_SIZE_INFO
+class SMBQueryFsSizeInfo(Structure):
+ structure = (
+ ('TotalAllocationUnits','<q=148529400'),
+ ('TotalFreeAllocationUnits','<q=14851044'),
+ ('SectorsPerAllocationUnit','<L=2'),
+ ('BytesPerSector','<L=512'),
+ )
+# FILE_FS_FULL_SIZE_INFORMATION
+class SMBFileFsFullSizeInformation(Structure):
+ structure = (
+ ('TotalAllocationUnits','<q=148529400'),
+ ('CallerAvailableAllocationUnits','<q=148529400'),
+ ('ActualAvailableAllocationUnits','<q=148529400'),
+ ('SectorsPerAllocationUnit','<L=15'),
+ ('BytesPerSector','<L=512')
+ )
+# SMB_QUERY_FS_VOLUME_INFO
+class SMBQueryFsVolumeInfo(Structure):
+ structure = (
+ ('VolumeCreationTime','<q'),
+ ('SerialNumber','<L=0xABCDEFAA'),
+ ('VolumeLabelSize','<L=len(VolumeLabel)'),
+ ('Reserved','<H=0x10'),
+ ('VolumeLabel',':')
+ )
+# SMB_FIND_FILE_BOTH_DIRECTORY_INFO level
+class SMBFindFileBothDirectoryInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('EndOfFile','<q=0'),
+ ('AllocationSize','<q=0'),
+ ('ExtFileAttributes','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('EaSize','<L=0'),
+ ('ShortNameLength','<B=0'),
+ ('Reserved','<B=0'),
+ ('ShortName','24s'),
+ ('FileName',':'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('EaSize','<L=0'),
+ ('ShortNameLength','<B=0'),
+ ('Reserved','<B=0'),
+ ('ShortName','24s'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO level
+class SMBFindFileIdFullDirectoryInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('EndOfFile','<q=0'),
+ ('AllocationSize','<q=0'),
+ ('ExtFileAttributes','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('EaSize','<L=0'),
+ ('FileID','<q=0'),
+ ('FileName',':'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('EaSize','<L=0'),
+ ('FileID','<q=0'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO level
+class SMBFindFileIdBothDirectoryInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('EndOfFile','<q=0'),
+ ('AllocationSize','<q=0'),
+ ('ExtFileAttributes','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('EaSize','<L=0'),
+ ('ShortNameLength','<B=0'),
+ ('Reserved','<B=0'),
+ ('ShortName','24s'),
+ ('Reserved','<H=0'),
+ ('FileID','<q=0'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('EaSize','<L=0'),
+ ('ShortNameLength','<B=0'),
+ ('Reserved','<B=0'),
+ ('ShortName','24s'),
+ ('Reserved','<H=0'),
+ ('FileID','<q=0'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_FILE_DIRECTORY_INFO level
+class SMBFindFileDirectoryInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('EndOfFile','<q=0'),
+ ('AllocationSize','<q=1'),
+ ('ExtFileAttributes','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_FILE_NAMES_INFO level
+class SMBFindFileNamesInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_FILE_FULL_DIRECTORY_INFO level
+class SMBFindFileFullDirectoryInfo(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('FileIndex','<L=0'),
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('EndOfFile','<q=0'),
+ ('AllocationSize','<q=1'),
+ ('ExtFileAttributes','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('EaSize','<L'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<L-FileName','len(FileName)*2'),
+ ('EaSize','<L'),
+ ('FileName',':'),
+ )
+
+# SMB_FIND_INFO_STANDARD level
+class SMBFindInfoStandard(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('ResumeKey','<L=0xff'),
+ ('CreationDate','<H=0'),
+ ('CreationTime','<H=0'),
+ ('LastAccessDate','<H=0'),
+ ('LastAccessTime','<H=0'),
+ ('LastWriteDate','<H=0'),
+ ('LastWriteTime','<H=0'),
+ ('EaSize','<L'),
+ ('AllocationSize','<L=1'),
+ ('ExtFileAttributes','<H=0'),
+ )
+ AsciiStructure = (
+ ('FileNameLength','<B-FileName','len(FileName)'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameLength','<B-FileName','len(FileName)*2'),
+ ('FileName',':'),
+ )
+
+# SET_FILE_INFORMATION structures
+# SMB_SET_FILE_DISPOSITION_INFO
+class SMBSetFileDispositionInfo(Structure):
+ structure = (
+ ('DeletePending','<B'),
+ )
+
+# SMB_SET_FILE_BASIC_INFO
+class SMBSetFileBasicInfo(Structure):
+ structure = (
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('ChangeTime','<q'),
+ ('ExtFileAttributes','<H'),
+ ('Reserved','<L'),
+ )
+
+# FILE_STREAM_INFORMATION
+class SMBFileStreamInformation(Structure):
+ commonHdr = (
+ ('NextEntryOffset','<L=0'),
+ ('StreamNameLength','<L=0'),
+ ('StreamSize','<q=0'),
+ ('StreamAllocationSize','<q=0'),
+ ('StreamName',':=""'),
+ )
+
+# FILE_NETWORK_OPEN_INFORMATION
+class SMBFileNetworkOpenInfo(Structure):
+ structure = (
+ ('CreationTime','<q=0'),
+ ('LastAccessTime','<q=0'),
+ ('LastWriteTime','<q=0'),
+ ('ChangeTime','<q=0'),
+ ('AllocationSize','<q=0'),
+ ('EndOfFile','<q=0'),
+ ('FileAttributes','<L=0'),
+ ('Reserved','<L=0'),
+ )
+
+# SMB_SET_FILE_END_OF_FILE_INFO
+class SMBSetFileEndOfFileInfo(Structure):
+ structure = (
+ ('EndOfFile','<q'),
+ )
+
+# TRANS2_FIND_NEXT2
+class SMBFindNext2_Parameters(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('SID','<H'),
+ ('SearchCount','<H'),
+ ('InformationLevel','<H'),
+ ('ResumeKey','<L'),
+ ('Flags','<H'),
+ )
+ AsciiStructure = (
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileName','u'),
+ )
+
+class SMBFindNext2Response_Parameters(Structure):
+ structure = (
+ ('SearchCount','<H'),
+ ('EndOfSearch','<H=1'),
+ ('EaErrorOffset','<H=0'),
+ ('LastNameOffset','<H=0'),
+ )
+
+class SMBFindNext2_Data(Structure):
+ structure = (
+ ('GetExtendedAttributesListLength','_-GetExtendedAttributesList', 'self["GetExtendedAttributesListLength"]'),
+ ('GetExtendedAttributesList',':'),
+ )
+
+
+# TRANS2_FIND_FIRST2
+class SMBFindFirst2Response_Parameters(Structure):
+ structure = (
+ ('SID','<H'),
+ ('SearchCount','<H'),
+ ('EndOfSearch','<H=1'),
+ ('EaErrorOffset','<H=0'),
+ ('LastNameOffset','<H=0'),
+ )
+
+class SMBFindFirst2_Parameters(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('SearchAttributes','<H'),
+ ('SearchCount','<H'),
+ ('Flags','<H'),
+ ('InformationLevel','<H'),
+ ('SearchStorageType','<L'),
+ )
+ AsciiStructure = (
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileName','u'),
+ )
+
+class SMBFindFirst2_Data(Structure):
+ structure = (
+ ('GetExtendedAttributesListLength','_-GetExtendedAttributesList', 'self["GetExtendedAttributesListLength"]'),
+ ('GetExtendedAttributesList',':'),
+ )
+
+# TRANS2_SET_PATH_INFORMATION
+class SMBSetPathInformation_Parameters(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('InformationLevel','<H'),
+ ('Reserved','<L'),
+ )
+ AsciiStructure = (
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileName','u'),
+ )
+
+class SMBSetPathInformationResponse_Parameters(Structure):
+ structure = (
+ ('EaErrorOffset','<H=0'),
+ )
+
+# TRANS2_SET_FILE_INFORMATION
+class SMBSetFileInformation_Parameters(Structure):
+ structure = (
+ ('FID','<H'),
+ ('InformationLevel','<H'),
+ ('Reserved','<H'),
+ )
+
+class SMBSetFileInformationResponse_Parameters(Structure):
+ structure = (
+ ('EaErrorOffset','<H=0'),
+ )
+
+# TRANS2_QUERY_FILE_INFORMATION
+class SMBQueryFileInformation_Parameters(Structure):
+ structure = (
+ ('FID','<H'),
+ ('InformationLevel','<H'),
+ )
+
+class SMBQueryFileInformationResponse_Parameters(Structure):
+ structure = (
+ ('EaErrorOffset','<H=0'),
+ )
+
+class SMBQueryFileInformation_Data(Structure):
+ structure = (
+ ('GetExtendedAttributeList',':'),
+ )
+
+# TRANS2_QUERY_PATH_INFORMATION
+class SMBQueryPathInformationResponse_Parameters(Structure):
+ structure = (
+ ('EaErrorOffset','<H=0'),
+ )
+
+class SMBQueryPathInformation_Parameters(AsciiOrUnicodeStructure):
+ commonHdr = (
+ ('InformationLevel','<H'),
+ ('Reserved','<L=0'),
+ )
+ AsciiStructure = (
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileName','u'),
+ )
+
+class SMBQueryPathInformation_Data(Structure):
+ structure = (
+ ('GetExtendedAttributeList',':'),
+ )
+
+
+# SMB_QUERY_FILE_EA_INFO
+class SMBQueryFileEaInfo(Structure):
+ structure = (
+ ('EaSize','<L=0'),
+ )
+
+# SMB_QUERY_FILE_BASIC_INFO
+class SMBQueryFileBasicInfo(Structure):
+ structure = (
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('ExtFileAttributes','<L'),
+ #('Reserved','<L=0'),
+ )
+
+# SMB_QUERY_FILE_STANDARD_INFO
+class SMBQueryFileStandardInfo(Structure):
+ structure = (
+ ('AllocationSize','<q'),
+ ('EndOfFile','<q'),
+ ('NumberOfLinks','<L=0'),
+ ('DeletePending','<B=0'),
+ ('Directory','<B'),
+ )
+
+# SMB_QUERY_FILE_ALL_INFO
+class SMBQueryFileAllInfo(Structure):
+ structure = (
+ ('CreationTime','<q'),
+ ('LastAccessTime','<q'),
+ ('LastWriteTime','<q'),
+ ('LastChangeTime','<q'),
+ ('ExtFileAttributes','<L'),
+ ('Reserved','<L=0'),
+ ('AllocationSize','<q'),
+ ('EndOfFile','<q'),
+ ('NumberOfLinks','<L=0'),
+ ('DeletePending','<B=0'),
+ ('Directory','<B'),
+ ('Reserved','<H=0'),
+ ('EaSize','<L=0'),
+ ('FileNameLength','<L-FileName','len(FileName)'),
+ ('FileName',':'),
+ )
+
+# \PIPE\LANMAN NetShareEnum
+class SMBNetShareEnum(Structure):
+ structure = (
+ ('RAPOpcode','<H=0'),
+ ('ParamDesc','z'),
+ ('DataDesc','z'),
+ ('InfoLevel','<H'),
+ ('ReceiveBufferSize','<H'),
+ )
+
+class SMBNetShareEnumResponse(Structure):
+ structure = (
+ ('Status','<H=0'),
+ ('Convert','<H=0'),
+ ('EntriesReturned','<H'),
+ ('EntriesAvailable','<H'),
+ )
+
+class NetShareInfo1(Structure):
+ structure = (
+ ('NetworkName','13s'),
+ ('Pad','<B=0'),
+ ('Type','<H=0'),
+ ('RemarkOffsetLow','<H=0'),
+ ('RemarkOffsetHigh','<H=0'),
+ )
+
+# \PIPE\LANMAN NetServerGetInfo
+class SMBNetServerGetInfoResponse(Structure):
+ structure = (
+ ('Status','<H=0'),
+ ('Convert','<H=0'),
+ ('TotalBytesAvailable','<H'),
+ )
+
+class SMBNetServerInfo1(Structure):
+ # Level 1 Response
+ structure = (
+ ('ServerName','16s'),
+ ('MajorVersion','B=5'),
+ ('MinorVersion','B=0'),
+ ('ServerType','<L=3'),
+ ('ServerCommentLow','<H=0'),
+ ('ServerCommentHigh','<H=0'),
+ )
+
+# \PIPE\LANMAN NetShareGetInfo
+class SMBNetShareGetInfo(Structure):
+ structure = (
+ ('RAPOpcode','<H=0'),
+ ('ParamDesc','z'),
+ ('DataDesc','z'),
+ ('ShareName','z'),
+ ('InfoLevel','<H'),
+ ('ReceiveBufferSize','<H'),
+ )
+
+class SMBNetShareGetInfoResponse(Structure):
+ structure = (
+ ('Status','<H=0'),
+ ('Convert','<H=0'),
+ ('TotalBytesAvailable','<H'),
+ )
+
+############# Security Features
+class SecurityFeatures(Structure):
+ structure = (
+ ('Key','<L=0'),
+ ('CID','<H=0'),
+ ('SequenceNumber','<H=0'),
+ )
+
+############# SMB_COM_QUERY_INFORMATION2 (0x23)
+class SMBQueryInformation2_Parameters(Structure):
+ structure = (
+ ('Fid','<H'),
+ )
+
+class SMBQueryInformation2Response_Parameters(Structure):
+ structure = (
+ ('CreateDate','<H'),
+ ('CreationTime','<H'),
+ ('LastAccessDate','<H'),
+ ('LastAccessTime','<H'),
+ ('LastWriteDate','<H'),
+ ('LastWriteTime','<H'),
+ ('FileDataSize','<L'),
+ ('FileAllocationSize','<L'),
+ ('FileAttributes','<L'),
+ )
+
+
+
+############# SMB_COM_SESSION_SETUP_ANDX (0x73)
+class SMBSessionSetupAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('MaxBuffer','<H'),
+ ('MaxMpxCount','<H'),
+ ('VCNumber','<H'),
+ ('SessionKey','<L'),
+ ('AnsiPwdLength','<H'),
+ ('UnicodePwdLength','<H'),
+ ('_reserved','<L=0'),
+ ('Capabilities','<L'),
+ )
+
+class SMBSessionSetupAndX_Extended_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('MaxBufferSize','<H'),
+ ('MaxMpxCount','<H'),
+ ('VcNumber','<H'),
+ ('SessionKey','<L'),
+ ('SecurityBlobLength','<H'),
+ ('Reserved','<L=0'),
+ ('Capabilities','<L'),
+ )
+
+class SMBSessionSetupAndX_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('AnsiPwdLength','_-AnsiPwd','self["AnsiPwdLength"]'),
+ ('UnicodePwdLength','_-UnicodePwd','self["UnicodePwdLength"]'),
+ ('AnsiPwd',':=""'),
+ ('UnicodePwd',':=""'),
+ ('Account','z=""'),
+ ('PrimaryDomain','z=""'),
+ ('NativeOS','z=""'),
+ ('NativeLanMan','z=""'),
+ )
+
+ UnicodeStructure = (
+ ('AnsiPwdLength','_-AnsiPwd','self["AnsiPwdLength"]'),
+ ('UnicodePwdLength','_-UnicodePwd','self["UnicodePwdLength"]'),
+ ('AnsiPwd',':=""'),
+ ('UnicodePwd',':=""'),
+ ('Account','u=""'),
+ ('PrimaryDomain','u=""'),
+ ('NativeOS','u=""'),
+ ('NativeLanMan','u=""'),
+ )
+
+class SMBSessionSetupAndX_Extended_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
+ ('SecurityBlob',':'),
+ ('NativeOS','z=""'),
+ ('NativeLanMan','z=""'),
+ )
+
+ UnicodeStructure = (
+ ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
+ ('SecurityBlob',':'),
+ ('NativeOS','u=""'),
+ ('NativeLanMan','u=""'),
+ )
+
+class SMBSessionSetupAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Action','<H'),
+ )
+
+class SMBSessionSetupAndX_Extended_Response_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Action','<H=0'),
+ ('SecurityBlobLength','<H'),
+ )
+
+class SMBSessionSetupAndXResponse_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('NativeOS','z=""'),
+ ('NativeLanMan','z=""'),
+ ('PrimaryDomain','z=""'),
+ )
+
+ UnicodeStructure = (
+ ('NativeOS','u=""'),
+ ('NativeLanMan','u=""'),
+ ('PrimaryDomain','u=""'),
+ )
+
+class SMBSessionSetupAndX_Extended_Response_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
+ ('SecurityBlob',':'),
+ ('NativeOS','z=""'),
+ ('NativeLanMan','z=""'),
+ )
+
+ UnicodeStructure = (
+ ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
+ ('SecurityBlob',':'),
+ ('NativeOS','u=""'),
+ ('NativeLanMan','u=""'),
+ )
+
+############# SMB_COM_TREE_CONNECT (0x70)
+class SMBTreeConnect_Parameters(SMBCommand_Parameters):
+ structure = (
+ )
+
+class SMBTreeConnect_Data(SMBCommand_Parameters):
+ structure = (
+ ('PathFormat','"\x04'),
+ ('Path','z'),
+ ('PasswordFormat','"\x04'),
+ ('Password','z'),
+ ('ServiceFormat','"\x04'),
+ ('Service','z'),
+ )
+
+############# SMB_COM_TREE_CONNECT_ANDX (0x75)
+class SMBTreeConnectAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Flags','<H=0'),
+ ('PasswordLength','<H'),
+ )
+
+class SMBTreeConnectAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('OptionalSupport','<H=0'),
+ )
+
+class SMBTreeConnectAndXExtendedResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('OptionalSupport','<H=1'),
+ ('MaximalShareAccessRights','<L=0x1fffff'),
+ ('GuestMaximalShareAccessRights','<L=0x1fffff'),
+ )
+
+class SMBTreeConnectAndX_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('_PasswordLength','_-Password','self["_PasswordLength"]'),
+ ('Password',':'),
+ ('Path','z'),
+ ('Service','z'),
+ )
+
+ UnicodeStructure = (
+ ('_PasswordLength','_-Password','self["_PasswordLength"] if self["_PasswordLength"] > 0 else 1'),
+ ('Password',':'),
+ ('Path','u'),
+ ('Service','z'),
+ )
+
+class SMBTreeConnectAndXResponse_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('Service','z'),
+ ('PadLen','_-Pad','self["PadLen"]'),
+ ('Pad',':=""'),
+ ('NativeFileSystem','z'),
+ )
+ UnicodeStructure = (
+ ('Service','z'),
+ ('PadLen','_-Pad','self["PadLen"]'),
+ ('Pad',':=""'),
+ ('NativeFileSystem','u'),
+ )
+
+############# SMB_COM_NT_CREATE_ANDX (0xA2)
+class SMBNtCreateAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('_reserved', 'B=0'),
+ ('FileNameLength','<H'), # NameLength
+ ('CreateFlags','<L'), # Flags
+ ('RootFid','<L=0'), # RootDirectoryFID
+ ('AccessMask','<L'), # DesiredAccess
+ ('AllocationSizeLo','<L=0'), # AllocationSize
+ ('AllocationSizeHi','<L=0'),
+ ('FileAttributes','<L=0'), # ExtFileAttributes
+ ('ShareAccess','<L=3'), #
+ ('Disposition','<L=1'), # CreateDisposition
+ ('CreateOptions','<L'), # CreateOptions
+ ('Impersonation','<L=2'),
+ ('SecurityFlags','B=3'),
+ )
+
+class SMBNtCreateAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ # XXX Is there a memory leak in the response for NTCreate (where the Data section would be) in Win 2000, Win XP, and Win 2003?
+ structure = (
+ ('OplockLevel', 'B=0'),
+ ('Fid','<H'),
+ ('CreateAction','<L'),
+ ('CreateTime','<q=0'),
+ ('LastAccessTime','<q=0'),
+ ('LastWriteTime','<q=0'),
+ ('LastChangeTime','<q=0'),
+ ('FileAttributes','<L=0x80'),
+ ('AllocationSize','<q=0'),
+ ('EndOfFile','<q=0'),
+ ('FileType','<H=0'),
+ ('IPCState','<H=0'),
+ ('IsDirectory','B'),
+ )
+
+class SMBNtCreateAndXExtendedResponse_Parameters(SMBAndXCommand_Parameters):
+ # [MS-SMB] Extended response description
+ structure = (
+ ('OplockLevel', 'B=0'),
+ ('Fid','<H'),
+ ('CreateAction','<L'),
+ ('CreateTime','<q=0'),
+ ('LastAccessTime','<q=0'),
+ ('LastWriteTime','<q=0'),
+ ('LastChangeTime','<q=0'),
+ ('FileAttributes','<L=0x80'),
+ ('AllocationSize','<q=0'),
+ ('EndOfFile','<q=0'),
+ ('FileType','<H=0'),
+ ('IPCState','<H=0'),
+ ('IsDirectory','B'),
+ ('VolumeGUID','16s'),
+ ('FileIdLow','<L=0'),
+ ('FileIdHigh','<L=0'),
+ ('MaximalAccessRights','<L=0x12019b'),
+ ('GuestMaximalAccessRights','<L=0x120089'),
+ )
+
+class SMBNtCreateAndX_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('Pad','B'),
+ ('FileName','u'),
+ )
+
+############# SMB_COM_OPEN_ANDX (0xD2)
+class SMBOpenAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Flags','<H=0'),
+ ('DesiredAccess','<H=0'),
+ ('SearchAttributes','<H=0'),
+ ('FileAttributes','<H=0'),
+ ('CreationTime','<L=0'),
+ ('OpenMode','<H=1'), # SMB_O_OPEN = 1
+ ('AllocationSize','<L=0'),
+ ('Reserved','8s=""'),
+ )
+
+class SMBOpenAndX_Data(SMBNtCreateAndX_Data):
+ pass
+
+class SMBOpenAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Fid','<H=0'),
+ ('FileAttributes','<H=0'),
+ ('LastWriten','<L=0'),
+ ('FileSize','<L=0'),
+ ('GrantedAccess','<H=0'),
+ ('FileType','<H=0'),
+ ('IPCState','<H=0'),
+ ('Action','<H=0'),
+ ('ServerFid','<L=0'),
+ ('_reserved','<H=0'),
+ )
+
+############# SMB_COM_WRITE (0x0B)
+class SMBWrite_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Count','<H'),
+ ('Offset','<L'),
+ ('Remaining','<H'),
+ )
+
+class SMBWriteResponse_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Count','<H'),
+ )
+
+class SMBWrite_Data(Structure):
+ structure = (
+ ('BufferFormat','<B=1'),
+ ('DataLength','<H-Data'),
+ ('Data',':'),
+ )
+
+
+############# SMB_COM_WRITE_ANDX (0x2F)
+class SMBWriteAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Fid','<H=0'),
+ ('Offset','<L=0'),
+ ('_reserved','<L=0xff'),
+ ('WriteMode','<H=8'),
+ ('Remaining','<H=0'),
+ ('DataLength_Hi','<H=0'),
+ ('DataLength','<H=0'),
+ ('DataOffset','<H=0'),
+ ('HighOffset','<L=0'),
+ )
+
+class SMBWriteAndX_Data_Short(Structure):
+ structure = (
+ ('_PadLen','_-Pad','self["DataOffset"] - 59'),
+ ('Pad',':'),
+ #('Pad','<B=0'),
+ ('DataLength','_-Data','self["DataLength"]'),
+ ('Data',':'),
+ )
+
+class SMBWriteAndX_Data(Structure):
+ structure = (
+ ('_PadLen','_-Pad','self["DataOffset"] - 63'),
+ ('Pad',':'),
+ #('Pad','<B=0'),
+ ('DataLength','_-Data','self["DataLength"]'),
+ ('Data',':'),
+ )
+
+
+class SMBWriteAndX_Parameters_Short(SMBAndXCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Offset','<L'),
+ ('_reserved','<L=0xff'),
+ ('WriteMode','<H=8'),
+ ('Remaining','<H'),
+ ('DataLength_Hi','<H=0'),
+ ('DataLength','<H'),
+ ('DataOffset','<H=0'),
+ )
+
+class SMBWriteAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Count','<H'),
+ ('Available','<H'),
+ ('Reserved','<L=0'),
+ )
+
+############# SMB_COM_WRITE_RAW (0x1D)
+class SMBWriteRaw_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Count','<H'),
+ ('_reserved','<H=0'),
+ ('Offset','<L'),
+ ('Timeout','<L=0'),
+ ('WriteMode','<H=0'),
+ ('_reserved2','<L=0'),
+ ('DataLength','<H'),
+ ('DataOffset','<H=0'),
+ )
+
+############# SMB_COM_READ (0x0A)
+class SMBRead_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Count','<H'),
+ ('Offset','<L'),
+ ('Remaining','<H=Count'),
+ )
+
+class SMBReadResponse_Parameters(Structure):
+ structure = (
+ ('Count','<H=0'),
+ ('_reserved','8s=""'),
+ )
+
+class SMBReadResponse_Data(Structure):
+ structure = (
+ ('BufferFormat','<B=0x1'),
+ ('DataLength','<H-Data'),
+ ('Data',':'),
+ )
+
+############# SMB_COM_READ_RAW (0x1A)
+class SMBReadRaw_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Offset','<L'),
+ ('MaxCount','<H'),
+ ('MinCount','<H=MaxCount'),
+ ('Timeout','<L=0'),
+ ('_reserved','<H=0'),
+ )
+
+############# SMB_COM_NT_TRANSACT (0xA0)
+class SMBNTTransaction_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('MaxSetupCount','<B=0'),
+ ('Reserved1','<H=0'),
+ ('TotalParameterCount','<L'),
+ ('TotalDataCount','<L'),
+ ('MaxParameterCount','<L=1024'),
+ ('MaxDataCount','<L=65504'),
+ ('ParameterCount','<L'),
+ ('ParameterOffset','<L'),
+ ('DataCount','<L'),
+ ('DataOffset','<L'),
+ ('SetupCount','<B=len(Setup)/2'),
+ ('Function','<H=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+class SMBNTTransactionResponse_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Reserved1','3s=""'),
+ ('TotalParameterCount','<L'),
+ ('TotalDataCount','<L'),
+ ('ParameterCount','<L'),
+ ('ParameterOffset','<L'),
+ ('ParameterDisplacement','<L=0'),
+ ('DataCount','<L'),
+ ('DataOffset','<L'),
+ ('DataDisplacement','<L=0'),
+ ('SetupCount','<B=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+class SMBNTTransaction_Data(Structure):
+ structure = (
+ ('Pad1Length','_-Pad1','self["Pad1Length"]'),
+ ('Pad1',':'),
+ ('NT_Trans_ParametersLength','_-NT_Trans_Parameters','self["NT_Trans_ParametersLength"]'),
+ ('NT_Trans_Parameters',':'),
+ ('Pad2Length','_-Pad2','self["Pad2Length"]'),
+ ('Pad2',':'),
+ ('NT_Trans_DataLength','_-NT_Trans_Data','self["NT_Trans_DataLength"]'),
+ ('NT_Trans_Data',':'),
+ )
+
+class SMBNTTransactionResponse_Data(Structure):
+ structure = (
+ ('Pad1Length','_-Pad1','self["Pad1Length"]'),
+ ('Pad1',':'),
+ ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
+ ('Trans_Parameters',':'),
+ ('Pad2Length','_-Pad2','self["Pad2Length"]'),
+ ('Pad2',':'),
+ ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
+ ('Trans_Data',':'),
+ )
+
+
+############# SMB_COM_TRANSACTION2_SECONDARY (0x33)
+class SMBTransaction2Secondary_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('TotalParameterCount','<H'),
+ ('TotalDataCount','<H'),
+ ('ParameterCount','<H'),
+ ('ParameterOffset','<H'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('DataDisplacement','<H=0'),
+ ('FID','<H'),
+ )
+
+class SMBTransaction2Secondary_Data(Structure):
+ structure = (
+ ('Pad1Length','_-Pad1','self["Pad1Length"]'),
+ ('Pad1',':'),
+ ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
+ ('Trans_Parameters',':'),
+ ('Pad2Length','_-Pad2','self["Pad2Length"]'),
+ ('Pad2',':'),
+ ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
+ ('Trans_Data',':'),
+ )
+
+
+############# SMB_COM_TRANSACTION2 (0x32)
+
+class SMBTransaction2_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('TotalParameterCount','<H'),
+ ('TotalDataCount','<H'),
+ ('MaxParameterCount','<H=1024'),
+ ('MaxDataCount','<H=65504'),
+ ('MaxSetupCount','<B=0'),
+ ('Reserved1','<B=0'),
+ ('Flags','<H=0'),
+ ('Timeout','<L=0'),
+ ('Reserved2','<H=0'),
+ ('ParameterCount','<H'),
+ ('ParameterOffset','<H'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('SetupCount','<B=len(Setup)/2'),
+ ('Reserved3','<B=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+class SMBTransaction2Response_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('TotalParameterCount','<H'),
+ ('TotalDataCount','<H'),
+ ('Reserved1','<H=0'),
+ ('ParameterCount','<H'),
+ ('ParameterOffset','<H'),
+ ('ParameterDisplacement','<H=0'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('DataDisplacement','<H=0'),
+ ('SetupCount','<B=0'),
+ ('Reserved2','<B=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+class SMBTransaction2_Data(Structure):
+ structure = (
+# ('NameLength','_-Name','1'),
+# ('Name',':'),
+ ('Pad1Length','_-Pad1','self["Pad1Length"]'),
+ ('Pad1',':'),
+ ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
+ ('Trans_Parameters',':'),
+ ('Pad2Length','_-Pad2','self["Pad2Length"]'),
+ ('Pad2',':'),
+ ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
+ ('Trans_Data',':'),
+ )
+
+class SMBTransaction2Response_Data(Structure):
+ structure = (
+ ('Pad1Length','_-Pad1','self["Pad1Length"]'),
+ ('Pad1',':'),
+ ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
+ ('Trans_Parameters',':'),
+ ('Pad2Length','_-Pad2','self["Pad2Length"]'),
+ ('Pad2',':'),
+ ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
+ ('Trans_Data',':'),
+ )
+
+############# SMB_COM_QUERY_INFORMATION (0x08)
+
+class SMBQueryInformation_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat','B=4'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat','B=4'),
+ ('FileName','u'),
+ )
+
+
+class SMBQueryInformationResponse_Parameters(Structure):
+ structure = (
+ ('FileAttributes','<H'),
+ ('LastWriteTime','<L'),
+ ('FileSize','<L'),
+ ('Reserved','"0123456789'),
+ )
+
+############# SMB_COM_TRANSACTION (0x25)
+class SMBTransaction_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('TotalParameterCount','<H'),
+ ('TotalDataCount','<H'),
+ ('MaxParameterCount','<H=1024'),
+ ('MaxDataCount','<H=65504'),
+ ('MaxSetupCount','<B=0'),
+ ('Reserved1','<B=0'),
+ ('Flags','<H=0'),
+ ('Timeout','<L=0'),
+ ('Reserved2','<H=0'),
+ ('ParameterCount','<H'),
+ ('ParameterOffset','<H'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('SetupCount','<B=len(Setup)/2'),
+ ('Reserved3','<B=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+class SMBTransactionResponse_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('TotalParameterCount','<H'),
+ ('TotalDataCount','<H'),
+ ('Reserved1','<H=0'),
+ ('ParameterCount','<H'),
+ ('ParameterOffset','<H'),
+ ('ParameterDisplacement','<H=0'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('DataDisplacement','<H=0'),
+ ('SetupCount','<B'),
+ ('Reserved2','<B=0'),
+ ('SetupLength','_-Setup','SetupCount*2'),
+ ('Setup',':'),
+ )
+
+# TODO: We should merge these both. But this will require fixing
+# the instances where this structure is used on the client side
+class SMBTransaction_SData(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('Name','z'),
+ ('Trans_ParametersLength','_-Trans_Parameters'),
+ ('Trans_Parameters',':'),
+ ('Trans_DataLength','_-Trans_Data'),
+ ('Trans_Data',':'),
+ )
+ UnicodeStructure = (
+ ('Pad','B'),
+ ('Name','u'),
+ ('Trans_ParametersLength','_-Trans_Parameters'),
+ ('Trans_Parameters',':'),
+ ('Trans_DataLength','_-Trans_Data'),
+ ('Trans_Data',':'),
+ )
+
+class SMBTransaction_Data(Structure):
+ structure = (
+ ('NameLength','_-Name'),
+ ('Name',':'),
+ ('Trans_ParametersLength','_-Trans_Parameters'),
+ ('Trans_Parameters',':'),
+ ('Trans_DataLength','_-Trans_Data'),
+ ('Trans_Data',':'),
+ )
+
+class SMBTransactionResponse_Data(Structure):
+ structure = (
+ ('Trans_ParametersLength','_-Trans_Parameters'),
+ ('Trans_Parameters',':'),
+ ('Trans_DataLength','_-Trans_Data'),
+ ('Trans_Data',':'),
+ )
+
+############# SMB_COM_READ_ANDX (0x2E)
+class SMBReadAndX_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Offset','<L'),
+ ('MaxCount','<H'),
+ ('MinCount','<H=MaxCount'),
+ ('_reserved','<L=0x0'),
+ ('Remaining','<H=MaxCount'),
+ ('HighOffset','<L=0'),
+ )
+
+class SMBReadAndX_Parameters2(SMBAndXCommand_Parameters):
+ structure = (
+ ('Fid','<H'),
+ ('Offset','<L'),
+ ('MaxCount','<H'),
+ ('MinCount','<H=MaxCount'),
+ ('_reserved','<L=0xffffffff'),
+ ('Remaining','<H=MaxCount'),
+ )
+
+class SMBReadAndXResponse_Parameters(SMBAndXCommand_Parameters):
+ structure = (
+ ('Remaining','<H=0'),
+ ('DataMode','<H=0'),
+ ('_reserved','<H=0'),
+ ('DataCount','<H'),
+ ('DataOffset','<H'),
+ ('DataCount_Hi','<L'),
+ ('_reserved2','6s=""'),
+ )
+
+############# SMB_COM_ECHO (0x2B)
+class SMBEcho_Data(Structure):
+ structure = (
+ ('Data',':'),
+ )
+
+class SMBEcho_Parameters(Structure):
+ structure = (
+ ('EchoCount','<H'),
+ )
+
+class SMBEchoResponse_Data(Structure):
+ structure = (
+ ('Data',':'),
+ )
+
+class SMBEchoResponse_Parameters(Structure):
+ structure = (
+ ('SequenceNumber','<H=1'),
+ )
+
+############# SMB_COM_QUERY_INFORMATION_DISK (0x80)
+class SMBQueryInformationDiskResponse_Parameters(Structure):
+ structure = (
+ ('TotalUnits','<H'),
+ ('BlocksPerUnit','<H'),
+ ('BlockSize','<H'),
+ ('FreeUnits','<H'),
+ ('Reserved','<H=0'),
+ )
+
+
+############# SMB_COM_LOGOFF_ANDX (0x74)
+class SMBLogOffAndX(SMBAndXCommand_Parameters):
+ strucure = ()
+
+############# SMB_COM_CLOSE (0x04)
+class SMBClose_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('FID','<H'),
+ ('Time','<L=0'),
+ )
+
+############# SMB_COM_FLUSH (0x05)
+class SMBFlush_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('FID','<H'),
+ )
+
+############# SMB_COM_CREATE_DIRECTORY (0x00)
+class SMBCreateDirectory_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','u'),
+ )
+
+############# SMB_COM_DELETE (0x06)
+class SMBDelete_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat','<B=4'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat','<B=4'),
+ ('FileName','u'),
+ )
+
+class SMBDelete_Parameters(Structure):
+ structure = (
+ ('SearchAttributes','<H'),
+ )
+
+############# SMB_COM_DELETE_DIRECTORY (0x01)
+class SMBDeleteDirectory_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','u'),
+ )
+
+############# SMB_COM_CHECK_DIRECTORY (0x10)
+class SMBCheckDirectory_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat','<B=4'),
+ ('DirectoryName','u'),
+ )
+
+############# SMB_COM_RENAME (0x07)
+class SMBRename_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('SearchAttributes','<H'),
+ )
+
+class SMBRename_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('BufferFormat1','<B=4'),
+ ('OldFileName','z'),
+ ('BufferFormat2','<B=4'),
+ ('NewFileName','z'),
+ )
+ UnicodeStructure = (
+ ('BufferFormat1','<B=4'),
+ ('OldFileName','u'),
+ ('BufferFormat2','<B=4'),
+ ('Pad','B=0'),
+ ('NewFileName','u'),
+ )
+
+
+############# SMB_COM_OPEN (0x02)
+class SMBOpen_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('DesiredAccess','<H=0'),
+ ('SearchAttributes','<H=0'),
+ )
+
+class SMBOpen_Data(AsciiOrUnicodeStructure):
+ AsciiStructure = (
+ ('FileNameFormat','"\x04'),
+ ('FileName','z'),
+ )
+ UnicodeStructure = (
+ ('FileNameFormat','"\x04'),
+ ('FileName','z'),
+ )
+
+class SMBOpenResponse_Parameters(SMBCommand_Parameters):
+ structure = (
+ ('Fid','<H=0'),
+ ('FileAttributes','<H=0'),
+ ('LastWriten','<L=0'),
+ ('FileSize','<L=0'),
+ ('GrantedAccess','<H=0'),
+ )
+
+############# EXTENDED SECURITY CLASSES
+class SMBExtended_Security_Parameters(Structure):
+ structure = (
+ ('DialectIndex','<H'),
+ ('SecurityMode','<B'),
+ ('MaxMpxCount','<H'),
+ ('MaxNumberVcs','<H'),
+ ('MaxBufferSize','<L'),
+ ('MaxRawSize','<L'),
+ ('SessionKey','<L'),
+ ('Capabilities','<L'),
+ ('LowDateTime','<L'),
+ ('HighDateTime','<L'),
+ ('ServerTimeZone','<H'),
+ ('ChallengeLength','<B'),
+ )
+
+class SMBExtended_Security_Data(Structure):
+ structure = (
+ ('ServerGUID','16s'),
+ ('SecurityBlob',':'),
+ )
+
+class SMBNTLMDialect_Parameters(Structure):
+ structure = (
+ ('DialectIndex','<H'),
+ ('SecurityMode','<B'),
+ ('MaxMpxCount','<H'),
+ ('MaxNumberVcs','<H'),
+ ('MaxBufferSize','<L'),
+ ('MaxRawSize','<L'),
+ ('SessionKey','<L'),
+ ('Capabilities','<L'),
+ ('LowDateTime','<L'),
+ ('HighDateTime','<L'),
+ ('ServerTimeZone','<H'),
+ ('ChallengeLength','<B'),
+ )
+
+class SMBNTLMDialect_Data(Structure):
+ structure = (
+ ('ChallengeLength','_-Challenge','self["ChallengeLength"]'),
+ ('Challenge',':'),
+ ('Payload',':'),
+# For some reason on an old Linux this field is not present, we have to check this out. There must be a flag stating this.
+ ('DomainName','_'),
+ ('ServerName','_'),
+ )
+ def __init__(self,data = None, alignment = 0):
+ Structure.__init__(self,data,alignment)
+ #self['ChallengeLength']=8
+
+ def fromString(self,data):
+ Structure.fromString(self,data)
+ self['DomainName'] = ''
+ self['ServerName'] = ''
+
+class SMB:
+ # SMB Command Codes
+ SMB_COM_CREATE_DIRECTORY = 0x00
+ SMB_COM_DELETE_DIRECTORY = 0x01
+ SMB_COM_OPEN = 0x02
+ SMB_COM_CREATE = 0x03
+ SMB_COM_CLOSE = 0x04
+ SMB_COM_FLUSH = 0x05
+ SMB_COM_DELETE = 0x06
+ SMB_COM_RENAME = 0x07
+ SMB_COM_QUERY_INFORMATION = 0x08
+ SMB_COM_SET_INFORMATION = 0x09
+ SMB_COM_READ = 0x0A
+ SMB_COM_WRITE = 0x0B
+ SMB_COM_LOCK_BYTE_RANGE = 0x0C
+ SMB_COM_UNLOCK_BYTE_RANGE = 0x0D
+ SMB_COM_CREATE_TEMPORARY = 0x0E
+ SMB_COM_CREATE_NEW = 0x0F
+ SMB_COM_CHECK_DIRECTORY = 0x10
+ SMB_COM_PROCESS_EXIT = 0x11
+ SMB_COM_SEEK = 0x12
+ SMB_COM_LOCK_AND_READ = 0x13
+ SMB_COM_WRITE_AND_UNLOCK = 0x14
+ SMB_COM_READ_RAW = 0x1A
+ SMB_COM_READ_MPX = 0x1B
+ SMB_COM_READ_MPX_SECONDARY = 0x1C
+ SMB_COM_WRITE_RAW = 0x1D
+ SMB_COM_WRITE_MPX = 0x1E
+ SMB_COM_WRITE_MPX_SECONDARY = 0x1F
+ SMB_COM_WRITE_COMPLETE = 0x20
+ SMB_COM_QUERY_SERVER = 0x21
+ SMB_COM_SET_INFORMATION2 = 0x22
+ SMB_COM_QUERY_INFORMATION2 = 0x23
+ SMB_COM_LOCKING_ANDX = 0x24
+ SMB_COM_TRANSACTION = 0x25
+ SMB_COM_TRANSACTION_SECONDARY = 0x26
+ SMB_COM_IOCTL = 0x27
+ SMB_COM_IOCTL_SECONDARY = 0x28
+ SMB_COM_COPY = 0x29
+ SMB_COM_MOVE = 0x2A
+ SMB_COM_ECHO = 0x2B
+ SMB_COM_WRITE_AND_CLOSE = 0x2C
+ SMB_COM_OPEN_ANDX = 0x2D
+ SMB_COM_READ_ANDX = 0x2E
+ SMB_COM_WRITE_ANDX = 0x2F
+ SMB_COM_NEW_FILE_SIZE = 0x30
+ SMB_COM_CLOSE_AND_TREE_DISC = 0x31
+ SMB_COM_TRANSACTION2 = 0x32
+ SMB_COM_TRANSACTION2_SECONDARY = 0x33
+ SMB_COM_FIND_CLOSE2 = 0x34
+ SMB_COM_FIND_NOTIFY_CLOSE = 0x35
+ # Used by Xenix/Unix 0x60 - 0x6E
+ SMB_COM_TREE_CONNECT = 0x70
+ SMB_COM_TREE_DISCONNECT = 0x71
+ SMB_COM_NEGOTIATE = 0x72
+ SMB_COM_SESSION_SETUP_ANDX = 0x73
+ SMB_COM_LOGOFF_ANDX = 0x74
+ SMB_COM_TREE_CONNECT_ANDX = 0x75
+ SMB_COM_QUERY_INFORMATION_DISK = 0x80
+ SMB_COM_SEARCH = 0x81
+ SMB_COM_FIND = 0x82
+ SMB_COM_FIND_UNIQUE = 0x83
+ SMB_COM_FIND_CLOSE = 0x84
+ SMB_COM_NT_TRANSACT = 0xA0
+ SMB_COM_NT_TRANSACT_SECONDARY = 0xA1
+ SMB_COM_NT_CREATE_ANDX = 0xA2
+ SMB_COM_NT_CANCEL = 0xA4
+ SMB_COM_NT_RENAME = 0xA5
+ SMB_COM_OPEN_PRINT_FILE = 0xC0
+ SMB_COM_WRITE_PRINT_FILE = 0xC1
+ SMB_COM_CLOSE_PRINT_FILE = 0xC2
+ SMB_COM_GET_PRINT_QUEUE = 0xC3
+ SMB_COM_READ_BULK = 0xD8
+ SMB_COM_WRITE_BULK = 0xD9
+ SMB_COM_WRITE_BULK_DATA = 0xDA
+
+ # TRANSACT codes
+ TRANS_TRANSACT_NMPIPE = 0x26
+
+ # TRANSACT2 codes
+ TRANS2_FIND_FIRST2 = 0x0001
+ TRANS2_FIND_NEXT2 = 0x0002
+ TRANS2_QUERY_FS_INFORMATION = 0x0003
+ TRANS2_QUERY_PATH_INFORMATION = 0x0005
+ TRANS2_QUERY_FILE_INFORMATION = 0x0007
+ TRANS2_SET_FILE_INFORMATION = 0x0008
+ TRANS2_SET_PATH_INFORMATION = 0x0006
+
+ # Security Share Mode (Used internally by SMB class)
+ SECURITY_SHARE_MASK = 0x01
+ SECURITY_SHARE_SHARE = 0x00
+ SECURITY_SHARE_USER = 0x01
+ SECURITY_SIGNATURES_ENABLED = 0X04
+ SECURITY_SIGNATURES_REQUIRED = 0X08
+
+ # Security Auth Mode (Used internally by SMB class)
+ SECURITY_AUTH_MASK = 0x02
+ SECURITY_AUTH_ENCRYPTED = 0x02
+ SECURITY_AUTH_PLAINTEXT = 0x00
+
+ # Raw Mode Mask (Used internally by SMB class. Good for dialect up to and including LANMAN2.1)
+ RAW_READ_MASK = 0x01
+ RAW_WRITE_MASK = 0x02
+
+ # Capabilities Mask (Used internally by SMB class. Good for dialect NT LM 0.12)
+ CAP_RAW_MODE = 0x00000001
+ CAP_MPX_MODE = 0x0002
+ CAP_UNICODE = 0x0004
+ CAP_LARGE_FILES = 0x0008
+ CAP_EXTENDED_SECURITY = 0x80000000
+ CAP_USE_NT_ERRORS = 0x40
+ CAP_NT_SMBS = 0x10
+ CAP_LARGE_READX = 0x00004000
+ CAP_LARGE_WRITEX = 0x00008000
+ CAP_RPC_REMOTE_APIS = 0x20
+
+ # Flags1 Mask
+ FLAGS1_LOCK_AND_READ_OK = 0x01
+ FLAGS1_PATHCASELESS = 0x08
+ FLAGS1_CANONICALIZED_PATHS = 0x10
+ FLAGS1_REPLY = 0x80
+
+ # Flags2 Mask
+ FLAGS2_LONG_NAMES = 0x0001
+ FLAGS2_EAS = 0x0002
+ FLAGS2_SMB_SECURITY_SIGNATURE = 0x0004
+ FLAGS2_IS_LONG_NAME = 0x0040
+ FLAGS2_DFS = 0x1000
+ FLAGS2_PAGING_IO = 0x2000
+ FLAGS2_NT_STATUS = 0x4000
+ FLAGS2_UNICODE = 0x8000
+ FLAGS2_COMPRESSED = 0x0008
+ FLAGS2_SMB_SECURITY_SIGNATURE_REQUIRED = 0x0010
+ FLAGS2_EXTENDED_SECURITY = 0x0800
+
+ # Dialect's Security Mode flags
+ NEGOTIATE_USER_SECURITY = 0x01
+ NEGOTIATE_ENCRYPT_PASSWORDS = 0x02
+ NEGOTIATE_SECURITY_SIGNATURE_ENABLE = 0x04
+ NEGOTIATE_SECURITY_SIGNATURE_REQUIRED = 0x08
+
+ # Tree Connect AndX Response optionalSuppor flags
+ SMB_SUPPORT_SEARCH_BITS = 0x01
+ SMB_SHARE_IS_IN_DFS = 0x02
+
+ def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = 445, timeout=None, UDP = 0, session = None, negPacket = None):
+ # The uid attribute will be set when the client calls the login() method
+ self._uid = 0
+ self.__server_name = ''
+ self.__server_os = ''
+ self.__server_os_major = None
+ self.__server_os_minor = None
+ self.__server_os_build = None
+ self.__server_lanman = ''
+ self.__server_domain = ''
+ self.__server_dns_domain_name = ''
+ self.__remote_name = string.upper(remote_name)
+ self.__remote_host = remote_host
+ self.__isNTLMv2 = True
+ self._dialects_parameters = None
+ self._dialects_data = None
+ # Credentials
+ self.__userName = ''
+ self.__password = ''
+ self.__domain = ''
+ self.__lmhash = ''
+ self.__nthash = ''
+ self.__aesKey = ''
+ self.__kdc = ''
+ self.__TGT = None
+ self.__TGS = None
+
+ # Negotiate Protocol Result, used everywhere
+ # Could be extended or not, flags should be checked before
+ self._dialect_data = 0
+ self._dialect_parameters = 0
+ self._action = 0
+ self._sess = None
+ self.encrypt_passwords = True
+ self.tid = 0
+ self.fid = 0
+
+ # Signing stuff
+ self._SignSequenceNumber = 0
+ self._SigningSessionKey = ''
+ self._SigningChallengeResponse = ''
+ self._SignatureEnabled = False
+ self._SignatureVerificationEnabled = False
+ self._SignatureRequired = False
+
+ # Base flags (default flags, can be overriden using set_flags())
+ self.__flags1 = SMB.FLAGS1_PATHCASELESS | SMB.FLAGS1_CANONICALIZED_PATHS
+ self.__flags2 = SMB.FLAGS2_EXTENDED_SECURITY | SMB.FLAGS2_NT_STATUS | SMB.FLAGS2_LONG_NAMES
+
+ if timeout is None:
+ self.__timeout = 60
+ else:
+ self.__timeout = timeout
+
+ # If port 445 and the name sent is *SMBSERVER we're setting the name to the IP.
+ # This is to help some old applications still believing
+ # *SMSBSERVER will work against modern OSes. If port is NETBIOS_SESSION_PORT the user better
+ # know about *SMBSERVER's limitations
+ if sess_port == 445 and remote_name == '*SMBSERVER':
+ self.__remote_name = remote_host
+
+ if session is None:
+ if not my_name:
+ my_name = socket.gethostname()
+ i = string.find(my_name, '.')
+ if i > -1:
+ my_name = my_name[:i]
+
+ if UDP:
+ self._sess = nmb.NetBIOSUDPSession(my_name, remote_name, remote_host, host_type, sess_port, self.__timeout)
+ else:
+ self._sess = nmb.NetBIOSTCPSession(my_name, remote_name, remote_host, host_type, sess_port, self.__timeout)
+
+ # Initialize session values (_dialect_data and _dialect_parameters)
+ self.neg_session()
+
+ # Call login() without any authentication information to
+ # setup a session if the remote server
+ # is in share mode.
+ if (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_SHARE:
+ self.login('', '')
+ else:
+ self._sess = session
+ self.neg_session(negPacket = negPacket)
+ # Call login() without any authentication information to
+ # setup a session if the remote server
+ # is in share mode.
+ if (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_SHARE:
+ self.login('', '')
+
+ @staticmethod
+ def ntlm_supported():
+ return False
+
+ def get_remote_name(self):
+ return self.__remote_name
+
+ def get_remote_host(self):
+ return self.__remote_host
+
+ def get_flags(self):
+ return self.__flags1, self.__flags2
+
+ def set_flags(self, flags1=None, flags2=None):
+ if flags1 is not None:
+ self.__flags1 = flags1
+ if flags2 is not None:
+ self.__flags2 = flags2
+
+ def set_timeout(self, timeout):
+ prev_timeout = self.__timeout
+ self.__timeout = timeout
+ return prev_timeout
+
+ def get_timeout(self):
+ return self.__timeout
+
+ @contextmanager
+ def use_timeout(self, timeout):
+ prev_timeout = self.set_timeout(timeout)
+ try:
+ yield
+ finally:
+ self.set_timeout(prev_timeout)
+
+ def get_session(self):
+ return self._sess
+
+ def get_tid(self):
+ return self.tid
+
+ def get_fid(self):
+ return self.fid
+
+ def isGuestSession(self):
+ return self._action & SMB_SETUP_GUEST
+
+ def doesSupportNTLMv2(self):
+ return self.__isNTLMv2
+
+ def __del__(self):
+ if self._sess:
+ self._sess.close()
+
+ def recvSMB(self):
+ r = self._sess.recv_packet(self.__timeout)
+ return NewSMBPacket(data = r.get_trailer())
+
+ @staticmethod
+ def __decode_trans(params, data):
+ totparamcnt, totdatacnt, _, paramcnt, paramoffset, paramds, datacnt, dataoffset, datads, setupcnt = unpack('<HHHHHHHHHB', params[:19])
+ if paramcnt + paramds < totparamcnt or datacnt + datads < totdatacnt:
+ has_more = 1
+ else:
+ has_more = 0
+ paramoffset = paramoffset - 55 - setupcnt * 2
+ dataoffset = dataoffset - 55 - setupcnt * 2
+ return has_more, params[20:20 + setupcnt * 2], data[paramoffset:paramoffset + paramcnt], data[dataoffset:dataoffset + datacnt]
+
+ # TODO: Move this to NewSMBPacket, it belongs there
+ def signSMB(self, packet, signingSessionKey, signingChallengeResponse):
+ # This logic MUST be applied for messages sent in response to any of the higher-layer actions and in
+ # compliance with the message sequencing rules.
+ # * The client or server that sends the message MUST provide the 32-bit sequence number for this
+ # message, as specified in sections 3.2.4.1 and 3.3.4.1.
+ # * The SMB_FLAGS2_SMB_SECURITY_SIGNATURE flag in the header MUST be set.
+ # * To generate the signature, a 32-bit sequence number is copied into the
+ # least significant 32 bits of the SecuritySignature field and the remaining
+ # 4 bytes are set to 0x00.
+ # * The MD5 algorithm, as specified in [RFC1321], MUST be used to generate a hash of the SMB
+ # message from the start of the SMB Header, which is defined as follows.
+ # CALL MD5Init( md5context )
+ # CALL MD5Update( md5context, Connection.SigningSessionKey )
+ # CALL MD5Update( md5context, Connection.SigningChallengeResponse )
+ # CALL MD5Update( md5context, SMB message )
+ # CALL MD5Final( digest, md5context )
+ # SET signature TO the first 8 bytes of the digest
+ # The resulting 8-byte signature MUST be copied into the SecuritySignature field of the SMB Header,
+ # after which the message can be transmitted.
+
+ #print "seq(%d) signingSessionKey %r, signingChallengeResponse %r" % (self._SignSequenceNumber, signingSessionKey, signingChallengeResponse)
+ packet['SecurityFeatures'] = pack('<q',self._SignSequenceNumber)
+ # Sign with the sequence
+ m = hashlib.md5()
+ m.update( signingSessionKey )
+ m.update( signingChallengeResponse )
+ m.update( str(packet) )
+ # Replace sequence with acual hash
+ packet['SecurityFeatures'] = m.digest()[:8]
+ if self._SignatureVerificationEnabled:
+ self._SignSequenceNumber +=1
+ else:
+ self._SignSequenceNumber +=2
+
+ def checkSignSMB(self, packet, signingSessionKey, signingChallengeResponse):
+ # Let's check
+ signature = packet['SecurityFeatures']
+ #print "Signature received: %r " % signature
+ self.signSMB(packet, signingSessionKey, signingChallengeResponse)
+ #print "Signature calculated: %r" % packet['SecurityFeatures']
+ if self._SignatureVerificationEnabled is not True:
+ self._SignSequenceNumber -= 1
+ return packet['SecurityFeatures'] == signature
+
+ def sendSMB(self,smb):
+ smb['Uid'] = self._uid
+ #At least on AIX, PIDs can exceed 16 bits, so we mask them out
+ smb['Pid'] = (os.getpid() & 0xFFFF)
+ # set flags
+ smb['Flags1'] |= self.__flags1
+ smb['Flags2'] |= self.__flags2
+ if self._SignatureEnabled:
+ smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
+ self.signSMB(smb, self._SigningSessionKey, self._SigningChallengeResponse)
+
+ self._sess.send_packet(str(smb))
+
+ @staticmethod
+ def isValidAnswer(s, cmd):
+ while 1:
+ if s.rawData():
+ if s.get_command() == cmd:
+ 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 )
+ else:
+ break
+ return 0
+
+ def neg_session(self, extended_security = True, negPacket = None):
+ def parsePacket(smb):
+ if smb.isValidAnswer(SMB.SMB_COM_NEGOTIATE):
+ sessionResponse = SMBCommand(smb['Data'][0])
+ self._dialects_parameters = SMBNTLMDialect_Parameters(sessionResponse['Parameters'])
+ self._dialects_data = SMBNTLMDialect_Data()
+ self._dialects_data['ChallengeLength'] = self._dialects_parameters['ChallengeLength']
+ self._dialects_data.fromString(sessionResponse['Data'])
+ if self._dialects_parameters['Capabilities'] & SMB.CAP_EXTENDED_SECURITY:
+ # Whether we choose it or it is enforced by the server, we go for extended security
+ self._dialects_parameters = SMBExtended_Security_Parameters(sessionResponse['Parameters'])
+ self._dialects_data = SMBExtended_Security_Data(sessionResponse['Data'])
+ # Let's setup some variable for later use
+ if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
+ self._SignatureRequired = True
+
+ # Interestingly, the security Blob might be missing sometimes.
+ #spnego = SPNEGO_NegTokenInit(self._dialects_data['SecurityBlob'])
+ #for i in spnego['MechTypes']:
+ # print "Mech Found: %s" % MechTypes[i]
+ return 1
+
+ # If not, let's try the old way
+ else:
+ if self._dialects_data['ServerName'] is not None:
+ self.__server_name = self._dialects_data['ServerName']
+
+ if self._dialects_parameters['DialectIndex'] == 0xffff:
+ raise UnsupportedFeature,"Remote server does not know NT LM 0.12"
+ return 1
+ else:
+ return 0
+
+ if negPacket is None:
+ smb = NewSMBPacket()
+ negSession = SMBCommand(SMB.SMB_COM_NEGOTIATE)
+ flags2 = self.get_flags()[1]
+ if extended_security is True:
+ self.set_flags(flags2=flags2|SMB.FLAGS2_EXTENDED_SECURITY)
+ else:
+ self.set_flags(flags2=flags2 & (~SMB.FLAGS2_EXTENDED_SECURITY))
+
+ negSession['Data'] = '\x02NT LM 0.12\x00'
+ smb.addCommand(negSession)
+ self.sendSMB(smb)
+
+ while 1:
+ smb = self.recvSMB()
+ return parsePacket(smb)
+ else:
+
+ return parsePacket( NewSMBPacket( data = negPacket))
+
+ def tree_connect(self, path, password = '', service = SERVICE_ANY):
+ LOG.warning("[MS-CIFS] This is an original Core Protocol command.This command has been deprecated.Client Implementations SHOULD use SMB_COM_TREE_CONNECT_ANDX")
+
+ # return 0x800
+ if password:
+ # Password is only encrypted if the server passed us an "encryption" during protocol dialect
+ if self._dialects_parameters['ChallengeLength'] > 0:
+ # this code is untested
+ password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
+
+ if not unicode_support:
+ if unicode_convert:
+ path = str(path)
+ else:
+ raise Exception('SMB: Can\t conver path from unicode!')
+
+ smb = NewSMBPacket()
+ treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT)
+ treeConnect['Parameters'] = SMBTreeConnect_Parameters()
+ treeConnect['Data'] = SMBTreeConnect_Data()
+ treeConnect['Data']['Path'] = path.upper()
+ treeConnect['Data']['Password'] = password
+ treeConnect['Data']['Service'] = service
+ smb.addCommand(treeConnect)
+ self.sendSMB(smb)
+
+ while 1:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT):
+ # XXX Here we are ignoring the rest of the response
+ return smb['Tid']
+ return smb['Tid']
+
+ def get_uid(self):
+ return self._uid
+
+ def set_uid(self, uid):
+ self._uid = uid
+
+ def tree_connect_andx(self, path, password = None, service = SERVICE_ANY, smb_packet=None):
+ if password:
+ # Password is only encrypted if the server passed us an "encryption" during protocol dialect
+ if self._dialects_parameters['ChallengeLength'] > 0:
+ # this code is untested
+ password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
+ else:
+ password = '\x00'
+
+ if not unicode_support:
+ if unicode_convert:
+ path = str(path)
+ else:
+ raise Exception('SMB: Can\t convert path from unicode!')
+
+ if smb_packet is None:
+ smb = NewSMBPacket()
+ else:
+ smb = smb_packet
+
+ # Just in case this came with the full path ,let's just leave
+ # the sharename, we'll take care of the rest
+
+ share = path.split('\\')[-1]
+ try:
+ _, _, _, _, sockaddr = socket.getaddrinfo(self.get_remote_host(), 80, 0, 0, socket.IPPROTO_TCP)[0]
+ remote_host = sockaddr[0]
+ except Exception:
+ remote_host = self.get_remote_host()
+
+ path = '\\\\' + remote_host + '\\' +share
+ path = path.upper().encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
+
+ treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT_ANDX)
+ treeConnect['Parameters'] = SMBTreeConnectAndX_Parameters()
+ treeConnect['Data'] = SMBTreeConnectAndX_Data(flags=self.__flags2)
+ treeConnect['Parameters']['PasswordLength'] = len(password)
+ treeConnect['Data']['Password'] = password
+ treeConnect['Data']['Path'] = path
+ treeConnect['Data']['Service'] = service
+
+ if self.__flags2 & SMB.FLAGS2_UNICODE:
+ treeConnect['Data']['Pad'] = 0x0
+
+ smb.addCommand(treeConnect)
+
+ # filename = "\PIPE\epmapper"
+
+ # ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
+ # ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
+ # ntCreate['Data'] = SMBNtCreateAndX_Data()
+ # ntCreate['Parameters']['FileNameLength'] = len(filename)
+ # ntCreate['Parameters']['CreateFlags'] = 0
+ # ntCreate['Parameters']['AccessMask'] = 0x3
+ # ntCreate['Parameters']['CreateOptions'] = 0x0
+ # ntCreate['Data']['FileName'] = filename
+
+ # smb.addCommand(ntCreate)
+ self.sendSMB(smb)
+
+ while 1:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT_ANDX):
+ # XXX Here we are ignoring the rest of the response
+ self.tid = smb['Tid']
+ return self.tid
+ self.tid = smb['Tid']
+ return self.tid
+
+ # backwars compatibility
+ connect_tree = tree_connect_andx
+
+ @staticmethod
+ def getDialect():
+ return SMB_DIALECT
+
+ def get_server_name(self):
+ #return self._dialects_data['ServerName']
+ return self.__server_name
+
+ def get_session_key(self):
+ return self._SigningSessionKey
+
+ def set_session_key(self, key):
+ self._SigningSessionKey = key
+
+ def get_encryption_key(self):
+ if self._dialects_data.fields.has_key('Challenge'):
+ return self._dialects_data['Challenge']
+ else:
+ return None
+
+ def get_server_time(self):
+ timestamp = self._dialects_parameters['HighDateTime']
+ timestamp <<= 32
+ timestamp |= self._dialects_parameters['LowDateTime']
+ timestamp -= 116444736000000000
+ timestamp /= 10000000
+ d = datetime.datetime.utcfromtimestamp(timestamp)
+ return d.strftime("%a, %d %b %Y %H:%M:%S GMT")
+
+ def disconnect_tree(self, tid):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ smb.addCommand(SMBCommand(SMB.SMB_COM_TREE_DISCONNECT))
+
+ self.sendSMB(smb)
+ self.recvSMB()
+
+ def open(self, tid, filename, open_mode, desired_access):
+ filename = string.replace(filename,'/', '\\')
+ filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
+
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ openFile = SMBCommand(SMB.SMB_COM_OPEN)
+ openFile['Parameters'] = SMBOpen_Parameters()
+ openFile['Parameters']['DesiredAccess'] = desired_access
+ openFile['Parameters']['OpenMode'] = open_mode
+ openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
+ openFile['Data'] = SMBOpen_Data(flags=self.__flags2)
+ openFile['Data']['FileName'] = filename
+
+ if self.__flags2 & SMB.FLAGS2_UNICODE:
+ openFile['Data']['Pad'] = 0x0
+
+ smb.addCommand(openFile)
+
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_OPEN):
+ # XXX Here we are ignoring the rest of the response
+ openFileResponse = SMBCommand(smb['Data'][0])
+ openFileParameters = SMBOpenResponse_Parameters(openFileResponse['Parameters'])
+
+ return (
+ openFileParameters['Fid'],
+ openFileParameters['FileAttributes'],
+ openFileParameters['LastWriten'],
+ openFileParameters['FileSize'],
+ openFileParameters['GrantedAccess'],
+ )
+
+ def open_andx(self, tid, filename, open_mode, desired_access):
+ filename = string.replace(filename,'/', '\\')
+ filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
+
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ openFile = SMBCommand(SMB.SMB_COM_OPEN_ANDX)
+ openFile['Parameters'] = SMBOpenAndX_Parameters()
+ openFile['Parameters']['DesiredAccess'] = desired_access
+ openFile['Parameters']['OpenMode'] = open_mode
+ openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
+ openFile['Data'] = SMBOpenAndX_Data(flags=self.__flags2)
+ openFile['Data']['FileName'] = filename
+
+ if self.__flags2 & SMB.FLAGS2_UNICODE:
+ openFile['Data']['Pad'] = 0x0
+
+ smb.addCommand(openFile)
+
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_OPEN_ANDX):
+ # XXX Here we are ignoring the rest of the response
+ openFileResponse = SMBCommand(smb['Data'][0])
+ openFileParameters = SMBOpenAndXResponse_Parameters(openFileResponse['Parameters'])
+
+ return (
+ openFileParameters['Fid'],
+ openFileParameters['FileAttributes'],
+ openFileParameters['LastWriten'],
+ openFileParameters['FileSize'],
+ openFileParameters['GrantedAccess'],
+ openFileParameters['FileType'],
+ openFileParameters['IPCState'],
+ openFileParameters['Action'],
+ openFileParameters['ServerFid'],
+ )
+
+ def close(self, tid, fid):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ closeFile = SMBCommand(SMB.SMB_COM_CLOSE)
+ closeFile['Parameters'] = SMBClose_Parameters()
+ closeFile['Parameters']['FID'] = fid
+ smb.addCommand(closeFile)
+
+ self.sendSMB(smb)
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_CLOSE):
+ return 1
+ return 0
+
+ def send_trans(self, tid, setup, name, param, data, noAnswer = 0):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION)
+ transCommand['Parameters'] = SMBTransaction_Parameters()
+ transCommand['Data'] = SMBTransaction_Data()
+
+ transCommand['Parameters']['Setup'] = setup
+ transCommand['Parameters']['TotalParameterCount'] = len(param)
+ transCommand['Parameters']['TotalDataCount'] = len(data)
+
+ transCommand['Parameters']['ParameterCount'] = len(param)
+ transCommand['Parameters']['ParameterOffset'] = 32+3+28+len(setup)+len(name)
+
+ transCommand['Parameters']['DataCount'] = len(data)
+ transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param)
+
+ transCommand['Data']['Name'] = name
+ transCommand['Data']['Trans_Parameters'] = param
+ transCommand['Data']['Trans_Data'] = data
+
+ if noAnswer:
+ transCommand['Parameters']['Flags'] = TRANS_NO_RESPONSE
+
+ smb.addCommand(transCommand)
+
+ self.sendSMB(smb)
+
+ def send_trans2(self, tid, setup, name, param, data):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ command = pack('<H', setup)
+
+ transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION2)
+ transCommand['Parameters'] = SMBTransaction2_Parameters()
+ transCommand['Parameters']['MaxDataCount'] = self._dialects_parameters['MaxBufferSize']
+ transCommand['Data'] = SMBTransaction2_Data()
+
+ transCommand['Parameters']['Setup'] = command
+ transCommand['Parameters']['TotalParameterCount'] = len(param)
+ transCommand['Parameters']['TotalDataCount'] = len(data)
+
+ if len(param) > 0:
+ padLen = (4 - (32+2+28 + len(command)) % 4 ) % 4
+ padBytes = '\xFF' * padLen
+ transCommand['Data']['Pad1'] = padBytes
+ else:
+ transCommand['Data']['Pad1'] = ''
+ padLen = 0
+
+ transCommand['Parameters']['ParameterCount'] = len(param)
+ transCommand['Parameters']['ParameterOffset'] = 32+2+28+len(command)+len(name) + padLen
+
+ if len(data) > 0:
+ pad2Len = (4 - (32+2+28 + len(command) + padLen + len(param)) % 4) % 4
+ transCommand['Data']['Pad2'] = '\xFF' * pad2Len
+ else:
+ transCommand['Data']['Pad2'] = ''
+ pad2Len = 0
+
+ transCommand['Parameters']['DataCount'] = len(data)
+ transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param) + pad2Len
+
+ transCommand['Data']['Name'] = name
+ transCommand['Data']['Trans_Parameters'] = param
+ transCommand['Data']['Trans_Data'] = data
+ smb.addCommand(transCommand)
+
+ self.sendSMB(smb)
+
+ def query_file_info(self, tid, fid, fileInfoClass = SMB_QUERY_FILE_STANDARD_INFO):
+ self.send_trans2(tid, SMB.TRANS2_QUERY_FILE_INFORMATION, '\x00', pack('<HH', fid, fileInfoClass), '')
+
+ resp = self.recvSMB()
+ if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
+ trans2Response = SMBCommand(resp['Data'][0])
+ trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
+ # Remove Potential Prefix Padding
+ return trans2Response['Data'][-trans2Parameters['TotalDataCount']:]
+
+ def __nonraw_retr_file(self, tid, fid, offset, datasize, callback):
+ if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
+ max_buf_size = 65000
+ else:
+ max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Read in multiple KB blocks
+
+ read_offset = offset
+ while read_offset < datasize:
+ data = self.read_andx(tid, fid, read_offset, max_buf_size)
+
+ callback(data)
+ read_offset += len(data)
+
+ def __nonraw_stor_file(self, tid, fid, offset, datasize, callback):
+ if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_WRITEX) and self._SignatureEnabled is False:
+ max_buf_size = 65000
+ else:
+ max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Write in multiple KB blocks
+
+ write_offset = offset
+ while 1:
+ data = callback(max_buf_size)
+ if not data:
+ break
+
+ smb = self.write_andx(tid,fid,data, write_offset)
+ writeResponse = SMBCommand(smb['Data'][0])
+ writeResponseParameters = SMBWriteAndXResponse_Parameters(writeResponse['Parameters'])
+ write_offset += writeResponseParameters['Count']
+
+ def get_server_domain(self):
+ return self.__server_domain
+
+ def get_server_dns_domain_name(self):
+ return self.__server_dns_domain_name
+
+ def get_server_os(self):
+ return self.__server_os
+
+ def get_server_os_major(self):
+ return self.__server_os_major
+
+ def get_server_os_minor(self):
+ return self.__server_os_minor
+
+ def get_server_os_build(self):
+ return self.__server_os_build
+
+ def set_server_os(self, os):
+ self.__server_os = os
+
+ def get_server_lanman(self):
+ return self.__server_lanman
+
+ def is_login_required(self):
+ # Login is required if share mode is user.
+ # Otherwise only public services or services in share mode
+ # are allowed.
+ return (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_USER
+
+ def is_signing_required(self):
+ return self._SignatureRequired
+
+ def get_ntlmv1_response(self, key):
+ challenge = self._dialects_data['Challenge']
+ return ntlm.get_ntlmv1_response(key, challenge)
+
+ def kerberos_login(self, user, password, domain = '', lmhash = '', nthash = '', aesKey = '', kdcHost = '', TGT=None, TGS=None):
+ # Importing down here so pyasn1 is not required if kerberos is not used.
+ from impacket.krb5.asn1 import AP_REQ, Authenticator, TGS_REP, seq_set
+ from impacket.krb5.kerberosv5 import getKerberosTGT, getKerberosTGS
+ from impacket.krb5 import constants
+ from impacket.krb5.types import Principal, KerberosTime, Ticket
+ from pyasn1.codec.der import decoder, encoder
+ import datetime
+
+ # login feature does not support unicode
+ # disable it if enabled
+ flags2 = self.__flags2
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
+
+ # If TGT or TGS are specified, they are in the form of:
+ # TGS['KDC_REP'] = the response from the server
+ # TGS['cipher'] = the cipher used
+ # TGS['sessionKey'] = the sessionKey
+ # If we have hashes, normalize them
+ if lmhash != '' or nthash != '':
+ if len(lmhash) % 2: lmhash = '0%s' % lmhash
+ if len(nthash) % 2: nthash = '0%s' % nthash
+ try: # just in case they were converted already
+ lmhash = a2b_hex(lmhash)
+ nthash = a2b_hex(nthash)
+ except:
+ pass
+
+ self.__userName = user
+ self.__password = password
+ self.__domain = domain
+ self.__lmhash = lmhash
+ self.__nthash = nthash
+ self.__aesKey = aesKey
+ self.__kdc = kdcHost
+ self.__TGT = TGT
+ self.__TGS = TGS
+
+ # First of all, we need to get a TGT for the user
+ userName = Principal(user, type=constants.PrincipalNameType.NT_PRINCIPAL.value)
+ if TGT is None:
+ if TGS is None:
+ tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(userName, password, domain, lmhash, nthash, aesKey, kdcHost)
+ else:
+ tgt = TGT['KDC_REP']
+ cipher = TGT['cipher']
+ sessionKey = TGT['sessionKey']
+
+ # Now that we have the TGT, we should ask for a TGS for cifs
+
+ if TGS is None:
+ serverName = Principal('cifs/%s' % self.__remote_name, type=constants.PrincipalNameType.NT_SRV_INST.value)
+ tgs, cipher, oldSessionKey, sessionKey = getKerberosTGS(serverName, domain, kdcHost, tgt, cipher, sessionKey)
+ else:
+ tgs = TGS['KDC_REP']
+ cipher = TGS['cipher']
+ sessionKey = TGS['sessionKey']
+
+ smb = NewSMBPacket()
+
+ # Are we required to sign SMB? If so we do it, if not we skip it
+ if self._SignatureRequired:
+ smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
+
+
+ sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
+ sessionSetup['Parameters'] = SMBSessionSetupAndX_Extended_Parameters()
+ sessionSetup['Data'] = SMBSessionSetupAndX_Extended_Data()
+
+ sessionSetup['Parameters']['MaxBufferSize'] = 61440
+ sessionSetup['Parameters']['MaxMpxCount'] = 2
+ sessionSetup['Parameters']['VcNumber'] = 1
+ sessionSetup['Parameters']['SessionKey'] = 0
+ sessionSetup['Parameters']['Capabilities'] = SMB.CAP_EXTENDED_SECURITY | SMB.CAP_USE_NT_ERRORS | SMB.CAP_UNICODE | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
+
+
+ # Let's build a NegTokenInit with the NTLMSSP
+ # TODO: In the future we should be able to choose different providers
+
+ blob = SPNEGO_NegTokenInit()
+
+ # Kerberos v5 mech
+ blob['MechTypes'] = [TypesMech['MS KRB5 - Microsoft Kerberos 5']]
+
+ # Let's extract the ticket from the TGS
+ tgs = decoder.decode(tgs, asn1Spec = TGS_REP())[0]
+ ticket = Ticket()
+ ticket.from_asn1(tgs['ticket'])
+
+ # Now let's build the AP_REQ
+ apReq = AP_REQ()
+ apReq['pvno'] = 5
+ apReq['msg-type'] = int(constants.ApplicationTagNumbers.AP_REQ.value)
+
+ opts = list()
+ apReq['ap-options'] = constants.encodeFlags(opts)
+ seq_set(apReq,'ticket', ticket.to_asn1)
+
+ authenticator = Authenticator()
+ authenticator['authenticator-vno'] = 5
+ authenticator['crealm'] = domain
+ seq_set(authenticator, 'cname', userName.components_to_asn1)
+ now = datetime.datetime.utcnow()
+
+ authenticator['cusec'] = now.microsecond
+ authenticator['ctime'] = KerberosTime.to_asn1(now)
+
+ encodedAuthenticator = encoder.encode(authenticator)
+
+ # Key Usage 11
+ # AP-REQ Authenticator (includes application authenticator
+ # subkey), encrypted with the application session key
+ # (Section 5.5.1)
+ encryptedEncodedAuthenticator = cipher.encrypt(sessionKey, 11, encodedAuthenticator, None)
+
+ apReq['authenticator'] = None
+ apReq['authenticator']['etype'] = cipher.enctype
+ apReq['authenticator']['cipher'] = encryptedEncodedAuthenticator
+
+ blob['MechToken'] = encoder.encode(apReq)
+
+ sessionSetup['Parameters']['SecurityBlobLength'] = len(blob)
+ sessionSetup['Parameters'].getData()
+ sessionSetup['Data']['SecurityBlob'] = blob.getData()
+
+ # Fake Data here, don't want to get us fingerprinted
+ sessionSetup['Data']['NativeOS'] = 'Unix'
+ sessionSetup['Data']['NativeLanMan'] = 'Samba'
+
+ smb.addCommand(sessionSetup)
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
+ # We will need to use this uid field for all future requests/responses
+ self._uid = smb['Uid']
+
+ # Now we have to extract the blob to continue the auth process
+ sessionResponse = SMBCommand(smb['Data'][0])
+ sessionParameters = SMBSessionSetupAndX_Extended_Response_Parameters(sessionResponse['Parameters'])
+ sessionData = SMBSessionSetupAndX_Extended_Response_Data(flags = smb['Flags2'])
+ sessionData['SecurityBlobLength'] = sessionParameters['SecurityBlobLength']
+ sessionData.fromString(sessionResponse['Data'])
+
+ self._action = sessionParameters['Action']
+ # If smb sign required, let's enable it for the rest of the connection
+ if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
+ self._SigningSessionKey = sessionKey.contents
+ self._SignSequenceNumber = 2
+ self._SignatureEnabled = True
+
+ # restore unicode flag if needed
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 |= SMB.FLAGS2_UNICODE
+
+ return 1
+ else:
+ raise Exception('Error: Could not login successfully')
+
+ def login_extended(self, user, password, domain = '', lmhash = '', nthash = '', use_ntlmv2 = True ):
+
+ # login feature does not support unicode
+ # disable it if enabled
+ flags2 = self.__flags2
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
+
+ # Once everything's working we should join login methods into a single one
+ smb = NewSMBPacket()
+ # Are we required to sign SMB? If so we do it, if not we skip it
+ if self._SignatureRequired:
+ smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
+
+ sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
+ sessionSetup['Parameters'] = SMBSessionSetupAndX_Extended_Parameters()
+ sessionSetup['Data'] = SMBSessionSetupAndX_Extended_Data()
+
+ sessionSetup['Parameters']['MaxBufferSize'] = 61440
+ sessionSetup['Parameters']['MaxMpxCount'] = 2
+ sessionSetup['Parameters']['VcNumber'] = 1
+ sessionSetup['Parameters']['SessionKey'] = 0
+ sessionSetup['Parameters']['Capabilities'] = SMB.CAP_EXTENDED_SECURITY | SMB.CAP_USE_NT_ERRORS | SMB.CAP_UNICODE | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
+
+
+ # Let's build a NegTokenInit with the NTLMSSP
+ # TODO: In the future we should be able to choose different providers
+
+ blob = SPNEGO_NegTokenInit()
+
+ # NTLMSSP
+ blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
+ auth = ntlm.getNTLMSSPType1('','',self._SignatureRequired, use_ntlmv2 = use_ntlmv2)
+ blob['MechToken'] = str(auth)
+
+ sessionSetup['Parameters']['SecurityBlobLength'] = len(blob)
+ sessionSetup['Parameters'].getData()
+ sessionSetup['Data']['SecurityBlob'] = blob.getData()
+
+ # Fake Data here, don't want to get us fingerprinted
+ sessionSetup['Data']['NativeOS'] = 'Unix'
+ sessionSetup['Data']['NativeLanMan'] = 'Samba'
+
+ smb.addCommand(sessionSetup)
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
+ # We will need to use this uid field for all future requests/responses
+ self._uid = smb['Uid']
+
+ # Now we have to extract the blob to continue the auth process
+ sessionResponse = SMBCommand(smb['Data'][0])
+ sessionParameters = SMBSessionSetupAndX_Extended_Response_Parameters(sessionResponse['Parameters'])
+ sessionData = SMBSessionSetupAndX_Extended_Response_Data(flags = smb['Flags2'])
+ sessionData['SecurityBlobLength'] = sessionParameters['SecurityBlobLength']
+ sessionData.fromString(sessionResponse['Data'])
+ respToken = SPNEGO_NegTokenResp(sessionData['SecurityBlob'])
+
+ # Let's parse some data and keep it to ourselves in case it is asked
+ ntlmChallenge = ntlm.NTLMAuthChallenge(respToken['ResponseToken'])
+ if ntlmChallenge['TargetInfoFields_len'] > 0:
+ av_pairs = ntlm.AV_PAIRS(ntlmChallenge['TargetInfoFields'][:ntlmChallenge['TargetInfoFields_len']])
+ if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] is not None:
+ try:
+ self.__server_name = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+ if av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] is not None:
+ try:
+ if self.__server_name != av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le'):
+ self.__server_domain = av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+ if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] is not None:
+ try:
+ self.__server_dns_domain_name = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+
+ # Parse Version to know the target Operating system name. Not provided elsewhere anymore
+ if ntlmChallenge.fields.has_key('Version'):
+ version = ntlmChallenge['Version']
+
+ if len(version) >= 4:
+ self.__server_os_major, self.__server_os_minor, self.__server_os_build = unpack('<BBH',version[:4])
+
+ type3, exportedSessionKey = ntlm.getNTLMSSPType3(auth, respToken['ResponseToken'], user, password, domain, lmhash, nthash, use_ntlmv2 = use_ntlmv2)
+
+ if exportedSessionKey is not None:
+ self._SigningSessionKey = exportedSessionKey
+
+ smb = NewSMBPacket()
+
+ # Are we required to sign SMB? If so we do it, if not we skip it
+ if self._SignatureRequired:
+ smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
+
+ respToken2 = SPNEGO_NegTokenResp()
+ respToken2['ResponseToken'] = str(type3)
+
+ # Reusing the previous structure
+ sessionSetup['Parameters']['SecurityBlobLength'] = len(respToken2)
+ sessionSetup['Data']['SecurityBlob'] = respToken2.getData()
+
+ # Storing some info for later use
+ self.__server_os = sessionData['NativeOS']
+ self.__server_lanman = sessionData['NativeLanMan']
+
+ smb.addCommand(sessionSetup)
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ self._uid = 0
+ if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
+ self._uid = smb['Uid']
+ sessionResponse = SMBCommand(smb['Data'][0])
+ sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
+
+ self._action = sessionParameters['Action']
+ # If smb sign required, let's enable it for the rest of the connection
+ if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
+ self._SignSequenceNumber = 2
+ self._SignatureEnabled = True
+
+ # restore unicode flag if needed
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 |= SMB.FLAGS2_UNICODE
+
+ return 1
+ else:
+ raise Exception('Error: Could not login successfully')
+
+ def getCredentials(self):
+ return (
+ self.__userName,
+ self.__password,
+ self.__domain,
+ self.__lmhash,
+ self.__nthash,
+ self.__aesKey,
+ self.__TGT,
+ self.__TGS)
+
+ def getIOCapabilities(self):
+ res = dict()
+ if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
+ max_size = 65000
+ else:
+ max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
+ res['MaxReadSize'] = max_size
+ res['MaxWriteSize'] = max_size
+ return res
+
+ def login(self, user, password, domain = '', lmhash = '', nthash = '', ntlm_fallback = True):
+
+ # If we have hashes, normalize them
+ if lmhash != '' or nthash != '':
+ if len(lmhash) % 2: lmhash = '0%s' % lmhash
+ if len(nthash) % 2: nthash = '0%s' % nthash
+ try: # just in case they were converted already
+ lmhash = a2b_hex(lmhash)
+ nthash = a2b_hex(nthash)
+ except:
+ pass
+
+ self.__userName = user
+ self.__password = password
+ self.__domain = domain
+ self.__lmhash = lmhash
+ self.__nthash = nthash
+ self.__aesKey = ''
+ self.__TGT = None
+ self.__TGS = None
+
+ if self._dialects_parameters['Capabilities'] & SMB.CAP_EXTENDED_SECURITY:
+ try:
+ self.login_extended(user, password, domain, lmhash, nthash, use_ntlmv2 = True)
+ except:
+ # If the target OS is Windows 5.0 or Samba, let's try using NTLMv1
+ if ntlm_fallback and ((self.get_server_lanman().find('Windows 2000') != -1) or (self.get_server_lanman().find('Samba') != -1)):
+ self.login_extended(user, password, domain, lmhash, nthash, use_ntlmv2 = False)
+ self.__isNTLMv2 = False
+ else:
+ raise
+ elif ntlm_fallback:
+ self.login_standard(user, password, domain, lmhash, nthash)
+ self.__isNTLMv2 = False
+ else:
+ raise SessionError('Cannot authenticate against target, enable ntlm_fallback')
+
+ def login_standard(self, user, password, domain = '', lmhash = '', nthash = ''):
+
+ # login feature does not support unicode
+ # disable it if enabled
+ flags2 = self.__flags2
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
+
+ # Only supports NTLMv1
+ # Password is only encrypted if the server passed us an "encryption key" during protocol dialect negotiation
+ if self._dialects_parameters['ChallengeLength'] > 0:
+ if lmhash != '' or nthash != '':
+ pwd_ansi = self.get_ntlmv1_response(lmhash)
+ pwd_unicode = self.get_ntlmv1_response(nthash)
+ elif password:
+ lmhash = ntlm.compute_lmhash(password)
+ nthash = ntlm.compute_nthash(password)
+ pwd_ansi = self.get_ntlmv1_response(lmhash)
+ pwd_unicode = self.get_ntlmv1_response(nthash)
+ else: # NULL SESSION
+ pwd_ansi = ''
+ pwd_unicode = ''
+ else:
+ pwd_ansi = password
+ pwd_unicode = ''
+
+ smb = NewSMBPacket()
+
+ sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
+ sessionSetup['Parameters'] = SMBSessionSetupAndX_Parameters()
+ sessionSetup['Data'] = SMBSessionSetupAndX_Data()
+
+ sessionSetup['Parameters']['MaxBuffer'] = 61440
+ sessionSetup['Parameters']['MaxMpxCount'] = 2
+ sessionSetup['Parameters']['VCNumber'] = os.getpid()
+ sessionSetup['Parameters']['SessionKey'] = self._dialects_parameters['SessionKey']
+ sessionSetup['Parameters']['AnsiPwdLength'] = len(pwd_ansi)
+ sessionSetup['Parameters']['UnicodePwdLength'] = len(pwd_unicode)
+ sessionSetup['Parameters']['Capabilities'] = SMB.CAP_RAW_MODE | SMB.CAP_USE_NT_ERRORS | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
+
+ sessionSetup['Data']['AnsiPwd'] = pwd_ansi
+ sessionSetup['Data']['UnicodePwd'] = pwd_unicode
+ sessionSetup['Data']['Account'] = str(user)
+ sessionSetup['Data']['PrimaryDomain'] = str(domain)
+ sessionSetup['Data']['NativeOS'] = str(os.name)
+ sessionSetup['Data']['NativeLanMan'] = 'pysmb'
+ smb.addCommand(sessionSetup)
+
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
+ # We will need to use this uid field for all future requests/responses
+ self._uid = smb['Uid']
+ sessionResponse = SMBCommand(smb['Data'][0])
+ sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
+ sessionData = SMBSessionSetupAndXResponse_Data(flags = smb['Flags2'], data = sessionResponse['Data'])
+
+ self._action = sessionParameters['Action']
+
+ # Still gotta figure out how to do this with no EXTENDED_SECURITY
+ if sessionParameters['Action'] & SMB_SETUP_USE_LANMAN_KEY == 0:
+ self._SigningChallengeResponse = sessionSetup['Data']['UnicodePwd']
+ self._SigningSessionKey = nthash
+ else:
+ self._SigningChallengeResponse = sessionSetup['Data']['AnsiPwd']
+ self._SigningSessionKey = lmhash
+
+ #self._SignSequenceNumber = 1
+ #self.checkSignSMB(smb, self._SigningSessionKey ,self._SigningChallengeResponse)
+ #self._SignatureEnabled = True
+ self.__server_os = sessionData['NativeOS']
+ self.__server_lanman = sessionData['NativeLanMan']
+ self.__server_domain = sessionData['PrimaryDomain']
+
+ # restore unicode flag if needed
+ if flags2 & SMB.FLAGS2_UNICODE:
+ self.__flags2 |= SMB.FLAGS2_UNICODE
+
+ return 1
+ else: raise Exception('Error: Could not login successfully')
+
+ def waitNamedPipe(self, tid, pipe, timeout = 5, noAnswer = 0):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION)
+ transCommand['Parameters'] = SMBTransaction_Parameters()
+ transCommand['Data'] = SMBTransaction_Data()
+
+ setup = '\x53\x00\x00\x00'
+ name = '\\PIPE%s\x00' % pipe
+ transCommand['Parameters']['Setup'] = setup
+ transCommand['Parameters']['TotalParameterCount'] = 0
+ transCommand['Parameters']['TotalDataCount'] = 0
+ transCommand['Parameters']['MaxParameterCount'] = 0
+ transCommand['Parameters']['MaxDataCount'] = 0
+ transCommand['Parameters']['Timeout'] = timeout * 1000
+
+ transCommand['Parameters']['ParameterCount'] = 0
+ transCommand['Parameters']['ParameterOffset'] = 32+3+28+len(setup)+len(name)
+
+ transCommand['Parameters']['DataCount'] = 0
+ transCommand['Parameters']['DataOffset'] = 0
+
+ transCommand['Data']['Name'] = name
+ transCommand['Data']['Trans_Parameters'] = ''
+ transCommand['Data']['Trans_Data'] = ''
+
+ if noAnswer:
+ transCommand['Parameters']['Flags'] = TRANS_NO_RESPONSE
+
+ smb.addCommand(transCommand)
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_TRANSACTION):
+ return 1
+ return 0
+
+ def read(self, tid, fid, offset=0, max_size = None, wait_answer=1):
+ if not max_size:
+ max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
+
+ # max_size is not working, because although it would, the server returns an error (More data avail)
+
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ read = SMBCommand(SMB.SMB_COM_READ)
+ read['Parameters'] = SMBRead_Parameters()
+ read['Parameters']['Fid'] = fid
+ read['Parameters']['Offset'] = offset
+ read['Parameters']['Count'] = max_size
+ smb.addCommand(read)
+
+ if wait_answer:
+ while 1:
+ self.sendSMB(smb)
+ ans = self.recvSMB()
+
+ if ans.isValidAnswer(SMB.SMB_COM_READ):
+ readResponse = SMBCommand(ans['Data'][0])
+ readData = SMBReadResponse_Data(readResponse['Data'])
+
+ return readData['Data']
+
+ return None
+
+ def read_andx(self, tid, fid, offset=0, max_size = None, wait_answer=1, smb_packet=None):
+ if not max_size:
+ if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
+ max_size = 65000
+ else:
+ max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
+
+ # max_size is not working, because although it would, the server returns an error (More data avail)
+
+ if smb_packet is None:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ readAndX = SMBCommand(SMB.SMB_COM_READ_ANDX)
+ readAndX['Parameters'] = SMBReadAndX_Parameters()
+ readAndX['Parameters']['Fid'] = fid
+ readAndX['Parameters']['Offset'] = offset
+ readAndX['Parameters']['MaxCount'] = max_size
+ smb.addCommand(readAndX)
+ else:
+ smb = smb_packet
+
+ if wait_answer:
+ answer = ''
+ while 1:
+ self.sendSMB(smb)
+ ans = self.recvSMB()
+
+ if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
+ # XXX Here we are only using a few fields from the response
+ readAndXResponse = SMBCommand(ans['Data'][0])
+ readAndXParameters = SMBReadAndXResponse_Parameters(readAndXResponse['Parameters'])
+
+ offset = readAndXParameters['DataOffset']
+ count = readAndXParameters['DataCount']+0x10000*readAndXParameters['DataCount_Hi']
+ answer += str(ans)[offset:offset+count]
+ if not ans.isMoreData():
+ return answer
+ max_size = min(max_size, readAndXParameters['Remaining'])
+ readAndX['Parameters']['Offset'] += count # XXX Offset is not important (apparently)
+ else:
+ self.sendSMB(smb)
+ ans = self.recvSMB()
+
+ try:
+ if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
+ return ans
+ else:
+ return None
+ except:
+ return ans
+
+ return None
+
+ def read_raw(self, tid, fid, offset=0, max_size = None, wait_answer=1):
+ if not max_size:
+ max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
+
+ # max_size is not working, because although it would, the server returns an error (More data avail)
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ readRaw = SMBCommand(SMB.SMB_COM_READ_RAW)
+ readRaw['Parameters'] = SMBReadRaw_Parameters()
+ readRaw['Parameters']['Fid'] = fid
+ readRaw['Parameters']['Offset'] = offset
+ readRaw['Parameters']['MaxCount'] = max_size
+ smb.addCommand(readRaw)
+
+ self.sendSMB(smb)
+ if wait_answer:
+ data = self._sess.recv_packet(self.__timeout).get_trailer()
+ if not data:
+ # If there is no data it means there was an error
+ data = self.read_andx(tid, fid, offset, max_size)
+ return data
+
+ return None
+
+ def write(self,tid,fid,data, offset = 0, wait_answer=1):
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ write = SMBCommand(SMB.SMB_COM_WRITE)
+ write['Parameters'] = SMBWrite_Parameters()
+ write['Data'] = SMBWrite_Data()
+ write['Parameters']['Fid'] = fid
+ write['Parameters']['Count'] = len(data)
+ write['Parameters']['Offset'] = offset
+ write['Parameters']['Remaining'] = len(data)
+ write['Data']['Data'] = data
+ smb.addCommand(write)
+
+ self.sendSMB(smb)
+
+ if wait_answer:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_WRITE):
+ return smb
+ return None
+
+ def write_andx(self,tid,fid,data, offset = 0, wait_answer=1, write_pipe_mode = False, smb_packet=None):
+ if smb_packet is None:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ writeAndX = SMBCommand(SMB.SMB_COM_WRITE_ANDX)
+ smb.addCommand(writeAndX)
+
+ writeAndX['Parameters'] = SMBWriteAndX_Parameters()
+ writeAndX['Parameters']['Fid'] = fid
+ writeAndX['Parameters']['Offset'] = offset
+ writeAndX['Parameters']['WriteMode'] = 8
+ writeAndX['Parameters']['Remaining'] = len(data)
+ writeAndX['Parameters']['DataLength'] = len(data)
+ writeAndX['Parameters']['DataOffset'] = len(smb) # this length already includes the parameter
+ writeAndX['Data'] = data
+
+ if write_pipe_mode is True:
+ # First of all we gotta know what the MaxBuffSize is
+ maxBuffSize = self._dialects_parameters['MaxBufferSize']
+ if len(data) > maxBuffSize:
+ chunks_size = maxBuffSize - 60
+ writeAndX['Parameters']['WriteMode'] = 0x0c
+ sendData = '\xff\xff' + data
+ totalLen = len(sendData)
+ writeAndX['Parameters']['DataLength'] = chunks_size
+ writeAndX['Parameters']['Remaining'] = totalLen-2
+ writeAndX['Data'] = sendData[:chunks_size]
+
+ self.sendSMB(smb)
+ if wait_answer:
+ smbResp = self.recvSMB()
+ smbResp.isValidAnswer(SMB.SMB_COM_WRITE_ANDX)
+
+ alreadySent = chunks_size
+ sendData = sendData[chunks_size:]
+
+ while alreadySent < totalLen:
+ writeAndX['Parameters']['WriteMode'] = 0x04
+ writeAndX['Parameters']['DataLength'] = len(sendData[:chunks_size])
+ writeAndX['Data'] = sendData[:chunks_size]
+ self.sendSMB(smb)
+ if wait_answer:
+ smbResp = self.recvSMB()
+ smbResp.isValidAnswer(SMB.SMB_COM_WRITE_ANDX)
+ alreadySent += writeAndX['Parameters']['DataLength']
+ sendData = sendData[chunks_size:]
+
+ return smbResp
+
+ else:
+ smb = smb_packet
+
+ self.sendSMB(smb)
+
+ if wait_answer:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_WRITE_ANDX):
+ return smb
+ return None
+
+ def write_raw(self,tid,fid,data, offset = 0, wait_answer=1):
+ LOG.warning("[MS-CIFS] This command was introduced in the CorePlus dialect, but is often listed as part of the LAN Manager 1.0 dialect.This command has been deprecated.Clients SHOULD use SMB_COM_WRITE_ANDX")
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+
+ writeRaw = SMBCommand(SMB.SMB_COM_WRITE_RAW)
+ writeRaw['Parameters'] = SMBWriteRaw_Parameters()
+ writeRaw['Parameters']['Fid'] = fid
+ writeRaw['Parameters']['Offset'] = offset
+ writeRaw['Parameters']['Count'] = len(data)
+ writeRaw['Parameters']['DataLength'] = 0
+ writeRaw['Parameters']['DataOffset'] = 0
+ smb.addCommand(writeRaw)
+
+ self.sendSMB(smb)
+ self._sess.send_packet(data)
+
+ if wait_answer:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_WRITE_RAW):
+ return smb
+ return None
+
+ def TransactNamedPipe(self, tid, fid, data = '', noAnswer = 0, waitAnswer = 1, offset = 0):
+ self.send_trans(tid,pack('<HH', 0x26, fid),'\\PIPE\\\x00','',data, noAnswer = noAnswer)
+
+ if noAnswer or not waitAnswer:
+ return
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_TRANSACTION):
+ transResponse = SMBCommand(smb['Data'][0])
+ transParameters = SMBTransactionResponse_Parameters(transResponse['Parameters'])
+ return transResponse['Data'][-transParameters['TotalDataCount']:] # Remove Potential Prefix Padding
+ return None
+
+ def TransactNamedPipeRecv(self):
+ s = self.recvSMB()
+ if s.isValidAnswer(SMB.SMB_COM_TRANSACTION):
+ transResponse = SMBCommand(s['Data'][0])
+ transParameters = SMBTransactionResponse_Parameters(transResponse['Parameters'])
+ return transResponse['Data'][-transParameters['TotalDataCount']:] # Remove Potential Prefix Padding
+ return None
+
+ def nt_create_andx(self,tid,filename, smb_packet=None, cmd = None, shareAccessMode = FILE_SHARE_READ | FILE_SHARE_WRITE, disposition = FILE_OPEN, accessMask = 0x2019f):
+ filename = filename.replace('/', '\\')
+ filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
+
+ if smb_packet is None:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ else:
+ smb = smb_packet
+
+ if cmd is None:
+ ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
+ ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
+ ntCreate['Data'] = SMBNtCreateAndX_Data(flags=self.__flags2)
+ ntCreate['Parameters']['FileNameLength'] = len(filename)
+ ntCreate['Parameters']['CreateFlags'] = 0x16
+ ntCreate['Parameters']['AccessMask'] = accessMask
+ ntCreate['Parameters']['CreateOptions'] = 0x40
+ ntCreate['Parameters']['ShareAccess'] = shareAccessMode
+ ntCreate['Parameters']['Disposition'] = disposition
+ ntCreate['Data']['FileName'] = filename
+
+ if self.__flags2 & SMB.FLAGS2_UNICODE:
+ ntCreate['Data']['Pad'] = 0x0
+ else:
+ ntCreate = cmd
+
+ smb.addCommand(ntCreate)
+
+ self.sendSMB(smb)
+
+ while 1:
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_NT_CREATE_ANDX):
+ # XXX Here we are ignoring the rest of the response
+ ntCreateResponse = SMBCommand(smb['Data'][0])
+ ntCreateParameters = SMBNtCreateAndXResponse_Parameters(ntCreateResponse['Parameters'])
+
+ self.fid = ntCreateParameters['Fid']
+ return ntCreateParameters['Fid']
+
+ def logoff(self):
+ smb = NewSMBPacket()
+
+ logOff = SMBCommand(SMB.SMB_COM_LOGOFF_ANDX)
+ logOff['Parameters'] = SMBLogOffAndX()
+ smb.addCommand(logOff)
+
+ self.sendSMB(smb)
+ self.recvSMB()
+ # Let's clear some fields so you can login again under the same session
+ self._uid = 0
+
+ def list_path(self, service, path = '*', password = None):
+ path = path.replace('/', '\\')
+ path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
+
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ findFirstParameter = SMBFindFirst2_Parameters()
+ findFirstParameter['SearchAttributes'] = SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_HIDDEN | \
+ SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_READONLY | \
+ SMB_FILE_ATTRIBUTE_ARCHIVE
+ findFirstParameter['SearchCount'] = 512
+ findFirstParameter['Flags'] = SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
+ findFirstParameter['InformationLevel'] = SMB_FIND_FILE_BOTH_DIRECTORY_INFO
+ findFirstParameter['SearchStorageType'] = 0
+ findFirstParameter['FileName'] = path + ('\x00\x00' if self.__flags2 & SMB.FLAGS2_UNICODE else '\x00')
+ self.send_trans2(tid, SMB.TRANS2_FIND_FIRST2, '\x00', findFirstParameter, '')
+ files = [ ]
+
+ totalDataCount = 1
+ findData = ''
+ findFirst2ParameterBlock = ''
+ while len(findData) < totalDataCount:
+ resp = self.recvSMB()
+
+ if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
+ trans2Response = SMBCommand(resp['Data'][0])
+ trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
+ totalDataCount = trans2Parameters['TotalDataCount']
+ findFirst2ParameterBlock += trans2Response['Data'][trans2Parameters['ParameterOffset']-55:][:trans2Parameters['ParameterCount']]
+ findData += trans2Response['Data'][trans2Parameters['DataOffset']-55:]
+
+ findParameterBlock = SMBFindFirst2Response_Parameters(findFirst2ParameterBlock)
+ # Save the SID for resume operations
+ sid = findParameterBlock['SID']
+
+ while True:
+ record = SMBFindFileBothDirectoryInfo(data = findData)
+
+ shortname = record['ShortName'].decode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else record['ShortName']
+ filename = record['FileName'].decode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else record['FileName']
+
+ fileRecord = SharedFile(record['CreationTime'], record['LastAccessTime'], record['LastChangeTime'],
+ record['EndOfFile'], record['AllocationSize'], record['ExtFileAttributes'],
+ shortname, filename)
+ files.append(fileRecord)
+ if record['NextEntryOffset'] > 0 and len(findData[record['NextEntryOffset']:]) > 0:
+ findData = findData[record['NextEntryOffset']:]
+ else:
+ # More data to search?
+ if findParameterBlock['EndOfSearch'] == 0:
+ resume_filename = record['FileName']
+ findNextParameter = SMBFindNext2_Parameters()
+ findNextParameter['SID'] = sid
+ findNextParameter['SearchCount'] = 1024
+ findNextParameter['InformationLevel'] = SMB_FIND_FILE_BOTH_DIRECTORY_INFO
+ findNextParameter['ResumeKey'] = 0
+ findNextParameter['Flags'] = SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
+ findNextParameter['FileName'] = resume_filename + ('\x00\x00' if self.__flags2 & SMB.FLAGS2_UNICODE else '\x00')
+ self.send_trans2(tid, SMB.TRANS2_FIND_NEXT2, '\x00', findNextParameter, '')
+ findData = ''
+ findNext2ParameterBlock = ''
+ totalDataCount = 1
+ while len(findData) < totalDataCount:
+ resp = self.recvSMB()
+
+ if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
+ trans2Response = SMBCommand(resp['Data'][0])
+ trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
+ totalDataCount = trans2Parameters['TotalDataCount']
+ findNext2ParameterBlock += trans2Response['Data'][trans2Parameters['ParameterOffset']-55:][:trans2Parameters['ParameterCount']]
+ findData += trans2Response['Data'][trans2Parameters['DataOffset']-55:]
+ findParameterBlock = SMBFindNext2Response_Parameters(findNext2ParameterBlock)
+ else:
+ break
+ finally:
+ self.disconnect_tree(tid)
+
+ return files
+
+ def retr_file(self, service, filename, callback, mode = FILE_OPEN, offset = 0, password = None, shareAccessMode = SMB_ACCESS_READ):
+ filename = string.replace(filename, '/', '\\')
+
+ fid = -1
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, accessMask = 0x20089)
+
+ res = self.query_file_info(tid, fid)
+ datasize = SMBQueryFileStandardInfo(res)['EndOfFile']
+
+ self.__nonraw_retr_file(tid, fid, offset, datasize, callback)
+ finally:
+ if fid >= 0:
+ self.close(tid, fid)
+ self.disconnect_tree(tid)
+
+ def stor_file(self, service, filename, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = SMB_ACCESS_WRITE):
+ filename = string.replace(filename, '/', '\\')
+
+ fid = -1
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, disposition = mode )
+
+ self.__nonraw_stor_file(tid, fid, offset, 0, callback)
+ finally:
+ if fid >= 0:
+ self.close(tid, fid)
+ self.disconnect_tree(tid)
+
+ def stor_file_nonraw(self, service, filename, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = SMB_ACCESS_WRITE ):
+ filename = string.replace(filename, '/', '\\')
+
+ fid = -1
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, disposition = mode)
+ self.__nonraw_stor_file(tid, fid, offset, 0, callback)
+ finally:
+ if fid >= 0:
+ self.close(tid, fid)
+ self.disconnect_tree(tid)
+
+ def check_dir(self, service, path, password = None):
+ path = string.replace(path,'/', '\\')
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ smb['Mid'] = 0
+
+ cmd = SMBCommand(SMB.SMB_COM_CHECK_DIRECTORY)
+ cmd['Parameters'] = ''
+ cmd['Data'] = SMBCheckDirectory_Data(flags = self.__flags2)
+ cmd['Data']['DirectoryName'] = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
+ smb.addCommand(cmd)
+
+ self.sendSMB(smb)
+
+ while 1:
+ s = self.recvSMB()
+ if s.isValidAnswer(SMB.SMB_COM_CHECK_DIRECTORY):
+ return
+ finally:
+ self.disconnect_tree(tid)
+
+ def remove(self, service, path, password = None):
+ path = string.replace(path,'/', '\\')
+ # Perform a list to ensure the path exists
+ self.list_path(service, path, password)
+
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ smb['Mid'] = 0
+
+ cmd = SMBCommand(SMB.SMB_COM_DELETE)
+ cmd['Parameters'] = SMBDelete_Parameters()
+ cmd['Parameters']['SearchAttributes'] = ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE
+ cmd['Data'] = SMBDelete_Data(flags = self.__flags2)
+ cmd['Data']['FileName'] = (path + '\x00').encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else (path + '\x00')
+ smb.addCommand(cmd)
+
+ self.sendSMB(smb)
+
+ while 1:
+ s = self.recvSMB()
+ if s.isValidAnswer(SMB.SMB_COM_DELETE):
+ return
+ finally:
+ self.disconnect_tree(tid)
+
+ def rmdir(self, service, path, password = None):
+ path = string.replace(path,'/', '\\')
+ # Check that the directory exists
+ self.check_dir(service, path, password)
+
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
+
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ createDir = SMBCommand(SMB.SMB_COM_DELETE_DIRECTORY)
+ createDir['Data'] = SMBDeleteDirectory_Data(flags=self.__flags2)
+ createDir['Data']['DirectoryName'] = path
+ smb.addCommand(createDir)
+
+ self.sendSMB(smb)
+
+ while 1:
+ s = self.recvSMB()
+ if s.isValidAnswer(SMB.SMB_COM_DELETE_DIRECTORY):
+ return
+ finally:
+ self.disconnect_tree(tid)
+
+ def mkdir(self, service, path, password = None):
+ path = string.replace(path,'/', '\\')
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
+
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ smb['Mid'] = 0
+
+ createDir = SMBCommand(SMB.SMB_COM_CREATE_DIRECTORY)
+ createDir['Data'] = SMBCreateDirectory_Data(flags=self.__flags2)
+ createDir['Data']['DirectoryName'] = path
+ smb.addCommand(createDir)
+
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_CREATE_DIRECTORY):
+ return 1
+ return 0
+ finally:
+ self.disconnect_tree(tid)
+
+ def rename(self, service, old_path, new_path, password = None):
+ old_path = string.replace(old_path,'/', '\\')
+ new_path = string.replace(new_path,'/', '\\')
+ tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
+ try:
+ smb = NewSMBPacket()
+ smb['Tid'] = tid
+ smb['Mid'] = 0
+
+ renameCmd = SMBCommand(SMB.SMB_COM_RENAME)
+ renameCmd['Parameters'] = SMBRename_Parameters()
+ renameCmd['Parameters']['SearchAttributes'] = ATTR_SYSTEM | ATTR_HIDDEN | ATTR_DIRECTORY
+ renameCmd['Data'] = SMBRename_Data(flags = self.__flags2)
+ renameCmd['Data']['OldFileName'] = old_path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else old_path
+ renameCmd['Data']['NewFileName'] = new_path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else new_path
+ smb.addCommand(renameCmd)
+
+ self.sendSMB(smb)
+
+ smb = self.recvSMB()
+ if smb.isValidAnswer(SMB.SMB_COM_RENAME):
+ return 1
+ return 0
+ finally:
+ self.disconnect_tree(tid)
+
+ def writeFile(self, treeId, fileId, data, offset = 0):
+ if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_WRITEX) and self._SignatureEnabled is False:
+ max_buf_size = 65000
+ else:
+ max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Write in multiple KB blocks
+
+ write_offset = offset
+ while 1:
+ if len(data) == 0:
+ break
+ writeData = data[:max_buf_size]
+ data = data[max_buf_size:]
+
+ smb = self.write_andx(treeId,fileId,writeData, write_offset)
+ writeResponse = SMBCommand(smb['Data'][0])
+ writeResponseParameters = SMBWriteAndXResponse_Parameters(writeResponse['Parameters'])
+ write_offset += writeResponseParameters['Count']
+
+ def get_socket(self):
+ return self._sess.get_socket()
+
+ERRDOS = { 1: 'Invalid function',
+ 2: 'File not found',
+ 3: 'Invalid directory',
+ 4: 'Too many open files',
+ 5: 'Access denied',
+ 6: 'Invalid file handle. Please file a bug report.',
+ 7: 'Memory control blocks destroyed',
+ 8: 'Out of memory',
+ 9: 'Invalid memory block address',
+ 10: 'Invalid environment',
+ 11: 'Invalid format',
+ 12: 'Invalid open mode',
+ 13: 'Invalid data',
+ 15: 'Invalid drive',
+ 16: 'Attempt to remove server\'s current directory',
+ 17: 'Not the same device',
+ 18: 'No files found',
+ 32: 'Sharing mode conflicts detected',
+ 33: 'Lock request conflicts detected',
+ 80: 'File already exists'
+ }
+
+ERRSRV = { 1: 'Non-specific error',
+ 2: 'Bad password',
+ 4: 'Access denied',
+ 5: 'Invalid tid. Please file a bug report.',
+ 6: 'Invalid network name',
+ 7: 'Invalid device',
+ 49: 'Print queue full',
+ 50: 'Print queue full',
+ 51: 'EOF on print queue dump',
+ 52: 'Invalid print file handle',
+ 64: 'Command not recognized. Please file a bug report.',
+ 65: 'Internal server error',
+ 67: 'Invalid path',
+ 69: 'Invalid access permissions',
+ 71: 'Invalid attribute mode',
+ 81: 'Server is paused',
+ 82: 'Not receiving messages',
+ 83: 'No room to buffer messages',
+ 87: 'Too many remote user names',
+ 88: 'Operation timeout',
+ 89: 'Out of resources',
+ 91: 'Invalid user handle. Please file a bug report.',
+ 250: 'Temporarily unable to support raw mode for transfer',
+ 251: 'Temporarily unable to support raw mode for transfer',
+ 252: 'Continue in MPX mode',
+ 65535: 'Unsupported function'
+ }
+
+ERRHRD = { 19: 'Media is write-protected',
+ 20: 'Unknown unit',
+ 21: 'Drive not ready',
+ 22: 'Unknown command',
+ 23: 'CRC error',
+ 24: 'Bad request',
+ 25: 'Seek error',
+ 26: 'Unknown media type',
+ 27: 'Sector not found',
+ 28: 'Printer out of paper',
+ 29: 'Write fault',
+ 30: 'Read fault',
+ 31: 'General failure',
+ 32: 'Open conflicts with an existing open',
+ 33: 'Invalid lock request',
+ 34: 'Wrong disk in drive',
+ 35: 'FCBs not available',
+ 36: 'Sharing buffer exceeded'
+ }
+
diff --git a/tests/python_dependencies/impacket/smb3.py b/tests/python_dependencies/impacket/smb3.py
new file mode 100644
index 00000000..5548e4b0
--- /dev/null
+++ b/tests/python_dependencies/impacket/smb3.py
@@ -0,0 +1,1629 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (@agsolino)
+#
+# Description:
+# [MS-SMB2] Protocol Implementation (SMB2 and SMB3)
+# As you might see in the code, it's implemented strictly following
+# the structures defined in the protocol specification. This may
+# not be the most efficient way (e.g. self._Connection is the
+# same to self._Session in the context of this library ) but
+# it certainly helps following the document way easier.
+#
+# ToDo:
+# [X] Implement SMB2_CHANGE_NOTIFY
+# [X] Implement SMB2_QUERY_INFO
+# [X] Implement SMB2_SET_INFO
+# [ ] Implement SMB2_OPLOCK_BREAK
+# [X] Implement SMB3 signing
+# [ ] Implement SMB3 encryption
+# [ ] Add more backward compatible commands from the smb.py code
+# [ ] Fix up all the 'ToDo' comments inside the code
+#
+
+import socket
+import ntpath
+import random
+import string
+import struct
+from binascii import a2b_hex
+from contextlib import contextmanager
+
+from impacket import nmb, ntlm, uuid, crypto, LOG
+from impacket.smb3structs import *
+from impacket.nt_errors import STATUS_SUCCESS, STATUS_MORE_PROCESSING_REQUIRED, STATUS_INVALID_PARAMETER, \
+ STATUS_NO_MORE_FILES, STATUS_PENDING, STATUS_NOT_IMPLEMENTED, ERROR_MESSAGES
+from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, SPNEGO_NegTokenResp
+
+
+# For signing
+import hashlib, hmac, copy
+
+# Structs to be used
+TREE_CONNECT = {
+ 'ShareName' : '',
+ 'TreeConnectId' : 0,
+ 'Session' : 0,
+ 'IsDfsShare' : False,
+ # If the client implements the SMB 3.0 dialect,
+ # the client MUST also implement the following
+ 'IsCAShare' : False,
+ 'EncryptData' : False,
+ 'IsScaleoutShare' : False,
+ # Outside the protocol
+ 'NumberOfUses' : 0,
+}
+
+FILE = {
+ 'OpenTable' : [],
+ 'LeaseKey' : '',
+ 'LeaseState' : 0,
+ 'LeaseEpoch' : 0,
+}
+
+OPEN = {
+ 'FileID' : '',
+ 'TreeConnect' : 0,
+ 'Connection' : 0, # Not Used
+ 'Oplocklevel' : 0,
+ 'Durable' : False,
+ 'FileName' : '',
+ 'ResilientHandle' : False,
+ 'LastDisconnectTime' : 0,
+ 'ResilientTimeout' : 0,
+ 'OperationBuckets' : [],
+ # If the client implements the SMB 3.0 dialect,
+ # the client MUST implement the following
+ 'CreateGuid' : '',
+ 'IsPersistent' : False,
+ 'DesiredAccess' : '',
+ 'ShareMode' : 0,
+ 'CreateOption' : '',
+ 'FileAttributes' : '',
+ 'CreateDisposition' : '',
+}
+
+REQUEST = {
+ 'CancelID' : '',
+ 'Message' : '',
+ 'Timestamp' : 0,
+}
+
+CHANNEL = {
+ 'SigningKey' : '',
+ 'Connection' : 0,
+}
+
+
+class SessionError(Exception):
+ def __init__( self, error = 0, packet=0):
+ Exception.__init__(self)
+ self.error = error
+ self.packet = packet
+
+ def get_error_code( self ):
+ return self.error
+
+ def get_error_packet( self ):
+ return self.packet
+
+ def __str__( self ):
+ return 'SMB SessionError: %s(%s)' % (ERROR_MESSAGES[self.error])
+
+
+class SMB3:
+ def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = 445, timeout=60, UDP = 0, preferredDialect = None, session = None):
+
+ # [MS-SMB2] Section 3
+ self.RequireMessageSigning = False #
+ self.ConnectionTable = {}
+ self.GlobalFileTable = {}
+ self.ClientGuid = ''.join([random.choice(string.letters) for i in range(16)])
+ # Only for SMB 3.0
+ self.EncryptionAlgorithmList = ['AES-CCM']
+ self.MaxDialect = []
+ self.RequireSecureNegotiate = False
+
+ # Per Transport Connection Data
+ self._Connection = {
+ # Indexed by SessionID
+ #'SessionTable' : {},
+ # Indexed by MessageID
+ 'OutstandingRequests' : {},
+ 'OutstandingResponses' : {}, #
+ 'SequenceWindow' : 0, #
+ 'GSSNegotiateToken' : '', #
+ 'MaxTransactSize' : 0, #
+ 'MaxReadSize' : 0, #
+ 'MaxWriteSize' : 0, #
+ 'ServerGuid' : '', #
+ 'RequireSigning' : False, #
+ 'ServerName' : '', #
+ # If the client implements the SMB 2.1 or SMB 3.0 dialects, it MUST
+ # also implement the following
+ 'Dialect' : '', #
+ 'SupportsFileLeasing' : False, #
+ 'SupportsMultiCredit' : False, #
+ # If the client implements the SMB 3.0 dialect,
+ # it MUST also implement the following
+ 'SupportsDirectoryLeasing' : False, #
+ 'SupportsMultiChannel' : False, #
+ 'SupportsPersistentHandles': False, #
+ 'SupportsEncryption' : False, #
+ 'ClientCapabilities' : 0,
+ 'ServerCapabilities' : 0, #
+ 'ClientSecurityMode' : 0, #
+ 'ServerSecurityMode' : 0, #
+ # Outside the protocol
+ 'ServerIP' : '', #
+ }
+
+ self._Session = {
+ 'SessionID' : 0, #
+ 'TreeConnectTable' : {}, #
+ 'SessionKey' : '', #
+ 'SigningRequired' : False, #
+ 'Connection' : 0, #
+ 'UserCredentials' : '', #
+ 'OpenTable' : {}, #
+ # If the client implements the SMB 3.0 dialect,
+ # it MUST also implement the following
+ 'ChannelList' : [],
+ 'ChannelSequence' : 0,
+ #'EncryptData' : False,
+ 'EncryptData' : True,
+ 'EncryptionKey' : '',
+ 'DecryptionKey' : '',
+ 'SigningKey' : '',
+ 'ApplicationKey' : '',
+ # Outside the protocol
+ 'SessionFlags' : 0, #
+ 'ServerName' : '', #
+ 'ServerDomain' : '', #
+ 'ServerDNSDomainName' : '', #
+ 'ServerOS' : '', #
+ 'SigningActivated' : False, #
+ }
+
+ self.SMB_PACKET = SMB2Packet
+
+ self._timeout = timeout
+ self._Connection['ServerIP'] = remote_host
+ self._NetBIOSSession = None
+
+ self.__userName = ''
+ self.__password = ''
+ self.__domain = ''
+ self.__lmhash = ''
+ self.__nthash = ''
+ self.__kdc = ''
+ self.__aesKey = ''
+ self.__TGT = None
+ self.__TGS = None
+
+ if sess_port == 445 and remote_name == '*SMBSERVER':
+ self._Connection['ServerName'] = remote_host
+ else:
+ self._Connection['ServerName'] = remote_name
+
+ if session is None:
+ if not my_name:
+ my_name = socket.gethostname()
+ i = string.find(my_name, '.')
+ if i > -1:
+ my_name = my_name[:i]
+
+ if UDP:
+ self._NetBIOSSession = nmb.NetBIOSUDPSession(my_name, self._Connection['ServerName'], remote_host, host_type, sess_port, self._timeout)
+ else:
+ self._NetBIOSSession = nmb.NetBIOSTCPSession(my_name, self._Connection['ServerName'], remote_host, host_type, sess_port, self._timeout)
+
+ self.negotiateSession(preferredDialect)
+ else:
+ self._NetBIOSSession = session
+ # We should increase the SequenceWindow since a packet was already received.
+ self._Connection['SequenceWindow'] += 1
+ # Let's negotiate again using the same connection
+ self.negotiateSession(preferredDialect)
+
+ def printStatus(self):
+ print "CONNECTION"
+ for i in self._Connection.items():
+ print "%-40s : %s" % i
+ print
+ print "SESSION"
+ for i in self._Session.items():
+ print "%-40s : %s" % i
+
+ def getServerName(self):
+ return self._Session['ServerName']
+
+ def getServerIP(self):
+ return self._Connection['ServerIP']
+
+ def getServerDomain(self):
+ return self._Session['ServerDomain']
+
+ def getServerDNSDomainName(self):
+ return self._Session['ServerDNSDomainName']
+
+ def getServerOS(self):
+ return self._Session['ServerOS']
+
+ def getServerOSMajor(self):
+ return self._Session['ServerOSMajor']
+
+ def getServerOSMinor(self):
+ return self._Session['ServerOSMinor']
+
+ def getServerOSBuild(self):
+ return self._Session['ServerOSBuild']
+
+ def isGuestSession(self):
+ return self._Session['SessionFlags'] & SMB2_SESSION_FLAG_IS_GUEST
+
+ def setTimeout(self, timeout):
+ self._timeout = timeout
+
+ @contextmanager
+ def useTimeout(self, timeout):
+ prev_timeout = self.getTimeout(timeout)
+ try:
+ yield
+ finally:
+ self.setTimeout(prev_timeout)
+
+ def getDialect(self):
+ return self._Connection['Dialect']
+
+
+ def signSMB(self, packet):
+ packet['Signature'] = '\x00'*16
+ if self._Connection['Dialect'] == SMB2_DIALECT_21 or self._Connection['Dialect'] == SMB2_DIALECT_002:
+ if len(self._Session['SessionKey']) > 0:
+ signature = hmac.new(self._Session['SessionKey'], str(packet), hashlib.sha256).digest()
+ packet['Signature'] = signature[:16]
+ else:
+ if len(self._Session['SessionKey']) > 0:
+ p = str(packet)
+ signature = crypto.AES_CMAC(self._Session['SigningKey'], p, len(p))
+ packet['Signature'] = signature
+
+ def sendSMB(self, packet):
+ # The idea here is to receive multiple/single commands and create a compound request, and send it
+ # Should return the MessageID for later retrieval. Implement compounded related requests.
+
+ # If Connection.Dialect is equal to "3.000" and if Connection.SupportsMultiChannel or
+ # Connection.SupportsPersistentHandles is TRUE, the client MUST set ChannelSequence in the
+ # SMB2 header to Session.ChannelSequence
+
+ # Check this is not a CANCEL request. If so, don't consume sequece numbers
+ if packet['Command'] is not SMB2_CANCEL:
+ packet['MessageID'] = self._Connection['SequenceWindow']
+ self._Connection['SequenceWindow'] += 1
+ packet['SessionID'] = self._Session['SessionID']
+
+ # Default the credit charge to 1 unless set by the caller
+ if packet.fields.has_key('CreditCharge') is False:
+ packet['CreditCharge'] = 1
+
+ # Standard credit request after negotiating protocol
+ if self._Connection['SequenceWindow'] > 3:
+ packet['CreditRequestResponse'] = 127
+
+ 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 self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is False:
+ packet['Flags'] = SMB2_FLAGS_SIGNED
+ self.signSMB(packet)
+ elif packet['TreeID'] == 0:
+ packet['Flags'] = SMB2_FLAGS_SIGNED
+ self.signSMB(packet)
+
+ if (self._Session['SessionFlags'] & SMB2_SESSION_FLAG_ENCRYPT_DATA) or ( packet['TreeID'] != 0 and self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is True):
+ plainText = str(packet)
+ transformHeader = SMB2_TRANSFORM_HEADER()
+ transformHeader['Nonce'] = ''.join([random.choice(string.letters) for i in range(11)])
+ transformHeader['OriginalMessageSize'] = len(plainText)
+ transformHeader['EncryptionAlgorithm'] = SMB2_ENCRYPTION_AES128_CCM
+ transformHeader['SessionID'] = self._Session['SessionID']
+ from Crypto.Cipher import AES
+ try:
+ AES.MODE_CCM
+ except:
+ LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
+ raise
+ cipher = AES.new(self._Session['EncryptionKey'], AES.MODE_CCM, transformHeader['Nonce'])
+ cipher.update(str(transformHeader)[20:])
+ cipherText = cipher.encrypt(plainText)
+ transformHeader['Signature'] = cipher.digest()
+ packet = str(transformHeader) + cipherText
+
+ self._NetBIOSSession.send_packet(str(packet))
+ return messageId
+
+ def recvSMB(self, packetID = None):
+ # First, verify we don't have the packet already
+ if self._Connection['OutstandingResponses'].has_key(packetID):
+ return self._Connection['OutstandingResponses'].pop(packetID)
+
+ data = self._NetBIOSSession.recv_packet(self._timeout)
+
+ if data.get_trailer().startswith('\xfdSMB'):
+ # Packet is encrypted
+ transformHeader = SMB2_TRANSFORM_HEADER(data.get_trailer())
+ from Crypto.Cipher import AES
+ try:
+ AES.MODE_CCM
+ except:
+ LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
+ raise
+ cipher = AES.new(self._Session['DecryptionKey'], AES.MODE_CCM, transformHeader['Nonce'][:11])
+ cipher.update(str(transformHeader)[20:])
+ plainText = cipher.decrypt(data.get_trailer()[len(SMB2_TRANSFORM_HEADER()):])
+ #cipher.verify(transformHeader['Signature'])
+ packet = SMB2Packet(plainText)
+ else:
+ # In all SMB dialects for a response this field is interpreted as the Status field.
+ # This field can be set to any value. For a list of valid status codes,
+ # see [MS-ERREF] section 2.3.
+ packet = SMB2Packet(data.get_trailer())
+
+ # Loop while we receive pending requests
+ if packet['Status'] == STATUS_PENDING:
+ status = STATUS_PENDING
+ while status == STATUS_PENDING:
+ data = self._NetBIOSSession.recv_packet(self._timeout)
+ if data.get_trailer().startswith('\xfeSMB'):
+ packet = SMB2Packet(data.get_trailer())
+ else:
+ # Packet is encrypted
+ transformHeader = SMB2_TRANSFORM_HEADER(data.get_trailer())
+ from Crypto.Cipher import AES
+ try:
+ AES.MODE_CCM
+ except:
+ LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
+ raise
+ cipher = AES.new(self._Session['DecryptionKey'], AES.MODE_CCM, transformHeader['Nonce'][:11])
+ cipher.update(str(transformHeader)[20:])
+ plainText = cipher.decrypt(data.get_trailer()[len(SMB2_TRANSFORM_HEADER()):])
+ #cipher.verify(transformHeader['Signature'])
+ packet = SMB2Packet(plainText)
+ status = packet['Status']
+
+ if packet['MessageID'] == packetID or packetID is None:
+ # if self._Session['SigningRequired'] is True:
+ # self.signSMB(packet)
+ # Let's update the sequenceWindow based on the CreditsCharged
+ self._Connection['SequenceWindow'] += (packet['CreditCharge'] - 1)
+ return packet
+ else:
+ self._Connection['OutstandingResponses'][packet['MessageID']] = packet
+ return self.recvSMB(packetID)
+
+ def negotiateSession(self, preferredDialect = None):
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_NEGOTIATE
+ negSession = SMB2Negotiate()
+
+ negSession['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
+ if self.RequireMessageSigning is True:
+ negSession['SecurityMode'] |= SMB2_NEGOTIATE_SIGNING_REQUIRED
+ negSession['Capabilities'] = SMB2_GLOBAL_CAP_ENCRYPTION
+ negSession['ClientGuid'] = self.ClientGuid
+ if preferredDialect is not None:
+ negSession['Dialects'] = [preferredDialect]
+ else:
+ negSession['Dialects'] = [SMB2_DIALECT_002, SMB2_DIALECT_21, SMB2_DIALECT_30]
+ negSession['DialectCount'] = len(negSession['Dialects'])
+ packet['Data'] = negSession
+
+ # Storing this data for later use
+ self._Connection['ClientSecurityMode'] = negSession['SecurityMode']
+ self._Connection['Capabilities'] = negSession['Capabilities']
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ # ToDo this:
+ # If the DialectRevision in the SMB2 NEGOTIATE Response is 0x02FF, the client MUST issue a new
+ # SMB2 NEGOTIATE request as described in section 3.2.4.2.2.2 with the only exception
+ # that the client MUST allocate sequence number 1 from Connection.SequenceWindow, and MUST set
+ # MessageId field of the SMB2 header to 1. Otherwise, the client MUST proceed as follows.
+ negResp = SMB2Negotiate_Response(ans['Data'])
+ self._Connection['MaxTransactSize'] = min(0x100000,negResp['MaxTransactSize'])
+ self._Connection['MaxReadSize'] = min(0x100000,negResp['MaxReadSize'])
+ self._Connection['MaxWriteSize'] = min(0x100000,negResp['MaxWriteSize'])
+ self._Connection['ServerGuid'] = negResp['ServerGuid']
+ self._Connection['GSSNegotiateToken'] = negResp['Buffer']
+ self._Connection['Dialect'] = negResp['DialectRevision']
+ if (negResp['SecurityMode'] & SMB2_NEGOTIATE_SIGNING_REQUIRED) == SMB2_NEGOTIATE_SIGNING_REQUIRED:
+ self._Connection['RequireSigning'] = True
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
+ self._Connection['SupportsFileLeasing'] = True
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
+ self._Connection['SupportsMultiCredit'] = True
+
+ if self._Connection['Dialect'] == SMB2_DIALECT_30:
+ # Switching to the right packet format
+ self.SMB_PACKET = SMB3Packet
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) == SMB2_GLOBAL_CAP_DIRECTORY_LEASING:
+ self._Connection['SupportsDirectoryLeasing'] = True
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_MULTI_CHANNEL) == SMB2_GLOBAL_CAP_MULTI_CHANNEL:
+ self._Connection['SupportsMultiChannel'] = True
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == SMB2_GLOBAL_CAP_PERSISTENT_HANDLES:
+ self._Connection['SupportsPersistentHandles'] = True
+ if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_ENCRYPTION) == SMB2_GLOBAL_CAP_ENCRYPTION:
+ self._Connection['SupportsEncryption'] = True
+
+ self._Connection['ServerCapabilities'] = negResp['Capabilities']
+ self._Connection['ServerSecurityMode'] = negResp['SecurityMode']
+
+ def getCredentials(self):
+ return (
+ self.__userName,
+ self.__password,
+ self.__domain,
+ self.__lmhash,
+ self.__nthash,
+ self.__aesKey,
+ self.__TGT,
+ self.__TGS)
+
+ def kerberosLogin(self, user, password, domain = '', lmhash = '', nthash = '', aesKey='', kdcHost = '', TGT=None, TGS=None):
+ # If TGT or TGS are specified, they are in the form of:
+ # TGS['KDC_REP'] = the response from the server
+ # TGS['cipher'] = the cipher used
+ # TGS['sessionKey'] = the sessionKey
+ # If we have hashes, normalize them
+ if lmhash != '' or nthash != '':
+ if len(lmhash) % 2: lmhash = '0%s' % lmhash
+ if len(nthash) % 2: nthash = '0%s' % nthash
+ try: # just in case they were converted already
+ lmhash = a2b_hex(lmhash)
+ nthash = a2b_hex(nthash)
+ except:
+ pass
+
+ self.__userName = user
+ self.__password = password
+ self.__domain = domain
+ self.__lmhash = lmhash
+ self.__nthash = nthash
+ self.__kdc = kdcHost
+ self.__aesKey = aesKey
+ self.__TGT = TGT
+ self.__TGS = TGS
+
+ sessionSetup = SMB2SessionSetup()
+ if self.RequireMessageSigning is True:
+ sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_REQUIRED
+ else:
+ sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
+
+ sessionSetup['Flags'] = 0
+ #sessionSetup['Capabilities'] = SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_DFS
+
+ # Importing down here so pyasn1 is not required if kerberos is not used.
+ from impacket.krb5.asn1 import AP_REQ, Authenticator, TGS_REP, seq_set
+ from impacket.krb5.kerberosv5 import getKerberosTGT, getKerberosTGS
+ from impacket.krb5 import constants
+ from impacket.krb5.types import Principal, KerberosTime, Ticket
+ from pyasn1.codec.der import decoder, encoder
+ import datetime
+
+ # First of all, we need to get a TGT for the user
+ userName = Principal(user, type=constants.PrincipalNameType.NT_PRINCIPAL.value)
+ if TGT is None:
+ if TGS is None:
+ tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(userName, password, domain, lmhash, nthash, aesKey, kdcHost)
+ else:
+ tgt = TGT['KDC_REP']
+ cipher = TGT['cipher']
+ sessionKey = TGT['sessionKey']
+
+ # Save the ticket
+ # If you want, for debugging purposes
+# from impacket.krb5.ccache import CCache
+# ccache = CCache()
+# try:
+# if TGS is None:
+# ccache.fromTGT(tgt, oldSessionKey, sessionKey)
+# else:
+# ccache.fromTGS(TGS['KDC_REP'], TGS['oldSessionKey'], TGS['sessionKey'] )
+# ccache.saveFile('/tmp/ticket.bin')
+# except Exception, e:
+# print e
+# pass
+
+ # Now that we have the TGT, we should ask for a TGS for cifs
+
+ if TGS is None:
+ serverName = Principal('cifs/%s' % (self._Connection['ServerName']), type=constants.PrincipalNameType.NT_SRV_INST.value)
+ tgs, cipher, oldSessionKey, sessionKey = getKerberosTGS(serverName, domain, kdcHost, tgt, cipher, sessionKey)
+ else:
+ tgs = TGS['KDC_REP']
+ cipher = TGS['cipher']
+ sessionKey = TGS['sessionKey']
+
+ # Let's build a NegTokenInit with a Kerberos REQ_AP
+
+ blob = SPNEGO_NegTokenInit()
+
+ # Kerberos
+ blob['MechTypes'] = [TypesMech['MS KRB5 - Microsoft Kerberos 5']]
+
+ # Let's extract the ticket from the TGS
+ tgs = decoder.decode(tgs, asn1Spec = TGS_REP())[0]
+ ticket = Ticket()
+ ticket.from_asn1(tgs['ticket'])
+
+ # Now let's build the AP_REQ
+ apReq = AP_REQ()
+ apReq['pvno'] = 5
+ apReq['msg-type'] = int(constants.ApplicationTagNumbers.AP_REQ.value)
+
+ opts = list()
+ apReq['ap-options'] = constants.encodeFlags(opts)
+ seq_set(apReq,'ticket', ticket.to_asn1)
+
+ authenticator = Authenticator()
+ authenticator['authenticator-vno'] = 5
+ authenticator['crealm'] = domain
+ seq_set(authenticator, 'cname', userName.components_to_asn1)
+ now = datetime.datetime.utcnow()
+
+ authenticator['cusec'] = now.microsecond
+ authenticator['ctime'] = KerberosTime.to_asn1(now)
+
+ encodedAuthenticator = encoder.encode(authenticator)
+
+ # Key Usage 11
+ # AP-REQ Authenticator (includes application authenticator
+ # subkey), encrypted with the application session key
+ # (Section 5.5.1)
+ encryptedEncodedAuthenticator = cipher.encrypt(sessionKey, 11, encodedAuthenticator, None)
+
+ apReq['authenticator'] = None
+ apReq['authenticator']['etype'] = cipher.enctype
+ apReq['authenticator']['cipher'] = encryptedEncodedAuthenticator
+
+ blob['MechToken'] = encoder.encode(apReq)
+
+ sessionSetup['SecurityBufferLength'] = len(blob)
+ sessionSetup['Buffer'] = blob.getData()
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_SESSION_SETUP
+ packet['Data'] = sessionSetup
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ self._Session['SessionID'] = ans['SessionID']
+ self._Session['SigningRequired'] = self._Connection['RequireSigning']
+ self._Session['UserCredentials'] = (user, password, domain, lmhash, nthash)
+ self._Session['Connection'] = self._NetBIOSSession.get_socket()
+
+ self._Session['SessionKey'] = sessionKey.contents[:16]
+ if self._Session['SigningRequired'] is True and self._Connection['Dialect'] == SMB2_DIALECT_30:
+ self._Session['SigningKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCMAC\x00", "SmbSign\x00", 128)
+
+ # Calculate the key derivations for dialect 3.0
+ if self._Session['SigningRequired'] is True:
+ self._Session['SigningActivated'] = True
+ if self._Connection['Dialect'] == SMB2_DIALECT_30:
+ self._Session['ApplicationKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2APP\x00", "SmbRpc\x00", 128)
+ self._Session['EncryptionKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCCM\x00", "ServerIn \x00", 128)
+ self._Session['DecryptionKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCCM\x00", "ServerOut\x00", 128)
+
+ return True
+ else:
+ # We clean the stuff we used in case we want to authenticate again
+ # within the same connection
+ self._Session['UserCredentials'] = ''
+ self._Session['Connection'] = 0
+ self._Session['SessionID'] = 0
+ self._Session['SigningRequired'] = False
+ self._Session['SigningKey'] = ''
+ self._Session['SessionKey'] = ''
+ self._Session['SigningActivated'] = False
+ raise
+
+
+ def login(self, user, password, domain = '', lmhash = '', nthash = ''):
+ # If we have hashes, normalize them
+ if lmhash != '' or nthash != '':
+ if len(lmhash) % 2: lmhash = '0%s' % lmhash
+ if len(nthash) % 2: nthash = '0%s' % nthash
+ try: # just in case they were converted already
+ lmhash = a2b_hex(lmhash)
+ nthash = a2b_hex(nthash)
+ except:
+ pass
+
+ self.__userName = user
+ self.__password = password
+ self.__domain = domain
+ self.__lmhash = lmhash
+ self.__nthash = nthash
+ self.__aesKey = ''
+ self.__TGT = None
+ self.__TGS = None
+
+ sessionSetup = SMB2SessionSetup()
+ if self.RequireMessageSigning is True:
+ sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_REQUIRED
+ else:
+ sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
+
+ sessionSetup['Flags'] = 0
+ #sessionSetup['Capabilities'] = SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_DFS
+
+ # Let's build a NegTokenInit with the NTLMSSP
+ # TODO: In the future we should be able to choose different providers
+
+ blob = SPNEGO_NegTokenInit()
+
+ # NTLMSSP
+ blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
+ auth = ntlm.getNTLMSSPType1('','', self._Connection['RequireSigning'])
+ blob['MechToken'] = str(auth)
+
+ sessionSetup['SecurityBufferLength'] = len(blob)
+ sessionSetup['Buffer'] = blob.getData()
+
+ # ToDo:
+ # If this authentication is for establishing an alternative channel for an existing Session, as specified
+ # in section 3.2.4.1.7, the client MUST also set the following values:
+ # The SessionId field in the SMB2 header MUST be set to the Session.SessionId for the new
+ # channel being established.
+ # The SMB2_SESSION_FLAG_BINDING bit MUST be set in the Flags field.
+ # The PreviousSessionId field MUST be set to zero.
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_SESSION_SETUP
+ packet['Data'] = sessionSetup
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_MORE_PROCESSING_REQUIRED):
+ self._Session['SessionID'] = ans['SessionID']
+ self._Session['SigningRequired'] = self._Connection['RequireSigning']
+ self._Session['UserCredentials'] = (user, password, domain, lmhash, nthash)
+ self._Session['Connection'] = self._NetBIOSSession.get_socket()
+ sessionSetupResponse = SMB2SessionSetup_Response(ans['Data'])
+ respToken = SPNEGO_NegTokenResp(sessionSetupResponse['Buffer'])
+
+ # Let's parse some data and keep it to ourselves in case it is asked
+ ntlmChallenge = ntlm.NTLMAuthChallenge(respToken['ResponseToken'])
+ if ntlmChallenge['TargetInfoFields_len'] > 0:
+ av_pairs = ntlm.AV_PAIRS(ntlmChallenge['TargetInfoFields'][:ntlmChallenge['TargetInfoFields_len']])
+ if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] is not None:
+ try:
+ self._Session['ServerName'] = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+ if av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] is not None:
+ try:
+ if self._Session['ServerName'] != av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le'):
+ self._Session['ServerDomain'] = av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+ if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] is not None:
+ try:
+ self._Session['ServerDNSDomainName'] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode('utf-16le')
+ except:
+ # For some reason, we couldn't decode Unicode here.. silently discard the operation
+ pass
+
+ # Parse Version to know the target Operating system name. Not provided elsewhere anymore
+ if ntlmChallenge.fields.has_key('Version'):
+ version = ntlmChallenge['Version']
+
+ if len(version) >= 4:
+ self._Session['ServerOS'] = "Windows %d.%d Build %d" % (ord(version[0]), ord(version[1]), struct.unpack('<H',version[2:4])[0])
+ self._Session["ServerOSMajor"] = ord(version[0])
+ self._Session["ServerOSMinor"] = ord(version[1])
+ self._Session["ServerOSBuild"] = struct.unpack('<H',version[2:4])[0]
+
+ type3, exportedSessionKey = ntlm.getNTLMSSPType3(auth, respToken['ResponseToken'], user, password, domain, lmhash, nthash)
+
+ if exportedSessionKey is not None:
+ self._Session['SessionKey'] = exportedSessionKey
+ if self._Session['SigningRequired'] is True and self._Connection['Dialect'] == SMB2_DIALECT_30:
+ self._Session['SigningKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCMAC\x00", "SmbSign\x00", 128)
+
+ respToken2 = SPNEGO_NegTokenResp()
+ respToken2['ResponseToken'] = str(type3)
+
+ # Reusing the previous structure
+ sessionSetup['SecurityBufferLength'] = len(respToken2)
+ sessionSetup['Buffer'] = respToken2.getData()
+
+ packetID = self.sendSMB(packet)
+ packet = self.recvSMB(packetID)
+ try:
+ if packet.isValidAnswer(STATUS_SUCCESS):
+ sessionSetupResponse = SMB2SessionSetup_Response(packet['Data'])
+ self._Session['SessionFlags'] = sessionSetupResponse['SessionFlags']
+
+ # Calculate the key derivations for dialect 3.0
+ if self._Session['SigningRequired'] is True:
+ self._Session['SigningActivated'] = True
+ if self._Connection['Dialect'] == SMB2_DIALECT_30:
+ self._Session['ApplicationKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2APP\x00", "SmbRpc\x00", 128)
+ self._Session['EncryptionKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCCM\x00", "ServerIn \x00", 128)
+ self._Session['DecryptionKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCCM\x00", "ServerOut\x00", 128)
+
+ return True
+ except:
+ # We clean the stuff we used in case we want to authenticate again
+ # within the same connection
+ self._Session['UserCredentials'] = ''
+ self._Session['Connection'] = 0
+ self._Session['SessionID'] = 0
+ self._Session['SigningRequired'] = False
+ self._Session['SigningKey'] = ''
+ self._Session['SessionKey'] = ''
+ self._Session['SigningActivated'] = False
+ raise
+
+ def connectTree(self, share):
+
+ # Just in case this came with the full path (maybe an SMB1 client), let's just leave
+ # the sharename, we'll take care of the rest
+
+ #print self._Session['TreeConnectTable']
+ share = share.split('\\')[-1]
+ if self._Session['TreeConnectTable'].has_key(share):
+ # Already connected, no need to reconnect
+ treeEntry = self._Session['TreeConnectTable'][share]
+ treeEntry['NumberOfUses'] += 1
+ self._Session['TreeConnectTable'][treeEntry['TreeConnectId']]['NumberOfUses'] += 1
+ return treeEntry['TreeConnectId']
+
+ #path = share
+ try:
+ _, _, _, _, sockaddr = socket.getaddrinfo(self._Connection['ServerIP'], 80, 0, 0, socket.IPPROTO_TCP)[0]
+ remoteHost = sockaddr[0]
+ except:
+ remoteHost = self._Connection['ServerIP']
+ path = '\\\\' + remoteHost + '\\' +share
+
+ treeConnect = SMB2TreeConnect()
+ treeConnect['Buffer'] = path.encode('utf-16le')
+ treeConnect['PathLength'] = len(path)*2
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_TREE_CONNECT
+ packet['Data'] = treeConnect
+ packetID = self.sendSMB(packet)
+ packet = self.recvSMB(packetID)
+ if packet.isValidAnswer(STATUS_SUCCESS):
+ treeConnectResponse = SMB2TreeConnect_Response(packet['Data'])
+ treeEntry = copy.deepcopy(TREE_CONNECT)
+ treeEntry['ShareName'] = share
+ treeEntry['TreeConnectId'] = packet['TreeID']
+ treeEntry['Session'] = packet['SessionID']
+ treeEntry['NumberOfUses'] += 1
+ if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_DFS) == SMB2_SHARE_CAP_DFS:
+ treeEntry['IsDfsShare'] = True
+ if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY) == SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY:
+ treeEntry['IsCAShare'] = True
+
+ if self._Connection['Dialect'] == SMB2_DIALECT_30:
+ if (self._Connection['SupportsEncryption'] is True) and ((treeConnectResponse['ShareFlags'] & SMB2_SHAREFLAG_ENCRYPT_DATA) == SMB2_SHAREFLAG_ENCRYPT_DATA):
+ treeEntry['EncryptData'] = True
+ # ToDo: This and what follows
+ # If Session.EncryptData is FALSE, the client MUST then generate an encryption key, a
+ # decryption key as specified in section 3.1.4.2, by providing the following inputs and store
+ # them in Session.EncryptionKey and Session.DecryptionKey:
+ if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_SCALEOUT) == SMB2_SHARE_CAP_SCALEOUT:
+ treeEntry['IsScaleoutShare'] = True
+
+ self._Session['TreeConnectTable'][packet['TreeID']] = treeEntry
+ self._Session['TreeConnectTable'][share] = treeEntry
+
+ return packet['TreeID']
+
+ def disconnectTree(self, treeId):
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ if self._Session['TreeConnectTable'].has_key(treeId):
+ # 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]
+ treeEntry['NumberOfUses'] -= 1
+ self._Session['TreeConnectTable'][treeEntry['ShareName']]['NumberOfUses'] -= 1
+ return True
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_TREE_DISCONNECT
+ packet['TreeID'] = treeId
+ treeDisconnect = SMB2TreeDisconnect()
+ packet['Data'] = treeDisconnect
+ packetID = self.sendSMB(packet)
+ packet = self.recvSMB(packetID)
+ if packet.isValidAnswer(STATUS_SUCCESS):
+ shareName = self._Session['TreeConnectTable'][treeId]['ShareName']
+ del(self._Session['TreeConnectTable'][shareName])
+ del(self._Session['TreeConnectTable'][treeId])
+ 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ fileName = string.replace(fileName, '/', '\\')
+ if len(fileName) > 0:
+ fileName = ntpath.normpath(fileName)
+ if fileName[0] == '\\':
+ fileName = fileName[1:]
+
+ if self._Session['TreeConnectTable'][treeId]['IsDfsShare'] is True:
+ pathName = fileName
+ else:
+ pathName = '\\\\' + self._Connection['ServerName'] + '\\' + fileName
+
+ fileEntry = copy.deepcopy(FILE)
+ fileEntry['LeaseKey'] = uuid.generate()
+ fileEntry['LeaseState'] = SMB2_LEASE_NONE
+ self.GlobalFileTable[pathName] = fileEntry
+
+ if self._Connection['Dialect'] == SMB2_DIALECT_30 and self._Connection['SupportsDirectoryLeasing'] is True:
+ # Is this file NOT on the root directory?
+ if len(fileName.split('\\')) > 2:
+ parentDir = ntpath.dirname(pathName)
+ if self.GlobalFileTable.has_key(parentDir):
+ LOG.critical("Don't know what to do now! :-o")
+ raise
+ else:
+ parentEntry = copy.deepcopy(FILE)
+ parentEntry['LeaseKey'] = uuid.generate()
+ parentEntry['LeaseState'] = SMB2_LEASE_NONE
+ self.GlobalFileTable[parentDir] = parentEntry
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_CREATE
+ packet['TreeID'] = treeId
+ if self._Session['TreeConnectTable'][treeId]['IsDfsShare'] is True:
+ packet['Flags'] = SMB2_FLAGS_DFS_OPERATIONS
+
+ smb2Create = SMB2Create()
+ smb2Create['SecurityFlags'] = 0
+ smb2Create['RequestedOplockLevel'] = oplockLevel
+ smb2Create['ImpersonationLevel'] = impersonationLevel
+ smb2Create['DesiredAccess'] = desiredAccess
+ smb2Create['FileAttributes'] = fileAttributes
+ smb2Create['ShareAccess'] = shareMode
+ smb2Create['CreateDisposition'] = creationDisposition
+ smb2Create['CreateOptions'] = creationOptions
+
+ smb2Create['NameLength'] = len(fileName)*2
+ if fileName != '':
+ smb2Create['Buffer'] = fileName.encode('utf-16le')
+ else:
+ smb2Create['Buffer'] = '\x00'
+
+ if createContexts is not None:
+ smb2Create['Buffer'] += createContexts
+ smb2Create['CreateContextsOffset'] = len(SMB2Packet()) + SMB2Create.SIZE + smb2Create['NameLength']
+ smb2Create['CreateContextsLength'] = len(createContexts)
+ else:
+ smb2Create['CreateContextsOffset'] = 0
+ smb2Create['CreateContextsLength'] = 0
+
+ packet['Data'] = smb2Create
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ createResponse = SMB2Create_Response(ans['Data'])
+
+ openFile = copy.deepcopy(OPEN)
+ openFile['FileID'] = createResponse['FileID']
+ openFile['TreeConnect'] = treeId
+ openFile['Oplocklevel'] = oplockLevel
+ openFile['Durable'] = False
+ openFile['ResilientHandle'] = False
+ openFile['LastDisconnectTime'] = 0
+ openFile['FileName'] = pathName
+
+ # ToDo: Complete the OperationBuckets
+ if self._Connection['Dialect'] == SMB2_DIALECT_30:
+ openFile['DesiredAccess'] = oplockLevel
+ openFile['ShareMode'] = oplockLevel
+ openFile['CreateOptions'] = oplockLevel
+ openFile['FileAttributes'] = oplockLevel
+ openFile['CreateDisposition'] = oplockLevel
+
+ # ToDo: Process the contexts
+ self._Session['OpenTable'][str(createResponse['FileID'])] = openFile
+
+ # The client MUST generate a handle for the Open, and it MUST
+ # return success and the generated handle to the calling application.
+ # In our case, str(FileID)
+ return str(createResponse['FileID'])
+
+ def close(self, treeId, fileId):
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_CLOSE
+ packet['TreeID'] = treeId
+
+ smbClose = SMB2Close()
+ smbClose['Flags'] = 0
+ smbClose['FileID'] = fileId
+
+ packet['Data'] = smbClose
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ del(self.GlobalFileTable[self._Session['OpenTable'][fileId]['FileName']])
+ del(self._Session['OpenTable'][fileId])
+
+ # ToDo Remove stuff from GlobalFileTable
+ return True
+
+ def read(self, treeId, fileId, offset = 0, bytesToRead = 0, waitAnswer = True):
+ # IMPORTANT NOTE: As you can see, this was coded as a recursive function
+ # Hence, you can exhaust the memory pretty easy ( large bytesToRead )
+ # 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_READ
+ packet['TreeID'] = treeId
+
+ if self._Connection['MaxReadSize'] < bytesToRead:
+ maxBytesToRead = self._Connection['MaxReadSize']
+ else:
+ maxBytesToRead = bytesToRead
+
+ if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
+ packet['CreditCharge'] = ( 1 + (maxBytesToRead - 1) / 65536)
+ else:
+ maxBytesToRead = min(65536,bytesToRead)
+
+ smbRead = SMB2Read()
+ smbRead['Padding'] = 0x50
+ smbRead['FileID'] = fileId
+ smbRead['Length'] = maxBytesToRead
+ smbRead['Offset'] = offset
+ packet['Data'] = smbRead
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ readResponse = SMB2Read_Response(ans['Data'])
+ retData = readResponse['Buffer']
+ if readResponse['DataRemaining'] > 0:
+ retData += self.read(treeId, fileId, offset+len(retData), readResponse['DataRemaining'], waitAnswer)
+ return retData
+
+ def write(self, treeId, fileId, data, offset = 0, bytesToWrite = 0, waitAnswer = True):
+ # IMPORTANT NOTE: As you can see, this was coded as a recursive function
+ # Hence, you can exhaust the memory pretty easy ( large bytesToWrite )
+ # 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_WRITE
+ packet['TreeID'] = treeId
+
+ if self._Connection['MaxWriteSize'] < bytesToWrite:
+ maxBytesToWrite = self._Connection['MaxWriteSize']
+ else:
+ maxBytesToWrite = bytesToWrite
+
+ if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
+ packet['CreditCharge'] = ( 1 + (maxBytesToWrite - 1) / 65536)
+ else:
+ maxBytesToWrite = min(65536,bytesToWrite)
+
+ smbWrite = SMB2Write()
+ smbWrite['FileID'] = fileId
+ smbWrite['Length'] = maxBytesToWrite
+ smbWrite['Offset'] = offset
+ smbWrite['WriteChannelInfoOffset'] = 0
+ smbWrite['Buffer'] = data[:maxBytesToWrite]
+ packet['Data'] = smbWrite
+
+ packetID = self.sendSMB(packet)
+ if waitAnswer is True:
+ ans = self.recvSMB(packetID)
+ else:
+ return maxBytesToWrite
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ writeResponse = SMB2Write_Response(ans['Data'])
+ bytesWritten = writeResponse['Count']
+ if bytesWritten < bytesToWrite:
+ bytesWritten += self.write(treeId, fileId, data[bytesWritten:], offset+bytesWritten, bytesToWrite-bytesWritten, waitAnswer)
+ 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_QUERY_DIRECTORY
+ packet['TreeID'] = treeId
+
+ queryDirectory = SMB2QueryDirectory()
+ queryDirectory['FileInformationClass'] = informationClass
+ if resumeIndex != 0 :
+ queryDirectory['Flags'] = SMB2_INDEX_SPECIFIED
+ queryDirectory['FileIndex'] = resumeIndex
+ queryDirectory['FileID'] = fileId
+ if maxBufferSize is None:
+ maxBufferSize = self._Connection['MaxReadSize']
+ queryDirectory['OutputBufferLength'] = maxBufferSize
+ queryDirectory['FileNameLength'] = len(searchString)*2
+ queryDirectory['Buffer'] = searchString.encode('utf-16le')
+
+ packet['Data'] = queryDirectory
+
+ if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
+ packet['CreditCharge'] = ( 1 + (maxBufferSize - 1) / 65536)
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ queryDirectoryResponse = SMB2QueryDirectory_Response(ans['Data'])
+ return queryDirectoryResponse['Buffer']
+
+ def echo(self):
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_ECHO
+ smbEcho = SMB2Echo()
+ packet['Data'] = smbEcho
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ return True
+
+ def cancel(self, packetID):
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_CANCEL
+ packet['MessageID'] = packetID
+
+ smbCancel = SMB2Cancel()
+
+ packet['Data'] = smbCancel
+ 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if fileId is None:
+ fileId = '\xff'*16
+ else:
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_IOCTL
+ packet['TreeID'] = treeId
+
+ smbIoctl = SMB2Ioctl()
+ smbIoctl['FileID'] = fileId
+ smbIoctl['CtlCode'] = ctlCode
+ smbIoctl['MaxInputResponse'] = maxInputResponse
+ smbIoctl['MaxOutputResponse'] = maxOutputResponse
+ smbIoctl['InputCount'] = len(inputBlob)
+ if len(inputBlob) == 0:
+ smbIoctl['InputOffset'] = 0
+ smbIoctl['Buffer'] = '\x00'
+ else:
+ smbIoctl['Buffer'] = inputBlob
+ smbIoctl['OutputOffset'] = 0
+ smbIoctl['MaxOutputResponse'] = maxOutputResponse
+ smbIoctl['Flags'] = flags
+
+ packet['Data'] = smbIoctl
+
+ packetID = self.sendSMB(packet)
+
+ if waitAnswer == 0:
+ return True
+
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ smbIoctlResponse = SMB2Ioctl_Response(ans['Data'])
+ return smbIoctlResponse['Buffer']
+
+ def flush(self,treeId, fileId):
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_FLUSH
+ packet['TreeID'] = treeId
+
+ smbFlush = SMB2Flush()
+ smbFlush['FileID'] = fileId
+
+ packet['Data'] = smbFlush
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ return True
+
+ def lock(self, treeId, fileId, locks, lockSequence = 0):
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_LOCK
+ packet['TreeID'] = treeId
+
+ smbLock = SMB2Lock()
+ smbLock['FileID'] = fileId
+ smbLock['LockCount'] = len(locks)
+ smbLock['LockSequence'] = lockSequence
+ smbLock['Locks'] = ''.join(str(x) for x in locks)
+
+ packet['Data'] = smbLock
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ smbFlushResponse = SMB2Lock_Response(ans['Data'])
+ return True
+
+ # ToDo:
+ # If Open.ResilientHandle is TRUE or Connection.SupportsMultiChannel is TRUE, the client MUST
+ # do the following:
+ # The client MUST scan through Open.OperationBuckets and find an element with its Free field
+ # set to TRUE. If no such element could be found, an implementation-specific error MUST be
+ # returned to the application.
+ # Let the zero-based array index of the element chosen above be referred to as BucketIndex, and
+ # let BucketNumber = BucketIndex +1.
+ # Set Open.OperationBuckets[BucketIndex].Free = FALSE
+ # Let the SequenceNumber of the element chosen above be referred to as BucketSequence.
+ # The LockSequence field of the SMB2 lock request MUST be set to (BucketNumber<< 4) +
+ # BucketSequence.
+ # Increment the SequenceNumber of the element chosen above using MOD 16 arithmetic.
+
+ def logoff(self):
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_LOGOFF
+
+ smbLogoff = SMB2Logoff()
+
+ packet['Data'] = smbLogoff
+
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ # We clean the stuff we used in case we want to authenticate again
+ # within the same connection
+ self._Session['UserCredentials'] = ''
+ self._Session['Connection'] = 0
+ self._Session['SessionID'] = 0
+ self._Session['SigningRequired'] = False
+ self._Session['SigningKey'] = ''
+ self._Session['SessionKey'] = ''
+ self._Session['SigningActivated'] = False
+ 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_QUERY_INFO
+ packet['TreeID'] = treeId
+
+ queryInfo = SMB2QueryInfo()
+ queryInfo['FileID'] = fileId
+ queryInfo['InfoType'] = SMB2_0_INFO_FILE
+ queryInfo['FileInfoClass'] = fileInfoClass
+ queryInfo['OutputBufferLength'] = 65535
+ queryInfo['AdditionalInformation'] = additionalInformation
+ if len(inputBlob) == 0:
+ queryInfo['InputBufferOffset'] = 0
+ queryInfo['Buffer'] = '\x00'
+ else:
+ queryInfo['InputBufferLength'] = len(inputBlob)
+ queryInfo['Buffer'] = inputBlob
+ queryInfo['Flags'] = flags
+
+ packet['Data'] = queryInfo
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ queryResponse = SMB2QueryInfo_Response(ans['Data'])
+ 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:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if self._Session['OpenTable'].has_key(fileId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ packet = self.SMB_PACKET()
+ packet['Command'] = SMB2_SET_INFO
+ packet['TreeID'] = treeId
+
+ setInfo = SMB2SetInfo()
+ setInfo['InfoType'] = SMB2_0_INFO_FILE
+ setInfo['FileInfoClass'] = fileInfoClass
+ setInfo['BufferLength'] = len(inputBlob)
+ setInfo['AdditionalInformation'] = additionalInformation
+ setInfo['FileID'] = fileId
+ setInfo['Buffer'] = inputBlob
+
+ packet['Data'] = setInfo
+ packetID = self.sendSMB(packet)
+ ans = self.recvSMB(packetID)
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ return True
+
+ def getSessionKey(self):
+ if self.getDialect() == SMB2_DIALECT_30:
+ return self._Session['ApplicationKey']
+ else:
+ return self._Session['SessionKey']
+
+ def setSessionKey(self, key):
+ if self.getDialect() == SMB2_DIALECT_30:
+ self._Session['ApplicationKey'] = key
+ else:
+ self._Session['SessionKey'] = key
+
+ ######################################################################
+ # Higher level functions
+
+ def rename(self, shareName, oldPath, newPath):
+ oldPath = string.replace(oldPath,'/', '\\')
+ oldPath = ntpath.normpath(oldPath)
+ if len(oldPath) > 0 and oldPath[0] == '\\':
+ oldPath = oldPath[1:]
+
+ newPath = string.replace(newPath,'/', '\\')
+ newPath = ntpath.normpath(newPath)
+ if len(newPath) > 0 and newPath[0] == '\\':
+ newPath = newPath[1:]
+
+ treeId = self.connectTree(shareName)
+ fileId = None
+ try:
+ fileId = self.create(treeId, oldPath, MAXIMUM_ALLOWED ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, 0x200020, FILE_OPEN, 0)
+ renameReq = FILE_RENAME_INFORMATION_TYPE_2()
+ renameReq['ReplaceIfExists'] = 1
+ renameReq['RootDirectory'] = '\x00'*8
+ renameReq['FileNameLength'] = len(newPath)*2
+ renameReq['FileName'] = newPath.encode('utf-16le')
+ self.setInfo(treeId, fileId, renameReq, infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_RENAME_INFO)
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ return True
+
+ def writeFile(self, treeId, fileId, data, offset = 0):
+ finished = False
+ writeOffset = offset
+ while not finished:
+ if len(data) == 0:
+ break
+ writeData = data[:self._Connection['MaxWriteSize']]
+ data = data[self._Connection['MaxWriteSize']:]
+ written = self.write(treeId, fileId, writeData, writeOffset, len(writeData))
+ writeOffset += written
+ return writeOffset - offset
+
+ def listPath(self, shareName, path, password = None):
+ # ToDo: Handle situations where share is password protected
+ path = string.replace(path,'/', '\\')
+ path = ntpath.normpath(path)
+ if len(path) > 0 and path[0] == '\\':
+ path = path[1:]
+
+ treeId = self.connectTree(shareName)
+
+ fileId = None
+ try:
+ # ToDo, we're assuming it's a directory, we should check what the file type is
+ fileId = self.create(treeId, ntpath.dirname(path), FILE_READ_ATTRIBUTES | FILE_READ_DATA ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, FILE_OPEN, 0)
+ res = ''
+ files = []
+ from impacket import smb
+ while True:
+ try:
+ res = self.queryDirectory( treeId, fileId, ntpath.basename(path), maxBufferSize = 65535, informationClass = FILE_FULL_DIRECTORY_INFORMATION )
+ nextOffset = 1
+ while nextOffset != 0:
+ fileInfo = smb.SMBFindFileFullDirectoryInfo(smb.SMB.FLAGS2_UNICODE)
+ fileInfo.fromString(res)
+ 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:
+ if (e.get_error_code()) != STATUS_NO_MORE_FILES:
+ raise
+ break
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ return files
+
+ def mkdir(self, shareName, pathName, password = None):
+ # ToDo: Handle situations where share is password protected
+ pathName = string.replace(pathName,'/', '\\')
+ pathName = ntpath.normpath(pathName)
+ if len(pathName) > 0 and pathName[0] == '\\':
+ pathName = pathName[1:]
+
+ treeId = self.connectTree(shareName)
+
+ fileId = None
+ try:
+ fileId = self.create(treeId, pathName,GENERIC_ALL ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, FILE_CREATE, 0)
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ return True
+
+ def rmdir(self, shareName, pathName, password = None):
+ # ToDo: Handle situations where share is password protected
+ pathName = string.replace(pathName,'/', '\\')
+ pathName = ntpath.normpath(pathName)
+ if len(pathName) > 0 and pathName[0] == '\\':
+ pathName = pathName[1:]
+
+ treeId = self.connectTree(shareName)
+
+ fileId = None
+ try:
+ fileId = self.create(treeId, pathName, DELETE, FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE, FILE_OPEN, 0)
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ return True
+
+ def remove(self, shareName, pathName, password = None):
+ # ToDo: Handle situations where share is password protected
+ pathName = string.replace(pathName,'/', '\\')
+ pathName = ntpath.normpath(pathName)
+ if len(pathName) > 0 and pathName[0] == '\\':
+ pathName = pathName[1:]
+
+ treeId = self.connectTree(shareName)
+
+ fileId = None
+ try:
+ fileId = self.create(treeId, pathName,DELETE | FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE, FILE_NON_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE, FILE_OPEN, 0)
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ return True
+
+ def retrieveFile(self, shareName, path, callback, mode = FILE_OPEN, offset = 0, password = None, shareAccessMode = FILE_SHARE_READ):
+ # ToDo: Handle situations where share is password protected
+ path = string.replace(path,'/', '\\')
+ path = ntpath.normpath(path)
+ if len(path) > 0 and path[0] == '\\':
+ path = path[1:]
+
+ treeId = self.connectTree(shareName)
+ fileId = None
+ from impacket import smb
+ try:
+ fileId = self.create(treeId, path, FILE_READ_DATA, shareAccessMode, FILE_NON_DIRECTORY_FILE, mode, 0)
+ res = self.queryInfo(treeId, fileId)
+ fileInfo = smb.SMBQueryFileStandardInfo(res)
+ fileSize = fileInfo['EndOfFile']
+ if (fileSize-offset) < self._Connection['MaxReadSize']:
+ # Skip reading 0 bytes files.
+ if (fileSize-offset) > 0:
+ data = self.read(treeId, fileId, offset, fileSize-offset)
+ callback(data)
+ else:
+ written = 0
+ toBeRead = fileSize-offset
+ while written < toBeRead:
+ data = self.read(treeId, fileId, offset, self._Connection['MaxReadSize'])
+ written += len(data)
+ offset += len(data)
+ callback(data)
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ def storeFile(self, shareName, path, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = FILE_SHARE_WRITE):
+ # ToDo: Handle situations where share is password protected
+ path = string.replace(path,'/', '\\')
+ path = ntpath.normpath(path)
+ if len(path) > 0 and path[0] == '\\':
+ path = path[1:]
+
+ treeId = self.connectTree(shareName)
+ fileId = None
+ try:
+ fileId = self.create(treeId, path, FILE_WRITE_DATA, shareAccessMode, FILE_NON_DIRECTORY_FILE, mode, 0)
+ finished = False
+ writeOffset = offset
+ while not finished:
+ data = callback(self._Connection['MaxWriteSize'])
+ if len(data) == 0:
+ break
+ written = self.write(treeId, fileId, data, writeOffset, len(data))
+ writeOffset += written
+ finally:
+ if fileId is not None:
+ self.close(treeId, fileId)
+ self.disconnectTree(treeId)
+
+ def waitNamedPipe(self, treeId, pipename, timeout = 5):
+ pipename = ntpath.basename(pipename)
+ if self._Session['TreeConnectTable'].has_key(treeId) is False:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+ if len(pipename) > 0xffff:
+ raise SessionError(STATUS_INVALID_PARAMETER)
+
+ pipeWait = FSCTL_PIPE_WAIT_STRUCTURE()
+ pipeWait['Timeout'] = timeout*100000
+ pipeWait['NameLength'] = len(pipename)*2
+ pipeWait['TimeoutSpecified'] = 1
+ pipeWait['Name'] = pipename.encode('utf-16le')
+
+ return self.ioctl(treeId, None, FSCTL_PIPE_WAIT,flags=SMB2_0_IOCTL_IS_FSCTL, inputBlob=pipeWait, maxInputResponse = 0, maxOutputResponse=0)
+
+ def getIOCapabilities(self):
+ res = dict()
+
+ res['MaxReadSize'] = self._Connection['MaxReadSize']
+ res['MaxWriteSize'] = self._Connection['MaxWriteSize']
+ return res
+
+
+ ######################################################################
+ # Backward compatibility functions and alias for SMB1 and DCE Transports
+ # NOTE: It is strongly recommended not to use these commands
+ # when implementing new client calls.
+ get_server_name = getServerName
+ get_server_domain = getServerDomain
+ get_server_dns_domain_name = getServerDNSDomainName
+ get_remote_name = getServerName
+ get_remote_host = getServerIP
+ get_server_os = getServerOS
+ get_server_os_major = getServerOSMajor
+ get_server_os_minor = getServerOSMinor
+ get_server_os_build = getServerOSBuild
+ tree_connect_andx = connectTree
+ tree_connect = connectTree
+ connect_tree = connectTree
+ disconnect_tree = disconnectTree
+ set_timeout = setTimeout
+ use_timeout = useTimeout
+ stor_file = storeFile
+ retr_file = retrieveFile
+ list_path = listPath
+
+ def __del__(self):
+ if self._NetBIOSSession:
+ self._NetBIOSSession.close()
+
+
+ def doesSupportNTLMv2(self):
+ # Always true :P
+ return True
+
+ def is_login_required(self):
+ # Always true :P
+ return True
+
+ def is_signing_required(self):
+ return self._Session["SigningRequired"]
+
+ def nt_create_andx(self, treeId, fileName, smb_packet=None, cmd = None):
+ if len(fileName) > 0 and fileName[0] == '\\':
+ fileName = fileName[1:]
+
+ if cmd is not None:
+ from impacket import smb
+ ntCreate = smb.SMBCommand(data = str(cmd))
+ params = smb.SMBNtCreateAndX_Parameters(ntCreate['Parameters'])
+ return self.create(treeId, fileName, params['AccessMask'], params['ShareAccess'],
+ params['CreateOptions'], params['Disposition'], params['FileAttributes'],
+ params['Impersonation'], params['SecurityFlags'])
+
+ else:
+ return self.create(treeId, fileName,
+ FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA |
+ FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | READ_CONTROL,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_NON_DIRECTORY_FILE, FILE_OPEN, 0 )
+
+ def get_socket(self):
+ return self._NetBIOSSession.get_socket()
+
+
+ def write_andx(self,tid,fid,data, offset = 0, wait_answer=1, write_pipe_mode = False, smb_packet=None):
+ # ToDo: Handle the custom smb_packet situation
+ return self.write(tid, fid, data, offset, len(data))
+
+ def TransactNamedPipe(self, tid, fid, data, noAnswer = 0, waitAnswer = 1, offset = 0):
+ return self.ioctl(tid, fid, FSCTL_PIPE_TRANSCEIVE, SMB2_0_IOCTL_IS_FSCTL, data, maxOutputResponse = 65535, waitAnswer = noAnswer | waitAnswer)
+
+ def TransactNamedPipeRecv(self):
+ ans = self.recvSMB()
+
+ if ans.isValidAnswer(STATUS_SUCCESS):
+ smbIoctlResponse = SMB2Ioctl_Response(ans['Data'])
+ return smbIoctlResponse['Buffer']
+
+
+ def read_andx(self, tid, fid, offset=0, max_size = None, wait_answer=1, smb_packet=None):
+ # ToDo: Handle the custom smb_packet situation
+ if max_size is None:
+ max_size = self._Connection['MaxReadSize']
+ return self.read(tid, fid, offset, max_size, wait_answer)
+
+ def list_shared(self):
+ # In the context of SMB2/3, forget about the old LANMAN, throw NOT IMPLEMENTED
+ raise SessionError(STATUS_NOT_IMPLEMENTED)
+
+ def open_andx(self, tid, fileName, open_mode, desired_access):
+ # ToDo Return all the attributes of the file
+ if len(fileName) > 0 and fileName[0] == '\\':
+ fileName = fileName[1:]
+
+ fileId = self.create(tid,fileName,desired_access, open_mode, FILE_NON_DIRECTORY_FILE, open_mode, 0)
+ return fileId, 0, 0, 0, 0, 0, 0, 0, 0
+
diff --git a/tests/python_dependencies/impacket/smb3structs.py b/tests/python_dependencies/impacket/smb3structs.py
new file mode 100644
index 00000000..ddc8a908
--- /dev/null
+++ b/tests/python_dependencies/impacket/smb3structs.py
@@ -0,0 +1,1363 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (@agsolino)
+#
+# Description:
+# SMB 2 and 3 Protocol Structures and constants [MS-SMB2]
+#
+
+from impacket.structure import Structure
+
+# Constants
+
+# SMB Packet
+SMB2_PACKET_SIZE = 64
+
+# SMB Commands
+SMB2_NEGOTIATE = 0x0000 #
+SMB2_SESSION_SETUP = 0x0001 #
+SMB2_LOGOFF = 0x0002 #
+SMB2_TREE_CONNECT = 0x0003 #
+SMB2_TREE_DISCONNECT = 0x0004 #
+SMB2_CREATE = 0x0005 #
+SMB2_CLOSE = 0x0006 #
+SMB2_FLUSH = 0x0007 #
+SMB2_READ = 0x0008 #
+SMB2_WRITE = 0x0009 #
+SMB2_LOCK = 0x000A #
+SMB2_IOCTL = 0x000B #
+SMB2_CANCEL = 0x000C #
+SMB2_ECHO = 0x000D #
+SMB2_QUERY_DIRECTORY = 0x000E #
+SMB2_CHANGE_NOTIFY = 0x000F
+SMB2_QUERY_INFO = 0x0010 #
+SMB2_SET_INFO = 0x0011
+SMB2_OPLOCK_BREAK = 0x0012
+
+# SMB Flags
+SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001
+SMB2_FLAGS_ASYNC_COMMAND = 0x00000002
+SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004
+SMB2_FLAGS_SIGNED = 0x00000008
+SMB2_FLAGS_DFS_OPERATIONS = 0x10000000
+SMB2_FLAGS_REPLAY_OPERATION = 0x80000000
+
+# SMB Error SymLink Flags
+SYMLINK_FLAG_ABSOLUTE = 0x0
+SYMLINK_FLAG_RELATIVE = 0x1
+
+# SMB2_NEGOTIATE
+# Security Modes
+SMB2_NEGOTIATE_SIGNING_ENABLED = 0x1
+SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2
+
+# Capabilities
+SMB2_GLOBAL_CAP_DFS = 0x01
+SMB2_GLOBAL_CAP_LEASING = 0x02
+SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
+SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
+SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
+SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
+SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
+
+# Dialects
+SMB2_DIALECT_002 = 0x0202
+SMB2_DIALECT_21 = 0x0210
+SMB2_DIALECT_30 = 0x0300
+SMB2_DIALECT_WILDCARD = 0x02FF
+
+# SMB2_SESSION_SETUP
+# Flags
+SMB2_SESSION_FLAG_BINDING = 0x01
+SMB2_SESSION_FLAG_IS_GUEST = 0x01
+SMB2_SESSION_FLAG_IS_NULL = 0x02
+SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x04
+
+# SMB2_TREE_CONNECT
+# Types
+SMB2_SHARE_TYPE_DISK = 0x1
+SMB2_SHARE_TYPE_PIPE = 0x2
+SMB2_SHARE_TYPE_PRINT = 0x3
+
+# Share Flags
+SMB2_SHAREFLAG_MANUAL_CACHING = 0x00000000
+SMB2_SHAREFLAG_AUTO_CACHING = 0x00000010
+SMB2_SHAREFLAG_VDO_CACHING = 0x00000020
+SMB2_SHAREFLAG_NO_CACHING = 0x00000030
+SMB2_SHAREFLAG_DFS = 0x00000001
+SMB2_SHAREFLAG_DFS_ROOT = 0x00000002
+SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS = 0x00000100
+SMB2_SHAREFLAG_FORCE_SHARED_DELETE = 0x00000200
+SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING = 0x00000400
+SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
+SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK = 0x00001000
+SMB2_SHAREFLAG_ENABLE_HASH_V1 = 0x00002000
+SMB2_SHAREFLAG_ENABLE_HASH_V2 = 0x00004000
+SMB2_SHAREFLAG_ENCRYPT_DATA = 0x00008000
+
+# Capabilities
+SMB2_SHARE_CAP_DFS = 0x00000008
+SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY = 0x00000010
+SMB2_SHARE_CAP_SCALEOUT = 0x00000020
+SMB2_SHARE_CAP_CLUSTER = 0x00000040
+
+# SMB_CREATE
+# Oplocks
+SMB2_OPLOCK_LEVEL_NONE = 0x00
+SMB2_OPLOCK_LEVEL_II = 0x01
+SMB2_OPLOCK_LEVEL_EXCLUSIVE = 0x08
+SMB2_OPLOCK_LEVEL_BATCH = 0x09
+SMB2_OPLOCK_LEVEL_LEASE = 0xFF
+
+# Impersonation Level
+SMB2_IL_ANONYMOUS = 0x00000000
+SMB2_IL_IDENTIFICATION = 0x00000001
+SMB2_IL_IMPERSONATION = 0x00000002
+SMB2_IL_DELEGATE = 0x00000003
+
+# File Attributes
+FILE_ATTRIBUTE_ARCHIVE = 0x00000020
+FILE_ATTRIBUTE_COMPRESSED = 0x00000800
+FILE_ATTRIBUTE_DIRECTORY = 0x00000010
+FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
+FILE_ATTRIBUTE_HIDDEN = 0x00000002
+FILE_ATTRIBUTE_NORMAL = 0x00000080
+FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
+FILE_ATTRIBUTE_OFFLINE = 0x00001000
+FILE_ATTRIBUTE_READONLY = 0x00000001
+FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
+FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200
+FILE_ATTRIBUTE_SYSTEM = 0x00000004
+FILE_ATTRIBUTE_TEMPORARY = 0x00000100
+FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00000800
+FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000
+
+# Share Access
+FILE_SHARE_READ = 0x00000001
+FILE_SHARE_WRITE = 0x00000002
+FILE_SHARE_DELETE = 0x00000004
+
+# Create Disposition
+FILE_SUPERSEDE = 0x00000000
+FILE_OPEN = 0x00000001
+FILE_CREATE = 0x00000002
+FILE_OPEN_IF = 0x00000003
+FILE_OVERWRITE = 0x00000004
+FILE_OVERWRITE_IF = 0x00000005
+
+# Create Options
+FILE_DIRECTORY_FILE = 0x00000001
+FILE_WRITE_THROUGH = 0x00000002
+FILE_SEQUENTIAL_ONLY = 0x00000004
+FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
+FILE_SYNCHRONOUS_IO_ALERT = 0x00000010
+FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
+FILE_NON_DIRECTORY_FILE = 0x00000040
+FILE_COMPLETE_IF_OPLOCKED = 0x00000100
+FILE_NO_EA_KNOWLEDGE = 0x00000200
+FILE_RANDOM_ACCESS = 0x00000800
+FILE_DELETE_ON_CLOSE = 0x00001000
+FILE_OPEN_BY_FILE_ID = 0x00002000
+FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000
+FILE_NO_COMPRESSION = 0x00008000
+FILE_RESERVE_OPFILTER = 0x00100000
+FILE_OPEN_REPARSE_POINT = 0x00200000
+FILE_OPEN_NO_RECALL = 0x00400000
+FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
+
+# File Access Mask / Desired Access
+FILE_READ_DATA = 0x00000001
+FILE_WRITE_DATA = 0x00000002
+FILE_APPEND_DATA = 0x00000004
+FILE_READ_EA = 0x00000008
+FILE_WRITE_EA = 0x00000010
+FILE_EXECUTE = 0x00000020
+FILE_READ_ATTRIBUTES = 0x00000080
+FILE_WRITE_ATTRIBUTES = 0x00000100
+DELETE = 0x00010000
+READ_CONTROL = 0x00020000
+WRITE_DAC = 0x00040000
+WRITE_OWNER = 0x00080000
+SYNCHRONIZE = 0x00100000
+ACCESS_SYSTEM_SECURITY = 0x01000000
+MAXIMUM_ALLOWED = 0x02000000
+GENERIC_ALL = 0x10000000
+GENERIC_EXECUTE = 0x20000000
+GENERIC_WRITE = 0x40000000
+GENERIC_READ = 0x80000000
+
+# Directory Access Mask
+FILE_LIST_DIRECTORY = 0x00000001
+FILE_ADD_FILE = 0x00000002
+FILE_ADD_SUBDIRECTORY = 0x00000004
+FILE_TRAVERSE = 0x00000020
+FILE_DELETE_CHILD = 0x00000040
+
+# Create Contexts
+SMB2_CREATE_EA_BUFFER = 0x45787441
+SMB2_CREATE_SD_BUFFER = 0x53656344
+SMB2_CREATE_DURABLE_HANDLE_REQUEST = 0x44486e51
+SMB2_CREATE_DURABLE_HANDLE_RECONNECT = 0x44486e43
+SMB2_CREATE_ALLOCATION_SIZE = 0x416c5369
+SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST = 0x4d784163
+SMB2_CREATE_TIMEWARP_TOKEN = 0x54577270
+SMB2_CREATE_QUERY_ON_DISK_ID = 0x51466964
+SMB2_CREATE_REQUEST = 0x52714c73
+SMB2_CREATE_REQUEST_LEASE_V2 = 0x52714c73
+SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = 0x44483251
+SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = 0x44483243
+SMB2_CREATE_APP_INSTANCE_ID = 0x45BCA66AEFA7F74A9008FA462E144D74
+
+# Flags
+SMB2_CREATE_FLAG_REPARSEPOINT = 0x1
+FILE_NEED_EA = 0x80
+
+# CreateAction
+FILE_SUPERSEDED = 0x00000000
+FILE_OPENED = 0x00000001
+FILE_CREATED = 0x00000002
+FILE_OVERWRITTEN = 0x00000003
+
+# SMB2_CREATE_REQUEST_LEASE states
+SMB2_LEASE_NONE = 0x00
+SMB2_LEASE_READ_CACHING = 0x01
+SMB2_LEASE_HANDLE_CACHING = 0x02
+SMB2_LEASE_WRITE_CACHING = 0x04
+
+# SMB2_CREATE_REQUEST_LEASE_V2 Flags
+SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
+
+# SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
+SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
+
+# SMB2_CLOSE
+# Flags
+SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB = 0x0001
+
+# SMB2_READ
+# Channel
+SMB2_CHANNEL_NONE = 0x00
+SMB2_CHANNEL_RDMA_V1 = 0x01
+
+# SMB2_WRITE
+# Flags
+SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
+
+# Lease Break Notification
+SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED = 0x01
+
+# SMB_LOCK
+# Flags
+SMB2_LOCKFLAG_SHARED_LOCK = 0x01
+SMB2_LOCKFLAG_EXCLUSIVE_LOCK = 0x02
+SMB2_LOCKFLAG_UNLOCK = 0x04
+SMB2_LOCKFLAG_FAIL_IMMEDIATELY = 0x10
+
+# SMB IOCTL
+# Control Codes
+FSCTL_DFS_GET_REFERRALS = 0x00060194
+FSCTL_PIPE_PEEK = 0x0011400C
+FSCTL_PIPE_WAIT = 0x00110018
+FSCTL_PIPE_TRANSCEIVE = 0x0011C017
+FSCTL_SRV_COPYCHUNK = 0x001440F2
+FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
+FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
+FSCTL_SRV_READ_HASH = 0x001441bb
+FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
+FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
+FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
+FSCTL_SET_REPARSE_POINT = 0x000900A4
+FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
+FSCTL_FILE_LEVEL_TRIM = 0x00098208
+FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
+
+# Flags
+SMB2_0_IOCTL_IS_FSCTL = 0x1
+
+# SRV_READ_HASH
+# Type
+SRV_HASH_TYPE_PEER_DIST = 0x01
+
+# Version
+SRV_HASH_VER_1 = 0x1
+SRV_HASH_VER_2 = 0x2
+
+# Retrieval Type
+SRV_HASH_RETRIEVE_HASH_BASED = 0x01
+SRV_HASH_RETRIEVE_FILE_BASED = 0x02
+
+# NETWORK_INTERFACE_INFO
+# Capabilities
+RSS_CAPABLE = 0x01
+RDMA_CAPABLE = 0x02
+
+# SMB2_QUERY_DIRECTORIES
+# Information Class
+FILE_DIRECTORY_INFORMATION = 0x01
+FILE_FULL_DIRECTORY_INFORMATION = 0x02
+FILEID_FULL_DIRECTORY_INFORMATION = 0x26
+FILE_BOTH_DIRECTORY_INFORMATION = 0x03
+FILEID_BOTH_DIRECTORY_INFORMATION = 0x25
+FILENAMES_INFORMATION = 0x0C
+
+# Flags
+SMB2_RESTART_SCANS = 0x01
+SMB2_RETURN_SINGLE_ENTRY = 0x02
+SMB2_INDEX_SPECIFIED = 0x04
+SMB2_REOPEN = 0x10
+
+# SMB2_CHANGE_NOTIFY
+# Flags
+SMB2_WATCH_TREE = 0x01
+
+# Filters
+FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001
+FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002
+FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004
+FILE_NOTIFY_CHANGE_SIZE = 0x00000008
+FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010
+FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020
+FILE_NOTIFY_CHANGE_CREATION = 0x00000040
+FILE_NOTIFY_CHANGE_EA = 0x00000080
+FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
+FILE_NOTIFY_CHANGE_STREAM_NAME = 0x00000200
+FILE_NOTIFY_CHANGE_STREAM_SIZE = 0x00000400
+FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800
+
+# FILE_NOTIFY_INFORMATION
+# Actions
+FILE_ACTION_ADDED = 0x00000001
+FILE_ACTION_REMOVED = 0x00000002
+FILE_ACTION_MODIFIED = 0x00000003
+FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
+FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
+
+# SMB2_QUERY_INFO
+# InfoTypes
+SMB2_0_INFO_FILE = 0x01
+SMB2_0_INFO_FILESYSTEM = 0x02
+SMB2_0_INFO_SECURITY = 0x03
+SMB2_0_INFO_QUOTA = 0x04
+
+# File Information Classes
+SMB2_FILE_ACCESS_INFO = 8
+SMB2_FILE_ALIGNMENT_INFO = 17
+SMB2_FILE_ALL_INFO = 18
+SMB2_FILE_ALLOCATION_INFO = 19
+SMB2_FILE_ALTERNATE_NAME_INFO = 21
+SMB2_ATTRIBUTE_TAG_INFO = 35
+SMB2_FILE_BASIC_INFO = 4
+SMB2_FILE_BOTH_DIRECTORY_INFO = 3
+SMB2_FILE_COMPRESSION_INFO = 28
+SMB2_FILE_DIRECTORY_INFO = 1
+SMB2_FILE_DISPOSITION_INFO = 13
+SMB2_FILE_EA_INFO = 7
+SMB2_FILE_END_OF_FILE_INFO = 20
+SMB2_FULL_DIRECTORY_INFO = 2
+SMB2_FULL_EA_INFO = 15
+SMB2_FILE_HARDLINK_INFO = 46
+SMB2_FILE_ID_BOTH_DIRECTORY_INFO = 37
+SMB2_FILE_ID_FULL_DIRECTORY_INFO = 38
+SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
+SMB2_FILE_INTERNAL_INFO = 6
+SMB2_FILE_LINK_INFO = 11
+SMB2_FILE_MAILSLOT_QUERY_INFO = 26
+SMB2_FILE_MAILSLOT_SET_INFO = 27
+SMB2_FILE_MODE_INFO = 16
+SMB2_FILE_MOVE_CLUSTER_INFO = 31
+SMB2_FILE_NAME_INFO = 9
+SMB2_FILE_NAMES_INFO = 12
+SMB2_FILE_NETWORK_OPEN_INFO = 34
+SMB2_FILE_NORMALIZED_NAME_INFO = 48
+SMB2_FILE_OBJECT_ID_INFO = 29
+SMB2_FILE_PIPE_INFO = 23
+SMB2_FILE_PIPE_LOCAL_INFO = 24
+SMB2_FILE_PIPE_REMOTE_INFO = 25
+SMB2_FILE_POSITION_INFO = 14
+SMB2_FILE_QUOTA_INFO = 32
+SMB2_FILE_RENAME_INFO = 10
+SMB2_FILE_REPARSE_POINT_INFO = 33
+SMB2_FILE_SFIO_RESERVE_INFO = 44
+SMB2_FILE_SHORT_NAME_INFO = 45
+SMB2_FILE_STANDARD_INFO = 5
+SMB2_FILE_STANDARD_LINK_INFO = 54
+SMB2_FILE_STREAM_INFO = 22
+SMB2_FILE_TRACKING_INFO = 36
+SMB2_FILE_VALID_DATA_LENGTH_INFO = 39
+
+# File System Information Classes
+SMB2_FILESYSTEM_VOLUME_INFO = 1
+SMB2_FILESYSTEM_LABEL_INFO = 2
+SMB2_FILESYSTEM_SIZE_INFO = 3
+SMB2_FILESYSTEM_DEVICE_INFO = 4
+SMB2_FILESYSTEM_ATTRIBUTE_INFO = 5
+SMB2_FILESYSTEM_CONTROL_INFO = 6
+SMB2_FILESYSTEM_FULL_SIZE_INFO = 7
+SMB2_FILESYSTEM_OBJECT_ID_INFO = 8
+SMB2_FILESYSTEM_DRIVER_PATH_INFO = 9
+SMB2_FILESYSTEM_SECTOR_SIZE_INFO = 11
+
+# Additional information
+OWNER_SECURITY_INFORMATION = 0x00000001
+GROUP_SECURITY_INFORMATION = 0x00000002
+DACL_SECURITY_INFORMATION = 0x00000004
+SACL_SECURITY_INFORMATION = 0x00000008
+LABEL_SECURITY_INFORMATION = 0x00000010
+
+# Flags
+SL_RESTART_SCAN = 0x00000001
+SL_RETURN_SINGLE_ENTRY = 0x00000002
+SL_INDEX_SPECIFIED = 0x00000004
+
+# TRANSFORM_HEADER
+SMB2_ENCRYPTION_AES128_CCM = 0x0001
+
+
+# STRUCtures
+# Represents a SMB2/3 Packet
+class SMBPacketBase(Structure):
+ def addCommand(self,command):
+ # Pad to 8 bytes and put the offset of another SMBPacket
+ raise 'Implement This!'
+
+ def isValidAnswer(self, status):
+ if self['Status'] != status:
+ import smb3
+ raise smb3.SessionError(self['Status'], self)
+ return True
+
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['TreeID'] = 0
+
+
+class SMB2PacketAsync(SMBPacketBase):
+ structure = (
+ ('ProtocolID','"\xfeSMB'),
+ ('StructureSize','<H=64'),
+ ('CreditCharge','<H=0'),
+ ('Status','<L=0'),
+ ('Command','<H=0'),
+ ('CreditRequestResponse','<H=0'),
+ ('Flags','<L=0'),
+ ('NextCommand','<L=0'),
+ ('MessageID','<Q=0'),
+ ('AsyncID','<Q=0'),
+ ('SessionID','<Q=0'),
+ ('Signature','16s=""'),
+ ('Data',':=""'),
+ )
+
+class SMB3PacketAsync(SMBPacketBase):
+ structure = (
+ ('ProtocolID','"\xfeSMB'),
+ ('StructureSize','<H=64'),
+ ('CreditCharge','<H=0'),
+ ('ChannelSequence','<H=0'),
+ ('Reserved','<H=0'),
+ ('Command','<H=0'),
+ ('CreditRequestResponse','<H=0'),
+ ('Flags','<L=0'),
+ ('NextCommand','<L=0'),
+ ('MessageID','<Q=0'),
+ ('AsyncID','<Q=0'),
+ ('SessionID','<Q=0'),
+ ('Signature','16s=""'),
+ ('Data',':=""'),
+ )
+
+class SMB2Packet(SMBPacketBase):
+ structure = (
+ ('ProtocolID','"\xfeSMB'),
+ ('StructureSize','<H=64'),
+ ('CreditCharge','<H=0'),
+ ('Status','<L=0'),
+ ('Command','<H=0'),
+ ('CreditRequestResponse','<H=0'),
+ ('Flags','<L=0'),
+ ('NextCommand','<L=0'),
+ ('MessageID','<Q=0'),
+ ('Reserved','<L=0'),
+ ('TreeID','<L=0'),
+ ('SessionID','<Q=0'),
+ ('Signature','16s=""'),
+ ('Data',':=""'),
+ )
+
+class SMB3Packet(SMBPacketBase):
+ structure = (
+ ('ProtocolID','"\xfeSMB'),
+ ('StructureSize','<H=64'),
+ ('CreditCharge','<H=0'),
+ ('ChannelSequence','<H=0'),
+ ('Reserved','<H=0'),
+ ('Command','<H=0'),
+ ('CreditRequestResponse','<H=0'),
+ ('Flags','<L=0'),
+ ('NextCommand','<L=0'),
+ ('MessageID','<Q=0'),
+ ('Reserved','<L=0'),
+ ('TreeID','<L=0'),
+ ('SessionID','<Q=0'),
+ ('Signature','16s=""'),
+ ('Data',':=""'),
+ )
+
+class SMB2Error(Structure):
+ structure = (
+ ('StructureSize','<H=9'),
+ ('Reserved','<H=0'),
+ ('ByteCount','<L=0'),
+ ('_ErrorData','_-ErrorData','self["ByteCount"]'),
+ ('ErrorData','"\xff'),
+ )
+
+class SMB2ErrorSymbolicLink(Structure):
+ structure = (
+ ('SymLinkLength','<L=0'),
+ ('SymLinkErrorTag','<L=0'),
+ ('ReparseTag','<L=0'),
+ ('ReparseDataLenght','<H=0'),
+ ('UnparsedPathLength','<H=0'),
+ ('SubstituteNameOffset','<H=0'),
+ ('SubstituteNameLength','<H=0'),
+ ('PrintNameOffset','<H=0'),
+ ('PrintNameLength','<H=0'),
+ ('Flags','<L=0'),
+ ('PathBuffer',':'),
+ )
+
+# SMB2_NEGOTIATE
+class SMB2Negotiate(Structure):
+ structure = (
+ ('StructureSize','<H=36'),
+ ('DialectCount','<H=0'),
+ ('SecurityMode','<H=0'),
+ ('Reserved','<H=0'),
+ ('Capabilities','<L=0'),
+ ('ClientGuid','16s=""'),
+ ('ClientStartTime','<Q=0'),
+ ('Dialects','*<H'),
+ )
+
+class SMB2Negotiate_Response(Structure):
+ structure = (
+ ('StructureSize','<H=65'),
+ ('SecurityMode','<H=0'),
+ ('DialectRevision','<H=0'),
+ ('Reserved','<H=0'),
+ ('ServerGuid','16s=""'),
+ ('Capabilities','<L=0'),
+ ('MaxTransactSize','<L=0'),
+ ('MaxReadSize','<L=0'),
+ ('MaxWriteSize','<L=0'),
+ ('SystemTime','<Q=0'),
+ ('ServerStartTime','<Q=0'),
+ ('SecurityBufferOffset','<H=0'),
+ ('SecurityBufferLength','<H=0'),
+ ('Reserved2','<L=0'),
+ ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_SESSION_SETUP
+class SMB2SessionSetup(Structure):
+ SIZE = 24
+ structure = (
+ ('StructureSize','<H=25'),
+ ('Flags','<B=0'),
+ ('SecurityMode','<B=0'),
+ ('Capabilities','<L=0'),
+ ('Channel','<L=0'),
+ ('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('SecurityBufferLength','<H=0'),
+ ('PreviousSessionId','<Q=0'),
+ ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+ def getData(self):
+ #self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7)
+ #self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad'])
+ #self['SecurityBufferLength'] += len(self['AlignPad'])
+ return Structure.getData(self)
+
+
+class SMB2SessionSetup_Response(Structure):
+ structure = (
+ ('StructureSize','<H=9'),
+ ('SessionFlags','<H=0'),
+ ('SecurityBufferOffset','<H=0'),
+ ('SecurityBufferLength','<H=0'),
+ ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_LOGOFF
+class SMB2Logoff(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+
+class SMB2Logoff_Response(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+# SMB2_TREE_CONNECT
+class SMB2TreeConnect(Structure):
+ SIZE = 8
+ structure = (
+ ('StructureSize','<H=9'),
+ ('Reserved','<H=0'),
+ ('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('PathLength','<H=0'),
+ ('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["PathLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+class SMB2TreeConnect_Response(Structure):
+ structure = (
+ ('StructureSize','<H=16'),
+ ('ShareType','<B=0'),
+ ('Reserved','<B=0'),
+ ('ShareFlags','<L=0'),
+ ('Capabilities','<L=0'),
+ ('MaximalAccess','<L=0'),
+ )
+
+# SMB2_TREE_DISCONNECT
+class SMB2TreeDisconnect(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+class SMB2TreeDisconnect_Response(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+# SMB2_CREATE
+class SMB2Create(Structure):
+ SIZE = 56
+ structure = (
+ ('StructureSize','<H=57'),
+ ('SecurityFlags','<B=0'),
+ ('RequestedOplockLevel','<B=0'),
+ ('ImpersonationLevel','<L=0'),
+ ('SmbCreateFlags','<Q=0'),
+ ('Reserved','<Q=0'),
+ ('DesiredAccess','<L=0'),
+ ('FileAttributes','<L=0'),
+ ('ShareAccess','<L=0'),
+ ('CreateDisposition','<L=0'),
+ ('CreateOptions','<L=0'),
+ ('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('NameLength','<H=0'),
+ ('CreateContextsOffset','<L=0'),
+ ('CreateContextsLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+class SMB2CreateContext(Structure):
+ structure = (
+ ('Next','<L=0'),
+ ('NameOffset','<H=0'),
+ ('NameLength','<H=0'),
+ ('Reserved','<H=0'),
+ ('DataOffset','<H=0'),
+ ('DataLength','<L=0'),
+ ('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'),
+ ('Buffer',':'),
+ )
+
+class SMB2_FILEID(Structure):
+ structure = (
+ ('Persistent','<Q=0'),
+ ('Volatile','<Q=0'),
+ )
+
+class SMB2Create_Response(Structure):
+ structure = (
+ ('StructureSize','<H=89'),
+ ('OplockLevel','<B=0'),
+ ('Flags','<B=0'),
+ ('CreateAction','<L=0'),
+ ('CreationTime','<Q=0'),
+ ('LastAccessTime','<Q=0'),
+ ('LastWriteTime','<Q=0'),
+ ('ChangeTime','<Q=0'),
+ ('AllocationSize','<Q=0'),
+ ('EndOfFile','<Q=0'),
+ ('FileAttributes','<L=0'),
+ ('Reserved2','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('CreateContextsOffset','<L=0'),
+ ('CreateContextsLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["CreateContextsLength"]'),
+ ('Buffer',':'),
+ )
+
+class FILE_FULL_EA_INFORMATION(Structure):
+ structure = (
+ ('NextEntryOffset','<L=0'),
+ ('Flags','<B=0'),
+ ('EaNameLength','<B=0'),
+ ('EaValueLength','<H=0'),
+ ('_EaName','_-EaName','self["EaNameLength"]'),
+ ('EaName',':'),
+ ('_EaValue','_-EaValue','self["EaValue"]'),
+ ('EaValue',':'),
+ )
+
+
+class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
+ structure = (
+ ('Data',':',SMB2_FILEID),
+ )
+
+class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
+ structure = (
+ ('DurableRequest','16s=""'),
+ )
+
+class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
+ structure = (
+ ('Reserved','<Q=0'),
+ )
+
+class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
+ structure = (
+ ('Timestamp','<Q=0'),
+ )
+
+class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
+ structure = (
+ ('QueryStatus','<L=0'),
+ ('MaximalAccess','<L=0'),
+ )
+
+class SMB2_CREATE_ALLOCATION_SIZE(Structure):
+ structure = (
+ ('AllocationSize','<Q=0'),
+ )
+
+class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
+ structure = (
+ ('AllocationSize','<Q=0'),
+ )
+
+class SMB2_CREATE_REQUEST_LEASE(Structure):
+ structure = (
+ ('LeaseKey','16s=""'),
+ ('LeaseState','<L=0'),
+ ('LeaseFlags','<L=0'),
+ ('LeaseDuration','<Q=0'),
+ )
+
+SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
+
+class SMB2_CREATE_REQUEST_LEASE_V2(Structure):
+ structure = (
+ ('LeaseKey','16s=""'),
+ ('LeaseState','<L=0'),
+ ('Flags','<L=0'),
+ ('LeaseDuration','<Q=0'),
+ ('ParentLeaseKey','16s=""'),
+ ('Epoch','<H=0'),
+ ('Reserved','<H=0'),
+ )
+
+SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
+
+class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure):
+ structure = (
+ ('Timeout','<L=0'),
+ ('Flags','<L=0'),
+ ('Reserved','8s=""'),
+ ('CreateGuid','16s=""'),
+ )
+
+class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
+ structure = (
+ ('Timeout','<L=0'),
+ ('Flags','<L=0'),
+ )
+
+class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
+ structure = (
+ ('FileID',':', SMB2_FILEID),
+ ('CreateGuid','16s=""'),
+ ('Flags','<L=0'),
+ )
+
+class SMB2_CREATE_APP_INSTANCE_ID(Structure):
+ structure = (
+ ('StructureSize','<H=0'),
+ ('Reserved','<H=0'),
+ ('AppInstanceId','16s=""'),
+ )
+
+class SMB2_CREATE_QUERY_ON_DISK_ID(Structure):
+ structure = (
+ ('DiskIDBuffer','32s=""'),
+ )
+
+# Todo: Add Classes for
+#SMB2_CREATE_SD_BUFFER
+
+# SMB2_CLOSE
+class SMB2Close(Structure):
+ structure = (
+ ('StructureSize','<H=24'),
+ ('Flags','<H=0'),
+ ('Reserved','<L=0'),
+ ('FileID',':', SMB2_FILEID),
+ )
+
+class SMB2Close_Response(Structure):
+ structure = (
+ ('StructureSize','<H=60'),
+ ('Flags','<H=0'),
+ ('Reserved','<L=0'),
+ ('CreationTime','<Q=0'),
+ ('LastAccessTime','<Q=0'),
+ ('LastWriteTime','<Q=0'),
+ ('ChangeTime','<Q=0'),
+ ('AllocationSize','<Q=0'),
+ ('EndofFile','<Q=0'),
+ ('FileAttributes','<L=0'),
+ )
+
+# SMB2_FLUSH
+class SMB2Flush(Structure):
+ structure = (
+ ('StructureSize','<H=24'),
+ ('Reserved1','<H=0'),
+ ('Reserved2','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ )
+
+class SMB2Flush_Response(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+# SMB2_READ
+class SMB2Read(Structure):
+ SIZE = 48
+ structure = (
+ ('StructureSize','<H=49'),
+ ('Padding','<B=0'),
+ ('Reserved','<B=0'),
+ ('Length','<L=0'),
+ ('Offset','<Q=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('MinimumCount','<L=0'),
+ ('Channel','<L=0'),
+ ('RemainingBytes','<L=0'),
+ ('ReadChannelInfoOffset','<H=0'),
+ ('ReadChannelInfoLength','<H=0'),
+ ('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'),
+ ('Buffer',':=0'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+
+class SMB2Read_Response(Structure):
+ structure = (
+ ('StructureSize','<H=17'),
+ ('DataOffset','<B=0'),
+ ('Reserved','<B=0'),
+ ('DataLength','<L=0'),
+ ('DataRemaining','<L=0'),
+ ('Reserved2','<L=0'),
+ ('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["DataLength"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_WRITE
+class SMB2Write(Structure):
+ SIZE = 48
+ structure = (
+ ('StructureSize','<H=49'),
+ ('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('Length','<L=0'),
+ ('Offset','<Q=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('Channel','<L=0'),
+ ('RemainingBytes','<L=0'),
+ ('WriteChannelInfoOffset','<H=0'),
+ ('WriteChannelInfoLength','<H=0'),
+ ('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('Flags','<L=0'),
+ ('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+
+class SMB2Write_Response(Structure):
+ structure = (
+ ('StructureSize','<H=17'),
+ ('Reserved','<H=0'),
+ ('Count','<L=0'),
+ ('Remaining','<L=0'),
+ ('WriteChannelInfoOffset','<H=0'),
+ ('WriteChannelInfoLength','<H=0'),
+ )
+
+class SMB2OplockBreakNotification(Structure):
+ structure = (
+ ('StructureSize','<H=24'),
+ ('OplockLevel','<B=0'),
+ ('Reserved','<B=0'),
+ ('Reserved2','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ )
+
+SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
+SMB2OplockBreakResponse = SMB2OplockBreakNotification
+
+class SMB2LeaseBreakNotification(Structure):
+ structure = (
+ ('StructureSize','<H=44'),
+ ('NewEpoch','<H=0'),
+ ('Flags','<L=0'),
+ ('LeaseKey','16s=""'),
+ ('CurrentLeaseState','<L=0'),
+ ('NewLeaseState','<L=0'),
+ ('BreakReason','<L=0'),
+ ('AccessMaskHint','<L=0'),
+ ('ShareMaskHint','<L=0'),
+ )
+
+class SMB2LeaseBreakAcknowledgement(Structure):
+ structure = (
+ ('StructureSize','<H=36'),
+ ('Reserved','<H=0'),
+ ('Flags','<L=0'),
+ ('LeaseKey','16s=""'),
+ ('LeaseState','<L=0'),
+ ('LeaseDuration','<Q=0'),
+ )
+
+SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
+
+# SMB2_LOCK
+class SMB2_LOCK_ELEMENT(Structure):
+ structure = (
+ ('Offset','<Q=0'),
+ ('Length','<Q=0'),
+ ('Flags','<L=0'),
+ ('Reserved','<L=0'),
+ )
+
+class SMB2Lock(Structure):
+ structure = (
+ ('StructureSize','<H=48'),
+ ('LockCount','<H=0'),
+ ('LockSequence','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('_Locks','_-Locks','self["LockCount"]*24'),
+ ('Locks',':'),
+ )
+
+class SMB2Lock_Response(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+
+# SMB2_ECHO
+class SMB2Echo(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+SMB2Echo_Response = SMB2Echo
+
+# SMB2_CANCEL`
+class SMB2Cancel(Structure):
+ structure = (
+ ('StructureSize','<H=4'),
+ ('Reserved','<H=0'),
+ )
+
+# SMB2_IOCTL
+class SMB2Ioctl(Structure):
+ SIZE = 56
+ structure = (
+ ('StructureSize','<H=57'),
+ ('Reserved','<H=0'),
+ ('CtlCode','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('InputCount','<L=0'),
+ ('MaxInputResponse','<L=0'),
+ ('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'),
+ ('OutputCount','<L=0'),
+ ('MaxOutputResponse','<L=0'),
+ ('Flags','<L=0'),
+ ('Reserved2','<L=0'),
+ #('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
+ #('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+class FSCTL_PIPE_WAIT_STRUCTURE(Structure):
+ structure = (
+ ('Timeout','<q=0'),
+ ('NameLength','<L=0'),
+ ('TimeoutSpecified','<B=0'),
+ ('Padding','<B=0'),
+ ('_Name','_-Name','self["NameLength"]'),
+ ('Name',':'),
+ )
+
+class SRV_COPYCHUNK_COPY(Structure):
+ structure = (
+ ('SourceKey','24s=""'),
+ ('ChunkCount','<L=0'),
+ ('Reserved','<L=0'),
+ ('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'),
+ ('Chunks',':'),
+ )
+
+class SRV_COPYCHUNK(Structure):
+ structure = (
+ ('SourceOffset','<Q=0'),
+ ('TargetOffset','<Q=0'),
+ ('Length','<L=0'),
+ ('Reserved','<L=0'),
+ )
+
+class SRV_COPYCHUNK_RESPONSE(Structure):
+ structure = (
+ ('ChunksWritten','<L=0'),
+ ('ChunkBytesWritten','<L=0'),
+ ('TotalBytesWritten','<L=0'),
+ )
+
+class SRV_READ_HASH(Structure):
+ structure = (
+ ('HashType','<L=0'),
+ ('HashVersion','<L=0'),
+ ('HashRetrievalType','<L=0'),
+ ('Length','<L=0'),
+ ('Offset','<Q=0'),
+ )
+
+class NETWORK_RESILIENCY_REQUEST(Structure):
+ structure = (
+ ('Timeout','<L=0'),
+ ('Reserved','<L=0'),
+ )
+
+class VALIDATE_NEGOTIATE_INFO(Structure):
+ structure = (
+ ('Capabilities','<L=0'),
+ ('Guid','16s=""'),
+ ('SecurityMode','<H=0'),
+ #('DialectCount','<H=0'),
+ ('Dialects','<H*<H'),
+ )
+
+class SRV_SNAPSHOT_ARRAY(Structure):
+ structure = (
+ ('NumberOfSnapShots','<L=0'),
+ ('NumberOfSnapShotsReturned','<L=0'),
+ ('SnapShotArraySize','<L=0'),
+ ('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'),
+ ('SnapShots',':'),
+ )
+
+class SRV_REQUEST_RESUME_KEY(Structure):
+ structure = (
+ ('ResumeKey','24s=""'),
+ ('ContextLength','<L=0'),
+ ('_Context','_-Context','self["ContextLength"]'),
+ ('Context',':'),
+ )
+
+class HASH_HEADER(Structure):
+ structure = (
+ ('HashType','<L=0'),
+ ('HashVersion','<L=0'),
+ ('SourceFileChangeTime','<Q=0'),
+ ('SourceFileSize','<Q=0'),
+ ('HashBlobLength','<L=0'),
+ ('HashBlobOffset','<L=0'),
+ ('Dirty','<H=0'),
+ ('SourceFileNameLength','<L=0'),
+ ('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',),
+ ('SourceFileName',':'),
+ )
+
+class SRV_HASH_RETRIEVE_HASH_BASED(Structure):
+ structure = (
+ ('Offset','<Q=0'),
+ ('BufferLength','<L=0'),
+ ('Reserved','<L=0'),
+ ('_Buffer','_-Buffer','self["BufferLength"]'),
+ ('Buffer',':'),
+ )
+
+class SRV_HASH_RETRIEVE_FILE_BASED(Structure):
+ structure = (
+ ('FileDataOffset','<Q=0'),
+ ('FileDataLength','<Q=0'),
+ ('BufferLength','<L=0'),
+ ('Reserved','<L=0'),
+ ('_Buffer','_-Buffer','self["BufferLength"]'),
+ ('Buffer',':'),
+ )
+
+class NETWORK_INTERFACE_INFO(Structure):
+ structure = (
+ ('Next','<L=0'),
+ ('IfIndex','<L=0'),
+ ('Capability','<L=0'),
+ ('Reserved','<L=0'),
+ ('LinkSpeed','<Q=0'),
+ ('SockAddr_Storage','128s=""'),
+ )
+
+class SMB2Ioctl_Response(Structure):
+ structure = (
+ ('StructureSize','<H=49'),
+ ('Reserved','<H=0'),
+ ('CtlCode','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('InputOffset','<L=0'),
+ ('InputCount','<L=0'),
+ ('OutputOffset','<L=0'),
+ ('OutputCount','<L=0'),
+ ('Flags','<L=0'),
+ ('Reserved2','<L=0'),
+ ('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_QUERY_DIRECTORY
+class SMB2QueryDirectory(Structure):
+ SIZE = 32
+ structure = (
+ ('StructureSize','<H=33'),
+ ('FileInformationClass','<B=0'),
+ ('Flags','<B=0'),
+ ('FileIndex','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('FileNameLength','<H=0'),
+ ('OutputBufferLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["FileNameLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+class SMB2QueryDirectory_Response(Structure):
+ structure = (
+ ('StructureSize','<H=9'),
+ ('OutputBufferOffset','<H=0'),
+ ('OutputBufferLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_CHANGE_NOTIFY
+class SMB2ChangeNotify(Structure):
+ structure = (
+ ('StructureSize','<H=32'),
+ ('Flags','<H=0'),
+ ('OutputBufferLength','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('CompletionFilter','<L=0'),
+ ('Reserved','<L=0'),
+ )
+
+class SMB2ChangeNotify_Response(Structure):
+ structure = (
+ ('StructureSize','<H=9'),
+ ('OutputBufferOffset','<H=0'),
+ ('OutputBufferLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+class FILE_NOTIFY_INFORMATION(Structure):
+ structure = (
+ ('NextEntryOffset','<L=0'),
+ ('Action','<L=0'),
+ ('FileNameLength','<L=0'),
+ ('_FileName','_-FileName','self["FileNameLength"]',),
+ ('FileName',':'),
+ )
+
+# SMB2_QUERY_INFO
+class SMB2QueryInfo(Structure):
+ SIZE = 40
+ structure = (
+ ('StructureSize','<H=41'),
+ ('InfoType','<B=0'),
+ ('FileInfoClass','<B=0'),
+ ('OutputBufferLength','<L=0'),
+ ('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('Reserved','<H=0'),
+ ('InputBufferLength','<L=0'),
+ ('AdditionalInformation','<L=0'),
+ ('Flags','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["InputBufferLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+
+class SMB2_QUERY_QUOTA_INFO(Structure):
+ structure = (
+ ('ReturnSingle','<B=0'),
+ ('RestartScan','<B=0'),
+ ('Reserved','<H=0'),
+ ('SidListLength','<L=0'),
+ ('StartSidLength','<L=0'),
+ ('StartSidOffset','<L=0'),
+ # ToDo: Check 2.2.37.1 here
+ ('SidBuffer',':'),
+ )
+
+class SMB2QueryInfo_Response(Structure):
+ structure = (
+ ('StructureSize','<H=9'),
+ ('OutputBufferOffset','<H=0'),
+ ('OutputBufferLength','<L=0'),
+ ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
+ ('Buffer',':'),
+ )
+
+# SMB2_SET_INFO
+class SMB2SetInfo(Structure):
+ SIZE = 32
+ structure = (
+ ('StructureSize','<H=33'),
+ ('InfoType','<B=0'),
+ ('FileInfoClass','<B=0'),
+ ('BufferLength','<L=0'),
+ ('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
+ ('Reserved','<H=0'),
+ ('AdditionalInformation','<L=0'),
+ ('FileID',':',SMB2_FILEID),
+ ('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'),
+ ('AlignPad',':=""'),
+ ('_Buffer','_-Buffer','self["BufferLength"]'),
+ ('Buffer',':'),
+ )
+ def __init__(self, data = None):
+ Structure.__init__(self,data)
+ if data is None:
+ self['AlignPad'] = ''
+
+class SMB2SetInfo_Response(Structure):
+ structure = (
+ ('StructureSize','<H=2'),
+ )
+
+class FILE_RENAME_INFORMATION_TYPE_2(Structure):
+ structure = (
+ ('ReplaceIfExists','<B=0'),
+ ('Reserved','7s=""'),
+ ('RootDirectory','<Q=0'),
+ ('FileNameLength','<L=0'),
+ ('_FileName','_-FileName','self["FileNameLength"]'),
+ ('FileName',':'),
+ )
+
+class SMB2_TRANSFORM_HEADER(Structure):
+ structure = (
+ ('ProtocolID','"\xfdSMB'),
+ ('Signature','16s=""'),
+ ('Nonce','16s=""'),
+ ('OriginalMessageSize','<L=0'),
+ ('Reserved','<H=0'),
+ ('EncryptionAlgorithm','<H=0'),
+ ('SessionID','<Q=0'),
+ )
+
+# SMB2_FILE_INTERNAL_INFO
+class FileInternalInformation(Structure):
+ structure = (
+ ('IndexNumber','<q=0'),
+ )
diff --git a/tests/python_dependencies/impacket/smbserver.py b/tests/python_dependencies/impacket/smbserver.py
new file mode 100644
index 00000000..aa795e52
--- /dev/null
+++ b/tests/python_dependencies/impacket/smbserver.py
@@ -0,0 +1,4168 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (@agsolino)
+#
+# TODO:
+# [-] Functions should return NT error codes
+# [-] Handling errors in all situations, right now it's just raising exceptions.
+# [*] Standard authentication support
+# [ ] Organize the connectionData stuff
+# [*] Add capability to send a bad user ID if the user is not authenticated,
+# right now you can ask for any command without actually being authenticated
+# [ ] PATH TRAVERSALS EVERYWHERE.. BE WARNED!
+# [ ] Check the credentials.. now we're just letting everybody to log in.
+# [ ] Check error situation (now many places assume the right data is coming)
+# [ ] Implement IPC to the main process so the connectionData is on a single place
+# [ ] Hence.. implement locking
+# estamos en la B
+
+from __future__ import with_statement
+import calendar
+import socket
+import time
+import datetime
+import struct
+import ConfigParser
+import SocketServer
+import threading
+import logging
+import logging.config
+import ntpath
+import os
+import fnmatch
+import errno
+import sys
+import random
+import shutil
+from binascii import hexlify
+
+# For signing
+from impacket import smb, nmb, ntlm, uuid, LOG
+from impacket import smb3structs as smb2
+from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, MechTypes, SPNEGO_NegTokenResp, ASN1_AID, ASN1_SUPPORTED_MECH
+from impacket.nt_errors import STATUS_NO_MORE_FILES, STATUS_NETWORK_NAME_DELETED, STATUS_INVALID_PARAMETER, \
+ STATUS_FILE_CLOSED, STATUS_MORE_PROCESSING_REQUIRED, STATUS_OBJECT_PATH_NOT_FOUND, STATUS_DIRECTORY_NOT_EMPTY, \
+ STATUS_FILE_IS_A_DIRECTORY, STATUS_NOT_IMPLEMENTED, STATUS_INVALID_HANDLE, STATUS_OBJECT_NAME_COLLISION, \
+ STATUS_NO_SUCH_FILE, STATUS_CANCELLED, STATUS_OBJECT_NAME_NOT_FOUND, STATUS_SUCCESS, STATUS_ACCESS_DENIED, \
+ STATUS_NOT_SUPPORTED, STATUS_INVALID_DEVICE_REQUEST, STATUS_FS_DRIVER_REQUIRED, STATUS_INVALID_INFO_CLASS
+
+# These ones not defined in nt_errors
+STATUS_SMB_BAD_UID = 0x005B0002
+STATUS_SMB_BAD_TID = 0x00050002
+
+# Utility functions
+# and general functions.
+# There are some common functions that can be accessed from more than one SMB
+# command (or either TRANSACTION). That's why I'm putting them here
+# TODO: Return NT ERROR Codes
+
+def outputToJohnFormat(challenge, username, domain, lmresponse, ntresponse):
+# We don't want to add a possible failure here, since this is an
+# extra bonus. We try, if it fails, returns nothing
+ ret_value = ''
+ try:
+ if len(ntresponse) > 24:
+ # Extended Security - NTLMv2
+ ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username.decode('utf-16le'), domain.decode('utf-16le'), hexlify(challenge), hexlify(ntresponse)[:32], hexlify(ntresponse)[32:]), 'hash_version':'ntlmv2'}
+ else:
+ # NTLMv1
+ ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username.decode('utf-16le'), domain.decode('utf-16le'), hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
+ except:
+ # Let's try w/o decoding Unicode
+ try:
+ if len(ntresponse) > 24:
+ # Extended Security - NTLMv2
+ ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(challenge), hexlify(ntresponse)[:32], hexlify(ntresponse)[32:]), 'hash_version':'ntlmv2'}
+ 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:
+ LOG.error("outputToJohnFormat: %s" % e)
+ pass
+
+ return ret_value
+
+def writeJohnOutputToFile(hash_string, hash_version, file_name):
+ fn_data = os.path.splitext(file_name)
+ if hash_version == "ntlmv2":
+ output_filename = fn_data[0] + "_ntlmv2" + fn_data[1]
+ else:
+ output_filename = fn_data[0] + "_ntlm" + fn_data[1]
+
+ with open(output_filename,"a") as f:
+ f.write(hash_string)
+ f.write('\n')
+
+
+def decodeSMBString( flags, text ):
+ if flags & smb.SMB.FLAGS2_UNICODE:
+ return text.decode('utf-16le')
+ else:
+ return text
+
+def encodeSMBString( flags, text ):
+ if flags & smb.SMB.FLAGS2_UNICODE:
+ return (text).encode('utf-16le')
+ else:
+ return text
+
+def getFileTime(t):
+ t *= 10000000
+ t += 116444736000000000
+ return t
+
+def getUnixTime(t):
+ t -= 116444736000000000
+ t /= 10000000
+ return t
+
+def getSMBDate(t):
+ # TODO: Fix this :P
+ d = datetime.date.fromtimestamp(t)
+ year = d.year - 1980
+ ret = (year << 8) + (d.month << 4) + d.day
+ return ret
+
+def getSMBTime(t):
+ # TODO: Fix this :P
+ d = datetime.datetime.fromtimestamp(t)
+ return (d.hour << 8) + (d.minute << 4) + d.second
+
+def getShares(connId, smbServer):
+ config = smbServer.getServerConfig()
+ sections = config.sections()
+ # Remove the global one
+ del(sections[sections.index('global')])
+ shares = {}
+ for i in sections:
+ shares[i] = dict(config.items(i))
+ return shares
+
+def searchShare(connId, share, smbServer):
+ config = smbServer.getServerConfig()
+ if config.has_section(share):
+ return dict(config.items(share))
+ else:
+ return None
+
+def openFile(path,fileName, accessMode, fileAttributes, openMode):
+ fileName = os.path.normpath(fileName.replace('\\','/'))
+ errorCode = 0
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ mode = 0
+ # Check the Open Mode
+ if openMode & 0x10:
+ # If the file does not exist, create it.
+ mode = os.O_CREAT
+ else:
+ # If file does not exist, return an error
+ if os.path.exists(pathName) is not True:
+ errorCode = STATUS_NO_SUCH_FILE
+ return 0,mode, pathName, errorCode
+
+ if os.path.isdir(pathName) and (fileAttributes & smb.ATTR_DIRECTORY) == 0:
+ # Request to open a normal file and this is actually a directory
+ errorCode = STATUS_FILE_IS_A_DIRECTORY
+ return 0, mode, pathName, errorCode
+ # Check the Access Mode
+ if accessMode & 0x7 == 1:
+ mode |= os.O_WRONLY
+ elif accessMode & 0x7 == 2:
+ mode |= os.O_RDWR
+ else:
+ mode = os.O_RDONLY
+
+ try:
+ if sys.platform == 'win32':
+ mode |= os.O_BINARY
+ fid = os.open(pathName, mode)
+ except Exception, e:
+ LOG.error("openFile: %s,%s" % (pathName, mode) ,e)
+ fid = 0
+ errorCode = STATUS_ACCESS_DENIED
+
+ return fid, mode, pathName, errorCode
+
+def queryFsInformation(path, filename, level=0):
+
+ if isinstance(filename,unicode):
+ encoding = 'utf-16le'
+ flags = smb.SMB.FLAGS2_UNICODE
+ else:
+ encoding = 'ascii'
+ flags = 0
+
+ fileName = os.path.normpath(filename.replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ fileSize = os.path.getsize(pathName)
+ (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
+ if level == smb.SMB_QUERY_FS_ATTRIBUTE_INFO or level == smb2.SMB2_FILESYSTEM_ATTRIBUTE_INFO:
+ data = smb.SMBQueryFsAttributeInfo()
+ data['FileSystemAttributes'] = smb.FILE_CASE_SENSITIVE_SEARCH | smb.FILE_CASE_PRESERVED_NAMES
+ data['MaxFilenNameLengthInBytes'] = 255
+ data['LengthOfFileSystemName'] = len('XTFS')*2
+ data['FileSystemName'] = 'XTFS'.encode('utf-16le')
+ return data.getData()
+ elif level == smb.SMB_INFO_VOLUME:
+ data = smb.SMBQueryFsInfoVolume( flags = flags )
+ data['VolumeLabel'] = 'SHARE'.encode(encoding)
+ return data.getData()
+ elif level == smb.SMB_QUERY_FS_VOLUME_INFO or level == smb2.SMB2_FILESYSTEM_VOLUME_INFO:
+ data = smb.SMBQueryFsVolumeInfo()
+ data['VolumeLabel'] = ''
+ data['VolumeCreationTime'] = getFileTime(ctime)
+ return data.getData()
+ elif level == smb.SMB_QUERY_FS_SIZE_INFO:
+ data = smb.SMBQueryFsSizeInfo()
+ return data.getData()
+ elif level == smb.FILE_FS_FULL_SIZE_INFORMATION:
+ data = smb.SMBFileFsFullSizeInformation()
+ return data.getData()
+ elif level == smb.FILE_FS_SIZE_INFORMATION:
+ data = smb.FileFsSizeInformation()
+ return data.getData()
+ else:
+ lastWriteTime = mtime
+ attribs = 0
+ if os.path.isdir(pathName):
+ attribs |= smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ if os.path.isfile(pathName):
+ attribs |= smb.SMB_FILE_ATTRIBUTE_NORMAL
+ fileAttributes = attribs
+ return fileSize, lastWriteTime, fileAttributes
+
+def findFirst2(path, fileName, level, searchAttributes, isSMB2 = False):
+ # TODO: Depending on the level, this could be done much simpler
+
+ #print "FindFirs2 path:%s, filename:%s" % (path, fileName)
+ fileName = os.path.normpath(fileName.replace('\\','/'))
+ # Let's choose the right encoding depending on the request
+ if isinstance(fileName,unicode):
+ encoding = 'utf-16le'
+ flags = smb.SMB.FLAGS2_UNICODE
+ else:
+ encoding = 'ascii'
+ flags = 0
+
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+
+ pathName = os.path.join(path,fileName)
+ files = []
+
+ if pathName.find('*') == -1 and pathName.find('?') == -1:
+ # No search patterns
+ pattern = ''
+ else:
+ pattern = os.path.basename(pathName)
+ dirName = os.path.dirname(pathName)
+
+ # Always add . and .. Not that important for Windows, but Samba whines if
+ # not present (for * search only)
+ if pattern == '*':
+ files.append(os.path.join(dirName,'.'))
+ files.append(os.path.join(dirName,'..'))
+
+ if pattern != '':
+ for file in os.listdir(dirName):
+ if fnmatch.fnmatch(file.lower(),pattern.lower()):
+ entry = os.path.join(dirName, file)
+ if os.path.isdir(entry):
+ if searchAttributes & smb.ATTR_DIRECTORY:
+ files.append(entry)
+ else:
+ files.append(entry)
+ else:
+ if os.path.exists(pathName):
+ files.append(pathName)
+
+ searchResult = []
+ searchCount = len(files)
+ errorCode = STATUS_SUCCESS
+
+ for i in files:
+ if level == smb.SMB_FIND_FILE_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_BOTH_DIRECTORY_INFO:
+ item = smb.SMBFindFileBothDirectoryInfo( flags = flags )
+ elif level == smb.SMB_FIND_FILE_DIRECTORY_INFO or level == smb2.SMB2_FILE_DIRECTORY_INFO:
+ item = smb.SMBFindFileDirectoryInfo( flags = flags )
+ elif level == smb.SMB_FIND_FILE_FULL_DIRECTORY_INFO or level == smb2.SMB2_FULL_DIRECTORY_INFO:
+ item = smb.SMBFindFileFullDirectoryInfo( flags = flags )
+ elif level == smb.SMB_FIND_INFO_STANDARD:
+ item = smb.SMBFindInfoStandard( flags = flags )
+ elif level == smb.SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_FULL_DIRECTORY_INFO:
+ item = smb.SMBFindFileIdFullDirectoryInfo( flags = flags )
+ elif level == smb.SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_BOTH_DIRECTORY_INFO:
+ item = smb.SMBFindFileIdBothDirectoryInfo( flags = flags )
+ elif level == smb.SMB_FIND_FILE_NAMES_INFO or level == smb2.SMB2_FILE_NAMES_INFO:
+ item = smb.SMBFindFileNamesInfo( flags = flags )
+ else:
+ LOG.error("Wrong level %d!" % level)
+ return searchResult, searchCount, STATUS_NOT_SUPPORTED
+
+ (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(i)
+ if os.path.isdir(i):
+ item['ExtFileAttributes'] = smb.ATTR_DIRECTORY
+ else:
+ item['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
+
+ item['FileName'] = os.path.basename(i).encode(encoding)
+
+ if level == smb.SMB_FIND_FILE_BOTH_DIRECTORY_INFO or level == smb.SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_BOTH_DIRECTORY_INFO:
+ item['EaSize'] = 0
+ item['EndOfFile'] = size
+ item['AllocationSize'] = size
+ item['CreationTime'] = getFileTime(ctime)
+ item['LastAccessTime'] = getFileTime(atime)
+ item['LastWriteTime'] = getFileTime(mtime)
+ item['LastChangeTime'] = getFileTime(mtime)
+ item['ShortName'] = '\x00'*24
+ item['FileName'] = os.path.basename(i).encode(encoding)
+ padLen = (8-(len(item) % 8)) % 8
+ item['NextEntryOffset'] = len(item) + padLen
+ elif level == smb.SMB_FIND_FILE_DIRECTORY_INFO:
+ item['EndOfFile'] = size
+ item['AllocationSize'] = size
+ item['CreationTime'] = getFileTime(ctime)
+ item['LastAccessTime'] = getFileTime(atime)
+ item['LastWriteTime'] = getFileTime(mtime)
+ item['LastChangeTime'] = getFileTime(mtime)
+ item['FileName'] = os.path.basename(i).encode(encoding)
+ padLen = (8-(len(item) % 8)) % 8
+ item['NextEntryOffset'] = len(item) + padLen
+ elif level == smb.SMB_FIND_FILE_FULL_DIRECTORY_INFO or level == smb.SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO or level == smb2.SMB2_FULL_DIRECTORY_INFO:
+ item['EaSize'] = 0
+ item['EndOfFile'] = size
+ item['AllocationSize'] = size
+ item['CreationTime'] = getFileTime(ctime)
+ item['LastAccessTime'] = getFileTime(atime)
+ item['LastWriteTime'] = getFileTime(mtime)
+ item['LastChangeTime'] = getFileTime(mtime)
+ padLen = (8-(len(item) % 8)) % 8
+ item['NextEntryOffset'] = len(item) + padLen
+ elif level == smb.SMB_FIND_INFO_STANDARD:
+ item['EaSize'] = size
+ item['CreationDate'] = getSMBDate(ctime)
+ item['CreationTime'] = getSMBTime(ctime)
+ item['LastAccessDate'] = getSMBDate(atime)
+ item['LastAccessTime'] = getSMBTime(atime)
+ item['LastWriteDate'] = getSMBDate(mtime)
+ item['LastWriteTime'] = getSMBTime(mtime)
+ searchResult.append(item)
+
+ # No more files
+ if (level >= smb.SMB_FIND_FILE_DIRECTORY_INFO or isSMB2 == True) and searchCount > 0:
+ searchResult[-1]['NextEntryOffset'] = 0
+
+ return searchResult, searchCount, errorCode
+
+def queryFileInformation(path, filename, level):
+ #print "queryFileInfo path: %s, filename: %s, level:0x%x" % (path,filename,level)
+ return queryPathInformation(path,filename, level)
+
+def queryPathInformation(path, filename, level):
+ # TODO: Depending on the level, this could be done much simpler
+ #print "queryPathInfo path: %s, filename: %s, level:0x%x" % (path,filename,level)
+ try:
+ errorCode = 0
+ fileName = os.path.normpath(filename.replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\') and path != '':
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ if os.path.exists(pathName):
+ (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
+ if level == smb.SMB_QUERY_FILE_BASIC_INFO:
+ infoRecord = smb.SMBQueryFileBasicInfo()
+ infoRecord['CreationTime'] = getFileTime(ctime)
+ infoRecord['LastAccessTime'] = getFileTime(atime)
+ infoRecord['LastWriteTime'] = getFileTime(mtime)
+ infoRecord['LastChangeTime'] = getFileTime(mtime)
+ if os.path.isdir(pathName):
+ infoRecord['ExtFileAttributes'] = smb.ATTR_DIRECTORY
+ else:
+ infoRecord['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
+ elif level == smb.SMB_QUERY_FILE_STANDARD_INFO:
+ infoRecord = smb.SMBQueryFileStandardInfo()
+ infoRecord['AllocationSize'] = size
+ infoRecord['EndOfFile'] = size
+ if os.path.isdir(pathName):
+ infoRecord['Directory'] = 1
+ else:
+ infoRecord['Directory'] = 0
+ elif level == smb.SMB_QUERY_FILE_ALL_INFO or level == smb2.SMB2_FILE_ALL_INFO:
+ infoRecord = smb.SMBQueryFileAllInfo()
+ infoRecord['CreationTime'] = getFileTime(ctime)
+ infoRecord['LastAccessTime'] = getFileTime(atime)
+ infoRecord['LastWriteTime'] = getFileTime(mtime)
+ infoRecord['LastChangeTime'] = getFileTime(mtime)
+ if os.path.isdir(pathName):
+ infoRecord['ExtFileAttributes'] = smb.ATTR_DIRECTORY
+ else:
+ infoRecord['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
+ infoRecord['AllocationSize'] = size
+ infoRecord['EndOfFile'] = size
+ if os.path.isdir(pathName):
+ infoRecord['Directory'] = 1
+ else:
+ infoRecord['Directory'] = 0
+ infoRecord['FileName'] = filename.encode('utf-16le')
+ elif level == smb2.SMB2_FILE_NETWORK_OPEN_INFO:
+ infoRecord = smb.SMBFileNetworkOpenInfo()
+ infoRecord['CreationTime'] = getFileTime(ctime)
+ infoRecord['LastAccessTime'] = getFileTime(atime)
+ infoRecord['LastWriteTime'] = getFileTime(mtime)
+ infoRecord['ChangeTime'] = getFileTime(mtime)
+ infoRecord['AllocationSize'] = size
+ infoRecord['EndOfFile'] = size
+ if os.path.isdir(pathName):
+ infoRecord['FileAttributes'] = smb.ATTR_DIRECTORY
+ else:
+ infoRecord['FileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
+ elif level == smb.SMB_QUERY_FILE_EA_INFO or level == smb2.SMB2_FILE_EA_INFO:
+ infoRecord = smb.SMBQueryFileEaInfo()
+ elif level == smb2.SMB2_FILE_STREAM_INFO:
+ infoRecord = smb.SMBFileStreamInformation()
+ else:
+ LOG.error('Unknown level for query path info! 0x%x' % level)
+ # UNSUPPORTED
+ return None, STATUS_NOT_SUPPORTED
+
+ return infoRecord, errorCode
+ else:
+ # NOT FOUND
+ return None, STATUS_OBJECT_NAME_NOT_FOUND
+ except Exception, e:
+ LOG.error('queryPathInfo: %s' % e)
+ raise
+
+def queryDiskInformation(path):
+# TODO: Do something useful here :)
+# For now we just return fake values
+ totalUnits = 65535
+ freeUnits = 65535
+ return totalUnits, freeUnits
+
+# Here we implement the NT transaction handlers
+class NTTRANSCommands:
+ def default(self, connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ pass
+
+# Here we implement the NT transaction handlers
+class TRANSCommands:
+ @staticmethod
+ def lanMan(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ # Minimal [MS-RAP] implementation, just to return the shares
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_SUCCESS
+ if struct.unpack('<H',parameters[:2])[0] == 0:
+ # NetShareEnum Request
+ netShareEnum = smb.SMBNetShareEnum(parameters)
+ if netShareEnum['InfoLevel'] == 1:
+ shares = getShares(connId, smbServer)
+ respParameters = smb.SMBNetShareEnumResponse()
+ respParameters['EntriesReturned'] = len(shares)
+ respParameters['EntriesAvailable'] = len(shares)
+ tailData = ''
+ for i in shares:
+ # NetShareInfo1 len == 20
+ entry = smb.NetShareInfo1()
+ entry['NetworkName'] = i + '\x00'*(13-len(i))
+ entry['Type'] = int(shares[i]['share type'])
+ # (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'):
+ tailData += shares[i]['comment'] + '\x00'
+ else:
+ tailData += '\x00'
+ respData += tailData
+ else:
+ # We don't support other info levels
+ errorCode = STATUS_NOT_SUPPORTED
+ elif struct.unpack('<H',parameters[:2])[0] == 13:
+ # NetrServerGetInfo Request
+ respParameters = smb.SMBNetServerGetInfoResponse()
+ netServerInfo = smb.SMBNetServerInfo1()
+ netServerInfo['ServerName'] = smbServer.getServerName()
+ respData = str(netServerInfo)
+ respParameters['TotalBytesAvailable'] = len(respData)
+ elif struct.unpack('<H',parameters[:2])[0] == 1:
+ # NetrShareGetInfo Request
+ request = smb.SMBNetShareGetInfo(parameters)
+ respParameters = smb.SMBNetShareGetInfoResponse()
+ shares = getShares(connId, smbServer)
+ share = shares[request['ShareName'].upper()]
+ shareInfo = smb.NetShareInfo1()
+ shareInfo['NetworkName'] = request['ShareName'].upper() + '\x00'
+ shareInfo['Type'] = int(share['share type'])
+ respData = shareInfo.getData()
+ if share.has_key('comment'):
+ shareInfo['RemarkOffsetLow'] = len(respData)
+ respData += share['comment'] + '\x00'
+ respParameters['TotalBytesAvailable'] = len(respData)
+
+ else:
+ # We don't know how to handle anything else
+ errorCode = STATUS_NOT_SUPPORTED
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+ @staticmethod
+ def transactNamedPipe(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_SUCCESS
+ SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
+ transParameters= smb.SMBTransaction_Parameters(SMBCommand['Parameters'])
+
+ # Extract the FID
+ fid = struct.unpack('<H', transParameters['Setup'][2:])[0]
+
+ if connData['OpenedFiles'].has_key(fid):
+ fileHandle = connData['OpenedFiles'][fid]['FileHandle']
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ os.write(fileHandle,data)
+ respData = os.read(fileHandle,data)
+ else:
+ sock = connData['OpenedFiles'][fid]['Socket']
+ sock.send(data)
+ respData = sock.recv(maxDataCount)
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+# Here we implement the transaction2 handlers
+class TRANS2Commands:
+ # All these commands return setup, parameters, data, errorCode
+ @staticmethod
+ def setPathInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_SUCCESS
+ setPathInfoParameters = smb.SMBSetPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ fileName = decodeSMBString(recvPacket['Flags2'], setPathInfoParameters['FileName'])
+ fileName = os.path.normpath(fileName.replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\') and path != '':
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ if os.path.exists(pathName):
+ informationLevel = setPathInfoParameters['InformationLevel']
+ if informationLevel == smb.SMB_SET_FILE_BASIC_INFO:
+ infoRecord = smb.SMBSetFileBasicInfo(data)
+ # Creation time won't be set, the other ones we play with.
+ atime = infoRecord['LastAccessTime']
+ if atime == 0:
+ atime = -1
+ else:
+ atime = getUnixTime(atime)
+ mtime = infoRecord['LastWriteTime']
+ if mtime == 0:
+ mtime = -1
+ else:
+ mtime = getUnixTime(mtime)
+ if mtime != -1 or atime != -1:
+ os.utime(pathName,(atime,mtime))
+ else:
+ smbServer.log('Unknown level for set path info! 0x%x' % setPathInfoParameters['InformationLevel'], logging.ERROR)
+ # UNSUPPORTED
+ errorCode = STATUS_NOT_SUPPORTED
+ else:
+ errorCode = STATUS_OBJECT_NAME_NOT_FOUND
+
+ if errorCode == STATUS_SUCCESS:
+ respParameters = smb.SMBSetPathInformationResponse_Parameters()
+
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+
+ @staticmethod
+ def setFileInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_SUCCESS
+ setFileInfoParameters = smb.SMBSetFileInformation_Parameters(parameters)
+
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ if connData['OpenedFiles'].has_key(setFileInfoParameters['FID']):
+ fileName = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileName']
+ informationLevel = setFileInfoParameters['InformationLevel']
+ if informationLevel == smb.SMB_SET_FILE_DISPOSITION_INFO:
+ infoRecord = smb.SMBSetFileDispositionInfo(parameters)
+ if infoRecord['DeletePending'] > 0:
+ # Mark this file for removal after closed
+ connData['OpenedFiles'][setFileInfoParameters['FID']]['DeleteOnClose'] = True
+ respParameters = smb.SMBSetFileInformationResponse_Parameters()
+ elif informationLevel == smb.SMB_SET_FILE_BASIC_INFO:
+ infoRecord = smb.SMBSetFileBasicInfo(data)
+ # Creation time won't be set, the other ones we play with.
+ atime = infoRecord['LastAccessTime']
+ if atime == 0:
+ atime = -1
+ else:
+ atime = getUnixTime(atime)
+ mtime = infoRecord['LastWriteTime']
+ if mtime == 0:
+ mtime = -1
+ else:
+ mtime = getUnixTime(mtime)
+ os.utime(fileName,(atime,mtime))
+ elif informationLevel == smb.SMB_SET_FILE_END_OF_FILE_INFO:
+ fileHandle = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileHandle']
+ infoRecord = smb.SMBSetFileEndOfFileInfo(data)
+ if infoRecord['EndOfFile'] > 0:
+ os.lseek(fileHandle, infoRecord['EndOfFile']-1, 0)
+ os.write(fileHandle, '\x00')
+ else:
+ smbServer.log('Unknown level for set file info! 0x%x' % setFileInfoParameters['InformationLevel'], logging.ERROR)
+ # UNSUPPORTED
+ errorCode = STATUS_NOT_SUPPORTED
+ else:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ if errorCode == STATUS_SUCCESS:
+ respParameters = smb.SMBSetFileInformationResponse_Parameters()
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+ @staticmethod
+ def queryFileInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+
+ queryFileInfoParameters = smb.SMBQueryFileInformation_Parameters(parameters)
+
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ if connData['OpenedFiles'].has_key(queryFileInfoParameters['FID']):
+ fileName = connData['OpenedFiles'][queryFileInfoParameters['FID']]['FileName']
+
+ infoRecord, errorCode = queryFileInformation('', fileName, queryFileInfoParameters['InformationLevel'])
+
+ if infoRecord is not None:
+ respParameters = smb.SMBQueryFileInformationResponse_Parameters()
+ respData = infoRecord
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+ @staticmethod
+ def queryPathInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = 0
+
+ queryPathInfoParameters = smb.SMBQueryPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
+
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ try:
+ infoRecord, errorCode = queryPathInformation(path, decodeSMBString(recvPacket['Flags2'], queryPathInfoParameters['FileName']), queryPathInfoParameters['InformationLevel'])
+ except Exception, e:
+ smbServer.log("queryPathInformation: %s" % e,logging.ERROR)
+
+ if infoRecord is not None:
+ respParameters = smb.SMBQueryPathInformationResponse_Parameters()
+ respData = infoRecord
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+ @staticmethod
+ def queryFsInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
+ connData = smbServer.getConnectionData(connId)
+ errorCode = 0
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ data = queryFsInformation(connData['ConnectedShares'][recvPacket['Tid']]['path'], '', struct.unpack('<H',parameters)[0])
+
+ smbServer.setConnectionData(connId, connData)
+
+ return '','', data, errorCode
+
+ @staticmethod
+ def findNext2(connId, smbServer, recvPacket, parameters, data, maxDataCount):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_SUCCESS
+ 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):
+ searchResult = connData['SIDs'][sid]
+ respParameters = smb.SMBFindNext2Response_Parameters()
+ endOfSearch = 1
+ searchCount = 1
+ totalData = 0
+ for i in enumerate(searchResult):
+ data = i[1].getData()
+ lenData = len(data)
+ if (totalData+lenData) >= maxDataCount or (i[0]+1) >= findNext2Parameters['SearchCount']:
+ # We gotta stop here and continue on a find_next2
+ endOfSearch = 0
+ connData['SIDs'][sid] = searchResult[i[0]:]
+ respParameters['LastNameOffset'] = totalData
+ break
+ else:
+ searchCount +=1
+ respData += data
+ totalData += lenData
+
+ # Have we reached the end of the search or still stuff to send?
+ if endOfSearch > 0:
+ # Let's remove the SID from our ConnData
+ del(connData['SIDs'][sid])
+
+ respParameters['EndOfSearch'] = endOfSearch
+ respParameters['SearchCount'] = searchCount
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+ @staticmethod
+ def findFirst2(connId, smbServer, recvPacket, parameters, data, maxDataCount):
+ connData = smbServer.getConnectionData(connId)
+
+ respSetup = ''
+ respParameters = ''
+ respData = ''
+ findFirst2Parameters = smb.SMBFindFirst2_Parameters( recvPacket['Flags2'], data = parameters)
+
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+
+ searchResult, searchCount, errorCode = findFirst2(path,
+ decodeSMBString( recvPacket['Flags2'], findFirst2Parameters['FileName'] ),
+ findFirst2Parameters['InformationLevel'],
+ findFirst2Parameters['SearchAttributes'] )
+
+ respParameters = smb.SMBFindFirst2Response_Parameters()
+ endOfSearch = 1
+ sid = 0x80 # default SID
+ searchCount = 0
+ totalData = 0
+ for i in enumerate(searchResult):
+ #i[1].dump()
+ data = i[1].getData()
+ lenData = len(data)
+ if (totalData+lenData) >= maxDataCount or (i[0]+1) > findFirst2Parameters['SearchCount']:
+ # We gotta stop here and continue on a find_next2
+ endOfSearch = 0
+ # Simple way to generate a fid
+ if len(connData['SIDs']) == 0:
+ sid = 1
+ else:
+ sid = connData['SIDs'].keys()[-1] + 1
+ # Store the remaining search results in the ConnData SID
+ connData['SIDs'][sid] = searchResult[i[0]:]
+ respParameters['LastNameOffset'] = totalData
+ break
+ else:
+ searchCount +=1
+ respData += data
+
+ padLen = (8-(lenData % 8)) %8
+ respData += '\xaa'*padLen
+ totalData += lenData + padLen
+
+ respParameters['SID'] = sid
+ respParameters['EndOfSearch'] = endOfSearch
+ respParameters['SearchCount'] = searchCount
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ smbServer.setConnectionData(connId, connData)
+
+ return respSetup, respParameters, respData, errorCode
+
+# Here we implement the commands handlers
+class SMBCommands:
+
+ @staticmethod
+ def smbTransaction(connId, smbServer, SMBCommand, recvPacket, transCommands):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+
+ transParameters= smb.SMBTransaction_Parameters(SMBCommand['Parameters'])
+
+ # Do the stuff
+ if transParameters['ParameterCount'] != transParameters['TotalParameterCount']:
+ # TODO: Handle partial parameters
+ raise Exception("Unsupported partial parameters in TRANSACT2!")
+ else:
+ transData = smb.SMBTransaction_SData(flags = recvPacket['Flags2'])
+ # Standard says servers shouldn't trust Parameters and Data comes
+ # in order, so we have to parse the offsets, ugly
+
+ paramCount = transParameters['ParameterCount']
+ transData['Trans_ParametersLength'] = paramCount
+ dataCount = transParameters['DataCount']
+ transData['Trans_DataLength'] = dataCount
+ transData.fromString(SMBCommand['Data'])
+ if transParameters['ParameterOffset'] > 0:
+ paramOffset = transParameters['ParameterOffset'] - 63 - transParameters['SetupLength']
+ transData['Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
+ else:
+ transData['Trans_Parameters'] = ''
+
+ if transParameters['DataOffset'] > 0:
+ dataOffset = transParameters['DataOffset'] - 63 - transParameters['SetupLength']
+ transData['Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
+ else:
+ transData['Trans_Data'] = ''
+
+ # Call the handler for this TRANSACTION
+ if transParameters['SetupCount'] == 0:
+ # No subcommand, let's play with the Name
+ command = decodeSMBString(recvPacket['Flags2'],transData['Name'])
+ else:
+ command = struct.unpack('<H', transParameters['Setup'][:2])[0]
+
+ if transCommands.has_key(command):
+ # Call the TRANS subcommand
+ setup = ''
+ parameters = ''
+ data = ''
+ try:
+ setup, parameters, data, errorCode = transCommands[command](connId,
+ smbServer,
+ recvPacket,
+ transData['Trans_Parameters'],
+ transData['Trans_Data'],
+ transParameters['MaxDataCount'])
+ except Exception, e:
+ #print 'Transaction: %s' % e,e
+ smbServer.log('Transaction: (%r,%s)' % (command, e), logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ #raise
+
+ if setup == '' and parameters == '' and data == '':
+ # Something wen't wrong
+ respParameters = ''
+ respData = ''
+ else:
+ # Build the answer
+ data = str(data)
+ remainingData = len(data)
+ parameters = str(parameters)
+ remainingParameters = len(parameters)
+ commands = []
+ dataDisplacement = 0
+ while remainingData > 0 or remainingParameters > 0:
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+ respParameters = smb.SMBTransactionResponse_Parameters()
+ respData = smb.SMBTransaction2Response_Data()
+
+ respParameters['TotalParameterCount'] = len(parameters)
+ respParameters['ParameterCount'] = len(parameters)
+ respData['Trans_ParametersLength'] = len(parameters)
+ respParameters['TotalDataCount'] = len(data)
+ respParameters['DataDisplacement'] = dataDisplacement
+
+ # TODO: Do the same for parameters
+ if len(data) > transParameters['MaxDataCount']:
+ # Answer doesn't fit in this packet
+ LOG.debug("Lowering answer from %d to %d" % (len(data),transParameters['MaxDataCount']) )
+ respParameters['DataCount'] = transParameters['MaxDataCount']
+ else:
+ respParameters['DataCount'] = len(data)
+
+ respData['Trans_DataLength'] = respParameters['DataCount']
+ respParameters['SetupCount'] = len(setup)
+ respParameters['Setup'] = setup
+ # TODO: Make sure we're calculating the pad right
+ if len(parameters) > 0:
+ #padLen = 4 - (55 + len(setup)) % 4
+ padLen = (4 - (55 + len(setup)) % 4 ) % 4
+ padBytes = '\xFF' * padLen
+ respData['Pad1'] = padBytes
+ respParameters['ParameterOffset'] = 55 + len(setup) + padLen
+ else:
+ padLen = 0
+ respParameters['ParameterOffset'] = 0
+ respData['Pad1'] = ''
+
+ if len(data) > 0:
+ #pad2Len = 4 - (55 + len(setup) + padLen + len(parameters)) % 4
+ pad2Len = (4 - (55 + len(setup) + padLen + len(parameters)) % 4) % 4
+ respData['Pad2'] = '\xFF' * pad2Len
+ respParameters['DataOffset'] = 55 + len(setup) + padLen + len(parameters) + pad2Len
+ else:
+ respParameters['DataOffset'] = 0
+ respData['Pad2'] = ''
+
+ respData['Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
+ respData['Trans_Data'] = data[:respParameters['DataCount']]
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ data = data[respParameters['DataCount']:]
+ remainingData -= respParameters['DataCount']
+ dataDisplacement += respParameters['DataCount'] + 1
+
+ parameters = parameters[respParameters['ParameterCount']:]
+ remainingParameters -= respParameters['ParameterCount']
+ commands.append(respSMBCommand)
+
+ smbServer.setConnectionData(connId, connData)
+ return commands, None, errorCode
+
+ else:
+ smbServer.log("Unsupported Transact command %r" % command, logging.ERROR)
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_NOT_IMPLEMENTED
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbNTTransact(connId, smbServer, SMBCommand, recvPacket, transCommands):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+
+ NTTransParameters= smb.SMBNTTransaction_Parameters(SMBCommand['Parameters'])
+ # Do the stuff
+ if NTTransParameters['ParameterCount'] != NTTransParameters['TotalParameterCount']:
+ # TODO: Handle partial parameters
+ raise Exception("Unsupported partial parameters in NTTrans!")
+ else:
+ NTTransData = smb.SMBNTTransaction_Data()
+ # Standard says servers shouldn't trust Parameters and Data comes
+ # in order, so we have to parse the offsets, ugly
+
+ paramCount = NTTransParameters['ParameterCount']
+ NTTransData['NT_Trans_ParametersLength'] = paramCount
+ dataCount = NTTransParameters['DataCount']
+ NTTransData['NT_Trans_DataLength'] = dataCount
+
+ if NTTransParameters['ParameterOffset'] > 0:
+ paramOffset = NTTransParameters['ParameterOffset'] - 73 - NTTransParameters['SetupLength']
+ NTTransData['NT_Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
+ else:
+ NTTransData['NT_Trans_Parameters'] = ''
+
+ if NTTransParameters['DataOffset'] > 0:
+ dataOffset = NTTransParameters['DataOffset'] - 73 - NTTransParameters['SetupLength']
+ NTTransData['NT_Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
+ else:
+ NTTransData['NT_Trans_Data'] = ''
+
+ # Call the handler for this TRANSACTION
+ command = NTTransParameters['Function']
+ if transCommands.has_key(command):
+ # Call the NT TRANS subcommand
+ setup = ''
+ parameters = ''
+ data = ''
+ try:
+ setup, parameters, data, errorCode = transCommands[command](connId,
+ smbServer,
+ recvPacket,
+ NTTransData['NT_Trans_Parameters'],
+ NTTransData['NT_Trans_Data'],
+ NTTransParameters['MaxDataCount'])
+ except Exception, e:
+ smbServer.log('NTTransaction: (0x%x,%s)' % (command, e), logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ #raise
+
+ if setup == '' and parameters == '' and data == '':
+ # Something wen't wrong
+ respParameters = ''
+ respData = ''
+ if errorCode == STATUS_SUCCESS:
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ # Build the answer
+ data = str(data)
+ remainingData = len(data)
+ parameters = str(parameters)
+ remainingParameters = len(parameters)
+ commands = []
+ dataDisplacement = 0
+ while remainingData > 0 or remainingParameters > 0:
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+ respParameters = smb.SMBNTTransactionResponse_Parameters()
+ respData = smb.SMBNTTransactionResponse_Data()
+
+ respParameters['TotalParameterCount'] = len(parameters)
+ respParameters['ParameterCount'] = len(parameters)
+ respData['Trans_ParametersLength'] = len(parameters)
+ respParameters['TotalDataCount'] = len(data)
+ respParameters['DataDisplacement'] = dataDisplacement
+ # TODO: Do the same for parameters
+ if len(data) > NTTransParameters['MaxDataCount']:
+ # Answer doesn't fit in this packet
+ LOG.debug("Lowering answer from %d to %d" % (len(data),NTTransParameters['MaxDataCount']) )
+ respParameters['DataCount'] = NTTransParameters['MaxDataCount']
+ else:
+ respParameters['DataCount'] = len(data)
+
+ respData['NT_Trans_DataLength'] = respParameters['DataCount']
+ respParameters['SetupCount'] = len(setup)
+ respParameters['Setup'] = setup
+ # TODO: Make sure we're calculating the pad right
+ if len(parameters) > 0:
+ #padLen = 4 - (71 + len(setup)) % 4
+ padLen = (4 - (73 + len(setup)) % 4 ) % 4
+ padBytes = '\xFF' * padLen
+ respData['Pad1'] = padBytes
+ respParameters['ParameterOffset'] = 73 + len(setup) + padLen
+ else:
+ padLen = 0
+ respParameters['ParameterOffset'] = 0
+ respData['Pad1'] = ''
+
+ if len(data) > 0:
+ #pad2Len = 4 - (71 + len(setup) + padLen + len(parameters)) % 4
+ pad2Len = (4 - (73 + len(setup) + padLen + len(parameters)) % 4) % 4
+ respData['Pad2'] = '\xFF' * pad2Len
+ respParameters['DataOffset'] = 73 + len(setup) + padLen + len(parameters) + pad2Len
+ else:
+ respParameters['DataOffset'] = 0
+ respData['Pad2'] = ''
+
+ respData['NT_Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
+ respData['NT_Trans_Data'] = data[:respParameters['DataCount']]
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ data = data[respParameters['DataCount']:]
+ remainingData -= respParameters['DataCount']
+ dataDisplacement += respParameters['DataCount'] + 1
+
+ parameters = parameters[respParameters['ParameterCount']:]
+ remainingParameters -= respParameters['ParameterCount']
+ commands.append(respSMBCommand)
+
+ smbServer.setConnectionData(connId, connData)
+ return commands, None, errorCode
+
+ else:
+ #smbServer.log("Unsupported NTTransact command 0x%x" % command, logging.ERROR)
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_NOT_IMPLEMENTED
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbTransaction2(connId, smbServer, SMBCommand, recvPacket, transCommands):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+
+ trans2Parameters= smb.SMBTransaction2_Parameters(SMBCommand['Parameters'])
+
+ # Do the stuff
+ if trans2Parameters['ParameterCount'] != trans2Parameters['TotalParameterCount']:
+ # TODO: Handle partial parameters
+ #print "Unsupported partial parameters in TRANSACT2!"
+ raise Exception("Unsupported partial parameters in TRANSACT2!")
+ else:
+ trans2Data = smb.SMBTransaction2_Data()
+ # Standard says servers shouldn't trust Parameters and Data comes
+ # in order, so we have to parse the offsets, ugly
+
+ paramCount = trans2Parameters['ParameterCount']
+ trans2Data['Trans_ParametersLength'] = paramCount
+ dataCount = trans2Parameters['DataCount']
+ trans2Data['Trans_DataLength'] = dataCount
+
+ if trans2Parameters['ParameterOffset'] > 0:
+ paramOffset = trans2Parameters['ParameterOffset'] - 63 - trans2Parameters['SetupLength']
+ trans2Data['Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
+ else:
+ trans2Data['Trans_Parameters'] = ''
+
+ if trans2Parameters['DataOffset'] > 0:
+ dataOffset = trans2Parameters['DataOffset'] - 63 - trans2Parameters['SetupLength']
+ trans2Data['Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
+ else:
+ trans2Data['Trans_Data'] = ''
+
+ # Call the handler for this TRANSACTION
+ command = struct.unpack('<H', trans2Parameters['Setup'])[0]
+ if transCommands.has_key(command):
+ # Call the TRANS2 subcommand
+ try:
+ setup, parameters, data, errorCode = transCommands[command](connId,
+ smbServer,
+ recvPacket,
+ trans2Data['Trans_Parameters'],
+ trans2Data['Trans_Data'],
+ trans2Parameters['MaxDataCount'])
+ except Exception, e:
+ smbServer.log('Transaction2: (0x%x,%s)' % (command, e), logging.ERROR)
+ #import traceback
+ #traceback.print_exc()
+ raise
+
+ if setup == '' and parameters == '' and data == '':
+ # Something wen't wrong
+ respParameters = ''
+ respData = ''
+ else:
+ # Build the answer
+ data = str(data)
+ remainingData = len(data)
+ parameters = str(parameters)
+ remainingParameters = len(parameters)
+ commands = []
+ dataDisplacement = 0
+ while remainingData > 0 or remainingParameters > 0:
+ respSMBCommand = smb.SMBCommand(recvPacket['Command'])
+ respParameters = smb.SMBTransaction2Response_Parameters()
+ respData = smb.SMBTransaction2Response_Data()
+
+ respParameters['TotalParameterCount'] = len(parameters)
+ respParameters['ParameterCount'] = len(parameters)
+ respData['Trans_ParametersLength'] = len(parameters)
+ respParameters['TotalDataCount'] = len(data)
+ respParameters['DataDisplacement'] = dataDisplacement
+ # TODO: Do the same for parameters
+ if len(data) > trans2Parameters['MaxDataCount']:
+ # Answer doesn't fit in this packet
+ LOG.debug("Lowering answer from %d to %d" % (len(data),trans2Parameters['MaxDataCount']) )
+ respParameters['DataCount'] = trans2Parameters['MaxDataCount']
+ else:
+ respParameters['DataCount'] = len(data)
+
+ respData['Trans_DataLength'] = respParameters['DataCount']
+ respParameters['SetupCount'] = len(setup)
+ respParameters['Setup'] = setup
+ # TODO: Make sure we're calculating the pad right
+ if len(parameters) > 0:
+ #padLen = 4 - (55 + len(setup)) % 4
+ padLen = (4 - (55 + len(setup)) % 4 ) % 4
+ padBytes = '\xFF' * padLen
+ respData['Pad1'] = padBytes
+ respParameters['ParameterOffset'] = 55 + len(setup) + padLen
+ else:
+ padLen = 0
+ respParameters['ParameterOffset'] = 0
+ respData['Pad1'] = ''
+
+ if len(data) > 0:
+ #pad2Len = 4 - (55 + len(setup) + padLen + len(parameters)) % 4
+ pad2Len = (4 - (55 + len(setup) + padLen + len(parameters)) % 4) % 4
+ respData['Pad2'] = '\xFF' * pad2Len
+ respParameters['DataOffset'] = 55 + len(setup) + padLen + len(parameters) + pad2Len
+ else:
+ respParameters['DataOffset'] = 0
+ respData['Pad2'] = ''
+
+ respData['Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
+ respData['Trans_Data'] = data[:respParameters['DataCount']]
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ data = data[respParameters['DataCount']:]
+ remainingData -= respParameters['DataCount']
+ dataDisplacement += respParameters['DataCount'] + 1
+
+ parameters = parameters[respParameters['ParameterCount']:]
+ remainingParameters -= respParameters['ParameterCount']
+ commands.append(respSMBCommand)
+
+ smbServer.setConnectionData(connId, connData)
+ return commands, None, errorCode
+
+ else:
+ smbServer.log("Unsupported Transact/2 command 0x%x" % command, logging.ERROR)
+ respParameters = ''
+ respData = ''
+ errorCode = STATUS_NOT_IMPLEMENTED
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComLockingAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_LOCKING_ANDX)
+ respParameters = ''
+ respData = ''
+
+ # I'm actually doing nothing.. just make MacOS happy ;)
+ errorCode = STATUS_SUCCESS
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbComClose(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_CLOSE)
+ respParameters = ''
+ respData = ''
+
+ comClose = smb.SMBClose_Parameters(SMBCommand['Parameters'])
+
+ if connData['OpenedFiles'].has_key(comClose['FID']):
+ errorCode = STATUS_SUCCESS
+ fileHandle = connData['OpenedFiles'][comClose['FID']]['FileHandle']
+ try:
+ if fileHandle == PIPE_FILE_DESCRIPTOR:
+ connData['OpenedFiles'][comClose['FID']]['Socket'].close()
+ elif fileHandle != VOID_FILE_DESCRIPTOR:
+ os.close(fileHandle)
+ except Exception, e:
+ smbServer.log("comClose %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ # Check if the file was marked for removal
+ if connData['OpenedFiles'][comClose['FID']]['DeleteOnClose'] is True:
+ try:
+ os.remove(connData['OpenedFiles'][comClose['FID']]['FileName'])
+ except Exception, e:
+ smbServer.log("comClose %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ del(connData['OpenedFiles'][comClose['FID']])
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComWrite(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_WRITE)
+ respParameters = smb.SMBWriteResponse_Parameters()
+ respData = ''
+
+ comWriteParameters = smb.SMBWrite_Parameters(SMBCommand['Parameters'])
+ comWriteData = smb.SMBWrite_Data(SMBCommand['Data'])
+
+ if connData['OpenedFiles'].has_key(comWriteParameters['Fid']):
+ fileHandle = connData['OpenedFiles'][comWriteParameters['Fid']]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ # TODO: Handle big size files
+ # 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) >= comWriteParameters['Offset']:
+ os.lseek(fileHandle,comWriteParameters['Offset'],0)
+ os.write(fileHandle,comWriteData['Data'])
+ else:
+ sock = connData['OpenedFiles'][comWriteParameters['Fid']]['Socket']
+ sock.send(comWriteData['Data'])
+ respParameters['Count'] = comWriteParameters['Count']
+ except Exception, e:
+ smbServer.log('smbComWrite: %s' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComFlush(connId, smbServer, SMBCommand,recvPacket ):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_FLUSH)
+ respParameters = ''
+ respData = ''
+
+ comFlush = smb.SMBFlush_Parameters(SMBCommand['Parameters'])
+
+ if connData['OpenedFiles'].has_key(comFlush['FID']):
+ errorCode = STATUS_SUCCESS
+ fileHandle = connData['OpenedFiles'][comFlush['FID']]['FileHandle']
+ try:
+ os.fsync(fileHandle)
+ except Exception, e:
+ smbServer.log("comFlush %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbComCreateDirectory(connId, smbServer, SMBCommand,recvPacket ):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_CREATE_DIRECTORY)
+ respParameters = ''
+ respData = ''
+
+ comCreateDirectoryData= smb.SMBCreateDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ errorCode = STATUS_SUCCESS
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comCreateDirectoryData['DirectoryName']).replace('\\','/'))
+ if len(fileName) > 0:
+ if fileName[0] == '/' or fileName[0] == '\\':
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ if os.path.exists(pathName):
+ errorCode = STATUS_OBJECT_NAME_COLLISION
+
+ # TODO: More checks here in the future.. Specially when we support
+ # user access
+ else:
+ try:
+ os.mkdir(pathName)
+ except Exception, e:
+ smbServer.log("smbComCreateDirectory: %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComRename(connId, smbServer, SMBCommand, recvPacket ):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_RENAME)
+ respParameters = ''
+ respData = ''
+
+ comRenameData = smb.SMBRename_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ errorCode = STATUS_SUCCESS
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ oldFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['OldFileName']).replace('\\','/'))
+ newFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['NewFileName']).replace('\\','/'))
+ if len(oldFileName) > 0 and (oldFileName[0] == '/' or oldFileName[0] == '\\'):
+ # strip leading '/'
+ oldFileName = oldFileName[1:]
+ oldPathName = os.path.join(path,oldFileName)
+ if len(newFileName) > 0 and (newFileName[0] == '/' or newFileName[0] == '\\'):
+ # strip leading '/'
+ newFileName = newFileName[1:]
+ newPathName = os.path.join(path,newFileName)
+
+ if os.path.exists(oldPathName) is not True:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ # TODO: More checks here in the future.. Specially when we support
+ # user access
+ else:
+ try:
+ os.rename(oldPathName,newPathName)
+ except OSError, e:
+ smbServer.log("smbComRename: %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComDelete(connId, smbServer, SMBCommand, recvPacket ):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_DELETE)
+ respParameters = ''
+ respData = ''
+
+ comDeleteData = smb.SMBDelete_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ errorCode = STATUS_SUCCESS
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteData['FileName']).replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ if os.path.exists(pathName) is not True:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ # TODO: More checks here in the future.. Specially when we support
+ # user access
+ else:
+ try:
+ os.remove(pathName)
+ except OSError, e:
+ smbServer.log("smbComDelete: %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbComDeleteDirectory(connId, smbServer, SMBCommand, recvPacket ):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_DELETE_DIRECTORY)
+ respParameters = ''
+ respData = ''
+
+ comDeleteDirectoryData= smb.SMBDeleteDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ errorCode = STATUS_SUCCESS
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteDirectoryData['DirectoryName']).replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ if os.path.exists(pathName) is not True:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ # TODO: More checks here in the future.. Specially when we support
+ # user access
+ else:
+ try:
+ os.rmdir(pathName)
+ except OSError, e:
+ smbServer.log("smbComDeleteDirectory: %s" % e,logging.ERROR)
+ if e.errno == errno.ENOTEMPTY:
+ errorCode = STATUS_DIRECTORY_NOT_EMPTY
+ else:
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smbComWriteAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_WRITE_ANDX)
+ respParameters = smb.SMBWriteAndXResponse_Parameters()
+ respData = ''
+
+ if SMBCommand['WordCount'] == 0x0C:
+ writeAndX = smb.SMBWriteAndX_Parameters_Short(SMBCommand['Parameters'])
+ writeAndXData = smb.SMBWriteAndX_Data_Short()
+ else:
+ writeAndX = smb.SMBWriteAndX_Parameters(SMBCommand['Parameters'])
+ writeAndXData = smb.SMBWriteAndX_Data()
+ writeAndXData['DataLength'] = writeAndX['DataLength']
+ writeAndXData['DataOffset'] = writeAndX['DataOffset']
+ writeAndXData.fromString(SMBCommand['Data'])
+
+
+ if connData['OpenedFiles'].has_key(writeAndX['Fid']):
+ fileHandle = connData['OpenedFiles'][writeAndX['Fid']]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ offset = writeAndX['Offset']
+ if writeAndX.fields.has_key('HighOffset'):
+ 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:
+ os.lseek(fileHandle,offset,0)
+ os.write(fileHandle,writeAndXData['Data'])
+ else:
+ sock = connData['OpenedFiles'][writeAndX['Fid']]['Socket']
+ sock.send(writeAndXData['Data'])
+
+ respParameters['Count'] = writeAndX['DataLength']
+ respParameters['Available']= 0xff
+ except Exception, e:
+ smbServer.log('smbComWriteAndx: %s' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComRead(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_READ)
+ respParameters = smb.SMBReadResponse_Parameters()
+ respData = smb.SMBReadResponse_Data()
+
+ comReadParameters = smb.SMBRead_Parameters(SMBCommand['Parameters'])
+
+ if connData['OpenedFiles'].has_key(comReadParameters['Fid']):
+ fileHandle = connData['OpenedFiles'][comReadParameters['Fid']]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ # TODO: Handle big size files
+ os.lseek(fileHandle,comReadParameters['Offset'],0)
+ content = os.read(fileHandle,comReadParameters['Count'])
+ else:
+ sock = connData['OpenedFiles'][comReadParameters['Fid']]['Socket']
+ content = sock.recv(comReadParameters['Count'])
+ respParameters['Count'] = len(content)
+ respData['DataLength'] = len(content)
+ respData['Data'] = content
+ except Exception, e:
+ smbServer.log('smbComRead: %s ' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComReadAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_READ_ANDX)
+ respParameters = smb.SMBReadAndXResponse_Parameters()
+ respData = ''
+
+ if SMBCommand['WordCount'] == 0x0A:
+ readAndX = smb.SMBReadAndX_Parameters2(SMBCommand['Parameters'])
+ else:
+ readAndX = smb.SMBReadAndX_Parameters(SMBCommand['Parameters'])
+
+ if connData['OpenedFiles'].has_key(readAndX['Fid']):
+ fileHandle = connData['OpenedFiles'][readAndX['Fid']]['FileHandle']
+ errorCode = 0
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ offset = readAndX['Offset']
+ if readAndX.fields.has_key('HighOffset'):
+ offset += (readAndX['HighOffset'] << 32)
+ os.lseek(fileHandle,offset,0)
+ content = os.read(fileHandle,readAndX['MaxCount'])
+ else:
+ sock = connData['OpenedFiles'][readAndX['Fid']]['Socket']
+ content = sock.recv(readAndX['MaxCount'])
+ respParameters['Remaining'] = 0xffff
+ respParameters['DataCount'] = len(content)
+ respParameters['DataOffset'] = 59
+ respParameters['DataCount_Hi'] = 0
+ respData = content
+ except Exception, e:
+ smbServer.log('smbComReadAndX: %s ' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbQueryInformation(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION)
+ respParameters = smb.SMBQueryInformationResponse_Parameters()
+ respData = ''
+
+ queryInformation= smb.SMBQueryInformation_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ fileSize, lastWriteTime, fileAttributes = queryFsInformation(
+ connData['ConnectedShares'][recvPacket['Tid']]['path'],
+ decodeSMBString(recvPacket['Flags2'],queryInformation['FileName']))
+
+ respParameters['FileSize'] = fileSize
+ respParameters['LastWriteTime'] = lastWriteTime
+ respParameters['FileAttributes'] = fileAttributes
+ errorCode = STATUS_SUCCESS
+ else:
+ # STATUS_SMB_BAD_TID
+ errorCode = STATUS_SMB_BAD_TID
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbQueryInformationDisk(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION_DISK)
+ respParameters = smb.SMBQueryInformationDiskResponse_Parameters()
+ respData = ''
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ totalUnits, freeUnits = queryDiskInformation(
+ connData['ConnectedShares'][recvPacket['Tid']]['path'])
+
+ respParameters['TotalUnits'] = totalUnits
+ respParameters['BlocksPerUnit'] = 1
+ respParameters['BlockSize'] = 1
+ respParameters['FreeUnits'] = freeUnits
+ errorCode = STATUS_SUCCESS
+ else:
+ # STATUS_SMB_BAD_TID
+ respData = ''
+ respParameters = ''
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComEcho(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_ECHO)
+ respParameters = smb.SMBEchoResponse_Parameters()
+ respData = smb.SMBEchoResponse_Data()
+
+ echoData = smb.SMBEcho_Data(SMBCommand['Data'])
+
+ respParameters['SequenceNumber'] = 1
+ respData['Data'] = echoData['Data']
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ errorCode = STATUS_SUCCESS
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComTreeDisconnect(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_TREE_DISCONNECT)
+
+ # Check if the Tid matches the Tid trying to disconnect
+ respParameters = ''
+ respData = ''
+
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['Tid'],connData['ConnectedShares'][recvPacket['Tid']]['shareName']))
+ del(connData['ConnectedShares'][recvPacket['Tid']])
+ errorCode = STATUS_SUCCESS
+ else:
+ # STATUS_SMB_BAD_TID
+ errorCode = STATUS_SMB_BAD_TID
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComLogOffAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_LOGOFF_ANDX)
+
+ # Check if the Uid matches the user trying to logoff
+ respParameters = ''
+ respData = ''
+ if recvPacket['Uid'] != connData['Uid']:
+ # STATUS_SMB_BAD_UID
+ errorCode = STATUS_SMB_BAD_UID
+ else:
+ errorCode = STATUS_SUCCESS
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ connData['Uid'] = 0
+
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComQueryInformation2(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION2)
+ respParameters = smb.SMBQueryInformation2Response_Parameters()
+ respData = ''
+
+ queryInformation2 = smb.SMBQueryInformation2_Parameters(SMBCommand['Parameters'])
+ errorCode = 0xFF
+ if connData['OpenedFiles'].has_key(queryInformation2['Fid']):
+ errorCode = STATUS_SUCCESS
+ pathName = connData['OpenedFiles'][queryInformation2['Fid']]['FileName']
+ try:
+ (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
+ respParameters['CreateDate'] = getSMBDate(ctime)
+ respParameters['CreationTime'] = getSMBTime(ctime)
+ respParameters['LastAccessDate'] = getSMBDate(atime)
+ respParameters['LastAccessTime'] = getSMBTime(atime)
+ respParameters['LastWriteDate'] = getSMBDate(mtime)
+ respParameters['LastWriteTime'] = getSMBTime(mtime)
+ respParameters['FileDataSize'] = size
+ respParameters['FileAllocationSize'] = size
+ attribs = 0
+ if os.path.isdir(pathName):
+ attribs = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ if os.path.isfile(pathName):
+ attribs = smb.SMB_FILE_ATTRIBUTE_NORMAL
+ respParameters['FileAttributes'] = attribs
+ except Exception, e:
+ smbServer.log('smbComQueryInformation2 %s' % e,logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+
+ if errorCode > 0:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComNtCreateAndX(connId, smbServer, SMBCommand, recvPacket):
+ # TODO: Fully implement this
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_NT_CREATE_ANDX)
+ respParameters = smb.SMBNtCreateAndXResponse_Parameters()
+ respData = ''
+
+ ntCreateAndXParameters = smb.SMBNtCreateAndX_Parameters(SMBCommand['Parameters'])
+ ntCreateAndXData = smb.SMBNtCreateAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ #if ntCreateAndXParameters['CreateFlags'] & 0x10: # NT_CREATE_REQUEST_EXTENDED_RESPONSE
+ # respParameters = smb.SMBNtCreateAndXExtendedResponse_Parameters()
+ # respParameters['VolumeGUID'] = '\x00'
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ # 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'):
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ else:
+ path = 'NONE'
+ errorCode = STATUS_ACCESS_DENIED
+
+ deleteOnClose = False
+
+ fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],ntCreateAndXData['FileName']).replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ createDisposition = ntCreateAndXParameters['Disposition']
+ mode = 0
+
+ if createDisposition == smb.FILE_SUPERSEDE:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb.FILE_OVERWRITE_IF == smb.FILE_OVERWRITE_IF:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb.FILE_OVERWRITE == smb.FILE_OVERWRITE:
+ if os.path.exists(pathName) is True:
+ mode |= os.O_TRUNC
+ else:
+ errorCode = STATUS_NO_SUCH_FILE
+ elif createDisposition & smb.FILE_OPEN_IF == smb.FILE_OPEN_IF:
+ if os.path.exists(pathName) is True:
+ mode |= os.O_TRUNC
+ else:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb.FILE_CREATE == smb.FILE_CREATE:
+ if os.path.exists(pathName) is True:
+ errorCode = STATUS_OBJECT_NAME_COLLISION
+ 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:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ if errorCode == STATUS_SUCCESS:
+ desiredAccess = ntCreateAndXParameters['AccessMask']
+ if (desiredAccess & smb.FILE_READ_DATA) or (desiredAccess & smb.GENERIC_READ):
+ mode |= os.O_RDONLY
+ if (desiredAccess & smb.FILE_WRITE_DATA) or (desiredAccess & smb.GENERIC_WRITE):
+ if (desiredAccess & smb.FILE_READ_DATA) or (desiredAccess & smb.GENERIC_READ):
+ mode |= os.O_RDWR #| os.O_APPEND
+ else:
+ mode |= os.O_WRONLY #| os.O_APPEND
+ if desiredAccess & smb.GENERIC_ALL:
+ mode |= os.O_RDWR #| os.O_APPEND
+
+ createOptions = ntCreateAndXParameters['CreateOptions']
+ if mode & os.O_CREAT == os.O_CREAT:
+ if createOptions & smb.FILE_DIRECTORY_FILE == smb.FILE_DIRECTORY_FILE:
+ try:
+ # Let's create the directory
+ os.mkdir(pathName)
+ mode = os.O_RDONLY
+ except Exception, 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:
+ # If the file being opened is a directory, the server MUST fail the request with
+ # STATUS_FILE_IS_A_DIRECTORY in the Status field of the SMB Header in the server
+ # response.
+ if os.path.isdir(pathName) is True:
+ errorCode = STATUS_FILE_IS_A_DIRECTORY
+
+ if createOptions & smb.FILE_DELETE_ON_CLOSE == smb.FILE_DELETE_ON_CLOSE:
+ deleteOnClose = True
+
+ if errorCode == STATUS_SUCCESS:
+ try:
+ if os.path.isdir(pathName) and sys.platform == 'win32':
+ fid = VOID_FILE_DESCRIPTOR
+ else:
+ if sys.platform == 'win32':
+ mode |= os.O_BINARY
+ if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
+ fid = PIPE_FILE_DESCRIPTOR
+ sock = socket.socket()
+ sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
+ else:
+ fid = os.open(pathName, mode)
+ except Exception, e:
+ smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
+ #print e
+ fid = 0
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ if errorCode == STATUS_SUCCESS:
+ # Simple way to generate a fid
+ if len(connData['OpenedFiles']) == 0:
+ fakefid = 1
+ else:
+ fakefid = connData['OpenedFiles'].keys()[-1] + 1
+ respParameters['Fid'] = fakefid
+ respParameters['CreateAction'] = createDisposition
+ if fid == PIPE_FILE_DESCRIPTOR:
+ respParameters['FileAttributes'] = 0x80
+ respParameters['IsDirectory'] = 0
+ respParameters['CreateTime'] = 0
+ respParameters['LastAccessTime'] = 0
+ respParameters['LastWriteTime'] = 0
+ respParameters['LastChangeTime'] = 0
+ respParameters['AllocationSize'] = 4096
+ respParameters['EndOfFile'] = 0
+ respParameters['FileType'] = 2
+ respParameters['IPCState'] = 0x5ff
+ else:
+ if os.path.isdir(pathName):
+ respParameters['FileAttributes'] = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ respParameters['IsDirectory'] = 1
+ else:
+ respParameters['IsDirectory'] = 0
+ respParameters['FileAttributes'] = ntCreateAndXParameters['FileAttributes']
+ # Let's get this file's information
+ respInfo, errorCode = queryPathInformation('',pathName,level= smb.SMB_QUERY_FILE_ALL_INFO)
+ if errorCode == STATUS_SUCCESS:
+ respParameters['CreateTime'] = respInfo['CreationTime']
+ respParameters['LastAccessTime'] = respInfo['LastAccessTime']
+ respParameters['LastWriteTime'] = respInfo['LastWriteTime']
+ respParameters['LastChangeTime'] = respInfo['LastChangeTime']
+ respParameters['FileAttributes'] = respInfo['ExtFileAttributes']
+ respParameters['AllocationSize'] = respInfo['AllocationSize']
+ respParameters['EndOfFile'] = respInfo['EndOfFile']
+ else:
+ respParameters = ''
+ respData = ''
+
+ if errorCode == STATUS_SUCCESS:
+ # Let's store the fid for the connection
+ # smbServer.log('Create file %s, mode:0x%x' % (pathName, mode))
+ connData['OpenedFiles'][fakefid] = {}
+ connData['OpenedFiles'][fakefid]['FileHandle'] = fid
+ connData['OpenedFiles'][fakefid]['FileName'] = pathName
+ connData['OpenedFiles'][fakefid]['DeleteOnClose'] = deleteOnClose
+ if fid == PIPE_FILE_DESCRIPTOR:
+ connData['OpenedFiles'][fakefid]['Socket'] = sock
+ else:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComOpenAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_OPEN_ANDX)
+ respParameters = smb.SMBOpenAndXResponse_Parameters()
+ respData = ''
+
+ openAndXParameters = smb.SMBOpenAndX_Parameters(SMBCommand['Parameters'])
+ openAndXData = smb.SMBOpenAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
+
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+ path = connData['ConnectedShares'][recvPacket['Tid']]['path']
+ openedFile, mode, pathName, errorCode = openFile(path,
+ decodeSMBString(recvPacket['Flags2'],openAndXData['FileName']),
+ openAndXParameters['DesiredAccess'],
+ openAndXParameters['FileAttributes'],
+ openAndXParameters['OpenMode'])
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ if errorCode == STATUS_SUCCESS:
+ # Simple way to generate a fid
+ fid = len(connData['OpenedFiles']) + 1
+ if len(connData['OpenedFiles']) == 0:
+ fid = 1
+ else:
+ fid = connData['OpenedFiles'].keys()[-1] + 1
+ respParameters['Fid'] = fid
+ if mode & os.O_CREAT:
+ # File did not exist and was created
+ respParameters['Action'] = 0x2
+ elif mode & os.O_RDONLY:
+ # File existed and was opened
+ respParameters['Action'] = 0x1
+ elif mode & os.O_APPEND:
+ # File existed and was opened
+ respParameters['Action'] = 0x1
+ else:
+ # File existed and was truncated
+ respParameters['Action'] = 0x3
+
+ # Let's store the fid for the connection
+ #smbServer.log('Opening file %s' % pathName)
+ connData['OpenedFiles'][fid] = {}
+ connData['OpenedFiles'][fid]['FileHandle'] = openedFile
+ connData['OpenedFiles'][fid]['FileName'] = pathName
+ connData['OpenedFiles'][fid]['DeleteOnClose'] = False
+ else:
+ respParameters = ''
+ respData = ''
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComTreeConnectAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ resp = smb.NewSMBPacket()
+ resp['Flags1'] = smb.SMB.FLAGS1_REPLY
+ resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES | recvPacket['Flags2'] & smb.SMB.FLAGS2_UNICODE
+
+ resp['Tid'] = recvPacket['Tid']
+ resp['Mid'] = recvPacket['Mid']
+ resp['Pid'] = connData['Pid']
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_TREE_CONNECT_ANDX)
+ respParameters = smb.SMBTreeConnectAndXResponse_Parameters()
+ respData = smb.SMBTreeConnectAndXResponse_Data()
+
+ treeConnectAndXParameters = smb.SMBTreeConnectAndX_Parameters(SMBCommand['Parameters'])
+
+ if treeConnectAndXParameters['Flags'] & 0x8:
+ respParameters = smb.SMBTreeConnectAndXExtendedResponse_Parameters()
+
+ treeConnectAndXData = smb.SMBTreeConnectAndX_Data( flags = recvPacket['Flags2'] )
+ treeConnectAndXData['_PasswordLength'] = treeConnectAndXParameters['PasswordLength']
+ treeConnectAndXData.fromString(SMBCommand['Data'])
+
+ errorCode = STATUS_SUCCESS
+
+ ## Process here the request, does the share exist?
+ UNCOrShare = decodeSMBString(recvPacket['Flags2'], treeConnectAndXData['Path'])
+
+ # Is this a UNC?
+ if ntpath.ismount(UNCOrShare):
+ path = UNCOrShare.split('\\')[3]
+ else:
+ path = ntpath.basename(UNCOrShare)
+
+ share = searchShare(connId, path, smbServer)
+ if share is not None:
+ # Simple way to generate a Tid
+ if len(connData['ConnectedShares']) == 0:
+ tid = 1
+ else:
+ tid = connData['ConnectedShares'].keys()[-1] + 1
+ connData['ConnectedShares'][tid] = share
+ connData['ConnectedShares'][tid]['shareName'] = path
+ resp['Tid'] = tid
+ #smbServer.log("Connecting Share(%d:%s)" % (tid,path))
+ else:
+ smbServer.log("TreeConnectAndX not found %s" % path, logging.ERROR)
+ errorCode = STATUS_OBJECT_PATH_NOT_FOUND
+ resp['ErrorCode'] = errorCode >> 16
+ resp['ErrorClass'] = errorCode & 0xff
+ ##
+ respParameters['OptionalSupport'] = smb.SMB.SMB_SUPPORT_SEARCH_BITS
+
+ if path == 'IPC$':
+ respData['Service'] = 'IPC'
+ else:
+ respData['Service'] = path
+ respData['PadLen'] = 0
+ respData['NativeFileSystem'] = encodeSMBString(recvPacket['Flags2'], 'NTFS' )
+
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ resp['Uid'] = connData['Uid']
+ resp.addCommand(respSMBCommand)
+ smbServer.setConnectionData(connId, connData)
+
+ return None, [resp], errorCode
+
+ @staticmethod
+ def smbComSessionSetupAndX(connId, smbServer, SMBCommand, recvPacket):
+ connData = smbServer.getConnectionData(connId, checkStatus = False)
+
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_SESSION_SETUP_ANDX)
+
+ # From [MS-SMB]
+ # When extended security is being used (see section 3.2.4.2.4), the
+ # request MUST take the following form
+ # [..]
+ # WordCount (1 byte): The value of this field MUST be 0x0C.
+ if SMBCommand['WordCount'] == 12:
+ # Extended security. Here we deal with all SPNEGO stuff
+ respParameters = smb.SMBSessionSetupAndX_Extended_Response_Parameters()
+ respData = smb.SMBSessionSetupAndX_Extended_Response_Data(flags = recvPacket['Flags2'])
+ sessionSetupParameters = smb.SMBSessionSetupAndX_Extended_Parameters(SMBCommand['Parameters'])
+ sessionSetupData = smb.SMBSessionSetupAndX_Extended_Data()
+ sessionSetupData['SecurityBlobLength'] = sessionSetupParameters['SecurityBlobLength']
+ sessionSetupData.fromString(SMBCommand['Data'])
+ connData['Capabilities'] = sessionSetupParameters['Capabilities']
+
+ rawNTLM = False
+ if struct.unpack('B',sessionSetupData['SecurityBlob'][0])[0] == ASN1_AID:
+ # NEGOTIATE packet
+ blob = SPNEGO_NegTokenInit(sessionSetupData['SecurityBlob'])
+ token = blob['MechToken']
+ if len(blob['MechTypes'][0]) > 0:
+ # Is this GSSAPI NTLM or something else we don't support?
+ mechType = blob['MechTypes'][0]
+ if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
+ # Nope, do we know it?
+ if MechTypes.has_key(mechType):
+ mechStr = MechTypes[mechType]
+ else:
+ mechStr = hexlify(mechType)
+ smbServer.log("Unsupported MechType '%s'" % mechStr, logging.CRITICAL)
+ # We don't know the token, we answer back again saying
+ # we just support NTLM.
+ # ToDo: Build this into a SPNEGO_NegTokenResp()
+ respToken = '\xa1\x15\x30\x13\xa0\x03\x0a\x01\x03\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a'
+ respParameters['SecurityBlobLength'] = len(respToken)
+ respData['SecurityBlobLength'] = respParameters['SecurityBlobLength']
+ respData['SecurityBlob'] = respToken
+ respData['NativeOS'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
+ respData['NativeLanMan'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+ return [respSMBCommand], None, STATUS_MORE_PROCESSING_REQUIRED
+
+ elif struct.unpack('B',sessionSetupData['SecurityBlob'][0])[0] == ASN1_SUPPORTED_MECH:
+ # AUTH packet
+ blob = SPNEGO_NegTokenResp(sessionSetupData['SecurityBlob'])
+ token = blob['ResponseToken']
+ else:
+ # No GSSAPI stuff, raw NTLMSSP
+ rawNTLM = True
+ token = sessionSetupData['SecurityBlob']
+
+ # Here we only handle NTLMSSP, depending on what stage of the
+ # authentication we are, we act on it
+ messageType = struct.unpack('<L',token[len('NTLMSSP\x00'):len('NTLMSSP\x00')+4])[0]
+
+ if messageType == 0x01:
+ # NEGOTIATE_MESSAGE
+ negotiateMessage = ntlm.NTLMAuthNegotiate()
+ negotiateMessage.fromString(token)
+ # Let's store it in the connection data
+ connData['NEGOTIATE_MESSAGE'] = negotiateMessage
+ # Let's build the answer flags
+ # TODO: Parse all the flags. With this we're leaving some clients out
+
+ ansFlags = 0
+
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_56:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_56
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_128:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_128
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_UNICODE:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_UNICODE
+ if negotiateMessage['flags'] & ntlm.NTLM_NEGOTIATE_OEM:
+ ansFlags |= ntlm.NTLM_NEGOTIATE_OEM
+
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_REQUEST_TARGET
+
+ # Generate the AV_PAIRS
+ av_pairs = ntlm.AV_PAIRS()
+ # TODO: Put the proper data from SMBSERVER config
+ av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME] = smbServer.getServerName().encode('utf-16le')
+ av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] = smbServer.getServerDomain().encode('utf-16le')
+ av_pairs[ntlm.NTLMSSP_AV_TIME] = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
+
+ challengeMessage = ntlm.NTLMAuthChallenge()
+ challengeMessage['flags'] = ansFlags
+ challengeMessage['domain_len'] = len(smbServer.getServerDomain().encode('utf-16le'))
+ challengeMessage['domain_max_len'] = challengeMessage['domain_len']
+ challengeMessage['domain_offset'] = 40 + 16
+ challengeMessage['challenge'] = smbServer.getSMBChallenge()
+ challengeMessage['domain_name'] = smbServer.getServerDomain().encode('utf-16le')
+ challengeMessage['TargetInfoFields_len'] = len(av_pairs)
+ challengeMessage['TargetInfoFields_max_len'] = len(av_pairs)
+ challengeMessage['TargetInfoFields'] = av_pairs
+ challengeMessage['TargetInfoFields_offset'] = 40 + 16 + len(challengeMessage['domain_name'])
+ challengeMessage['Version'] = '\xff'*8
+ challengeMessage['VersionLen'] = 8
+
+ if rawNTLM is False:
+ respToken = SPNEGO_NegTokenResp()
+ # accept-incomplete. We want more data
+ respToken['NegResult'] = '\x01'
+ respToken['SupportedMech'] = TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']
+
+ respToken['ResponseToken'] = challengeMessage.getData()
+ else:
+ respToken = challengeMessage
+
+ # Setting the packet to STATUS_MORE_PROCESSING
+ errorCode = STATUS_MORE_PROCESSING_REQUIRED
+ # Let's set up an UID for this connection and store it
+ # in the connection's data
+ # Picking a fixed value
+ # TODO: Manage more UIDs for the same session
+ connData['Uid'] = 10
+ # Let's store it in the connection data
+ connData['CHALLENGE_MESSAGE'] = challengeMessage
+
+ elif messageType == 0x02:
+ # CHALLENGE_MESSAGE
+ raise Exception('Challenge Message raise, not implemented!')
+ elif messageType == 0x03:
+ # AUTHENTICATE_MESSAGE, here we deal with authentication
+ authenticateMessage = ntlm.NTLMAuthChallengeResponse()
+ authenticateMessage.fromString(token)
+ smbServer.log("AUTHENTICATE_MESSAGE (%s\\%s,%s)" % (authenticateMessage['domain_name'], authenticateMessage['user_name'], authenticateMessage['host_name']))
+ # TODO: Check the credentials! Now granting permissions
+
+ respToken = SPNEGO_NegTokenResp()
+ # accept-completed
+ respToken['NegResult'] = '\x00'
+
+ # Status SUCCESS
+ errorCode = STATUS_SUCCESS
+ smbServer.log('User %s\\%s authenticated successfully' % (authenticateMessage['user_name'], authenticateMessage['host_name']))
+ # Let's store it in the connection data
+ connData['AUTHENTICATE_MESSAGE'] = authenticateMessage
+ try:
+ jtr_dump_path = smbServer.getJTRdumpPath()
+ ntlm_hash_data = outputToJohnFormat( connData['CHALLENGE_MESSAGE']['challenge'], authenticateMessage['user_name'], authenticateMessage['domain_name'], authenticateMessage['lanman'], authenticateMessage['ntlm'] )
+ smbServer.log(ntlm_hash_data['hash_string'])
+ if jtr_dump_path is not '':
+ writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
+ except:
+ smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
+ else:
+ raise Exception("Unknown NTLMSSP MessageType %d" % messageType)
+
+ respParameters['SecurityBlobLength'] = len(respToken)
+ respData['SecurityBlobLength'] = respParameters['SecurityBlobLength']
+ respData['SecurityBlob'] = respToken.getData()
+
+ else:
+ # Process Standard Security
+ respParameters = smb.SMBSessionSetupAndXResponse_Parameters()
+ respData = smb.SMBSessionSetupAndXResponse_Data()
+ sessionSetupParameters = smb.SMBSessionSetupAndX_Parameters(SMBCommand['Parameters'])
+ sessionSetupData = smb.SMBSessionSetupAndX_Data()
+ sessionSetupData['AnsiPwdLength'] = sessionSetupParameters['AnsiPwdLength']
+ sessionSetupData['UnicodePwdLength'] = sessionSetupParameters['UnicodePwdLength']
+ sessionSetupData.fromString(SMBCommand['Data'])
+ connData['Capabilities'] = sessionSetupParameters['Capabilities']
+ # Do the verification here, for just now we grant access
+ # TODO: Manage more UIDs for the same session
+ errorCode = STATUS_SUCCESS
+ connData['Uid'] = 10
+ respParameters['Action'] = 0
+ smbServer.log('User %s\\%s authenticated successfully (basic)' % (sessionSetupData['PrimaryDomain'], sessionSetupData['Account']))
+ try:
+ jtr_dump_path = smbServer.getJTRdumpPath()
+ ntlm_hash_data = outputToJohnFormat( '', sessionSetupData['Account'], sessionSetupData['PrimaryDomain'], sessionSetupData['AnsiPwd'], sessionSetupData['UnicodePwd'] )
+ smbServer.log(ntlm_hash_data['hash_string'])
+ if jtr_dump_path is not '':
+ writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
+ except:
+ smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
+
+ respData['NativeOS'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
+ respData['NativeLanMan'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
+ respSMBCommand['Parameters'] = respParameters
+ respSMBCommand['Data'] = respData
+
+ # From now on, the client can ask for other commands
+ connData['Authenticated'] = True
+ # For now, just switching to nobody
+ #os.setregid(65534,65534)
+ #os.setreuid(65534,65534)
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smbComNegotiate(connId, smbServer, SMBCommand, recvPacket ):
+ connData = smbServer.getConnectionData(connId, checkStatus = False)
+ connData['Pid'] = recvPacket['Pid']
+
+ SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
+ respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_NEGOTIATE)
+
+ resp = smb.NewSMBPacket()
+ resp['Flags1'] = smb.SMB.FLAGS1_REPLY
+ resp['Pid'] = connData['Pid']
+ resp['Tid'] = recvPacket['Tid']
+ resp['Mid'] = recvPacket['Mid']
+
+ # TODO: We support more dialects, and parse them accordingly
+ dialects = SMBCommand['Data'].split('\x02')
+ try:
+ index = dialects.index('NT LM 0.12\x00') - 1
+ # Let's fill the data for NTLM
+ if recvPacket['Flags2'] & smb.SMB.FLAGS2_EXTENDED_SECURITY:
+ resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_UNICODE
+ #resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS
+ _dialects_data = smb.SMBExtended_Security_Data()
+ _dialects_data['ServerGUID'] = 'A'*16
+ blob = SPNEGO_NegTokenInit()
+ blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
+ _dialects_data['SecurityBlob'] = blob.getData()
+
+ _dialects_parameters = smb.SMBExtended_Security_Parameters()
+ _dialects_parameters['Capabilities'] = smb.SMB.CAP_EXTENDED_SECURITY | smb.SMB.CAP_USE_NT_ERRORS | smb.SMB.CAP_NT_SMBS | smb.SMB.CAP_UNICODE
+ _dialects_parameters['ChallengeLength'] = 0
+
+ else:
+ resp['Flags2'] = smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_UNICODE
+ _dialects_parameters = smb.SMBNTLMDialect_Parameters()
+ _dialects_data= smb.SMBNTLMDialect_Data()
+ _dialects_data['Payload'] = ''
+ if connData.has_key('EncryptionKey'):
+ _dialects_data['Challenge'] = connData['EncryptionKey']
+ _dialects_parameters['ChallengeLength'] = len(str(_dialects_data))
+ else:
+ # TODO: Handle random challenges, now one that can be used with rainbow tables
+ _dialects_data['Challenge'] = '\x11\x22\x33\x44\x55\x66\x77\x88'
+ _dialects_parameters['ChallengeLength'] = 8
+ _dialects_parameters['Capabilities'] = smb.SMB.CAP_USE_NT_ERRORS | smb.SMB.CAP_NT_SMBS
+
+ # Let's see if we need to support RPC_REMOTE_APIS
+ config = smbServer.getServerConfig()
+ if config.has_option('global','rpc_apis'):
+ if config.getboolean('global', 'rpc_apis') is True:
+ _dialects_parameters['Capabilities'] |= smb.SMB.CAP_RPC_REMOTE_APIS
+
+ _dialects_parameters['DialectIndex'] = index
+ _dialects_parameters['SecurityMode'] = smb.SMB.SECURITY_AUTH_ENCRYPTED | smb.SMB.SECURITY_SHARE_USER
+ _dialects_parameters['MaxMpxCount'] = 1
+ _dialects_parameters['MaxNumberVcs'] = 1
+ _dialects_parameters['MaxBufferSize'] = 64000
+ _dialects_parameters['MaxRawSize'] = 65536
+ _dialects_parameters['SessionKey'] = 0
+ _dialects_parameters['LowDateTime'] = 0
+ _dialects_parameters['HighDateTime'] = 0
+ _dialects_parameters['ServerTimeZone'] = 0
+
+
+ respSMBCommand['Data'] = _dialects_data
+ respSMBCommand['Parameters'] = _dialects_parameters
+ connData['_dialects_data'] = _dialects_data
+ connData['_dialects_parameters'] = _dialects_parameters
+
+ except Exception, e:
+ # No NTLM throw an error
+ smbServer.log('smbComNegotiate: %s' % e, logging.ERROR)
+ respSMBCommand['Data'] = struct.pack('<H',0xffff)
+
+
+ smbServer.setConnectionData(connId, connData)
+
+ resp.addCommand(respSMBCommand)
+
+ return None, [resp], STATUS_SUCCESS
+
+ @staticmethod
+ def default(connId, smbServer, SMBCommand, recvPacket):
+ # By default we return an SMB Packet with error not implemented
+ smbServer.log("Not implemented command: 0x%x" % recvPacket['Command'],logging.DEBUG)
+ packet = smb.NewSMBPacket()
+ packet['Flags1'] = smb.SMB.FLAGS1_REPLY
+ packet['Flags2'] = smb.SMB.FLAGS2_NT_STATUS
+ packet['Command'] = recvPacket['Command']
+ packet['Pid'] = recvPacket['Pid']
+ packet['Tid'] = recvPacket['Tid']
+ packet['Mid'] = recvPacket['Mid']
+ packet['Uid'] = recvPacket['Uid']
+ packet['Data'] = '\x00\x00\x00'
+ errorCode = STATUS_NOT_IMPLEMENTED
+ packet['ErrorCode'] = errorCode >> 16
+ packet['ErrorClass'] = errorCode & 0xff
+
+ return None, [packet], errorCode
+
+class SMB2Commands:
+ @staticmethod
+ def smb2Negotiate(connId, smbServer, recvPacket, isSMB1 = False):
+ connData = smbServer.getConnectionData(connId, checkStatus = False)
+
+ respPacket = smb2.SMB2Packet()
+ respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
+ respPacket['Status'] = STATUS_SUCCESS
+ respPacket['CreditRequestResponse'] = 1
+ respPacket['Command'] = smb2.SMB2_NEGOTIATE
+ respPacket['SessionID'] = 0
+ if isSMB1 is False:
+ respPacket['MessageID'] = recvPacket['MessageID']
+ else:
+ respPacket['MessageID'] = 0
+ respPacket['TreeID'] = 0
+
+
+ respSMBCommand = smb2.SMB2Negotiate_Response()
+
+ respSMBCommand['SecurityMode'] = 1
+ if isSMB1 is True:
+ # Let's first parse the packet to see if the client supports SMB2
+ SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
+
+ dialects = SMBCommand['Data'].split('\x02')
+ if 'SMB 2.002\x00' in dialects or 'SMB 2.???\x00' in dialects:
+ respSMBCommand['DialectRevision'] = smb2.SMB2_DIALECT_002
+ else:
+ # Client does not support SMB2 fallbacking
+ raise Exception('SMB2 not supported, fallbacking')
+ else:
+ respSMBCommand['DialectRevision'] = smb2.SMB2_DIALECT_002
+ respSMBCommand['ServerGuid'] = 'A'*16
+ respSMBCommand['Capabilities'] = 0
+ respSMBCommand['MaxTransactSize'] = 65536
+ respSMBCommand['MaxReadSize'] = 65536
+ respSMBCommand['MaxWriteSize'] = 65536
+ respSMBCommand['SystemTime'] = getFileTime(calendar.timegm(time.gmtime()))
+ respSMBCommand['ServerStartTime'] = getFileTime(calendar.timegm(time.gmtime()))
+ respSMBCommand['SecurityBufferOffset'] = 0x80
+
+ blob = SPNEGO_NegTokenInit()
+ blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
+
+ respSMBCommand['Buffer'] = blob.getData()
+ respSMBCommand['SecurityBufferLength'] = len(respSMBCommand['Buffer'])
+
+ respPacket['Data'] = respSMBCommand
+
+ smbServer.setConnectionData(connId, connData)
+
+ return None, [respPacket], STATUS_SUCCESS
+
+ @staticmethod
+ def smb2SessionSetup(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId, checkStatus = False)
+
+ respSMBCommand = smb2.SMB2SessionSetup_Response()
+
+ sessionSetupData = smb2.SMB2SessionSetup(recvPacket['Data'])
+
+ connData['Capabilities'] = sessionSetupData['Capabilities']
+
+ securityBlob = sessionSetupData['Buffer']
+
+ rawNTLM = False
+ if struct.unpack('B',securityBlob[0])[0] == ASN1_AID:
+ # NEGOTIATE packet
+ blob = SPNEGO_NegTokenInit(securityBlob)
+ token = blob['MechToken']
+ if len(blob['MechTypes'][0]) > 0:
+ # Is this GSSAPI NTLM or something else we don't support?
+ mechType = blob['MechTypes'][0]
+ if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
+ # Nope, do we know it?
+ if MechTypes.has_key(mechType):
+ mechStr = MechTypes[mechType]
+ else:
+ mechStr = hexlify(mechType)
+ smbServer.log("Unsupported MechType '%s'" % mechStr, logging.CRITICAL)
+ # We don't know the token, we answer back again saying
+ # we just support NTLM.
+ # ToDo: Build this into a SPNEGO_NegTokenResp()
+ respToken = '\xa1\x15\x30\x13\xa0\x03\x0a\x01\x03\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a'
+ respSMBCommand['SecurityBufferOffset'] = 0x48
+ respSMBCommand['SecurityBufferLength'] = len(respToken)
+ respSMBCommand['Buffer'] = respToken
+
+ return [respSMBCommand], None, STATUS_MORE_PROCESSING_REQUIRED
+ elif struct.unpack('B',securityBlob[0])[0] == ASN1_SUPPORTED_MECH:
+ # AUTH packet
+ blob = SPNEGO_NegTokenResp(securityBlob)
+ token = blob['ResponseToken']
+ else:
+ # No GSSAPI stuff, raw NTLMSSP
+ rawNTLM = True
+ token = securityBlob
+
+ # Here we only handle NTLMSSP, depending on what stage of the
+ # authentication we are, we act on it
+ messageType = struct.unpack('<L',token[len('NTLMSSP\x00'):len('NTLMSSP\x00')+4])[0]
+
+ if messageType == 0x01:
+ # NEGOTIATE_MESSAGE
+ negotiateMessage = ntlm.NTLMAuthNegotiate()
+ negotiateMessage.fromString(token)
+ # Let's store it in the connection data
+ connData['NEGOTIATE_MESSAGE'] = negotiateMessage
+ # Let's build the answer flags
+ # TODO: Parse all the flags. With this we're leaving some clients out
+
+ ansFlags = 0
+
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_56:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_56
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_128:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_128
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
+ if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_UNICODE:
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_UNICODE
+ if negotiateMessage['flags'] & ntlm.NTLM_NEGOTIATE_OEM:
+ ansFlags |= ntlm.NTLM_NEGOTIATE_OEM
+
+ ansFlags |= ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_REQUEST_TARGET
+
+ # Generate the AV_PAIRS
+ av_pairs = ntlm.AV_PAIRS()
+ # TODO: Put the proper data from SMBSERVER config
+ av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME] = smbServer.getServerName().encode('utf-16le')
+ av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] = smbServer.getServerDomain().encode('utf-16le')
+ av_pairs[ntlm.NTLMSSP_AV_TIME] = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
+
+ challengeMessage = ntlm.NTLMAuthChallenge()
+ challengeMessage['flags'] = ansFlags
+ challengeMessage['domain_len'] = len(smbServer.getServerDomain().encode('utf-16le'))
+ challengeMessage['domain_max_len'] = challengeMessage['domain_len']
+ challengeMessage['domain_offset'] = 40 + 16
+ challengeMessage['challenge'] = smbServer.getSMBChallenge()
+ challengeMessage['domain_name'] = smbServer.getServerDomain().encode('utf-16le')
+ challengeMessage['TargetInfoFields_len'] = len(av_pairs)
+ challengeMessage['TargetInfoFields_max_len'] = len(av_pairs)
+ challengeMessage['TargetInfoFields'] = av_pairs
+ challengeMessage['TargetInfoFields_offset'] = 40 + 16 + len(challengeMessage['domain_name'])
+ challengeMessage['Version'] = '\xff'*8
+ challengeMessage['VersionLen'] = 8
+
+ if rawNTLM is False:
+ respToken = SPNEGO_NegTokenResp()
+ # accept-incomplete. We want more data
+ respToken['NegResult'] = '\x01'
+ respToken['SupportedMech'] = TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']
+
+ respToken['ResponseToken'] = challengeMessage.getData()
+ else:
+ respToken = challengeMessage
+
+ # Setting the packet to STATUS_MORE_PROCESSING
+ errorCode = STATUS_MORE_PROCESSING_REQUIRED
+ # Let's set up an UID for this connection and store it
+ # in the connection's data
+ # Picking a fixed value
+ # TODO: Manage more UIDs for the same session
+ connData['Uid'] = random.randint(1,0xffffffff)
+ # Let's store it in the connection data
+ connData['CHALLENGE_MESSAGE'] = challengeMessage
+
+ elif messageType == 0x02:
+ # CHALLENGE_MESSAGE
+ raise Exception('Challenge Message raise, not implemented!')
+ elif messageType == 0x03:
+ # AUTHENTICATE_MESSAGE, here we deal with authentication
+ authenticateMessage = ntlm.NTLMAuthChallengeResponse()
+ authenticateMessage.fromString(token)
+ smbServer.log("AUTHENTICATE_MESSAGE (%s\\%s,%s)" % (authenticateMessage['domain_name'], authenticateMessage['user_name'], authenticateMessage['host_name']))
+ # TODO: Check the credentials! Now granting permissions
+
+ respToken = SPNEGO_NegTokenResp()
+ # accept-completed
+ respToken['NegResult'] = '\x00'
+
+ # Status SUCCESS
+ errorCode = STATUS_SUCCESS
+ smbServer.log('User %s\\%s authenticated successfully' % (authenticateMessage['user_name'], authenticateMessage['host_name']))
+ # Let's store it in the connection data
+ connData['AUTHENTICATE_MESSAGE'] = authenticateMessage
+ try:
+ jtr_dump_path = smbServer.getJTRdumpPath()
+ ntlm_hash_data = outputToJohnFormat( connData['CHALLENGE_MESSAGE']['challenge'], authenticateMessage['user_name'], authenticateMessage['domain_name'], authenticateMessage['lanman'], authenticateMessage['ntlm'] )
+ smbServer.log(ntlm_hash_data['hash_string'])
+ if jtr_dump_path is not '':
+ writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
+ except:
+ smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
+ respSMBCommand['SessionFlags'] = 1
+ else:
+ raise Exception("Unknown NTLMSSP MessageType %d" % messageType)
+
+ respSMBCommand['SecurityBufferOffset'] = 0x48
+ respSMBCommand['SecurityBufferLength'] = len(respToken)
+ respSMBCommand['Buffer'] = respToken.getData()
+
+ # From now on, the client can ask for other commands
+ connData['Authenticated'] = True
+ # For now, just switching to nobody
+ #os.setregid(65534,65534)
+ #os.setreuid(65534,65534)
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2TreeConnect(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respPacket = smb2.SMB2Packet()
+ respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
+ respPacket['Status'] = STATUS_SUCCESS
+ respPacket['CreditRequestResponse'] = 1
+ respPacket['Command'] = recvPacket['Command']
+ respPacket['SessionID'] = connData['Uid']
+ respPacket['Reserved'] = recvPacket['Reserved']
+ respPacket['MessageID'] = recvPacket['MessageID']
+ respPacket['TreeID'] = recvPacket['TreeID']
+
+ respSMBCommand = smb2.SMB2TreeConnect_Response()
+
+ treeConnectRequest = smb2.SMB2TreeConnect(recvPacket['Data'])
+
+ errorCode = STATUS_SUCCESS
+
+ ## Process here the request, does the share exist?
+ path = str(recvPacket)[treeConnectRequest['PathOffset']:][:treeConnectRequest['PathLength']]
+ UNCOrShare = path.decode('utf-16le')
+
+ # Is this a UNC?
+ if ntpath.ismount(UNCOrShare):
+ path = UNCOrShare.split('\\')[3]
+ else:
+ path = ntpath.basename(UNCOrShare)
+
+ share = searchShare(connId, path.upper(), smbServer)
+ if share is not None:
+ # Simple way to generate a Tid
+ if len(connData['ConnectedShares']) == 0:
+ tid = 1
+ else:
+ tid = connData['ConnectedShares'].keys()[-1] + 1
+ connData['ConnectedShares'][tid] = share
+ connData['ConnectedShares'][tid]['shareName'] = path
+ respPacket['TreeID'] = tid
+ smbServer.log("Connecting Share(%d:%s)" % (tid,path))
+ else:
+ smbServer.log("SMB2_TREE_CONNECT not found %s" % path, logging.ERROR)
+ errorCode = STATUS_OBJECT_PATH_NOT_FOUND
+ respPacket['Status'] = errorCode
+ ##
+
+ if path == 'IPC$':
+ respSMBCommand['ShareType'] = smb2.SMB2_SHARE_TYPE_PIPE
+ respSMBCommand['ShareFlags'] = 0x30
+ else:
+ respSMBCommand['ShareType'] = smb2.SMB2_SHARE_TYPE_DISK
+ respSMBCommand['ShareFlags'] = 0x0
+
+ respSMBCommand['Capabilities'] = 0
+ respSMBCommand['MaximalAccess'] = 0x000f01ff
+
+ respPacket['Data'] = respSMBCommand
+
+ smbServer.setConnectionData(connId, connData)
+
+ return None, [respPacket], errorCode
+
+ @staticmethod
+ def smb2Create(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Create_Response()
+
+ ntCreateRequest = smb2.SMB2Create(recvPacket['Data'])
+
+ respSMBCommand['Buffer'] = '\x00'
+ # Get the Tid associated
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+ # If we have a rootFid, the path is relative to that fid
+ errorCode = STATUS_SUCCESS
+ if connData['ConnectedShares'][recvPacket['TreeID']].has_key('path'):
+ path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
+ else:
+ path = 'NONE'
+ errorCode = STATUS_ACCESS_DENIED
+
+ deleteOnClose = False
+
+ fileName = os.path.normpath(ntCreateRequest['Buffer'][:ntCreateRequest['NameLength']].decode('utf-16le').replace('\\','/'))
+ if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
+ # strip leading '/'
+ fileName = fileName[1:]
+ pathName = os.path.join(path,fileName)
+ createDisposition = ntCreateRequest['CreateDisposition']
+ mode = 0
+
+ if createDisposition == smb2.FILE_SUPERSEDE:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb2.FILE_OVERWRITE_IF == smb2.FILE_OVERWRITE_IF:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb2.FILE_OVERWRITE == smb2.FILE_OVERWRITE:
+ if os.path.exists(pathName) is True:
+ mode |= os.O_TRUNC
+ else:
+ errorCode = STATUS_NO_SUCH_FILE
+ elif createDisposition & smb2.FILE_OPEN_IF == smb2.FILE_OPEN_IF:
+ if os.path.exists(pathName) is True:
+ mode |= os.O_TRUNC
+ else:
+ mode |= os.O_TRUNC | os.O_CREAT
+ elif createDisposition & smb2.FILE_CREATE == smb2.FILE_CREATE:
+ if os.path.exists(pathName) is True:
+ errorCode = STATUS_OBJECT_NAME_COLLISION
+ 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:
+ errorCode = STATUS_NO_SUCH_FILE
+
+ if errorCode == STATUS_SUCCESS:
+ desiredAccess = ntCreateRequest['DesiredAccess']
+ if (desiredAccess & smb2.FILE_READ_DATA) or (desiredAccess & smb2.GENERIC_READ):
+ mode |= os.O_RDONLY
+ if (desiredAccess & smb2.FILE_WRITE_DATA) or (desiredAccess & smb2.GENERIC_WRITE):
+ if (desiredAccess & smb2.FILE_READ_DATA) or (desiredAccess & smb2.GENERIC_READ):
+ mode |= os.O_RDWR #| os.O_APPEND
+ else:
+ mode |= os.O_WRONLY #| os.O_APPEND
+ if desiredAccess & smb2.GENERIC_ALL:
+ mode |= os.O_RDWR #| os.O_APPEND
+
+ createOptions = ntCreateRequest['CreateOptions']
+ if mode & os.O_CREAT == os.O_CREAT:
+ if createOptions & smb2.FILE_DIRECTORY_FILE == smb2.FILE_DIRECTORY_FILE:
+ try:
+ # Let's create the directory
+ os.mkdir(pathName)
+ mode = os.O_RDONLY
+ except Exception, 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:
+ # If the file being opened is a directory, the server MUST fail the request with
+ # STATUS_FILE_IS_A_DIRECTORY in the Status field of the SMB Header in the server
+ # response.
+ if os.path.isdir(pathName) is True:
+ errorCode = STATUS_FILE_IS_A_DIRECTORY
+
+ if createOptions & smb2.FILE_DELETE_ON_CLOSE == smb2.FILE_DELETE_ON_CLOSE:
+ deleteOnClose = True
+
+ if errorCode == STATUS_SUCCESS:
+ try:
+ if os.path.isdir(pathName) and sys.platform == 'win32':
+ fid = VOID_FILE_DESCRIPTOR
+ else:
+ if sys.platform == 'win32':
+ mode |= os.O_BINARY
+ if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
+ fid = PIPE_FILE_DESCRIPTOR
+ sock = socket.socket()
+ sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
+ else:
+ fid = os.open(pathName, mode)
+ except Exception, e:
+ smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
+ #print e
+ fid = 0
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+ if errorCode == STATUS_SUCCESS:
+ # Simple way to generate a fid
+ fakefid = uuid.generate()
+
+ respSMBCommand['FileID'] = fakefid
+ respSMBCommand['CreateAction'] = createDisposition
+
+ if fid == PIPE_FILE_DESCRIPTOR:
+ respSMBCommand['CreationTime'] = 0
+ respSMBCommand['LastAccessTime'] = 0
+ respSMBCommand['LastWriteTime'] = 0
+ respSMBCommand['ChangeTime'] = 0
+ respSMBCommand['AllocationSize'] = 4096
+ respSMBCommand['EndOfFile'] = 0
+ respSMBCommand['FileAttributes'] = 0x80
+
+ else:
+ if os.path.isdir(pathName):
+ respSMBCommand['FileAttributes'] = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ else:
+ respSMBCommand['FileAttributes'] = ntCreateRequest['FileAttributes']
+ # Let's get this file's information
+ respInfo, errorCode = queryPathInformation('',pathName,level= smb.SMB_QUERY_FILE_ALL_INFO)
+ if errorCode == STATUS_SUCCESS:
+ respSMBCommand['CreationTime'] = respInfo['CreationTime']
+ respSMBCommand['LastAccessTime'] = respInfo['LastAccessTime']
+ respSMBCommand['LastWriteTime'] = respInfo['LastWriteTime']
+ respSMBCommand['LastChangeTime'] = respInfo['LastChangeTime']
+ respSMBCommand['FileAttributes'] = respInfo['ExtFileAttributes']
+ respSMBCommand['AllocationSize'] = respInfo['AllocationSize']
+ respSMBCommand['EndOfFile'] = respInfo['EndOfFile']
+
+ if errorCode == STATUS_SUCCESS:
+ # Let's store the fid for the connection
+ # smbServer.log('Create file %s, mode:0x%x' % (pathName, mode))
+ connData['OpenedFiles'][fakefid] = {}
+ connData['OpenedFiles'][fakefid]['FileHandle'] = fid
+ connData['OpenedFiles'][fakefid]['FileName'] = pathName
+ connData['OpenedFiles'][fakefid]['DeleteOnClose'] = deleteOnClose
+ connData['OpenedFiles'][fakefid]['Open'] = {}
+ connData['OpenedFiles'][fakefid]['Open']['EnumerationLocation'] = 0
+ connData['OpenedFiles'][fakefid]['Open']['EnumerationSearchPattern'] = ''
+ if fid == PIPE_FILE_DESCRIPTOR:
+ connData['OpenedFiles'][fakefid]['Socket'] = sock
+ else:
+ respSMBCommand = smb2.SMB2Error()
+
+ if errorCode == STATUS_SUCCESS:
+ connData['LastRequest']['SMB2_CREATE'] = respSMBCommand
+ smbServer.setConnectionData(connId, connData)
+
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Close(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Close_Response()
+
+ closeRequest = smb2.SMB2Close(recvPacket['Data'])
+
+ if str(closeRequest['FileID']) == '\xff'*16:
+ # Let's take the data from the lastRequest
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
+ fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
+ else:
+ fileID = str(closeRequest['FileID'])
+ else:
+ fileID = str(closeRequest['FileID'])
+
+ if connData['OpenedFiles'].has_key(fileID):
+ errorCode = STATUS_SUCCESS
+ fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
+ pathName = connData['OpenedFiles'][fileID]['FileName']
+ infoRecord = None
+ try:
+ if fileHandle == PIPE_FILE_DESCRIPTOR:
+ connData['OpenedFiles'][fileID]['Socket'].close()
+ 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:
+ smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
+ errorCode = STATUS_INVALID_HANDLE
+ else:
+ # Check if the file was marked for removal
+ if connData['OpenedFiles'][fileID]['DeleteOnClose'] is True:
+ try:
+ if os.path.isdir(pathName):
+ shutil.rmtree(connData['OpenedFiles'][fileID]['FileName'])
+ else:
+ os.remove(connData['OpenedFiles'][fileID]['FileName'])
+ except Exception, e:
+ smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+
+ # Now fill out the response
+ if infoRecord is not None:
+ respSMBCommand['CreationTime'] = infoRecord['CreationTime']
+ respSMBCommand['LastAccessTime'] = infoRecord['LastAccessTime']
+ respSMBCommand['LastWriteTime'] = infoRecord['LastWriteTime']
+ respSMBCommand['ChangeTime'] = infoRecord['ChangeTime']
+ respSMBCommand['AllocationSize'] = infoRecord['AllocationSize']
+ respSMBCommand['EndofFile'] = infoRecord['EndOfFile']
+ respSMBCommand['FileAttributes'] = infoRecord['FileAttributes']
+ if errorCode == STATUS_SUCCESS:
+ del(connData['OpenedFiles'][fileID])
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2QueryInfo(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2QueryInfo_Response()
+
+ queryInfo = smb2.SMB2QueryInfo(recvPacket['Data'])
+
+ errorCode = STATUS_SUCCESS
+
+ respSMBCommand['OutputBufferOffset'] = 0x48
+ respSMBCommand['Buffer'] = '\x00'
+
+ if str(queryInfo['FileID']) == '\xff'*16:
+ # Let's take the data from the lastRequest
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
+ 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):
+ fileName = connData['OpenedFiles'][fileID]['FileName']
+
+ if queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
+ if queryInfo['FileInfoClass'] == smb2.SMB2_FILE_INTERNAL_INFO:
+ # No need to call queryFileInformation, we have the data here
+ infoRecord = smb2.FileInternalInformation()
+ infoRecord['IndexNumber'] = fileID
+ else:
+ infoRecord, errorCode = queryFileInformation(os.path.dirname(fileName), os.path.basename(fileName), queryInfo['FileInfoClass'])
+ elif queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILESYSTEM:
+ infoRecord = queryFsInformation(os.path.dirname(fileName), os.path.basename(fileName), queryInfo['FileInfoClass'])
+ elif queryInfo['InfoType'] == smb2.SMB2_0_INFO_SECURITY:
+ # Failing for now, until we support it
+ infoRecord = None
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ smbServer.log("queryInfo not supported (%x)" % queryInfo['InfoType'], logging.ERROR)
+
+ if infoRecord is not None:
+ respSMBCommand['OutputBufferLength'] = len(infoRecord)
+ respSMBCommand['Buffer'] = infoRecord
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2SetInfo(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2SetInfo_Response()
+
+ setInfo = smb2.SMB2SetInfo(recvPacket['Data'])
+
+ errorCode = STATUS_SUCCESS
+
+ if str(setInfo['FileID']) == '\xff'*16:
+ # Let's take the data from the lastRequest
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
+ fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
+ else:
+ fileID = str(setInfo['FileID'])
+ else:
+ fileID = str(setInfo['FileID'])
+
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+ path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
+ if connData['OpenedFiles'].has_key(fileID):
+ pathName = connData['OpenedFiles'][fileID]['FileName']
+
+ if setInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
+ # The file information is being set
+ informationLevel = setInfo['FileInfoClass']
+ if informationLevel == smb2.SMB2_FILE_DISPOSITION_INFO:
+ infoRecord = smb.SMBSetFileDispositionInfo(setInfo['Buffer'])
+ if infoRecord['DeletePending'] > 0:
+ # Mark this file for removal after closed
+ connData['OpenedFiles'][fileID]['DeleteOnClose'] = True
+ elif informationLevel == smb2.SMB2_FILE_BASIC_INFO:
+ infoRecord = smb.SMBSetFileBasicInfo(setInfo['Buffer'])
+ # Creation time won't be set, the other ones we play with.
+ atime = infoRecord['LastWriteTime']
+ if atime == 0:
+ atime = -1
+ else:
+ atime = getUnixTime(atime)
+ mtime = infoRecord['ChangeTime']
+ if mtime == 0:
+ mtime = -1
+ else:
+ mtime = getUnixTime(mtime)
+ if atime > 0 and mtime > 0:
+ os.utime(pathName,(atime,mtime))
+ elif informationLevel == smb2.SMB2_FILE_END_OF_FILE_INFO:
+ fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
+ infoRecord = smb.SMBSetFileEndOfFileInfo(setInfo['Buffer'])
+ if infoRecord['EndOfFile'] > 0:
+ os.lseek(fileHandle, infoRecord['EndOfFile']-1, 0)
+ os.write(fileHandle, '\x00')
+ elif informationLevel == smb2.SMB2_FILE_RENAME_INFO:
+ renameInfo = smb2.FILE_RENAME_INFORMATION_TYPE_2(setInfo['Buffer'])
+ newPathName = os.path.join(path,renameInfo['FileName'].decode('utf-16le').replace('\\', '/'))
+ if renameInfo['ReplaceIfExists'] == 0 and os.path.exists(newPathName):
+ return [smb2.SMB2Error()], None, STATUS_OBJECT_NAME_COLLISION
+ try:
+ os.rename(pathName,newPathName)
+ connData['OpenedFiles'][fileID]['FileName'] = newPathName
+ except Exception, e:
+ smbServer.log("smb2SetInfo: %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ smbServer.log('Unknown level for set file info! 0x%x' % informationLevel, logging.ERROR)
+ # UNSUPPORTED
+ errorCode = STATUS_NOT_SUPPORTED
+ #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_FILESYSTEM:
+ # # The underlying object store information is being set.
+ # setInfo = queryFsInformation('/', fileName, queryInfo['FileInfoClass'])
+ #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_SECURITY:
+ # # The security information is being set.
+ # # Failing for now, until we support it
+ # infoRecord = None
+ # errorCode = STATUS_ACCESS_DENIED
+ #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_QUOTA:
+ # # The underlying object store quota information is being set.
+ # setInfo = queryFsInformation('/', fileName, queryInfo['FileInfoClass'])
+ else:
+ smbServer.log("setInfo not supported (%x)" % setInfo['InfoType'], logging.ERROR)
+
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+ else:
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Write(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Write_Response()
+ writeRequest = smb2.SMB2Write(recvPacket['Data'])
+
+ respSMBCommand['Buffer'] = '\x00'
+
+ if str(writeRequest['FileID']) == '\xff'*16:
+ # Let's take the data from the lastRequest
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
+ fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
+ else:
+ fileID = str(writeRequest['FileID'])
+ else:
+ fileID = str(writeRequest['FileID'])
+
+ if connData['OpenedFiles'].has_key(fileID):
+ fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ offset = writeRequest['Offset']
+ # 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:
+ os.lseek(fileHandle,offset,0)
+ os.write(fileHandle,writeRequest['Buffer'])
+ else:
+ sock = connData['OpenedFiles'][fileID]['Socket']
+ sock.send(writeRequest['Buffer'])
+
+ respSMBCommand['Count'] = writeRequest['Length']
+ respSMBCommand['Remaining']= 0xff
+ except Exception, e:
+ smbServer.log('SMB2_WRITE: %s' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Read(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Read_Response()
+ readRequest = smb2.SMB2Read(recvPacket['Data'])
+
+ respSMBCommand['Buffer'] = '\x00'
+
+ if str(readRequest['FileID']) == '\xff'*16:
+ # Let's take the data from the lastRequest
+ if connData['LastRequest'].has_key('SMB2_CREATE'):
+ fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
+ else:
+ fileID = str(readRequest['FileID'])
+ else:
+ fileID = str(readRequest['FileID'])
+
+ if connData['OpenedFiles'].has_key(fileID):
+ fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
+ errorCode = 0
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ offset = readRequest['Offset']
+ os.lseek(fileHandle,offset,0)
+ content = os.read(fileHandle,readRequest['Length'])
+ else:
+ sock = connData['OpenedFiles'][fileID]['Socket']
+ content = sock.recv(readRequest['Length'])
+
+ respSMBCommand['DataOffset'] = 0x50
+ respSMBCommand['DataLength'] = len(content)
+ respSMBCommand['DataRemaining']= 0
+ respSMBCommand['Buffer'] = content
+ except Exception, e:
+ smbServer.log('SMB2_READ: %s ' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Flush(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Flush_Response()
+ flushRequest = smb2.SMB2Flush(recvPacket['Data'])
+
+ if connData['OpenedFiles'].has_key(str(flushRequest['FileID'])):
+ fileHandle = connData['OpenedFiles'][str(flushRequest['FileID'])]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ os.fsync(fileHandle)
+ except Exception, e:
+ smbServer.log("SMB2_FLUSH %s" % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_HANDLE
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+
+ @staticmethod
+ def smb2QueryDirectory(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+ respSMBCommand = smb2.SMB2QueryDirectory_Response()
+ queryDirectoryRequest = smb2.SMB2QueryDirectory(recvPacket['Data'])
+
+ 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:
+ 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'):
+ fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
+ else:
+ fileID = str(queryDirectoryRequest['FileID'])
+ else:
+ fileID = str(queryDirectoryRequest['FileID'])
+
+ if connData['OpenedFiles'].has_key(fileID) is False:
+ return [smb2.SMB2Error()], None, STATUS_FILE_CLOSED
+
+ # If the open is not an open to a directory, the request MUST be failed
+ # with STATUS_INVALID_PARAMETER.
+ if os.path.isdir(connData['OpenedFiles'][fileID]['FileName']) is False:
+ return [smb2.SMB2Error()], None, STATUS_INVALID_PARAMETER
+
+ # If any other information class is specified in the FileInformationClass
+ # field of the SMB2 QUERY_DIRECTORY Request, the server MUST fail the
+ # operation with STATUS_INVALID_INFO_CLASS.
+ if queryDirectoryRequest['FileInformationClass'] not in (
+ smb2.FILE_DIRECTORY_INFORMATION, smb2.FILE_FULL_DIRECTORY_INFORMATION, smb2.FILEID_FULL_DIRECTORY_INFORMATION,
+ smb2.FILE_BOTH_DIRECTORY_INFORMATION, smb2.FILEID_BOTH_DIRECTORY_INFORMATION, smb2.FILENAMES_INFORMATION):
+ return [smb2.SMB2Error()], None, STATUS_INVALID_INFO_CLASS
+
+ # If SMB2_REOPEN is set in the Flags field of the SMB2 QUERY_DIRECTORY
+ # Request, the server SHOULD<326> set Open.EnumerationLocation to 0
+ # and Open.EnumerationSearchPattern to an empty string.
+ if queryDirectoryRequest['Flags'] & smb2.SMB2_REOPEN:
+ connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = 0
+ connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = ''
+
+ # If SMB2_RESTART_SCANS is set in the Flags field of the SMB2
+ # QUERY_DIRECTORY Request, the server MUST set
+ # Open.EnumerationLocation to 0.
+ if queryDirectoryRequest['Flags'] & smb2.SMB2_RESTART_SCANS:
+ connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = 0
+
+ # If Open.EnumerationLocation is 0 and Open.EnumerationSearchPattern
+ # is an empty string, then Open.EnumerationSearchPattern MUST be set
+ # to the search pattern specified in the SMB2 QUERY_DIRECTORY by
+ # FileNameOffset and FileNameLength. If FileNameLength is 0, the server
+ # SHOULD<327> set Open.EnumerationSearchPattern as "*" to search all entries.
+
+ pattern = queryDirectoryRequest['Buffer'].decode('utf-16le')
+ if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] == 0 and \
+ connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] == '':
+ if pattern == '':
+ pattern = '*'
+ connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = pattern
+
+ # If SMB2_INDEX_SPECIFIED is set and FileNameLength is not zero,
+ # the server MUST set Open.EnumerationSearchPattern to the search pattern
+ # specified in the request by FileNameOffset and FileNameLength.
+ if queryDirectoryRequest['Flags'] & smb2.SMB2_INDEX_SPECIFIED and \
+ queryDirectoryRequest['FileNameLength'] > 0:
+ connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = pattern
+
+ pathName = os.path.join(os.path.normpath(connData['OpenedFiles'][fileID]['FileName']),pattern)
+ searchResult, searchCount, errorCode = findFirst2(os.path.dirname(pathName),
+ os.path.basename(pathName),
+ queryDirectoryRequest['FileInformationClass'],
+ smb.ATTR_DIRECTORY, isSMB2 = True )
+
+ if errorCode != STATUS_SUCCESS:
+ return [smb2.SMB2Error()], None, errorCode
+
+ if searchCount > 2 and pattern == '*':
+ # strip . and ..
+ searchCount -= 2
+ searchResult = searchResult[2:]
+
+ if searchCount == 0 and connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] == 0:
+ return [smb2.SMB2Error()], None, STATUS_NO_SUCH_FILE
+
+ if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] < 0:
+ return [smb2.SMB2Error()], None, STATUS_NO_MORE_FILES
+
+ totalData = 0
+ respData = ''
+ for nItem in range(connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'], searchCount):
+ connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] += 1
+ if queryDirectoryRequest['Flags'] & smb2.SL_RETURN_SINGLE_ENTRY:
+ # If single entry is requested we must clear the NextEntryOffset
+ searchResult[nItem]['NextEntryOffset'] = 0
+ data = searchResult[nItem].getData()
+ lenData = len(data)
+ padLen = (8-(lenData % 8)) %8
+
+ if (totalData+lenData) >= queryDirectoryRequest['OutputBufferLength']:
+ connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] -= 1
+ break
+ else:
+ respData += data + '\x00'*padLen
+ totalData += lenData + padLen
+
+ if queryDirectoryRequest['Flags'] & smb2.SL_RETURN_SINGLE_ENTRY:
+ break
+
+ if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] >= searchCount:
+ connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = -1
+
+ respSMBCommand['OutputBufferOffset'] = 0x48
+ respSMBCommand['OutputBufferLength'] = totalData
+ respSMBCommand['Buffer'] = respData
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2ChangeNotify(connId, smbServer, recvPacket):
+
+ return [smb2.SMB2Error()], None, STATUS_NOT_SUPPORTED
+
+ @staticmethod
+ def smb2Echo(connId, smbServer, recvPacket):
+
+ respSMBCommand = smb2.SMB2Echo_Response()
+
+ return [respSMBCommand], None, STATUS_SUCCESS
+
+ @staticmethod
+ def smb2TreeDisconnect(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2TreeDisconnect_Response()
+
+ if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+ smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['TreeID'],connData['ConnectedShares'][recvPacket['TreeID']]['shareName']))
+ del(connData['ConnectedShares'][recvPacket['TreeID']])
+ errorCode = STATUS_SUCCESS
+ else:
+ # STATUS_SMB_BAD_TID
+ errorCode = STATUS_SMB_BAD_TID
+
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Logoff(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Logoff_Response()
+
+ if recvPacket['SessionID'] != connData['Uid']:
+ # STATUS_SMB_BAD_UID
+ errorCode = STATUS_SMB_BAD_UID
+ else:
+ errorCode = STATUS_SUCCESS
+
+ connData['Uid'] = 0
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Ioctl(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Ioctl_Response()
+ ioctlRequest = smb2.SMB2Ioctl(recvPacket['Data'])
+
+ ioctls = smbServer.getIoctls()
+ if ioctls.has_key(ioctlRequest['CtlCode']):
+ outputData, errorCode = ioctls[ioctlRequest['CtlCode']](connId, smbServer, ioctlRequest)
+ if errorCode == STATUS_SUCCESS:
+ respSMBCommand['CtlCode'] = ioctlRequest['CtlCode']
+ respSMBCommand['FileID'] = ioctlRequest['FileID']
+ respSMBCommand['InputOffset'] = 0
+ respSMBCommand['InputCount'] = 0
+ respSMBCommand['OutputOffset'] = 0x70
+ respSMBCommand['OutputCount'] = len(outputData)
+ respSMBCommand['Flags'] = 0
+ respSMBCommand['Buffer'] = outputData
+ else:
+ respSMBCommand = outputData
+ else:
+ smbServer.log("Ioctl not implemented command: 0x%x" % ioctlRequest['CtlCode'],logging.DEBUG)
+ errorCode = STATUS_INVALID_DEVICE_REQUEST
+ respSMBCommand = smb2.SMB2Error()
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Lock(connId, smbServer, recvPacket):
+ connData = smbServer.getConnectionData(connId)
+
+ respSMBCommand = smb2.SMB2Lock_Response()
+
+ # I'm actually doing nothing.. just make MacOS happy ;)
+ errorCode = STATUS_SUCCESS
+
+ smbServer.setConnectionData(connId, connData)
+ return [respSMBCommand], None, errorCode
+
+ @staticmethod
+ def smb2Cancel(connId, smbServer, recvPacket):
+ # I'm actually doing nothing
+ return [smb2.SMB2Error()], None, STATUS_CANCELLED
+
+ @staticmethod
+ def default(connId, smbServer, recvPacket):
+ # By default we return an SMB Packet with error not implemented
+ smbServer.log("Not implemented command: 0x%x" % recvPacket['Command'],logging.DEBUG)
+ return [smb2.SMB2Error()], None, STATUS_NOT_SUPPORTED
+
+class Ioctls:
+ @staticmethod
+ def fsctlDfsGetReferrals(connId, smbServer, ioctlRequest):
+ return smb2.SMB2Error(), STATUS_FS_DRIVER_REQUIRED
+
+ @staticmethod
+ def fsctlPipeTransceive(connId, smbServer, ioctlRequest):
+ connData = smbServer.getConnectionData(connId)
+
+ ioctlResponse = ''
+
+ if connData['OpenedFiles'].has_key(str(ioctlRequest['FileID'])):
+ fileHandle = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['FileHandle']
+ errorCode = STATUS_SUCCESS
+ try:
+ if fileHandle != PIPE_FILE_DESCRIPTOR:
+ errorCode = STATUS_INVALID_DEVICE_REQUEST
+ else:
+ sock = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['Socket']
+ sock.sendall(ioctlRequest['Buffer'])
+ ioctlResponse = sock.recv(ioctlRequest['MaxOutputResponse'])
+ except Exception, e:
+ smbServer.log('fsctlPipeTransceive: %s ' % e, logging.ERROR)
+ errorCode = STATUS_ACCESS_DENIED
+ else:
+ errorCode = STATUS_INVALID_DEVICE_REQUEST
+
+ smbServer.setConnectionData(connId, connData)
+ return ioctlResponse, errorCode
+
+ @staticmethod
+ def fsctlValidateNegotiateInfo(connId, smbServer, ioctlRequest):
+ connData = smbServer.getConnectionData(connId)
+
+ errorCode = STATUS_SUCCESS
+
+ validateNegotiateInfo = smb2.VALIDATE_NEGOTIATE_INFO(ioctlRequest['Buffer'])
+ validateNegotiateInfo['Capabilities'] = 0
+ validateNegotiateInfo['Guid'] = 'A'*16
+ validateNegotiateInfo['SecurityMode'] = 1
+ validateNegotiateInfo['Dialects'] = (smb2.SMB2_DIALECT_002,)
+
+ smbServer.setConnectionData(connId, connData)
+ return validateNegotiateInfo.getData(), errorCode
+
+
+class SMBSERVERHandler(SocketServer.BaseRequestHandler):
+ def __init__(self, request, client_address, server, select_poll = False):
+ self.__SMB = server
+ self.__ip, self.__port = client_address
+ self.__request = request
+ self.__connId = threading.currentThread().getName()
+ self.__timeOut = 60*5
+ self.__select_poll = select_poll
+ #self.__connId = os.getpid()
+ SocketServer.BaseRequestHandler.__init__(self, request, client_address, server)
+
+ def handle(self):
+ self.__SMB.log("Incoming connection (%s,%d)" % (self.__ip, self.__port))
+ self.__SMB.addConnection(self.__connId, self.__ip, self.__port)
+ while True:
+ try:
+ # Firt of all let's get the NETBIOS packet
+ session = nmb.NetBIOSTCPSession(self.__SMB.getServerName(),'HOST', self.__ip, sess_port = self.__port, sock = self.__request, select_poll = self.__select_poll)
+ try:
+ p = session.recv_packet(self.__timeOut)
+ except nmb.NetBIOSTimeout:
+ raise
+ except nmb.NetBIOSError:
+ break
+
+ if p.get_type() == nmb.NETBIOS_SESSION_REQUEST:
+ # Someone is requesting a session, we're gonna accept them all :)
+ _, rn, my = p.get_trailer().split(' ')
+ remote_name = nmb.decode_name('\x20'+rn)
+ myname = nmb.decode_name('\x20'+my)
+ self.__SMB.log("NetBIOS Session request (%s,%s,%s)" % (self.__ip, remote_name[1].strip(), myname[1]))
+ r = nmb.NetBIOSSessionPacket()
+ r.set_type(nmb.NETBIOS_SESSION_POSITIVE_RESPONSE)
+ r.set_trailer(p.get_trailer())
+ self.__request.send(r.rawData())
+ else:
+ resp = self.__SMB.processRequest(self.__connId, p.get_trailer())
+ # Send all the packets recevied. Except for big transactions this should be
+ # a single packet
+ for i in resp:
+ session.send_packet(str(i))
+ except Exception, e:
+ self.__SMB.log("Handle: %s" % e)
+ #import traceback
+ #traceback.print_exc()
+ break
+
+ def finish(self):
+ # Thread/process is dying, we should tell the main SMB thread to remove all this thread data
+ self.__SMB.log("Closing down connection (%s,%d)" % (self.__ip, self.__port))
+ self.__SMB.removeConnection(self.__connId)
+ return SocketServer.BaseRequestHandler.finish(self)
+
+class SMBSERVER(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
+#class SMBSERVER(SocketServer.ForkingMixIn, SocketServer.TCPServer):
+ def __init__(self, server_address, handler_class=SMBSERVERHandler, config_parser = None):
+ SocketServer.TCPServer.allow_reuse_address = True
+ SocketServer.TCPServer.__init__(self, server_address, handler_class)
+
+ # Server name and OS to be presented whenever is necessary
+ self.__serverName = ''
+ self.__serverOS = ''
+ self.__serverDomain = ''
+ self.__challenge = ''
+ self.__log = None
+
+ # Our ConfigParser data
+ self.__serverConfig = config_parser
+
+ # Our credentials to be used during the server's lifetime
+ self.__credentials = {}
+
+ # Our log file
+ self.__logFile = ''
+
+ # Registered Named Pipes, format is PipeName,Socket
+ self.__registeredNamedPipes = {}
+
+ # JTR dump path
+ self.__jtr_dump_path = ''
+
+ # SMB2 Support flag = default not active
+ self.__SMB2Support = False
+
+ # Our list of commands we will answer, by default the NOT IMPLEMENTED one
+ self.__smbCommandsHandler = SMBCommands()
+ self.__smbTrans2Handler = TRANS2Commands()
+ self.__smbTransHandler = TRANSCommands()
+ self.__smbNTTransHandler = NTTRANSCommands()
+ self.__smb2CommandsHandler = SMB2Commands()
+ self.__IoctlHandler = Ioctls()
+
+ self.__smbNTTransCommands = {
+ # NT IOCTL, can't find doc for this
+ 0xff :self.__smbNTTransHandler.default
+ }
+
+ self.__smbTransCommands = {
+'\\PIPE\\LANMAN' :self.__smbTransHandler.lanMan,
+smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe,
+ }
+ self.__smbTrans2Commands = {
+ smb.SMB.TRANS2_FIND_FIRST2 :self.__smbTrans2Handler.findFirst2,
+ smb.SMB.TRANS2_FIND_NEXT2 :self.__smbTrans2Handler.findNext2,
+ smb.SMB.TRANS2_QUERY_FS_INFORMATION :self.__smbTrans2Handler.queryFsInformation,
+ smb.SMB.TRANS2_QUERY_PATH_INFORMATION :self.__smbTrans2Handler.queryPathInformation,
+ smb.SMB.TRANS2_QUERY_FILE_INFORMATION :self.__smbTrans2Handler.queryFileInformation,
+ smb.SMB.TRANS2_SET_FILE_INFORMATION :self.__smbTrans2Handler.setFileInformation,
+ smb.SMB.TRANS2_SET_PATH_INFORMATION :self.__smbTrans2Handler.setPathInformation
+ }
+
+ self.__smbCommands = {
+ #smb.SMB.SMB_COM_FLUSH: self.__smbCommandsHandler.smbComFlush,
+ smb.SMB.SMB_COM_CREATE_DIRECTORY: self.__smbCommandsHandler.smbComCreateDirectory,
+ smb.SMB.SMB_COM_DELETE_DIRECTORY: self.__smbCommandsHandler.smbComDeleteDirectory,
+ smb.SMB.SMB_COM_RENAME: self.__smbCommandsHandler.smbComRename,
+ smb.SMB.SMB_COM_DELETE: self.__smbCommandsHandler.smbComDelete,
+ smb.SMB.SMB_COM_NEGOTIATE: self.__smbCommandsHandler.smbComNegotiate,
+ smb.SMB.SMB_COM_SESSION_SETUP_ANDX: self.__smbCommandsHandler.smbComSessionSetupAndX,
+ smb.SMB.SMB_COM_LOGOFF_ANDX: self.__smbCommandsHandler.smbComLogOffAndX,
+ smb.SMB.SMB_COM_TREE_CONNECT_ANDX: self.__smbCommandsHandler.smbComTreeConnectAndX,
+ smb.SMB.SMB_COM_TREE_DISCONNECT: self.__smbCommandsHandler.smbComTreeDisconnect,
+ smb.SMB.SMB_COM_ECHO: self.__smbCommandsHandler.smbComEcho,
+ smb.SMB.SMB_COM_QUERY_INFORMATION: self.__smbCommandsHandler.smbQueryInformation,
+ smb.SMB.SMB_COM_TRANSACTION2: self.__smbCommandsHandler.smbTransaction2,
+ smb.SMB.SMB_COM_TRANSACTION: self.__smbCommandsHandler.smbTransaction,
+ # Not needed for now
+ smb.SMB.SMB_COM_NT_TRANSACT: self.__smbCommandsHandler.smbNTTransact,
+ smb.SMB.SMB_COM_QUERY_INFORMATION_DISK: self.__smbCommandsHandler.smbQueryInformationDisk,
+ smb.SMB.SMB_COM_OPEN_ANDX: self.__smbCommandsHandler.smbComOpenAndX,
+ smb.SMB.SMB_COM_QUERY_INFORMATION2: self.__smbCommandsHandler.smbComQueryInformation2,
+ smb.SMB.SMB_COM_READ_ANDX: self.__smbCommandsHandler.smbComReadAndX,
+ smb.SMB.SMB_COM_READ: self.__smbCommandsHandler.smbComRead,
+ smb.SMB.SMB_COM_WRITE_ANDX: self.__smbCommandsHandler.smbComWriteAndX,
+ smb.SMB.SMB_COM_WRITE: self.__smbCommandsHandler.smbComWrite,
+ smb.SMB.SMB_COM_CLOSE: self.__smbCommandsHandler.smbComClose,
+ smb.SMB.SMB_COM_LOCKING_ANDX: self.__smbCommandsHandler.smbComLockingAndX,
+ smb.SMB.SMB_COM_NT_CREATE_ANDX: self.__smbCommandsHandler.smbComNtCreateAndX,
+ 0xFF: self.__smbCommandsHandler.default
+}
+
+ self.__smb2Ioctls = {
+ smb2.FSCTL_DFS_GET_REFERRALS: self.__IoctlHandler.fsctlDfsGetReferrals,
+# smb2.FSCTL_PIPE_PEEK: self.__IoctlHandler.fsctlPipePeek,
+# smb2.FSCTL_PIPE_WAIT: self.__IoctlHandler.fsctlPipeWait,
+ smb2.FSCTL_PIPE_TRANSCEIVE: self.__IoctlHandler.fsctlPipeTransceive,
+# smb2.FSCTL_SRV_COPYCHUNK: self.__IoctlHandler.fsctlSrvCopyChunk,
+# smb2.FSCTL_SRV_ENUMERATE_SNAPSHOTS: self.__IoctlHandler.fsctlSrvEnumerateSnapshots,
+# smb2.FSCTL_SRV_REQUEST_RESUME_KEY: self.__IoctlHandler.fsctlSrvRequestResumeKey,
+# smb2.FSCTL_SRV_READ_HASH: self.__IoctlHandler.fsctlSrvReadHash,
+# smb2.FSCTL_SRV_COPYCHUNK_WRITE: self.__IoctlHandler.fsctlSrvCopyChunkWrite,
+# smb2.FSCTL_LMR_REQUEST_RESILIENCY: self.__IoctlHandler.fsctlLmrRequestResiliency,
+# smb2.FSCTL_QUERY_NETWORK_INTERFACE_INFO: self.__IoctlHandler.fsctlQueryNetworkInterfaceInfo,
+# smb2.FSCTL_SET_REPARSE_POINT: self.__IoctlHandler.fsctlSetReparsePoint,
+# smb2.FSCTL_DFS_GET_REFERRALS_EX: self.__IoctlHandler.fsctlDfsGetReferralsEx,
+# smb2.FSCTL_FILE_LEVEL_TRIM: self.__IoctlHandler.fsctlFileLevelTrim,
+ smb2.FSCTL_VALIDATE_NEGOTIATE_INFO: self.__IoctlHandler.fsctlValidateNegotiateInfo,
+}
+
+ self.__smb2Commands = {
+ smb2.SMB2_NEGOTIATE: self.__smb2CommandsHandler.smb2Negotiate,
+ smb2.SMB2_SESSION_SETUP: self.__smb2CommandsHandler.smb2SessionSetup,
+ smb2.SMB2_LOGOFF: self.__smb2CommandsHandler.smb2Logoff,
+ smb2.SMB2_TREE_CONNECT: self.__smb2CommandsHandler.smb2TreeConnect,
+ smb2.SMB2_TREE_DISCONNECT: self.__smb2CommandsHandler.smb2TreeDisconnect,
+ smb2.SMB2_CREATE: self.__smb2CommandsHandler.smb2Create,
+ smb2.SMB2_CLOSE: self.__smb2CommandsHandler.smb2Close,
+ smb2.SMB2_FLUSH: self.__smb2CommandsHandler.smb2Flush,
+ smb2.SMB2_READ: self.__smb2CommandsHandler.smb2Read,
+ smb2.SMB2_WRITE: self.__smb2CommandsHandler.smb2Write,
+ smb2.SMB2_LOCK: self.__smb2CommandsHandler.smb2Lock,
+ smb2.SMB2_IOCTL: self.__smb2CommandsHandler.smb2Ioctl,
+ smb2.SMB2_CANCEL: self.__smb2CommandsHandler.smb2Cancel,
+ smb2.SMB2_ECHO: self.__smb2CommandsHandler.smb2Echo,
+ smb2.SMB2_QUERY_DIRECTORY: self.__smb2CommandsHandler.smb2QueryDirectory,
+ smb2.SMB2_CHANGE_NOTIFY: self.__smb2CommandsHandler.smb2ChangeNotify,
+ smb2.SMB2_QUERY_INFO: self.__smb2CommandsHandler.smb2QueryInfo,
+ smb2.SMB2_SET_INFO: self.__smb2CommandsHandler.smb2SetInfo,
+# smb2.SMB2_OPLOCK_BREAK: self.__smb2CommandsHandler.smb2SessionSetup,
+ 0xFF: self.__smb2CommandsHandler.default
+}
+
+ # List of active connections
+ self.__activeConnections = {}
+
+ def getIoctls(self):
+ return self.__smb2Ioctls
+
+ def getCredentials(self):
+ return self.__credentials
+
+ def removeConnection(self, name):
+ try:
+ del(self.__activeConnections[name])
+ except:
+ pass
+ self.log("Remaining connections %s" % self.__activeConnections.keys())
+
+ def addConnection(self, name, ip, port):
+ self.__activeConnections[name] = {}
+ # Let's init with some know stuff we will need to have
+ # TODO: Document what's in there
+ #print "Current Connections", self.__activeConnections.keys()
+ self.__activeConnections[name]['PacketNum'] = 0
+ self.__activeConnections[name]['ClientIP'] = ip
+ self.__activeConnections[name]['ClientPort'] = port
+ self.__activeConnections[name]['Uid'] = 0
+ self.__activeConnections[name]['ConnectedShares'] = {}
+ self.__activeConnections[name]['OpenedFiles'] = {}
+ # SID results for findfirst2
+ self.__activeConnections[name]['SIDs'] = {}
+ self.__activeConnections[name]['LastRequest'] = {}
+
+ def getActiveConnections(self):
+ return self.__activeConnections
+
+ def setConnectionData(self, connId, data):
+ self.__activeConnections[connId] = data
+ #print "setConnectionData"
+ #print self.__activeConnections
+
+ def getConnectionData(self, connId, checkStatus = True):
+ conn = self.__activeConnections[connId]
+ if checkStatus is True:
+ if conn.has_key('Authenticated') is not True:
+ # Can't keep going further
+ raise Exception("User not Authenticated!")
+ return conn
+
+ def getRegisteredNamedPipes(self):
+ return self.__registeredNamedPipes
+
+ def registerNamedPipe(self, pipeName, address):
+ self.__registeredNamedPipes[unicode(pipeName)] = address
+ return True
+
+ def unregisterNamedPipe(self, pipeName):
+ if self.__registeredNamedPipes.has_key(pipeName):
+ del(self.__registeredNamedPipes[unicode(pipeName)])
+ return True
+ return False
+
+ def unregisterTransaction(self, transCommand):
+ if self.__smbTransCommands.has_key(transCommand):
+ del(self.__smbTransCommands[transCommand])
+
+ def hookTransaction(self, transCommand, callback):
+ # If you call this function, callback will replace
+ # the current Transaction sub command.
+ # (don't get confused with the Transaction smbCommand)
+ # If the transaction sub command doesn't not exist, it is added
+ # If the transaction sub command exists, it returns the original function # replaced
+ #
+ # callback MUST be declared as:
+ # callback(connId, smbServer, recvPacket, parameters, data, maxDataCount=0)
+ #
+ # WHERE:
+ #
+ # connId : the connection Id, used to grab/update information about
+ # the current connection
+ # smbServer : the SMBServer instance available for you to ask
+ # configuration data
+ # recvPacket : the full SMBPacket that triggered this command
+ # parameters : the transaction parameters
+ # data : the transaction data
+ # maxDataCount: the max amount of data that can be transfered agreed
+ # with the client
+ #
+ # and MUST return:
+ # respSetup, respParameters, respData, errorCode
+ #
+ # WHERE:
+ #
+ # respSetup: the setup response of the transaction
+ # respParameters: the parameters response of the transaction
+ # respData: the data reponse of the transaction
+ # errorCode: the NT error code
+
+ if self.__smbTransCommands.has_key(transCommand):
+ originalCommand = self.__smbTransCommands[transCommand]
+ else:
+ originalCommand = None
+
+ self.__smbTransCommands[transCommand] = callback
+ return originalCommand
+
+ def unregisterTransaction2(self, transCommand):
+ if self.__smbTrans2Commands.has_key(transCommand):
+ 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):
+ originalCommand = self.__smbTrans2Commands[transCommand]
+ else:
+ originalCommand = None
+
+ self.__smbTrans2Commands[transCommand] = callback
+ return originalCommand
+
+ def unregisterNTTransaction(self, transCommand):
+ if self.__smbNTTransCommands.has_key(transCommand):
+ 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):
+ originalCommand = self.__smbNTTransCommands[transCommand]
+ else:
+ originalCommand = None
+
+ self.__smbNTTransCommands[transCommand] = callback
+ return originalCommand
+
+ def unregisterSmbCommand(self, smbCommand):
+ if self.__smbCommands.has_key(smbCommand):
+ del(self.__smbCommands[smbCommand])
+
+ def hookSmbCommand(self, smbCommand, callback):
+ # Here we should add to self.__smbCommands
+ # If you call this function, callback will replace
+ # the current smbCommand.
+ # If smbCommand doesn't not exist, it is added
+ # If SMB command exists, it returns the original function replaced
+ #
+ # callback MUST be declared as:
+ # callback(connId, smbServer, SMBCommand, recvPacket)
+ #
+ # WHERE:
+ #
+ # connId : the connection Id, used to grab/update information about
+ # the current connection
+ # smbServer : the SMBServer instance available for you to ask
+ # configuration data
+ # SMBCommand: the SMBCommand itself, with its data and parameters.
+ # Check smb.py:SMBCommand() for a reference
+ # recvPacket: the full SMBPacket that triggered this command
+ #
+ # and MUST return:
+ # <list of respSMBCommands>, <list of packets>, errorCode
+ # <list of packets> has higher preference over commands, in case you
+ # want to change the whole packet
+ # errorCode: the NT error code
+ #
+ # For SMB_COM_TRANSACTION2, SMB_COM_TRANSACTION and SMB_COM_NT_TRANSACT
+ # the callback function is slightly different:
+ #
+ # callback(connId, smbServer, SMBCommand, recvPacket, transCommands)
+ #
+ # WHERE:
+ #
+ # transCommands: a list of transaction subcommands already registered
+ #
+
+ if self.__smbCommands.has_key(smbCommand):
+ originalCommand = self.__smbCommands[smbCommand]
+ else:
+ originalCommand = None
+
+ self.__smbCommands[smbCommand] = callback
+ return originalCommand
+
+ def unregisterSmb2Command(self, smb2Command):
+ if self.__smb2Commands.has_key(smb2Command):
+ del(self.__smb2Commands[smb2Command])
+
+ def hookSmb2Command(self, smb2Command, callback):
+ if self.__smb2Commands.has_key(smb2Command):
+ originalCommand = self.__smb2Commands[smb2Command]
+ else:
+ originalCommand = None
+
+ self.__smb2Commands[smb2Command] = callback
+ return originalCommand
+
+ def log(self, msg, level=logging.INFO):
+ self.__log.log(level,msg)
+
+ def getServerName(self):
+ return self.__serverName
+
+ def getServerOS(self):
+ return self.__serverOS
+
+ def getServerDomain(self):
+ return self.__serverDomain
+
+ def getSMBChallenge(self):
+ return self.__challenge
+
+ def getServerConfig(self):
+ return self.__serverConfig
+
+ def setServerConfig(self, config):
+ self.__serverConfig = config
+
+ def getJTRdumpPath(self):
+ return self.__jtr_dump_path
+
+ def verify_request(self, request, client_address):
+ # TODO: Control here the max amount of processes we want to launch
+ # returning False, closes the connection
+ return True
+
+ def processRequest(self, connId, data):
+
+ # TODO: Process batched commands.
+ isSMB2 = False
+ SMBCommand = None
+ try:
+ packet = smb.NewSMBPacket(data = data)
+ SMBCommand = smb.SMBCommand(packet['Data'][0])
+ except:
+ # Maybe a SMB2 packet?
+ packet = smb2.SMB2Packet(data = data)
+ isSMB2 = True
+
+ # We might have compound requests
+ compoundedPacketsResponse = []
+ compoundedPackets = []
+ try:
+ # Search out list of implemented commands
+ # We provide them with:
+ # connId : representing the data for this specific connection
+ # self : the SMBSERVER if they want to ask data to it
+ # SMBCommand : the SMBCommand they are expecting to process
+ # packet : the received packet itself, in case they need more data than the actual command
+ # Only for Transactions
+ # transCommand: a list of transaction subcommands
+ # We expect to get:
+ # respCommands: a list of answers for the commands processed
+ # respPacket : if the commands chose to directly craft packet/s, we use this and not the previous
+ # this MUST be a list
+ # errorCode : self explanatory
+ if isSMB2 is False:
+ if packet['Command'] == smb.SMB.SMB_COM_TRANSACTION2:
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet,
+ self.__smbTrans2Commands)
+ elif packet['Command'] == smb.SMB.SMB_COM_NT_TRANSACT:
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet,
+ self.__smbNTTransCommands)
+ elif packet['Command'] == smb.SMB.SMB_COM_TRANSACTION:
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet,
+ self.__smbTransCommands)
+ else:
+ if self.__smbCommands.has_key(packet['Command']):
+ 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:
+ self.log('SMB2_NEGOTIATE: %s' % e, logging.ERROR)
+ # If something went wrong, let's fallback to SMB1
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet)
+ #self.__SMB2Support = False
+ pass
+ else:
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet)
+ else:
+ respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
+ connId,
+ self,
+ SMBCommand,
+ packet)
+ else:
+ respCommands, respPackets, errorCode = self.__smbCommands[255](connId, self, SMBCommand, packet)
+
+ compoundedPacketsResponse.append((respCommands, respPackets, errorCode))
+ compoundedPackets.append(packet)
+
+ else:
+ done = False
+ while not done:
+ if self.__smb2Commands.has_key(packet['Command']):
+ if self.__SMB2Support is True:
+ respCommands, respPackets, errorCode = self.__smb2Commands[packet['Command']](
+ connId,
+ self,
+ packet)
+ else:
+ respCommands, respPackets, errorCode = self.__smb2Commands[255](connId, self, packet)
+ else:
+ respCommands, respPackets, errorCode = self.__smb2Commands[255](connId, self, packet)
+ # Let's store the result for this compounded packet
+ compoundedPacketsResponse.append((respCommands, respPackets, errorCode))
+ compoundedPackets.append(packet)
+ if packet['NextCommand'] != 0:
+ data = data[packet['NextCommand']:]
+ packet = smb2.SMB2Packet(data = data)
+ else:
+ done = True
+
+ except Exception, e:
+ #import traceback
+ #traceback.print_exc()
+ # Something wen't wrong, defaulting to Bad user ID
+ self.log('processRequest (0x%x,%s)' % (packet['Command'],e), logging.ERROR)
+ raise
+
+ # We prepare the response packet to commands don't need to bother about that.
+ connData = self.getConnectionData(connId, False)
+
+ # Force reconnection loop.. This is just a test.. client will send me back credentials :)
+ #connData['PacketNum'] += 1
+ #if connData['PacketNum'] == 15:
+ # connData['PacketNum'] = 0
+ # # Something wen't wrong, defaulting to Bad user ID
+ # self.log('Sending BAD USER ID!', logging.ERROR)
+ # #raise
+ # packet['Flags1'] |= smb.SMB.FLAGS1_REPLY
+ # packet['Flags2'] = 0
+ # errorCode = STATUS_SMB_BAD_UID
+ # packet['ErrorCode'] = errorCode >> 16
+ # packet['ErrorClass'] = errorCode & 0xff
+ # return [packet]
+
+ self.setConnectionData(connId, connData)
+
+ packetsToSend = []
+ for packetNum in range(len(compoundedPacketsResponse)):
+ respCommands, respPackets, errorCode = compoundedPacketsResponse[packetNum]
+ packet = compoundedPackets[packetNum]
+ if respPackets is None:
+ for respCommand in respCommands:
+ if isSMB2 is False:
+ respPacket = smb.NewSMBPacket()
+ respPacket['Flags1'] = smb.SMB.FLAGS1_REPLY
+
+ # TODO this should come from a per session configuration
+ respPacket['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES | packet['Flags2'] & smb.SMB.FLAGS2_UNICODE
+ #respPacket['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES
+ #respPacket['Flags1'] = 0x98
+ #respPacket['Flags2'] = 0xc807
+
+
+ respPacket['Tid'] = packet['Tid']
+ respPacket['Mid'] = packet['Mid']
+ respPacket['Pid'] = packet['Pid']
+ respPacket['Uid'] = connData['Uid']
+
+ respPacket['ErrorCode'] = errorCode >> 16
+ respPacket['_reserved'] = errorCode >> 8 & 0xff
+ respPacket['ErrorClass'] = errorCode & 0xff
+ respPacket.addCommand(respCommand)
+
+ packetsToSend.append(respPacket)
+ else:
+ respPacket = smb2.SMB2Packet()
+ respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
+ if packetNum > 0:
+ respPacket['Flags'] |= smb2.SMB2_FLAGS_RELATED_OPERATIONS
+ respPacket['Status'] = errorCode
+ respPacket['CreditRequestResponse'] = packet['CreditRequestResponse']
+ respPacket['Command'] = packet['Command']
+ respPacket['CreditCharge'] = packet['CreditCharge']
+ #respPacket['CreditCharge'] = 0
+ respPacket['Reserved'] = packet['Reserved']
+ respPacket['SessionID'] = connData['Uid']
+ respPacket['MessageID'] = packet['MessageID']
+ respPacket['TreeID'] = packet['TreeID']
+ respPacket['Data'] = str(respCommand)
+ packetsToSend.append(respPacket)
+ else:
+ # The SMBCommand took care of building the packet
+ packetsToSend = respPackets
+
+ if isSMB2 is True:
+ # Let's build a compound answer
+ finalData = ''
+ i = 0
+ for i in range(len(packetsToSend)-1):
+ packet = packetsToSend[i]
+ # Align to 8-bytes
+ padLen = (8 - (len(packet) % 8) ) % 8
+ packet['NextCommand'] = len(packet) + padLen
+ finalData += str(packet) + padLen*'\x00'
+
+ # Last one
+ finalData += str(packetsToSend[len(packetsToSend)-1])
+ packetsToSend = [finalData]
+
+ # We clear the compound requests
+ connData['LastRequest'] = {}
+
+ return packetsToSend
+
+ def processConfigFile(self, configFile = None):
+ # TODO: Do a real config parser
+ if self.__serverConfig is None:
+ if configFile is None:
+ configFile = 'smb.conf'
+ self.__serverConfig = ConfigParser.ConfigParser()
+ self.__serverConfig.read(configFile)
+
+ self.__serverName = self.__serverConfig.get('global','server_name')
+ self.__serverOS = self.__serverConfig.get('global','server_os')
+ self.__serverDomain = self.__serverConfig.get('global','server_domain')
+ self.__logFile = self.__serverConfig.get('global','log_file')
+ if self.__serverConfig.has_option('global', 'challenge'):
+ self.__challenge = self.__serverConfig.get('global', 'challenge')
+ else:
+ self.__challenge = 'A'*8
+
+ if self.__serverConfig.has_option("global", "jtr_dump_path"):
+ self.__jtr_dump_path = self.__serverConfig.get("global", "jtr_dump_path")
+
+ if self.__serverConfig.has_option("global", "SMB2Support"):
+ self.__SMB2Support = self.__serverConfig.getboolean("global","SMB2Support")
+ else:
+ self.__SMB2Support = False
+
+ if self.__logFile != 'None':
+ logging.basicConfig(filename = self.__logFile,
+ level = logging.DEBUG,
+ format="%(asctime)s: %(levelname)s: %(message)s",
+ datefmt = '%m/%d/%Y %I:%M:%S %p')
+ self.__log = LOG
+
+ # Process the credentials
+ credentials_fname = self.__serverConfig.get('global','credentials_file')
+ if credentials_fname is not "":
+ cred = open(credentials_fname)
+ line = cred.readline()
+ while line:
+ name, domain, lmhash, nthash = line.split(':')
+ self.__credentials[name] = (domain, lmhash, nthash.strip('\r\n'))
+ line = cred.readline()
+ cred.close()
+ self.log('Config file parsed')
+
+# For windows platforms, opening a directory is not an option, so we set a void FD
+VOID_FILE_DESCRIPTOR = -1
+PIPE_FILE_DESCRIPTOR = -2
diff --git a/tests/python_dependencies/impacket/spnego.py b/tests/python_dependencies/impacket/spnego.py
new file mode 100644
index 00000000..f177d18f
--- /dev/null
+++ b/tests/python_dependencies/impacket/spnego.py
@@ -0,0 +1,372 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Author: Alberto Solino (beto@coresecurity.com)
+#
+# Description:
+# SPNEGO functions used by SMB, SMB2/3 and DCERPC
+#
+
+from struct import pack, unpack, calcsize
+
+############### GSS Stuff ################
+GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
+ASN1_SEQUENCE = 0x30
+ASN1_AID = 0x60
+ASN1_OID = 0x06
+ASN1_OCTET_STRING = 0x04
+ASN1_MECH_TYPE = 0xa0
+ASN1_MECH_TOKEN = 0xa2
+ASN1_SUPPORTED_MECH = 0xa1
+ASN1_RESPONSE_TOKEN = 0xa2
+ASN1_ENUMERATED = 0x0a
+MechTypes = {
+'+\x06\x01\x04\x01\x827\x02\x02\x1e': 'SNMPv2-SMI::enterprises.311.2.2.30',
+'+\x06\x01\x04\x01\x827\x02\x02\n': 'NTLMSSP - Microsoft NTLM Security Support Provider',
+'*\x86H\x82\xf7\x12\x01\x02\x02': 'MS KRB5 - Microsoft Kerberos 5',
+'*\x86H\x86\xf7\x12\x01\x02\x02': 'KRB5 - Kerberos 5',
+'*\x86H\x86\xf7\x12\x01\x02\x02\x03': 'KRB5 - Kerberos 5 - User to User'
+}
+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)
+
+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
+
+class GSSAPI:
+# Generic GSSAPI Header Format
+ def __init__(self, data = None):
+ self.fields = {}
+ self['UUID'] = GSS_API_SPNEGO_UUID
+ if data:
+ self.fromString(data)
+ pass
+
+ def __setitem__(self,key,value):
+ self.fields[key] = value
+
+ def __getitem__(self, key):
+ return self.fields[key]
+
+ def __delitem__(self, key):
+ del self.fields[key]
+
+ def __len__(self):
+ return len(self.getData())
+
+ def __str__(self):
+ return len(self.getData())
+
+ def fromString(self, data = None):
+ # Manual parse of the GSSAPI Header Format
+ # It should be something like
+ # AID = 0x60 TAG, BER Length
+ # OID = 0x06 TAG
+ # GSSAPI OID
+ # UUID data (BER Encoded)
+ # Payload
+ next_byte = unpack('B',data[:1])[0]
+ if next_byte != ASN1_AID:
+ raise Exception('Unknown AID=%x' % next_byte)
+ data = data[1:]
+ decode_data, total_bytes = asn1decode(data)
+ # Now we should have a OID tag
+ 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)
+ 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])
+
+ def getData(self):
+ ans = pack('B',ASN1_AID)
+ ans += asn1encode(
+ pack('B',ASN1_OID) +
+ asn1encode(self['UUID']) +
+ self['Payload'] )
+ return ans
+
+class SPNEGO_NegTokenResp:
+ # http://tools.ietf.org/html/rfc4178#page-9
+ # NegTokenResp ::= SEQUENCE {
+ # negState [0] ENUMERATED {
+ # accept-completed (0),
+ # accept-incomplete (1),
+ # reject (2),
+ # request-mic (3)
+ # } OPTIONAL,
+ # -- REQUIRED in the first reply from the target
+ # supportedMech [1] MechType OPTIONAL,
+ # -- present only in the first reply from the target
+ # responseToken [2] OCTET STRING OPTIONAL,
+ # mechListMIC [3] OCTET STRING OPTIONAL,
+ # ...
+ # }
+ # This structure is not prepended by a GSS generic header!
+ SPNEGO_NEG_TOKEN_RESP = 0xa1
+ SPNEGO_NEG_TOKEN_TARG = 0xa0
+
+ def __init__(self, data = None):
+ self.fields = {}
+ if data:
+ self.fromString(data)
+ pass
+
+ def __setitem__(self,key,value):
+ self.fields[key] = value
+
+ def __getitem__(self, key):
+ return self.fields[key]
+
+ def __delitem__(self, key):
+ del self.fields[key]
+
+ def __len__(self):
+ return len(self.getData())
+
+ def __str__(self):
+ return len(self.getData())
+
+ def fromString(self, data = 0):
+ payload = data
+ next_byte = unpack('B', payload[:1])[0]
+ if next_byte != SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP:
+ raise Exception('NegTokenResp not found %x' % next_byte)
+ payload = payload[1:]
+ decode_data, total_bytes = asn1decode(payload)
+ 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:]
+ decode_data, total_bytes = asn1decode(decode_data)
+ next_byte = unpack('B',decode_data[:1])[0]
+
+ 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)
+ else:
+ decode_data2 = decode_data[1:]
+ decode_data2, total_bytes = asn1decode(decode_data2)
+ next_byte = unpack('B', decode_data2[:1])[0]
+ if next_byte != ASN1_ENUMERATED:
+ raise Exception('Enumerated tag not found %x' % next_byte)
+ item, total_bytes2 = asn1decode(decode_data)
+ self['NegResult'] = item
+ decode_data = decode_data[1:]
+ decode_data = decode_data[total_bytes:]
+
+ # Do we have more data?
+ if len(decode_data) == 0:
+ return
+
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte != ASN1_SUPPORTED_MECH:
+ if next_byte != ASN1_RESPONSE_TOKEN:
+ raise Exception('Supported Mech/ResponseToken tag not found %x' % next_byte)
+ else:
+ decode_data2 = decode_data[1:]
+ decode_data2, total_bytes = asn1decode(decode_data2)
+ next_byte = unpack('B', decode_data2[:1])[0]
+ if next_byte != ASN1_OID:
+ raise Exception('OID tag not found %x' % next_byte)
+ decode_data2 = decode_data2[1:]
+ item, total_bytes2 = asn1decode(decode_data2)
+ self['SuportedMech'] = item
+
+ decode_data = decode_data[1:]
+ decode_data = decode_data[total_bytes:]
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte != ASN1_RESPONSE_TOKEN:
+ raise Exception('Response token tag not found %x' % next_byte)
+
+ decode_data = decode_data[1:]
+ decode_data, total_bytes = asn1decode(decode_data)
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte != ASN1_OCTET_STRING:
+ raise Exception('Octet string token tag not found %x' % next_byte)
+ decode_data = decode_data[1:]
+ decode_data, total_bytes = asn1decode(decode_data)
+ self['ResponseToken'] = decode_data
+
+ def dump(self):
+ for i in self.fields.keys():
+ 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'):
+ # Server resp
+ ans += asn1encode(
+ pack('B', ASN1_SEQUENCE) +
+ asn1encode(
+ pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
+ asn1encode(
+ pack('B',ASN1_ENUMERATED) +
+ asn1encode( self['NegResult'] )) +
+ pack('B',ASN1_SUPPORTED_MECH) +
+ 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'):
+ # Server resp
+ ans += asn1encode(
+ pack('B', ASN1_SEQUENCE) +
+ asn1encode(
+ pack('B', SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
+ asn1encode(
+ pack('B',ASN1_ENUMERATED) +
+ asn1encode( self['NegResult'] ))))
+ else:
+ # Client resp
+ ans += asn1encode(
+ pack('B', ASN1_SEQUENCE) +
+ asn1encode(
+ pack('B', ASN1_RESPONSE_TOKEN) +
+ asn1encode(
+ pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
+ return ans
+
+class SPNEGO_NegTokenInit(GSSAPI):
+ # http://tools.ietf.org/html/rfc4178#page-8
+ # NegTokeInit :: = SEQUENCE {
+ # mechTypes [0] MechTypeList,
+ # reqFlags [1] ContextFlags 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]
+ 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]
+ if next_byte != ASN1_SEQUENCE:
+ raise Exception('SEQUENCE tag not found %x' % next_byte)
+ decode_data = decode_data[1:]
+ decode_data, total_bytes2 = asn1decode(decode_data)
+ next_byte = unpack('B',decode_data[:1])[0]
+ if next_byte != ASN1_MECH_TYPE:
+ raise Exception('MechType tag not found %x' % next_byte)
+ decode_data = decode_data[1:]
+ remaining_data = decode_data
+ decode_data, total_bytes3 = asn1decode(decode_data)
+ 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:]
+ decode_data, total_bytes4 = asn1decode(decode_data)
+ # 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:]
+
+ # Do we have MechTokens as well?
+ decode_data = remaining_data[total_bytes3:]
+ if len(decode_data) > 0:
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte == ASN1_MECH_TOKEN:
+ # We have tokens in here!
+ decode_data = decode_data[1:]
+ decode_data, total_bytes = asn1decode(decode_data)
+ next_byte = unpack('B', decode_data[:1])[0]
+ if next_byte == ASN1_OCTET_STRING:
+ decode_data = decode_data[1:]
+ decode_data, total_bytes = asn1decode(decode_data)
+ self['MechToken'] = decode_data
+
+ def getData(self):
+ mechTypes = ''
+ for i in self['MechTypes']:
+ mechTypes += pack('B', ASN1_OID)
+ mechTypes += asn1encode(i)
+
+ mechToken = ''
+ # Do we have tokens to send?
+ if self.fields.has_key('MechToken'):
+ mechToken = pack('B', ASN1_MECH_TOKEN) + asn1encode(
+ pack('B', ASN1_OCTET_STRING) + asn1encode(
+ self['MechToken']))
+
+ ans = pack('B',SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT)
+ ans += asn1encode(
+ pack('B', ASN1_SEQUENCE) +
+ asn1encode(
+ pack('B', ASN1_MECH_TYPE) +
+ asn1encode(
+ pack('B', ASN1_SEQUENCE) +
+ asn1encode(mechTypes)) + mechToken ))
+
+
+ self['Payload'] = ans
+ return GSSAPI.getData(self)
+
diff --git a/tests/python_dependencies/impacket/structure.py b/tests/python_dependencies/impacket/structure.py
new file mode 100644
index 00000000..7a04117f
--- /dev/null
+++ b/tests/python_dependencies/impacket/structure.py
@@ -0,0 +1,743 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+
+from struct import pack, unpack, calcsize
+
+class Structure:
+ """ sublcasses can define commonHdr and/or structure.
+ each of them is an tuple of either two: (fieldName, format) or three: (fieldName, ':', class) fields.
+ [it can't be a dictionary, because order is important]
+
+ where format specifies how the data in the field will be converted to/from bytes (string)
+ class is the class to use when unpacking ':' fields.
+
+ each field can only contain one value (or an array of values for *)
+ i.e. struct.pack('Hl',1,2) is valid, but format specifier 'Hl' is not (you must use 2 dfferent fields)
+
+ format specifiers:
+ specifiers from module pack can be used with the same format
+ see struct.__doc__ (pack/unpack is finally called)
+ x [padding byte]
+ c [character]
+ b [signed byte]
+ B [unsigned byte]
+ h [signed short]
+ H [unsigned short]
+ l [signed long]
+ L [unsigned long]
+ i [signed integer]
+ I [unsigned integer]
+ q [signed long long (quad)]
+ Q [unsigned long long (quad)]
+ s [string (array of chars), must be preceded with length in format specifier, padded with zeros]
+ p [pascal string (includes byte count), must be preceded with length in format specifier, padded with zeros]
+ f [float]
+ d [double]
+ = [native byte ordering, size and alignment]
+ @ [native byte ordering, standard size and alignment]
+ ! [network byte ordering]
+ < [little endian]
+ > [big endian]
+
+ usual printf like specifiers can be used (if started with %)
+ [not recommeneded, there is no why to unpack this]
+
+ %08x will output an 8 bytes hex
+ %s will output a string
+ %s\\x00 will output a NUL terminated string
+ %d%d will output 2 decimal digits (against the very same specification of Structure)
+ ...
+
+ some additional format specifiers:
+ : just copy the bytes from the field into the output string (input may be string, other structure, or anything responding to __str__()) (for unpacking, all what's left is returned)
+ z same as :, but adds a NUL byte at the end (asciiz) (for unpacking the first NUL byte is used as terminator) [asciiz string]
+ u same as z, but adds two NUL bytes at the end (after padding to an even size with NULs). (same for unpacking) [unicode string]
+ w DCE-RPC/NDR string (it's a macro for [ '<L=(len(field)+1)/2','"\\x00\\x00\\x00\\x00','<L=(len(field)+1)/2',':' ]
+ ?-field length of field named 'field', formated as specified with ? ('?' may be '!H' for example). The input value overrides the real length
+ ?1*?2 array of elements. Each formated as '?2', the number of elements in the array is stored as specified by '?1' (?1 is optional, or can also be a constant (number), for unpacking)
+ 'xxxx literal xxxx (field's value doesn't change the output. quotes must not be closed or escaped)
+ "xxxx literal xxxx (field's value doesn't change the output. quotes must not be closed or escaped)
+ _ will not pack the field. Accepts a third argument, which is an unpack code. See _Test_UnpackCode for an example
+ ?=packcode will evaluate packcode in the context of the structure, and pack the result as specified by ?. Unpacking is made plain
+ ?&fieldname "Address of field fieldname".
+ For packing it will simply pack the id() of fieldname. Or use 0 if fieldname doesn't exists.
+ For unpacking, it's used to know weather fieldname has to be unpacked or not, i.e. by adding a & field you turn another field (fieldname) in an optional field.
+
+ """
+ commonHdr = ()
+ structure = ()
+ debug = 0
+
+ def __init__(self, data = None, alignment = 0):
+ if not hasattr(self, 'alignment'):
+ self.alignment = alignment
+
+ self.fields = {}
+ self.rawData = data
+ if data is not None:
+ self.fromString(data)
+ else:
+ self.data = None
+
+ @classmethod
+ def fromFile(self, file):
+ answer = self()
+ answer.fromString(file.read(len(answer)))
+ return answer
+
+ def setAlignment(self, alignment):
+ self.alignment = alignment
+
+ def setData(self, data):
+ self.data = data
+
+ def packField(self, fieldName, format = None):
+ if self.debug:
+ print "packField( %s | %s )" % (fieldName, format)
+
+ if format is None:
+ format = self.formatForField(fieldName)
+
+ if self.fields.has_key(fieldName):
+ ans = self.pack(format, self.fields[fieldName], field = fieldName)
+ else:
+ ans = self.pack(format, None, field = fieldName)
+
+ if self.debug:
+ print "\tanswer %r" % ans
+
+ return ans
+
+ def getData(self):
+ if self.data is not None:
+ return self.data
+ data = ''
+ 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]):
+ 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__),)
+ raise
+ if self.alignment:
+ if len(data) % self.alignment:
+ data += ('\x00'*self.alignment)[:-(len(data) % self.alignment)]
+
+ #if len(data) % self.alignment: data += ('\x00'*self.alignment)[:-(len(data) % self.alignment)]
+ return data
+
+ def fromString(self, data):
+ self.rawData = data
+ for field in self.commonHdr+self.structure:
+ if self.debug:
+ 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
+ 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:
+ e.args += ("When unpacking field '%s | %s | %r[:%d]'" % (field[0], field[1], data, size),)
+ raise
+
+ size = self.calcPackSize(field[1], self[field[0]], field[0])
+ if self.alignment and size % self.alignment:
+ size += self.alignment - (size % self.alignment)
+ data = data[size:]
+
+ return self
+
+ def __setitem__(self, key, value):
+ self.fields[key] = value
+ self.data = None # force recompute
+
+ def __getitem__(self, key):
+ return self.fields[key]
+
+ def __delitem__(self, key):
+ del self.fields[key]
+
+ def __str__(self):
+ return self.getData()
+
+ def __len__(self):
+ # XXX: improve
+ return len(self.getData())
+
+ def pack(self, format, data, field = None):
+ if self.debug:
+ print " pack( %s | %r | %s)" % (format, data, field)
+
+ if field:
+ addressField = self.findAddressFieldFor(field)
+ if (addressField is not None) and (data is None):
+ return ''
+
+ # void specifier
+ if format[:1] == '_':
+ return ''
+
+ # quote specifier
+ if format[:1] == "'" or format[:1] == '"':
+ return format[1:]
+
+ # code specifier
+ two = format.split('=')
+ if len(two) >= 2:
+ try:
+ return self.pack(two[0], data)
+ except:
+ fields = {'self':self}
+ fields.update(self.fields)
+ return self.pack(two[0], eval(two[1], {}, fields))
+
+ # address specifier
+ two = format.split('&')
+ if len(two) == 2:
+ try:
+ return self.pack(two[0], data)
+ except:
+ if (self.fields.has_key(two[1])) 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)
+
+ # length specifier
+ two = format.split('-')
+ if len(two) == 2:
+ try:
+ return self.pack(two[0],data)
+ except:
+ return self.pack(two[0], self.calcPackFieldSize(two[1]))
+
+ # array specifier
+ two = format.split('*')
+ if len(two) == 2:
+ answer = ''
+ for each in data:
+ answer += self.pack(two[1], each)
+ 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"
+ else:
+ return self.pack(two[0], len(data))+answer
+ return answer
+
+ # "printf" string specifier
+ if format[:1] == '%':
+ # format string like specifier
+ return format % data
+
+ # asciiz specifier
+ if format[:1] == 'z':
+ return str(data)+'\0'
+
+ # unicode specifier
+ if format[:1] == 'u':
+ return str(data)+'\0\0' + (len(data) & 1 and '\0' or '')
+
+ # DCE-RPC/NDR string specifier
+ if format[:1] == 'w':
+ if len(data) == 0:
+ data = '\0\0'
+ elif len(data) % 2:
+ data += '\0'
+ l = pack('<L', len(data)/2)
+ return '%s\0\0\0\0%s%s' % (l,l,data)
+
+ if data is None:
+ raise Exception, "Trying to pack None"
+
+ # literal specifier
+ if format[:1] == ':':
+ return str(data)
+
+ # struct like specifier
+ return pack(format, data)
+
+ def unpack(self, format, data, dataClassOrCode = str, field = None):
+ if self.debug:
+ print " unpack( %s | %r )" % (format, data)
+
+ if field:
+ addressField = self.findAddressFieldFor(field)
+ if addressField is not None:
+ if not self[addressField]:
+ return
+
+ # void specifier
+ if format[:1] == '_':
+ if dataClassOrCode != str:
+ fields = {'self':self, 'inputDataLeft':data}
+ fields.update(self.fields)
+ return eval(dataClassOrCode, {}, fields)
+ else:
+ return None
+
+ # quote specifier
+ 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)
+ return answer
+
+ # address specifier
+ two = format.split('&')
+ if len(two) == 2:
+ return self.unpack(two[0],data)
+
+ # code specifier
+ two = format.split('=')
+ if len(two) >= 2:
+ return self.unpack(two[0],data)
+
+ # length specifier
+ two = format.split('-')
+ if len(two) == 2:
+ return self.unpack(two[0],data)
+
+ # array specifier
+ two = format.split('*')
+ if len(two) == 2:
+ answer = []
+ sofar = 0
+ if two[0].isdigit():
+ number = int(two[0])
+ elif two[0]:
+ sofar += self.calcUnpackSize(two[0], data)
+ number = self.unpack(two[0], data[:sofar])
+ else:
+ number = -1
+
+ while number and sofar < len(data):
+ nsofar = sofar + self.calcUnpackSize(two[1],data[sofar:])
+ answer.append(self.unpack(two[1], data[sofar:nsofar], dataClassOrCode))
+ number -= 1
+ sofar = nsofar
+ return answer
+
+ # "printf" string specifier
+ if format[:1] == '%':
+ # format string like specifier
+ return format % data
+
+ # asciiz specifier
+ if format == 'z':
+ if data[-1] != '\x00':
+ 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))
+ return data[:-2] # remove trailing NUL
+
+ # DCE-RPC/NDR string specifier
+ if format == 'w':
+ l = unpack('<L', data[:4])[0]
+ return data[12:12+l*2]
+
+ # literal specifier
+ if format == ':':
+ return dataClassOrCode(data)
+
+ # struct like specifier
+ return unpack(format, data)[0]
+
+ def calcPackSize(self, format, data, field = None):
+# # print " calcPackSize %s:%r" % (format, data)
+ if field:
+ addressField = self.findAddressFieldFor(field)
+ if addressField is not None:
+ if not self[addressField]:
+ return 0
+
+ # void specifier
+ if format[:1] == '_':
+ return 0
+
+ # quote specifier
+ if format[:1] == "'" or format[:1] == '"':
+ return len(format)-1
+
+ # address specifier
+ two = format.split('&')
+ if len(two) == 2:
+ return self.calcPackSize(two[0], data)
+
+ # code specifier
+ two = format.split('=')
+ if len(two) >= 2:
+ return self.calcPackSize(two[0], data)
+
+ # length specifier
+ two = format.split('-')
+ if len(two) == 2:
+ return self.calcPackSize(two[0], data)
+
+ # array specifier
+ two = format.split('*')
+ if len(two) == 2:
+ 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"
+ elif two[0]:
+ answer += self.calcPackSize(two[0], len(data))
+
+ for each in data:
+ answer += self.calcPackSize(two[1], each)
+ return answer
+
+ # "printf" string specifier
+ if format[:1] == '%':
+ # format string like specifier
+ return len(format % data)
+
+ # asciiz specifier
+ if format[:1] == 'z':
+ return len(data)+1
+
+ # asciiz specifier
+ if format[:1] == 'u':
+ l = len(data)
+ return l + (l & 1 and 3 or 2)
+
+ # DCE-RPC/NDR string specifier
+ if format[:1] == 'w':
+ l = len(data)
+ return 12+l+l % 2
+
+ # literal specifier
+ if format[:1] == ':':
+ return len(data)
+
+ # struct like specifier
+ return calcsize(format)
+
+ def calcUnpackSize(self, format, data, field = None):
+ if self.debug:
+ print " calcUnpackSize( %s | %s | %r)" % (field, format, data)
+
+ # void specifier
+ if format[:1] == '_':
+ return 0
+
+ addressField = self.findAddressFieldFor(field)
+ if addressField is not None:
+ if not self[addressField]:
+ return 0
+
+ try:
+ lengthField = self.findLengthFieldFor(field)
+ return self[lengthField]
+ except:
+ pass
+
+ # XXX: Try to match to actual values, raise if no match
+
+ # quote specifier
+ if format[:1] == "'" or format[:1] == '"':
+ return len(format)-1
+
+ # address specifier
+ two = format.split('&')
+ if len(two) == 2:
+ return self.calcUnpackSize(two[0], data)
+
+ # code specifier
+ two = format.split('=')
+ if len(two) >= 2:
+ return self.calcUnpackSize(two[0], data)
+
+ # length specifier
+ two = format.split('-')
+ if len(two) == 2:
+ return self.calcUnpackSize(two[0], data)
+
+ # array specifier
+ two = format.split('*')
+ if len(two) == 2:
+ answer = 0
+ if two[0]:
+ if two[0].isdigit():
+ number = int(two[0])
+ else:
+ answer += self.calcUnpackSize(two[0], data)
+ number = self.unpack(two[0], data[:answer])
+
+ while number:
+ number -= 1
+ answer += self.calcUnpackSize(two[1], data[answer:])
+ else:
+ while answer < len(data):
+ answer += self.calcUnpackSize(two[1], data[answer:])
+ return answer
+
+ # "printf" string specifier
+ if format[:1] == '%':
+ raise Exception, "Can't guess the size of a printf like specifier for unpacking"
+
+ # asciiz specifier
+ if format[:1] == 'z':
+ return data.index('\x00')+1
+
+ # asciiz specifier
+ if format[:1] == 'u':
+ l = data.index('\x00\x00')
+ return l + (l & 1 and 3 or 2)
+
+ # DCE-RPC/NDR string specifier
+ if format[:1] == 'w':
+ l = unpack('<L', data[:4])[0]
+ return 12+l*2
+
+ # literal specifier
+ if format[:1] == ':':
+ return len(data)
+
+ # struct like specifier
+ return calcsize(format)
+
+ def calcPackFieldSize(self, fieldName, format = None):
+ if format is None:
+ format = self.formatForField(fieldName)
+
+ return self.calcPackSize(format, self[fieldName])
+
+ def formatForField(self, fieldName):
+ for field in self.commonHdr+self.structure:
+ if field[0] == fieldName:
+ return field[1]
+ raise Exception, ("Field %s not found" % fieldName)
+
+ def findAddressFieldFor(self, fieldName):
+ descriptor = '&%s' % fieldName
+ l = len(descriptor)
+ for field in self.commonHdr+self.structure:
+ if field[1][-l:] == descriptor:
+ return field[0]
+ return None
+
+ def findLengthFieldFor(self, fieldName):
+ descriptor = '-%s' % fieldName
+ l = len(descriptor)
+ for field in self.commonHdr+self.structure:
+ if field[1][-l:] == descriptor:
+ return field[0]
+ return None
+
+ def zeroValue(self, format):
+ two = format.split('*')
+ if len(two) == 2:
+ if two[0].isdigit():
+ return (self.zeroValue(two[1]),)*int(two[0])
+
+ if not format.find('*') == -1: return ()
+ if 's' in format: return ''
+ if format in ['z',':','u']: return ''
+ if format == 'w': return '\x00\x00'
+
+ return 0
+
+ def clear(self):
+ for field in self.commonHdr + self.structure:
+ self[field[0]] = self.zeroValue(field[1])
+
+ def dump(self, msg = None, indent = 0):
+ if msg is None: msg = self.__class__.__name__
+ ind = ' '*indent
+ print "\n%s" % msg
+ fixedFields = []
+ for field in self.commonHdr+self.structure:
+ i = field[0]
+ if i in self.fields:
+ fixedFields.append(i)
+ if isinstance(self[i], Structure):
+ self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
+ print "%s}" % ind
+ else:
+ 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
+ else:
+ print "%s%s: {%r}" % (ind,i,self[i])
+
+
+class _StructureTest:
+ alignment = 0
+ def create(self,data = None):
+ if data is not None:
+ return self.theClass(data, alignment = self.alignment)
+ else:
+ return self.theClass(alignment = self.alignment)
+
+ def run(self):
+ print
+ print "-"*70
+ testName = self.__class__.__name__
+ 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....."
+ b = self.create(a_str)
+ b.dump("unpacked.....")
+ 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
+
+class _Test_simple(_StructureTest):
+ class theClass(Structure):
+ commonHdr = ()
+ structure = (
+ ('int1', '!L'),
+ ('len1','!L-z1'),
+ ('arr1','B*<L'),
+ ('z1', 'z'),
+ ('u1','u'),
+ ('', '"COCA'),
+ ('len2','!H-:1'),
+ ('', '"COCA'),
+ (':1', ':'),
+ ('int3','>L'),
+ ('code1','>L=len(arr1)*2+0x1000'),
+ )
+
+ def populate(self, a):
+ a['default'] = 'hola'
+ a['int1'] = 0x3131
+ a['int3'] = 0x45444342
+ a['z1'] = 'hola'
+ a['u1'] = 'hola'.encode('utf_16_le')
+ a[':1'] = ':1234:'
+ a['arr1'] = (0x12341234,0x88990077,0x41414141)
+ # a['len1'] = 0x42424242
+
+class _Test_fixedLength(_Test_simple):
+ def populate(self, a):
+ _Test_simple.populate(self, a)
+ a['len1'] = 0x42424242
+
+class _Test_simple_aligned4(_Test_simple):
+ alignment = 4
+
+class _Test_nested(_StructureTest):
+ class theClass(Structure):
+ class _Inner(Structure):
+ structure = (('data', 'z'),)
+
+ structure = (
+ ('nest1', ':', _Inner),
+ ('nest2', ':', _Inner),
+ ('int', '<L'),
+ )
+
+ def populate(self, a):
+ a['nest1'] = _Test_nested.theClass._Inner()
+ a['nest2'] = _Test_nested.theClass._Inner()
+ a['nest1']['data'] = 'hola manola'
+ a['nest2']['data'] = 'chau loco'
+ a['int'] = 0x12345678
+
+class _Test_Optional(_StructureTest):
+ class theClass(Structure):
+ structure = (
+ ('pName','<L&Name'),
+ ('pList','<L&List'),
+ ('Name','w'),
+ ('List','<H*<L'),
+ )
+
+ def populate(self, a):
+ a['Name'] = 'Optional test'
+ a['List'] = (1,2,3,4)
+
+class _Test_Optional_sparse(_Test_Optional):
+ def populate(self, a):
+ _Test_Optional.populate(self, a)
+ del a['Name']
+
+class _Test_AsciiZArray(_StructureTest):
+ class theClass(Structure):
+ structure = (
+ ('head','<L'),
+ ('array','B*z'),
+ ('tail','<L'),
+ )
+
+ def populate(self, a):
+ a['head'] = 0x1234
+ a['tail'] = 0xabcd
+ a['array'] = ('hola','manola','te traje')
+
+class _Test_UnpackCode(_StructureTest):
+ class theClass(Structure):
+ structure = (
+ ('leni','<L=len(uno)*2'),
+ ('cuchi','_-uno','leni/2'),
+ ('uno',':'),
+ ('dos',':'),
+ )
+
+ def populate(self, a):
+ a['uno'] = 'soy un loco!'
+ a['dos'] = 'que haces fiera'
+
+class _Test_AAA(_StructureTest):
+ class theClass(Structure):
+ commonHdr = ()
+ structure = (
+ ('iv', '!L=((init_vector & 0xFFFFFF) << 8) | ((pad & 0x3f) << 2) | (keyid & 3)'),
+ ('init_vector', '_','(iv >> 8)'),
+ ('pad', '_','((iv >>2) & 0x3F)'),
+ ('keyid', '_','( iv & 0x03 )'),
+ ('dataLen', '_-data', 'len(inputDataLeft)-4'),
+ ('data',':'),
+ ('icv','>L'),
+ )
+
+ def populate(self, a):
+ a['init_vector']=0x01020304
+ #a['pad']=int('01010101',2)
+ a['pad']=int('010101',2)
+ a['keyid']=0x07
+ a['data']="\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9"
+ a['icv'] = 0x05060708
+ #a['iv'] = 0x01020304
+
+if __name__ == '__main__':
+ _Test_simple().run()
+
+ try:
+ _Test_fixedLength().run()
+ except:
+ print "cannot repack because length is bogus"
+
+ _Test_simple_aligned4().run()
+ _Test_nested().run()
+ _Test_Optional().run()
+ _Test_Optional_sparse().run()
+ _Test_AsciiZArray().run()
+ _Test_UnpackCode().run()
+ _Test_AAA().run()
diff --git a/tests/python_dependencies/impacket/uuid.py b/tests/python_dependencies/impacket/uuid.py
new file mode 100644
index 00000000..fb4d7b3a
--- /dev/null
+++ b/tests/python_dependencies/impacket/uuid.py
@@ -0,0 +1,68 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+# Description:
+# Generate UUID compliant with http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt.
+# A different, much simpler (not necessarily better) algorithm is used.
+#
+# Author:
+# Javier Kohen (jkohen)
+#
+
+import re
+
+from random import randrange
+from struct import pack, unpack
+
+def generate():
+ # UHm... crappy Python has an maximum integer of 2**31-1.
+ top = (1L<<31)-1
+ return pack("IIII", randrange(top), randrange(top), randrange(top), randrange(top))
+
+def bin_to_string(uuid):
+ uuid1, uuid2, uuid3 = unpack('<LHH', uuid[:8])
+ uuid4, uuid5, uuid6 = unpack('>HHL', uuid[8:16])
+ return '%08X-%04X-%04X-%04X-%04X%08X' % (uuid1, uuid2, uuid3, uuid4, uuid5, uuid6)
+
+def string_to_bin(uuid):
+ matches = re.match('([\dA-Fa-f]{8})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})([\dA-Fa-f]{8})', uuid)
+ (uuid1, uuid2, uuid3, uuid4, uuid5, uuid6) = map(lambda x: long(x, 16), matches.groups())
+ uuid = pack('<LHH', uuid1, uuid2, uuid3)
+ uuid += pack('>HHL', uuid4, uuid5, uuid6)
+ return uuid
+
+def stringver_to_bin(s):
+ (maj,min) = s.split('.')
+ return pack('<H',int(maj)) + pack('<H',int(min))
+
+def uuidtup_to_bin(tup):
+ if len(tup) != 2: return
+ return string_to_bin(tup[0]) + stringver_to_bin(tup[1])
+
+def bin_to_uuidtup(bin):
+ assert len(bin) == 20
+ uuidstr = bin_to_string(bin[:16])
+ maj, min = unpack("<HH", bin[16:])
+ return uuidstr, "%d.%d" % (maj, min)
+
+#input: string
+#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')
+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:
+ (u,v) = g.groups()
+ return (u,v)
+ return
+
+def uuidtup_to_string(tup):
+ uuid, (maj, min) = tup
+ return "%s v%d.%d" % (uuid, maj, min)
diff --git a/tests/python_dependencies/impacket/version.py b/tests/python_dependencies/impacket/version.py
new file mode 100644
index 00000000..badd4a8a
--- /dev/null
+++ b/tests/python_dependencies/impacket/version.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2003-2016 CORE Security Technologies
+#
+# This software is provided under under a slightly modified version
+# of the Apache Software License. See the accompanying LICENSE file
+# for more information.
+#
+
+VER_MAJOR = "0"
+VER_MINOR = "9.15"
+
+BANNER = "Impacket v%s.%s - Copyright 2002-2016 Core Security Technologies\n" % (VER_MAJOR,VER_MINOR)
+
diff --git a/tests/rtspserver.pl b/tests/rtspserver.pl
index bddccb91..02d2f9f9 100755
--- a/tests/rtspserver.pl
+++ b/tests/rtspserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -37,7 +37,7 @@ use serverhelp qw(
my $verbose = 0; # set to 1 for debugging
my $port = 8990; # just a default
my $ipvnum = 4; # default IP version of rtsp server
-my $idnum = 1; # dafault rtsp server instance number
+my $idnum = 1; # default rtsp server instance number
my $proto = 'rtsp'; # protocol the rtsp server speaks
my $pidfile; # rtsp server pid file
my $logfile; # rtsp server log file
diff --git a/tests/runtests.1 b/tests/runtests.1
index 5576b2fd..a250aa53 100644
--- a/tests/runtests.1
+++ b/tests/runtests.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 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
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH runtests.pl 1 "2 Feb 2010" "Curl 7.20.0" "runtests"
+.TH runtests.pl 1 "May 05, 2017" "Curl 7.55.0" "runtests"
+
.SH NAME
runtests.pl \- run one or more test cases
.SH SYNOPSIS
@@ -76,6 +77,8 @@ Prints out all files in "log/" to stdout when a test case fails. Very
practical when used in the automated and distributed tests since then the
people checking the failures and the reasons for them might not have physical
access to the machine and logs.
+.IP "-R"
+Run the tests in a scrambled, or randomized, order instead of sequentially.
.IP "-r"
Display run time statistics. (Requires Perl Time::HiRes module)
.IP "-rf"
diff --git a/tests/runtests.html b/tests/runtests.html
deleted file mode 100644
index 7dcde484..00000000
--- a/tests/runtests.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html><head>
-<title>runtests.pl man page</title>
-<meta name="generator" content="roffit">
-<STYLE type="text/css">
-pre {
- overflow: auto;
- margin: 0;
-}
-
-P.level0, pre.level0 {
- padding-left: 2em;
-}
-
-P.level1, pre.level1 {
- padding-left: 4em;
-}
-
-P.level2, pre.level2 {
- padding-left: 6em;
-}
-
-span.emphasis {
- font-style: italic;
-}
-
-span.bold {
- font-weight: bold;
-}
-
-span.manpage {
- font-weight: bold;
-}
-
-h2.nroffsh {
- background-color: #e0e0e0;
-}
-
-span.nroffip {
- font-weight: bold;
- font-size: 120%;
- font-family: monospace;
-}
-
-p.roffit {
- text-align: center;
- font-size: 80%;
-}
-</STYLE>
-</head><body>
-
-<p class="level0"><a name="NAME"></a><h2 class="nroffsh">NAME</h2>
-<p class="level0">runtests.pl - run one or more test cases <a name="SYNOPSIS"></a><h2 class="nroffsh">SYNOPSIS</h2>
-<p class="level0"><span Class="bold">runtests.pl [options] [test number] [!test number] [key word] [!key word]</span> <a name="DESCRIPTION"></a><h2 class="nroffsh">DESCRIPTION</h2>
-<p class="level0"><span Class="emphasis">runtests.pl</span> runs one, several or all the existing test cases in curl's test suite. It is often called from the root Makefile of the curl package with 'make test'. <a name="TEST"></a><h2 class="nroffsh">TEST NUMBER</h2>
-<p class="level0">If no test case number is given, all existing tests that the script can find will be considered for running. You can specify single test cases to run, space-separated, like "1 3 5 7 11", and you can specify a range like "45 to 67". You can also specify only the tests you don't want to run by listing the numbers with a leading exclamation point, like "!66".
-<p class="level0">It is also possible to specify tests to skip based on a key word describing the test. These are specified with a leading exclamation point and the key word or phrase, like "!HTTP NTLM auth". Likewise, tests to run can be specified simply by specifying the unadorned key words, like "FTPS". Remember that the exclamation marks and spaces will need to be quoted somehow when entered at many command shells. <a name="OPTIONS"></a><h2 class="nroffsh">OPTIONS</h2>
-<p class="level0">
-<p class="level0"><a name="-a"></a><span class="nroffip">-a</span>
-<p class="level1">Continue running the rest of the test cases even if one test fails. By default, the test script stops as soon as an error is detected.
-<p class="level0"><a name="-bN"></a><span class="nroffip">-bN</span>
-<p class="level1">Use N as the base TCP/UDP port number on which to start the test servers.
-<p class="level0"><a name="-c"></a><span class="nroffip">-c &lt;curl&gt;</span>
-<p class="level1">Provide a path to a custom curl binary to run the tests with. Default is the curl executable in the build tree.
-<p class="level0"><a name="-d"></a><span class="nroffip">-d</span>
-<p class="level1">Enable protocol debug: have the servers display protocol output.
-<p class="level0"><a name="-e"></a><span class="nroffip">-e</span>
-<p class="level1">Run the test event-based (if possible). This will make runtests invoke curl with --test-event option. This option only works if both curl and libcurl were built debug-enabled.
-<p class="level0"><a name="-g"></a><span class="nroffip">-g</span>
-<p class="level1">Run the given test(s) with gdb. This is best used on a single test case and curl built --disable-shared. This then fires up gdb with command line set to run the specified test case. Simply (set a break-point and) type 'run' to start.
-<p class="level0"><a name="-h"></a><span class="nroffip">-h</span>
-<p class="level1">Displays a help text about this program's command line options.
-<p class="level0"><a name="-k"></a><span class="nroffip">-k</span>
-<p class="level1">Keep output and log files in log/ after a test run, even if no error was detected. Useful for debugging.
-<p class="level0"><a name="-l"></a><span class="nroffip">-l</span>
-<p class="level1">Lists all test case names.
-<p class="level0"><a name="-n"></a><span class="nroffip">-n</span>
-<p class="level1">Disable the check for and use of valgrind.
-<p class="level0"><a name="-p"></a><span class="nroffip">-p</span>
-<p class="level1">Prints out all files in "log/" to stdout when a test case fails. Very practical when used in the automated and distributed tests since then the people checking the failures and the reasons for them might not have physical access to the machine and logs.
-<p class="level0"><a name="-r"></a><span class="nroffip">-r</span>
-<p class="level1">Display run time statistics. (Requires Perl Time::HiRes module)
-<p class="level0"><a name="-rf"></a><span class="nroffip">-rf</span>
-<p class="level1">Display full run time statistics. (Requires Perl Time::HiRes module)
-<p class="level0"><a name="-s"></a><span class="nroffip">-s</span>
-<p class="level1">Shorter output. Speaks less than default.
-<p class="level0"><a name="-tnum"></a><span class="nroffip">-t[num]</span>
-<p class="level1">Selects a <span Class="bold">torture</span> test for the given tests. This makes runtests.pl first run the tests once and count the number of memory allocations made. It then reruns the test that number of times, each time forcing one of the allocations to fail until all allocs have been tested. By setting <span Class="emphasis">num</span> you can force the allocation with that number to be set to fail at once instead of looping through everyone, which is very handy when debugging and then often in combination with <a class="emphasis" href="#-g">-g</a>.
-<p class="level0"><a name="-v"></a><span class="nroffip">-v</span>
-<p class="level1">Enable verbose output. Speaks more than default.
-<p class="level0"><a name="-vc"></a><span class="nroffip">-vc &lt;curl&gt;</span>
-<p class="level1">Provide a path to a custom curl binary to run when verifying that the servers running are indeed our test servers. Default is the curl executable in the build tree. <a name="RUNNING"></a><h2 class="nroffsh">RUNNING TESTS</h2>
-<p class="level0">Many tests have conditions that must be met before the test case can run fine. They could depend on built-in features in libcurl or features present in the operating system or even in third-party libraries that curl may or may not use.
-<p class="level0">The test script checks most of these by itself to determine when it is safe to attempt to run each test. Those which cannot be run due to failed requirements will simply be skipped and listed at the completion of all test cases. In some unusual configurations, the test script cannot make the correct determination for all tests. In these cases, the problematic tests can be skipped using the "!keyword" skip feature documented earlier. <a name="WRITING"></a><h2 class="nroffsh">WRITING TESTS</h2>
-<p class="level0">The simplest way to write test cases is to start with a similar existing test, save it with a new number and then adjust it to fit. There's an attempt to document the test case file format in the tests/FILEFORMAT. <p class="roffit">
- This HTML page was made with <a href="http://daniel.haxx.se/projects/roffit/">roffit</a>.
-</body></html>
diff --git a/tests/runtests.pdf b/tests/runtests.pdf
deleted file mode 100644
index 692e11dc..00000000
--- a/tests/runtests.pdf
+++ /dev/null
Binary files differ
diff --git a/tests/runtests.pl b/tests/runtests.pl
index 583ba3b7..065df7c5 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -145,6 +145,10 @@ my $HTTPPROXYPORT; # HTTP proxy port, when using CONNECT
my $HTTPPIPEPORT; # HTTP pipelining port
my $HTTPUNIXPATH; # HTTP server Unix domain socket path
my $HTTP2PORT; # HTTP/2 server port
+my $DICTPORT; # DICT server port
+my $SMBPORT; # SMB server port
+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
@@ -194,7 +198,7 @@ my $pwd = getcwd(); # current working directory
my $start;
my $ftpchecktime=1; # time it took to verify our test FTP server
-
+my $scrambleorder;
my $stunnel = checkcmd("stunnel4") || checkcmd("tstunnel") || checkcmd("stunnel");
my $valgrind = checktestcmd("valgrind");
my $valgrind_logfile="--logfile";
@@ -378,7 +382,8 @@ sub init_serverpidfile_hash {
}
}
}
- for my $proto (('tftp', 'sftp', 'socks', 'ssh', 'rtsp', 'gopher', 'httptls')) {
+ for my $proto (('tftp', 'sftp', 'socks', 'ssh', 'rtsp', 'gopher', 'httptls',
+ 'dict', 'smb', 'smbs', 'telnet')) {
for my $ipvnum ((4, 6)) {
for my $idnum ((1, 2)) {
my $serv = servername_id($proto, $ipvnum, $idnum);
@@ -1119,6 +1124,128 @@ sub verifysocks {
}
#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifysmb {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $time=time();
+ my $extra="";
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "-u 'curltest:curltest' ";
+ $flags .= $extra;
+ $flags .= "\"$proto://$ip:$port/SERVER/verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # check if this is our server running on this port:
+ logmsg "RUN: $cmd\n" if($verbose);
+ my @data = runclientoutput($cmd);
+
+ my $res = $? >> 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ foreach my $line (@data) {
+ if($line =~ /WE ROOLZ: (\d+)/) {
+ # this is our test server with a known pid!
+ $pid = 0+$1;
+ last;
+ }
+ }
+ if($pid <= 0 && @data && $data[0]) {
+ # this is not a known server
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return 0;
+ }
+ # we can/should use the time it took to verify the server as a measure
+ # on how fast/slow this host is.
+ my $took = int(0.5+time()-$time);
+
+ if($verbose) {
+ logmsg "RUN: Verifying our test $server server took $took seconds\n";
+ }
+ $ftpchecktime = $took>=1?$took:1; # make sure it never is below 1
+
+ return $pid;
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifytelnet {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $time=time();
+ my $extra="";
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "--upload-file - ";
+ $flags .= $extra;
+ $flags .= "\"$proto://$ip:$port\"";
+
+ my $cmd = "echo 'verifiedserver' | $VCURL $flags 2>$verifylog";
+
+ # check if this is our server running on this port:
+ logmsg "RUN: $cmd\n" if($verbose);
+ my @data = runclientoutput($cmd);
+
+ my $res = $? >> 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ foreach my $line (@data) {
+ if($line =~ /WE ROOLZ: (\d+)/) {
+ # this is our test server with a known pid!
+ $pid = 0+$1;
+ last;
+ }
+ }
+ if($pid <= 0 && @data && $data[0]) {
+ # this is not a known server
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return 0;
+ }
+ # we can/should use the time it took to verify the server as a measure
+ # on how fast/slow this host is.
+ my $took = int(0.5+time()-$time);
+
+ if($verbose) {
+ logmsg "RUN: Verifying our test $server server took $took seconds\n";
+ }
+
+ return $pid;
+}
+
+
+#######################################################################
# Verify that the server that runs on $ip, $port is our server.
# Retry over several seconds before giving up. The ssh server in
# particular can take a long time to start if it needs to generate
@@ -1143,7 +1270,10 @@ my %protofunc = ('http' => \&verifyhttp,
'ssh' => \&verifyssh,
'socks' => \&verifysocks,
'gopher' => \&verifyhttp,
- 'httptls' => \&verifyhttptls);
+ 'httptls' => \&verifyhttptls,
+ 'dict' => \&verifyftp,
+ 'smb' => \&verifysmb,
+ 'telnet' => \&verifytelnet);
sub verifyserver {
my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
@@ -1227,6 +1357,7 @@ sub runhttp2server {
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--port $HTTP2PORT ";
+ $flags .= "--connect $HOSTIP:$HTTPPORT ";
$flags .= $verbose_flag if($debugprotocol);
my $cmd = "$exe $flags";
@@ -2164,6 +2295,235 @@ sub runsocksserver {
}
#######################################################################
+# start the dict server
+#
+sub rundictserver {
+ my ($verbose, $alt, $port) = @_;
+ my $proto = "dict";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--port $port --srcdir \"$srcdir\"";
+
+ my $cmd = "$srcdir/dictserver.py $flags";
+ my ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($dictpid <= 0 || !pidexists($dictpid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Server is up. Verify that we can speak to it.
+ 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, "$dictpid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $dictpid\n";
+ }
+
+ sleep(1);
+
+ return ($dictpid, $pid2);
+}
+
+#######################################################################
+# start the SMB server
+#
+sub runsmbserver {
+ my ($verbose, $alt, $port) = @_;
+ my $proto = "smb";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--port $port --srcdir \"$srcdir\"";
+
+ my $cmd = "$srcdir/smbserver.py $flags";
+ my ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($smbpid <= 0 || !pidexists($smbpid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Server is up. Verify that we can speak to it.
+ 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, "$smbpid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $smbpid\n";
+ }
+
+ sleep(1);
+
+ return ($smbpid, $pid2);
+}
+
+#######################################################################
+# start the telnet server
+#
+sub runnegtelnetserver {
+ my ($verbose, $alt, $port) = @_;
+ my $proto = "telnet";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--port $port --srcdir \"$srcdir\"";
+
+ my $cmd = "$srcdir/negtelnetserver.py $flags";
+ my ($ntelpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ntelpid <= 0 || !pidexists($ntelpid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # Server is up. Verify that we can speak to it.
+ 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, "$ntelpid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $ntelpid\n";
+ }
+
+ sleep(1);
+
+ return ($ntelpid, $pid2);
+}
+
+
+#######################################################################
# Single shot http and gopher server responsiveness test. This should only
# be used to verify that a server present in %run hash is still functional
#
@@ -2411,6 +2771,7 @@ sub checksystem {
}
elsif ($libcurl =~ /securetransport/i) {
$has_darwinssl=1;
+ $has_sslpinning=1;
$ssllib="DarwinSSL";
}
elsif ($libcurl =~ /BoringSSL/i) {
@@ -2683,7 +3044,7 @@ sub checksystem {
}
logmsg sprintf("\n* GOPHER/%d ", $GOPHERPORT);
if($gopher_ipv6) {
- logmsg sprintf("GOPHER-IPv6/%d", $GOPHERPORT);
+ logmsg sprintf("GOPHER-IPv6/%d", $GOPHER6PORT);
}
logmsg sprintf("\n* SSH/%d ", $SSHPORT);
logmsg sprintf("SOCKS/%d ", $SOCKSPORT);
@@ -2760,6 +3121,13 @@ sub subVariables {
$$thing =~ s/%TFTP6PORT/$TFTP6PORT/g;
$$thing =~ s/%TFTPPORT/$TFTPPORT/g;
+ $$thing =~ s/%DICTPORT/$DICTPORT/g;
+
+ $$thing =~ s/%SMBPORT/$SMBPORT/g;
+ $$thing =~ s/%SMBSPORT/$SMBSPORT/g;
+
+ $$thing =~ s/%NEGTELNETPORT/$NEGTELNETPORT/g;
+
# server Unix domain socket paths
$$thing =~ s/%HTTPUNIXPATH/$HTTPUNIXPATH/g;
@@ -2794,7 +3162,7 @@ sub subVariables {
# HTTP2
- $$thing =~ s/%H2CVER/$h2cver/g;
+ $$thing =~ s/%H2CVER/$h2cver/g;
}
sub fixarray {
@@ -3037,6 +3405,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "threaded-resolver") {
+ if($has_threadedres) {
+ next;
+ }
+ }
elsif($1 eq "PSL") {
if($has_psl) {
next;
@@ -3183,6 +3556,11 @@ sub singletest {
next;
}
}
+ elsif($1 eq "threaded-resolver") {
+ if(!$has_threadedres) {
+ next;
+ }
+ }
else {
next;
}
@@ -3278,11 +3656,6 @@ sub singletest {
}
if(!$why) {
- # TODO:
- # Add a precheck cache. If a precheck command was already invoked
- # exactly like this, then use the previous result to speed up
- # successive test invokes!
-
my @precheck = getpart("client", "precheck");
if(@precheck) {
$cmd = $precheck[0];
@@ -3332,31 +3705,12 @@ sub singletest {
}
logmsg sprintf("test %04d...", $testnum) if(!$automakestyle);
- # extract the reply data
- my @reply = getpart("reply", "data");
- my @replycheck = getpart("reply", "datacheck");
-
my %replyattr = getpartattr("reply", "data");
- my %replycheckattr = getpartattr("reply", "datacheck");
-
- if (@replycheck) {
- # we use this file instead to check the final output against
- # get the mode attribute
- my $filemode=$replycheckattr{'mode'};
- if($filemode && ($filemode eq "text") && $has_textaware) {
- # text mode when running on windows: fix line endings
- map s/\r\n/\n/g, @replycheck;
- map s/\n/\r\n/g, @replycheck;
- }
- if($replycheckattr{'nonewline'}) {
- # Yes, we must cut off the final newline from the final line
- # of the datacheck
- chomp($replycheck[$#replycheck]);
- }
-
- for my $partsuffix (('1', '2', '3', '4')) {
+ my @reply;
+ if (partexists("reply", "datacheck")) {
+ for my $partsuffix (('', '1', '2', '3', '4')) {
my @replycheckpart = getpart("reply", "datacheck".$partsuffix);
- if(@replycheckpart || partexists("reply", "datacheck".$partsuffix) ) {
+ if(@replycheckpart) {
my %replycheckpartattr = getpartattr("reply", "datacheck".$partsuffix);
# get the mode attribute
my $filemode=$replycheckpartattr{'mode'};
@@ -3370,13 +3724,13 @@ sub singletest {
# of the datacheck
chomp($replycheckpart[$#replycheckpart]);
}
- push(@replycheck, @replycheckpart);
+ push(@reply, @replycheckpart);
}
}
-
- @reply=@replycheck;
}
else {
+ # check against the data section
+ @reply = getpart("reply", "data");
# get the mode attribute
my $filemode=$replyattr{'mode'};
if($filemode && ($filemode eq "text") && $has_textaware) {
@@ -3616,21 +3970,6 @@ sub singletest {
my $dumped_core;
my $cmdres;
- # Apr 2007: precommand isn't being used and could be removed
- my @precommand= getpart("client", "precommand");
- if($precommand[0]) {
- # this is pure perl to eval!
- my $code = join("", @precommand);
- eval $code;
- if($@) {
- logmsg "perl: $code\n";
- logmsg "precommand: $@";
- stopservers($verbose);
- timestampskippedevents($testnum);
- return -1;
- }
- }
-
if($gdbthis) {
my $gdbinit = "$TESTDIR/gdbinit$testnum";
open(GDBCMD, ">$LOGDIR/gdbcmd");
@@ -3792,7 +4131,7 @@ sub singletest {
# run the postcheck command
my @postcheck= getpart("client", "postcheck");
if(@postcheck) {
- $cmd = $postcheck[0];
+ $cmd = join("", @postcheck);
chomp $cmd;
subVariables \$cmd;
if($cmd) {
@@ -4143,7 +4482,7 @@ sub singletest {
$timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
return 1;
}
- my @e = valgrindparse($srcdir, $feature{'SSL'}, "$LOGDIR/$vgfile");
+ my @e = valgrindparse("$LOGDIR/$vgfile");
if(@e && $e[0]) {
if($automakestyle) {
logmsg "FAIL: $testnum - $testname - valgrind\n";
@@ -4613,7 +4952,7 @@ sub startservers {
return "failed starting socks5 server";
}
elsif(($sshdid =~ /OpenSSH/) && ($sshdvernum < 370)) {
- # Need OpenSSH 3.7 for socks5 - http://www.openssh.com/txt/release-3.7
+ # 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";
}
@@ -4640,6 +4979,41 @@ sub startservers {
$run{'http-unix'}="$pid $pid2";
}
}
+ elsif($what eq "dict") {
+ if(!$run{'dict'}) {
+ ($pid, $pid2) = rundictserver($verbose, "", $DICTPORT);
+ if($pid <= 0) {
+ return "failed starting DICT server";
+ }
+ logmsg sprintf ("* pid DICT => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "smb") {
+ if(!$run{'smb'}) {
+ ($pid, $pid2) = runsmbserver($verbose, "", $SMBPORT);
+ if($pid <= 0) {
+ return "failed starting SMB server";
+ }
+ logmsg sprintf ("* pid SMB => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "telnet") {
+ if(!$run{'telnet'}) {
+ ($pid, $pid2) = runnegtelnetserver($verbose,
+ "",
+ $NEGTELNETPORT);
+ if($pid <= 0) {
+ return "failed starting neg TELNET server";
+ }
+ logmsg sprintf ("* pid neg TELNET => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
elsif($what eq "none") {
logmsg "* starts no server\n" if ($verbose);
}
@@ -4869,6 +5243,10 @@ while(@ARGV) {
# have the servers display protocol output
$debugprotocol=1;
}
+ elsif($ARGV[0] eq "-e") {
+ # run the tests cases event based if possible
+ $run_event_based=1;
+ }
elsif ($ARGV[0] eq "-g") {
# run this test with gdb
$gdbthis=1;
@@ -4891,6 +5269,10 @@ while(@ARGV) {
# no valgrind
undef $valgrind;
}
+ elsif ($ARGV[0] eq "-R") {
+ # execute in scrambled order
+ $scrambleorder=1;
+ }
elsif($ARGV[0] =~ /^-t(.*)/) {
# torture
$torture=1;
@@ -4906,10 +5288,6 @@ while(@ARGV) {
# continue anyway, even if a test fail
$anyway=1;
}
- elsif($ARGV[0] eq "-e") {
- # run the tests cases event based if possible
- $run_event_based=1;
- }
elsif($ARGV[0] eq "-p") {
$postmortem=1;
}
@@ -4957,6 +5335,7 @@ Usage: runtests.pl [options] [test selection(s)]
-bN use base port number N for test servers (default $base)
-c path use this curl executable
-d display server debug info
+ -e event-based execution
-g run the test case with gdb
-gw run the test case with gdb as a windowed application
-h this help text
@@ -4964,6 +5343,7 @@ Usage: runtests.pl [options] [test selection(s)]
-l list all test case names/descriptions
-n no valgrind
-p print log file contents when a test fails
+ -R scrambled order
-r run time statistics
-rf full run time statistics
-s short output
@@ -5093,6 +5473,10 @@ $HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port
$HTTPPROXYPORT = $base++; # HTTP proxy port, when using CONNECT
$HTTPPIPEPORT = $base++; # HTTP pipelining port
$HTTP2PORT = $base++; # HTTP/2 port
+$DICTPORT = $base++; # DICT port
+$SMBPORT = $base++; # SMB port
+$SMBSPORT = $base++; # SMBS port
+$NEGTELNETPORT = $base++; # TELNET port with negotiation
$HTTPUNIXPATH = 'http.sock'; # HTTP server Unix domain socket path
#######################################################################
@@ -5187,6 +5571,23 @@ else {
$TESTCASES = $verified;
}
+if($scrambleorder) {
+ # scramble the order of the test cases
+ my @rand;
+ while($TESTCASES) {
+ my @all = split(/ +/, $TESTCASES);
+ if(!$all[0]) {
+ # if the first is blank, shift away it
+ shift @all;
+ }
+ my $r = rand @all;
+ push @rand, $all[$r];
+ $all[$r]="";
+ $TESTCASES = join(" ", @all);
+ }
+ $TESTCASES = join(" ", @rand);
+}
+
#######################################################################
# Start the command line log
#
diff --git a/tests/secureserver.pl b/tests/secureserver.pl
index 3a7443c4..c897ee5f 100755
--- a/tests/secureserver.pl
+++ b/tests/secureserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -63,7 +63,7 @@ my $pidfile; # stunnel pid file
my $logfile; # stunnel log file
my $loglevel = 5; # stunnel log level
my $ipvnum = 4; # default IP version of stunneled server
-my $idnum = 1; # dafault stunneled server instance number
+my $idnum = 1; # default stunneled server instance number
my $proto = 'https'; # default secure server protocol
my $conffile; # stunnel configuration file
my $capath; # certificate chain PEM folder
@@ -172,7 +172,7 @@ while(@ARGV) {
}
#***************************************************************************
-# Initialize command line option dependant variables
+# Initialize command line option dependent variables
#
if(!$pidfile) {
$pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
@@ -181,7 +181,7 @@ if(!$logfile) {
$logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
}
-$conffile = "$path/stunnel.conf";
+$conffile = "$path/${proto}_stunnel.conf";
$capath = abs_path($path);
$certfile = "$srcdir/". ($stuncert?"certs/$stuncert":"stunnel.pem");
diff --git a/tests/server/CMakeLists.txt b/tests/server/CMakeLists.txt
index 00f5242f..cfc1434c 100644
--- a/tests/server/CMakeLists.txt
+++ b/tests/server/CMakeLists.txt
@@ -1,5 +1,9 @@
set(TARGET_LABEL_PREFIX "Test server ")
+if(MSVC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127 /wd4306")
+endif()
+
function(SETUP_EXECUTABLE TEST_NAME) # ARGN are the files in the test
add_executable( ${TEST_NAME} ${ARGN} )
string(TOUPPER ${TEST_NAME} UPPER_TEST_NAME)
@@ -7,7 +11,7 @@ function(SETUP_EXECUTABLE TEST_NAME) # ARGN are the files in the test
include_directories(
${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h"
${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
- ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h"
+ ${CURL_BINARY_DIR}/include # To be able to reach "curl/curl.h"
)
if(USE_ARES)
include_directories(${CARES_INCLUDE_DIR})
diff --git a/tests/server/Makefile.am b/tests/server/Makefile.am
index e274c01a..f2067f2e 100644
--- a/tests/server/Makefile.am
+++ b/tests/server/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -26,8 +26,6 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
@@ -35,17 +33,13 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# $(top_srcdir)/ares is for in-tree c-ares's external include files
if USE_EMBEDDED_ARES
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
-I$(top_builddir)/ares \
-I$(top_srcdir)/ares
else
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib
endif
@@ -64,3 +58,8 @@ EXTRA_DIST = base64.pl Makefile.inc CMakeLists.txt
checksrc:
@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+
+if CURLDEBUG
+# for debug builds, we scan the sources on all regular make invokes
+all-local: checksrc
+endif
diff --git a/tests/server/Makefile.in b/tests/server/Makefile.in
index 79819752..fa3a9acb 100644
--- a/tests/server/Makefile.in
+++ b/tests/server/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -94,7 +94,8 @@ noinst_PROGRAMS = getpart$(EXEEXT) resolve$(EXEEXT) rtspd$(EXEEXT) \
fake_ntlm$(EXEEXT)
subdir = tests/server
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -115,8 +116,7 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
PROGRAMS = $(noinst_PROGRAMS)
@@ -321,6 +321,12 @@ 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@
@@ -360,6 +366,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -372,6 +380,7 @@ 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@
@@ -507,7 +516,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -522,9 +531,7 @@ top_srcdir = @top_srcdir@
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
-@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/lib $(am__append_1)
@@ -533,16 +540,12 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
# $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file
# $(top_srcdir)/ares is for in-tree c-ares's external include files
-@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/ares \
@@ -1986,7 +1989,8 @@ distdir: $(DISTFILES)
done
check-am: all-am
check: check-am
-all-am: Makefile $(PROGRAMS)
+@CURLDEBUG_FALSE@all-local:
+all-am: Makefile $(PROGRAMS) all-local
installdirs:
install: install-am
install-exec: install-exec-am
@@ -2093,9 +2097,9 @@ uninstall-am:
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
- ctags-am distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
+ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
+ ctags ctags-am distclean distclean-compile 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 \
@@ -2113,6 +2117,9 @@ uninstall-am:
checksrc:
@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+# for debug builds, we scan the sources on all regular make invokes
+@CURLDEBUG_TRUE@all-local: checksrc
+
# 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/tests/server/fake_ntlm.c b/tests/server/fake_ntlm.c
index 87118b31..0d1b3e1b 100644
--- a/tests/server/fake_ntlm.c
+++ b/tests/server/fake_ntlm.c
@@ -37,11 +37,9 @@
/* include memdebug.h last */
#include "memdebug.h"
-#ifndef DEFAULT_LOGFILE
-#define DEFAULT_LOGFILE "log/fake_ntlm.log"
-#endif
+#define LOGFILE "log/fake_ntlm%d.log"
-const char *serverlogfile = DEFAULT_LOGFILE;
+const char *serverlogfile;
/*
* Returns an allocated buffer with printable representation of input
@@ -111,6 +109,7 @@ static char *printable(char *inbuf, size_t inlength)
int main(int argc, char *argv[])
{
char buf[1024];
+ char logfilename[256];
FILE *stream;
char *filename;
int error;
@@ -120,9 +119,9 @@ int main(int argc, char *argv[])
long testnum;
const char *env;
int arg = 1;
- char *helper_user = (char *)"unknown";
- char *helper_proto = (char *)"unknown";
- char *helper_domain = (char *)"unknown";
+ const char *helper_user = "unknown";
+ const char *helper_proto = "unknown";
+ const char *helper_domain = "unknown";
bool use_cached_creds = FALSE;
char *msgbuf;
@@ -158,25 +157,29 @@ int main(int argc, char *argv[])
}
}
- logmsg("fake_ntlm (user: %s) (proto: %s) (domain: %s) (cached creds: %s)",
- helper_user, helper_proto, helper_domain,
- (use_cached_creds) ? "yes" : "no");
-
env = getenv("CURL_NTLM_AUTH_TESTNUM");
if(env) {
char *endptr;
long lnum = strtol(env, &endptr, 10);
if((endptr != env + strlen(env)) || (lnum < 1L)) {
- logmsg("Test number not valid in CURL_NTLM_AUTH_TESTNUM");
+ fprintf(stderr, "Test number not valid in CURL_NTLM_AUTH_TESTNUM");
exit(1);
}
testnum = lnum;
}
else {
- logmsg("Test number not specified in CURL_NTLM_AUTH_TESTNUM");
+ fprintf(stderr, "Test number not specified in CURL_NTLM_AUTH_TESTNUM");
exit(1);
}
+ /* logmsg cannot be used until this file name is set */
+ snprintf(logfilename, sizeof(logfilename), LOGFILE, testnum);
+ serverlogfile = logfilename;
+
+ logmsg("fake_ntlm (user: %s) (proto: %s) (domain: %s) (cached creds: %s)",
+ helper_user, helper_proto, helper_domain,
+ (use_cached_creds) ? "yes" : "no");
+
env = getenv("CURL_NTLM_AUTH_SRCDIR");
if(env) {
path = env;
@@ -276,5 +279,6 @@ int main(int argc, char *argv[])
exit(1);
}
}
+ logmsg("Exit");
return 1;
}
diff --git a/tests/server/getpart.c b/tests/server/getpart.c
index 25758bd4..bb8351bc 100644
--- a/tests/server/getpart.c
+++ b/tests/server/getpart.c
@@ -190,7 +190,7 @@ static int appenddata(char **dst_buf, /* dest buffer */
static int decodedata(char **buf, /* dest buffer */
size_t *len) /* dest buffer data length */
{
- int error = 0;
+ CURLcode error = CURLE_OK;
unsigned char *buf64 = NULL;
size_t src_len = 0;
@@ -198,7 +198,7 @@ static int decodedata(char **buf, /* dest buffer */
return GPE_OK;
/* base64 decode the given buffer */
- error = (int) Curl_base64_decode(*buf, &buf64, &src_len);
+ error = Curl_base64_decode(*buf, &buf64, &src_len);
if(error)
return GPE_OUT_OF_MEMORY;
diff --git a/tests/server/resolve.c b/tests/server/resolve.c
index 206245ab..34f14e06 100644
--- a/tests/server/resolve.c
+++ b/tests/server/resolve.c
@@ -107,16 +107,8 @@ int main(int argc, char *argv[])
atexit(win32_cleanup);
#endif
- if(!use_ipv6) {
- /* gethostbyname() resolve */
- struct hostent *he;
-
- he = gethostbyname(host);
-
- rc = !he;
- }
- else {
#ifdef ENABLE_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);
if(s == CURL_SOCKET_BAD)
@@ -125,28 +117,38 @@ int main(int argc, char *argv[])
else {
sclose(s);
}
+ }
- if(rc == 0) {
- /* getaddrinfo() resolve */
- struct addrinfo *ai;
- struct addrinfo hints;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_INET6;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_CANONNAME;
- /* Use parenthesis around functions to stop them from being replaced by
- the macro in memdebug.h */
- rc = (getaddrinfo)(host, "80", &hints, &ai);
- if(rc == 0)
- (freeaddrinfo)(ai);
- }
-
+ if(rc == 0) {
+ /* getaddrinfo() resolve */
+ struct addrinfo *ai;
+ struct addrinfo hints;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = use_ipv6 ? PF_INET6 : PF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_CANONNAME;
+ /* Use parenthesis around functions to stop them from being replaced by
+ the macro in memdebug.h */
+ rc = (getaddrinfo)(host, "80", &hints, &ai);
+ if(rc == 0)
+ (freeaddrinfo)(ai);
+ }
#else
+ if(use_ipv6) {
puts("IPv6 support has been disabled in this program");
return 1;
-#endif
}
+ else {
+ /* gethostbyname() resolve */
+ struct hostent *he;
+
+ he = gethostbyname(host);
+
+ rc = !he;
+ }
+#endif
+
if(rc)
printf("Resolving %s '%s' didn't work\n", ipv_inuse, host);
diff --git a/tests/server/rtspd.c b/tests/server/rtspd.c
index ea231da3..120d65d5 100644
--- a/tests/server/rtspd.c
+++ b/tests/server/rtspd.c
@@ -1190,13 +1190,15 @@ int main(int argc, char *argv[])
int wrotepidfile = 0;
int flag;
unsigned short port = DEFAULT_PORT;
- char *pidname= (char *)".rtsp.pid";
+ const char *pidname = ".rtsp.pid";
struct httprequest req;
int rc;
int error;
int arg=1;
long pid;
+ memset(&req, 0, sizeof(req));
+
while(argc>arg) {
if(!strcmp("--version", argv[arg])) {
printf("rtspd IPv4%s"
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 78588d3a..6695d848 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -405,7 +405,8 @@ static ssize_t fullwrite(int filedes, const void *buffer, size_t nbytes)
ssize_t nwrite = 0;
do {
- wc = write(filedes, (unsigned char *)buffer + nwrite, nbytes - nwrite);
+ wc = write(filedes, (const unsigned char *)buffer + nwrite,
+ nbytes - nwrite);
if(got_exit_signal) {
logmsg("signalled to die");
@@ -548,7 +549,7 @@ static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter)
free(data);
}
else
- return -1;
+ return (DWORD)-1;
/* retrieve the type of file to wait on */
type = GetFileType(handle);
@@ -1338,7 +1339,7 @@ int main(int argc, char *argv[])
curl_socket_t sock = CURL_SOCKET_BAD;
curl_socket_t msgsock = CURL_SOCKET_BAD;
int wrotepidfile = 0;
- char *pidname= (char *)".sockfilt.pid";
+ const char *pidname = ".sockfilt.pid";
bool juggle_again;
int rc;
int error;
diff --git a/tests/server/sws.c b/tests/server/sws.c
index c4125a0a..bff30f21 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -130,7 +130,7 @@ static curl_socket_t all_sockets[MAX_SOCKETS];
static size_t num_sockets = 0;
static int ProcessRequest(struct httprequest *req);
-static void storerequest(char *reqbuf, size_t totalsize);
+static void storerequest(const char *reqbuf, size_t totalsize);
#define DEFAULT_PORT 8999
@@ -602,6 +602,14 @@ 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". */
@@ -843,7 +851,7 @@ static int ProcessRequest(struct httprequest *req)
}
/* store the entire request in a file */
-static void storerequest(char *reqbuf, size_t totalsize)
+static void storerequest(const char *reqbuf, size_t totalsize)
{
int res;
int error = 0;
@@ -1194,20 +1202,24 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
responsesize = count;
do {
- /* Ok, we send no more than 200 bytes at a time, just to make sure that
+ /* Ok, we send no more than N bytes at a time, just to make sure that
larger chunks are split up so that the client will need to do multiple
recv() calls to get it and thus we exercise that code better */
size_t num = count;
- if(num > 200)
- num = 200;
+ if(num > 20)
+ num = 20;
+
+ retry:
written = swrite(sock, buffer, num);
if(written < 0) {
+ if((EWOULDBLOCK == SOCKERRNO) || (EAGAIN == SOCKERRNO)) {
+ wait_ms(10);
+ goto retry;
+ }
sendfailure = TRUE;
break;
}
- else {
- logmsg("Sent off %zd bytes", written);
- }
+
/* write to file as well */
fwrite(buffer, 1, (size_t)written, dump);
@@ -1482,7 +1494,7 @@ static void http_connect(curl_socket_t *infdp,
maxfd = clientfd[i];
}
if(poll_client_wr[i] && toc[i]) {
- /* unless told not to do so, monitor writeability
+ /* unless told not to do so, monitor writability
if there is data ready to be sent to client */
FD_SET(clientfd[i], &output);
if(clientfd[i] > maxfd)
@@ -1498,7 +1510,7 @@ static void http_connect(curl_socket_t *infdp,
maxfd = serverfd[i];
}
if(poll_server_wr[i] && tos[i]) {
- /* unless told not to do so, monitor writeability
+ /* unless told not to do so, monitor writability
if there is data ready to be sent to server */
FD_SET(serverfd[i], &output);
if(serverfd[i] > maxfd)
@@ -1591,7 +1603,7 @@ static void http_connect(curl_socket_t *infdp,
/* ---------------------------------------------------------- */
- /* react to tunnel endpoint readable/writeable notifications */
+ /* react to tunnel endpoint readable/writable notifications */
for(i = 0; i <= max_tunnel_idx; i++) {
size_t len;
if(clientfd[i] != CURL_SOCKET_BAD) {
@@ -1887,7 +1899,7 @@ static int service_connection(curl_socket_t msgsock, struct httprequest *req,
while(!req->done_processing) {
int rc = get_request(msgsock, req);
if(rc <= 0) {
- /* Nothing further to read now (possibly because the socket was closed */
+ /* Nothing further to read now, possibly because the socket was closed */
return rc;
}
}
@@ -1958,7 +1970,7 @@ int main(int argc, char *argv[])
const char *unix_socket = NULL;
bool unlink_socket = false;
#endif
- char *pidname= (char *)".http.pid";
+ const char *pidname = ".http.pid";
struct httprequest req;
int rc = 0;
int error;
@@ -2248,7 +2260,7 @@ int main(int argc, char *argv[])
if(got_exit_signal)
goto sws_cleanup;
- /* Set up for select*/
+ /* Set up for select */
FD_ZERO(&input);
FD_ZERO(&output);
@@ -2274,7 +2286,7 @@ int main(int argc, char *argv[])
goto sws_cleanup;
if(rc == 0) {
- /* Timed out - try again*/
+ /* Timed out - try again */
continue;
}
@@ -2308,7 +2320,7 @@ int main(int argc, char *argv[])
if(req.connmon) {
const char *keepopen="[DISCONNECT]\n";
- storerequest((char *)keepopen, strlen(keepopen));
+ storerequest(keepopen, strlen(keepopen));
}
if(!req.open)
diff --git a/tests/server/testpart.c b/tests/server/testpart.c
index f3a70c7c..79869e21 100644
--- a/tests/server/testpart.c
+++ b/tests/server/testpart.c
@@ -23,8 +23,7 @@
#include "getpart.h"
-#define _MPRINTF_REPLACE /* use our functions only */
-#include <curl/mprintf.h>
+#include "curl_printf.h"
/* include memdebug.h last */
#include "memdebug.h"
diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c
index c8667437..df01eb78 100644
--- a/tests/server/tftpd.c
+++ b/tests/server/tftpd.c
@@ -199,8 +199,8 @@ static curl_socklen_t fromlen;
static curl_socket_t peer = CURL_SOCKET_BAD;
-static int timeout;
-static int maxtimeout = 5 * TIMEOUT;
+static unsigned int timeout;
+static unsigned int maxtimeout = 5 * TIMEOUT;
#ifdef ENABLE_IPV6
static bool use_ipv6 = FALSE;
@@ -208,7 +208,7 @@ static bool use_ipv6 = FALSE;
static const char *ipv_inuse = "IPv4";
const char *serverlogfile = DEFAULT_LOGFILE;
-static char *pidname= (char *)".tftpd.pid";
+static const char *pidname = ".tftpd.pid";
static int serverlogslocked = 0;
static int wrotepidfile = 0;
@@ -217,7 +217,7 @@ static sigjmp_buf timeoutbuf;
#endif
#if defined(HAVE_ALARM) && defined(SIGALRM)
-static int rexmtval = TIMEOUT;
+static const unsigned int rexmtval = TIMEOUT;
#endif
/* do-nothing macro replacement for systems which lack siginterrupt() */
@@ -960,7 +960,7 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
#ifdef USE_WINSOCK
DWORD recvtimeout, recvtimeoutbak;
#endif
- char *option = (char *)"mode"; /* mode is implicit */
+ const char *option = "mode"; /* mode is implicit */
int toggle = 1;
/* Open request dump file. */
diff --git a/tests/server/util.c b/tests/server/util.c
index 8465cd9c..42e58534 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -34,10 +34,13 @@
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
-#ifdef HAVE_SYS_POLL_H
-#include <sys/poll.h>
-#elif defined(HAVE_POLL_H)
+#ifdef HAVE_POLL_H
#include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+#include <sys/poll.h>
+#endif
+#ifdef __MINGW32__
+#include <w32api.h>
#endif
#define ENABLE_CURLX_PRINTF
@@ -55,9 +58,14 @@
#define EINVAL 22 /* errno.h value */
#endif
+/* MinGW with w32api version < 3.6 declared in6addr_any as extern,
+ but lacked the definition */
#if defined(ENABLE_IPV6) && defined(__MINGW32__)
+#if (__W32API_MAJOR_VERSION < 3) || \
+ ((__W32API_MAJOR_VERSION == 3) && (__W32API_MINOR_VERSION < 6))
const struct in6_addr in6addr_any = {{ IN6ADDR_ANY_INIT }};
-#endif
+#endif /* w32api < 3.6 */
+#endif /* ENABLE_IPV6 && __MINGW32__*/
/* This function returns a pointer to STATIC memory. It converts the given
* binary lump to a hex formatted string usable for output in logs or
@@ -92,7 +100,7 @@ void logmsg(const char *msg, ...)
char buffer[2048 + 1];
FILE *logfp;
int error;
- struct timeval tv;
+ struct curltime tv;
time_t sec;
struct tm *now;
char timebuf[20];
@@ -205,7 +213,7 @@ int wait_ms(int timeout_ms)
#ifndef HAVE_POLL_FINE
struct timeval pending_tv;
#endif
- struct timeval initial_tv;
+ struct curltime initial_tv;
int pending_ms;
int error;
#endif
diff --git a/tests/serverhelp.pm b/tests/serverhelp.pm
index d6a06508..a83a1258 100644
--- a/tests/serverhelp.pm
+++ b/tests/serverhelp.pm
@@ -105,7 +105,7 @@ sub servername_str {
$proto = uc($proto) if($proto);
die "unsupported protocol: '$proto'" unless($proto &&
- ($proto =~ /^(((FTP|HTTP|HTTP\/2|IMAP|POP3|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|GOPHER|HTTPTLS))$/));
+ ($proto =~ /^(((FTP|HTTP|HTTP\/2|IMAP|POP3|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|GOPHER|HTTPTLS|DICT|SMB|SMBS|TELNET))$/));
$ipver = (not $ipver) ? 'ipv4' : lc($ipver);
die "unsupported IP version: '$ipver'" unless($ipver &&
diff --git a/tests/smbserver.py b/tests/smbserver.py
new file mode 100755
index 00000000..195ae395
--- /dev/null
+++ b/tests/smbserver.py
@@ -0,0 +1,377 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 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.
+#
+"""Server for testing SMB"""
+
+from __future__ import (absolute_import, division, print_function)
+# unicode_literals)
+import argparse
+import ConfigParser
+import os
+import sys
+import logging
+import tempfile
+
+# Import our curl test data helper
+import curl_test_data
+
+# This saves us having to set up the PYTHONPATH explicitly
+deps_dir = os.path.join(os.path.dirname(__file__), "python_dependencies")
+sys.path.append(deps_dir)
+from impacket import smbserver as imp_smbserver
+from impacket import smb as imp_smb
+from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_SUCCESS,
+ STATUS_NO_SUCH_FILE)
+
+log = logging.getLogger(__name__)
+SERVER_MAGIC = "SERVER_MAGIC"
+TESTS_MAGIC = "TESTS_MAGIC"
+VERIFIED_REQ = "verifiedserver"
+VERIFIED_RSP = b"WE ROOLZ: {pid}\n"
+
+
+def smbserver(options):
+ """Start up a TCP SMB server that serves forever
+
+ """
+ if options.pidfile:
+ pid = os.getpid()
+ with open(options.pidfile, "w") as f:
+ f.write("{0}".format(pid))
+
+ # Here we write a mini config for the server
+ smb_config = ConfigParser.ConfigParser()
+ smb_config.add_section("global")
+ smb_config.set("global", "server_name", "SERVICE")
+ smb_config.set("global", "server_os", "UNIX")
+ smb_config.set("global", "server_domain", "WORKGROUP")
+ smb_config.set("global", "log_file", "")
+ smb_config.set("global", "credentials_file", "")
+
+ # We need a share which allows us to test that the server is running
+ smb_config.add_section("SERVER")
+ smb_config.set("SERVER", "comment", "server function")
+ smb_config.set("SERVER", "read only", "yes")
+ smb_config.set("SERVER", "share type", "0")
+ smb_config.set("SERVER", "path", SERVER_MAGIC)
+
+ # Have a share for tests. These files will be autogenerated from the
+ # test input.
+ smb_config.add_section("TESTS")
+ smb_config.set("TESTS", "comment", "tests")
+ smb_config.set("TESTS", "read only", "yes")
+ smb_config.set("TESTS", "share type", "0")
+ smb_config.set("TESTS", "path", TESTS_MAGIC)
+
+ if not options.srcdir or not os.path.isdir(options.srcdir):
+ raise ScriptException("--srcdir is mandatory")
+
+ test_data_dir = os.path.join(options.srcdir, "data")
+
+ smb_server = TestSmbServer(("127.0.0.1", options.port),
+ config_parser=smb_config,
+ test_data_directory=test_data_dir)
+ log.info("[SMB] setting up SMB server on port %s", options.port)
+ smb_server.processConfigFile()
+ smb_server.serve_forever()
+ return 0
+
+
+class TestSmbServer(imp_smbserver.SMBSERVER):
+ """
+ Test server for SMB which subclasses the impacket SMBSERVER and provides
+ test functionality.
+ """
+
+ def __init__(self,
+ address,
+ config_parser=None,
+ test_data_directory=None):
+ imp_smbserver.SMBSERVER.__init__(self,
+ address,
+ config_parser=config_parser)
+
+ # Set up a test data object so we can get test data later.
+ self.ctd = curl_test_data.TestData(test_data_directory)
+
+ # Override smbComNtCreateAndX so we can pretend to have files which
+ # don't exist.
+ self.hookSmbCommand(imp_smb.SMB.SMB_COM_NT_CREATE_ANDX,
+ self.create_and_x)
+
+ def create_and_x(self, conn_id, smb_server, smb_command, recv_packet):
+ """
+ Our version of smbComNtCreateAndX looks for special test files and
+ fools the rest of the framework into opening them as if they were
+ normal files.
+ """
+ conn_data = smb_server.getConnectionData(conn_id)
+
+ # Wrap processing in a try block which allows us to throw SmbException
+ # to control the flow.
+ try:
+ ncax_parms = imp_smb.SMBNtCreateAndX_Parameters(
+ smb_command["Parameters"])
+
+ path = self.get_share_path(conn_data,
+ ncax_parms["RootFid"],
+ recv_packet["Tid"])
+ log.info("[SMB] Requested share path: %s", path)
+
+ disposition = ncax_parms["Disposition"]
+ log.debug("[SMB] Requested disposition: %s", disposition)
+
+ # Currently we only support reading files.
+ if disposition != imp_smb.FILE_OPEN:
+ raise SmbException(STATUS_ACCESS_DENIED,
+ "Only support reading files")
+
+ # Check to see if the path we were given is actually a
+ # magic path which needs generating on the fly.
+ if path not in [SERVER_MAGIC, TESTS_MAGIC]:
+ # Pass the command onto the original handler.
+ return imp_smbserver.SMBCommands.smbComNtCreateAndX(conn_id,
+ smb_server,
+ smb_command,
+ recv_packet)
+
+ flags2 = recv_packet["Flags2"]
+ ncax_data = imp_smb.SMBNtCreateAndX_Data(flags=flags2,
+ data=smb_command[
+ "Data"])
+ requested_file = imp_smbserver.decodeSMBString(
+ flags2,
+ ncax_data["FileName"])
+ log.debug("[SMB] User requested file '%s'", requested_file)
+
+ if path == SERVER_MAGIC:
+ fid, full_path = self.get_server_path(requested_file)
+ else:
+ assert (path == TESTS_MAGIC)
+ fid, full_path = self.get_test_path(requested_file)
+
+ resp_parms = imp_smb.SMBNtCreateAndXResponse_Parameters()
+ resp_data = ""
+
+ # Simple way to generate a fid
+ if len(conn_data["OpenedFiles"]) == 0:
+ fakefid = 1
+ else:
+ fakefid = conn_data["OpenedFiles"].keys()[-1] + 1
+ resp_parms["Fid"] = fakefid
+ resp_parms["CreateAction"] = disposition
+
+ if os.path.isdir(path):
+ resp_parms[
+ "FileAttributes"] = imp_smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ resp_parms["IsDirectory"] = 1
+ else:
+ resp_parms["IsDirectory"] = 0
+ resp_parms["FileAttributes"] = ncax_parms["FileAttributes"]
+
+ # Get this file's information
+ resp_info, error_code = imp_smbserver.queryPathInformation(
+ "", full_path, level=imp_smb.SMB_QUERY_FILE_ALL_INFO)
+
+ if error_code != STATUS_SUCCESS:
+ raise SmbException(error_code, "Failed to query path info")
+
+ resp_parms["CreateTime"] = resp_info["CreationTime"]
+ resp_parms["LastAccessTime"] = resp_info[
+ "LastAccessTime"]
+ resp_parms["LastWriteTime"] = resp_info["LastWriteTime"]
+ resp_parms["LastChangeTime"] = resp_info[
+ "LastChangeTime"]
+ resp_parms["FileAttributes"] = resp_info[
+ "ExtFileAttributes"]
+ resp_parms["AllocationSize"] = resp_info[
+ "AllocationSize"]
+ resp_parms["EndOfFile"] = resp_info["EndOfFile"]
+
+ # Let's store the fid for the connection
+ # smbServer.log("Create file %s, mode:0x%x" % (pathName, mode))
+ conn_data["OpenedFiles"][fakefid] = {}
+ conn_data["OpenedFiles"][fakefid]["FileHandle"] = fid
+ conn_data["OpenedFiles"][fakefid]["FileName"] = path
+ conn_data["OpenedFiles"][fakefid]["DeleteOnClose"] = False
+
+ except SmbException as s:
+ log.debug("[SMB] SmbException hit: %s", s)
+ error_code = s.error_code
+ resp_parms = ""
+ resp_data = ""
+
+ resp_cmd = imp_smb.SMBCommand(imp_smb.SMB.SMB_COM_NT_CREATE_ANDX)
+ resp_cmd["Parameters"] = resp_parms
+ resp_cmd["Data"] = resp_data
+ smb_server.setConnectionData(conn_id, conn_data)
+
+ return [resp_cmd], None, error_code
+
+ def get_share_path(self, conn_data, root_fid, tid):
+ conn_shares = conn_data["ConnectedShares"]
+
+ if tid in conn_shares:
+ if root_fid > 0:
+ # If we have a rootFid, the path is relative to that fid
+ path = conn_data["OpenedFiles"][root_fid]["FileName"]
+ log.debug("RootFid present %s!" % path)
+ else:
+ if "path" in conn_shares[tid]:
+ path = conn_shares[tid]["path"]
+ else:
+ raise SmbException(STATUS_ACCESS_DENIED,
+ "Connection share had no path")
+ else:
+ raise SmbException(imp_smbserver.STATUS_SMB_BAD_TID,
+ "TID was invalid")
+
+ return path
+
+ def get_server_path(self, requested_filename):
+ log.debug("[SMB] Get server path '%s'", requested_filename)
+
+ if requested_filename not in [VERIFIED_REQ]:
+ raise SmbException(STATUS_NO_SUCH_FILE, "Couldn't find the file")
+
+ fid, filename = tempfile.mkstemp()
+ log.debug("[SMB] Created %s (%d) for storing '%s'",
+ filename, fid, requested_filename)
+
+ contents = ""
+
+ if requested_filename == VERIFIED_REQ:
+ log.debug("[SMB] Verifying server is alive")
+ contents = VERIFIED_RSP.format(pid=os.getpid())
+
+ self.write_to_fid(fid, contents)
+ return fid, filename
+
+ def write_to_fid(self, fid, contents):
+ # Write the contents to file descriptor
+ os.write(fid, contents)
+ os.fsync(fid)
+
+ # Rewind the file to the beginning so a read gets us the contents
+ os.lseek(fid, 0, os.SEEK_SET)
+
+ def get_test_path(self, requested_filename):
+ log.info("[SMB] Get reply data from 'test%s'", requested_filename)
+
+ fid, filename = tempfile.mkstemp()
+ log.debug("[SMB] Created %s (%d) for storing test '%s'",
+ filename, fid, requested_filename)
+
+ try:
+ contents = self.ctd.get_test_data(requested_filename)
+ self.write_to_fid(fid, contents)
+ return fid, filename
+
+ except Exception:
+ log.exception("Failed to make test file")
+ raise SmbException(STATUS_NO_SUCH_FILE, "Failed to make test file")
+
+
+class SmbException(Exception):
+ def __init__(self, error_code, error_message):
+ super(SmbException, self).__init__(error_message)
+ self.error_code = error_code
+
+
+class ScriptRC(object):
+ """Enum for script return codes"""
+ SUCCESS = 0
+ FAILURE = 1
+ EXCEPTION = 2
+
+
+class ScriptException(Exception):
+ pass
+
+
+def get_options():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument("--port", action="store", default=9017,
+ type=int, help="port to listen on")
+ parser.add_argument("--verbose", action="store", type=int, default=0,
+ help="verbose output")
+ parser.add_argument("--pidfile", action="store",
+ help="file name for the PID")
+ parser.add_argument("--logfile", action="store",
+ help="file name for the log")
+ parser.add_argument("--srcdir", action="store", help="test directory")
+ parser.add_argument("--id", action="store", help="server ID")
+ parser.add_argument("--ipv4", action="store_true", default=0,
+ help="IPv4 flag")
+
+ return parser.parse_args()
+
+
+def setup_logging(options):
+ """
+ Set up logging from the command line options
+ """
+ root_logger = logging.getLogger()
+ add_stdout = False
+
+ formatter = logging.Formatter("%(asctime)s %(levelname)-5.5s %(message)s")
+
+ # Write out to a logfile
+ if options.logfile:
+ handler = logging.FileHandler(options.logfile, mode="w")
+ handler.setFormatter(formatter)
+ handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(handler)
+ else:
+ # The logfile wasn't specified. Add a stdout logger.
+ add_stdout = True
+
+ if options.verbose:
+ # Add a stdout logger as well in verbose mode
+ root_logger.setLevel(logging.DEBUG)
+ add_stdout = True
+ else:
+ root_logger.setLevel(logging.INFO)
+
+ if add_stdout:
+ stdout_handler = logging.StreamHandler(sys.stdout)
+ stdout_handler.setFormatter(formatter)
+ stdout_handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(stdout_handler)
+
+
+if __name__ == '__main__':
+ # Get the options from the user.
+ options = get_options()
+
+ # Setup logging using the user options
+ setup_logging(options)
+
+ # Run main script.
+ try:
+ rc = smbserver(options)
+ except Exception as e:
+ log.exception(e)
+ rc = ScriptRC.EXCEPTION
+
+ log.info("[SMB] Returning %d", rc)
+ sys.exit(rc)
diff --git a/tests/sshserver.pl b/tests/sshserver.pl
index 3ebf8e67..9b3d122f 100755
--- a/tests/sshserver.pl
+++ b/tests/sshserver.pl
@@ -84,7 +84,7 @@ 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; # dafault ssh daemon instance number
+my $idnum = 1; # default ssh daemon instance number
my $proto = 'ssh'; # protocol the ssh daemon speaks
my $path = getcwd(); # current working directory
my $logdir = $path .'/log'; # directory for log files
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index ee07d64f..22c7026d 100644
--- a/tests/testcurl.1
+++ b/tests/testcurl.1
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH testcurl.pl 1 "24 Mar 2010" "Curl 7.20.1" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.55.0" "testcurl"
+
.SH NAME
testcurl.pl \- (automatically) test curl
.SH SYNOPSIS
diff --git a/tests/testcurl.html b/tests/testcurl.html
deleted file mode 100644
index 73d38cf7..00000000
--- a/tests/testcurl.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html><head>
-<title>testcurl.pl man page</title>
-<meta name="generator" content="roffit">
-<STYLE type="text/css">
-pre {
- overflow: auto;
- margin: 0;
-}
-
-P.level0, pre.level0 {
- padding-left: 2em;
-}
-
-P.level1, pre.level1 {
- padding-left: 4em;
-}
-
-P.level2, pre.level2 {
- padding-left: 6em;
-}
-
-span.emphasis {
- font-style: italic;
-}
-
-span.bold {
- font-weight: bold;
-}
-
-span.manpage {
- font-weight: bold;
-}
-
-h2.nroffsh {
- background-color: #e0e0e0;
-}
-
-span.nroffip {
- font-weight: bold;
- font-size: 120%;
- font-family: monospace;
-}
-
-p.roffit {
- text-align: center;
- font-size: 80%;
-}
-</STYLE>
-</head><body>
-
-<p class="level0"><a name="NAME"></a><h2 class="nroffsh">NAME</h2>
-<p class="level0">testcurl.pl - (automatically) test curl <a name="SYNOPSIS"></a><h2 class="nroffsh">SYNOPSIS</h2>
-<p class="level0"><span Class="bold">testcurl.pl [options] [dir] &gt; output</span> <a name="DESCRIPTION"></a><h2 class="nroffsh">DESCRIPTION</h2>
-<p class="level0"><span Class="emphasis">testcurl.pl</span> is the master script to use for automatic testing of curl off git or daily snapshots. It is written for the purpose of being run from a crontab job or similar at a regular interval. The output is suitable to be mailed to curl-autocompile@haxx.se to be dealt with automatically (make sure the subject includes the word "autobuild" as the mail gets silently discarded otherwise). The most current build status (with a reasonable backlog) will be published on the curl site, at <a href="https://curl.haxx.se/dev/builds.html">https://curl.haxx.se/dev/builds.html</a>
-<p class="level0"><span Class="emphasis">options</span> may be omitted. See <span Class="emphasis">--setup</span> for what happens then.
-<p class="level0"><span Class="emphasis">dir</span> is a curl source dir, possibly a daily snapshot one. Using this will make testcurl.pl skip the 'buildconf' stage and thus it removes the dependency on automake, autoconf, libtool, GNU m4 and possibly a few other things.
-<p class="level0">testcurl.pl will run 'buildconf' (or similar), run configure, build curl and libcurl in a separate build directory and then run 'make test' to test the fresh build. <a name="OPTIONS"></a><h2 class="nroffsh">OPTIONS</h2>
-<p class="level0">
-<p class="level0"><a name="--configureoptions"></a><span class="nroffip">--configure=[options]</span>
-<p class="level1">Configure options passed to configure.
-<p class="level0"><a name="--crosscompile"></a><span class="nroffip">--crosscompile</span>
-<p class="level1">This is a cross-compile. Makes <span Class="emphasis">testcurl.pl</span> skip a few things.
-<p class="level0"><a name="--descdesc"></a><span class="nroffip">--desc=[desc]</span>
-<p class="level1">Description of your test system. Displayed on the build summary page on the weba site.
-<p class="level0"><a name="--emailemail"></a><span class="nroffip">--email=[email]</span>
-<p class="level1">Set email address to report as. Displayed in the build logs on the site.
-<p class="level0"><a name="--mktarballcommand"></a><span class="nroffip">--mktarball=[command]</span>
-<p class="level1">Generic command to run after completed test.
-<p class="level0"><a name="--namename"></a><span class="nroffip">--name=[name]</span>
-<p class="level1">Set name to report as. Displayed in the build summary on the site.
-<p class="level0"><a name="--nobuildconf"></a><span class="nroffip">--nobuildconf</span>
-<p class="level1">Don't run buildconf. Useful when many builds use the same source tree, as then only one need to do this. Also, if multiple processes run tests simultaneously on the same source tree (like several hosts on a NFS mounted dir), simultaneous buildconf invokes may cause problems. (Added in 7.14.1)
-<p class="level0"><a name="--nogitpull"></a><span class="nroffip">--nogitpull</span>
-<p class="level1">Don't update from git even though it is a git tree. Useful to still be able to test even though your network is down, or similar.
-<p class="level0"><a name="--runtestoptsoptions"></a><span class="nroffip">--runtestopts=[options]</span>
-<p class="level1">Options that is passed to the runtests.pl script. Useful for disabling valgrind by force, and similar.
-<p class="level0"><a name="--setupfile"></a><span class="nroffip">--setup=[file name]</span>
-<p class="level1">File name to read setup from (deprecated). The old style of providing info. If info is missing when testcurl.pl is started, it will prompt you and then store the info in a 'setup' file, which it will look for on each invoke. Use <span Class="emphasis">--name</span>, <span Class="emphasis">--email</span>, <span Class="emphasis">--configure</span> and <span Class="emphasis">--desc</span> instead.
-<p class="level0"><a name="--targetyour"></a><span class="nroffip">--target=[your os]</span>
-<p class="level1">Specify your target environment. Recognized strings include 'vc', 'mingw32', 'borland' and 'netware'. <a name="INITIAL"></a><h2 class="nroffsh">INITIAL SETUP</h2>
-<p class="level0">First you make a checkout from git (or you write a script that downloads daily snapshots automatically, find inspiration in <a href="https://curl.haxx.se/dev/autocurl.txt">https://curl.haxx.se/dev/autocurl.txt</a> ):
-<p class="level0"><pre class="level0">
-&nbsp; $ mkdir daily-curl
-&nbsp; $ cd daily-curl
-&nbsp; $ git clone https://github.com/curl/curl.git
-</pre>
-
-<p class="level0">
-<p class="level0">With the curl sources checked out, or downloaded, you can start testing right away. If you want to use <span Class="emphasis">testcurl.pl</span> without command line arguments and to have it store and remember the config in its 'setup' file, then start it manually now and fill in the answers to the questions it prompts you for:
-<p class="level0"><pre class="level0">
-&nbsp; $ ./curl/tests/testcurl.pl
-</pre>
-
-<p class="level0">
-<p class="level0">Now you are ready to go. If you let the script run, it will perform a full cycle and spit out lots of output. Mail us that output as described above. <a name="CRONTAB"></a><h2 class="nroffsh">CRONTAB EXAMPLE</h2>
-<p class="level0">The crontab could include something like this:
-<p class="level0"><pre class="level0">
-#35; autobuild curl:
-0 4 * * * cd daily-curl && ./testit.sh
-</pre>
-
-<p class="level0">
-<p class="level0">Where testit.sh is a shell script that could look similar to this:
-<p class="level0"><pre class="level0">
-mail="mail -s autobuild curl-autocompile@haxx.se"
-name="--name=whoami"
-email="--email=iamme@nowhere"
-desc='"--desc=supermachine Turbo 2000"'
-testprog="perl ./curl/tests/testcurl.pl $name $email $desc"
-opts1="--configure=--enable-debug"
-opts2="--configure=--enable-ipv6"
-&nbsp;
-&#35; run first test
-$testprog $opts1 | $mail
-&nbsp;
-&#35; run second test
-$testprog $opts2 | $mail
-<p class="roffit">
- This HTML page was made with <a href="http://daniel.haxx.se/projects/roffit/">roffit</a>.
-</body></html>
diff --git a/tests/testcurl.pdf b/tests/testcurl.pdf
deleted file mode 100644
index e691666a..00000000
--- a/tests/testcurl.pdf
+++ /dev/null
Binary files differ
diff --git a/tests/testcurl.pl b/tests/testcurl.pl
index dc35a026..9749bc7d 100755
--- a/tests/testcurl.pl
+++ b/tests/testcurl.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -588,7 +588,6 @@ if ($configurebuild) {
elsif ($^O eq 'linux') {
system("cp -afr $CURLDIR/* .");
system("cp -af $CURLDIR/Makefile.dist Makefile");
- system("cp -af $CURLDIR/include/curl/curlbuild.h.dist ./include/curl/curlbuild.h");
system("$make -i -C lib -f Makefile.$targetos prebuild");
system("$make -i -C src -f Makefile.$targetos prebuild");
if (-d "$CURLDIR/ares") {
@@ -609,20 +608,6 @@ if(-f "./libcurl.pc") {
}
}
-if(-f "./include/curl/curlbuild.h") {
- logit_spaced "display include/curl/curlbuild.h";
- if(open(F, "<./include/curl/curlbuild.h")) {
- while(<F>) {
- my $ll = $_;
- print $ll if(($ll =~ /^ *# *define *CURL_/) && ($ll !~ /__CURL_CURLBUILD_H/));
- }
- close(F);
- }
-}
-else {
- mydie "no curlbuild.h created/found";
-}
-
logit_spaced "display lib/$confheader";
open(F, "lib/$confheader") or die "lib/$confheader: $!";
while (<F>) {
diff --git a/tests/tftpserver.pl b/tests/tftpserver.pl
index a4c4e47c..8c84111b 100755
--- a/tests/tftpserver.pl
+++ b/tests/tftpserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -37,7 +37,7 @@ use serverhelp qw(
my $verbose = 0; # set to 1 for debugging
my $port = 8997; # just a default
my $ipvnum = 4; # default IP version of tftp server
-my $idnum = 1; # dafault tftp server instance number
+my $idnum = 1; # default tftp server instance number
my $proto = 'tftp'; # protocol the tftp server speaks
my $pidfile; # tftp server pid file
my $logfile; # tftp server log file
diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt
index 14589d68..a2999121 100644
--- a/tests/unit/CMakeLists.txt
+++ b/tests/unit/CMakeLists.txt
@@ -29,7 +29,7 @@ include_directories(
${CURL_SOURCE_DIR}/tests/libtest
${CURL_SOURCE_DIR}/src
${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
- ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h"
+ ${CURL_BINARY_DIR}/include # To be able to reach "curl/curl.h"
)
foreach(_testfile ${UT_SRC})
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index 7075f8c3..61b72c0d 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -26,8 +26,6 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
@@ -35,9 +33,7 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# $(top_srcdir)/ares is for in-tree c-ares's external include files
if USE_EMBEDDED_ARES
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
-I$(top_srcdir)/src \
@@ -45,9 +41,7 @@ AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-I$(top_builddir)/ares \
-I$(top_srcdir)/ares
else
-AM_CPPFLAGS = -I$(top_builddir)/include/curl \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
+AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
-I$(top_srcdir)/src \
@@ -63,9 +57,6 @@ LDADD = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la \
@LDFLAGS@ @LIBCURL_LIBS@
-DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
- $(top_builddir)/lib/libcurlu.la
-
AM_CPPFLAGS += -DCURL_STATICLIB -DUNITTESTS
# Makefile.inc provides neat definitions
diff --git a/tests/unit/Makefile.in b/tests/unit/Makefile.in
index cb00b4f0..5390e29d 100644
--- a/tests/unit/Makefile.in
+++ b/tests/unit/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -93,7 +93,8 @@ 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/curl-compilers.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.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 \
@@ -114,17 +115,17 @@ 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 \
- $(top_builddir)/include/curl/curlbuild.h
+CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 = unit1300$(EXEEXT) unit1301$(EXEEXT) unit1302$(EXEEXT) \
unit1303$(EXEEXT) unit1304$(EXEEXT) unit1305$(EXEEXT) \
unit1307$(EXEEXT) unit1308$(EXEEXT) unit1309$(EXEEXT) \
- unit1330$(EXEEXT) unit1394$(EXEEXT) unit1395$(EXEEXT) \
- unit1396$(EXEEXT) unit1397$(EXEEXT) unit1398$(EXEEXT) \
- unit1600$(EXEEXT) unit1601$(EXEEXT) unit1602$(EXEEXT) \
- unit1603$(EXEEXT) unit1604$(EXEEXT) unit1605$(EXEEXT)
+ unit1323$(EXEEXT) unit1330$(EXEEXT) unit1394$(EXEEXT) \
+ unit1395$(EXEEXT) unit1396$(EXEEXT) unit1397$(EXEEXT) \
+ unit1398$(EXEEXT) unit1399$(EXEEXT) unit1600$(EXEEXT) \
+ unit1601$(EXEEXT) unit1602$(EXEEXT) unit1603$(EXEEXT) \
+ unit1604$(EXEEXT) unit1605$(EXEEXT) unit1606$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
am__dirstamp = $(am__leading_dot)dirstamp
am__objects_1 = ../libtest/unit1300-first.$(OBJEXT)
@@ -185,79 +186,97 @@ unit1309_OBJECTS = $(am_unit1309_OBJECTS)
unit1309_LDADD = $(LDADD)
unit1309_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_10 = ../libtest/unit1330-first.$(OBJEXT)
-am_unit1330_OBJECTS = unit1330-unit1330.$(OBJEXT) $(am__objects_10)
+am__objects_10 = ../libtest/unit1323-first.$(OBJEXT)
+am_unit1323_OBJECTS = unit1323-unit1323.$(OBJEXT) $(am__objects_10)
+unit1323_OBJECTS = $(am_unit1323_OBJECTS)
+unit1323_LDADD = $(LDADD)
+unit1323_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+ $(top_builddir)/lib/libcurlu.la
+am__objects_11 = ../libtest/unit1330-first.$(OBJEXT)
+am_unit1330_OBJECTS = unit1330-unit1330.$(OBJEXT) $(am__objects_11)
unit1330_OBJECTS = $(am_unit1330_OBJECTS)
unit1330_LDADD = $(LDADD)
unit1330_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_11 = ../libtest/unit1394-first.$(OBJEXT)
-am_unit1394_OBJECTS = unit1394-unit1394.$(OBJEXT) $(am__objects_11)
+am__objects_12 = ../libtest/unit1394-first.$(OBJEXT)
+am_unit1394_OBJECTS = unit1394-unit1394.$(OBJEXT) $(am__objects_12)
unit1394_OBJECTS = $(am_unit1394_OBJECTS)
unit1394_DEPENDENCIES = $(top_builddir)/lib/libcurl.la
unit1394_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(unit1394_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_12 = ../libtest/unit1395-first.$(OBJEXT)
-am_unit1395_OBJECTS = unit1395-unit1395.$(OBJEXT) $(am__objects_12)
+am__objects_13 = ../libtest/unit1395-first.$(OBJEXT)
+am_unit1395_OBJECTS = unit1395-unit1395.$(OBJEXT) $(am__objects_13)
unit1395_OBJECTS = $(am_unit1395_OBJECTS)
unit1395_LDADD = $(LDADD)
unit1395_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_13 = ../libtest/unit1396-first.$(OBJEXT)
-am_unit1396_OBJECTS = unit1396-unit1396.$(OBJEXT) $(am__objects_13)
+am__objects_14 = ../libtest/unit1396-first.$(OBJEXT)
+am_unit1396_OBJECTS = unit1396-unit1396.$(OBJEXT) $(am__objects_14)
unit1396_OBJECTS = $(am_unit1396_OBJECTS)
unit1396_LDADD = $(LDADD)
unit1396_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_14 = ../libtest/unit1397-first.$(OBJEXT)
-am_unit1397_OBJECTS = unit1397-unit1397.$(OBJEXT) $(am__objects_14)
+am__objects_15 = ../libtest/unit1397-first.$(OBJEXT)
+am_unit1397_OBJECTS = unit1397-unit1397.$(OBJEXT) $(am__objects_15)
unit1397_OBJECTS = $(am_unit1397_OBJECTS)
unit1397_LDADD = $(LDADD)
unit1397_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_15 = ../libtest/unit1398-first.$(OBJEXT)
-am_unit1398_OBJECTS = unit1398-unit1398.$(OBJEXT) $(am__objects_15)
+am__objects_16 = ../libtest/unit1398-first.$(OBJEXT)
+am_unit1398_OBJECTS = unit1398-unit1398.$(OBJEXT) $(am__objects_16)
unit1398_OBJECTS = $(am_unit1398_OBJECTS)
unit1398_LDADD = $(LDADD)
unit1398_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_16 = ../libtest/unit1600-first.$(OBJEXT)
-am_unit1600_OBJECTS = unit1600-unit1600.$(OBJEXT) $(am__objects_16)
+am__objects_17 = ../libtest/unit1399-first.$(OBJEXT)
+am_unit1399_OBJECTS = unit1399-unit1399.$(OBJEXT) $(am__objects_17)
+unit1399_OBJECTS = $(am_unit1399_OBJECTS)
+unit1399_LDADD = $(LDADD)
+unit1399_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+ $(top_builddir)/lib/libcurlu.la
+am__objects_18 = ../libtest/unit1600-first.$(OBJEXT)
+am_unit1600_OBJECTS = unit1600-unit1600.$(OBJEXT) $(am__objects_18)
unit1600_OBJECTS = $(am_unit1600_OBJECTS)
unit1600_LDADD = $(LDADD)
unit1600_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_17 = ../libtest/unit1601-first.$(OBJEXT)
-am_unit1601_OBJECTS = unit1601-unit1601.$(OBJEXT) $(am__objects_17)
+am__objects_19 = ../libtest/unit1601-first.$(OBJEXT)
+am_unit1601_OBJECTS = unit1601-unit1601.$(OBJEXT) $(am__objects_19)
unit1601_OBJECTS = $(am_unit1601_OBJECTS)
unit1601_LDADD = $(LDADD)
unit1601_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_18 = ../libtest/unit1602-first.$(OBJEXT)
-am_unit1602_OBJECTS = unit1602-unit1602.$(OBJEXT) $(am__objects_18)
+am__objects_20 = ../libtest/unit1602-first.$(OBJEXT)
+am_unit1602_OBJECTS = unit1602-unit1602.$(OBJEXT) $(am__objects_20)
unit1602_OBJECTS = $(am_unit1602_OBJECTS)
unit1602_LDADD = $(LDADD)
unit1602_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_19 = ../libtest/unit1603-first.$(OBJEXT)
-am_unit1603_OBJECTS = unit1603-unit1603.$(OBJEXT) $(am__objects_19)
+am__objects_21 = ../libtest/unit1603-first.$(OBJEXT)
+am_unit1603_OBJECTS = unit1603-unit1603.$(OBJEXT) $(am__objects_21)
unit1603_OBJECTS = $(am_unit1603_OBJECTS)
unit1603_LDADD = $(LDADD)
unit1603_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_20 = ../libtest/unit1604-first.$(OBJEXT)
-am_unit1604_OBJECTS = unit1604-unit1604.$(OBJEXT) $(am__objects_20)
+am__objects_22 = ../libtest/unit1604-first.$(OBJEXT)
+am_unit1604_OBJECTS = unit1604-unit1604.$(OBJEXT) $(am__objects_22)
unit1604_OBJECTS = $(am_unit1604_OBJECTS)
unit1604_LDADD = $(LDADD)
unit1604_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
-am__objects_21 = ../libtest/unit1605-first.$(OBJEXT)
-am_unit1605_OBJECTS = unit1605-unit1605.$(OBJEXT) $(am__objects_21)
+am__objects_23 = ../libtest/unit1605-first.$(OBJEXT)
+am_unit1605_OBJECTS = unit1605-unit1605.$(OBJEXT) $(am__objects_23)
unit1605_OBJECTS = $(am_unit1605_OBJECTS)
unit1605_LDADD = $(LDADD)
unit1605_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la
+am__objects_24 = ../libtest/unit1606-first.$(OBJEXT)
+am_unit1606_OBJECTS = unit1606-unit1606.$(OBJEXT) $(am__objects_24)
+unit1606_OBJECTS = $(am_unit1606_OBJECTS)
+unit1606_LDADD = $(LDADD)
+unit1606_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
@@ -295,18 +314,20 @@ am__v_CCLD_1 =
SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) $(unit1302_SOURCES) \
$(unit1303_SOURCES) $(unit1304_SOURCES) $(unit1305_SOURCES) \
$(unit1307_SOURCES) $(unit1308_SOURCES) $(unit1309_SOURCES) \
- $(unit1330_SOURCES) $(unit1394_SOURCES) $(unit1395_SOURCES) \
- $(unit1396_SOURCES) $(unit1397_SOURCES) $(unit1398_SOURCES) \
- $(unit1600_SOURCES) $(unit1601_SOURCES) $(unit1602_SOURCES) \
- $(unit1603_SOURCES) $(unit1604_SOURCES) $(unit1605_SOURCES)
+ $(unit1323_SOURCES) $(unit1330_SOURCES) $(unit1394_SOURCES) \
+ $(unit1395_SOURCES) $(unit1396_SOURCES) $(unit1397_SOURCES) \
+ $(unit1398_SOURCES) $(unit1399_SOURCES) $(unit1600_SOURCES) \
+ $(unit1601_SOURCES) $(unit1602_SOURCES) $(unit1603_SOURCES) \
+ $(unit1604_SOURCES) $(unit1605_SOURCES) $(unit1606_SOURCES)
DIST_SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) \
$(unit1302_SOURCES) $(unit1303_SOURCES) $(unit1304_SOURCES) \
$(unit1305_SOURCES) $(unit1307_SOURCES) $(unit1308_SOURCES) \
- $(unit1309_SOURCES) $(unit1330_SOURCES) $(unit1394_SOURCES) \
- $(unit1395_SOURCES) $(unit1396_SOURCES) $(unit1397_SOURCES) \
- $(unit1398_SOURCES) $(unit1600_SOURCES) $(unit1601_SOURCES) \
- $(unit1602_SOURCES) $(unit1603_SOURCES) $(unit1604_SOURCES) \
- $(unit1605_SOURCES)
+ $(unit1309_SOURCES) $(unit1323_SOURCES) $(unit1330_SOURCES) \
+ $(unit1394_SOURCES) $(unit1395_SOURCES) $(unit1396_SOURCES) \
+ $(unit1397_SOURCES) $(unit1398_SOURCES) $(unit1399_SOURCES) \
+ $(unit1600_SOURCES) $(unit1601_SOURCES) $(unit1602_SOURCES) \
+ $(unit1603_SOURCES) $(unit1604_SOURCES) $(unit1605_SOURCES) \
+ $(unit1606_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -348,6 +369,12 @@ 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@
@@ -387,6 +414,8 @@ ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_STATIC = @ENABLE_STATIC@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
GREP = @GREP@
HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
@@ -399,6 +428,7 @@ 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@
@@ -534,7 +564,7 @@ top_srcdir = @top_srcdir@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 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
@@ -549,9 +579,7 @@ top_srcdir = @top_srcdir@
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
-@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_FALSE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/lib \
@USE_EMBEDDED_ARES_FALSE@ -I$(top_srcdir)/src \
@@ -563,16 +591,12 @@ AUTOMAKE_OPTIONS = foreign nostdinc
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
-# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h
-# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h
# $(top_srcdir)/include is for libcurl's external include files
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files
# $(top_builddir)/ares is for in-tree c-ares's generated ares_build.h file
# $(top_srcdir)/ares is for in-tree c-ares's external include files
-@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_builddir)/include/curl \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/include \
-@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/include \
+@USE_EMBEDDED_ARES_TRUE@AM_CPPFLAGS = -I$(top_srcdir)/include \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_builddir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/lib \
@USE_EMBEDDED_ARES_TRUE@ -I$(top_srcdir)/src \
@@ -585,9 +609,6 @@ LDADD = $(top_builddir)/src/libcurltool.la \
$(top_builddir)/lib/libcurlu.la \
@LDFLAGS@ @LIBCURL_LIBS@
-DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
- $(top_builddir)/lib/libcurlu.la
-
UNITFILES = curlcheck.h \
../libtest/test.h \
../libtest/first.c
@@ -595,8 +616,10 @@ UNITFILES = curlcheck.h \
# These are all unit test programs
UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
- unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
- unit1600 unit1601 unit1602 unit1603 unit1604 unit1605
+ unit1308 unit1309 unit1323 \
+ unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
+ unit1399 \
+ unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606
unit1300_SOURCES = unit1300.c $(UNITFILES)
unit1300_CPPFLAGS = $(AM_CPPFLAGS)
@@ -616,6 +639,8 @@ unit1308_SOURCES = unit1308.c $(UNITFILES)
unit1308_CPPFLAGS = $(AM_CPPFLAGS)
unit1309_SOURCES = unit1309.c $(UNITFILES)
unit1309_CPPFLAGS = $(AM_CPPFLAGS)
+unit1323_SOURCES = unit1323.c $(UNITFILES)
+unit1323_CPPFLAGS = $(AM_CPPFLAGS)
unit1330_SOURCES = unit1330.c $(UNITFILES)
unit1330_CPPFLAGS = $(AM_CPPFLAGS)
unit1394_SOURCES = unit1394.c $(UNITFILES)
@@ -631,6 +656,8 @@ unit1397_SOURCES = unit1397.c $(UNITFILES)
unit1397_CPPFLAGS = $(AM_CPPFLAGS)
unit1398_SOURCES = unit1398.c $(UNITFILES)
unit1398_CPPFLAGS = $(AM_CPPFLAGS)
+unit1399_SOURCES = unit1399.c $(UNITFILES)
+unit1399_CPPFLAGS = $(AM_CPPFLAGS)
unit1600_SOURCES = unit1600.c $(UNITFILES)
unit1600_CPPFLAGS = $(AM_CPPFLAGS)
unit1601_SOURCES = unit1601.c $(UNITFILES)
@@ -643,6 +670,8 @@ unit1604_SOURCES = unit1604.c $(UNITFILES)
unit1604_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
unit1605_SOURCES = unit1605.c $(UNITFILES)
unit1605_CPPFLAGS = $(AM_CPPFLAGS)
+unit1606_SOURCES = unit1606.c $(UNITFILES)
+unit1606_CPPFLAGS = $(AM_CPPFLAGS)
all: all-am
.SUFFIXES:
@@ -746,6 +775,12 @@ unit1308$(EXEEXT): $(unit1308_OBJECTS) $(unit1308_DEPENDENCIES) $(EXTRA_unit1308
unit1309$(EXEEXT): $(unit1309_OBJECTS) $(unit1309_DEPENDENCIES) $(EXTRA_unit1309_DEPENDENCIES)
@rm -f unit1309$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(unit1309_OBJECTS) $(unit1309_LDADD) $(LIBS)
+../libtest/unit1323-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+ ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1323$(EXEEXT): $(unit1323_OBJECTS) $(unit1323_DEPENDENCIES) $(EXTRA_unit1323_DEPENDENCIES)
+ @rm -f unit1323$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit1323_OBJECTS) $(unit1323_LDADD) $(LIBS)
../libtest/unit1330-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
../libtest/$(DEPDIR)/$(am__dirstamp)
@@ -782,6 +817,12 @@ unit1397$(EXEEXT): $(unit1397_OBJECTS) $(unit1397_DEPENDENCIES) $(EXTRA_unit1397
unit1398$(EXEEXT): $(unit1398_OBJECTS) $(unit1398_DEPENDENCIES) $(EXTRA_unit1398_DEPENDENCIES)
@rm -f unit1398$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(unit1398_OBJECTS) $(unit1398_LDADD) $(LIBS)
+../libtest/unit1399-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+ ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1399$(EXEEXT): $(unit1399_OBJECTS) $(unit1399_DEPENDENCIES) $(EXTRA_unit1399_DEPENDENCIES)
+ @rm -f unit1399$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit1399_OBJECTS) $(unit1399_LDADD) $(LIBS)
../libtest/unit1600-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
../libtest/$(DEPDIR)/$(am__dirstamp)
@@ -818,6 +859,12 @@ unit1604$(EXEEXT): $(unit1604_OBJECTS) $(unit1604_DEPENDENCIES) $(EXTRA_unit1604
unit1605$(EXEEXT): $(unit1605_OBJECTS) $(unit1605_DEPENDENCIES) $(EXTRA_unit1605_DEPENDENCIES)
@rm -f unit1605$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(unit1605_OBJECTS) $(unit1605_LDADD) $(LIBS)
+../libtest/unit1606-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+ ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1606$(EXEEXT): $(unit1606_OBJECTS) $(unit1606_DEPENDENCIES) $(EXTRA_unit1606_DEPENDENCIES)
+ @rm -f unit1606$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit1606_OBJECTS) $(unit1606_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -835,18 +882,21 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1307-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1308-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1309-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1323-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1330-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1394-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1395-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1396-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1397-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1398-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1399-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1600-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1601-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1602-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1603-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1604-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1605-first.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1606-first.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1300-unit1300.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1301-unit1301.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1302-unit1302.Po@am__quote@
@@ -856,18 +906,21 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1307-unit1307.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1308-unit1308.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1309-unit1309.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1323-unit1323.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1330-unit1330.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1394-unit1394.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1395-unit1395.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1396-unit1396.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1397-unit1397.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1398-unit1398.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1399-unit1399.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1600-unit1600.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1601-unit1601.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1602-unit1602.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1603-unit1603.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1604-unit1604.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1605-unit1605.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1606-unit1606.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -1145,6 +1198,34 @@ unit1309-unit1309.obj: unit1309.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1309_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1309-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+unit1323-unit1323.o: unit1323.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1323-unit1323.o -MD -MP -MF $(DEPDIR)/unit1323-unit1323.Tpo -c -o unit1323-unit1323.o `test -f 'unit1323.c' || echo '$(srcdir)/'`unit1323.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1323-unit1323.Tpo $(DEPDIR)/unit1323-unit1323.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1323.c' object='unit1323-unit1323.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) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1323-unit1323.o `test -f 'unit1323.c' || echo '$(srcdir)/'`unit1323.c
+
+unit1323-unit1323.obj: unit1323.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1323-unit1323.obj -MD -MP -MF $(DEPDIR)/unit1323-unit1323.Tpo -c -o unit1323-unit1323.obj `if test -f 'unit1323.c'; then $(CYGPATH_W) 'unit1323.c'; else $(CYGPATH_W) '$(srcdir)/unit1323.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1323-unit1323.Tpo $(DEPDIR)/unit1323-unit1323.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1323.c' object='unit1323-unit1323.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) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1323-unit1323.obj `if test -f 'unit1323.c'; then $(CYGPATH_W) 'unit1323.c'; else $(CYGPATH_W) '$(srcdir)/unit1323.c'; fi`
+
+../libtest/unit1323-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1323-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1323-first.Tpo -c -o ../libtest/unit1323-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1323-first.Tpo ../libtest/$(DEPDIR)/unit1323-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1323-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) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1323-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1323-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1323-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1323-first.Tpo -c -o ../libtest/unit1323-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)/unit1323-first.Tpo ../libtest/$(DEPDIR)/unit1323-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1323-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) $(unit1323_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1323-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
unit1330-unit1330.o: unit1330.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1330_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1330-unit1330.o -MD -MP -MF $(DEPDIR)/unit1330-unit1330.Tpo -c -o unit1330-unit1330.o `test -f 'unit1330.c' || echo '$(srcdir)/'`unit1330.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1330-unit1330.Tpo $(DEPDIR)/unit1330-unit1330.Po
@@ -1313,6 +1394,34 @@ unit1398-unit1398.obj: unit1398.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1398_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1398-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+unit1399-unit1399.o: unit1399.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1399-unit1399.o -MD -MP -MF $(DEPDIR)/unit1399-unit1399.Tpo -c -o unit1399-unit1399.o `test -f 'unit1399.c' || echo '$(srcdir)/'`unit1399.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1399-unit1399.Tpo $(DEPDIR)/unit1399-unit1399.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1399.c' object='unit1399-unit1399.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) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1399-unit1399.o `test -f 'unit1399.c' || echo '$(srcdir)/'`unit1399.c
+
+unit1399-unit1399.obj: unit1399.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1399-unit1399.obj -MD -MP -MF $(DEPDIR)/unit1399-unit1399.Tpo -c -o unit1399-unit1399.obj `if test -f 'unit1399.c'; then $(CYGPATH_W) 'unit1399.c'; else $(CYGPATH_W) '$(srcdir)/unit1399.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1399-unit1399.Tpo $(DEPDIR)/unit1399-unit1399.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1399.c' object='unit1399-unit1399.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) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1399-unit1399.obj `if test -f 'unit1399.c'; then $(CYGPATH_W) 'unit1399.c'; else $(CYGPATH_W) '$(srcdir)/unit1399.c'; fi`
+
+../libtest/unit1399-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1399-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1399-first.Tpo -c -o ../libtest/unit1399-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1399-first.Tpo ../libtest/$(DEPDIR)/unit1399-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1399-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) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1399-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1399-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1399-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1399-first.Tpo -c -o ../libtest/unit1399-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)/unit1399-first.Tpo ../libtest/$(DEPDIR)/unit1399-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1399-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) $(unit1399_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1399-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
unit1600-unit1600.o: unit1600.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1600_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1600-unit1600.o -MD -MP -MF $(DEPDIR)/unit1600-unit1600.Tpo -c -o unit1600-unit1600.o `test -f 'unit1600.c' || echo '$(srcdir)/'`unit1600.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1600-unit1600.Tpo $(DEPDIR)/unit1600-unit1600.Po
@@ -1481,6 +1590,34 @@ unit1605-unit1605.obj: unit1605.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1605_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1605-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+unit1606-unit1606.o: unit1606.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1606-unit1606.o -MD -MP -MF $(DEPDIR)/unit1606-unit1606.Tpo -c -o unit1606-unit1606.o `test -f 'unit1606.c' || echo '$(srcdir)/'`unit1606.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1606-unit1606.Tpo $(DEPDIR)/unit1606-unit1606.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1606.c' object='unit1606-unit1606.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) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1606-unit1606.o `test -f 'unit1606.c' || echo '$(srcdir)/'`unit1606.c
+
+unit1606-unit1606.obj: unit1606.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1606-unit1606.obj -MD -MP -MF $(DEPDIR)/unit1606-unit1606.Tpo -c -o unit1606-unit1606.obj `if test -f 'unit1606.c'; then $(CYGPATH_W) 'unit1606.c'; else $(CYGPATH_W) '$(srcdir)/unit1606.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/unit1606-unit1606.Tpo $(DEPDIR)/unit1606-unit1606.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unit1606.c' object='unit1606-unit1606.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) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1606-unit1606.obj `if test -f 'unit1606.c'; then $(CYGPATH_W) 'unit1606.c'; else $(CYGPATH_W) '$(srcdir)/unit1606.c'; fi`
+
+../libtest/unit1606-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1606-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1606-first.Tpo -c -o ../libtest/unit1606-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1606-first.Tpo ../libtest/$(DEPDIR)/unit1606-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1606-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) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1606-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1606-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1606-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1606-first.Tpo -c -o ../libtest/unit1606-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)/unit1606-first.Tpo ../libtest/$(DEPDIR)/unit1606-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1606-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) $(unit1606_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1606-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
diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc
index e7db96f5..bfb5c4d4 100644
--- a/tests/unit/Makefile.inc
+++ b/tests/unit/Makefile.inc
@@ -6,8 +6,10 @@ UNITFILES = curlcheck.h \
# These are all unit test programs
UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
- unit1308 unit1309 unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
- unit1600 unit1601 unit1602 unit1603 unit1604 unit1605
+ unit1308 unit1309 unit1323 \
+ unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
+ unit1399 \
+ unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606
unit1300_SOURCES = unit1300.c $(UNITFILES)
unit1300_CPPFLAGS = $(AM_CPPFLAGS)
@@ -36,6 +38,9 @@ unit1308_CPPFLAGS = $(AM_CPPFLAGS)
unit1309_SOURCES = unit1309.c $(UNITFILES)
unit1309_CPPFLAGS = $(AM_CPPFLAGS)
+unit1323_SOURCES = unit1323.c $(UNITFILES)
+unit1323_CPPFLAGS = $(AM_CPPFLAGS)
+
unit1330_SOURCES = unit1330.c $(UNITFILES)
unit1330_CPPFLAGS = $(AM_CPPFLAGS)
@@ -57,6 +62,9 @@ unit1397_CPPFLAGS = $(AM_CPPFLAGS)
unit1398_SOURCES = unit1398.c $(UNITFILES)
unit1398_CPPFLAGS = $(AM_CPPFLAGS)
+unit1399_SOURCES = unit1399.c $(UNITFILES)
+unit1399_CPPFLAGS = $(AM_CPPFLAGS)
+
unit1600_SOURCES = unit1600.c $(UNITFILES)
unit1600_CPPFLAGS = $(AM_CPPFLAGS)
@@ -74,3 +82,6 @@ unit1604_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
unit1605_SOURCES = unit1605.c $(UNITFILES)
unit1605_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1606_SOURCES = unit1606.c $(UNITFILES)
+unit1606_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/unit/curlcheck.h b/tests/unit/curlcheck.h
index 0660e2be..46cb84aa 100644
--- a/tests/unit/curlcheck.h
+++ b/tests/unit/curlcheck.h
@@ -39,9 +39,10 @@
#define verify_memory(dynamic, check, len) \
if(dynamic && memcmp(dynamic, check, len)) { \
fprintf(stderr, "%s:%d Memory buffer mismatch size %d. '%s' is not\n", \
- __FILE__, __LINE__, len, hexdump((unsigned char *)check, len)); \
- fprintf(stderr, "%s:%d the same as '%s'\n", \
- __FILE__, __LINE__, hexdump((unsigned char *)dynamic, len)); \
+ __FILE__, __LINE__, len, \
+ hexdump((const unsigned char *)check, len)); \
+ fprintf(stderr, "%s:%d the same as '%s'\n", __FILE__, __LINE__, \
+ hexdump((const unsigned char *)dynamic, len)); \
unitfail++; \
}
diff --git a/tests/unit/unit1300.c b/tests/unit/unit1300.c
index c4d9dd90..8ec32a8c 100644
--- a/tests/unit/unit1300.c
+++ b/tests/unit/unit1300.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -23,9 +23,9 @@
#include "llist.h"
-static struct curl_llist *llist;
+static struct curl_llist llist;
-static struct curl_llist *llist_destination;
+static struct curl_llist llist_destination;
static void test_curl_llist_dtor(void *key, void *value)
{
@@ -36,34 +36,32 @@ static void test_curl_llist_dtor(void *key, void *value)
static CURLcode unit_setup(void)
{
- llist = Curl_llist_alloc(test_curl_llist_dtor);
- if(!llist)
- return CURLE_OUT_OF_MEMORY;
- llist_destination = Curl_llist_alloc(test_curl_llist_dtor);
- if(!llist_destination) {
- Curl_llist_destroy(llist, NULL);
- return CURLE_OUT_OF_MEMORY;
- }
-
+ Curl_llist_init(&llist, test_curl_llist_dtor);
+ Curl_llist_init(&llist_destination, test_curl_llist_dtor);
return CURLE_OK;
}
static void unit_stop(void)
{
- Curl_llist_destroy(llist, NULL);
- Curl_llist_destroy(llist_destination, NULL);
+ Curl_llist_destroy(&llist, NULL);
+ Curl_llist_destroy(&llist_destination, NULL);
}
UNITTEST_START
+{
int unusedData_case1 = 1;
int unusedData_case2 = 2;
int unusedData_case3 = 3;
+ struct curl_llist_element case1_list;
+ struct curl_llist_element case2_list;
+ struct curl_llist_element case3_list;
+ struct curl_llist_element case4_list;
+ struct curl_llist_element case5_list;
struct curl_llist_element *head;
struct curl_llist_element *element_next;
struct curl_llist_element *element_prev;
struct curl_llist_element *to_remove;
- size_t llist_size = Curl_llist_count(llist);
- int curlErrCode = 0;
+ size_t llist_size = Curl_llist_count(&llist);
/**
* testing llist_init
@@ -76,10 +74,10 @@ UNITTEST_START
* 4: list dtor will be NULL
*/
- fail_unless(llist->size == 0, "list initial size should be zero");
- fail_unless(llist->head == NULL, "list head should initiate to NULL");
- fail_unless(llist->tail == NULL, "list tail should intiate to NULL");
- fail_unless(llist->dtor == test_curl_llist_dtor,
+ fail_unless(llist.size == 0, "list initial size should be zero");
+ fail_unless(llist.head == NULL, "list head should initiate to NULL");
+ fail_unless(llist.tail == NULL, "list tail should intiate to NULL");
+ fail_unless(llist.dtor == test_curl_llist_dtor,
"list dtor shold initiate to test_curl_llist_dtor");
/**
@@ -92,67 +90,49 @@ UNITTEST_START
* 3: list tail will be the same as list head
*/
- curlErrCode = Curl_llist_insert_next(llist, llist->head, &unusedData_case1);
- if(curlErrCode == 1) {
- fail_unless(Curl_llist_count(llist) == 1,
- "List size should be 1 after adding a new element");
- /*test that the list head data holds my unusedData */
- fail_unless(llist->head->ptr == &unusedData_case1,
- "List size should be 1 after adding a new element");
- /*same goes for the list tail */
- fail_unless(llist->tail == llist->head,
- "List size should be 1 after adding a new element");
-
- /**
- * testing Curl_llist_insert_next
- * case 2:
- * list has 1 element, adding one element after the head
- * @assumptions:
- * 1: the element next to head should be our newly created element
- * 2: the list tail should be our newly created element
- */
-
- curlErrCode = Curl_llist_insert_next(llist, llist->head,
- &unusedData_case3);
- if(curlErrCode == 1) {
- fail_unless(llist->head->next->ptr == &unusedData_case3,
- "the node next to head is not getting set correctly");
- fail_unless(llist->tail->ptr == &unusedData_case3,
- "the list tail is not getting set correctly");
- }
- else {
- printf("skipping Curl_llist_insert_next as a non "
- "success error code was returned\n");
- }
-
- /**
- * testing Curl_llist_insert_next
- * case 3:
- * list has >1 element, adding one element after "NULL"
- * @assumptions:
- * 1: the element next to head should be our newly created element
- * 2: the list tail should different from newly created element
- */
-
- curlErrCode = Curl_llist_insert_next(llist, llist->head,
- &unusedData_case2);
- if(curlErrCode == 1) {
- fail_unless(llist->head->next->ptr == &unusedData_case2,
- "the node next to head is not getting set correctly");
- /* better safe than sorry, check that the tail isn't corrupted */
- fail_unless(llist->tail->ptr != &unusedData_case2,
- "the list tail is not getting set correctly");
- }
- else {
- printf("skipping Curl_llist_insert_next as a non "
- "success error code was returned\n");
- }
-
- }
- else {
- printf("skipping Curl_llist_insert_next as a non "
- "success error code was returned\n");
- }
+ Curl_llist_insert_next(&llist, llist.head, &unusedData_case1, &case1_list);
+
+ fail_unless(Curl_llist_count(&llist) == 1,
+ "List size should be 1 after adding a new element");
+ /*test that the list head data holds my unusedData */
+ fail_unless(llist.head->ptr == &unusedData_case1,
+ "head ptr should be first entry");
+ /*same goes for the list tail */
+ fail_unless(llist.tail == llist.head,
+ "tail and head should be the same");
+
+ /**
+ * testing Curl_llist_insert_next
+ * case 2:
+ * list has 1 element, adding one element after the head
+ * @assumptions:
+ * 1: the element next to head should be our newly created element
+ * 2: the list tail should be our newly created element
+ */
+
+ Curl_llist_insert_next(&llist, llist.head,
+ &unusedData_case3, &case3_list);
+ fail_unless(llist.head->next->ptr == &unusedData_case3,
+ "the node next to head is not getting set correctly");
+ fail_unless(llist.tail->ptr == &unusedData_case3,
+ "the list tail is not getting set correctly");
+
+ /**
+ * testing Curl_llist_insert_next
+ * case 3:
+ * list has >1 element, adding one element after "NULL"
+ * @assumptions:
+ * 1: the element next to head should be our newly created element
+ * 2: the list tail should different from newly created element
+ */
+
+ Curl_llist_insert_next(&llist, llist.head,
+ &unusedData_case2, &case2_list);
+ fail_unless(llist.head->next->ptr == &unusedData_case2,
+ "the node next to head is not getting set correctly");
+ /* better safe than sorry, check that the tail isn't corrupted */
+ fail_unless(llist.tail->ptr != &unusedData_case2,
+ "the list tail is not getting set correctly");
/* unit tests for Curl_llist_remove */
@@ -165,19 +145,19 @@ UNITTEST_START
* 3: "new" head's previous will be NULL
*/
- head=llist->head;
- abort_unless(head, "llist->head is NULL");
+ head=llist.head;
+ abort_unless(head, "llist.head is NULL");
element_next = head->next;
- llist_size = Curl_llist_count(llist);
+ llist_size = Curl_llist_count(&llist);
- Curl_llist_remove(llist, llist->head, NULL);
+ Curl_llist_remove(&llist, llist.head, NULL);
- fail_unless(Curl_llist_count(llist) == (llist_size-1),
+ fail_unless(Curl_llist_count(&llist) == (llist_size-1),
"llist size not decremented as expected");
- fail_unless(llist->head == element_next,
+ fail_unless(llist.head == element_next,
"llist new head not modified properly");
- abort_unless(llist->head, "llist->head is NULL");
- fail_unless(llist->head->prev == NULL,
+ abort_unless(llist.head, "llist.head is NULL");
+ fail_unless(llist.head->prev == NULL,
"new head previous not set to null");
/**
@@ -190,13 +170,16 @@ UNITTEST_START
* 2: element->previous->next will be element->next
* 3: element->next->previous will be element->previous
*/
- Curl_llist_insert_next(llist, llist->head, &unusedData_case3);
- llist_size = Curl_llist_count(llist);
- to_remove = llist->head->next;
+ Curl_llist_insert_next(&llist, llist.head, &unusedData_case3,
+ &case4_list);
+ llist_size = Curl_llist_count(&llist);
+ fail_unless(llist_size == 3, "should be 3 list members");
+
+ to_remove = llist.head->next;
abort_unless(to_remove, "to_remove is NULL");
element_next = to_remove->next;
element_prev = to_remove->prev;
- Curl_llist_remove(llist, to_remove, NULL);
+ Curl_llist_remove(&llist, to_remove, NULL);
fail_unless(element_prev->next == element_next,
"element previous->next is not being adjusted");
abort_unless(element_next, "element_next is NULL");
@@ -213,10 +196,10 @@ UNITTEST_START
* 4: list->tail will be tail->previous
*/
- to_remove = llist->tail;
+ to_remove = llist.tail;
element_prev = to_remove->prev;
- Curl_llist_remove(llist, to_remove, NULL);
- fail_unless(llist->tail == element_prev,
+ Curl_llist_remove(&llist, to_remove, NULL);
+ fail_unless(llist.tail == element_prev,
"llist tail is not being adjusted when removing tail");
/**
@@ -228,11 +211,11 @@ UNITTEST_START
* 3: list tail will be null
*/
- to_remove = llist->head;
- Curl_llist_remove(llist, to_remove, NULL);
- fail_unless(llist->head == NULL,
+ to_remove = llist.head;
+ Curl_llist_remove(&llist, to_remove, NULL);
+ fail_unless(llist.head == NULL,
"llist head is not NULL while the llist is empty");
- fail_unless(llist->tail == NULL,
+ fail_unless(llist.tail == NULL,
"llist tail is not NULL while the llist is empty");
/* @testing Curl_llist_move(struct curl_llist *,
@@ -242,7 +225,7 @@ UNITTEST_START
/**
* @case 1:
- * moving head from an llist containg one element to an empty llist
+ * moving head from an llist containing one element to an empty llist
* @assumptions:
* 1: llist size will be 0
* 2: llist_destination size will be 1
@@ -255,38 +238,33 @@ UNITTEST_START
* add one element to the list
*/
- curlErrCode = Curl_llist_insert_next(llist, llist->head, &unusedData_case1);
+ Curl_llist_insert_next(&llist, llist.head, &unusedData_case1,
+ &case5_list);
/* necessary assertions */
- abort_unless(curlErrCode == 1,
- "Curl_llist_insert_next returned an error, Can't move on with test");
- abort_unless(Curl_llist_count(llist) == 1,
+ abort_unless(Curl_llist_count(&llist) == 1,
"Number of list elements is not as expected, Aborting");
- abort_unless(Curl_llist_count(llist_destination) == 0,
+ abort_unless(Curl_llist_count(&llist_destination) == 0,
"Number of list elements is not as expected, Aborting");
/*actual testing code*/
- curlErrCode = Curl_llist_move(llist, llist->head, llist_destination, NULL);
- abort_unless(curlErrCode == 1,
- "Curl_llist_move returned an error, Can't move on with test");
- fail_unless(Curl_llist_count(llist) == 0,
+ Curl_llist_move(&llist, llist.head, &llist_destination, NULL);
+ fail_unless(Curl_llist_count(&llist) == 0,
"moving element from llist didn't decrement the size");
- fail_unless(Curl_llist_count(llist_destination) == 1,
+ fail_unless(Curl_llist_count(&llist_destination) == 1,
"moving element to llist_destination didn't increment the size");
- fail_unless(llist->head == NULL,
+ fail_unless(llist.head == NULL,
"llist head not set to null after moving the head");
- fail_unless(llist_destination->head != NULL,
+ fail_unless(llist_destination.head != NULL,
"llist_destination head set to null after moving an element");
- fail_unless(llist_destination->tail != NULL,
+ fail_unless(llist_destination.tail != NULL,
"llist_destination tail set to null after moving an element");
- fail_unless(llist_destination->tail == llist_destination->tail,
+ fail_unless(llist_destination.tail == llist_destination.tail,
"llist_destination tail doesn't equal llist_destination head");
-
-
-
+}
UNITTEST_STOP
diff --git a/tests/unit/unit1303.c b/tests/unit/unit1303.c
index c39e147a..143ccd03 100644
--- a/tests/unit/unit1303.c
+++ b/tests/unit/unit1303.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -64,14 +64,14 @@ struct timetest {
int timeout_ms;
int connecttimeout_ms;
bool connecting;
- long result;
+ time_t result;
const char *comment;
};
UNITTEST_START
{
- struct timeval now;
- long timeout;
+ struct curltime now;
+ time_t timeout;
unsigned int i;
const struct timetest run[] = {
diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c
index db0a44c5..b958d043 100644
--- a/tests/unit/unit1305.c
+++ b/tests/unit/unit1305.c
@@ -76,9 +76,6 @@ static void unit_stop(void)
static Curl_addrinfo *fake_ai(void)
{
static Curl_addrinfo *ai;
- int ss_size;
-
- ss_size = sizeof(struct sockaddr_in);
ai = calloc(1, sizeof(Curl_addrinfo));
if(!ai)
@@ -90,7 +87,7 @@ static Curl_addrinfo *fake_ai(void)
return NULL;
}
- ai->ai_addr = calloc(1, ss_size);
+ ai->ai_addr = calloc(1, sizeof(struct sockaddr_in));
if(!ai->ai_addr) {
free(ai->ai_canonname);
free(ai);
@@ -98,7 +95,7 @@ static Curl_addrinfo *fake_ai(void)
}
ai->ai_family = AF_INET;
- ai->ai_addrlen = ss_size;
+ ai->ai_addrlen = sizeof(struct sockaddr_in);
return ai;
}
diff --git a/tests/unit/unit1309.c b/tests/unit/unit1309.c
index 3cf6eefb..9d1e70d2 100644
--- a/tests/unit/unit1309.c
+++ b/tests/unit/unit1309.c
@@ -52,7 +52,7 @@ static void splayprint(struct Curl_tree * t, int d, char output)
(long)t->key.tv_usec, i);
}
- for(count=0, node = t->same; node; node = node->same, count++)
+ for(count=0, node = t->samen; node != t; node = node->samen, count++)
;
if(output) {
@@ -70,19 +70,23 @@ UNITTEST_START
/* number of nodes to add to the splay tree */
#define NUM_NODES 50
- struct Curl_tree *root;
- struct Curl_tree nodes[NUM_NODES];
+ struct Curl_tree *root, *removed;
+ struct Curl_tree nodes[NUM_NODES*3];
int rc;
- int i;
+ int i, j;
+ struct curltime tv_now = {0, 0};
root = NULL; /* the empty tree */
+ /* add nodes */
for(i = 0; i < NUM_NODES; i++) {
- struct timeval key;
+ struct curltime key;
+ size_t payload;
key.tv_sec = 0;
key.tv_usec = (541*i)%1023;
+ payload = (size_t) key.tv_usec;
- nodes[i].payload = (void *)key.tv_usec; /* for simplicity */
+ nodes[i].payload = (void *)payload; /* for simplicity */
root = Curl_splayinsert(key, root, &nodes[i]);
}
@@ -103,6 +107,37 @@ UNITTEST_START
}
}
+ fail_unless(root == NULL, "tree not empty after removing all nodes");
+
+ /* rebuild tree */
+ for(i = 0; i < NUM_NODES; i++) {
+ struct curltime key;
+
+ key.tv_sec = 0;
+ key.tv_usec = (541*i)%1023;
+
+ /* add some nodes with the same key */
+ for(j = 0; j <= i % 3; j++) {
+ size_t payload = key.tv_usec*10 + j;
+ nodes[i*3+j].payload = (void *)payload; /* for simplicity */
+ root = Curl_splayinsert(key, root, &nodes[i*3+j]);
+ }
+ }
+
+ removed = NULL;
+ for(i = 0; i <= 1100; i+= 100) {
+ printf("Removing nodes not larger than %d\n", i);
+ tv_now.tv_usec = i;
+ root = Curl_splaygetbest(tv_now, root, &removed);
+ while(removed != NULL) {
+ printf("removed payload %ld[%ld]\n", (long)(removed->payload) / 10,
+ (long)(removed->payload) % 10);
+ root = Curl_splaygetbest(tv_now, root, &removed);
+ }
+ }
+
+ fail_unless(root == NULL, "tree not empty when it should be");
+
UNITTEST_STOP
diff --git a/tests/unit/unit1323.c b/tests/unit/unit1323.c
new file mode 100644
index 00000000..65dd3d28
--- /dev/null
+++ b/tests/unit/unit1323.c
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "curlcheck.h"
+
+#include "timeval.h"
+
+static CURLcode unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+struct a {
+ struct curltime first;
+ struct curltime second;
+ time_t result;
+};
+
+UNITTEST_START
+{
+ struct a tests[] = {
+ { {36762, 8345 }, {36761, 995926 }, 13 },
+ { {36761, 995926 }, {36762, 8345 }, -13 },
+ { {36761, 995926 }, {0, 0}, 36761995 },
+ { {0, 0}, {36761, 995926 }, -36761995 },
+ };
+ size_t i;
+
+ for(i=0; i < sizeof(tests)/sizeof(tests[0]); i++) {
+ time_t result = curlx_tvdiff(tests[i].first, tests[i].second);
+ if(result != tests[i].result) {
+ printf("%d.%06u to %d.%06u got %d, but expected %d\n",
+ tests[i].first.tv_sec,
+ tests[i].first.tv_usec,
+ tests[i].second.tv_sec,
+ tests[i].second.tv_usec,
+ result,
+ tests[i].result);
+ fail("unexpected result!");
+ }
+ }
+}
+UNITTEST_STOP
diff --git a/tests/unit/unit1395.c b/tests/unit/unit1395.c
index 13f46413..13ea97bc 100644
--- a/tests/unit/unit1395.c
+++ b/tests/unit/unit1395.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 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
@@ -65,10 +65,17 @@ UNITTEST_START
{ "/", "/" },
{ "", "" },
{ "/.../", "/.../" },
+ { "./moo", "moo" },
+ { "../moo", "moo" },
+ { "/.", "/" },
+ { "/..", "/" },
+ { "/moo/..", "/" },
+ { "..", "" },
+ { ".", "" },
};
for(i=0; i < sizeof(pairs)/sizeof(pairs[0]); i++) {
- char *out = Curl_dedotdotify((char *)pairs[i].input);
+ char *out = Curl_dedotdotify(pairs[i].input);
abort_unless(out != NULL, "returned NULL!");
if(strcmp(out, pairs[i].output)) {
diff --git a/tests/unit/unit1396.c b/tests/unit/unit1396.c
index 84a5162d..f3275fdb 100644
--- a/tests/unit/unit1396.c
+++ b/tests/unit/unit1396.c
@@ -21,7 +21,7 @@
***************************************************************************/
#include "curlcheck.h"
-CURL *hnd;
+static CURL *hnd;
static CURLcode unit_setup(void)
{
diff --git a/tests/unit/unit1399.c b/tests/unit/unit1399.c
new file mode 100644
index 00000000..82e0dc27
--- /dev/null
+++ b/tests/unit/unit1399.c
@@ -0,0 +1,100 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "curlcheck.h"
+
+#include "urldata.h"
+#include "progress.h"
+
+static int usec_magnitude = 1000000;
+
+static bool unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
+{
+ int time_sec = (int)(time_usec / usec_magnitude);
+ bool same = (time_sec == expected_seconds);
+ fprintf(stderr, "is %d us same as %d seconds? %s\n",
+ (int)time_usec, expected_seconds,
+ same?"Yes":"No");
+ return same;
+}
+
+UNITTEST_START
+ struct Curl_easy data;
+ struct curltime now = Curl_tvnow();
+
+ data.progress.t_starttransfer = 0;
+ data.progress.t_redirect = 0;
+
+ /*
+ * Set the startsingle time to a second ago. This time is used by
+ * Curl_pgrsTime to calculate how much time the events takes.
+ * t_starttransfer should be updated to reflect the difference from this time
+ * when `Curl_pgrsTime is invoked.
+ */
+ data.progress.t_startsingle.tv_sec = now.tv_sec - 1;
+ data.progress.t_startsingle.tv_usec = now.tv_usec;
+
+ Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
+
+ fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1),
+ "about 1 second should have passed");
+
+ /*
+ * Update the startsingle time to a second ago to simulate another second has
+ * passed.
+ * Now t_starttransfer should not be changed, as t_starttransfer has already
+ * occurred and another invocation of `Curl_pgrsTime` for TIMER_STARTTRANSFER
+ * is superfluous.
+ */
+ data.progress.t_startsingle.tv_sec = now.tv_sec - 2;
+ data.progress.t_startsingle.tv_usec = now.tv_usec;
+
+ Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
+
+ fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 1),
+ "about 1 second should have passed");
+
+ /*
+ * Simulate what happens after a redirect has occurred.
+ *
+ * Since the value of t_starttransfer is set to the value from the first
+ * request, it should be updated when a transfer occurs such that
+ * t_starttransfer is the starttransfer time of the redirect request.
+ */
+ data.progress.t_startsingle.tv_sec = now.tv_sec - 3;
+ data.progress.t_startsingle.tv_usec = now.tv_usec;
+ data.progress.t_redirect = data.progress.t_starttransfer + 1;
+
+ Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
+
+ fail_unless(usec_matches_seconds(data.progress.t_starttransfer, 3),
+ "about 3 second should have passed");
+UNITTEST_STOP
diff --git a/tests/unit/unit1600.c b/tests/unit/unit1600.c
index f0f9cc1f..11d718d3 100644
--- a/tests/unit/unit1600.c
+++ b/tests/unit/unit1600.c
@@ -24,12 +24,12 @@
#include "urldata.h"
#include "curl_ntlm_core.h"
-CURL *easy;
+static CURL *easy;
static CURLcode unit_setup(void)
{
easy = curl_easy_init();
- return CURLE_OK;
+ return easy ? CURLE_OK : CURLE_OUT_OF_MEMORY;
}
static void unit_stop(void)
diff --git a/tests/unit/unit1604.c b/tests/unit/unit1604.c
index 5f1ea951..b414e03e 100644
--- a/tests/unit/unit1604.c
+++ b/tests/unit/unit1604.c
@@ -9,7 +9,7 @@
*
* 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 http://curl.haxx.se/docs/copyright.html.
+ * 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
@@ -45,26 +45,28 @@ static void unit_stop(void)
static char *getflagstr(int flags)
{
char *buf = malloc(256);
- fail_unless(buf, "out of memory");
- 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" : ""));
+ 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" : ""));
+ }
return buf;
}
static char *getcurlcodestr(int cc)
{
char *buf = malloc(256);
- fail_unless(buf, "out of memory");
- 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);
+ 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);
+ }
return buf;
}
@@ -310,8 +312,11 @@ UNITTEST_START
}
flagstr = getflagstr(data[i].flags);
+ abort_unless(flagstr, "out of memory");
received_ccstr = getcurlcodestr(res);
+ abort_unless(received_ccstr, "out of memory");
expected_ccstr = getcurlcodestr(data[i].expected_result);
+ abort_unless(expected_ccstr, "out of memory");
unitfail++;
fprintf(stderr, "\n"
diff --git a/tests/unit/unit1605.c b/tests/unit/unit1605.c
index c807cb3f..2fe3a5ac 100644
--- a/tests/unit/unit1605.c
+++ b/tests/unit/unit1605.c
@@ -34,9 +34,10 @@ static void unit_stop(void)
}
UNITTEST_START
- CURL *easy = curl_easy_init();
int len;
char *esc;
+ CURL *easy = curl_easy_init();
+ abort_unless(easy, "out of memory");
esc = curl_easy_escape(easy, "", -1);
fail_unless(esc == NULL, "negative string length can't work");
diff --git a/tests/unit/unit1606.c b/tests/unit/unit1606.c
new file mode 100644
index 00000000..eca8f3c3
--- /dev/null
+++ b/tests/unit/unit1606.c
@@ -0,0 +1,90 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 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 "curlcheck.h"
+
+#include "speedcheck.h"
+#include "urldata.h"
+
+static CURLcode unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+static int runawhile(struct Curl_easy *easy,
+ long time_limit,
+ long speed_limit,
+ curl_off_t speed,
+ int dec)
+{
+ int counter = 1;
+ struct curltime now = {1, 0};
+ CURLcode result;
+ int finaltime;
+
+ curl_easy_setopt(easy, CURLOPT_LOW_SPEED_LIMIT, speed_limit);
+ curl_easy_setopt(easy, CURLOPT_LOW_SPEED_TIME, time_limit);
+ Curl_speedinit(easy);
+
+ do {
+ /* fake the current transfer speed */
+ easy->progress.current_speed = speed;
+ result = Curl_speedcheck(easy, now);
+ if(result)
+ break;
+ /* step the time */
+ now.tv_sec = ++counter;
+ speed -= dec;
+ } while(counter < 100);
+
+ finaltime = (int)(now.tv_sec - 1);
+
+ return finaltime;
+}
+
+UNITTEST_START
+{
+ struct Curl_easy *easy = curl_easy_init();
+ abort_unless(easy, "out of memory");
+
+ fail_unless(runawhile(easy, 41, 41, 40, 0) == 41,
+ "wrong low speed timeout");
+ fail_unless(runawhile(easy, 21, 21, 20, 0) == 21,
+ "wrong low speed timeout");
+ fail_unless(runawhile(easy, 60, 60, 40, 0) == 60,
+ "wrong log speed timeout");
+ fail_unless(runawhile(easy, 50, 50, 40, 0) == 50,
+ "wrong log speed timeout");
+ fail_unless(runawhile(easy, 40, 40, 40, 0) == 99,
+ "should not time out");
+ fail_unless(runawhile(easy, 10, 50, 100, 2) == 36,
+ "bad timeout");
+
+ curl_easy_cleanup(easy);
+
+ return 0;
+}
+UNITTEST_STOP
diff --git a/tests/valgrind.pm b/tests/valgrind.pm
index e6f66fd5..8b3d717d 100644
--- a/tests/valgrind.pm
+++ b/tests/valgrind.pm
@@ -23,9 +23,7 @@
use File::Basename;
sub valgrindparse {
- my ($srcdir, # the dir in which the runtests script resides
- $sslenabled,
- $file) = @_;
+ my ($file) = @_;
my @o;
open(VAL, "<$file");
@o = <VAL>;
diff --git a/tests/valgrind.supp b/tests/valgrind.supp
index 8c81327e..10b07314 100644
--- a/tests/valgrind.supp
+++ b/tests/valgrind.supp
@@ -87,3 +87,24 @@
fun:operate
fun:main
}
+
+{
+ openssl-1.0.1-error-as-seen-on-travis
+ Memcheck:Cond
+ fun:ASN1_STRING_set
+ fun:ASN1_mbstring_ncopy
+ fun:ASN1_mbstring_copy
+ fun:ASN1_STRING_to_UTF8
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ fun:ASN1_item_ex_d2i
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ fun:ASN1_item_ex_d2i
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ obj:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+ fun:ASN1_item_ex_d2i
+ fun:ASN1_item_d2i
+ fun:PEM_X509_INFO_read_bio
+ fun:X509_load_cert_crl_file
+}
diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
index 51674d77..7b0d5ba8 100644
--- a/winbuild/BUILD.WINDOWS.txt
+++ b/winbuild/BUILD.WINDOWS.txt
@@ -21,7 +21,7 @@ Building with Visual C++, prerequisites
If you wish to support zlib, openssl, c-ares, ssh2, you will have to download
them separately and copy them to the deps directory as shown below:
-
+
somedirectory\
|_curl-src
| |_winbuild
@@ -34,6 +34,13 @@ Building with Visual C++, prerequisites
It is also possible to create the deps directory in some other random
places and tell the Makefile its location using the WITH_DEVEL option.
+Building straight from git
+==========================
+
+ When you check out code git and build it, as opposed from a released source
+ code archive, you need to first run the "buildconf.bat" batch file (present
+ in the source code root directory) to set things up.
+
Building with Visual C++
========================
@@ -47,12 +54,12 @@ Open a Visual Studio Command prompt or the SDK CMD shell.
Everything is already pre-configured by calling one of the command
prompt.
-Once you are in the console, go to the winbuild directory in the Curl
+Once you are in the console, go to the winbuild directory in the Curl
sources:
cd curl-src\winbuild
Then you can call nmake /f Makefile.vc with the desired options (see below).
-The builds will be in the top src directory, builds\ directory, in
+The builds will be in the top src directory, builds\ directory, in
a directory named using the options given to the nmake call.
nmake /f Makefile.vc mode=<static or dll> <options>
diff --git a/winbuild/Makefile.msvc.names b/winbuild/Makefile.msvc.names
deleted file mode 100644
index 13eafac8..00000000
--- a/winbuild/Makefile.msvc.names
+++ /dev/null
@@ -1,81 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1999 - 2010, Daniel Stenberg, <daniel@haxx.se>, 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 file is included from MSVC makefiles located in lib and src,
-# providing libcurl common file names required by these makefiles.
-#
-
-# ------------------
-# libcurl base name
-# ------------------
-
-!IF !DEFINED(LIB_NAME) || "$(LIB_NAME)" == ""
-LIB_NAME = libcurl
-!ENDIF
-
-# -------------------------------------------------
-# libcurl static and dynamic libraries common base
-# file names for release and debug configurations
-# -------------------------------------------------
-
-!IF !DEFINED(LIB_NAME_STA_REL) || "$(LIB_NAME_STA_REL)" == ""
-LIB_NAME_STA_REL = $(LIB_NAME)
-!ENDIF
-
-!IF !DEFINED(LIB_NAME_STA_DBG) || "$(LIB_NAME_STA_DBG)" == ""
-LIB_NAME_STA_DBG = $(LIB_NAME_STA_REL)d
-!ENDIF
-
-!IF !DEFINED(LIB_NAME_DYN_REL) || "$(LIB_NAME_DYN_REL)" == ""
-LIB_NAME_DYN_REL = $(LIB_NAME)
-!ENDIF
-
-!IF !DEFINED(LIB_NAME_DYN_DBG) || "$(LIB_NAME_DYN_DBG)" == ""
-LIB_NAME_DYN_DBG = $(LIB_NAME_DYN_REL)d
-!ENDIF
-
-# --------------------------------------------
-# Base names for libcurl DLL import libraries
-# --------------------------------------------
-
-!IF !DEFINED(LIB_NAME_IMP_REL) || "$(LIB_NAME_IMP_REL)" == ""
-LIB_NAME_IMP_REL = $(LIB_NAME_DYN_REL)_imp
-!ENDIF
-
-!IF !DEFINED(LIB_NAME_IMP_DBG) || "$(LIB_NAME_IMP_DBG)" == ""
-LIB_NAME_IMP_DBG = $(LIB_NAME_DYN_DBG)_imp
-!ENDIF
-
-# --------------------------------------
-# File names with extension and no path
-# --------------------------------------
-
-LIBCURL_STA_LIB_REL = $(LIB_NAME_STA_REL).lib
-LIBCURL_STA_LIB_DBG = $(LIB_NAME_STA_DBG).lib
-LIBCURL_DYN_LIB_REL = $(LIB_NAME_DYN_REL).dll
-LIBCURL_DYN_LIB_DBG = $(LIB_NAME_DYN_DBG).dll
-LIBCURL_IMP_LIB_REL = $(LIB_NAME_IMP_REL).lib
-LIBCURL_IMP_LIB_DBG = $(LIB_NAME_IMP_DBG).lib
-LIBCURL_DYN_LIB_PDB = $(LIB_NAME_IMP_DBG).pdb
-
-# End of Makefile.msvc.names
diff --git a/winbuild/Makefile.vc b/winbuild/Makefile.vc
index 1443dfa0..ba73efde 100644
--- a/winbuild/Makefile.vc
+++ b/winbuild/Makefile.vc
@@ -21,8 +21,7 @@ CFGSET=true
!MESSAGE Libraries can be fetched at http://pecl2.php.net/downloads/php-windows-builds/
!MESSAGE Uncompress them into the deps folder.
!MESSAGE WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
-!MESSAGE ENABLE_NGHTTP2=<yes or no> - Enable HTTP/2 support, defaults to no
-!MESSAGE Requires OpenSSL
+!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
!MESSAGE WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
!MESSAGE WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
@@ -57,7 +56,10 @@ ENABLE_SSPI = $(USE_SSPI)
!ENDIF
# default options
+
!IFNDEF MACHINE
+# Note: nmake magically changes the value of PROCESSOR_ARCHITECTURE from "AMD64"
+# to "x86" when building in a 32 bit build environment on a 64 bit machine.
!IF "$(PROCESSOR_ARCHITECTURE)"=="AMD64"
MACHINE = x64
!ELSE
@@ -111,10 +113,17 @@ USE_SSL = true
SSL = static
!ENDIF
-!IF "$(USE_SSL)"=="true"
!IF "$(ENABLE_NGHTTP2)"=="yes"
+# compatibility bit, WITH_NGHTTP2 is the correct flag
+WITH_NGHTTP2 = dll
+USE_NGHTTP2 = true
+NGHTTP2 = dll
+!ELSEIF "$(WITH_NGHTTP2)"=="dll"
USE_NGHTTP2 = true
-!ENDIF
+NGHTTP2 = dll
+!ELSEIF "$(WITH_NGHTTP2)"=="static"
+USE_NGHTTP2 = true
+NGHTTP2 = static
!ENDIF
!IFNDEF USE_NGHTTP2
@@ -202,6 +211,10 @@ CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-sspi
CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-winssl
!ENDIF
+!IF "$(USE_NGHTTP2)"=="true"
+CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-nghttp2-$(NGHTTP2)
+!ENDIF
+
!MESSAGE configuration name: $(CONFIG_NAME_LIB)
BUILD_DIR=../builds/$(CONFIG_NAME_LIB)
@@ -210,9 +223,6 @@ CURL_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-curl
DIRDIST = ..\builds\$(CONFIG_NAME_LIB)\
$(MODE):
- @IF NOT EXIST ..\include\curl\curlbuild.h ( \
- CALL ..\buildconf.bat \
- )
@SET DIROBJ=$(LIBCURL_DIROBJ)
@SET MACRO_NAME=LIBCURL_OBJS
@SET OUTFILE=LIBCURL_OBJS.inc
@@ -230,6 +240,9 @@ $(MODE):
@SET USE_IPV6=$(USE_IPV6)
@SET USE_SSPI=$(USE_SSPI)
@SET USE_WINSSL=$(USE_WINSSL)
+# compatibility bit
+ @SET WITH_NGHTTP2=$(WITH_NGHTTP2)
+
@$(MAKE) /NOLOGO /F MakefileBuild.vc
copy_from_lib:
diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index 96ab37ef..36ad4681 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -56,11 +56,11 @@ CC = cl.exe
!IF "$(VC)"=="6"
CC_NODEBUG = $(CC) /O2 /DNDEBUG
CC_DEBUG = $(CC) /Od /Gm /Zi /D_DEBUG /GZ
-CFLAGS = /I. /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
+CFLAGS = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
!ELSE
CC_NODEBUG = $(CC) /O2 /DNDEBUG
-CC_DEBUG = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd /W3
-CFLAGS = /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
+CC_DEBUG = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd
+CFLAGS = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
!ENDIF
LFLAGS = /nologo /machine:$(MACHINE)
@@ -93,7 +93,7 @@ PDB_NAME_DLL_DEBUG = $(BASE_NAME_DEBUG).pdb
# CURL Command section
PROGRAM_NAME = curl.exe
-CURL_CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
+CURL_CFLAGS = /I../lib /I../include /nologo /W4 /EHsc /DWIN32 /FD /c
CURL_LFLAGS = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
CURL_RESFLAGS = /i../include
@@ -114,31 +114,36 @@ LFLAGS = $(LFLAGS) "/LIBPATH:$(DEVEL_LIB)"
!IF "$(WITH_SSL)"=="dll"
+!IF EXISTS("$(DEVEL_LIB)\libssl.lib")
+SSL_LIBS = libssl.lib libcrypto.lib
+!ELSE
SSL_LIBS = libeay32.lib ssleay32.lib
+!ENDIF
USE_SSL = true
SSL = dll
!ELSEIF "$(WITH_SSL)"=="static"
+!IF EXISTS("$(DEVEL_LIB)\libssl.lib")
+SSL_LIBS = libssl.lib libcrypto.lib gdi32.lib user32.lib crypt32.lib
+!ELSE
SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib crypt32.lib
+!ENDIF
USE_SSL = true
SSL = static
!ENDIF
-!IFNDEF USE_NGHTTP2
-USE_NGHTTP2 = false
-!ENDIF
-
!IFDEF USE_SSL
SSL_CFLAGS = /DUSE_OPENSSL /I"$(DEVEL_INCLUDE)/openssl"
-
-!IF "$(USE_NGHTTP2)"=="yes"
-USE_NGHTTP2 = true
+!IF EXISTS("$(DEVEL_INCLUDE)\openssl\is_boringssl.h")
+SSL_CFLAGS = $(SSL_CFLAGS) /DHAVE_BORINGSSL
!ENDIF
-
-!IF "$(USE_NGHTTP2)"=="true"
-SSL_CFLAGS = $(SSL_CFLAGS) /DUSE_NGHTTP2
-SSL_LIBS = $(SSL_LIBS) nghttp2.lib
!ENDIF
+!IF "$(WITH_NGHTTP2)"=="dll"
+NGHTTP2_CFLAGS = /DUSE_NGHTTP2
+NGHTTP2_LIBS = nghttp2.lib
+!ELSEIF "$(WITH_NGHTTP2)"=="static"
+NGHTTP2_CFLAGS = /DUSE_NGHTTP2 /DNGHTTP2_STATICLIB
+NGHTTP2_LIBS = nghttp2_static.lib
!ENDIF
!IF "$(WITH_MBEDTLS)"=="dll" || "$(WITH_MBEDTLS)"=="static"
@@ -373,6 +378,11 @@ CFLAGS = $(CFLAGS) $(IPV6_CFLAGS)
CFLAGS = $(CFLAGS) $(SSPI_CFLAGS)
!ENDIF
+!IF "$(USE_NGHTTP2)"=="true"
+CFLAGS = $(CFLAGS) $(NGHTTP2_CFLAGS)
+LFLAGS = $(LFLAGS) $(NGHTTP2_LFLAGS) $(NGHTTP2_LIBS)
+!ENDIF
+
!IF "$(GEN_PDB)"=="true"
CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)"
LFLAGS = $(LFLAGS) $(LFLAGS_PDB)