MINIFICPP-1022 - Refactored third party build system

Signed-off-by: Daniel Bakai <bakaid@apache.org>

Approved by aboda on GH

This closes #661
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 338b6ee..02098e2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,6 +31,10 @@
 include(FeatureSummary)
 include(ExternalProject)
 
+# Provide custom modules for the project
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+include(WholeArchive)
+
 option(SKIP_TESTS "Skips building all tests." OFF)
 option(PORTABLE "Instructs the compiler to remove architecture specific optimizations" ON)
 option(USE_SHARED_LIBS "Builds using shared libraries" ON)
@@ -46,8 +50,6 @@
 
 cmake_dependent_option(USE_SYSTEM_ZLIB "Instructs the build system to search for and use a zlib library available in the host system" ON "NOT STATIC_BUILD" OFF)
 
-cmake_dependent_option(USE_SYSTEM_LIBSSH2 "Instructs the build system to search for and use a libssh2 library available in the host system" OFF "NOT STATIC_BUILD" OFF)
-
 option(USE_SYSTEM_BZIP2 "Instructs the build system to search for and use a bzip2 library available in the host system" ON)
 option(BUILD_ROCKSDB "Instructs the build system to use RocksDB from the third party directory" ON)
 option(FORCE_WINDOWS "Instructs the build system to force Windows builds when WIN32 is specified" OFF)
@@ -55,69 +57,6 @@
 
 option(USE_GOLD_LINKER "Use Gold Linker" OFF)
 
-if (OPENSSL_ROOT_DIR )
-	set(OPENSSL_PASSTHROUGH "-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}")
-endif()
-
-set(PASSTHROUGH_CMAKE_ARGS -DANDROID_ABI=${ANDROID_ABI}
-                           -DANDROID_PLATFORM=${ANDROID_PLATFORM}
-                           -DANDROID_STL=${ANDROID_STL}
-                           -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-                           -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-                           -DANDROID_NDK=${ANDROID_NDK}
-                           -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-                           -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-                           -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
-                           -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-                           -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-                           -DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
-                           -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM}
-                           -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}
-                           -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}
-                           -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-						   ${OPENSSL_PASSTHROUGH}
-                           -G${CMAKE_GENERATOR})
-
-if(NOT WIN32)
-	if (ENABLE_JNI)
-	if (NOT DISABLE_JEMALLOC)
-	  set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/jemalloc")
-	  
-	  set(DIR "${BASE_DIR}/extensions/jemalloc-src")
-	  set(JE_BYPRODUCT "${DIR}/lib/libjemalloc.a")
-	  ExternalProject_Add(
-	    jemalloc-external
-	    GIT_REPOSITORY "https://github.com/jemalloc/jemalloc.git"
-	    GIT_TAG "61efbda7098de6fe64c362d309824864308c36d4" 
-	    PREFIX "${BASE_DIR}/extensions/jemalloc"
-	    BUILD_IN_SOURCE true
-	    SOURCE_DIR "${DIR}"
-	    BUILD_COMMAND make
-	    CMAKE_COMMAND ""
-	    UPDATE_COMMAND ""
-	    BUILD_BYPRODUCTS ${JE_BYPRODUCT} 
-	    INSTALL_COMMAND ${CMAKE_COMMAND}  -E echo "Skipping install step."
-	    CONFIGURE_COMMAND ""
-	    PATCH_COMMAND ./autogen.sh && ./configure 
-	    STEP_TARGETS build
-	    EXCLUDE_FROM_ALL TRUE
-	  )
-	  
-	  add_library(jemalloc STATIC IMPORTED)
-	  set_target_properties(jemalloc PROPERTIES IMPORTED_LOCATION "${JE_BYPRODUCT}")
-	  add_dependencies(jemalloc jemalloc-external)
-	  set(JEMALLOC_FOUND "YES" CACHE STRING "" FORCE)
-	  set(JEMALLOC_INCLUDE_DIRS "${DIR}/include" CACHE STRING "" FORCE)
-	  set(JEMALLOC_LIBRARIES jemalloc CACHE STRING "" FORCE)
-	  set(JEMALLOC_LIBRARY jemalloc CACHE STRING "" FORCE)
-	  set(JEMALLOC_LIBRARY jemalloc CACHE STRING "" FORCE)
-
-	endif()
-	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_JNI")
-	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_JNI")
-
-	endif()
-endif()
 
 # Use ccache if present
 find_program(CCACHE_FOUND ccache)
@@ -127,6 +66,7 @@
     message("-- Found ccache: ${CCACHE_FOUND}")
 endif(CCACHE_FOUND)
 
+# Use gold linker if instructed
 if (UNIX AND USE_GOLD_LINKER AND NOT APPLE )
   execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE ld_version)
   if ("${ld_version}" MATCHES "GNU gold")
@@ -135,7 +75,7 @@
   endif()
 endif()
 
-# check for exec info before we enable the backtrace features.
+# Check for exec info before we enable the backtrace features.
 CHECK_INCLUDE_FILE("execinfo.h" HAS_EXECINFO)
 if (ENABLE_OPS AND HAS_EXECINFO AND NOT WIN32)
   add_definitions("-DHAS_EXECINFO=1")
@@ -174,233 +114,141 @@
 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
 
 if (NOT PORTABLE)
-  if(MSVC)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
-  else()
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
-  endif()
+	if(MSVC)
+		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX2")
+		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
+	else()
+		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
+		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
+	endif()
 endif()
 
 set(CMAKE_CXX_STANDARD 11)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
-# Search for threads
+#### Third party dependencies ####
+
+# Define function for passing dependencies
+function(append_third_party_passthrough_args OUTPUT EXTERNALPROJECT_CMAKE_ARGS)
+	string(REPLACE ";" "%" CMAKE_MODULE_PATH_PASSTHROUGH "${CMAKE_MODULE_PATH}")
+	list(APPEND EXTERNALPROJECT_CMAKE_ARGS "-DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH_PASSTHROUGH}")
+	list(APPEND EXTERNALPROJECT_CMAKE_ARGS ${PASSTHROUGH_VARIABLES})
+	set(${OUTPUT} ${EXTERNALPROJECT_CMAKE_ARGS} PARENT_SCOPE)
+endfunction()
+
+# Find patch executable
+find_package(Patch REQUIRED)
+
+# Setup passthrough args
+set(PASSTHROUGH_CMAKE_ARGS -DANDROID_ABI=${ANDROID_ABI}
+		-DANDROID_PLATFORM=${ANDROID_PLATFORM}
+		-DANDROID_STL=${ANDROID_STL}
+		-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+		-DANDROID_NDK=${ANDROID_NDK}
+		-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
+		-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+		-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+		-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
+		-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+		-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+		-DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
+		-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM}
+		-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}
+		-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}
+		-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
+		-G${CMAKE_GENERATOR}
+		)
+
+# jemalloc
+if(NOT WIN32)
+	if (ENABLE_JNI)
+		if (NOT DISABLE_JEMALLOC)
+			include(BundledJemalloc)
+			use_bundled_jemalloc(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+			message("jemalloc found at ${JEMALLOC_LIBRARIES}")
+		endif()
+		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_JNI")
+		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_JNI")
+
+	endif()
+endif()
+
+# thread library
 find_package(Threads REQUIRED)
 
+# Simple-Windows-Posix-Semaphore
 if (WIN32)
   	add_subdirectory("thirdparty/Simple-Windows-Posix-Semaphore")
 endif()
 
-# Provide custom modules for the project
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-
-if (NOT OPENSSL_OFF)
-	include(LibreSSL)
-	use_libre_ssl("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
-	list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ssl")
-
-	find_package (OpenSSL REQUIRED)
-
-	if (OPENSSL_FOUND)
-	  include_directories(${OPENSSL_INCLUDE_DIR})
-	  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENSSL_SUPPORT")
-	  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOPENSSL_SUPPORT")
-	  MESSAGE("OpenSSL found at ${OPENSSL_LIBRARIES}")
-	else ()
-	  message( FATAL_ERROR "OpenSSL was not found." )
-	endif (OPENSSL_FOUND)
-else()
-	list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/winssl")
-endif()
-
-if (OPENSSL_ROOT_DIR )
-    set(OPENSSL_PASSTHROUGH "-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}")
-endif()
-
-set(PASSTHROUGH_CMAKE_ARGS -DANDROID_ABI=${ANDROID_ABI}
-        -DANDROID_PLATFORM=${ANDROID_PLATFORM}
-        -DANDROID_STL=${ANDROID_STL}
-        -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
-        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-        -DANDROID_NDK=${ANDROID_NDK}
-        -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-        -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-        -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
-        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-        -DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
-        -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM}
-        -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}
-        -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}
-        -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-        ${OPENSSL_PASSTHROUGH}
-        -G${CMAKE_GENERATOR})
-
-include(Compression)
-
-if(WIN32 OR NOT USE_SYSTEM_ZLIB)
-	use_bundled_zlib(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
-	find_package (OpenSSL REQUIRED)
-	list(APPEND CMAKE_MODULE_PATH "${SOURCE_DIR}/cmake/zlib/dummy")
-endif()
-
-find_package (ZLIB REQUIRED)
-
-if (ZLIB_FOUND)
-  include_directories(${ZLIB_INCLUDE_DIRS})
-endif()
-
-SET(TEST_DIR ${CMAKE_SOURCE_DIR}/libminifi/test)
-
-include(Extensions)
-
+# ossp-uuid
 if(NOT WIN32)
 	include(BundledOSSPUUID)
 	use_bundled_osspuuid(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
 endif()
 
-include_directories(thirdparty/ut)
+# OpenSSL/LibreSSL
+if (NOT OPENSSL_OFF)
+	include(BundledLibreSSL)
+	use_libre_ssl("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ssl")
 
-if (DISABLE_CURL)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDISABLE_CURL")
-	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDISABLE_CURL")
-endif(DISABLE_CURL)
+	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENSSL_SUPPORT")
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOPENSSL_SUPPORT")
+endif()
+
+# zlib
+if(WIN32 OR NOT USE_SYSTEM_ZLIB)
+	include(BundledZLIB)
+	use_bundled_zlib(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/zlib/dummy")
+else()
+	find_package(ZLIB REQUIRED)
+endif()
+
+# uthash
+add_library(ut INTERFACE)
+target_include_directories(ut INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ut")
+
+# cURL
 if(NOT DISABLE_CURL)
-  message("Using bundled cURL")
-
-  set(CURL_C_FLAGS "${CMAKE_C_FLAGS}")
-  set(CURL_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-
-
-get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
-
-if ("${LIB64}" STREQUAL "TRUE" AND (NOT WIN32 AND NOT APPLE))
-    set(LIBSUFFIX 64)
+	include(BundledLibcURL)
+	use_bundled_curl(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/curl/dummy")
 else()
-    set(LIBSUFFIX "")
+	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDISABLE_CURL")
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDISABLE_CURL")
 endif()
 
-  if (WIN32)
-	set(BYPRODUCT "lib/libcurl.lib")
-  else()
-  	set(BYPRODUCT "lib${LIBSUFFIX}/libcurl.a")
-  endif()
+# spdlog
+add_library(spdlog INTERFACE)
+target_include_directories(spdlog INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/spdlog-20170710/include")
 
-  if (WIN32)
-  set (PC "PATCH_COMMAND ./buildconf.bat")
-  else()
-  endif()
+# yaml-cpp
+include(BundledYamlCpp)
+use_bundled_yamlcpp(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
 
-  list(APPEND CURL_CMAKE_MODULE_PATH_PASSTHROUGH_LIST "${CMAKE_SOURCE_DIR}/cmake/ssl")
-  if(WIN32 OR NOT USE_SYSTEM_ZLIB)
-	  list(APPEND CURL_CMAKE_MODULE_PATH_PASSTHROUGH_LIST "${CMAKE_SOURCE_DIR}/cmake/zlib/dummy")
-  endif()
-  string(REPLACE ";" "%" CURL_CMAKE_MODULE_PATH_PASSTHROUGH "${CURL_CMAKE_MODULE_PATH_PASSTHROUGH_LIST}")
+# concurrentqueue
+add_library(concurrentqueue INTERFACE)
+target_include_directories(concurrentqueue INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/concurrentqueue")
 
-  ExternalProject_Add(
-    curl-external
-    GIT_REPOSITORY "https://github.com/curl/curl.git"
-    GIT_TAG "f3294d9d86e6a7915a967efff2842089b8b0d071"  # Version 7.64.0
-    SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-src"
-    LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
-    CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-               "-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-install"
-                -DCMAKE_POSITION_INDEPENDENT_CODE=ON
-                -DBUILD_CURL_EXE=OFF
-                -DBUILD_TESTING=OFF
-                -DCMAKE_USE_OPENSSL=ON
-                -DBUILD_SHARED_LIBS=OFF
-                -DHTTP_ONLY=ON
-                -DCMAKE_USE_OPENSSL=ON
-                "-DLIBRESSL_BIN_DIR=${LIBRESSL_BIN_DIR}"
-                "-DLIBRESSL_SRC_DIR=${LIBRESSL_SRC_DIR}"
-                "-DBYPRODUCT_PREFIX=${BYPRODUCT_PREFIX}"
-                "-DBYPRODUCT_SUFFIX=${BYPRODUCT_SUFFIX}"
-                "-DZLIB_BYPRODUCT_INCLUDE=${ZLIB_BYPRODUCT_INCLUDE}"
-                "-DZLIB_BYPRODUCT=${ZLIB_BYPRODUCT}"
-                "-DZLIB_LIBRARY=${ZLIB_LIBRARY}"
-                "-DZLIB_LIBRARIES=${ZLIB_LIBRARIES}"
-                -DCURL_DISABLE_CRYPTO_AUTH=ON
-                -DCMAKE_USE_LIBSSH2=OFF
-                "-DCMAKE_DEBUG_POSTFIX="
-                -DHAVE_GLIBC_STRERROR_R=1
-                -DHAVE_GLIBC_STRERROR_R__TRYRUN_OUTPUT=""
-                -DHAVE_POSIX_STRERROR_R=0
-                -DHAVE_POSIX_STRERROR_R__TRYRUN_OUTPUT=""
-                -DHAVE_POLL_FINE_EXITCODE=0
-                -DHAVE_FSETXATTR_5=0
-                -DHAVE_FSETXATTR_5__TRYRUN_OUTPUT=""
-               "-DCMAKE_MODULE_PATH=${CURL_CMAKE_MODULE_PATH_PASSTHROUGH}"
-               "-DCMAKE_C_FLAGS=${CURL_C_FLAGS}"
-               "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
-               "-DCMAKE_CXX_FLAGS=${CURL_CXX_FLAGS}"
-	${PC}
-    BUILD_BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-install/${BYPRODUCT}"
-  )
+# RapidJSON
+add_library(RapidJSON INTERFACE)
+target_include_directories(RapidJSON INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/rapidjson-1.1.0/include")
 
-  add_dependencies(curl-external libressl-portable)
-  if(WIN32 OR NOT USE_SYSTEM_ZLIB)
-	  add_dependencies(curl-external zlib-external)
-  endif()
+# Cron
+add_library(cron INTERFACE)
+target_include_directories(cron INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/cron")
 
-  set(CURL_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/curl/" CACHE STRING "" FORCE)
-  set(CURL_BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/curl-install/" CACHE STRING "" FORCE)
-  set(CURL_BYPRODUCT_DIR "${BYPRODUCT}" CACHE STRING "" FORCE)
-  list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/curl/dummy")
-  add_library(curl STATIC IMPORTED)
-  set_target_properties(curl PROPERTIES IMPORTED_LOCATION "${CURL_BIN_DIR}${BYPRODUCT}")
-    
-  if (OPENSSL_FOUND) 
-     if (NOT WIN32)
-       set_target_properties(curl PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENSSL_LIBRARIES})
-	 endif()
-  endif(OPENSSL_FOUND)
-  add_dependencies(curl curl-external)
-  set(CURL_FOUND "YES")
-  set(CURL_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/curl/include")
-  set(CURL_LIBRARY "${CURL_BIN_DIR}${BYPRODUCT}" CACHE STRING "" FORCE)
-  set(CURL_LIBRARIES "${CURL_LIBRARY}" CACHE STRING "" FORCE)
- else()
-  message("Using System cURL")
-endif()
+# cxxopts
+add_library(cxxopts INTERFACE)
+target_include_directories(cxxopts INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/cxxopts/include")
 
-if (CURL_FOUND)
-  include_directories("${CURL_INCLUDE_DIRS}")
-endif()
+#### Extensions ####
+SET(TEST_DIR ${CMAKE_SOURCE_DIR}/libminifi/test)
+include(Extensions)
 
-file(GLOB SPD_SOURCES "thirdparty/spdlog-20170710/include/spdlog/*")
-
-include(ExternalProject)
-
-set(CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING OFF CACHE BOOL "Disable dynamic SSL library loading")
-set(CIVETWEB_ENABLE_CXX ON CACHE BOOL "Enable civet C++ library")
-set(CIVETWEB_SSL_SSL_LIB "${OPENSSL_SSL_LIBRARY}" CACHE STRING "Enable civet C++ library")
-set(CIVETWEB_SSL_CRYPTO_LIB "${OPENSSL_CRYPTO_LIBRARY}" CACHE STRING "Enable civet C++ library")
-set(CIVETWEB_ENABLE_CXX ON CACHE BOOL "Enable civet C++ library")
-if (NOT OPENSSL_FOUND)
-	message("SSL support disabled, ListenHTTP will not have HTTPS support")
-	set(CIVETWEB_ENABLE_SSL OFF CACHE BOOL "DISABLE SSL")
-endif()
-
-SET(WITH_TOOLS OFF CACHE BOOL "Do not build RocksDB tools")
-if ( NOT APPLE)
-if (ENABLE_PYTHON)
-  SET(BUILD_SHARED_LIBS ON CACHE BOOL "Build yaml cpp shared lib" FORCE)
-else()
-  SET(BUILD_SHARED_LIBS OFF CACHE BOOL "Build yaml cpp shared lib" FORCE)
-endif()
-endif()
-SET(WITH_TESTS OFF CACHE BOOL "Build RocksDB library (not repo) tests")
-set(CIVET_THIRDPARTY_ROOT "${CMAKE_SOURCE_DIR}/thirdparty/civetweb-1.10/" CACHE STRING "Path to CivetWeb root")
-set(CIVET_BINARY_ROOT "${CMAKE_BINARY_DIR}/thirdparty/civetweb-1.10/" CACHE STRING "Path to CivetWeb binary output")
-set(ROCKSDB_THIRDPARTY_ROOT "${CMAKE_SOURCE_DIR}/thirdparty/rocksdb/" CACHE STRING "Path to RocksDB root")
-add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-20171024)
-
-include_directories(thirdparty/concurrentqueue)
-include_directories(thirdparty/yaml-cpp-yaml-cpp-20171024/include)
-include_directories(thirdparty/rapidjson-1.1.0/include)
-
-## Expression language extensions
 if(BOOTSTRAP)
 	# display an error message for those using the bootstrap
     message(FATAL_ERROR "Bootstrapping is no longer needed within the agent")
@@ -408,48 +256,40 @@
 
 add_subdirectory(libminifi)
 
-add_dependencies(minifi libressl-portable)
-add_dependencies(minifi curl-external)
-
-if (WIN32 OR NOT USE_SYSTEM_ZLIB)
-	add_dependencies(minifi zlib-external)
-endif(WIN32 OR NOT USE_SYSTEM_ZLIB)
-
 createExtension(STANDARD-PROCESSORS "STANDARD PROCESSORS" "Provides standard processors" "extensions/standard-processors" "extensions/standard-processors/tests/")
 
-
-#### EXTENSIONS
 if ((DISABLE_CURL STREQUAL "OFF" OR NOT DISABLE_CURL) AND NOT DISABLE_CIVET)
 	createExtension(HTTP-CURL "HTTP CURL" "This enables RESTProtocol, InvokeHTTP, and the HTTPClient for Site to Site" "extensions/http-curl" "extensions/http-curl/tests/")
 	message("minifi-http-curl will depend on curl-external")
-	add_dependencies(minifi-http-curl curl-external)
 endif()
 
 option(DISABLE_EXPRESSION_LANGUAGE "Disables the scripting extensions." OFF)
 if (NOT DISABLE_EXPRESSION_LANGUAGE)
     createExtension(EXPRESSION-LANGUAGE-EXTENSIONS "EXPRESSION LANGUAGE EXTENSIONS" "This enables NiFi expression language" "extensions/expression-language" "extensions/expression-language/tests")
-	add_dependencies(minifi-expression-language-extensions libressl-portable)
 
 	message("minifi-expression-language-extensions will depend on curl-external")
-	add_dependencies(minifi-expression-language-extensions curl-external)
 endif()
 
-
-
 option(DISABLE_CIVET "Disables CivetWeb components." OFF)
 if (NOT DISABLE_CIVET)
+	include(BundledCivetWeb)
+	use_bundled_civetweb(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/civetweb/dummy")
+
 	createExtension(CIVETWEB CIVETWEB "This enables ListenHTTP" "extensions/civetweb" "extensions/civetweb/tests")
-	add_dependencies(minifi-civet-extensions libressl-portable)
 endif()
 
 ## Add the rocks DB extension
-if (NOT ROCKSDB_FOUND OR BUILD_ROCKSDB)
-	set(BUILD_RD "TRUE")
-endif()
-
 option(DISABLE_ROCKSDB "Disables the RocksDB extension." OFF)
-if (DISABLE_ROCKSDB STREQUAL "OFF" OR NOT DISABLE_ROCKSDB)
-	createExtension(ROCKSDB-REPOS "ROCKSDB REPOS" "This Enables persistent provenance, flowfile, and content repositories using RocksDB" "extensions/rocksdb-repos" "${TEST_DIR}/rocksdb-tests" BUILD_RD "${ROCKSDB_THIRDPARTY_ROOT}")
+if (NOT DISABLE_ROCKSDB)
+	if (BUILD_ROCKSDB)
+		include(BundledRocksDB)
+		use_bundled_rocksdb(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	else()
+		list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/rocksdb/sys")
+		find_package(RocksDB REQUIRED)
+	endif()
+	createExtension(ROCKSDB-REPOS "ROCKSDB REPOS" "This Enables persistent provenance, flowfile, and content repositories using RocksDB" "extensions/rocksdb-repos" "${TEST_DIR}/rocksdb-tests")
 endif()
 
 ## Create LibArchive Extension
@@ -468,6 +308,8 @@
 
 option(ENABLE_COAP "Enables the CoAP extension." OFF)
 if (ENABLE_ALL OR ENABLE_COAP STREQUAL "ON")
+	include(BundledLibCOAP)
+	use_bundled_libcoap(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
 	createExtension(COAP-EXTENSION "COAP EXTENSIONS" "Enables LibCOAP Functionality." "extensions/coap" "extensions/coap/tests/")
 	if( NOT DISABLE_CURL)
 		add_dependencies(minifi-coap minifi-http-curl)
@@ -475,27 +317,28 @@
 endif()
 
 if (WIN32)
-option(ENABLE_WEL "Enables the suite of Windows Event Log extensions." OFF)
-if (ENABLE_ALL OR ENABLE_WEL)
-	createExtension(WEL-EXTENSION "WEL EXTENSIONS" "Enables the suite of Windows Event Log extensions." "extensions/windows-event-log" "extensions/windows-event-log/tests")
-endif()
+	option(ENABLE_WEL "Enables the suite of Windows Event Log extensions." OFF)
+	if (ENABLE_ALL OR ENABLE_WEL)
+		include(BundledPugiXml)
+		use_bundled_pugixml(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+		createExtension(WEL-EXTENSION "WEL EXTENSIONS" "Enables the suite of Windows Event Log extensions." "extensions/windows-event-log" "extensions/windows-event-log/tests")
+	endif()
 endif(WIN32)
 
 ## Create MQTT Extension
 option(ENABLE_MQTT "Enables the mqtt extension." OFF)
 if(ENABLE_ALL OR ENABLE_MQTT)
-        createExtension(MQTT-EXTENSIONS "MQTT EXTENSIONS" "This Enables MQTT functionality including PublishMQTT/ConsumeMQTT" "extensions/mqtt" "${TEST_DIR}/mqtt-tests" "TRUE" "thirdparty/paho.mqtt.c")
-        add_dependencies(paho-mqtt3cs libressl-portable)
-        add_dependencies(paho-mqtt3as libressl-portable)
-        add_dependencies(paho-mqtt3cs-static libressl-portable)
-        add_dependencies(paho-mqtt3as-static libressl-portable)
+		include(BundledPahoMqttC)
+		use_bundled_pahomqttc(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+        createExtension(MQTT-EXTENSIONS "MQTT EXTENSIONS" "This Enables MQTT functionality including PublishMQTT/ConsumeMQTT" "extensions/mqtt" "${TEST_DIR}/mqtt-tests")
 endif()
 
+# Create JNI Extension
 if(ENABLE_ALL OR ENABLE_JNI)
 	createExtension(JNI-EXTENSION "JNI EXTENSIONS" "Enables JNI capabilities to support loading Java Classes." "extensions/jni" "${TEST_DIR}/jni-tests")
 endif()
 
-
+# Create PCAP Extension
 option(ENABLE_PCAP "Enables the PCAP extension." OFF)
 if(ENABLE_ALL OR ENABLE_PCAP)
 	createExtension(PCAP-EXTENSION "PCAP EXTENSIONS" "Enables libPCAP Functionality and the PacketCapture processor." "extensions/pcap" "${TEST_DIR}/pcap-tests")
@@ -504,15 +347,21 @@
 ## Create LibRdKafka Extension
 option(ENABLE_LIBRDKAFKA "Enables the librdkafka extension." OFF)
 if (ENABLE_ALL OR ENABLE_LIBRDKAFKA)
+	include(BundledLibRdKafka)
+	use_bundled_librdkafka(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
 	createExtension(RDKAFKA-EXTENSIONS "RDKAFKA EXTENSIONS" "This Enables librdkafka functionality including PublishKafka" "extensions/librdkafka" "${TEST_DIR}/kafka-tests")
 endif()
 
 ## Scripting extensions
 option(DISABLE_SCRIPTING "Disables the scripting extensions." OFF)
 if (NOT DISABLE_SCRIPTING)
+	# sol
+	add_library(sol INTERFACE)
+	target_include_directories(sol INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/sol2-2.20.0")
     createExtension(SCRIPTING-EXTENSIONS "SCRIPTING EXTENSIONS" "This enables scripting" "extensions/script" "${TEST_DIR}/script-tests")
 endif()
 
+# Sensors extensions
 option(ENABLE_SENSORS "Enables the Sensors package." OFF)
 if(ENABLE_ALL OR ENABLE_SENSORS)
 	add_subdirectory(thirdparty/RTIMULib/RTIMULib)
@@ -523,13 +372,17 @@
 ## SQLite extensions
 option(ENABLE_SQLITE "Disables the scripting extensions." OFF)
 if (ENABLE_ALL OR ENABLE_SQLITE)
-    createExtension(SQLITE-EXTENSIONS "SQLITE EXTENSIONS" "This enables sqlite" "extensions/sqlite" "${TEST_DIR}/sqlite-tests" "TRUE" "thirdparty/sqlite")
+	include(BundledSQLite)
+	use_bundled_sqlite(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+    createExtension(SQLITE-EXTENSIONS "SQLITE EXTENSIONS" "This enables sqlite" "extensions/sqlite" "${TEST_DIR}/sqlite-tests")
 endif()
 
 ## USB camera extensions
 option(ENABLE_USB_CAMERA "Enables USB camera support." OFF)
 if (ENABLE_ALL OR ENABLE_USB_CAMERA)
-    createExtension(USB-CAMERA-EXTENSIONS "USB CAMERA EXTENSIONS" "This enables USB camera support" "extensions/usb-camera" "${TEST_DIR}/usb-camera-tests" "TRUE" "thirdparty/libuvc-0.0.6")
+	include(BundledLibUvc)
+	use_bundled_libuvc(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+    createExtension(USB-CAMERA-EXTENSIONS "USB CAMERA EXTENSIONS" "This enables USB camera support" "extensions/usb-camera" "${TEST_DIR}/usb-camera-tests")
 endif()
 
 ## TensorFlow extensions
@@ -542,7 +395,9 @@
 ## AWS Extentions
 option(ENABLE_AWS "Enables AWS support." OFF)
 if (ENABLE_AWS)
-	createExtension(AWS-EXTENSIONS "AWS EXTENSIONS" "This enables AWS support" "extensions/aws" )
+	include(BundledAwsSdkCpp)
+	use_bundled_libaws(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	createExtension(AWS-EXTENSIONS "AWS EXTENSIONS" "This enables AWS support" "extensions/aws")
 endif()
 
 ## OpenCV Extesions
@@ -555,56 +410,41 @@
 ## Bustache/template extensions
 option(ENABLE_BUSTACHE "Enables Bustache (ApplyTemplate) support." OFF)
 if (ENABLE_BUSTACHE)
-    createExtension(BUSTACHE-EXTENSIONS "BUSTACHE EXTENSIONS" "This enables bustache functionality including ApplyTemplate." "extensions/bustache" "${TEST_DIR}/bustache-tests" "TRUE" "thirdparty/bustache")
+	include(BundledBustache)
+	use_bundled_bustache(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+    createExtension(BUSTACHE-EXTENSIONS "BUSTACHE EXTENSIONS" "This enables bustache functionality including ApplyTemplate." "extensions/bustache" "${TEST_DIR}/bustache-tests")
 endif()
 
 ## OPC Extentions
 if (ENABLE_OPC)
 	include(BundledMbedTLS)
 	use_bundled_mbedtls(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/mbedtls/dummy")
 
 	include(BundledOpen62541)
 	use_bundled_open62541(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
 
-	createExtension(OPC-EXTENSIONS "OPC EXTENSIONS" "This enables OPC-UA support" "extensions/opc" )
+	createExtension(OPC-EXTENSIONS "OPC EXTENSIONS" "This enables OPC-UA support" "extensions/opc")
 endif()
 
 ## SFTP extensions
 option(ENABLE_SFTP "Enables SFTP support." OFF)
 if ((ENABLE_ALL OR ENABLE_SFTP) AND NOT DISABLE_CURL)
-    if(WIN32 OR NOT USE_SYSTEM_LIBSSH2)
-        include(LibSSH2)
-        use_bundled_libssh2(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
-        list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/libssh2/dummy")
-    else()
-        list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/libssh2/sys")
-        find_package (LibSSH2 REQUIRED)
-    endif()
+	include(BundledLibSSH2)
+	use_bundled_libssh2(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+	list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/libssh2/dummy")
 
     createExtension(SFTP "SFTP EXTENSIONS" "This enables SFTP support" "extensions/sftp" "extensions/sftp/tests")
-
-    if(NOT USE_SYSTEM_LIBSSH2)
-        message("minifi-sftp will depend on libssh2-external")
-        add_dependencies(minifi-sftp libssh2-external)
-    endif()
-    message("minifi-sftp will depend on curl-external")
-    add_dependencies(minifi-sftp curl-external)
-    if(NOT USE_SYSTEM_ZLIB)
-        message("minifi-sftp will depend on zlib-external")
-        add_dependencies(minifi-sftp zlib-external)
-    endif()
 endif()
 
 
 ## NOW WE CAN ADD LIBRARIES AND EXTENSIONS TO MAIN
-
 add_subdirectory(main)
 add_subdirectory(nanofi)
 
 add_dependencies(nanofi minifiexe)
 
 if (NOT DISABLE_CURL AND NOT DISABLE_CONTROLLER)
-	add_subdirectory(thirdparty/cxxopts)
 	add_subdirectory(controller)
 	add_dependencies(minificontroller minifiexe)
 endif()
@@ -629,38 +469,36 @@
 message("BUILD_IDENTIFIER is ${BUILD_IDENTIFIER}")
 
 if (WIN32)
-
-# Get the latest abbreviated commit hash of the working branch
-execute_process(
-  COMMAND git log -1 --format=%h
-  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-  OUTPUT_VARIABLE BUILD_REV
-  OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-	execute_process(COMMAND 
-			"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.bat" 
-			"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" 
-			${CMAKE_CURRENT_SOURCE_DIR} 
-			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/ 
+	# Get the latest abbreviated commit hash of the working branch
+	execute_process(
+			COMMAND git log -1 --format=%h
+			WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+			OUTPUT_VARIABLE BUILD_REV
+			OUTPUT_STRIP_TRAILING_WHITESPACE)
+	execute_process(COMMAND
+			"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.bat"
+			"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
+			${CMAKE_CURRENT_SOURCE_DIR}
+			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/
 			"${CMAKE_CXX_COMPILER}"
-			"${CMAKE_CXX_COMPILER_VERSION}" 
-			"${CMAKE_CXX_FLAGS}" 
+			"${CMAKE_CXX_COMPILER_VERSION}"
+			"${CMAKE_CXX_FLAGS}"
 			\"${selected_extensions}\"
 			"${BUILD_IDENTIFIER}"
 			"${BUILD_REV}")
 else()
 	execute_process(COMMAND 
-		"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.sh" 
-		"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" 
-		${CMAKE_CURRENT_SOURCE_DIR} 
-		${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/ 
-		"${CMAKE_CXX_COMPILER}"
-		"${CMAKE_CXX_COMPILER_VERSION}" 
-		"${CMAKE_CXX_FLAGS}" 
-		"${selected_extensions}" 
-		"${BUILD_IDENTIFIER}")
-
+			"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.sh"
+			"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
+			${CMAKE_CURRENT_SOURCE_DIR}
+			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/
+			"${CMAKE_CXX_COMPILER}"
+			"${CMAKE_CXX_COMPILER_VERSION}"
+			"${CMAKE_CXX_FLAGS}"
+			"${selected_extensions}"
+			"${BUILD_IDENTIFIER}")
 endif()
+
 # Generate source assembly
 set(ASSEMBLY_BASE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
 if(WIN32)
@@ -721,18 +559,17 @@
 
 # Generate binary assembly. Exclude conf for windows since we'll be doing the work in the WiX template
 if (NOT WIN32)
-install(FILES conf/minifi.properties conf/minifi-log.properties conf/minifi-uid.properties conf/config.yml
-        DESTINATION conf
-        COMPONENT bin)
-        
-install(DIRECTORY extensions/pythonprocessors/
-        DESTINATION minifi-python
-        COMPONENT bin)
+	install(FILES conf/minifi.properties conf/minifi-log.properties conf/minifi-uid.properties conf/config.yml
+			DESTINATION conf
+			COMPONENT bin)
 
+	install(DIRECTORY extensions/pythonprocessors/
+			DESTINATION minifi-python
+			COMPONENT bin)
 
-install(PROGRAMS bin/minifi.sh
-        DESTINATION bin
-        COMPONENT bin)
+	install(PROGRAMS bin/minifi.sh
+			DESTINATION bin
+			COMPONENT bin)
 endif()
 
 install(FILES LICENSE README.md NOTICE
@@ -740,17 +577,17 @@
         COMPONENT bin)
 
 if(WIN32)
-#preference is to use the exe type so that we have a solution that works well for cross compilation
-#but that leaves the onus up to the developer, so until we can automate some of that build let's enforce
-#the exe here temporarily
-#TODO: Remove this and automate this step.
-#install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/main/minifi.exe
-        #DESTINATION bin
-        #COMPONENT bin)
+	#preference is to use the exe type so that we have a solution that works well for cross compilation
+	#but that leaves the onus up to the developer, so until we can automate some of that build let's enforce
+	#the exe here temporarily
+	#TODO: Remove this and automate this step.
+	#install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/main/minifi.exe
+			#DESTINATION bin
+			#COMPONENT bin)
 else()
-install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/main/minifi
-        DESTINATION bin
-        COMPONENT bin)   
+	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/main/minifi
+			DESTINATION bin
+			COMPONENT bin)
 endif() 
         
 			
diff --git a/CONTRIB.md b/CONTRIB.md
index 6e25262..d651108 100644
--- a/CONTRIB.md
+++ b/CONTRIB.md
@@ -37,6 +37,10 @@
      
 This will provide output for all source files.
 
+### Third parties
+
+Please see [ThirdParties.md](ThirdParties.md) on how MiNiFi builds and uses third party libraries and how you can add new ones.
+
 ### Extensions 
 
 MiNiFi C++ contains a dynamic loading mechanism that loads arbitrary objects. To maintain consistency of development amongst the NiFi ecosystem, it is called a class loader. If you
diff --git a/NOTICE b/NOTICE
index 7d07a68..a62ca67 100644
--- a/NOTICE
+++ b/NOTICE
@@ -21,8 +21,7 @@
 This includes derived works from the cURL (MIT/X-style licensed) project (https://github.com/curl/curl):
 Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many contributors, see the THANKS file.
 The derived work is adapted from
-  CMake/FindLibSSH2.cmake
-and can be found in cmake/libssh2/sys/FindLibSSH2.cmake
+  CMake/FindLibSSH2.cmake and can be found in cmake/libssh2/sys/FindLibSSH2.cmake
 
 This includes derived works from the CMake (BSD 3-Clause licensed) project (https://github.com/Kitware/CMake):
 Copyright 2000-2019 Kitware, Inc. and Contributors
diff --git a/ThirdParties.md b/ThirdParties.md
new file mode 100644
index 0000000..a2aca32
--- /dev/null
+++ b/ThirdParties.md
@@ -0,0 +1,393 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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
+      http://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.
+-->
+# Apache MiNiFi C++ Third Parties guide
+
+Apache MiNiFi C++ uses many third party libraries, both for core functionality and for extensions.
+
+This document describes the way we build and use third parties and provides a guide for adding new ones.
+
+## Table of Contents
+
+  * [Table of Contents](#table-of-contents)
+  * [Choosing a third party](#choosing-a-third-party)
+    + [License](#license)
+  * [Built-in or system dependency](#built-in-or-system-dependency)
+  * [System dependency](#system-dependency)
+    + [bootstrap.sh](#bootstrapsh)
+    + [Find\<Package\>.cmake](#find--package--cmake)
+    + [find_package](#find-package)
+  * [Built-in dependency](#built-in-dependency)
+    + [ExternalProject_Add](#externalproject-add)
+      - [`URL` and `GIT`](#-url--and--git-)
+      - [`SOURCE_DIR`](#-source-dir-)
+      - [`PATCH_COMMAND`](#-patch-command-)
+      - [`CMAKE_ARGS`](#-cmake-args-)
+      - [`BUILD_BYPRODUCTS`](#-build-byproducts-)
+      - [`EXCLUDE_FROM_ALL`](#-exclude-from-all-)
+      - [`LIST_SEPARATOR`](#-list-separator-)
+    + [Choosing a source](#choosing-a-source)
+    + [Patching](#patching)
+    + [Build options](#build-options)
+    + [find_package-like variables](#find-package-like-variables)
+    + [Imported library targets](#imported-library-targets)
+    + [Using third parties in other third parties](#using-third-parties-in-other-third-parties)
+      - [Making a third party available to other third parties](#making-a-third-party-available-to-other-third-parties)
+        * [Find\<Package\>.cmake](#find--package--cmake-1)
+        * [Passthrough variables](#passthrough-variables)
+      - [Using a third party from another third party](#using-a-third-party-from-another-third-party)
+        * [Dependencies](#dependencies)
+        * [CMake module path and passthrough args](#cmake-module-path-and-passthrough-args)
+    + [Interface libraries](#interface-libraries)
+
+
+## Choosing a third party
+
+Deciding if a third party is needed for a particular task and if so, choosing between the different implementations is difficult. A few points that have to considered are:
+ - every third party introduces risk, both operational and security
+ - every third party adds a maintenance burden: it has to be tracked for issues, updated, adapted to changes in the build framework
+ - not using a third party and relying on less tested homegrown solutions however usually carry a greater risk than using one
+ - introducing a new third party dependency to the core should be done with the utmost care. If we make a third party a core dependency, it will increase build time, executable size and the burden to maintain API compatibility.
+
+A few tips to choose a third party:
+ - you have to choose a third party with a [proper license](#license)
+ - prefer well-maintained third parties. Abandoned projects will have a huge maintenance burden.
+ - prefer third parties with frequent/regular releases. There are some projects with a huge number of commits and a very long time since the last release, and we are at a disadvantage in determining whether the actual state of the master is stable: the maintainers should be the judges of that.
+ - prefer third parties with the smaller number of transitive dependencies. If the third party itself needs other third parties, that increases the work greatly to get it done properly at the first time and then maintain it afterwards.
+
+### License
+Only third parties with an Apache License 2.0-compatible license may be linked with this software.
+
+To make sure the third party's license is compatible with Apache License 2.0, refer to the [ASF 3RD PARTY LICENSE POLICY
+](https://www.apache.org/legal/resolved.html). Please also note that license compatibility is a one-way street: a license may be compatible with Apache License 2.0 but not the other way round.
+
+GPL and LGPL are generally not compatible.
+
+## Built-in or system dependency
+When deciding whether a third party dependency should be provided by the system, or compiled and shipped by us, there are many factors to consider.
+
+|          | Advantages                                                                          | Disadvantages                                              |
+|----------|-------------------------------------------------------------------------------------|------------------------------------------------------------|
+| System   | Smaller executable size                                                             | Less control over third-party                              |
+|          | Faster compilation                                                                  | Can't add patches                                          |
+|          |                                                                                     | Has to be supported out-of-the box on all target platforms |
+|          |                                                                                     | Usually not available on Windows                           |
+| Built-in | High level of control over third-party (consistent version and features everywhere) | Larger executable size                                     |
+|          | Can add patches                                                                     | Slower compilation                                         |
+|          | Does not have to be supported by the system                                         |                                                            |
+|          | Works on Windows                                                                    |                                                            |
+
+Even if choosing a system dependency, a built-in version for Windows usually has to be made.
+
+Both a system and a built-in version can be supported, in which case the choice should be configurable via CMake options.
+
+**The goal is to abstract the nature of the third party from the rest of the project**, and create targets from them, that automatically take care of building or finding the third party and any dependencies, be it target, linking or include.
+
+## System dependency
+
+To add a new system dependency, you have to follow the following steps:
+
+### bootstrap.sh
+
+If you are using a system dependency, you have to ensure that the development packages are installed on the build system if the extension is selected.
+
+To ensure this, edit `bootstrap.sh` and all the platform-specific scripts (`centos.sh`, `fedora.sh`, `debian.sh`, `suse.sh`, `rheldistro.sh`, `darwin.sh`).
+
+### Find\<Package\>.cmake
+
+If a `Find<Package>.cmake` is provided for your third party by not unreasonably new (not later than 3.2) CMake versions out of the box, then you have nothing further to do, unless they don't create imported library targets.
+
+If it is not provided, you have three options
+ - if a newer CMake version provides it, you can try "backporting it"
+ - you can search for an already implemented one in other projects with an acceptable license
+ - if everything else fails, you can write one yourself
+
+If you don't end up writing it from scratch, make sure that you indicate the original source in the `NOTICE` file and add the proper license to the `LICENSE` file.
+
+If you need to add a `Find<Package>.cmake` file, add it as `cmake/<package>/sys/Find<Package>.cmake`, and add it to the `CMAKE_MODULE_PATH`.
+
+### find_package
+
+After you have a working `Find<Package>.cmake`, you have to call `find_package` to actually find the package, most likely with the REQUIRED option to set, to make it fail if it can't find it.
+
+Example:
+```
+find_package(Lib<Package> REQUIRED)
+```
+
+## Built-in dependency
+We thrive to build all third party dependencies using the [External Projects](https://cmake.org/cmake/help/latest/module/ExternalProject.html) CMake feature. This has many advantages over adding the third party source to our own CMake-tree with add_subdirectory:
+ - ExternalProject_Add works with non-CMake third parties
+ - we have greater control over what variables are passed to the third party project
+ - we don't have to patch the third parties to avoid target and variable name collisions
+ - we don't have to include the third party sources in our repository
+
+There are some exceptions to using External Projects:
+ - header only libraries don't require it (you could still use ExternalProject_Add to download and unpack the sources, but it is easier to just include the source in our repository and create an INTERFACE target from them).
+ - there are some libraries (notably OpenCV) which generate so many targets in so many configurations and interdependencies between the targets that it is impractical to use imported library targets with them
+ - there are a few third parties that have not yet been converted to an External Project, but they will be, eventually
+
+To add a new built-in dependency, the easiest way is to use an already existing one as a template.
+
+You will need to do the following steps:
+ - create `cmake/Bundled<Package>.cmake`
+ - (optional) if you want to use this from other third parties, create `cmake/<package>/dummy/Find<Package>.cmake`
+ - call the function created in `Bundled<Package>.cmake` in the main `CMakeLists.txt`:
+     ```
+     include(Bundled<Package>)
+     use_bundled_<package>(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+     ```
+     If you created `cmake/<package>/dummy/Find<Package>.cmake` you should also add that to the module path:
+     ```
+     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/<package>/dummy")
+     ```
+     These should be in an extension's enabled conditional path, if the third party is only used by one extension, or in the section for third parties used by multiple packages, if used by more.
+ - Link your extension with the imported third party targets. If everything is done right, dependencies, transitive library linkings and include paths should work automatically.
+
+### ExternalProject_Add
+`ExternalProject_Add` creates a custom target that will build the third party according to our configuration.
+
+It has many options, some of which are described in greater detail later. Let's take a look at the most important ones:
+
+#### `URL` and `GIT`
+Used for fetching the source. In the case of `URL`, it is automatically unpacked. In the case of `GIT` the specified tag is checked out.
+
+See [Choosing a source](#choosing-a-source) for greater detail.
+
+Example:
+```
+GIT "https://github.com/<package>/<package>.git"
+GIT_TAG "v1.0.0"
+```
+```
+URL "https://github.com/<package>/<package>/archive/v1.0.0.tar.gz"
+URL_HASH "SHA256=9b640b13047182761a99ce3e4f000be9687566e0828b4a72709e9e6a3ef98477"
+```
+
+#### `SOURCE_DIR`
+The directory to which will be unpacked/cloned. Must be in the `BINARY_DIR`, so that we don't contaminate our source.
+
+Example:
+```
+SOURCE_DIR "${BINARY_DIR}/thirdparty/package-src"
+```
+
+#### `PATCH_COMMAND`
+Specifies a custom command to run after the source has been downloaded/updated. Needed for applying patches and in the case of non-CMake projects run custom scripts.
+
+See [Patching](#patching) for greater detail.
+
+#### `CMAKE_ARGS`
+Specifies the arguments to pass to the cmake command line.
+
+Be sure to include `${PASSTHROUGH_CMAKE_ARGS}` in this list, because it contains the basic information (compiler, build type, generator, etc.) to the third party, that must be consistent across our entire build.
+
+See [Build options](#build-options) for greater detail.
+
+#### `BUILD_BYPRODUCTS`
+`ExternalProject_Add` needs to know the list of artifacts that are generated by the third party build (and that we care about), so that it can track their modification dates.
+
+This can be usually set to the list of library archives generated by the third party.
+
+Example:
+```
+BUILD_BYPRODUCTS "${<PACKAGE>_BYPRODUCT_DIR}/lib/lib<package>.lib"
+```
+
+#### `EXCLUDE_FROM_ALL`
+This is required so that the custom target created by `ExternalProject_Add` does not get added to the default `ALL` target. This is something we generally want to avoid, as third party dependencies only make sense, if our code depends on them. We don't want them to be top-level targets and built unconditionally.
+
+#### `LIST_SEPARATOR`
+[CMake lists](https://cmake.org/cmake/help/v3.12/command/list.html#introduction) are `;` separated group of strings. When we pass `ExternalProject_Add` a list of arguments in `CMAKE_ARGS` to pass to the third party project, some of those arguments might be lists themselves (list of `CMAKE_MODULES_PATH`-s, for example), which causes issues.
+
+To avoid this, when passing list arguments, the `;`-s should be replaced with `%`-s, and the `LIST_SEPARATOR` set to `%` (it could be an another character, but as `%` is pretty uncommon both in paths and other arguments, it is a good choice).
+
+Even if you don't yourself use list arguments, many parts of the build infrastructure do, like exported targets, so to be safe, set this.
+
+Example:
+```
+string(REPLACE ";" "%" LIST_ARGUMENT_TO_PASS "${LIST_ARGUMENT}")
+
+[...]
+
+LIST_SEPARATOR %
+CMAKE_ARGS -DFOO=ON
+           -DBAR=OFF
+           "-DLIST_ARGUMENT=${LIST_ARGUMENT_TO_PASS}"
+```
+
+### Choosing a source
+Prefer artifacts from the official release site or a reliable mirror. If that is not available, use the https links for releases from GitHub.
+
+Only use a git repo in a last resort:
+ - applying patches to git clones is very flaky in CMake
+ - it usually takes longer to clone a git repo than to download a specific version
+
+When using the `URL` download method, **always** use `URL_HASH` with SHA256 to verify the integrity of the downloaded artifact.
+
+When using the `GIT` download method, use the textual tag of the release instead of the commit id as the `GIT_TAG`.
+
+### Patching
+Adding patches to a third party is sometimes necessary, but maintaining a local patch set is error-prone and takes a lot of work.
+
+Before patching, please consider whether your goal could be achieved by other ways. Perhaps there is a CMake option that can disable the particular feature you want to comment out. If the third party is not the latest released version, there might be a fix upstream already released, and you can update the third party.
+
+If after all you decide the best option is patching, please follow these guidelines:
+ - keep the patch minimal: it is easier to maintain a smaller patch
+ - separate logically different patches to separate patch files: if something is fixed upstream, it is easy to remove the specific patch file for it
+ - place the patch files into the `thirdparty/<third party name>/` directory and use them from there
+ - write ExternalProject_Add's patch step in a platform-independent way: the patch executable on the system is determined in the main CMakeLists.txt, you should use that. An example command looks like this:
+   ```
+   "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/<package>/<package>.patch"
+   ```
+
+### Build options
+Both CMake and configure.sh based third parties usually come with many configuration options.
+When integrating a new third party, these should be reviewed and the proper ones set.
+
+Make sure you disable any parts that is not needed (tests, examples, unneeded features). Doing this has multiple advantages:
+ - faster compilation
+ - less security risk: if something is not compiled in, a vulnerability in that part can't affect us
+ - greater control: e.g. we don't accidentially link with an another third party just because it was available on the system and was enabled by default
+
+### find_package-like variables
+When using imported library targets, having the variables generated by `find_package(Package)`, like `PACKAGE_FOUND`, `PACKAGE_LIBRARIES` and `PACKAGE_INCLUDE_PATHS` is not necessary, because these are already handled by the imported target's interface link and include dependencies.
+
+However, these are usually provided by built-in packages, for multiple reasons:
+ - backwards compatibility: proprietary extensions might depend on them (for already existing third parties)
+ - defining these is required for importing the target, and defining its link and include interface dependencies, so we might just add them
+ - if we want to export this third party to other third parties, the dummy `Find<Package>.cmake` will require these variables anyway
+
+### Imported library targets
+[Imported library targets](https://cmake.org/cmake/help/v3.2/command/add_library.html#imported-libraries) reference a library file located outside the project.
+
+They - like other library targets - can have interface (transitive) library link, include dir and compile definitions.
+These dependencies define, respectively, what other libraries should be linked with the target that links this library, what include paths should be added when compiling a target linking to this library, and what compile flags should be added when compiling a target linking to this library.
+
+If the third party creates multiple library archives, one imported target should be created for each of them, creating the proper dependencies between them, if necessary.
+
+The imported targets should be made dependent on the target created by `ExternalProject_Add`, to make sure that we really have the proper artifacts before we want to use them.
+
+Imported targets are customarily named like `PACKAGE::libPackage`
+
+Unfortunately older CMake versions don't support `target_include_directories` and `target_link_libraries` for IMPORTED targets, so we have to work this around by directly interacting with the `INTERFACE_INCLUDE_DIRECTORIES` and `INTERFACE_LINK_LIBRARIES` lists of the target. Because of this, we also have to make sure that the include directory resulting from the installation of the third party is created beforehand, so that CMake won't complain about a non-existing directory.
+
+Example:
+```
+file(MAKE_DIRECTORY ${PACKAGE_INCLUDE_DIRS})
+
+add_library(PACKAGE::libHelper STATIC IMPORTED)
+set_target_properties(PACKAGE::libHelper PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_INCLUDE_DIRS}")
+set_target_properties(PACKAGE::libHelper PROPERTIES
+        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+        IMPORTED_LOCATION "${HELPER_LIBRARY}")
+add_dependencies(PACKAGE::libHelper package-external)
+
+add_library(PACKAGE::libPackage STATIC IMPORTED)
+set_target_properties(PACKAGE::libPackage PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_INCLUDE_DIRS}")
+set_target_properties(PACKAGE::libPackage PROPERTIES
+        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+        IMPORTED_LOCATION "${PACKAGE_LIBRARY}")
+add_dependencies(PACKAGE::libPackage package-external)
+set_property(TARGET PACKAGE::libPackage APPEND PROPERTY INTERFACE_LINK_LIBRARIES PACKAGE::libHelper)
+```
+
+### Using third parties in other third parties
+Third party libraries can depend on other third party libraries. In this case, we obviously want all third parties to use the other third parties built by us, and not start trying to find them on the system.
+
+To make a third party (user third party) use an another third party (provider third party), we have to
+ - make sure the provider third party gets built before the user third party
+ - create a `Find<Package>.cmake` file for the provider third party
+ - make the user third party use this `Find<Package>.cmake` to find the provider third party
+ - pass all variables used by the provider third party's `Find<Package>.cmake` to the user third party
+ - if there are multiple dependencies, do this for every single one of them
+
+This is a complex and error-prone task, so to make it easier, a helper architecture is used.
+
+#### Making a third party available to other third parties
+
+##### Find\<Package\>.cmake
+Create `cmake/<package>/dummy/Find<Package>.cmake` like this:
+```
+if(NOT <PACKAGE>_FOUND)
+  set(<PACKAGE>_FOUND "YES" CACHE STRING "" FORCE)
+  set(<PACKAGE>_INCLUDE_DIR "${EXPORTED_<PACKAGE>_INCLUDE_DIR}" CACHE STRING "" FORCE)
+  set(<PACKAGE>_LIBRARY ${EXPORTED_<PACKAGE>_LIBRARY} CACHE STRING "" FORCE)
+endif()
+
+if(NOT TARGET <PACKAGE>::lib<Package>)
+  add_library(<PACKAGE>::lib<Package> STATIC IMPORTED)
+  set_target_properties(<PACKAGE>::lib<Package> PROPERTIES
+          INTERFACE_INCLUDE_DIRECTORIES "${<PACKAGE>_INCLUDE_DIR}")
+  set_target_properties(<PACKAGE>::lib<Package> PROPERTIES
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+          IMPORTED_LOCATION "${<PACKAGE>_LIBRARY}")
+endif()
+```
+You have to use the variables that are used by the non-dummy `Find<Package>.cmake` (and consequently used by the third party).
+You only need to create imported targets here if the third party uses it instead of the variables.
+
+Once that's done, add it to the `CMAKE_MODULE_PATH` in the main `CMakeLists.txt`:
+```
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/<package>/dummy")
+```
+
+##### Passthrough variables
+You will also have to supply the variables used by this `Find<Package>.cmake`.
+The `PASSTHROUGH_VARIABLES` cache list is used for this: you have to append all the variables you want to pass to this list, as CMake passthrough variables.
+The variables must begin with `EXPORTED_` and must be prefixed with the third party's name, to make sure there are no collisions:
+```
+set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_<PACKAGE>_INCLUDE_DIR=${<PACKAGE>_INCLUDE_DIR}" CACHE STRING "" FORCE)
+set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_<PACKAGE>_LIBRARY=${<PACKAGE>_LIBRARY}" CACHE STRING "" FORCE)
+```
+`PASSTHROUGH_VARIABLES` will be used by the helper function that passes all necessary variables to other third parties using this third party.
+
+#### Using a third party from another third party
+
+##### Dependencies
+You have to make sure the third party is available before you want to use it from an another third party.
+To ensure this, make the ExternalProject depend on the imported targets from the third party you want to use. This way the exact mode in which the third party will be provided is abstracted and can be adapted by the provider third party without breaking us:
+```
+add_dependencies(lib<package>-external FOO::libFoo BAR::libBar)
+```
+
+##### CMake module path and passthrough args
+To pass our CMake module paths and the variables used by them you can use the `append_third_party_passthrough_args` helper function that will append everyhting needed to your `CMAKE_ARGS`:
+```
+append_third_party_passthrough_args(<PACKAGE>_CMAKE_ARGS "${<PACKAGE>_CMAKE_ARGS}")
+```
+Make sure you also have [`LIST_SEPARATOR`](#list_separator) set to `%`, as we pass lists here.
+
+Unfortunately some third parties are written in a way that they override the `CMAKE_MODULE_PATH` passed to them via CMake args.
+If this is the case, you will have to patch the third party and change something like this
+```
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+```
+to this
+```
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+```
+
+### Interface libraries
+[Interface libraries](https://cmake.org/cmake/help/v3.2/manual/cmake-buildsystem.7.html#interface-libraries) can be used to create targets from header-only libraries and use them the same way as any other library target.
+
+Header-only third party libraries are placed in the the `thirdparty` directory and an interface library target is created from them.
+
+Example:
+```
+add_library(foo INTERFACE)
+target_include_directories(foo INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libfoo-1.0.0")
+```
diff --git a/cmake/BuildTests.cmake b/cmake/BuildTests.cmake
index db8aa67..8779d86 100644
--- a/cmake/BuildTests.cmake
+++ b/cmake/BuildTests.cmake
@@ -37,9 +37,6 @@
 
 function(appendIncludes testName)
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/catch")
-    target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/cron")
-    target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/spdlog-20170710/include")
-    target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-0.5.3/include")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/include")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/")
     target_include_directories(${testName} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/c2/protocols")
@@ -74,17 +71,10 @@
     if (Boost_FOUND)
         target_include_directories(${testName} BEFORE PRIVATE "${Boost_INCLUDE_DIRS}")
     endif()
-    target_link_libraries(${testName} ${CMAKE_DL_LIBS} ${SPD_LIB} ${TEST_BASE_LIB})
-    target_link_libraries(${testName} ${CMAKE_THREAD_LIBS_INIT}  core-minifi yaml-cpp)
+    target_link_libraries(${testName} ${CMAKE_DL_LIBS} ${TEST_BASE_LIB})
+    target_link_libraries(${testName} ${CMAKE_THREAD_LIBS_INIT} core-minifi yaml-cpp spdlog)
     if (NOT excludeBase)
-      if (APPLE)
-  		target_link_libraries (${testName} -Wl,-all_load minifi)
-	  elseif(WIN32)
-	    target_link_libraries (${testName} minifi)
-	    set_target_properties(${testName} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi")
-	  else ()
-  		target_link_libraries (${testName} -Wl,--whole-archive minifi -Wl,--no-whole-archive)
-	  endif ()
+      target_wholearchive_library(${testName} minifi)
 	endif()
 	add_dependencies(${testName} minifiexe nanofi)
     if (Boost_FOUND)
@@ -95,16 +85,11 @@
 
 enable_testing(test)
 
-SET(SPD_LIB spd_lib)
-add_library(${SPD_LIB} STATIC ${SPD_SOURCES})
-
 SET(TEST_BASE_LIB test_base)
 add_library(${TEST_BASE_LIB} STATIC "${TEST_DIR}/TestBase.cpp" "${TEST_DIR}/RandomServerSocket.cpp" "${TEST_DIR}/KamikazeProcessor.cpp")
+target_link_libraries(${TEST_BASE_LIB} core-minifi)
 target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/catch")
 target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/")
-target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/cron")
-target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/spdlog-20170710/include")
-target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}/include")
 if(WIN32)
    	target_include_directories(${TEST_BASE_LIB} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/opsys/win")
 else()
@@ -143,21 +128,9 @@
     target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test")
     appendIncludes("${testfilename}")
     target_link_libraries(${testfilename} ${CMAKE_THREAD_LIBS_INIT} ${CATCH_MAIN_LIB} ${TEST_BASE_LIB}  nanofi)
-    
-    if (APPLE)
-    	# minifi-standard-processors
-	target_link_libraries (${testfilename} -Wl,-all_load minifi-standard-processors nanofi)
-    elseif(NOT WIN32)
-	target_link_libraries (${testfilename} -Wl,--whole-archive minifi-standard-processors -Wl,--no-whole-archive)
-    else()
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi-standard-processors")
-	target_link_libraries (${testfilename} minifi-standard-processors)
-    endif ()
-	
-    if(WIN32)
-	set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${WIN32_ARCHIVES}")
-    endif()
-    
+
+    target_wholearchive_library(${testfilename} minifi-standard-processors)
+
     MATH(EXPR UNIT_TEST_COUNT "${UNIT_TEST_COUNT}+1")
     add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/cmake/BundledAwsSdkCpp.cmake b/cmake/BundledAwsSdkCpp.cmake
new file mode 100644
index 0000000..4690c61
--- /dev/null
+++ b/cmake/BundledAwsSdkCpp.cmake
@@ -0,0 +1,178 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_libaws SOURCE_DIR BINARY_DIR)
+    # Define byproducts
+    if (WIN32)
+        set(SUFFIX "lib")
+    else()
+        set(SUFFIX "a")
+    endif()
+    set(BYPRODUCTS
+            "lib/libaws-cpp-sdk-core.${SUFFIX}"
+            "lib/libaws-cpp-sdk-s3.${SUFFIX}")
+
+    FOREACH(BYPRODUCT ${BYPRODUCTS})
+        LIST(APPEND AWSSDK_LIBRARIES_LIST "${BINARY_DIR}/thirdparty/libaws-install/${BYPRODUCT}")
+    ENDFOREACH(BYPRODUCT)
+
+    # Set build options
+    set(AWS_C_COMMON_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            -DCMAKE_PREFIX_PATH=${BINARY_DIR}/thirdparty/libaws-install
+            -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libaws-install
+            -DENABLE_TESTING=OFF
+            -DBUILD_SHARED_LIBS=OFF)
+
+    append_third_party_passthrough_args(AWS_C_COMMON_CMAKE_ARGS "${AWS_C_COMMON_CMAKE_ARGS}")
+
+    set(AWS_CHECKSUM_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            -DCMAKE_PREFIX_PATH=${BINARY_DIR}/thirdparty/libaws-install
+            -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libaws-install
+            -DBUILD_SHARED_LIBS=OFF)
+
+    append_third_party_passthrough_args(AWS_CHECKSUM_CMAKE_ARGS "${AWS_CHECKSUM_CMAKE_ARGS}")
+
+    set(AWS_C_EVENT_STREAM_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            -DCMAKE_PREFIX_PATH=${BINARY_DIR}/thirdparty/libaws-install
+            -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libaws-install
+            -DBUILD_SHARED_LIBS=OFF)
+
+    append_third_party_passthrough_args(AWS_C_EVENT_STREAM_CMAKE_ARGS "${AWS_C_EVENT_STREAM_CMAKE_ARGS}")
+
+    set(AWS_SDK_CPP_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            -DCMAKE_PREFIX_PATH=${BINARY_DIR}/thirdparty/libaws-install
+            -DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libaws-install
+            -DBUILD_ONLY=s3
+            -DENABLE_TESTING=OFF
+            -DBUILD_SHARED_LIBS=OFF
+            -DENABLE_UNITY_BUILD=ON
+            -DBUILD_DEPS=OFF)
+
+    append_third_party_passthrough_args(AWS_SDK_CPP_CMAKE_ARGS "${AWS_SDK_CPP_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            aws-c-common-external
+            GIT_REPOSITORY "https://github.com/awslabs/aws-c-common.git"
+            GIT_TAG "ac02e1728d740bb9106b6ea727cd3378f8ea438a"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/aws-c-common-src"
+            INSTALL_DIR "${BINARY_DIR}/thirdparty/libaws-install"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${AWS_C_COMMON_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-common.${SUFFIX}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+    ExternalProject_Add(
+            aws-checksum-external
+            GIT_REPOSITORY "https://github.com/awslabs/aws-checksums.git"
+            GIT_TAG "41dc36d14b0898bd34e3f91c808fcb00f5e21875"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/aws-checksums-src"
+            INSTALL_DIR "${BINARY_DIR}/thirdparty/libaws-install"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${AWS_CHECKSUM_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-checksums.${SUFFIX}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+    ExternalProject_Add(
+            aws-c-event-stream-external
+            GIT_REPOSITORY "https://github.com/awslabs/aws-c-event-stream.git"
+            GIT_TAG "97ab2e57e83ad114679dbee0dcfb5048640debe7"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/aws-c-event-stream-src"
+            INSTALL_DIR "${BINARY_DIR}/thirdparty/libaws-install"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${AWS_C_EVENT_STREAM_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-event-stream.${SUFFIX}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+    ExternalProject_Add(
+            aws-sdk-cpp-external
+            GIT_REPOSITORY "https://github.com/aws/aws-sdk-cpp.git"
+            GIT_TAG "1.7.109"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/aws-sdk-cpp-src"
+            INSTALL_DIR "${BINARY_DIR}/thirdparty/libaws-install"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${AWS_SDK_CPP_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${AWSSDK_LIBRARIES_LIST}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    add_dependencies(aws-c-common-external CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    add_dependencies(aws-checksum-external CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    add_dependencies(aws-c-event-stream-external CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    add_dependencies(aws-c-event-stream-external aws-c-common-external aws-checksum-external)
+    add_dependencies(aws-sdk-cpp-external CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    add_dependencies(aws-sdk-cpp-external aws-c-event-stream-external aws-c-common-external aws-checksum-external)
+
+    # Set variables
+    set(LIBAWS_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBAWS_INCLUDE_DIR "${BINARY_DIR}/thirdparty/libaws-install/include" CACHE STRING "" FORCE)
+    set(LIBAWS_LIBRARIES
+            ${AWSSDK_LIBRARIES_LIST}
+            "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-event-stream.${SUFFIX}"
+            "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-common.${SUFFIX}"
+            "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-checksums.${SUFFIX}"
+            CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${LIBAWS_INCLUDE_DIR})
+
+    add_library(AWS::aws-c-common STATIC IMPORTED)
+    set_target_properties(AWS::aws-c-common PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-common.${SUFFIX}")
+    add_dependencies(AWS::aws-c-common aws-c-common-external)
+    set_property(TARGET AWS::aws-c-common APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBAWS_INCLUDE_DIR})
+    set_property(TARGET AWS::aws-c-common APPEND PROPERTY INTERFACE_LINK_LIBRARIES CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    if (APPLE)
+        set_property(TARGET AWS::aws-c-common APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-framework CoreFoundation")
+    endif()
+
+    add_library(AWS::aws-checksums STATIC IMPORTED)
+    set_target_properties(AWS::aws-checksums PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-checksums.${SUFFIX}")
+    add_dependencies(AWS::aws-checksums aws-checksums-external)
+    set_property(TARGET AWS::aws-checksums APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBAWS_INCLUDE_DIR})
+    set_property(TARGET AWS::aws-checksums APPEND PROPERTY INTERFACE_LINK_LIBRARIES CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    if (APPLE)
+        set_property(TARGET AWS::aws-checksums APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-framework CoreFoundation")
+    endif()
+
+    add_library(AWS::aws-c-event-stream STATIC IMPORTED)
+    set_target_properties(AWS::aws-c-event-stream PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-c-event-stream.${SUFFIX}")
+    add_dependencies(AWS::aws-c-event-stream aws-c-event-stream-external)
+    set_property(TARGET AWS::aws-c-event-stream APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBAWS_INCLUDE_DIR})
+    set_property(TARGET AWS::aws-c-event-stream APPEND PROPERTY INTERFACE_LINK_LIBRARIES AWS::aws-c-common AWS::aws-checksums CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    if (APPLE)
+        set_property(TARGET AWS::aws-c-event-stream APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-framework CoreFoundation")
+    endif()
+
+    add_library(AWS::aws-cpp-sdk-core STATIC IMPORTED)
+    set_target_properties(AWS::aws-cpp-sdk-core PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-cpp-sdk-core.${SUFFIX}")
+    add_dependencies(AWS::aws-cpp-sdk-core aws-sdk-cpp-external)
+    set_property(TARGET AWS::aws-cpp-sdk-core APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBAWS_INCLUDE_DIR})
+    set_property(TARGET AWS::aws-cpp-sdk-core APPEND PROPERTY INTERFACE_LINK_LIBRARIES AWS::aws-c-event-stream AWS::aws-c-common AWS::aws-checksums CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    if (APPLE)
+        set_property(TARGET AWS::aws-cpp-sdk-core APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-framework CoreFoundation")
+    endif()
+
+    add_library(AWS::aws-cpp-sdk-s3 STATIC IMPORTED)
+    set_target_properties(AWS::aws-cpp-sdk-s3 PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libaws-install/lib/libaws-cpp-sdk-s3.${SUFFIX}")
+    add_dependencies(AWS::aws-cpp-sdk-s3 aws-sdk-cpp-external)
+    set_property(TARGET AWS::aws-cpp-sdk-s3 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBAWS_INCLUDE_DIR})
+    set_property(TARGET AWS::aws-cpp-sdk-s3 APPEND PROPERTY INTERFACE_LINK_LIBRARIES CURL::libcurl OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB)
+    if (APPLE)
+        set_property(TARGET AWS::aws-cpp-sdk-s3 APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-framework CoreFoundation")
+    endif()
+endfunction(use_bundled_libaws)
diff --git a/cmake/BundledBustache.cmake b/cmake/BundledBustache.cmake
new file mode 100644
index 0000000..4ee1804
--- /dev/null
+++ b/cmake/BundledBustache.cmake
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_bustache SOURCE_DIR BINARY_DIR)
+    # Find Boost
+    find_package(Boost COMPONENTS system filesystem iostreams REQUIRED)
+
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "lib/bustache.lib")
+    else()
+        set(BYPRODUCT "lib/libbustache.a")
+    endif()
+
+    # Set build options
+    set(BUSTACHE_BYPRODUCT_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/bustache-install")
+
+    set(BUSTACHE_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BUSTACHE_BYPRODUCT_DIR}"
+            "-DBUSTACHE_ENABLE_TESTING=OFF")
+
+    # Build project
+    ExternalProject_Add(
+            bustache-external
+            GIT "https://github.com/jamboree/bustache.git"
+            GIT_TAG "42dee8ef9bbcae7e9a33500a116cfd9c314662d6"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/bustache-src"
+            CMAKE_ARGS ${BUSTACHE_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${BUSTACHE_BYPRODUCT_DIR}/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(BUSTACHE_FOUND "YES" CACHE STRING "" FORCE)
+    set(BUSTACHE_INCLUDE_DIR "${BUSTACHE_BYPRODUCT_DIR}/include" CACHE STRING "" FORCE)
+    set(BUSTACHE_LIBRARY "${BUSTACHE_BYPRODUCT_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(BUSTACHE::libbustache STATIC IMPORTED)
+    set_target_properties(BUSTACHE::libbustache PROPERTIES IMPORTED_LOCATION "${BUSTACHE_LIBRARY}")
+    add_dependencies(BUSTACHE::libbustache bustache-external)
+    file(MAKE_DIRECTORY ${BUSTACHE_INCLUDE_DIR})
+    set_property(TARGET BUSTACHE::libbustache APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${BUSTACHE_INCLUDE_DIR} ${Boost_INCLUDE_DIRS})
+    set_property(TARGET BUSTACHE::libbustache APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${Boost_LIBRARIES})
+endfunction(use_bundled_bustache)
diff --git a/cmake/BundledCivetWeb.cmake b/cmake/BundledCivetWeb.cmake
new file mode 100644
index 0000000..f5b7e11
--- /dev/null
+++ b/cmake/BundledCivetWeb.cmake
@@ -0,0 +1,101 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_civetweb SOURCE_DIR BINARY_DIR)
+    message("Using bundled civetweb")
+
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/civetweb/civetweb.patch")
+
+    # Define byproducts
+    if (WIN32)
+        set(SUFFIX "lib")
+    else()
+		set(PREFIX "lib")
+        set(SUFFIX "a")
+    endif()
+
+    set(BYPRODUCTS
+            "lib/${PREFIX}civetweb.${SUFFIX}"
+            "lib/${PREFIX}civetweb-cpp.${SUFFIX}"
+            )
+
+    set(CIVETWEB_BIN_DIR "${BINARY_DIR}/thirdparty/civetweb-install/" CACHE STRING "" FORCE)
+
+    FOREACH(BYPRODUCT ${BYPRODUCTS})
+        LIST(APPEND CIVETWEB_LIBRARIES_LIST "${CIVETWEB_BIN_DIR}/${BYPRODUCT}")
+    ENDFOREACH(BYPRODUCT)
+
+    # Set build options
+    set(CIVETWEB_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${CIVETWEB_BIN_DIR}"
+            -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+            -DCIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=OFF
+            -DCIVETWEB_ENABLE_CXX=ON
+            -DBUILD_TESTING=OFF
+            -DCIVETWEB_ALLOW_WARNINGS=ON
+            -DCIVETWEB_ENABLE_ASAN=OFF # TODO
+            )
+    if (OPENSSL_OFF)
+        list(APPEND CIVETWEB_CMAKE_ARGS -DCIVETWEB_ENABLE_SSL=OFF)
+    endif()
+
+    append_third_party_passthrough_args(CIVETWEB_CMAKE_ARGS "${CIVETWEB_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            civetweb-external
+            URL "https://github.com/civetweb/civetweb/archive/v1.10.tar.gz"
+            URL_HASH "SHA256=e6958f005aa01b02645bd3ff9760dd085e83d30530cdd97b584632419195bea5"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/civetweb-src"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${CIVETWEB_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${CIVETWEB_LIBRARIES_LIST}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    if (NOT OPENSSL_OFF)
+        add_dependencies(civetweb-external OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+
+    # Set variables
+    set(CIVETWEB_FOUND "YES" CACHE STRING "" FORCE)
+    set(CIVETWEB_INCLUDE_DIR "${CIVETWEB_BIN_DIR}/include" CACHE STRING "" FORCE)
+    set(CIVETWEB_LIBRARIES "${CIVETWEB_BIN_DIR}/lib/${PREFIX}civetweb.${SUFFIX}" "${CIVETWEB_BIN_DIR}/lib/${PREFIX}civetweb-cpp.${SUFFIX}" CACHE STRING "" FORCE)
+
+    # Set exported variables for FindPackage.cmake
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_CIVETWEB_INCLUDE_DIR=${CIVETWEB_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_CIVETWEB_LIBRARIES=${CIVETWEB_LIBRARIES}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${CIVETWEB_INCLUDE_DIR})
+
+    add_library(CIVETWEB::c-library STATIC IMPORTED)
+    set_target_properties(CIVETWEB::c-library PROPERTIES IMPORTED_LOCATION "${CIVETWEB_BIN_DIR}/lib/${PREFIX}civetweb.${SUFFIX}")
+    set_property(TARGET CIVETWEB::c-library APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CIVETWEB_INCLUDE_DIR})
+    add_dependencies(CIVETWEB::c-library civetweb-external)
+    if (NOT OPENSSL_OFF)
+        set_property(TARGET CIVETWEB::c-library APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+
+    add_library(CIVETWEB::civetweb-cpp STATIC IMPORTED)
+    set_target_properties(CIVETWEB::civetweb-cpp PROPERTIES IMPORTED_LOCATION "${CIVETWEB_BIN_DIR}/lib/${PREFIX}civetweb-cpp.${SUFFIX}")
+    set_property(TARGET CIVETWEB::civetweb-cpp APPEND PROPERTY INTERFACE_LINK_LIBRARIES CIVETWEB::c-library)
+    add_dependencies(CIVETWEB::civetweb-cpp civetweb-external)
+endfunction(use_bundled_civetweb)
diff --git a/cmake/BundledJemalloc.cmake b/cmake/BundledJemalloc.cmake
new file mode 100644
index 0000000..c4bdfc8
--- /dev/null
+++ b/cmake/BundledJemalloc.cmake
@@ -0,0 +1,55 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_jemalloc SOURCE_DIR BINARY_DIR)
+    message("Using bundled jemalloc")
+
+    # Define byproducts
+    set(BYPRODUCT "lib/libjemalloc.a")
+
+    # Build project
+    ExternalProject_Add(
+            jemalloc-external
+            GIT_REPOSITORY "https://github.com/jemalloc/jemalloc.git"
+            GIT_TAG "5.1.0"
+            PREFIX "${BINARY_DIR}/thirdparty/jemalloc"
+            BUILD_IN_SOURCE true
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/jemalloc-src"
+            BUILD_COMMAND make
+            CMAKE_COMMAND ""
+            UPDATE_COMMAND ""
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/jemalloc-src/${BYPRODUCT}"
+            INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step."
+            CONFIGURE_COMMAND ""
+            PATCH_COMMAND ./autogen.sh && ./configure
+            STEP_TARGETS build
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(JEMALLOC_FOUND "YES" CACHE STRING "" FORCE)
+    set(JEMALLOC_INCLUDE_DIRS "${BINARY_DIR}/thirdparty/jemalloc-src/include" CACHE STRING "" FORCE)
+    set(JEMALLOC_LIBRARY "${BINARY_DIR}/thirdparty/jemalloc-src/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(JEMALLOC_LIBRARIES "${JEMALLOC_LIBRARY}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(JeMalloc::JeMalloc STATIC IMPORTED)
+    set_target_properties(JeMalloc::JeMalloc PROPERTIES IMPORTED_LOCATION "${JEMALLOC_LIBRARY}")
+    add_dependencies(JeMalloc::JeMalloc jemalloc-external)
+    file(MAKE_DIRECTORY ${JEMALLOC_INCLUDE_DIRS})
+    set_property(TARGET JeMalloc::JeMalloc APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${JEMALLOC_INCLUDE_DIRS})
+endfunction(use_bundled_jemalloc)
diff --git a/cmake/BundledLibArchive.cmake b/cmake/BundledLibArchive.cmake
new file mode 100644
index 0000000..815b9b1
--- /dev/null
+++ b/cmake/BundledLibArchive.cmake
@@ -0,0 +1,62 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_libarchive SOURCE_DIR BINARY_DIR)
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/libarchive/libarchive.patch")
+
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "lib/libarchive.lib")
+    else()
+        set(BYPRODUCT "lib/libarchive.a")
+    endif()
+
+    # Set build options
+    set(LIBARCHIVE_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libarchive-install"
+            -DENABLE_NETTLE=FALSE
+            -DENABLE_OPENSSL=FALSE
+            -DENABLE_TAR=FALSE
+            -DENABLE_CPIO=FALSE
+            -DENABLE_TEST=FALSE)
+
+    # Build project
+    ExternalProject_Add(
+            libarchive-external
+            URL "https://www.libarchive.org/downloads/libarchive-3.3.2.tar.gz"
+            URL_HASH "SHA256=ed2dbd6954792b2c054ccf8ec4b330a54b85904a80cef477a1c74643ddafa0ce"
+            SOURCE_DIR "${SOURCE_DIR}/thirdparty/libarchive-src"
+            CMAKE_ARGS ${LIBARCHIVE_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libarchive-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(LIBARCHIVE_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBARCHIVE_INCLUDE_DIR "${BINARY_DIR}/thirdparty/libarchive-install/include" CACHE STRING "" FORCE)
+    set(LIBARCHIVE_LIBRARY "${BINARY_DIR}/thirdparty/libarchive-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(LIBARCHIVE_LIBRARIES ${LIBARCHIVE_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(libarchive STATIC IMPORTED)
+    set_target_properties(libarchive PROPERTIES IMPORTED_LOCATION "${LIBARCHIVE_LIBRARY}")
+    add_dependencies(libarchive libarchive-external)
+    file(MAKE_DIRECTORY ${LIBARCHIVE_INCLUDE_DIR})
+    set_property(TARGET libarchive APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBARCHIVE_INCLUDE_DIR})
+endfunction(use_bundled_libarchive)
diff --git a/cmake/BundledLibCOAP.cmake b/cmake/BundledLibCOAP.cmake
new file mode 100644
index 0000000..7d52d5a
--- /dev/null
+++ b/cmake/BundledLibCOAP.cmake
@@ -0,0 +1,62 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+#
+
+function(use_bundled_libcoap SOURCE_DIR BINARY_DIR)
+    message("Using bundled libcoap")
+
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "lib/libcoap-2.lib")
+    else()
+        set(BYPRODUCT "lib/libcoap-2.a")
+    endif()
+
+    # Build project
+    ExternalProject_Add(
+            coap-external
+            GIT_REPOSITORY "https://github.com/obgm/libcoap.git"
+            GIT_TAG "v4.2.0-rc2"
+            BUILD_IN_SOURCE true
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/libcoap-src"
+            BUILD_COMMAND make
+            CMAKE_COMMAND ""
+            UPDATE_COMMAND ""
+            INSTALL_COMMAND make install
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libcoap-install/${BYPRODUCT}"
+            CONFIGURE_COMMAND ""
+            PATCH_COMMAND ./autogen.sh && ./configure --disable-examples --disable-dtls --disable-tests --disable-documentation --prefix=${BINARY_DIR}/thirdparty/libcoap-install
+            STEP_TARGETS build
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(COAP_FOUND "YES" CACHE STRING "" FORCE)
+    set(COAP_INCLUDE_DIRS "${BINARY_DIR}/thirdparty/libcoap-install/include" CACHE STRING "" FORCE)
+    set(COAP_LIBRARY "${BINARY_DIR}/thirdparty/libcoap-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(COAP_LIBRARIES "${COAP_LIBRARY}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${COAP_INCLUDE_DIRS})
+
+    add_library(COAP::libcoap STATIC IMPORTED)
+    set_target_properties(COAP::libcoap PROPERTIES IMPORTED_LOCATION "${COAP_LIBRARY}")
+    add_dependencies(COAP::libcoap coap-external)
+    set_property(TARGET COAP::libcoap APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${COAP_INCLUDE_DIRS}")
+    set_property(TARGET COAP::libcoap APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "WITH_POSIX=1")
+endfunction(use_bundled_libcoap)
diff --git a/cmake/BundledLibRdKafka.cmake b/cmake/BundledLibRdKafka.cmake
new file mode 100644
index 0000000..b83420a
--- /dev/null
+++ b/cmake/BundledLibRdKafka.cmake
@@ -0,0 +1,73 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_librdkafka SOURCE_DIR BINARY_DIR)
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/librdkafka/librdkafka-libressl.patch")
+
+    # Define byproducts
+    if(WIN32)
+        set(BYPRODUCT "lib/rdkafka.lib")
+    else()
+        set(BYPRODUCT "lib/librdkafka.a")
+    endif()
+
+    # Set build options
+    set(LIBRDKAFKA_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/librdkafka-install"
+            "-DWITH_SSL=ON"
+            "-DWITH_SASL=OFF"
+            "-DRDKAFKA_BUILD_STATIC=ON"
+            "-DRDKAFKA_BUILD_EXAMPLES=OFF"
+            "-DRDKAFKA_BUILD_TESTS=OFF"
+            "-DENABLE_LZ4_EXT=OFF"
+            "-DWITH_ZSTD=OFF"
+            "-DCMAKE_INSTALL_LIBDIR=lib"
+            "-DLIBRDKAFKA_STATICLIB=1")
+
+    append_third_party_passthrough_args(LIBRDKAFKA_CMAKE_ARGS "${LIBRDKAFKA_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            kafka-external
+            URL "https://github.com/edenhill/librdkafka/archive/v1.0.1.tar.gz"
+            URL_HASH "SHA256=b2a2defa77c0ef8c508739022a197886e0644bd7bf6179de1b68bdffb02b3550"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${LIBRDKAFKA_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/librdkafka-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    add_dependencies(kafka-external OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB)
+
+    # Set variables
+    set(LIBRDKAFKA_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBRDKAFKA_INCLUDE_DIR "${BINARY_DIR}/thirdparty/librdkafka-install/include/librdkafka" CACHE STRING "" FORCE)
+    set(LIBRDKAFKA_LIBRARY "${BINARY_DIR}/thirdparty/librdkafka-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(LIBRDKAFKA_LIBRARIES ${LIBRDKAFKA_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(librdkafka STATIC IMPORTED)
+    set_target_properties(librdkafka PROPERTIES IMPORTED_LOCATION "${LIBRDKAFKA_LIBRARY}")
+    add_dependencies(librdkafka kafka-external)
+    set_property(TARGET librdkafka APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB)
+    file(MAKE_DIRECTORY ${LIBRDKAFKA_INCLUDE_DIR})
+    set_property(TARGET librdkafka APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBRDKAFKA_INCLUDE_DIR})
+    set_property(TARGET librdkafka APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "LIBRDKAFKA_STATICLIB=1")
+endfunction(use_bundled_librdkafka)
\ No newline at end of file
diff --git a/cmake/BundledLibSSH2.cmake b/cmake/BundledLibSSH2.cmake
new file mode 100644
index 0000000..f78aff1
--- /dev/null
+++ b/cmake/BundledLibSSH2.cmake
@@ -0,0 +1,79 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_libssh2 SOURCE_DIR BINARY_DIR)
+    message("Using bundled libssh2")
+
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/libssh2/libssh2-CMAKE_MODULE_PATH.patch")
+
+    # Define byproducts
+    get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
+    if ("${LIB64}" STREQUAL "TRUE" AND (NOT WIN32 AND NOT APPLE))
+        set(LIBSUFFIX 64)
+    endif()
+
+    if (WIN32)
+        set(BYPRODUCT "lib/libssh2.lib")
+    else()
+        set(BYPRODUCT "lib${LIBSUFFIX}/libssh2.a")
+    endif()
+
+    # Set build options
+    set(LIBSSH2_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libssh2-install"
+            -DENABLE_ZLIB_COMPRESSION=ON
+            -DCRYPTO_BACKEND=OpenSSL
+            -DBUILD_TESTING=OFF
+            -DBUILD_EXAMPLES=OFF)
+
+    append_third_party_passthrough_args(LIBSSH2_CMAKE_ARGS "${LIBSSH2_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            libssh2-external
+            URL "https://www.libssh2.org/download/libssh2-1.8.2.tar.gz"
+            URL_HASH "SHA256=088307d9f6b6c4b8c13f34602e8ff65d21c2dc4d55284dfe15d502c4ee190d67"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/libssh2-src"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${LIBSSH2_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libssh2-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    add_dependencies(libssh2-external OpenSSL::Crypto ZLIB::ZLIB)
+
+    # Set variables
+    set(LIBSSH2_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBSSH2_INCLUDE_DIR "${BINARY_DIR}/thirdparty/libssh2-install/include" CACHE STRING "" FORCE)
+    set(LIBSSH2_LIBRARY "${BINARY_DIR}/thirdparty/libssh2-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+
+    # Set exported variables for FindPackage.cmake
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_LIBSSH2_INCLUDE_DIR=${LIBSSH2_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_LIBSSH2_LIBRARY=${LIBSSH2_LIBRARY}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${LIBSSH2_INCLUDE_DIR})
+
+    add_library(libssh2 STATIC IMPORTED)
+    set_target_properties(libssh2 PROPERTIES IMPORTED_LOCATION "${LIBSSH2_LIBRARY}")
+    add_dependencies(libssh2 libssh2-external)
+    set_property(TARGET libssh2 APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::Crypto ZLIB::ZLIB)
+    set_property(TARGET libssh2 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBSSH2_INCLUDE_DIR})
+endfunction(use_bundled_libssh2)
diff --git a/cmake/BundledLibUvc.cmake b/cmake/BundledLibUvc.cmake
new file mode 100644
index 0000000..e9b2043
--- /dev/null
+++ b/cmake/BundledLibUvc.cmake
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_libuvc SOURCE_DIR BINARY_DIR)
+    find_package(PkgConfig)
+    pkg_check_modules(LIBUSB libusb-1.0)
+
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/libuvc/libuvc.patch")
+
+    # Define patch step
+    if (WIN32)
+        set(BYPRODUCT "lib/${CMAKE_LIBRARY_ARCHITECTURE}/libuvc.lib")
+    else()
+        set(BYPRODUCT "lib/${CMAKE_LIBRARY_ARCHITECTURE}/libuvc.a")
+    endif()
+
+    # Set build options
+    set(LIBUVC_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libuvc-install")
+
+    # Build project
+    ExternalProject_Add(
+            libuvc-external
+            GIT_REPOSITORY "https://github.com/libuvc/libuvc.git"
+            GIT_TAG "v0.0.6"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/libuvc-src"
+            CMAKE_ARGS ${LIBUVC_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/libuvc-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(LIBUVC_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBUVC_INCLUDE_DIR "${BINARY_DIR}/thirdparty/libuvc-install/include" CACHE STRING "" FORCE)
+    set(LIBUVC_LIBRARY "${BINARY_DIR}/thirdparty/libuvc-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(LIBUVC_LIBRARIES ${LIBUVC_LIBRARY} CACHE STRING "" FORCE)
+
+    add_library(libuvc STATIC IMPORTED)
+    set_target_properties(libuvc PROPERTIES IMPORTED_LOCATION "${LIBUVC_LIBRARY}")
+    add_dependencies(libuvc libuvc-external)
+    file(MAKE_DIRECTORY ${LIBUVC_INCLUDE_DIR})
+    set_property(TARGET libuvc APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LIBUVC_INCLUDE_DIR})
+    set_property(TARGET libuvc APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${LIBUSB_LIBRARIES})
+endfunction(use_bundled_libuvc)
diff --git a/cmake/BundledLibcURL.cmake b/cmake/BundledLibcURL.cmake
new file mode 100644
index 0000000..1917d98
--- /dev/null
+++ b/cmake/BundledLibcURL.cmake
@@ -0,0 +1,106 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_curl SOURCE_DIR BINARY_DIR)
+    # Define patch step
+    if (WIN32)
+        set(PC "PATCH_COMMAND ./buildconf.bat")
+    endif()
+
+    # Define byproducts
+    get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
+
+    if ("${LIB64}" STREQUAL "TRUE" AND (NOT WIN32 AND NOT APPLE))
+        set(LIBSUFFIX 64)
+    endif()
+
+    if (WIN32)
+        set(BYPRODUCT "lib/libcurl.lib")
+    else()
+        set(BYPRODUCT "lib${LIBSUFFIX}/libcurl.a")
+    endif()
+
+    # Set build options
+    set(CURL_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/curl-install"
+            -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+            -DBUILD_CURL_EXE=OFF
+            -DBUILD_TESTING=OFF
+            -DBUILD_SHARED_LIBS=OFF
+            -DHTTP_ONLY=ON
+            -DCURL_DISABLE_CRYPTO_AUTH=ON
+            -DCURL_CA_PATH=none
+            -DCMAKE_USE_LIBSSH2=OFF
+            -DCMAKE_DEBUG_POSTFIX=
+            -DHAVE_GLIBC_STRERROR_R=1
+            -DHAVE_GLIBC_STRERROR_R__TRYRUN_OUTPUT=""
+            -DHAVE_POSIX_STRERROR_R=0
+            -DHAVE_POSIX_STRERROR_R__TRYRUN_OUTPUT=""
+            -DHAVE_POLL_FINE_EXITCODE=0
+            -DHAVE_FSETXATTR_5=0
+            -DHAVE_FSETXATTR_5__TRYRUN_OUTPUT=""
+            )
+    if (OPENSSL_OFF)
+        list(APPEND CURL_CMAKE_ARGS -DCMAKE_USE_OPENSSL=OFF)
+    else()
+        list(APPEND CURL_CMAKE_ARGS -DCMAKE_USE_OPENSSL=ON)
+    endif()
+
+    append_third_party_passthrough_args(CURL_CMAKE_ARGS "${CURL_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            curl-external
+            URL "https://curl.haxx.se/download/curl-7.64.0.tar.gz"
+            URL_HASH "SHA256=cb90d2eb74d4e358c1ed1489f8e3af96b50ea4374ad71f143fa4595e998d81b5"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/curl-src"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${CURL_CMAKE_ARGS}
+            ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/curl-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    add_dependencies(curl-external ZLIB::ZLIB)
+    if (NOT OPENSSL_OFF)
+        add_dependencies(curl-external OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+
+    # Set variables
+    set(CURL_FOUND "YES" CACHE STRING "" FORCE)
+    set(CURL_INCLUDE_DIR "${BINARY_DIR}/thirdparty/curl-install/include" CACHE STRING "" FORCE)
+    set(CURL_INCLUDE_DIRS "${CURL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(CURL_LIBRARY "${BINARY_DIR}/thirdparty/curl-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(CURL_LIBRARIES "${CURL_LIBRARY}" CACHE STRING "" FORCE)
+
+    # Set exported variables for FindPackage.cmake
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_CURL_INCLUDE_DIR=${CURL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_CURL_LIBRARY=${CURL_LIBRARY}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${CURL_INCLUDE_DIRS})
+
+    add_library(CURL::libcurl STATIC IMPORTED)
+    set_target_properties(CURL::libcurl PROPERTIES IMPORTED_LOCATION "${CURL_LIBRARY}")
+    add_dependencies(CURL::libcurl curl-external)
+    set_property(TARGET CURL::libcurl APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS})
+    set_property(TARGET CURL::libcurl APPEND PROPERTY INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
+    if (NOT OPENSSL_OFF)
+        set_property(TARGET CURL::libcurl APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+endfunction(use_bundled_curl SOURCE_DIR BINARY_DIR)
diff --git a/cmake/BundledLibreSSL.cmake b/cmake/BundledLibreSSL.cmake
new file mode 100644
index 0000000..6c52684
--- /dev/null
+++ b/cmake/BundledLibreSSL.cmake
@@ -0,0 +1,100 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_libre_ssl SOURCE_DIR BINARY_DIR)
+    message("Using bundled LibreSSL")
+
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT_PREFIX "" CACHE STRING "" FORCE)
+        set(BYPRODUCT_SUFFIX ".lib" CACHE STRING "" FORCE)
+    else()
+        set(BYPRODUCT_PREFIX "lib" CACHE STRING "" FORCE)
+        set(BYPRODUCT_SUFFIX ".a" CACHE STRING "" FORCE)
+    endif()
+
+    set(BYPRODUCTS
+            "lib/${BYPRODUCT_PREFIX}tls${BYPRODUCT_SUFFIX}"
+            "lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}"
+            "lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}"
+            )
+
+    set(LIBRESSL_BIN_DIR "${BINARY_DIR}/thirdparty/libressl-install" CACHE STRING "" FORCE)
+
+    FOREACH(BYPRODUCT ${BYPRODUCTS})
+        LIST(APPEND LIBRESSL_LIBRARIES_LIST "${LIBRESSL_BIN_DIR}/${BYPRODUCT}")
+    ENDFOREACH(BYPRODUCT)
+
+    # Set build options
+    set(LIBRESSL_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${LIBRESSL_BIN_DIR}"
+            -DLIBRESSL_APPS=OFF
+            -DLIBRESSL_TESTS=OFF
+            )
+
+    # Build project
+    ExternalProject_Add(
+        libressl-portable
+        URL https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://gentoo.osuosl.org/distfiles/libressl-2.8.3.tar.gz
+        URL_HASH "SHA256=9b640b13047182761a99ce3e4f000be9687566e0828b4a72709e9e6a3ef98477"
+        SOURCE_DIR "${BINARY_DIR}/thirdparty/libressl-src"
+        CMAKE_ARGS ${LIBRESSL_CMAKE_ARGS}
+        BUILD_BYPRODUCTS ${LIBRESSL_LIBRARIES_LIST}
+        EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(OPENSSL_FOUND "YES" CACHE STRING "" FORCE)
+    set(OPENSSL_INCLUDE_DIR "${LIBRESSL_BIN_DIR}/include" CACHE STRING "" FORCE)
+    set(OPENSSL_LIBRARIES ${LIBRESSL_LIBRARIES_LIST} CACHE STRING "" FORCE)
+
+    # Set exported variables for FindPackage.cmake
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    string(REPLACE ";" "%" OPENSSL_LIBRARIES_EXPORT "${OPENSSL_LIBRARIES}")
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_OPENSSL_LIBRARIES=${OPENSSL_LIBRARIES_EXPORT}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_OPENSSL_CRYPTO_LIBRARY=${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_OPENSSL_SSL_LIBRARY=${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${OPENSSL_INCLUDE_DIR})
+
+    add_library(OpenSSL::Crypto STATIC IMPORTED)
+    set_target_properties(OpenSSL::Crypto PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+    set_target_properties(OpenSSL::Crypto PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+            IMPORTED_LOCATION "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}")
+    add_dependencies(OpenSSL::Crypto libressl-portable)
+
+    add_library(OpenSSL::SSL STATIC IMPORTED)
+    set_target_properties(OpenSSL::SSL PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+    set_target_properties(OpenSSL::SSL PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+            IMPORTED_LOCATION "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}")
+    add_dependencies(OpenSSL::SSL libressl-portable)
+    set_property(TARGET OpenSSL::SSL APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
+
+    add_library(LibreSSL::TLS STATIC IMPORTED)
+    set_target_properties(LibreSSL::TLS PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+    set_target_properties(LibreSSL::TLS PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+            IMPORTED_LOCATION "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}tls${BYPRODUCT_SUFFIX}")
+    add_dependencies(LibreSSL::TLS libressl-portable)
+    set_property(TARGET LibreSSL::TLS APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
+endfunction(use_libre_ssl) 
diff --git a/cmake/BundledMbedTLS.cmake b/cmake/BundledMbedTLS.cmake
index 9407aed..aa1b239 100644
--- a/cmake/BundledMbedTLS.cmake
+++ b/cmake/BundledMbedTLS.cmake
@@ -66,12 +66,12 @@
     set(MBEDCRYPTO_LIBRARY "${MBEDTLS_BIN_DIR}/lib/${BYPRODUCT_PREFIX}mbedcrypto${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
 
     # Set exported variables for FindPackage.cmake
-    set(EXPORTED_MBEDTLS_INCLUDE_DIRS "${MBEDTLS_INCLUDE_DIRS}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_MBEDTLS_INCLUDE_DIRS=${MBEDTLS_INCLUDE_DIRS}" CACHE STRING "" FORCE)
     string(REPLACE ";" "%" MBEDTLS_LIBRARIES_EXPORT "${MBEDTLS_LIBRARIES}")
-    set(EXPORTED_MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARIES_EXPORT}" CACHE STRING "" FORCE)
-    set(EXPORTED_MBEDTLS_LIBRARY "${MBEDTLS_LIBRARY}" CACHE STRING "" FORCE)
-    set(EXPORTED_MBEDX509_LIBRARY "${MBEDX509_LIBRARY}" CACHE STRING "" FORCE)
-    set(EXPORTED_MBEDCRYPTO_LIBRARY "${MBEDCRYPTO_LIBRARY}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_MBEDTLS_LIBRARIES=${MBEDTLS_LIBRARIES_EXPORT}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_MBEDTLS_LIBRARY=${MBEDTLS_LIBRARY}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_MBEDX509_LIBRARY=${MBEDX509_LIBRARY}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_MBEDCRYPTO_LIBRARY=${MBEDCRYPTO_LIBRARY}" CACHE STRING "" FORCE)
 
     # Create imported targets
     file(MAKE_DIRECTORY ${MBEDTLS_INCLUDE_DIRS})
diff --git a/cmake/BundledOSSPUUID.cmake b/cmake/BundledOSSPUUID.cmake
index 723633d..61c02dc 100644
--- a/cmake/BundledOSSPUUID.cmake
+++ b/cmake/BundledOSSPUUID.cmake
@@ -21,7 +21,6 @@
     message("Using bundled ossp-uuid")
 
     # Define patch step
-    find_package(Patch REQUIRED)
     set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/ossp-uuid/ossp-uuid-mac-fix.patch")
 
     # Define byproducts
diff --git a/cmake/BundledOpen62541.cmake b/cmake/BundledOpen62541.cmake
index b4fb2de..663d831 100644
--- a/cmake/BundledOpen62541.cmake
+++ b/cmake/BundledOpen62541.cmake
@@ -16,9 +16,6 @@
 # under the License.
 
 function(use_bundled_open62541 SOURCE_DIR BINARY_DIR)
-    # Find patch executable
-    find_package(Patch REQUIRED)
-
     # Define patch step
     set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/open62541/open62541.patch")
 
@@ -41,13 +38,9 @@
     set(OPEN62541_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
             "-DCMAKE_INSTALL_PREFIX=${OPEN62541_BYPRODUCT_DIR}"
             -DOPEN62541_VERSION=v1.0
-            -DUA_ENABLE_ENCRYPTION=ON
-            "-DCMAKE_MODULE_PATH=${CMAKE_SOURCE_DIR}/cmake/mbedtls/dummy"
-            "-DEXPORTED_MBEDTLS_INCLUDE_DIRS=${EXPORTED_MBEDTLS_INCLUDE_DIRS}"
-            "-DEXPORTED_MBEDTLS_LIBRARIES=${EXPORTED_MBEDTLS_LIBRARIES}"
-            "-DEXPORTED_MBEDTLS_LIBRARY=${EXPORTED_MBEDTLS_LIBRARY}"
-            "-DEXPORTED_MBEDX509_LIBRARY=${EXPORTED_MBEDX509_LIBRARY}"
-            "-DEXPORTED_MBEDCRYPTO_LIBRARY=${EXPORTED_MBEDCRYPTO_LIBRARY}")
+            -DUA_ENABLE_ENCRYPTION=ON)
+
+    append_third_party_passthrough_args(OPEN62541_CMAKE_ARGS "${OPEN62541_CMAKE_ARGS}")
 
     # Build project
     ExternalProject_Add(
diff --git a/cmake/BundledPahoMqttC.cmake b/cmake/BundledPahoMqttC.cmake
new file mode 100644
index 0000000..fd707e8
--- /dev/null
+++ b/cmake/BundledPahoMqttC.cmake
@@ -0,0 +1,81 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_pahomqttc SOURCE_DIR BINARY_DIR)
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/paho.mqtt.c/paho.mqtt.c.patch")
+
+    # Define byproducts
+    get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
+    if ("${LIB64}" STREQUAL "TRUE" AND (NOT WIN32 AND NOT APPLE))
+        set(LIBSUFFIX 64)
+    endif()
+
+    if (WIN32)
+        set(BYPRODUCT "lib/libpaho-mqtt3cs-static.lib")
+    else()
+        set(BYPRODUCT "lib${LIBSUFFIX}/libpaho-mqtt3cs-static.a")
+    endif()
+
+    # Set build options
+    set(PAHOMQTTC_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/paho.mqtt.c-install"
+            -DCMAKE_POSITION_INDEPENDENT_CODE=ON
+            -DPAHO_BUILD_STATIC=TRUE
+            -DPAHO_ENABLE_TESTING=FALSE)
+    if (OPENSSL_OFF)
+        list(APPEND PAHOMQTTC_CMAKE_ARGS -DPAHO_WITH_SSL=FALSE)
+    else()
+        list(APPEND PAHOMQTTC_CMAKE_ARGS -DPAHO_WITH_SSL=TRUE)
+    endif()
+
+    append_third_party_passthrough_args(PAHOMQTTC_CMAKE_ARGS "${PAHOMQTTC_CMAKE_ARGS}")
+
+    # Build project
+    ExternalProject_Add(
+            paho.mqtt.c-external
+            GIT_REPOSITORY "https://github.com/eclipse/paho.mqtt.c.git"
+            GIT_TAG "6aa07f575bc9369402b1b252fd280373f8d585ef" # This is not a tagged/released version, but the exact one that was in our repo.
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/paho.mqtt.c-src"
+            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
+            CMAKE_ARGS ${PAHOMQTTC_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/paho.mqtt.c-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set dependencies
+    if (NOT OPENSSL_OFF)
+        add_dependencies(paho.mqtt.c-external OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+
+    # Set variables
+    set(PAHOMQTTC_FOUND "YES" CACHE STRING "" FORCE)
+    set(PAHOMQTTC_INCLUDE_DIR "${BINARY_DIR}/thirdparty/paho.mqtt.c-install/include" CACHE STRING "" FORCE)
+    set(PAHOMQTTC_LIBRARY "${BINARY_DIR}/thirdparty/paho.mqtt.c-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(PAHOMQTTC_LIBRARIES ${PAHOMQTTC_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(paho.mqtt.c STATIC IMPORTED)
+    set_target_properties(paho.mqtt.c PROPERTIES IMPORTED_LOCATION "${PAHOMQTTC_LIBRARY}")
+    add_dependencies(paho.mqtt.c paho.mqtt.c-external)
+    file(MAKE_DIRECTORY ${PAHOMQTTC_INCLUDE_DIR})
+    set_property(TARGET paho.mqtt.c APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PAHOMQTTC_INCLUDE_DIR})
+    if (NOT OPENSSL_OFF)
+        set_property(TARGET paho.mqtt.c APPEND PROPERTY INTERFACE_LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
+    endif()
+endfunction(use_bundled_pahomqttc)
diff --git a/cmake/BundledPugiXml.cmake b/cmake/BundledPugiXml.cmake
new file mode 100644
index 0000000..ef97bf0
--- /dev/null
+++ b/cmake/BundledPugiXml.cmake
@@ -0,0 +1,57 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_pugixml SOURCE_DIR BINARY_DIR)
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "lib/pugixml.lib")
+    else()
+        set(BYPRODUCT "lib/libpugixml.a")
+    endif()
+
+    # Set build options
+    set(PUGI_BYPRODUCT_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/pugixml-install")
+
+    set(PUGI_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${PUGI_BYPRODUCT_DIR}"
+            "-DBUILD_TESTS=OFF"
+            "-DBUILD_SHARED_AND_STATIC_LIBS=OFF"
+            "-DBUILD_SHARED_LIBS=OFF")
+
+    # Build project
+    ExternalProject_Add(
+            pugixml-external
+            URL "https://github.com/zeux/pugixml/releases/download/v1.9/pugixml-1.9.tar.gz"
+            URL_HASH "SHA256=d156d35b83f680e40fd6412c4455fdd03544339779134617b9b28d19e11fdba6"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/pugixml-src"
+            CMAKE_ARGS ${PUGI_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${PUGI_BYPRODUCT_DIR}/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(PUGIXML_FOUND "YES" CACHE STRING "" FORCE)
+    set(PUGIXML_INCLUDE_DIR "${PUGI_BYPRODUCT_DIR}/include" CACHE STRING "" FORCE)
+    set(PUGIXML_LIBRARY "${PUGI_BYPRODUCT_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(PUGI::libpugixml STATIC IMPORTED)
+    set_target_properties(PUGI::libpugixml PROPERTIES IMPORTED_LOCATION "${PUGIXML_LIBRARY}")
+    add_dependencies(PUGI::libpugixml pugixml-external)
+    file(MAKE_DIRECTORY ${PUGIXML_INCLUDE_DIR})
+    set_property(TARGET PUGI::libpugixml APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PUGIXML_INCLUDE_DIR})
+endfunction(use_bundled_pugixml)
diff --git a/cmake/BundledRocksDB.cmake b/cmake/BundledRocksDB.cmake
new file mode 100644
index 0000000..509ff09
--- /dev/null
+++ b/cmake/BundledRocksDB.cmake
@@ -0,0 +1,77 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_rocksdb SOURCE_DIR BINARY_DIR)
+    message("Using bundled RocksDB")
+
+    # Define patch step
+    set(PC "${Patch_EXECUTABLE}" -p1 -i "${SOURCE_DIR}/thirdparty/rocksdb/rocksdb-BUILD.patch")
+
+    # Define byproducts
+    get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
+    if ("${LIB64}" STREQUAL "TRUE" AND (NOT WIN32 AND NOT APPLE))
+        set(LIBSUFFIX 64)
+    endif()
+
+    if (WIN32)
+        set(BYPRODUCT "lib/rocksdb.lib")
+    else()
+        set(BYPRODUCT "lib${LIBSUFFIX}/librocksdb.a")
+    endif()
+
+    # Set build options
+    set(ROCKSDB_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/rocksdb-install"
+            -DWITH_TESTS=OFF
+            -DWITH_TOOLS=OFF
+            -DFAIL_ON_WARNINGS=OFF)
+    if(PORTABLE)
+        list(APPEND ROCKSDB_CMAKE_ARGS -DPORTABLE=ON)
+    endif()
+	if(WIN32)
+		list(APPEND ROCKSDB_CMAKE_ARGS -DROCKSDB_INSTALL_ON_WINDOWS=ON)
+	endif()
+
+    # Build project
+    ExternalProject_Add(
+            rocksdb-external
+            URL "https://github.com/facebook/rocksdb/archive/rocksdb-5.8.6.tar.gz"
+            URL_HASH "SHA256=eb7d79572fff8ba60ccf1caa3b504dd1f4ac7fc864773ff056e1c3c30902508b"
+            SOURCE_DIR "${BINARY_DIR}/thirdparty/rocksdb-src"
+            CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS}
+            PATCH_COMMAND ${PC}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/rocksdb-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(ROCKSDB_FOUND "YES" CACHE STRING "" FORCE)
+    set(ROCKSDB_INCLUDE_DIR "${BINARY_DIR}/thirdparty/rocksdb-install/include" CACHE STRING "" FORCE)
+    set(ROCKSDB_LIBRARY "${BINARY_DIR}/thirdparty/rocksdb-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(ROCKSDB_LIBRARIES ${ROCKSDB_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(RocksDB::RocksDB STATIC IMPORTED)
+    set_target_properties(RocksDB::RocksDB PROPERTIES IMPORTED_LOCATION "${ROCKSDB_LIBRARY}")
+    add_dependencies(RocksDB::RocksDB rocksdb-external)
+    file(MAKE_DIRECTORY ${ROCKSDB_INCLUDE_DIR})
+    set_property(TARGET RocksDB::RocksDB APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${ROCKSDB_INCLUDE_DIR})
+    set_property(TARGET RocksDB::RocksDB APPEND PROPERTY INTERFACE_LINK_LIBRARIES Threads::Threads)
+    if(WIN32)
+        set_property(TARGET RocksDB::RocksDB APPEND PROPERTY INTERFACE_LINK_LIBRARIES Rpcrt4.lib)
+    endif()
+endfunction(use_bundled_rocksdb)
diff --git a/cmake/BundledSQLite.cmake b/cmake/BundledSQLite.cmake
new file mode 100644
index 0000000..0a9e1f8
--- /dev/null
+++ b/cmake/BundledSQLite.cmake
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_sqlite SOURCE_DIR BINARY_DIR)
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "libsqlite.lib")
+    else()
+        set(BYPRODUCT "libsqlite.a")
+    endif()
+
+    # Build project
+    ExternalProject_Add(
+            sqlite-external
+            SOURCE_DIR "${SOURCE_DIR}/thirdparty/sqlite"
+            BINARY_DIR "${BINARY_DIR}/thirdparty/sqlite"
+            CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            INSTALL_COMMAND ""
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/sqlite/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(SQLite3_FOUND "YES" CACHE STRING "" FORCE)
+    set(SQLite3_INCLUDE_DIRS "${SOURCE_DIR}/thirdparty/sqlite" CACHE STRING "" FORCE)
+    set(SQLite3_LIBRARY "${BINARY_DIR}/thirdparty/sqlite/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(SQLite3_LIBRARIES ${SQLite3_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(SQLite::SQLite3 STATIC IMPORTED)
+    set_target_properties(SQLite::SQLite3 PROPERTIES IMPORTED_LOCATION "${SQLite3_LIBRARY}")
+    add_dependencies(SQLite::SQLite3 sqlite-external)
+    set_property(TARGET SQLite::SQLite3 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SQLite3_INCLUDE_DIRS})
+endfunction(use_bundled_sqlite)
diff --git a/cmake/BundledYamlCpp.cmake b/cmake/BundledYamlCpp.cmake
new file mode 100644
index 0000000..0c9a3f4
--- /dev/null
+++ b/cmake/BundledYamlCpp.cmake
@@ -0,0 +1,51 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_yamlcpp SOURCE_DIR BINARY_DIR)
+    # Define byproducts
+    if (WIN32)
+        set(BYPRODUCT "lib/libyaml-cppmd.lib")
+    else()
+        set(BYPRODUCT "lib/libyaml-cpp.a")
+    endif()
+
+    # Set build options
+    set(YAMLCPP_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/yaml-cpp-install"
+            -DCMAKE_POSITION_INDEPENDENT_CODE=ON)
+
+    # Build project
+    ExternalProject_Add(
+            yaml-cpp-external
+            SOURCE_DIR "${SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-20171024"
+            CMAKE_ARGS ${YAMLCPP_CMAKE_ARGS}
+            BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/yaml-cpp-install/${BYPRODUCT}"
+            EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(YAMLCPP_FOUND "YES" CACHE STRING "" FORCE)
+    set(YAMLCPP_INCLUDE_DIR "${SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-20171024/include" CACHE STRING "" FORCE)
+    set(YAMLCPP_LIBRARY "${BINARY_DIR}/thirdparty/yaml-cpp-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(YAMLCPP_LIBRARIES ${YAMLCPP_LIBRARY} CACHE STRING "" FORCE)
+
+    # Create imported targets
+    add_library(yaml-cpp STATIC IMPORTED)
+    set_target_properties(yaml-cpp PROPERTIES IMPORTED_LOCATION "${YAMLCPP_LIBRARY}")
+    add_dependencies(yaml-cpp yaml-cpp-external)
+    set_property(TARGET yaml-cpp APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${YAMLCPP_INCLUDE_DIR})
+endfunction(use_bundled_yamlcpp)
diff --git a/cmake/BundledZLIB.cmake b/cmake/BundledZLIB.cmake
new file mode 100644
index 0000000..8d2d354
--- /dev/null
+++ b/cmake/BundledZLIB.cmake
@@ -0,0 +1,74 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(use_bundled_zlib SOURCE_DIR BINARY_DIR)
+    message("Using bundled zlib")
+
+    # Define byproducts
+    if (WIN32)
+        string(TOLOWER "${CMAKE_BUILD_TYPE}" build_type)
+        if (build_type MATCHES relwithdebinfo OR build_type MATCHES release)
+            set(BYPRODUCT "lib/zlibstatic.lib")
+        else()
+            set(BYPRODUCT "lib/zlibstaticd.lib")
+        endif()
+    else()
+        set(BYPRODUCT "lib/libz.a")
+    endif()
+
+    # Set build options
+    set(ZLIB_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
+            "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/zlib-install"
+            )
+
+    # Build project
+    ExternalProject_Add(
+        zlib-external
+        URL "https://github.com/madler/zlib/archive/v1.2.11.tar.gz"
+        URL_HASH "SHA256=629380c90a77b964d896ed37163f5c3a34f6e6d897311f1df2a7016355c45eff"
+        SOURCE_DIR "${BINARY_DIR}/thirdparty/zlib-src"
+        CMAKE_ARGS ${ZLIB_CMAKE_ARGS}
+        BUILD_BYPRODUCTS "${BINARY_DIR}/thirdparty/zlib-install/${BYPRODUCT}"
+        EXCLUDE_FROM_ALL TRUE
+    )
+
+    # Set variables
+    set(ZLIB_FOUND "YES" CACHE STRING "" FORCE)
+    set(ZLIB_INCLUDE_DIRS "${BINARY_DIR}/thirdparty/zlib-install/include" CACHE STRING "" FORCE)
+    set(ZLIB_LIBRARIES "${BINARY_DIR}/thirdparty/zlib-install/${BYPRODUCT}" CACHE STRING "" FORCE)
+    set(ZLIB_VERSION_STRING "1.2.11" CACHE STRING "" FORCE)
+    set(ZLIB_VERSION_MAJOR 1 CACHE STRING "" FORCE)
+    set(ZLIB_VERSION_MINOR 2 CACHE STRING "" FORCE)
+    set(ZLIB_VERSION_PATCH 11 CACHE STRING "" FORCE)
+
+    # Set exported variables for FindPackage.cmake
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIRS}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_LIBRARIES=${ZLIB_LIBRARIES}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_VERSION_STRING=${ZLIB_VERSION_STRING}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_VERSION_MAJOR=${ZLIB_VERSION_MAJOR}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_VERSION_MINOR=${ZLIB_VERSION_MINOR}" CACHE STRING "" FORCE)
+    set(PASSTHROUGH_VARIABLES ${PASSTHROUGH_VARIABLES} "-DEXPORTED_ZLIB_VERSION_PATCH=${ZLIB_VERSION_PATCH}" CACHE STRING "" FORCE)
+
+    # Create imported targets
+    file(MAKE_DIRECTORY ${ZLIB_INCLUDE_DIRS})
+
+    add_library(ZLIB::ZLIB STATIC IMPORTED)
+    set_target_properties(ZLIB::ZLIB PROPERTIES IMPORTED_LOCATION "${ZLIB_LIBRARIES}")
+    add_dependencies(ZLIB::ZLIB zlib-external)
+    file(MAKE_DIRECTORY ${ZLIB_INCLUDE_DIRS})
+    set_property(TARGET ZLIB::ZLIB APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_INCLUDE_DIRS})
+endfunction(use_bundled_zlib)
diff --git a/cmake/Compression.cmake b/cmake/Compression.cmake
deleted file mode 100644
index 498b974..0000000
--- a/cmake/Compression.cmake
+++ /dev/null
@@ -1,58 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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
-#
-#   http://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.
-
-function(use_bundled_zlib SOURCE_DIR BINARY_DIR)
- message("Using bundled zlib")
-if (WIN32)
- string(TOLOWER "${CMAKE_BUILD_TYPE}" build_type)
- if (build_type MATCHES relwithdebinfo OR build_type MATCHES release)
- set(BYPRODUCT "thirdparty/zlib-install/lib/zlibstatic.lib")
- else()
- set(BYPRODUCT "thirdparty/zlib-install/lib/zlibstaticd.lib")
- endif()
- else()
- set(BYPRODUCT "thirdparty/zlib-install/lib/libz.a")
- endif()
-  ExternalProject_Add(
-    zlib-external
-    GIT_REPOSITORY "https://github.com/madler/zlib.git"
-    GIT_TAG "cacf7f1d4e3d44d871b605da3b647f07d718623f"  # Version 1.2.11
-    SOURCE_DIR "${BINARY_DIR}/thirdparty/zlib-src"
-    CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-               "-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/zlib-install"
-    BUILD_BYPRODUCTS ${BYPRODUCT}
-  )
-
-
-  add_library(z STATIC IMPORTED)
-  set_target_properties(z PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/${BYPRODUCT}")
-
-  set(ZLIB_BYPRODUCT "${BINARY_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)
-  set(ZLIB_BYPRODUCT_INCLUDE "${SOURCE_DIR}/thirdparty/zlib/include" CACHE STRING "" FORCE)
-  set(ZLIB_BIN_DIR "${BINARY_DIR}/thirdparty/libressl-install/" CACHE STRING "" FORCE)
-
-  add_dependencies(z zlib-external)
-  set(ZLIB_FOUND "YES" CACHE STRING "" FORCE)
-  set(ZLIB_INCLUDE_DIR "${SOURCE_DIR}/thirdparty/zlib/include" CACHE STRING "" FORCE)
-  set(ZLIB_INCLUDE_DIRS "${SOURCE_DIR}/thirdparty/zlib/include" CACHE STRING "" FORCE)
-
-  set(ZLIB_LIBRARY "${BINARY_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARIES "${ZLIB_LIBRARY}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARY_RELEASE "${BINARY_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARY_DEBUG "${BINARY_DIR}/${BYPRODUCT}" CACHE STRING "" FORCE)  
-  
-endfunction(use_bundled_zlib)
\ No newline at end of file
diff --git a/cmake/Extensions.cmake b/cmake/Extensions.cmake
index 438a783..1c7422b 100644
--- a/cmake/Extensions.cmake
+++ b/cmake/Extensions.cmake
@@ -91,7 +91,7 @@
             PREFIX ${prefix}/${target}
             GIT_REPOSITORY ${repourl}
         	GIT_TAG ${repotag}
-            CMAKE_ARGS ${ARGN}
+            CMAKE_ARGS \"${ARGN}\"
             INSTALL_COMMAND \"\"
             )
          add_custom_target(exec_${target})
@@ -100,11 +100,27 @@
 
 	file(WRITE ${exec_dir}/CMakeLists.txt "${CMAKE_LIST_CONTENT}")
 
+	# Try to determine the number of CPUs and do a parallel build based on that
+	include(ProcessorCount OPTIONAL RESULT_VARIABLE PROCESSCOUNT_RESULT)
+	if(NOT PROCESSCOUNT_RESULT EQUAL NOTFOUND)
+		ProcessorCount(NUM_CPU)
+		math(EXPR PARALLELISM "${NUM_CPU} / 2")
+	endif()
+	if(NOT PARALLELISM OR PARALLELISM LESS 1)
+		set(PARALLELISM 1)
+	endif()
+
+	message("Building ${target} with a parallelism of ${PARALLELISM}")
 	execute_process(COMMAND ${CMAKE_COMMAND} ..
 			WORKING_DIRECTORY ${exec_dir}/build
 			)
-	execute_process(COMMAND ${CMAKE_COMMAND} --build .
-			WORKING_DIRECTORY ${exec_dir}/build
-			)
-
+	if(${CMAKE_VERSION} VERSION_EQUAL "3.12.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.12.0")
+		execute_process(COMMAND ${CMAKE_COMMAND} --build . --parallel ${PARALLELISM}
+				WORKING_DIRECTORY ${exec_dir}/build
+				)
+	else()
+		execute_process(COMMAND ${CMAKE_COMMAND} --build .
+				WORKING_DIRECTORY ${exec_dir}/build
+				)
+	endif()
 endfunction()
diff --git a/cmake/FindRocksDB.cmake b/cmake/FindRocksDB.cmake
deleted file mode 100644
index db9c2d1..0000000
--- a/cmake/FindRocksDB.cmake
+++ /dev/null
@@ -1,51 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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
-# 
-#   http://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.
-
-#  ROCKSDB_FOUND               System has RocksDB library/headers.
-#  ROCKSDB_LIBRARIES           The RocksDB library.
-#  ROCKSDB_INCLUDE_DIR        The location of RocksDB headers.
-
-find_path(ROCKSDB_ROOT_DIR
-    NAMES include/rocksdb/db.h
-)
-
-find_library(ROCKSDB_LIBRARIES
-    NAMES rocksdb
-    HINTS ${ROCKSDB_ROOT_DIR}/lib
-)
-
-find_path(ROCKSDB_INCLUDE_DIR
-    NAMES rocksdb/db.h
-    HINTS ${ROCKSDB_ROOT_DIR}/include
-)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(RocksDB DEFAULT_MSG
-    ROCKSDB_LIBRARIES
-    ROCKSDB_INCLUDE_DIR
-)
-
-mark_as_advanced(
-    ROCKSDB_ROOT_DIR
-    ROCKSDB_LIBRARIES
-    ROCKSDB_INCLUDE_DIR
-)
-
-if(ROCKSDB_INCLUDE_DIR AND ROCKSDB_LIBRARIES)
-  set(ROCKSDB_FOUND "YES")
-  message(STATUS "Found RocksDB...${ROCKSDB_LIBRARIES}")
-endif()
\ No newline at end of file
diff --git a/cmake/LibSSH2.cmake b/cmake/LibSSH2.cmake
deleted file mode 100644
index fc04707..0000000
--- a/cmake/LibSSH2.cmake
+++ /dev/null
@@ -1,94 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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
-#
-#   http://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.
-
-function(use_bundled_libssh2 SOURCE_DIR BINARY_DIR)
-    message("Using bundled libssh2")
-
-    if (WIN32)
-        set(BYPRODUCT "lib/libssh2.lib")
-    else()
-        set(BYPRODUCT "lib/libssh2.a")
-    endif()
-
-    if (WIN32)
-        string(REPLACE "/" "\\" CMAKE_CURRENT_SOURCE_DIR_BACKSLASH ${CMAKE_CURRENT_SOURCE_DIR})
-        set(PC copy /Y ${CMAKE_CURRENT_SOURCE_DIR_BACKSLASH}\\thirdparty\\libssh2\\CMakeLists.txt CMakeLists.txt)
-    else()
-        set(PC patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libssh2/libssh2-CMAKE_MODULE_PATH.patch)
-    endif()
-
-    set(LIBSSH2_CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-            "-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/thirdparty/libssh2-install"
-            -DENABLE_ZLIB_COMPRESSION=ON
-            -DCRYPTO_BACKEND=OpenSSL
-            -DBUILD_TESTING=OFF
-            -DBUILD_EXAMPLES=OFF)
-
-    list(APPEND CMAKE_MODULE_PATH_PASSTHROUGH_LIST ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ssl)
-    list(APPEND LIBSSH2_CMAKE_ARGS "-DLIBRESSL_BIN_DIR=${LIBRESSL_BIN_DIR}"
-            "-DLIBRESSL_SRC_DIR=${LIBRESSL_SRC_DIR}"
-            "-DBYPRODUCT_PREFIX=${BYPRODUCT_PREFIX}"
-            "-DBYPRODUCT_SUFFIX=${BYPRODUCT_SUFFIX}")
-    if(NOT USE_SYSTEM_ZLIB OR USE_SYSTEM_ZLIB STREQUAL "OFF")
-        list(APPEND CMAKE_MODULE_PATH_PASSTHROUGH_LIST ${CMAKE_CURRENT_SOURCE_DIR}/cmake/zlib/dummy)
-        list(APPEND LIBSSH2_CMAKE_ARGS "-DZLIB_BYPRODUCT_INCLUDE=${ZLIB_BYPRODUCT_INCLUDE}"
-                "-DZLIB_BYPRODUCT=${ZLIB_BYPRODUCT}")
-    endif()
-    if(CMAKE_MODULE_PATH_PASSTHROUGH_LIST)
-        string(REPLACE ";" "%" CMAKE_MODULE_PATH_PASSTHROUGH "${CMAKE_MODULE_PATH_PASSTHROUGH_LIST}")
-        list(APPEND LIBSSH2_CMAKE_ARGS "-DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH_PASSTHROUGH}")
-    endif()
-
-    ExternalProject_Add(
-            libssh2-external
-            URL "https://www.libssh2.org/download/libssh2-1.8.2.tar.gz"
-            URL_HASH "SHA256=088307d9f6b6c4b8c13f34602e8ff65d21c2dc4d55284dfe15d502c4ee190d67"
-            SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/libssh2-src"
-            LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
-            CMAKE_ARGS ${LIBSSH2_CMAKE_ARGS}
-            PATCH_COMMAND ${PC}
-            BUILD_BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/libssh2-install/${BYPRODUCT}"
-    )
-
-    add_dependencies(libssh2-external libressl-portable)
-    if(NOT USE_SYSTEM_ZLIB OR USE_SYSTEM_ZLIB STREQUAL "OFF")
-        add_dependencies(libssh2-external z)
-    endif()
-
-    set(LIBSSH2_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libssh2/" CACHE STRING "" FORCE)
-    set(LIBSSH2_BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/libssh2-install/" CACHE STRING "" FORCE)
-    set(LIBSSH2_BYPRODUCT_DIR "${BYPRODUCT}" CACHE STRING "" FORCE)
-
-    add_library(libssh2 STATIC IMPORTED)
-    set_target_properties(libssh2 PROPERTIES IMPORTED_LOCATION "${LIBSSH2_BIN_DIR}${BYPRODUCT}")
-
-    if (OPENSSL_FOUND)
-        if (NOT WIN32)
-            set_target_properties(libssh2 PROPERTIES INTERFACE_LINK_LIBRARIES "${OPENSSL_LIBRARIES}")
-        endif()
-    endif(OPENSSL_FOUND)
-    if (ZLIB_FOUND)
-        if (NOT WIN32)
-            set_target_properties(libssh2 PROPERTIES INTERFACE_LINK_LIBRARIES "${ZLIB_LIBRARIES}")
-        endif()
-    endif(ZLIB_FOUND)
-    add_dependencies(libssh2 libssh2-external)
-    set(LIBSSH2_FOUND "YES" CACHE STRING "" FORCE)
-    set(LIBSSH2_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libssh2/include" CACHE STRING "" FORCE)
-    set(LIBSSH2_LIBRARY "${LIBSSH2_BIN_DIR}${BYPRODUCT}" CACHE STRING "" FORCE)
-    set(LIBSSH2_LIBRARIES ${LIBSSH2_LIBRARY} CACHE STRING "" FORCE)
-endfunction(use_libre_ssl)
\ No newline at end of file
diff --git a/cmake/LibreSSL.cmake b/cmake/LibreSSL.cmake
deleted file mode 100644
index b208e5f..0000000
--- a/cmake/LibreSSL.cmake
+++ /dev/null
@@ -1,63 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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
-#
-#   http://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.
-
-function(use_libre_ssl SOURCE_DIR BINARY_DIR)
-	message("Using bundled LibreSSL from release")
-	
-	set(BYPRODUCT_PREFIX "lib" CACHE STRING "" FORCE)
-	set(BYPRODUCT_SUFFIX ".a" CACHE STRING "" FORCE)
-	
-	set(BUILD_ARGS "")
-	if (WIN32)
-		set(BYPRODUCT_SUFFIX ".lib" CACHE STRING "" FORCE)
-		set(BYPRODUCT_PREFIX "" CACHE STRING "" FORCE)
-	set(BUILD_ARGS " -GVisual Studio 15 2017")
-	endif(WIN32)
-	ExternalProject_Add(
-	libressl-portable
-	URL https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz https://gentoo.osuosl.org/distfiles/libressl-2.8.3.tar.gz
-	URL_HASH "SHA256=9b640b13047182761a99ce3e4f000be9687566e0828b4a72709e9e6a3ef98477"
-	SOURCE_DIR "${BINARY_DIR}/thirdparty/libressl-src"
-	CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-				"-DCMAKE_INSTALL_PREFIX=${BINARY_DIR}/thirdparty/libressl-install"
-				"-DLIBRESSL_APPS=OFF"
-				"-DLIBRESSL_TESTS=OFF"
-				"${BUILD_ARGS}"
-	)
-
-	add_library(crypto STATIC IMPORTED)
-	set_target_properties(crypto PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}")
-	add_dependencies(crypto libressl-portable)
-					
-	add_library(ssl STATIC IMPORTED)
-	set_target_properties(ssl PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}")
-	set_target_properties(ssl PROPERTIES INTERFACE_LINK_LIBRARIES crypto)
-	add_dependencies(ssl libressl-portable)
-	
-	add_library(tls STATIC IMPORTED)
-	set_target_properties(tls PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}tls${BYPRODUCT_SUFFIX}")
-	set_target_properties(tls PROPERTIES INTERFACE_LINK_LIBRARIES crypto)
-	add_dependencies(tls libressl-portable)
-	
-	set(LIBRESSL_SRC_DIR "${SOURCE_DIR}/thirdparty/libressl/" CACHE STRING "" FORCE)
-	set(LIBRESSL_BIN_DIR "${BINARY_DIR}/thirdparty/libressl-install/" CACHE STRING "" FORCE)
-
-	set(OPENSSL_FOUND "YES" CACHE STRING "" FORCE)
-	set(OPENSSL_INCLUDE_DIR "${SOURCE_DIR}/thirdparty/libressl/include" CACHE STRING "" FORCE)
-	set(OPENSSL_LIBRARIES "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}tls${BYPRODUCT_SUFFIX}" "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}" "${BINARY_DIR}/thirdparty/libressl-install/lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
-	
-endfunction(use_libre_ssl) 
diff --git a/cmake/WholeArchive.cmake b/cmake/WholeArchive.cmake
new file mode 100644
index 0000000..60db5f6
--- /dev/null
+++ b/cmake/WholeArchive.cmake
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+function(target_wholearchive_library TARGET ITEM)
+    if (APPLE)
+        target_link_libraries(${TARGET} ${ITEM})
+        target_link_libraries(${TARGET} -Wl,-force_load,$<TARGET_FILE:${ITEM}>)
+        add_dependencies(${TARGET} ${ITEM})
+    elseif(WIN32)
+        target_link_libraries(${TARGET} ${ITEM})
+        set_property(TARGET ${TARGET} APPEND PROPERTY LINK_OPTIONS "/WHOLEARCHIVE:${ITEM}")
+        add_dependencies(${TARGET} ${ITEM})
+    else()
+        target_link_libraries(${TARGET} -Wl,--whole-archive ${ITEM} -Wl,--no-whole-archive)
+        add_dependencies(${TARGET} ${ITEM})
+    endif()
+endfunction(target_wholearchive_library)
diff --git a/cmake/civetweb/dummy/FindCivetWeb.cmake b/cmake/civetweb/dummy/FindCivetWeb.cmake
new file mode 100644
index 0000000..420db11
--- /dev/null
+++ b/cmake/civetweb/dummy/FindCivetWeb.cmake
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+#
+#   http://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.
+
+if (NOT CIVETWEB_FOUND)
+    set(CIVETWEB_FOUND "YES" CACHE STRING "" FORCE)
+    set(CIVETWEB_INCLUDE_DIR "${EXPORT_CIVETWEB_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(CIVETWEB_LIBRARIES "${EXPORT_CIVETWEB_LIBRARIES}" CACHE STRING "" FORCE)
+endif()
\ No newline at end of file
diff --git a/cmake/curl/dummy/FindCURL.cmake b/cmake/curl/dummy/FindCURL.cmake
index d179cb2..72802bb 100644
--- a/cmake/curl/dummy/FindCURL.cmake
+++ b/cmake/curl/dummy/FindCURL.cmake
@@ -14,7 +14,11 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-set(CURL_FOUND "YES" CACHE STRING "" FORCE)
-set(CURL_INCLUDE_DIR "${CURL_SRC_DIR}/include" CACHE STRING "" FORCE)
-set(CURL_LIBRARY "${CURL_BIN_DIR}${CURL_BYPRODUCT_DIR}" CACHE STRING "" FORCE)
-set(CURL_LIBRARIES "${CURL_BIN_DIR}${CURL_BYPRODUCT_DIR}" CACHE STRING "" FORCE)
+
+if(NOT CURL_FOUND)
+    set(CURL_FOUND "YES" CACHE STRING "" FORCE)
+    set(CURL_INCLUDE_DIR "${EXPORTED_CURL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(CURL_INCLUDE_DIRS "${CURL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(CURL_LIBRARY "${EXPORTED_CURL_LIBRARY}" CACHE STRING "" FORCE)
+    set(CURL_LIBRARIES "${CURL_LIBRARY}" CACHE STRING "" FORCE)
+endif()
diff --git a/cmake/libssh2/dummy/FindLibSSH2.cmake b/cmake/libssh2/dummy/FindLibSSH2.cmake
index 64a7f23..9366abe 100644
--- a/cmake/libssh2/dummy/FindLibSSH2.cmake
+++ b/cmake/libssh2/dummy/FindLibSSH2.cmake
@@ -15,9 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-set(LIBSSH2_FOUND "YES" CACHE STRING "" FORCE)
-set(LIBSSH2_INCLUDE_DIR "${LIBSSH2_SRC_DIR}/include" CACHE STRING "" FORCE)
-set(LIBSSH2_LIBRARY "${LIBSSH2_BIN_DIR}${LIBSSH2_BYPRODUCT_DIR}" CACHE STRING "" FORCE)
-set(LIBSSH2_LIBRARIES "${LIBSSH2_BIN_DIR}${LIBSSH2_BYPRODUCT_DIR}" CACHE STRING "" FORCE)
-
-message("LibSSH2 LIB is located at is ${LIBSSH2_LIBRARIES}")
\ No newline at end of file
+if(NOT LIBSSH2_FOUND)
+    set(LIBSSH2_FOUND "YES" CACHE STRING "" FORCE)
+    set(LIBSSH2_INCLUDE_DIR "${EXPORTED_LIBSSH2_INCLUDE_DIR}" CACHE STRING "" FORCE)
+    set(LIBSSH2_LIBRARY "${EXPORTED_LIBSSH2_LIBRARY}" CACHE STRING "" FORCE)
+endif()
diff --git a/cmake/rocksdb/sys/FindRocksDB.cmake b/cmake/rocksdb/sys/FindRocksDB.cmake
new file mode 100644
index 0000000..657918a
--- /dev/null
+++ b/cmake/rocksdb/sys/FindRocksDB.cmake
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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
+# 
+#   http://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.
+
+#  ROCKSDB_FOUND               System has RocksDB library/headers.
+#  ROCKSDB_LIBRARIES           The RocksDB library.
+#  ROCKSDB_INCLUDE_DIR        The location of RocksDB headers.
+
+find_path(ROCKSDB_ROOT_DIR
+    NAMES include/rocksdb/db.h
+)
+
+find_library(ROCKSDB_LIBRARIES
+    NAMES rocksdb
+    HINTS ${ROCKSDB_ROOT_DIR}/lib
+)
+
+find_path(ROCKSDB_INCLUDE_DIR
+    NAMES rocksdb/db.h
+    HINTS ${ROCKSDB_ROOT_DIR}/include
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(RocksDB DEFAULT_MSG
+    ROCKSDB_LIBRARIES
+    ROCKSDB_INCLUDE_DIR
+)
+
+mark_as_advanced(
+    ROCKSDB_ROOT_DIR
+    ROCKSDB_LIBRARIES
+    ROCKSDB_INCLUDE_DIR
+)
+
+if(ROCKSDB_INCLUDE_DIR AND ROCKSDB_LIBRARIES)
+  set(ROCKSDB_FOUND "YES")
+  message(STATUS "Found RocksDB...${ROCKSDB_LIBRARIES}")
+endif()
+
+if(NOT TARGET RocksDB::RocksDB)
+  add_library(RocksDB::RocksDB UNKNOWN IMPORTED)
+  set_target_properties(RocksDB::RocksDB PROPERTIES
+          INTERFACE_INCLUDE_DIRECTORIES "${ROCKSDB_INCLUDE_DIR}")
+  set_target_properties(RocksDB::RocksDB PROPERTIES
+          IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
+          IMPORTED_LOCATION "${ROCKSDB_LIBRARIES}")
+endif()
\ No newline at end of file
diff --git a/cmake/ssl/FindOpenSSL.cmake b/cmake/ssl/FindOpenSSL.cmake
index 0ecdf2e..087b1ce 100644
--- a/cmake/ssl/FindOpenSSL.cmake
+++ b/cmake/ssl/FindOpenSSL.cmake
@@ -17,31 +17,29 @@
 
 # Dummy OpenSSL find for when we use bundled version
 
-set(OPENSSL_FOUND "YES" CACHE STRING "" FORCE)
-set(OPENSSL_INCLUDE_DIR "${LIBRESSL_SRC_DIR}/include" CACHE STRING "" FORCE)
-set(OPENSSL_CRYPTO_LIBRARY "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}crypto${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
-set(OPENSSL_SSL_LIBRARY "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}ssl${BYPRODUCT_SUFFIX}" CACHE STRING "" FORCE)
-set(OPENSSL_LIBRARIES "${LIBRESSL_BIN_DIR}/lib/${BYPRODUCT_PREFIX}tls${BYPRODUCT_SUFFIX}" ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} CACHE STRING "" FORCE)
-set(OPENSSL_VERSION "1.0.2" CACHE STRING "" FORCE)
+if(NOT OPENSSL_FOUND)
+  set(OPENSSL_FOUND "YES" CACHE STRING "" FORCE)
+  set(OPENSSL_INCLUDE_DIR "${EXPORTED_OPENSSL_INCLUDE_DIR}" CACHE STRING "" FORCE)
+  set(OPENSSL_CRYPTO_LIBRARY "${EXPORTED_OPENSSL_CRYPTO_LIBRARY}" CACHE STRING "" FORCE)
+  set(OPENSSL_SSL_LIBRARY "${EXPORTED_OPENSSL_SSL_LIBRARY}" CACHE STRING "" FORCE)
+  set(OPENSSL_LIBRARIES ${EXPORTED_OPENSSL_LIBRARIES} CACHE STRING "" FORCE)
+  set(OPENSSL_VERSION "1.0.2" CACHE STRING "" FORCE)
+endif()
 
- if(NOT TARGET OpenSSL::Crypto )
-    add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
-    set_target_properties(OpenSSL::Crypto PROPERTIES
-      INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
-    
-      set_target_properties(OpenSSL::Crypto PROPERTIES
-        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
-        IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
-    
-  endif()
+if(NOT TARGET OpenSSL::Crypto)
+  add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
+  set_target_properties(OpenSSL::Crypto PROPERTIES
+          INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+  set_target_properties(OpenSSL::Crypto PROPERTIES
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+          IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
+endif()
 
-  if(NOT TARGET OpenSSL::SSL
-      )
-    add_library(OpenSSL::SSL UNKNOWN IMPORTED)
-    set_target_properties(OpenSSL::SSL PROPERTIES
-      INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
-          set_target_properties(OpenSSL::SSL PROPERTIES
-        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
-        IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}")
-    
-  endif()
+if(NOT TARGET OpenSSL::SSL)
+  add_library(OpenSSL::SSL UNKNOWN IMPORTED)
+  set_target_properties(OpenSSL::SSL PROPERTIES
+          INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+  set_target_properties(OpenSSL::SSL PROPERTIES
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+          IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}")
+endif()
diff --git a/cmake/winssl/FindOpenSSL.cmake b/cmake/winssl/FindOpenSSL.cmake
deleted file mode 100644
index 1830efa..0000000
--- a/cmake/winssl/FindOpenSSL.cmake
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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
-# 
-#   http://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.
-
-# Dummy OpenSSL find for when we use bundled version
\ No newline at end of file
diff --git a/cmake/zlib/dummy/FindZLIB.cmake b/cmake/zlib/dummy/FindZLIB.cmake
index 038dacd..f9a242f 100644
--- a/cmake/zlib/dummy/FindZLIB.cmake
+++ b/cmake/zlib/dummy/FindZLIB.cmake
@@ -16,24 +16,21 @@
 # under the License.
 
 # Dummy zlib find for when we use bundled version
+if(NOT ZLIB_FOUND)
   set(ZLIB_FOUND "YES" CACHE STRING "" FORCE)
-    
-  set(ZLIB_INCLUDE_DIR "${ZLIB_BYPRODUCT_INCLUDE}" CACHE STRING "" FORCE)
-  set(ZLIB_INCLUDE_DIRS "${ZLIB_BYPRODUCT_INCLUDE}" CACHE STRING "" FORCE)
-  
-  set(ZLIB_LIBRARY "${ZLIB_BYPRODUCT}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARIES "${ZLIB_LIBRARY}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARY_RELEASE "${ZLIB_LIBRARY}" CACHE STRING "" FORCE)
-  set(ZLIB_LIBRARY_DEBUG "${ZLIB_LIBRARY}" CACHE STRING "" FORCE)
-  message("ZLIB LIB is located at is ${ZLIB_LIBRARIES}")
-  
-  if(NOT TARGET ZLIB::ZLIB
-      )
-    add_library(ZLIB::ZLIB UNKNOWN IMPORTED)
-    set_target_properties(ZLIB::ZLIB PROPERTIES
-      INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}")
-          set_target_properties(ZLIB::ZLIB PROPERTIES
-        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
-        IMPORTED_LOCATION "${ZLIB_LIBRARY}")
-    
-  endif()
\ No newline at end of file
+  set(ZLIB_INCLUDE_DIRS "${EXPORTED_ZLIB_INCLUDE_DIRS}" CACHE STRING "" FORCE)
+  set(ZLIB_LIBRARIES "${EXPORTED_ZLIB_LIBRARIES}" CACHE STRING "" FORCE)
+  set(ZLIB_VERSION_STRING "${EXPORTED_ZLIB_VERSION_STRING}" CACHE STRING "" FORCE)
+  set(ZLIB_VERSION_MAJOR "${EXPORTED_ZLIB_VERSION_MAJOR}" CACHE STRING "" FORCE)
+  set(ZLIB_VERSION_MINOR "${EXPORTED_ZLIB_VERSION_MINOR}" CACHE STRING "" FORCE)
+  set(ZLIB_VERSION_PATCH "${EXPORTED_ZLIB_VERSION_PATCH}" CACHE STRING "" FORCE)
+endif()
+
+if(NOT TARGET ZLIB::ZLIB)
+  add_library(ZLIB::ZLIB STATIC IMPORTED)
+  set_target_properties(ZLIB::ZLIB PROPERTIES
+          INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}")
+  set_target_properties(ZLIB::ZLIB PROPERTIES
+          IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+          IMPORTED_LOCATION "${ZLIB_LIBRARIES}")
+endif()
\ No newline at end of file
diff --git a/controller/CMakeLists.txt b/controller/CMakeLists.txt
index 9ab9cfb..3e35b76 100644
--- a/controller/CMakeLists.txt
+++ b/controller/CMakeLists.txt
@@ -25,7 +25,7 @@
 
 
 
-include_directories(../main/ ../libminifi/include  ../libminifi/include/c2  ../libminifi/include/c2/protocols/  ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../libminifi/include/core/yaml  ../libminifi/include/core  ../thirdparty/cron ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ${CIVET_THIRDPARTY_ROOT}/include ../thirdparty/cxxopts/include  ../thirdparty/)
+include_directories(../main/ ../libminifi/include  ../libminifi/include/c2  ../libminifi/include/c2/protocols/  ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../libminifi/include/core/yaml  ../libminifi/include/core)
 
 
 if(WIN32)
@@ -54,49 +54,16 @@
   target_link_libraries(minificontroller "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-# Include OpenSSL
-find_package(OpenSSL)
-if (OPENSSL_FOUND)
-include_directories(${OPENSSL_INCLUDE_DIR})
-endif(OPENSSL_FOUND)
+target_wholearchive_library(minificontroller minifi)
 
-# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, jsoncpp and rocksdb
-target_link_libraries(minificontroller minifi ${DL})
+target_link_libraries(minificontroller cxxopts)
 
+get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
+foreach(EXTENSION ${extensions})
+	target_wholearchive_library(minificontroller ${EXTENSION})
+endforeach()
 
-add_dependencies(minificontroller minifi)
-
-if (APPLE)
-	target_link_libraries (minificontroller -Wl,-all_load minifi)
-else ()
-	target_link_libraries (minificontroller -Wl,--whole-archive minifi -Wl,--no-whole-archive)
-endif ()
-
-if (WIN32)
-	include_directories("../thirdparty/Simple-Windows-Posix-Semaphore")
-  	target_link_libraries(minificontroller semaphore)
-endif()
-
-target_link_libraries(minificontroller yaml-cpp c-library civetweb-cpp ${JSON_CPP_LIB} cxxopts)
-
-
-if (APPLE)
-	get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
-	foreach(EXTENSION ${extensions})
-		message("Linking against ${EXTENSION}")
-		add_dependencies(minificontroller ${EXTENSION})
-		target_link_libraries (minificontroller -Wl,-all_load ${EXTENSION})
-	endforeach()    
-else ()
-	get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
-	foreach(EXTENSION ${extensions})
-	add_dependencies(minificontroller ${EXTENSION})
-	  target_link_libraries (minificontroller -Wl,--whole-archive ${EXTENSION} -Wl,--no-whole-archive)
-	endforeach()
-endif ()
-
-set_target_properties(minificontroller
-        PROPERTIES OUTPUT_NAME minificontroller)
+set_target_properties(minificontroller PROPERTIES OUTPUT_NAME minificontroller)
 
 install(TARGETS minificontroller
         RUNTIME
diff --git a/controller/MiNiFiController.cpp b/controller/MiNiFiController.cpp
index c696e38..c87dbfa 100644
--- a/controller/MiNiFiController.cpp
+++ b/controller/MiNiFiController.cpp
@@ -22,7 +22,6 @@
 #include <vector>
 #include <queue>
 #include <map>
-#include <yaml-cpp/yaml.h>
 #include <iostream>
 #include "io/BaseStream.h"
 
diff --git a/extensions/ExtensionHeader.txt b/extensions/ExtensionHeader.txt
index 311e561..426a3e0 100644
--- a/extensions/ExtensionHeader.txt
+++ b/extensions/ExtensionHeader.txt
@@ -20,7 +20,7 @@
 cmake_minimum_required(VERSION 2.6)
 
 
-include_directories(../../libminifi/include  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/cron  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
+include_directories(../../libminifi/include ../../libminifi/include/core)
 
 if(WIN32)
 	include_directories(../../libminifi/opsys/win)
diff --git a/extensions/aws/CMakeLists.txt b/extensions/aws/CMakeLists.txt
index dc354e2..627b6df 100644
--- a/extensions/aws/CMakeLists.txt
+++ b/extensions/aws/CMakeLists.txt
@@ -22,67 +22,12 @@
 
 file(GLOB SOURCES "*.cpp" "s3/*.cpp" "controllerservices/*.cpp")
 
-set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/aws-sdk-cpp")
-set(BYPRODUCT "${CMAKE_CURRENT_BINARY_DIR}/aws-sdk-install/")
-
-
-if(STATIC_BUILD)
-    set(MINIFI_AWS_BUILD_SHARED_LIBS "OFF")
-    set(MINIFI_AWS_UNITY_BUILD "ON")
-else()
-    set(MINIFI_AWS_BUILD_SHARED_LIBS "ON")
-    set(MINIFI_AWS_UNITY_BUILD "OFF")
-endif()
-
-# AWS SDK 1.7.89
-ExternalProject_Add(
-        awssdk-external
-        GIT_REPOSITORY "https://github.com/aws/aws-sdk-cpp.git"
-        GIT_TAG "66666d9437429c28927576cb5c898e490f8c8cf9"
-        EXCLUDE_FROM_ALL TRUE
-        INSTALL_DIR ${BYPRODUCT}
-        CMAKE_ARGS -DBUILD_ONLY=s3
-        -DENABLE_TESTING=OFF
-        -DBUILD_SHARED_LIBS=${MINIFI_AWS_BUILD_SHARED_LIBS}
-        -DENABLE_UNITY_BUILD=${MINIFI_AWS_UNITY_BUILD}
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo
-        -DCMAKE_INSTALL_PREFIX=${BYPRODUCT}
-)
-
-add_library(awssdklib STATIC IMPORTED)
-set_target_properties(awssdklib PROPERTIES IMPORTED_LOCATION "${BYPRODUCT}")
-
-set(AWSSDK_FOUND "YES" CACHE STRING "" FORCE)
-set(AWSSDK_INCLUDE_DIRS "${BYPRODUCT}/include" CACHE STRING "" FORCE)
-set(AWSSDK_LIBRARIES awssdklib CACHE STRING "" FORCE)
-set(AWSSDK_LIBRARY awssdklib CACHE STRING "" FORCE)
-
-include_directories(${AWSSDK_INCLUDE_DIRS})
 add_library(minifi-aws STATIC ${SOURCES})
 
-if(STATIC_BUILD)
-    set(SUFFIX "a")
-else()
-    if(APPLE)
-        set(SUFFIX "dylib")
-    else()
-        set(SUFFIX "so")
-    endif()
-endif()
+target_link_libraries(minifi-aws ${LIBMINIFI})
 
+target_link_libraries(minifi-aws AWS::aws-cpp-sdk-core)
+target_link_libraries(minifi-aws AWS::aws-cpp-sdk-s3)
 
-if (APPLE)
-    if(STATIC_BUILD)
-        target_link_libraries(minifi-aws "-framework CoreFoundation")
-    endif()
-endif()
-
-target_link_libraries(minifi-aws ${BYPRODUCT}lib/libaws-c-common.${SUFFIX})
-target_link_libraries(minifi-aws ${BYPRODUCT}lib/libaws-checksums.${SUFFIX})
-target_link_libraries(minifi-aws ${BYPRODUCT}lib/libaws-c-event-stream.${SUFFIX})
-target_link_libraries(minifi-aws ${BYPRODUCT}lib/libaws-cpp-sdk-core.${SUFFIX})
-target_link_libraries(minifi-aws ${BYPRODUCT}lib/libaws-cpp-sdk-s3.${SUFFIX})
-
-add_dependencies(minifi-aws awssdk-external)
 SET (AWS-EXTENSION minifi-aws PARENT_SCOPE)
-register_extension(minifi-aws)
\ No newline at end of file
+register_extension(minifi-aws)
diff --git a/extensions/bootstrap/CMakeLists.txt b/extensions/bootstrap/CMakeLists.txt
index 40d6b99..c6a7980 100644
--- a/extensions/bootstrap/CMakeLists.txt
+++ b/extensions/bootstrap/CMakeLists.txt
@@ -19,7 +19,7 @@
 
 cmake_minimum_required(VERSION 2.6)
 
-include_directories(../../libminifi/include ../thirdparty/cxxopts/include)
+include_directories(../../libminifi/include)
 
 set(BOOTSTRAP_SOURCES  bootstrap.cpp)
 add_executable(bstrp ${BOOTSTRAP_SOURCES})
diff --git a/extensions/bustache/CMakeLists.txt b/extensions/bustache/CMakeLists.txt
index 2efb586..7cdf351 100644
--- a/extensions/bustache/CMakeLists.txt
+++ b/extensions/bustache/CMakeLists.txt
@@ -21,37 +21,13 @@
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 cmake_minimum_required(VERSION 2.6)
 
-find_package(Boost COMPONENTS system filesystem iostreams REQUIRED)
-include_directories(${Boost_INCLUDE_DIRS})
-
 file(GLOB SOURCES "*.cpp")
 
 add_library(minifi-bustache-extensions STATIC ${SOURCES})
 set_property(TARGET minifi-bustache-extensions PROPERTY POSITION_INDEPENDENT_CODE ON)
-if(THREADS_HAVE_PTHREAD_ARG)
-  target_compile_options(PUBLIC minifi-bustache-extensions "-pthread")
-endif()
-if(CMAKE_THREAD_LIBS_INIT)
-  target_link_libraries(minifi-bustache-extensions "${CMAKE_THREAD_LIBS_INIT}")
-endif()
 
-target_link_libraries(minifi-bustache-extensions ${LIBMINIFI} ${Boost_IOSTREAMS_LIBRARY})
-target_link_libraries(minifi-bustache-extensions ${CMAKE_DL_LIBS})
-target_link_libraries(minifi-bustache-extensions bustache)
-
-if (WIN32)
-    set_target_properties(minifi-bustache-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-bustache-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-bustache-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-bustache-extensions ${LIBMINIFI})
+target_link_libraries(minifi-bustache-extensions BUSTACHE::libbustache)
 
 
 SET (BUSTACHE-EXTENSIONS minifi-bustache-extensions PARENT_SCOPE)
diff --git a/extensions/civetweb/CMakeLists.txt b/extensions/civetweb/CMakeLists.txt
index 52f0f49..72f9de5 100644
--- a/extensions/civetweb/CMakeLists.txt
+++ b/extensions/civetweb/CMakeLists.txt
@@ -21,25 +21,15 @@
 
 include_directories(${CMAKE_SOURCE_DIR}/libminifi/include
                     ${CMAKE_SOURCE_DIR}/libminifi/include/core
-                    ${CMAKE_SOURCE_DIR}/thirdparty/spdlog-20170710/include
-                    ${CMAKE_SOURCE_DIR}/thirdparty/concurrentqueue
-                    ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-0.5.3/include
-                    ${CIVET_THIRDPARTY_ROOT}/include
-                    ${CMAKE_SOURCE_DIR}/thirdparty/jsoncpp/include
                     ${CMAKE_SOURCE_DIR}/thirdparty/
                     ./include)
 
-set(BUILD_CIVET_TESTING OFF)
-add_subdirectory(${CIVET_THIRDPARTY_ROOT}
-                 ${CIVET_BINARY_ROOT}
-                 EXCLUDE_FROM_ALL)
-add_dependencies(c-library libressl-portable)
-
 file(GLOB SOURCES  "processors/*.cpp")
 
 add_library(minifi-civet-extensions STATIC ${SOURCES})
 set_property(TARGET minifi-civet-extensions PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(minifi-civet-extensions c-library civetweb-cpp)
+target_link_libraries(minifi-civet-extensions ${LIBMINIFI})
+target_link_libraries(minifi-civet-extensions CIVETWEB::c-library CIVETWEB::civetweb-cpp)
 
 if(THREADS_HAVE_PTHREAD_ARG)
   target_compile_options(PUBLIC minifi-civet-extensions "-pthread")
@@ -49,21 +39,6 @@
 endif()
 
 
-if (WIN32)
-    set_target_properties(minifi-civet-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-civet-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-civet-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
-
 SET (civet-EXTENSIONS minifi-civet-extensions PARENT_SCOPE)
 
 register_extension(minifi-civet-extensions)
diff --git a/extensions/civetweb/tests/CMakeLists.txt b/extensions/civetweb/tests/CMakeLists.txt
index 723c407..f1bdfba 100644
--- a/extensions/civetweb/tests/CMakeLists.txt
+++ b/extensions/civetweb/tests/CMakeLists.txt
@@ -28,29 +28,23 @@
         target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
         target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/http-curl")
         target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/civetweb-1.10/include")
-        target_include_directories(${testfilename} PRIVATE BEFORE ${CURL_INCLUDE_DIRS})
 
-        if (APPLE)
-            target_link_libraries (${testfilename} -Wl,-all_load ${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES} minifi-civet-extensions minifi-http-curl minifi-standard-processors)
-        elseif (WIN32)
-            target_link_libraries (${testfilename} ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-civet-extensions minifi-http-curl minifi-standard-processors)
-            set_target_properties (${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi-civet-extensions /WHOLEARCHIVE:minifi-http-curl /WHOLEARCHIVE:minifi-standard-processors")
-        else ()
-            target_link_libraries (${testfilename} -Wl,--whole-archive ${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES} minifi-civet-extensions minifi-http-curl minifi-standard-processors -Wl,--no-whole-archive)
-        endif ()
+        target_wholearchive_library(${testfilename} minifi-civet-extensions)
+        target_wholearchive_library(${testfilename} minifi-http-curl)
+        target_wholearchive_library(${testfilename} minifi-standard-processors)
 
         createTests("${testfilename}")
         target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
         MATH(EXPR CIVETWEB-EXTENSIONS_TEST_COUNT "${CIVETWEB-EXTENSIONS_TEST_COUNT}+1")
         add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
         # Copy test resources
-                add_custom_command(
-                        TARGET "${testfilename}"
-                        POST_BUILD
-                        COMMAND ${CMAKE_COMMAND} -E copy_directory
-                                "${CMAKE_SOURCE_DIR}/extensions/civetweb/tests/resources"
-                                "$<TARGET_FILE_DIR:${testfilename}>/resources"
-                        )
+        add_custom_command(
+            TARGET "${testfilename}"
+            POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy_directory
+                    "${CMAKE_SOURCE_DIR}/extensions/civetweb/tests/resources"
+                    "$<TARGET_FILE_DIR:${testfilename}>/resources"
+            )
     ENDFOREACH()
     message("-- Finished building ${CIVETWEB-EXTENSIONS_TEST_COUNT} civetweb related test file(s)...")
 endif()
diff --git a/extensions/coap/CMakeLists.txt b/extensions/coap/CMakeLists.txt
index 9bfa977..450dbfe 100644
--- a/extensions/coap/CMakeLists.txt
+++ b/extensions/coap/CMakeLists.txt
@@ -33,56 +33,9 @@
   target_link_libraries(minifi-coap "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-  set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/extensions/coap")
-  # determine version of GNUTLSs
-  set(BYPRODUCT "${BASE_DIR}/extensions/coap/thirdparty/libcoap-src/.libs/libcoap-2.a")
-  set(DIR "${BASE_DIR}/extensions/coap/thirdparty/libcoap-src")
-  ExternalProject_Add(
-    coap-external
-    GIT_REPOSITORY "https://github.com/obgm/libcoap.git"
-    GIT_TAG "00486a4f46e0278dd24a8ff3411416ff420cde29" 
-    PREFIX "${BASE_DIR}/extensions/coap/thirdparty/libcoap"
-    BUILD_IN_SOURCE true
-    SOURCE_DIR "${DIR}"
-    BUILD_COMMAND make
-    CMAKE_COMMAND ""
-    UPDATE_COMMAND ""
-    INSTALL_COMMAND ${CMAKE_COMMAND}  -E echo "Skipping install step."
-    CONFIGURE_COMMAND ""
-    PATCH_COMMAND ./autogen.sh && ./configure --disable-examples --disable-dtls --disable-tests --disable-documentation
-    STEP_TARGETS build
-    EXCLUDE_FROM_ALL TRUE
-  )
-  add_definitions("-DWITH_POSIX=1")
-  
-  add_library(coaplib STATIC IMPORTED)
-  set_target_properties(coaplib PROPERTIES IMPORTED_LOCATION "${BYPRODUCT}")
-  add_dependencies(coaplib coap-external)
-  set(COAP_FOUND "YES" CACHE STRING "" FORCE)
-  set(COAP_INCLUDE_DIRS "${DIR}/include" CACHE STRING "" FORCE)
-  set(COAP_LIBRARIES coaplib CACHE STRING "" FORCE)
-  set(COAP_LIBRARY coaplib CACHE STRING "" FORCE)
-  set(COAP_LIBRARY coaplib CACHE STRING "" FORCE)
-target_link_libraries(minifi-coap ${CMAKE_DL_LIBS})
-
-include_directories(${COAP_INCLUDE_DIRS})
-
-target_link_libraries (nanofi-coap-c ${COAP_LIBRARIES})
-target_link_libraries (nanofi-coap-c ${HTTP-CURL})
-target_link_libraries (minifi-coap nanofi-coap-c ${COAP_LIBRARIES})
-if (WIN32)
-    set_target_properties(minifi-coap PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-coap PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-coap PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(nanofi-coap-c COAP::libcoap)
+target_link_libraries(minifi-coap ${LIBMINIFI})
+target_link_libraries(minifi-coap nanofi-coap-c COAP::libcoap minifi-http-curl)
 
 SET (COAP-EXTENSION minifi-coap PARENT_SCOPE)
 register_extension(minifi-coap)
diff --git a/extensions/coap/server/CoapServer.cpp b/extensions/coap/server/CoapServer.cpp
index d8cbd7a..9f925de 100644
--- a/extensions/coap/server/CoapServer.cpp
+++ b/extensions/coap/server/CoapServer.cpp
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 #include "CoapServer.h"
-#include <coap2/utlist.h>
 #include <coap2/coap.h>
 
 namespace org {
diff --git a/extensions/coap/tests/CMakeLists.txt b/extensions/coap/tests/CMakeLists.txt
index 130284c..89ba7af 100644
--- a/extensions/coap/tests/CMakeLists.txt
+++ b/extensions/coap/tests/CMakeLists.txt
@@ -26,10 +26,7 @@
 FOREACH(testfile ${CURL_INTEGRATION_TESTS})
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
-  	target_include_directories(${testfilename} BEFORE PRIVATE ${COAP_INCLUDE_DIRS})
-  	target_include_directories(${testfilename} BEFORE PRIVATE ${CURL_INCLUDE_DIRS})
   	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
-  	target_include_directories(${testfilename} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}/include")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../server")
@@ -44,12 +41,12 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/")
 	target_include_directories(${testfilename} BEFORE PRIVATE ./include)
     createTests("${testfilename}")
-    if (APPLE)
-    	target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-coap minifi-civet-extensions minifi-standard-processors)
-	else ()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-coap minifi-civet-extensions minifi-standard-processors -Wl,--no-whole-archive)
-  	endif()
-  MATH(EXPR CURL_INT_TEST_COUNT "${CURL_INT_TEST_COUNT}+1")
+	target_wholearchive_library(${testfilename} minifi-coap)
+	target_wholearchive_library(${testfilename} minifi-civet-extensions)
+	target_wholearchive_library(${testfilename} minifi-http-curl)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+
+    MATH(EXPR CURL_INT_TEST_COUNT "${CURL_INT_TEST_COUNT}+1")
 ENDFOREACH()
 
 message("-- Finished building ${CURL_INT_TEST_COUNT} CoAP integration test file(s)...")
diff --git a/extensions/expression-language/CMakeLists.txt b/extensions/expression-language/CMakeLists.txt
index 1876c7e..f70f779 100644
--- a/extensions/expression-language/CMakeLists.txt
+++ b/extensions/expression-language/CMakeLists.txt
@@ -96,7 +96,7 @@
 
 add_flex_bison_dependency(el-scanner el-parser)
 endif()
-include_directories(./ ../../libminifi/include  ../../libminifi/include/core ../../thirdparty/cron ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../thirdparty/)
+include_directories(./ ../../libminifi/include  ../../libminifi/include/core ../../thirdparty/)
 include_directories(common)
 include_directories(impl)
 include_directories(../../thirdparty/date/include)
@@ -117,27 +117,8 @@
 add_library(minifi-expression-language-extensions STATIC ${SOURCES} ${BISON_el-parser_OUTPUTS} ${FLEX_el-scanner_OUTPUTS})
 set_property(TARGET minifi-expression-language-extensions PROPERTY POSITION_INDEPENDENT_CODE ON)
 
-target_link_libraries(minifi-expression-language-extensions minifi tz)
-
-if (NOT DISABLE_CURL)
-	if (NOT CURL_FOUND)
-		find_package(CURL REQUIRED)
-	endif(NOT CURL_FOUND)
-	include_directories(${CURL_INCLUDE_DIRS})
-	target_link_libraries(minifi-expression-language-extensions ${CURL_LIBRARIES})
-endif()
-find_package(OpenSSL REQUIRED)
-include_directories(${OPENSSL_INCLUDE_DIR})
-target_link_libraries(minifi-expression-language-extensions ${CMAKE_DL_LIBS})
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries (minifi-expression-language-extensions ${ZLIB_LIBRARIES})
-
-if (WIN32 AND NOT DISABLE_CURL)
-    set_target_properties(minifi-expression-language-extensions PROPERTIES
-        LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${CURL_LIBRARIES}"
-    )
-endif()
+target_link_libraries(minifi-expression-language-extensions ${LIBMINIFI})
+target_link_libraries(minifi-expression-language-extensions tz RapidJSON CURL::libcurl)
 
 SET (EXPRESSION-LANGUAGE-EXTENSIONS minifi-expression-language-extensions PARENT_SCOPE)
 
diff --git a/extensions/expression-language/noop/CMakeLists.txt b/extensions/expression-language/noop/CMakeLists.txt
index 6424235..7ef550e 100644
--- a/extensions/expression-language/noop/CMakeLists.txt
+++ b/extensions/expression-language/noop/CMakeLists.txt
@@ -19,6 +19,6 @@
 
 message(STATUS "Expression language is disabled; using NoOp implementation")
 file(GLOB SOURCES "*.cpp")
-include_directories(../../../libminifi/include  ../../../libminifi/include/core  ../../../thirdparty/spdlog-20170710/include ../../../thirdparty/concurrentqueue ../../../thirdparty/yaml-cpp-yaml-cpp-0.5.3/include ${CIVET_THIRDPARTY_ROOT}/include ../../../thirdparty/)
+include_directories(../../../libminifi/include  ../../../libminifi/include/core ../../../thirdparty/)
 add_library(minifi-expression-language-extensions STATIC ${SOURCES})
 set_property(TARGET minifi-expression-language-extensions PROPERTY POSITION_INDEPENDENT_CODE ON)
\ No newline at end of file
diff --git a/extensions/expression-language/tests/CMakeLists.txt b/extensions/expression-language/tests/CMakeLists.txt
index 52f01d0..c3ca54f 100644
--- a/extensions/expression-language/tests/CMakeLists.txt
+++ b/extensions/expression-language/tests/CMakeLists.txt
@@ -21,7 +21,7 @@
 file(GLOB EXPRESSION_LANGUAGE_TESTS  "*.cpp")
 
 SET(EXTENSIONS_TEST_COUNT 0)
-if (NOT WIN32)
+if(NOT WIN32)
 	FOREACH(testfile ${EXPRESSION_LANGUAGE_TESTS})
 		get_filename_component(testfilename "${testfile}" NAME_WE)
 		add_executable(${testfilename} "${testfile}")
@@ -33,25 +33,12 @@
 		target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/expression-language")
 		createTests(${testfilename})
 		target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
+		if(NOT DISABLE_CURL)
+			target_link_libraries(${testfilename} CURL::libcurl)
+		endif()
+		target_wholearchive_library(${testfilename} minifi-expression-language-extensions)
+		target_wholearchive_library(${testfilename} minifi-standard-processors)
 
-	
-		if (NOT DISABLE_CURL)
-				target_link_libraries (${testfilename} ${CURL_LIBRARIES})
-		endif()
-		if (WIN32)
-			foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-				if (OPENSSL_LIB MATCHES "\\.lib$" OR OPENSSL_LIB MATCHES "\\.dll$" )
-				message( "Including ${OPENSSL_LIB}")
-				target_link_libraries (${testfilename} ${OPENSSL_LIB})	
-				set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${OPENSSL_LIB}")
-				endif()
-			endforeach()
-			target_link_libraries (${testfilename} minifi-expression-language-extensions minifi-standard-processors)
-		elseif (APPLE)
-			target_link_libraries (${testfilename} -Wl,-all_load minifi-expression-language-extensions minifi-standard-processors)
-		else ()
-			target_link_libraries (${testfilename} -Wl,--whole-archive ${OPENSSL_LIBRARIES} minifi-expression-language-extensions minifi-standard-processors -Wl,--no-whole-archive)
-		endif()
 		MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 		add_test(NAME ${testfilename} COMMAND ${testfilename} WORKING_DIRECTORY ${TEST_DIR})
 	ENDFOREACH()
@@ -74,31 +61,12 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors/processors")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/expression-language")
 	createTests(${testfilename})
-	
-	if (WIN32)
-		foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-			if (OPENSSL_LIB MATCHES "\\.lib$" OR OPENSSL_LIB MATCHES "\\.dll$" )
-			message( "Including ${OPENSSL_LIB}")
-			target_link_libraries (${testfilename} ${OPENSSL_LIB})
-			set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${OPENSSL_LIB}")
-			endif()
-		endforeach()
-		if (NOT DISABLE_CURL)
-		target_link_libraries (${testfilename} ${CURL_LIBRARIES})
-		endif()
-		target_link_libraries (${testfilename} minifi-expression-language-extensions minifi-standard-processors)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi-expression-language-extensions /WHOLEARCHIVE:minifi-standard-processors")
-	elseif (APPLE)
-		if (NOT DISABLE_CURL)
-		target_link_libraries (${testfilename} ${CURL_LIBRARIES})
-		endif(NOT DISABLE_CURL)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-expression-language-extensions minifi-standard-processors)
-	else ()
-		if (NOT DISABLE_CURL)
-		target_link_libraries (${testfilename} ${CURL_LIBRARIES})
-		endif(NOT DISABLE_CURL)
-		target_link_libraries (${testfilename} -Wl,--whole-archive ${OPENSSL_LIBRARIES} minifi-expression-language-extensions minifi-standard-processors -Wl,--no-whole-archive)
+	if(NOT DISABLE_CURL)
+		target_link_libraries(${testfilename} CURL::libcurl)
 	endif()
+	target_wholearchive_library(${testfilename} minifi-expression-language-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${INT_EXTENSIONS_TEST_COUNT}+1")
 ENDFOREACH()
 
diff --git a/extensions/gps/CMakeLists.txt b/extensions/gps/CMakeLists.txt
index 892bff1..25bb816 100644
--- a/extensions/gps/CMakeLists.txt
+++ b/extensions/gps/CMakeLists.txt
@@ -33,21 +33,6 @@
 target_link_libraries(minifi-gps ${LIBMINIFI} )
 target_link_libraries(minifi-gps ${LIBGPS_LIBRARIES})
 
-target_link_libraries(minifi-gps ${CMAKE_DL_LIBS} )
-if (WIN32)
-    set_target_properties(minifi-gps PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-gps PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-gps PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
 
 SET (GPS-EXTENSION minifi-gps PARENT_SCOPE)
 
diff --git a/extensions/http-curl/CMakeLists.txt b/extensions/http-curl/CMakeLists.txt
index 178ce7f..956fc47 100644
--- a/extensions/http-curl/CMakeLists.txt
+++ b/extensions/http-curl/CMakeLists.txt
@@ -17,8 +17,6 @@
 # under the License.
 #
 
-find_package(CURL REQUIRED)
-
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 include_directories(protocols client processors sitetosite)
 
@@ -33,53 +31,9 @@
   target_link_libraries(minifi-http-curl "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-if (CURL_FOUND)
-  include_directories(${CURL_INCLUDE_DIRS})
-  if (WIN32)
-	message("Including ${CURL_LIBRARY} into minifi-http-curl")
-	target_link_libraries (minifi-http-curl ${CURL_LIBRARY})	
-	set_target_properties(minifi-http-curl PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${CURL_LIBRARY}")
-
-	else()
-			target_link_libraries(minifi-http-curl ${CURL_LIBRARIES})
-	endif()
-endif ()
-
-# Include OpenSSL
-set(OPENSSL_USE_STATIC_LIBS TRUE)
-find_package(OpenSSL REQUIRED)
-include_directories(${OPENSSL_INCLUDE_DIR})
-target_link_libraries(minifi-http-curl ${CMAKE_DL_LIBS})
+target_link_libraries(minifi-http-curl ${LIBMINIFI})
+target_link_libraries(minifi-http-curl CURL::libcurl RapidJSON)
 target_link_libraries(minifi-http-curl minifi-civet-extensions)
 
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries (minifi-http-curl ${ZLIB_LIBRARIES})
-if (WIN32)
-
-
-message("${OPENSSL_LIBRARIES}")
-	set (WIN32_ARCHIVES "")
-		foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-		if (WIN32)
-		if (OPENSSL_LIB MATCHES "\\.lib$" OR OPENSSL_LIB MATCHES "\\.dll$" )
-				message( FATAL "Including ${OPENSSL_LIB}")
-		set_target_properties(minifi-http-curl PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${OPENSSL_LIB}")
-		endif()
-	endif()
-	endforeach()
-
-elseif (APPLE)
-	target_link_libraries(minifi-http-curl ${OPENSSL_LIBRARIES})
-    set_target_properties(minifi-http-curl PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-	message("${OPENSSL_LIBRARIES}")
-	foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-		target_link_libraries (minifi-http-curl ${OPENSSL_LIB})
-	endforeach()
-endif ()
-
 SET (HTTP-CURL minifi-http-curl PARENT_SCOPE)
 register_extension(minifi-http-curl)
diff --git a/extensions/http-curl/client/HTTPClient.cpp b/extensions/http-curl/client/HTTPClient.cpp
index 562376d..354d62a 100644
--- a/extensions/http-curl/client/HTTPClient.cpp
+++ b/extensions/http-curl/client/HTTPClient.cpp
@@ -402,11 +402,13 @@
   }
   curl_easy_setopt(http_session, CURLOPT_CAPATH, nullptr);
 #else
+#ifdef OPENSSL_SUPPORT
   curl_easy_setopt(http_session, CURLOPT_SSL_CTX_FUNCTION, &configure_ssl_context);
   curl_easy_setopt(http_session, CURLOPT_SSL_CTX_DATA, static_cast<void*>(ssl_context_service_.get()));
   curl_easy_setopt(http_session, CURLOPT_CAINFO, 0);
   curl_easy_setopt(http_session, CURLOPT_CAPATH, 0);
 #endif
+#endif
 }
 
 bool HTTPClient::isSecure(const std::string &url) {
diff --git a/extensions/http-curl/tests/CMakeLists.txt b/extensions/http-curl/tests/CMakeLists.txt
index 97b53ed..e12e956 100644
--- a/extensions/http-curl/tests/CMakeLists.txt
+++ b/extensions/http-curl/tests/CMakeLists.txt
@@ -25,8 +25,6 @@
 FOREACH(testfile ${CURL_UNIT_TESTS})
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
-  	target_include_directories(${testfilename} BEFORE PRIVATE ${CURL_INCLUDE_DIRS})
-  	target_include_directories(${testfilename} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../")
@@ -38,14 +36,10 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE ./include)
     createTests("${testfilename}")
     target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-    if (APPLE)
-    	target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions minifi-standard-processors)
-	elseif(WIN32)
-		target_link_libraries ("${testfilename}" ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions  minifi-standard-processors)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi-http-curl /WHOLEARCHIVE:minifi-standard-processors")
-	else ()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions  minifi-standard-processors -Wl,--no-whole-archive)
-  	endif()
+	target_wholearchive_library(${testfilename} minifi-http-curl)
+	target_wholearchive_library(${testfilename} minifi-civet-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+
   	MATH(EXPR CURL_INT_TEST_COUNT "${CURL_INT_TEST_COUNT}+1")
 #	 add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
@@ -53,8 +47,6 @@
 FOREACH(testfile ${CURL_INTEGRATION_TESTS})
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
-  	target_include_directories(${testfilename} BEFORE PRIVATE ${CURL_INCLUDE_DIRS})
-  	target_include_directories(${testfilename} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}/include")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../")
@@ -65,15 +57,11 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/")
 	target_include_directories(${testfilename} BEFORE PRIVATE ./include)
 	createTests("${testfilename}")
-        if (APPLE)
-    	target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions  minifi-standard-processors)
-	elseif(WIN32)
-		target_link_libraries ("${testfilename}" ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions  minifi-standard-processors)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi-http-curl /WHOLEARCHIVE:minifi-standard-processors")
-	else ()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-http-curl minifi-civet-extensions  minifi-standard-processors -Wl,--no-whole-archive)
-  	endif()
-  MATH(EXPR CURL_INT_TEST_COUNT "${CURL_INT_TEST_COUNT}+1")
+	target_wholearchive_library(${testfilename} minifi-http-curl)
+	target_wholearchive_library(${testfilename} minifi-civet-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+
+    MATH(EXPR CURL_INT_TEST_COUNT "${CURL_INT_TEST_COUNT}+1")
 ENDFOREACH()
 
 message("-- Finished building ${CURL_INT_TEST_COUNT} libcURL integration test file(s)...")
@@ -86,15 +74,15 @@
 add_test(NAME C2UpdateAgentTest COMMAND C2UpdateAgentTest "${TEST_RESOURCES}/TestHTTPGet.yml"  "${TEST_RESOURCES}/")
 add_test(NAME C2FailedUpdateTest COMMAND C2FailedUpdateTest "${TEST_RESOURCES}/TestHTTPGet.yml" "${TEST_RESOURCES}/TestBad.yml"  "${TEST_RESOURCES}/")
 add_test(NAME C2NullConfiguration COMMAND C2NullConfiguration "${TEST_RESOURCES}/TestNull.yml"  "${TEST_RESOURCES}/")
-if(OPENSSL_FOUND)
+if(NOT OPENSSL_OFF)
 add_test(NAME HttpGetIntegrationTestSecure COMMAND HttpGetIntegrationTest "${TEST_RESOURCES}/TestHTTPGetSecure.yml"  "${TEST_RESOURCES}/")
+add_test(NAME C2VerifyHeartbeatAndStopSecure COMMAND C2VerifyHeartbeatAndStop "${TEST_RESOURCES}/C2VerifyHeartbeatAndStopSecure.yml" "${TEST_RESOURCES}/")
 endif()
 add_test(NAME HttpPostIntegrationTest COMMAND HttpPostIntegrationTest "${TEST_RESOURCES}/TestHTTPPost.yml" "${TEST_RESOURCES}/")
 if (NOT APPLE)
 add_test(NAME HttpPostIntegrationTestChunked COMMAND HttpPostIntegrationTest "${TEST_RESOURCES}/TestHTTPPostChunkedEncoding.yml" "${TEST_RESOURCES}/")
 endif()
 add_test(NAME C2VerifyServeResults COMMAND C2VerifyServeResults "${TEST_RESOURCES}/C2VerifyServeResults.yml" "${TEST_RESOURCES}/")
-add_test(NAME C2VerifyHeartbeatAndStopSecure COMMAND C2VerifyHeartbeatAndStop "${TEST_RESOURCES}/C2VerifyHeartbeatAndStopSecure.yml" "${TEST_RESOURCES}/")
 add_test(NAME C2VerifyHeartbeatAndStop COMMAND C2VerifyHeartbeatAndStop "${TEST_RESOURCES}/C2VerifyHeartbeatAndStop.yml" )
 add_test(NAME HTTPSiteToSiteTests COMMAND HTTPSiteToSiteTests "${TEST_RESOURCES}/TestHTTPSiteToSite.yml" "${TEST_RESOURCES}/" "http://localhost:8099/nifi-api")
 add_test(NAME SiteToSiteRestTest COMMAND SiteToSiteRestTest "${TEST_RESOURCES}/TestSite2SiteRest.yml" "${TEST_RESOURCES}/" "http://localhost:8077/nifi-api/site-to-site")
diff --git a/extensions/jni/CMakeLists.txt b/extensions/jni/CMakeLists.txt
index ac4c3b2..4e9ee72 100644
--- a/extensions/jni/CMakeLists.txt
+++ b/extensions/jni/CMakeLists.txt
@@ -97,20 +97,16 @@
 	message("Maven could not be invoked to build the framework jar")

 endif()

 

-

-

-

+target_link_libraries (minifi-jni ${LIBMINIFI})

 

 if (APPLE)

-	target_link_libraries (minifi-jni  -Wl,-all_load ${JAVA_JVM_LIBRARY})

-else ()

-	if (WIN32)

-		target_link_libraries (minifi-jni  ${JAVA_JVM_LIBRARY})

-		target_link_libraries (minifi-jni  ${Java_LIBRARIES})

-	else()

-		target_link_libraries (minifi-jni  ${JAVA_JVM_LIBRARY})

-	endif()

-endif ()

+	target_link_libraries (minifi-jni ${JAVA_JVM_LIBRARY})

+elseif (WIN32)

+	target_link_libraries (minifi-jni ${JAVA_JVM_LIBRARY})

+	target_link_libraries (minifi-jni ${Java_LIBRARIES})

+else()

+	target_link_libraries (minifi-jni ${JAVA_JVM_LIBRARY})

+endif()

 

 

 

diff --git a/extensions/libarchive/CMakeLists.txt b/extensions/libarchive/CMakeLists.txt
index 3463999..ee83624 100644
--- a/extensions/libarchive/CMakeLists.txt
+++ b/extensions/libarchive/CMakeLists.txt
@@ -34,23 +34,9 @@
   target_link_libraries(minifi-archive-extensions "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-
-# Include UUID
 target_link_libraries(minifi-archive-extensions ${LIBMINIFI})
-target_link_libraries(minifi-archive-extensions archive_static )
-if (WIN32)
-    set_target_properties(minifi-archive-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-archive-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-archive-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-archive-extensions RapidJSON)
+target_link_libraries(minifi-archive-extensions archive_static)
 
 
 SET (ARCHIVE-EXTENSIONS minifi-archive-extensions PARENT_SCOPE)
diff --git a/extensions/librdkafka/CMakeLists.txt b/extensions/librdkafka/CMakeLists.txt
index aa74bbf..a0856ab 100644
--- a/extensions/librdkafka/CMakeLists.txt
+++ b/extensions/librdkafka/CMakeLists.txt
@@ -30,64 +30,8 @@
   target_link_libraries(minifi-rdkafka-extensions "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-  set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/kafka")
-  if (WIN32)
-  	set(BYPRODUCT "${BASE_DIR}/install/lib/rdkafka.lib")
-  else()
-  	set(BYPRODUCT "${BASE_DIR}/install/lib/librdkafka.a")
-  endif()
-
-list(APPEND CMAKE_MODULE_PATH_PASSTHROUGH_LIST "${CMAKE_SOURCE_DIR}/cmake/ssl")
-if(WIN32 OR NOT USE_SYSTEM_ZLIB)
-    list(APPEND CMAKE_MODULE_PATH_PASSTHROUGH_LIST "${CMAKE_SOURCE_DIR}/cmake/zlib/dummy")
-endif()
-string(REPLACE ";" "%" CMAKE_MODULE_PATH_PASSTHROUGH "${CMAKE_MODULE_PATH_PASSTHROUGH_LIST}")
-
-find_package(Patch REQUIRED)
-
-ExternalProject_Add(
-    kafka-external
-    URL "https://github.com/edenhill/librdkafka/archive/v1.0.1.tar.gz"
-    URL_HASH "SHA256=b2a2defa77c0ef8c508739022a197886e0644bd7bf6179de1b68bdffb02b3550"
-    PATCH_COMMAND "${Patch_EXECUTABLE}" -p1 -i "${CMAKE_SOURCE_DIR}/thirdparty/librdkafka/librdkafka-libressl.patch"
-    PREFIX "${BASE_DIR}"
-    LIST_SEPARATOR % # This is needed for passing semicolon-separated lists
-    CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-               "-DCMAKE_INSTALL_PREFIX=${BASE_DIR}/install"
-               "-DWITH_SASL=OFF"
-               "-DWITH_SSL=ON"
-               "-DRDKAFKA_BUILD_STATIC=ON"
-               "-DRDKAFKA_BUILD_EXAMPLES=OFF"
-               "-DRDKAFKA_BUILD_TESTS=OFF"
-               "-DENABLE_LZ4_EXT=OFF"
-               "-DWITH_ZSTD=OFF"
-               "-DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH_PASSTHROUGH}"
-               "-DCMAKE_C_FLAGS=${CURL_C_FLAGS}"
-               "-DCMAKE_INSTALL_LIBDIR=lib"
-               "-DCMAKE_CXX_FLAGS=${CURL_CXX_FLAGS}"
-               "-DLIBRESSL_BIN_DIR=${LIBRESSL_BIN_DIR}"
-               "-DLIBRESSL_SRC_DIR=${LIBRESSL_SRC_DIR}"
-               "-DBYPRODUCT_PREFIX=${BYPRODUCT_PREFIX}"
-               "-DBYPRODUCT_SUFFIX=${BYPRODUCT_SUFFIX}"
-               "-DZLIB_BYPRODUCT_INCLUDE=${ZLIB_BYPRODUCT_INCLUDE}"
-               "-DZLIB_BYPRODUCT=${ZLIB_BYPRODUCT}"
-               "-DZLIB_LIBRARY=${ZLIB_LIBRARY}"
-               "-DZLIB_LIBRARIES=${ZLIB_LIBRARIES}"
-               "-DLIBRDKAFKA_STATICLIB=1"
-    EXCLUDE_FROM_ALL TRUE
-  )
-add_dependencies(kafka-external libressl-portable)
-if(WIN32 OR NOT USE_SYSTEM_ZLIB)
-    add_dependencies(kafka-external zlib-external)
-endif()
-set(KAFKA_INCLUDE "${BASE_DIR}/install/include/librdkafka/")
-set(KAFKA_LIBRARY "${BYPRODUCT}")
-add_definitions("-DLIBRDKAFKA_STATICLIB=1")
-add_dependencies(minifi-rdkafka-extensions kafka-external)
-include_directories(${ZLIB_INCLUDE_DIRS})
-include_directories(${KAFKA_INCLUDE})
-
-target_link_libraries(minifi-rdkafka-extensions ${KAFKA_LIBRARY} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES})
+target_link_libraries(minifi-rdkafka-extensions ${LIBMINIFI})
+target_link_libraries(minifi-rdkafka-extensions librdkafka)
 
 SET (RDKAFKA-EXTENSIONS minifi-rdkafka-extensions PARENT_SCOPE)
 
diff --git a/extensions/mqtt/CMakeLists.txt b/extensions/mqtt/CMakeLists.txt
index e1d4da9..1b7cacd 100644
--- a/extensions/mqtt/CMakeLists.txt
+++ b/extensions/mqtt/CMakeLists.txt
@@ -18,34 +18,17 @@
 #
 
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt) 
-include_directories(./controllerservice ./processors ./protocol ../../libminifi/include  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/)
-
-include_directories(../../thirdparty/paho.mqtt.c/src)
+include_directories(./controllerservice ./processors ./protocol ../../libminifi/include  ../../libminifi/include/core)
 
 file(GLOB SOURCES "*.cpp" "protocol/*.cpp" "processors/*.cpp" "controllerservice/*.cpp")
 
-
 set(PAHO_BUILD_STATIC "ON" CACHE STRING "" FORCE)
 
 add_library(minifi-mqtt-extensions STATIC ${SOURCES})
 set_property(TARGET minifi-mqtt-extensions PROPERTY POSITION_INDEPENDENT_CODE ON)
 
-target_link_libraries(minifi-mqtt-extensions ${CMAKE_DL_LIBS} )
-target_link_libraries(minifi-mqtt-extensions paho-mqtt3cs-static )
-
-if (WIN32)
-    set_target_properties(minifi-mqtt-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-mqtt-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-mqtt-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-mqtt-extensions ${LIBMINIFI})
+target_link_libraries(minifi-mqtt-extensions paho.mqtt.c)
 
 
 SET (MQTT-EXTENSIONS minifi-mqtt-extensions PARENT_SCOPE)
diff --git a/extensions/opc/CMakeLists.txt b/extensions/opc/CMakeLists.txt
index 9a77ca1..b9968b0 100644
--- a/extensions/opc/CMakeLists.txt
+++ b/extensions/opc/CMakeLists.txt
@@ -23,8 +23,6 @@
 
 include_directories(include)
 
-add_definitions(-DUA_ENABLE_ENCRYPTION)
-
 file(GLOB SOURCES "src/*.cpp")
 
 add_library(minifi-opc-extensions STATIC ${SOURCES})
@@ -37,21 +35,8 @@
   target_link_libraries(minifi-opc-extensions "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-target_link_libraries(minifi-opc-extensions ${CMAKE_DL_LIBS} open62541::open62541)
-
-if (WIN32)
-    set_target_properties(minifi-opc-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-opc-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-opc-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-opc-extensions ${LIBMINIFI})
+target_link_libraries(minifi-opc-extensions ${CMAKE_DL_LIBS} spdlog open62541::open62541)
 
 
 SET (OPC-EXTENSIONS minifi-opc-extensions PARENT_SCOPE)
diff --git a/extensions/opencv/CMakeLists.txt b/extensions/opencv/CMakeLists.txt
index efebf55..49d5e99 100644
--- a/extensions/opencv/CMakeLists.txt
+++ b/extensions/opencv/CMakeLists.txt
@@ -21,17 +21,12 @@
 
 file(GLOB SOURCES  "*.cpp")
 
-set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/opencv")
-set(BYPRODUCT "${CMAKE_CURRENT_BINARY_DIR}/opencv-install/")
-
 set(BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/opencv")
 set(BYPRODUCT "${BASE_DIR}/install")
 
-# OpenCV 4.1.0
-build_git_project(opencv-external "${BASE_DIR}" "https://github.com/opencv/opencv.git" "371bba8f54560b374fbcd47e7e02f015ac4969ad"
-        -DCMAKE_BUILD_TYPE=Release
-        -DBUILD_JAVA=OFF
-        -DBUILD_FAT_JAVA_LIB=OFF
+# OpenCV
+build_git_project(opencv-external "${BASE_DIR}" "https://github.com/opencv/opencv.git" "4.1.0"
+        ${PASSTHROUGH_CMAKE_ARGS}
         -DCMAKE_INSTALL_PREFIX=${BYPRODUCT}
         -DBUILD_SHARED_LIBS=OFF
         -DBUILD_EXAMPLES=OFF
@@ -55,20 +50,28 @@
         -DBUILD_opencv_stitching=ON
         -DBUILD_opencv_video=ON
         -DBUILD_opencv_videoio=ON
-        -DWITH_1394=OFF
+	-DBUILD_JAVA=OFF
+        -DBUILD_FAT_JAVA_LIB=OFF
+        -DBUILD_ZLIB=OFF
+	-DWITH_1394=OFF
         -DWITH_FFMPEG=OFF
         -DWITH_GSTREAMER=OFF
         -DWITH_GTK=OFF
         -DWITH_IPP=OFF
         -DWITH_JASPER=OFF
         -DWITH_OPENEXR=OFF
-        -DWITH_ITT=OFF)
+        -DWITH_ITT=OFF
+        -DWITH_OPENEXR=OFF
+        -DWITH_WEBP=OFF
+        -DWITH_TIFF=OFF)
 
 add_library(minifi-opencv STATIC ${SOURCES})
 
+target_link_libraries(minifi-opencv ${LIBMINIFI})
+
 set(OpenCV_DIR ${BASE_DIR})
-find_package( OpenCV REQUIRED PATHS "${BASE_DIR}/opencv-external/src/opencv-external-build/")
-target_link_libraries( minifi-opencv ${OpenCV_LIBS} )
+find_package(OpenCV REQUIRED PATHS "${BASE_DIR}/opencv-external/src/opencv-external-build/")
+target_link_libraries(minifi-opencv ${OpenCV_LIBS})
 include_directories(${OpenCV_INCLUDE_DIRS})
 
 SET (OPENCV-EXTENSION minifi-opencv PARENT_SCOPE)
diff --git a/extensions/opencv/tests/CMakeLists.txt b/extensions/opencv/tests/CMakeLists.txt
index 34693db..d0e1b03 100644
--- a/extensions/opencv/tests/CMakeLists.txt
+++ b/extensions/opencv/tests/CMakeLists.txt
@@ -21,23 +21,13 @@
 
 SET(OPENCV_TEST_COUNT 0)
 
-if (WIN32)
-	set(LINK_FLAGS "/WHOLEARCHIVE")
-	set(LINK_END_FLAGS "")
-elseif (APPLE)
-	set(LINK_FLAGS "-Wl,-all_load")
-	set(LINK_END_FLAGS "")
-else ()
-	set(LINK_FLAGS "-Wl,--whole-archive")
-	set(LINK_END_FLAGS "-Wl,--no-whole-archive")
-endif ()
-
 FOREACH(testfile ${OPENCV_TESTS})
 	get_filename_component(testfilename "${testfile}" NAME_WE)
 	add_executable("${testfilename}" "${testfile}")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/opencv/")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
-	target_link_libraries (${testfilename} ${LINK_FLAGS} minifi-opencv minifi-standard-processors ${LINK_END_FLAGS})
+	target_wholearchive_library(${testfilename} minifi-opencv)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	createTests("${testfilename}")
 	MATH(EXPR OPENCV_TEST_COUNT "${OPENCV_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
diff --git a/extensions/pcap/CMakeLists.txt b/extensions/pcap/CMakeLists.txt
index e2234a5..25d89cb 100644
--- a/extensions/pcap/CMakeLists.txt
+++ b/extensions/pcap/CMakeLists.txt
@@ -62,22 +62,14 @@
 

 add_dependencies(minifi-pcap pcappp)

 

-if (WIN32)

-	target_link_libraries (minifi-pcap ${PCAP_LIBRARIES} ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a ${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a )

-    set_target_properties(minifi-pcap PROPERTIES

-        LINK_FLAGS "/WHOLEARCHIVE"

-    )

-elseif (APPLE)

-	target_link_libraries (minifi-pcap -Wl,-all_load ${PCAP_LIBRARIES} ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a ${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a )

+target_link_libraries (minifi-pcap ${PCAP_LIBRARIES} ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a ${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a)

+if (APPLE)

 	target_link_libraries(minifi-pcap "-framework CoreFoundation")

 	target_link_libraries(minifi-pcap "-framework SystemConfiguration")

-	set_target_properties(minifi-pcap PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks -Wl,-all_load")

-else ()

-	target_link_libraries (minifi-pcap ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a ${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a ${PCAP_LIBRARIES})

+	set_target_properties(minifi-pcap PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks")

 endif ()

 

-target_link_libraries(minifi-pcap ${LIBMINIFI} )

-target_link_libraries(minifi-pcap ${CMAKE_DL_LIBS} )

+target_link_libraries(minifi-pcap ${LIBMINIFI})

 

 SET (PCAP-EXTENSION minifi-pcap PARENT_SCOPE)

 register_extension(minifi-pcap)

diff --git a/extensions/rocksdb-repos/CMakeLists.txt b/extensions/rocksdb-repos/CMakeLists.txt
index 56ec15e..9bf81bb 100644
--- a/extensions/rocksdb-repos/CMakeLists.txt
+++ b/extensions/rocksdb-repos/CMakeLists.txt
@@ -19,15 +19,6 @@
 
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt) 
 
-find_package(RocksDB)
-
-if (NOT ROCKSDB_FOUND OR BUILD_ROCKSDB)
-	include_directories(${ROCKSDB_THIRDPARTY_ROOT}/include)
-else()
-	include_directories(${ROCKSDB_INCLUDE_DIR})
-endif()
-
-
 file(GLOB SOURCES  "*.cpp")
 
 add_library(minifi-rocksdb-repos STATIC ${SOURCES})
@@ -39,32 +30,8 @@
   target_link_libraries(minifi-rocksdb-repos "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-
 target_link_libraries(minifi-rocksdb-repos ${LIBMINIFI})
-target_link_libraries(minifi-rocksdb-repos ${CMAKE_DL_LIBS} )
-if (ROCKSDB_FOUND AND NOT BUILD_ROCKSDB)
-	target_link_libraries(minifi-rocksdb-repos ${ROCKSDB_LIBRARIES} )
-else()
-	target_link_libraries(minifi-rocksdb-repos rocksdb )
-endif()
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries (minifi-rocksdb-repos ${ZLIB_LIBRARIES})
-if (WIN32)
-    set_target_properties(minifi-rocksdb-repos PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-rocksdb-repos PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-rocksdb-repos PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
+target_link_libraries(minifi-rocksdb-repos RocksDB::RocksDB)
 
 SET (ROCKSDB-REPOS minifi-rocksdb-repos PARENT_SCOPE)
-
 register_extension(minifi-rocksdb-repos)
diff --git a/extensions/script/CMakeLists.txt b/extensions/script/CMakeLists.txt
index a82b2aa..22a4cd8 100644
--- a/extensions/script/CMakeLists.txt
+++ b/extensions/script/CMakeLists.txt
@@ -53,9 +53,6 @@
 endif()
 
 target_link_libraries(minifi-script-extensions ${LIBMINIFI})
-find_package(OpenSSL REQUIRED)
-include_directories(${OPENSSL_INCLUDE_DIR})
-target_link_libraries(minifi-script-extensions ${CMAKE_DL_LIBS})
 
 if (NOT DISABLE_PYTHON_SCRIPTING)
     find_package(PythonLibs 3.5)
@@ -72,7 +69,8 @@
     file(GLOB PY_SOURCES  "python/*.cpp")
     add_library(minifi-python-extensions STATIC ${PY_SOURCES})
 
-    target_link_libraries(minifi-python-extensions ${LIBMINIFI} ${PYTHON_LIBRARIES})
+    target_link_libraries(minifi-python-extensions ${LIBMINIFI})
+    target_link_libraries(minifi-python-extensions ${PYTHON_LIBRARIES})
     target_link_libraries(minifi-script-extensions minifi-python-extensions)
 endif()
 
@@ -80,7 +78,6 @@
     find_package(Lua REQUIRED)
 
     include_directories(${LUA_INCLUDE_DIR})
-    include_directories(../../thirdparty/sol2-2.20.0)
 
     include_directories(lua)
     add_definitions(-DLUA_SUPPORT)
@@ -88,24 +85,11 @@
     file(GLOB LUA_SOURCES  "lua/*.cpp")
     add_library(minifi-lua-extensions STATIC ${LUA_SOURCES})
 
-    target_link_libraries(minifi-lua-extensions ${LUA_LIBRARIES})
+    target_link_libraries(minifi-lua-extensions ${LIBMINIFI})
+    target_link_libraries(minifi-lua-extensions ${LUA_LIBRARIES} sol)
     target_link_libraries(minifi-script-extensions minifi-lua-extensions)
 endif()
 
-if (WIN32)
-    set_target_properties(minifi-script-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-script-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-script-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
 SET (SCRIPTING-EXTENSIONS minifi-script-extensions PARENT_SCOPE)
 
 register_extension(minifi-script-extensions)
diff --git a/extensions/sensors/CMakeLists.txt b/extensions/sensors/CMakeLists.txt
index 5e5bf64..e78ff08 100644
--- a/extensions/sensors/CMakeLists.txt
+++ b/extensions/sensors/CMakeLists.txt
@@ -32,21 +32,7 @@
   target_link_libraries(minifi-sensors "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-target_link_libraries(minifi-sensors ${LIBMINIFI} )
-
-if (WIN32)
-    set_target_properties(minifi-sensors PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-sensors PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-sensors PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-sensors ${LIBMINIFI})
 
 add_dependencies(minifi-sensors RTIMULib)
 target_link_libraries(minifi-sensors RTIMULib)
diff --git a/extensions/sftp/CMakeLists.txt b/extensions/sftp/CMakeLists.txt
index 47ea7bc..48a7012 100644
--- a/extensions/sftp/CMakeLists.txt
+++ b/extensions/sftp/CMakeLists.txt
@@ -17,8 +17,6 @@
 # under the License.
 #
 
-find_package(CURL REQUIRED)
-
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 include_directories(client processors)
 
@@ -33,62 +31,9 @@
 	target_link_libraries(minifi-sftp "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-if (CURL_FOUND)
-	include_directories(${CURL_INCLUDE_DIRS})
-	if (WIN32)
-		message("Including ${CURL_LIBRARY}")
-		target_link_libraries (minifi-sftp ${CURL_LIBRARY})
-		set_target_properties(minifi-sftp PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${CURL_LIBRARY}")
-	else()
-		target_link_libraries(minifi-sftp ${CURL_LIBRARIES})
-	endif()
-endif ()
-
 target_link_libraries(minifi-sftp ${LIBMINIFI})
 
-# Include OpenSSL
-set(OPENSSL_USE_STATIC_LIBS TRUE)
-find_package(OpenSSL REQUIRED)
-include_directories(${OPENSSL_INCLUDE_DIR})
-
-target_link_libraries(minifi-sftp ${CMAKE_DL_LIBS})
-
-# Include LibSSH2
-find_package(LibSSH2 REQUIRED)
-include_directories(${LIBSSH2_INCLUDE_DIR})
-target_link_libraries(minifi-sftp ${LIBSSH2_LIBRARY})
-
-# Include zlib
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries(minifi-sftp ${ZLIB_LIBRARIES})
-
-# Include RapidJSON
-include_directories(thirdparty/rapidjson-1.1.0/include)
-
-if (WIN32)
-message("${OPENSSL_LIBRARIES}")
-	set (WIN32_ARCHIVES "")
-		foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-		if (WIN32)
-		if (OPENSSL_LIB MATCHES "\\.lib$" OR OPENSSL_LIB MATCHES "\\.dll$" )
-				message( FATAL "Including ${OPENSSL_LIB}")
-		set_target_properties(minifi-sftp PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${OPENSSL_LIB}")
-		endif()
-	endif()
-	endforeach()
-
-elseif (APPLE)
-	target_link_libraries(minifi-sftp ${OPENSSL_LIBRARIES})
-    set_target_properties(minifi-sftp PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-	message("${OPENSSL_LIBRARIES}")
-	foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-		target_link_libraries (minifi-sftp ${OPENSSL_LIB})
-	endforeach()
-endif ()
+target_link_libraries(minifi-sftp CURL::libcurl libssh2 RapidJSON)
 
 SET (SFTP minifi-sftp PARENT_SCOPE)
 register_extension(minifi-sftp)
diff --git a/extensions/sftp/tests/CMakeLists.txt b/extensions/sftp/tests/CMakeLists.txt
index d350dbd..e12970c 100644
--- a/extensions/sftp/tests/CMakeLists.txt
+++ b/extensions/sftp/tests/CMakeLists.txt
@@ -29,7 +29,6 @@
 	FOREACH(testfile ${SFTP_INTEGRATION_TESTS})
 		get_filename_component(testfilename "${testfile}" NAME_WE)
 		add_executable("${testfilename}" "${testfile}")
-		target_include_directories(${testfilename} BEFORE PRIVATE ${CURL_INCLUDE_DIRS})
 		target_include_directories(${testfilename} BEFORE PRIVATE ${LIBSSH2_INCLUDE_DIR})
 		target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
 		target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors/processors")
@@ -42,16 +41,12 @@
 		target_include_directories(${testfilename} BEFORE PRIVATE ./include)
 		target_include_directories(${testfilename} BEFORE PRIVATE ./tools)
 
-		# need to add reference to minifi to get EL support for these tests.
-		# these tests aren't valid without EL
-		if (APPLE)
-			target_link_libraries (${testfilename} -Wl,-all_load ${LIBSSH2_LIBRARY} ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES}  minifi-expression-language-extensions minifi-sftp minifi-standard-processors sftp-test-tools)
-		else ()
-			target_link_libraries (${testfilename} -Wl,--whole-archive ${LIBSSH2_LIBRARY} ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES}  minifi-expression-language-extensions minifi-sftp minifi-standard-processors sftp-test-tools -Wl,--no-whole-archive)
-		endif ()
-
 		createTests("${testfilename}")
-		target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
+		target_link_libraries(${testfilename} ${CATCH_MAIN_LIB} minifi sftp-test-tools)
+		target_wholearchive_library(${testfilename} minifi-sftp)
+		target_wholearchive_library(${testfilename} minifi-expression-language-extensions)
+		target_wholearchive_library(${testfilename} minifi-standard-processors)
+
 		MATH(EXPR SFTP-EXTENSIONS_TEST_COUNT "${SFTP-EXTENSIONS_TEST_COUNT}+1")
 		add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 	ENDFOREACH()
diff --git a/extensions/sftp/tests/tools/CMakeLists.txt b/extensions/sftp/tests/tools/CMakeLists.txt
index da76eb9..c42fe0d 100644
--- a/extensions/sftp/tests/tools/CMakeLists.txt
+++ b/extensions/sftp/tests/tools/CMakeLists.txt
@@ -21,21 +21,13 @@
 
 add_library(sftp-test-tools STATIC ${SOURCES})
 
-target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/catch")
-target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/cron")
-target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/spdlog-20170710/include")
-target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp-yaml-cpp-0.5.3/include")
 target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include")
 target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/include")
 target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/")
 target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/core")
 target_include_directories(sftp-test-tools BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/io")
 
-if (APPLE)
-    target_link_libraries (sftp-test-tools -Wl,-all_load minifi-sftp minifi-standard-processors)
-else ()
-    target_link_libraries (sftp-test-tools -Wl,--whole-archive minifi-sftp minifi-standard-processors -Wl,--no-whole-archive)
-endif ()
+target_link_libraries(sftp-test-tools minifi)
 
 set(SFTP_TEST_SERVER_JAR_SOURCE "${CMAKE_SOURCE_DIR}/extensions/sftp/tests/tools/sftp-test-server")
 set(SFTP_TEST_SERVER_JAR_BIN "${CMAKE_CURRENT_BINARY_DIR}/" )
diff --git a/extensions/sqlite/CMakeLists.txt b/extensions/sqlite/CMakeLists.txt
index 3bef06f..b97a38f 100644
--- a/extensions/sqlite/CMakeLists.txt
+++ b/extensions/sqlite/CMakeLists.txt
@@ -19,8 +19,6 @@
 
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt) 
 
-include_directories("${CMAKE_SOURCE_DIR}/thirdparty/sqlite")
-
 file(GLOB SOURCES "*.cpp")
 
 add_library(minifi-sqlite-extensions STATIC ${SOURCES})
@@ -32,22 +30,8 @@
   target_link_libraries(minifi-sqlite-extensions "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-target_link_libraries(minifi-sqlite-extensions ${CMAKE_DL_LIBS})
-target_link_libraries(minifi-sqlite-extensions sqlite)
-
-if (WIN32)
-    set_target_properties(minifi-sqlite-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-sqlite-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-sqlite-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
+target_link_libraries(minifi-sqlite-extensions ${LIBMINIFI})
+target_link_libraries(minifi-sqlite-extensions SQLite::SQLite3)
 
 
 SET (SQLITE-EXTENSIONS minifi-sqlite-extensions PARENT_SCOPE)
diff --git a/extensions/standard-processors/CMakeLists.txt b/extensions/standard-processors/CMakeLists.txt
index ddaf19f..c96d6ca 100644
--- a/extensions/standard-processors/CMakeLists.txt
+++ b/extensions/standard-processors/CMakeLists.txt
@@ -31,7 +31,7 @@
   target_link_libraries(minifi-standard-processors "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-target_link_libraries(minifi-standard-processors core-minifi)
+target_link_libraries(minifi-standard-processors ${LIBMINIFI})
 
 SET (STANDARD-PROCESSORS minifi-standard-processors PARENT_SCOPE)
 register_extension(minifi-standard-processors)
diff --git a/extensions/standard-processors/tests/CMakeLists.txt b/extensions/standard-processors/tests/CMakeLists.txt
index 0d525c2..8021279 100644
--- a/extensions/standard-processors/tests/CMakeLists.txt
+++ b/extensions/standard-processors/tests/CMakeLists.txt
@@ -20,34 +20,27 @@
 
 file(GLOB PROCESSOR_UNIT_TESTS  "unit/*.cpp")
 file(GLOB PROCESSOR_INTEGRATION_TESTS "integration/*.cpp")
-if (NOT OPENSSL_FOUND)
+if(OPENSSL_OFF)
 	list(REMOVE_ITEM PROCESSOR_INTEGRATION_TESTS "${CMAKE_CURRENT_SOURCE_DIR}/integration/SecureSocketGetTCPTest.cpp")
 endif()
 
 SET(PROCESSOR_INT_TEST_COUNT 0)
 
-find_package(OpenSSL REQUIRED)
 FOREACH(testfile ${PROCESSOR_UNIT_TESTS})
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
   	target_include_directories(${testfilename} BEFORE PRIVATE ${PROCESSOR_INCLUDE_DIRS})
-  	target_include_directories(${testfilename} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../processors")
 	target_include_directories(${testfilename} BEFORE PRIVATE ./include)
     createTests("${testfilename}")
     target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-    if (APPLE)
-    	target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-standard-processors minifi-civet-extensions)
-	elseif(WIN32)
-		target_link_libraries(${testfilename} ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi minifi-standard-processors minifi-civet-extensions)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi /WHOLEARCHIVE:minifi-standard-processors /WHOLEARCHIVE:minifi-civet-extensions")
-	else ()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-standard-processors minifi-civet-extensions -Wl,--no-whole-archive)
-  	endif()
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+	target_wholearchive_library(${testfilename} minifi-civet-extensions)
   	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-  MATH(EXPR PROCESSOR_INT_TEST_COUNT "${PROCESSOR_INT_TEST_COUNT}+1")
+
+	MATH(EXPR PROCESSOR_INT_TEST_COUNT "${PROCESSOR_INT_TEST_COUNT}+1")
 ENDFOREACH()
 
 message("-- Finished building ${PROCESSOR_INT_TEST_COUNT} processor unit test file(s)...")
@@ -58,32 +51,27 @@
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
   	target_include_directories(${testfilename} BEFORE PRIVATE ${PROCESSOR_INCLUDE_DIRS})
-	target_include_directories(${testfilename} BEFORE PRIVATE "${CIVET_THIRDPARTY_ROOT}")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../")
 	target_include_directories(${testfilename} BEFORE PRIVATE "../processors")
 	target_include_directories(${testfilename} BEFORE PRIVATE ./include)
- 	 createTests("${testfilename}")
- 	 if (APPLE)
-    	target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-standard-processors minifi-civet-extensions)
-	elseif(WIN32)
-		target_link_libraries(${testfilename} ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi minifi-standard-processors minifi-civet-extensions)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi /WHOLEARCHIVE:minifi-standard-processors /WHOLEARCHIVE:minifi-civet-extensions")
-	else ()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARY} ${OPENSSL_LIBRARIES} minifi-standard-processors minifi-civet-extensions -Wl,--no-whole-archive)
-  	endif()
- 	 MATH(EXPR INT_TEST_COUNT "${INT_TEST_COUNT}+1")
+ 	createTests("${testfilename}")
+	target_link_libraries(${testfilename})
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+	target_wholearchive_library(${testfilename} minifi-civet-extensions)
+
+	MATH(EXPR INT_TEST_COUNT "${INT_TEST_COUNT}+1")
 ENDFOREACH()
 message("-- Finished building ${INT_TEST_COUNT} integration test file(s)...")
 
 
 add_test(NAME TestExecuteProcess COMMAND TestExecuteProcess )
 
-if (OPENSSL_FOUND)
-add_test(NAME SecureSocketGetTCPTest COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecure.yml"  "${TEST_RESOURCES}/")
-add_test(NAME SecureSocketGetTCPTestEmptyPass COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureEmptyPass.yml"  "${TEST_RESOURCES}/")
-add_test(NAME SecureSocketGetTCPTestWithPassword COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureWithPass.yml"  "${TEST_RESOURCES}/")
-add_test(NAME SecureSocketGetTCPTestWithPasswordFile COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureWithFilePass.yml"  "${TEST_RESOURCES}/")
+if(NOT OPENSSL_OFF)
+	add_test(NAME SecureSocketGetTCPTest COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecure.yml"  "${TEST_RESOURCES}/")
+	add_test(NAME SecureSocketGetTCPTestEmptyPass COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureEmptyPass.yml"  "${TEST_RESOURCES}/")
+	add_test(NAME SecureSocketGetTCPTestWithPassword COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureWithPass.yml"  "${TEST_RESOURCES}/")
+	add_test(NAME SecureSocketGetTCPTestWithPasswordFile COMMAND SecureSocketGetTCPTest "${TEST_RESOURCES}/TestGetTCPSecureWithFilePass.yml"  "${TEST_RESOURCES}/")
 endif()
 
 add_test(NAME TailFileTest COMMAND TailFileTest "${TEST_RESOURCES}/TestTailFile.yml"  "${TEST_RESOURCES}/")
diff --git a/extensions/tensorflow/CMakeLists.txt b/extensions/tensorflow/CMakeLists.txt
index a641a18..a308756 100644
--- a/extensions/tensorflow/CMakeLists.txt
+++ b/extensions/tensorflow/CMakeLists.txt
@@ -39,6 +39,7 @@
   target_link_libraries(minifi-tensorflow-extensions "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
+target_link_libraries(minifi-tensorflow-extensions ${LIBMINIFI})
 target_link_libraries(minifi-tensorflow-extensions ${TENSORFLOW_LIBRARIES})
 
 SET (TENSORFLOW-EXTENSIONS minifi-tensorflow-extensions PARENT_SCOPE)
diff --git a/extensions/usb-camera/CMakeLists.txt b/extensions/usb-camera/CMakeLists.txt
index cfe1258..ef7e0b9 100644
--- a/extensions/usb-camera/CMakeLists.txt
+++ b/extensions/usb-camera/CMakeLists.txt
@@ -19,10 +19,7 @@
 
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 
-find_package(PkgConfig)
-pkg_check_modules(LIBUSB libusb-1.0)
-
-find_package(png QUIET)
+find_package(PNG)
 if(PNG_FOUND)
     set(PNG_LINK_FLAGS ${PNG_LIBRARIES})
 else()
@@ -43,8 +40,12 @@
     message(FATAL_ERROR "A compatible PNG library is required to build GetUSBCamera.")
 endif()
 
-
-include_directories(../../thirdparty/libuvc-0.0.6/include)
+if(NOT TARGET PNG::PNG)
+    add_library(PNG::PNG UNKNOWN IMPORTED)
+    set_target_properties(PNG::PNG PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${PNG_INCLUDE_DIR}"
+            INTERFACE_LINK_LIBRARIES ${PNG_LINK_FLAGS})
+endif()
 
 file(GLOB SOURCES  "*.cpp")
 
@@ -58,31 +59,8 @@
 endif()
 
 target_link_libraries(minifi-usb-camera-extensions ${LIBMINIFI})
-find_package(OpenSSL REQUIRED)
-include_directories(${OPENSSL_INCLUDE_DIR})
-target_link_libraries(minifi-usb-camera-extensions ${CMAKE_DL_LIBS} )
-target_link_libraries(minifi-usb-camera-extensions ${PNG_LINK_FLAGS})
-target_link_libraries(minifi-usb-camera-extensions uvc_static )
-target_link_libraries(minifi-usb-camera-extensions ${LIBUSB_LIBRARIES})
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries (minifi-usb-camera-extensions ${ZLIB_LIBRARIES})
-if (WIN32)
-    set_target_properties(minifi-usb-camera-extensions PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-usb-camera-extensions PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-usb-camera-extensions PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
+target_link_libraries(minifi-usb-camera-extensions libuvc PNG::PNG)
 
 SET (USB-CAMERA-EXTENSIONS minifi-usb-camera-extensions PARENT_SCOPE)
 
 register_extension(minifi-usb-camera-extensions)
-
diff --git a/extensions/windows-event-log/CMakeLists.txt b/extensions/windows-event-log/CMakeLists.txt
index 584820f..5241126 100644
--- a/extensions/windows-event-log/CMakeLists.txt
+++ b/extensions/windows-event-log/CMakeLists.txt
@@ -30,44 +30,9 @@
   target_link_libraries(minifi-wel "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-set(PUGI_BYPRODUCT_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/pugixml-install" CACHE STRING "PugiXML install directory")
-set(BYPRODUCT "${PUGI_BYPRODUCT_DIR}/lib/pugixml.lib")
-  ExternalProject_Add(
-    pugixml-external
-    GIT_REPOSITORY "https://github.com/zeux/pugixml.git"
-    GIT_TAG "v1.9" 
-    SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/thirdparty/pugixml-src"
-    CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-			   "-DBUILD_TESTS=OFF"
-			   "-DBUILD_SHARED_AND_STATIC_LIBS=OFF"
-			   "-DBUILD_SHARED_LIBS=OFF"
-               "-DCMAKE_INSTALL_PREFIX=${PUGI_BYPRODUCT_DIR}"
-    BUILD_BYPRODUCTS ${BYPRODUCT}
-  )
+target_link_libraries(minifi-wel ${LIBMINIFI})
+target_link_libraries(minifi-wel PUGI::libpugixml ZLIB::ZLIB Wevtapi.lib)
 
-include_directories("${PUGI_BYPRODUCT_DIR}/include")
-add_dependencies(minifi-wel pugixml-external)
-target_link_libraries(minifi-wel ${LIBMINIFI} ${BYPRODUCT})
-
-target_link_libraries(minifi-wel ${CMAKE_DL_LIBS} )
-find_package(ZLIB REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIRS})
-target_link_libraries (minifi-wel ${ZLIB_LIBRARIES})
-if (WIN32)
-    set_target_properties(minifi-wel PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE"
-    )
-elseif (APPLE)
-    set_target_properties(minifi-wel PROPERTIES
-        LINK_FLAGS "-Wl,-all_load"
-    )
-else ()
-    set_target_properties(minifi-wel PROPERTIES
-        LINK_FLAGS "-Wl,--whole-archive"
-    )
-endif ()
-
-
-SET (WEL-EXTENSION minifi-wel PARENT_SCOPE)
+SET(WEL-EXTENSION minifi-wel PARENT_SCOPE)
 
 register_extension(minifi-wel)
diff --git a/extensions/windows-event-log/tests/CMakeLists.txt b/extensions/windows-event-log/tests/CMakeLists.txt
index 7f798f1..a0f56b1 100644
--- a/extensions/windows-event-log/tests/CMakeLists.txt
+++ b/extensions/windows-event-log/tests/CMakeLists.txt
@@ -22,20 +22,14 @@
 FOREACH(testfile ${WEL_INTEGRATION_TESTS})
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
-  	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/windows-event-log/")
+  	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/windows-event-log/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/")
-	target_include_directories(${testfilename} BEFORE PRIVATE "${PUGI_BYPRODUCT_DIR}/include/")
-	createTests("${testfilename}")	
-	target_link_libraries(${testfilename} ${LIBMINIFI}  ${CATCH_MAIN_LIB})
-  	if (APPLE)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-wel)
-	elseif(WIN32)
-		target_link_libraries (${testfilename}	minifi-wel)
-		set_target_properties(${testfilename} PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi-wel")
-	else ()
-	  	target_link_libraries (${testfilename} -Wl,--whole-archive minifi-wel -Wl,--no-whole-archive)
-	endif ()
+	createTests("${testfilename}")
+	target_wholearchive_library(${testfilename} minifi-wel)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+	target_link_libraries (${testfilename} minifi ${CATCH_MAIN_LIB})
+
 	MATH(EXPR WEL_TEST_COUNT "${WEL_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 ENDFOREACH()
diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt
index 34f72dd..6c89eef 100644
--- a/libminifi/CMakeLists.txt
+++ b/libminifi/CMakeLists.txt
@@ -34,7 +34,6 @@
 if (WIN32)
 	add_definitions(-DWIN32_LEAN_AND_MEAN)
 endif()
-
 IF (IOS)
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-abi-version=2 -fobjc-arc -std=gnu++11 -stdlib=libc++ -isysroot ${CMAKE_OSX_SYSROOT} -DIOS")
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fobjc-abi-version=2 -fobjc-arc -isysroot ${CMAKE_OSX_SYSROOT} -DIOS")
@@ -75,11 +74,6 @@
 	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-reorder")
 endif()
 
-include_directories(../thirdparty/spdlog-20170710/include)
-include_directories(../thirdparty/yaml-cpp-yaml-cpp-20171024/include)
-include_directories(../thirdparty/cron)
-include_directories(../thirdparty/rapidjson-1.1.0/include)
-include_directories(../thirdparty/concurrentqueue/)
 include_directories(include)
 
 
@@ -91,60 +85,31 @@
 set(SOCKET_SOURCES "src/io/posix/*.cpp")
 endif()
 
-find_package(OpenSSL)
-if (OPENSSL_FOUND)
+if (NOT OPENSSL_OFF)
 	set(TLS_SOURCES "src/io/tls/*.cpp")
-endif(OPENSSL_FOUND)
+endif()
 
 file(GLOB SOURCES  "src/utils/file/*.cpp" "src/sitetosite/*.cpp"  "src/core/logging/*.cpp"  "src/core/state/*.cpp" "src/core/state/nodes/*.cpp" "src/c2/protocols/*.cpp" "src/c2/triggers/*.cpp" "src/c2/*.cpp" "src/io/*.cpp" ${SOCKET_SOURCES} ${TLS_SOURCES} "src/core/controller/*.cpp" "src/controllers/*.cpp" "src/core/*.cpp"  "src/core/repository/*.cpp" "src/core/yaml/*.cpp" "src/core/reporting/*.cpp"  "src/provenance/*.cpp" "src/utils/*.cpp" "src/*.cpp")
 
 file(GLOB PROCESSOR_SOURCES  "src/processors/*.cpp" )
 
 
-file(GLOB SPD_SOURCES "../thirdparty/spdlog-20170710/include/spdlog/*")
-
-# Workaround the limitations of having a
-# header only library
-add_library(spdlog STATIC ${SPD_SOURCES})
 add_library(core-minifi STATIC ${SOURCES})
-target_link_libraries(core-minifi ${CMAKE_DL_LIBS} yaml-cpp)
-
-#target_link_libraries(core-minifi  PRIVATE bsdiff )
-
-
-include_directories(${ZLIB_INCLUDE_DIRS})
-
-target_link_libraries (core-minifi ${ZLIB_LIBRARIES})
-
+target_link_libraries(core-minifi ${CMAKE_DL_LIBS} yaml-cpp ZLIB::ZLIB concurrentqueue RapidJSON spdlog cron)
 if(NOT WIN32)
-	target_link_libraries (core-minifi OSSP::libuuid++)
+	target_link_libraries(core-minifi OSSP::libuuid++)
 endif()
-
-
-# Include OpenSSL
-if (OPENSSL_FOUND)
-	include_directories(${OPENSSL_INCLUDE_DIR})
-	if (WIN32)
-		foreach(OPENSSL_LIB ${OPENSSL_LIBRARIES})
-			if (OPENSSL_LIB MATCHES "\\.lib$" OR OPENSSL_LIB MATCHES "\\.dll$" )
-			message( "Including ${OPENSSL_LIB}")
-			target_link_libraries (core-minifi ${OPENSSL_LIB})	
-			set_target_properties(core-minifi PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:${OPENSSL_LIB}")
-			endif()
-		endforeach()
-	else()
-		target_link_libraries (core-minifi ${OPENSSL_LIBRARIES})
-	endif()
-
-endif (OPENSSL_FOUND)
+if (NOT OPENSSL_OFF)
+	target_link_libraries(core-minifi OpenSSL::SSL)
+endif()
 
 add_library(minifi STATIC ${PROCESSOR_SOURCES})
 
 
 target_link_libraries(minifi core-minifi)
 if (WIN32)
-set_target_properties(minifi PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
-set_target_properties(minifi PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:core-minifi")
+	set_target_properties(minifi PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+	set_target_properties(minifi PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:core-minifi")
 endif()
 
 
@@ -152,39 +117,24 @@
 
 if (ENABLE_PYTHON AND NOT STATIC_BUILD)
 #### shared
+	add_library(core-minifi-shared SHARED ${SOURCES})
+	target_link_libraries(core-minifi-shared ${CMAKE_DL_LIBS} yaml-cpp ZLIB::ZLIB concurrentqueue RapidJSON spdlog cron)
+	if(NOT WIN32)
+		target_link_libraries(core-minifi-shared OSSP::libuuid++)
+	endif()
+	if (NOT OPENSSL_OFF)
+		target_link_libraries(core-minifi-shared OpenSSL::SSL)
+	endif()
 
-add_library(core-minifi-shared SHARED ${SOURCES})
-if (APPLE)
-	target_link_libraries(core-minifi-shared ${CMAKE_DL_LIBS} yaml-cpp)
-else()
-	target_link_libraries(core-minifi-shared ${CMAKE_DL_LIBS} yaml-cpp)
-endif()
+	add_library(minifi-shared SHARED ${PROCESSOR_SOURCES})
 
-include_directories(${ZLIB_INCLUDE_DIRS})
-
-target_link_libraries (core-minifi-shared ${ZLIB_LIBRARIES})
-
-if(NOT WIN32)
-	target_link_libraries (core-minifi-shared OSSP::libuuid++)
-endif()
-
-# Include OpenSSL
-
-if (OPENSSL_FOUND)
-	include_directories(${OPENSSL_INCLUDE_DIR})
-	target_link_libraries (core-minifi-shared ${OPENSSL_LIBRARIES})
-endif (OPENSSL_FOUND)
-
-add_library(minifi-shared SHARED ${PROCESSOR_SOURCES})
-
-target_link_libraries(minifi-shared core-minifi-shared)
-if (WIN32)
-set_target_properties(minifi-shared PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
-set_target_properties(minifi-shared PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:core-minifi-shared")
-endif()
+	target_link_libraries(minifi-shared core-minifi-shared)
+	if (WIN32)
+		set_target_properties(minifi-shared PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+		set_target_properties(minifi-shared PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:core-minifi-shared")
+	endif()
 
 
-set_property(TARGET core-minifi-shared PROPERTY POSITION_INDEPENDENT_CODE ON)
-set_property(TARGET minifi-shared PROPERTY POSITION_INDEPENDENT_CODE ON)
-#endif()
+	set_property(TARGET core-minifi-shared PROPERTY POSITION_INDEPENDENT_CODE ON)
+	set_property(TARGET minifi-shared PROPERTY POSITION_INDEPENDENT_CODE ON)
 endif(ENABLE_PYTHON AND NOT STATIC_BUILD)
diff --git a/libminifi/include/controllers/SSLContextService.h b/libminifi/include/controllers/SSLContextService.h
index b56b163..ea5fef7 100644
--- a/libminifi/include/controllers/SSLContextService.h
+++ b/libminifi/include/controllers/SSLContextService.h
@@ -166,6 +166,7 @@
   std::string passphrase_file_;
   std::string ca_certificate_;
 
+#ifdef OPENSSL_SUPPORT
   static std::string getLatestOpenSSLErrorString() {
     unsigned long err = ERR_peek_last_error();
     if (err == 0U) {
@@ -175,6 +176,7 @@
     ERR_error_string_n(err, buf, sizeof(buf));
     return buf;
   }
+#endif
 
   static bool isFileTypeP12(const std::string& filename) {
     return utils::StringUtils::endsWithIgnoreCase(filename, "p12");
diff --git a/libminifi/src/controllers/SSLContextService.cpp b/libminifi/src/controllers/SSLContextService.cpp
index ee1ef2c..5af7f92 100644
--- a/libminifi/src/controllers/SSLContextService.cpp
+++ b/libminifi/src/controllers/SSLContextService.cpp
@@ -49,6 +49,7 @@
   initialized_ = true;
 }
 
+#ifdef OPENSSL_SUPPORT
 bool SSLContextService::configure_ssl_context(SSL_CTX *ctx) {
   if (!IsNullOrEmpty(certificate)) {
     if (isFileTypeP12(certificate)) {
@@ -133,6 +134,7 @@
 
   return true;
 }
+#endif
 
 /**
  * If OpenSSL is not installed we may still continue operations. Nullptr will
diff --git a/libminifi/test/archive-tests/CMakeLists.txt b/libminifi/test/archive-tests/CMakeLists.txt
index 63b76ea..76a54cc 100644
--- a/libminifi/test/archive-tests/CMakeLists.txt
+++ b/libminifi/test/archive-tests/CMakeLists.txt
@@ -26,11 +26,8 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/libarchive")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/libarchive-3.3.2/libarchive")
-	if (APPLE)
-	      target_link_libraries (${testfilename} ${ZLIB_LIBRARIES} -Wl,-all_load minifi-archive-extensions minifi-standard-processors)
-	else ()
-	    target_link_libraries (${testfilename} ${ZLIB_LIBRARIES} -Wl,--whole-archive minifi-archive-extensions minifi-standard-processors -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-archive-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	createTests("${testfilename}")
 	target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
diff --git a/libminifi/test/bustache-tests/CMakeLists.txt b/libminifi/test/bustache-tests/CMakeLists.txt
index a7c2cfa..2361072 100644
--- a/libminifi/test/bustache-tests/CMakeLists.txt
+++ b/libminifi/test/bustache-tests/CMakeLists.txt
@@ -27,11 +27,8 @@
   target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
   target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/bustache/include")
 
-  if (APPLE)
-    target_link_libraries (${testfilename} -Wl,-all_load minifi-bustache-extensions minifi-standard-processors)
-  else ()
-    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-bustache-extensions minifi-standard-processors -Wl,--no-whole-archive)
-  endif ()
+  target_wholearchive_library(${testfilename} minifi-bustache-extensions)
+  target_wholearchive_library(${testfilename} minifi-standard-processors)
 
   createTests("${testfilename}")
   target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
diff --git a/libminifi/test/coap-tests/CMakeLists.txt b/libminifi/test/coap-tests/CMakeLists.txt
index 4da8737..6724259 100644
--- a/libminifi/test/coap-tests/CMakeLists.txt
+++ b/libminifi/test/coap-tests/CMakeLists.txt
@@ -23,12 +23,9 @@
   	get_filename_component(testfilename "${testfile}" NAME_WE)
   	add_executable("${testfilename}" "${testfile}")
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/coap/")
-	createTests("${testfilename}")	
-  	if (APPLE)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-coap)
-	else ()
-	  	target_link_libraries (${testfilename} -Wl,--whole-archive minifi-coap -Wl,--no-whole-archive)
-	endif ()
+	createTests("${testfilename}")
+	target_wholearchive_library(${testfilename} minifi-coap)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR COAP_TEST_COUNT "${COAP_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/gps-tests/CMakeLists.txt b/libminifi/test/gps-tests/CMakeLists.txt
index fdb9af0..77abc3b 100644
--- a/libminifi/test/gps-tests/CMakeLists.txt
+++ b/libminifi/test/gps-tests/CMakeLists.txt
@@ -24,12 +24,9 @@
   	add_executable("${testfilename}" "${testfile}")
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/gps/")
-	createTests("${testfilename}")	
-  	if (APPLE)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-gps minifi-standard-processors)
-	else ()
-	  	target_link_libraries (${testfilename} -Wl,--whole-archive minifi-gps minifi-standard-processors -Wl,--no-whole-archive)
-	endif ()
+	createTests("${testfilename}")
+	target_wholearchive_library(${testfilename} minifi-gps)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR GPS_TEST_COUNT "${GPS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/jni-tests/CMakeLists.txt b/libminifi/test/jni-tests/CMakeLists.txt
index 1e465b1..6c0e082 100644
--- a/libminifi/test/jni-tests/CMakeLists.txt
+++ b/libminifi/test/jni-tests/CMakeLists.txt
@@ -28,11 +28,8 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/librdkafka-0.11.1/src-cpp")
 	createTests("${testfilename}")
 	target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-	if (APPLE)
-	      target_link_libraries (${testfilename} -Wl,-all_load minifi-rdkafka-extensions)
-	else ()
-	    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-rdkafka-extensions -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-jni)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/kafka-tests/CMakeLists.txt b/libminifi/test/kafka-tests/CMakeLists.txt
index 5172ca2..d337bd3 100644
--- a/libminifi/test/kafka-tests/CMakeLists.txt
+++ b/libminifi/test/kafka-tests/CMakeLists.txt
@@ -28,11 +28,8 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/librdkafka-0.11.4/src-cpp")
 	createTests("${testfilename}")
 	target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-	if (APPLE)
-	      target_link_libraries (${testfilename} -Wl,-all_load minifi-rdkafka-extensions)
-	else ()
-	    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-rdkafka-extensions -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-rdkafka-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/mqtt-tests/CMakeLists.txt b/libminifi/test/mqtt-tests/CMakeLists.txt
index 1e465b1..3b0d482 100644
--- a/libminifi/test/mqtt-tests/CMakeLists.txt
+++ b/libminifi/test/mqtt-tests/CMakeLists.txt
@@ -28,11 +28,8 @@
 	target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/thirdparty/librdkafka-0.11.1/src-cpp")
 	createTests("${testfilename}")
 	target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-	if (APPLE)
-	      target_link_libraries (${testfilename} -Wl,-all_load minifi-rdkafka-extensions)
-	else ()
-	    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-rdkafka-extensions -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-mqtt-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/pcap-tests/CMakeLists.txt b/libminifi/test/pcap-tests/CMakeLists.txt
index f66333c..8af7084 100644
--- a/libminifi/test/pcap-tests/CMakeLists.txt
+++ b/libminifi/test/pcap-tests/CMakeLists.txt
@@ -28,11 +28,8 @@
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/pcap/")
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_BINARY_DIR}/extensions/pcap/pcap++/Dist/header/")
     createTests("${testfilename}")
-    if(APPLE)    
-        target_link_libraries ("${testfilename}" -Wl,-all_load minifi-pcap minifi-standard-processors)
-	else()
-        target_link_libraries ("${testfilename}" -Wl,--whole-archive minifi-pcap minifi-standard-processors -Wl,--no-whole-archive)
-  	endif()
+    target_wholearchive_library(${testfilename} minifi-pcap)
+    target_wholearchive_library(${testfilename} minifi-standard-processors)
   MATH(EXPR PCAP_INT_TEST_COUNT "${PCAP_INT_TEST_COUNT}+1")
 ENDFOREACH()
 
diff --git a/libminifi/test/rocksdb-tests/CMakeLists.txt b/libminifi/test/rocksdb-tests/CMakeLists.txt
index 96c9fd7..67b4a46 100644
--- a/libminifi/test/rocksdb-tests/CMakeLists.txt
+++ b/libminifi/test/rocksdb-tests/CMakeLists.txt
@@ -26,11 +26,8 @@
   	target_include_directories(${testfilename} BEFORE PRIVATE "${ROCKSDB_THIRDPARTY_ROOT}/include")
 	createTests("${testfilename}")	
 	target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
-  	if (APPLE)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-rocksdb-repos)
-	else ()
-	  	target_link_libraries (${testfilename} -Wl,--whole-archive minifi-rocksdb-repos -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-rocksdb-repos)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR ROCKSDB_TEST_COUNT "${ROCKSDB_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/script-tests/CMakeLists.txt b/libminifi/test/script-tests/CMakeLists.txt
index b2311ed..5ac0314 100644
--- a/libminifi/test/script-tests/CMakeLists.txt
+++ b/libminifi/test/script-tests/CMakeLists.txt
@@ -35,11 +35,8 @@
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/script/python")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/pybind11/include")
 	add_definitions(-DPYTHON_SUPPORT)
-	if (APPLE)
-		target_link_libraries ("${testfilename}" -Wl,-all_load ${ZLIB_LIBRARIES} minifi-script-extensions minifi-standard-processors )
-	else ()
-		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARIES}  minifi-script-extensions minifi-standard-processors -Wl,--no-whole-archive)
-	endif()
+	target_wholearchive_library(${testfilename} minifi-script-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	createTests("${testfilename}")
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
@@ -53,11 +50,8 @@
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/script/lua")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/sol2-2.17.5")
 	add_definitions(-DLUA_SUPPORT)
-	if (APPLE)
-		target_link_libraries ("${testfilename}"  -Wl,-all_load ${ZLIB_LIBRARIES} minifi-script-extensions )
-	else ()
-		target_link_libraries ("${testfilename}" -Wl,--whole-archive ${ZLIB_LIBRARIES}  minifi-script-extensions minifi-standard-processors -Wl,--no-whole-archive)
-	endif()
+	target_wholearchive_library(${testfilename} minifi-script-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	createTests("${testfilename}")
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
diff --git a/libminifi/test/sensors-tests/CMakeLists.txt b/libminifi/test/sensors-tests/CMakeLists.txt
index 767fd57..8f99d79 100644
--- a/libminifi/test/sensors-tests/CMakeLists.txt
+++ b/libminifi/test/sensors-tests/CMakeLists.txt
@@ -29,12 +29,10 @@
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/sensors/")
   	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_BINARY_DIR}/extensions/sensors/")
     createTests("${testfilename}")
-    if(APPLE)    
-    	target_link_libraries ("${testfilename}" -Wl,-all_load minifi-sensors )
-	else()
-  		target_link_libraries ("${testfilename}" -Wl,--whole-archive minifi-sensors -Wl,--no-whole-archive)
-  	endif()
-  MATH(EXPR SENSORS_INT_TEST_COUNT "${SENSORS_INT_TEST_COUNT}+1")
+	target_wholearchive_library(${testfilename} minifi-sensors)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
+
+    MATH(EXPR SENSORS_INT_TEST_COUNT "${SENSORS_INT_TEST_COUNT}+1")
 ENDFOREACH()
 
 message("-- Finished building ${SENSORS_INT_TEST_COUNT} sensor(s) test file(s)...")
diff --git a/libminifi/test/sqlite-tests/CMakeLists.txt b/libminifi/test/sqlite-tests/CMakeLists.txt
index c039101..939246c 100644
--- a/libminifi/test/sqlite-tests/CMakeLists.txt
+++ b/libminifi/test/sqlite-tests/CMakeLists.txt
@@ -27,11 +27,8 @@
   target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/sqlite")
   target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/sqlite")
 
-  if (APPLE)
-    target_link_libraries (${testfilename} -Wl,-all_load minifi-sqlite-extensions minifi-standard-processors)
-  else ()
-    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-sqlite-extensions minifi-standard-processors -Wl,--no-whole-archive)
-  endif ()
+  target_wholearchive_library(${testfilename} minifi-sqlite-extensions)
+  target_wholearchive_library(${testfilename} minifi-standard-processors)
 
   createTests("${testfilename}")
   target_link_libraries(${testfilename} ${CATCH_MAIN_LIB})
diff --git a/libminifi/test/tensorflow-tests/CMakeLists.txt b/libminifi/test/tensorflow-tests/CMakeLists.txt
index 906b325..c7e68eb 100644
--- a/libminifi/test/tensorflow-tests/CMakeLists.txt
+++ b/libminifi/test/tensorflow-tests/CMakeLists.txt
@@ -24,16 +24,13 @@
 SET(EXTENSIONS_TEST_COUNT 0)
 FOREACH(testfile ${TENSORFLOW_INTEGRATION_TESTS})
 	get_filename_component(testfilename "${testfile}" NAME_WE)
-	add_executable("${testfilename}" "${testfile}" ${SPD_SOURCES} "${TEST_DIR}/TestBase.cpp")
+	add_executable("${testfilename}" "${testfile}" "${TEST_DIR}/TestBase.cpp")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/tensorflow")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors")
 	target_include_directories(${testfilename} PRIVATE BEFORE ${TENSORFLOW_INCLUDE_DIRS})
 	createTests("${testfilename}")
-	if (APPLE)
-		target_link_libraries (${testfilename} -Wl,-all_load minifi-tensorflow-extensions)
-	else ()
-	    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-tensorflow-extensions minifi-standard-processors -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-tensorflow-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/libminifi/test/usb-camera-tests/CMakeLists.txt b/libminifi/test/usb-camera-tests/CMakeLists.txt
index c00b300..242131c 100644
--- a/libminifi/test/usb-camera-tests/CMakeLists.txt
+++ b/libminifi/test/usb-camera-tests/CMakeLists.txt
@@ -22,15 +22,12 @@
 SET(EXTENSIONS_TEST_COUNT 0)
 FOREACH(testfile ${USB_CAMERA_INTEGRATION_TESTS})
 	get_filename_component(testfilename "${testfile}" NAME_WE)
-	add_executable("${testfilename}" "${testfile}" ${SPD_SOURCES} "${TEST_DIR}/TestBase.cpp")
+	add_executable("${testfilename}" "${testfile}" "${TEST_DIR}/TestBase.cpp")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/usb-camera")
 	target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/thirdparty/libuvc-0.0.6/include")
 	createTests("${testfilename}")
-	if (APPLE)
-	      target_link_libraries (${testfilename} -Wl,-all_load minifi-usb-camera-extensions)
-	else ()
-	    target_link_libraries (${testfilename} -Wl,--whole-archive minifi-usb-camera-extensions -Wl,--no-whole-archive)
-	endif ()
+	target_wholearchive_library(${testfilename} minifi-usb-camera-extensions)
+	target_wholearchive_library(${testfilename} minifi-standard-processors)
 	MATH(EXPR EXTENSIONS_TEST_COUNT "${EXTENSIONS_TEST_COUNT}+1")
 	add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR})
 ENDFOREACH()
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index 3634bf0..ef0eaf3 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -23,8 +23,7 @@
   CMAKE_POLICY(SET CMP0048 OLD)
 ENDIF(POLICY CMP0048)
 
-include_directories(../libminifi/include ../thirdparty/cron ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../thirdparty/rapidjson-1.1.0/include ../thirdparty/)
-include_directories(${JEMALLOC_INCLUDE_DIRS})
+include_directories(../libminifi/include)
 
 if(WIN32)
 	add_definitions(-DWIN32_LEAN_AND_MEAN)
@@ -69,47 +68,13 @@
   target_link_libraries(minifiexe "${CMAKE_THREAD_LIBS_INIT}")
 endif()
 
-set (WIN32_ARCHIVES "")
+target_wholearchive_library(minifiexe core-minifi)
+target_wholearchive_library(minifiexe minifi)
 
-# Link against minifi, yaml-cpp, civetweb-cpp, uuid, openssl, and rocksdb
-#target_link_libraries(minifiexe core-minifi)
-
-if (APPLE)
-	target_link_libraries (minifiexe -Wl,-all_load core-minifi)
-elseif(NOT WIN32)
-	target_link_libraries (minifiexe -Wl,--whole-archive core-minifi -Wl,--no-whole-archive)
-else()
-	#target_link_libraries (minifiexe core-minifi)
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:core-minifi")
-#	set_target_properties(minifiexe PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:core-minifi")
-endif ()
-
-# Include OpenSSL
-if (OPENSSL_FOUND)
-	if (APPLE)
-		target_link_libraries(minifiexe -Wl,-all_load ${OPENSSL_LIBRARIES})
-	elseif(NOT WIN32)
-		target_link_libraries(minifiexe -Wl,--whole-archive ${OPENSSL_LIBRARIES} -Wl,--no-whole-archive)
-	else()
-	target_link_libraries(minifiexe ${OPENSSL_LIBRARIES})
-	endif()
-	include_directories(${OPENSSL_INCLUDE_DIR})
-endif(OPENSSL_FOUND)
-
-add_dependencies(minifiexe minifi)
-
-
-if (APPLE)
-	target_link_libraries (minifiexe -Wl,-all_load minifi)
-elseif(NOT WIN32)
-	target_link_libraries (minifiexe -Wl,--whole-archive minifi -Wl,--no-whole-archive)
-else()
-	target_link_libraries (minifiexe minifi)
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi")
-	#set_target_properties(minifiexe PROPERTIES LINK_FLAGS "${LINK_FLAGS} /WHOLEARCHIVE:minifi")
-endif ()
-
-target_link_libraries(minifiexe yaml-cpp ${JEMALLOC_LIBRARIES}) #
+target_link_libraries(minifiexe yaml-cpp)
+if(NOT WIN32 AND ENABLE_JNI AND NOT DISABLE_JEMALLOC)
+	target_link_libraries(minifiexe JeMalloc::JeMalloc)
+endif()
 
 if (WIN32)
 	include_directories("../thirdparty/Simple-Windows-Posix-Semaphore")
@@ -123,34 +88,13 @@
 	endif(LIBC_STATIC)
 endif(NOT USE_SHARED_LIBS)
 
-if (APPLE)
-	get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
-	foreach(EXTENSION ${extensions})
-		message("Linking MiNiFiMain against ${EXTENSION}")
-		target_link_libraries (minifiexe -Wl,-all_load ${EXTENSION})
-		add_dependencies(minifiexe ${EXTENSION})
-	endforeach()    
-else ()
-	get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
-	foreach(EXTENSION ${extensions})
-	if (WIN32)
-	target_link_libraries (minifiexe ${EXTENSION})
-	  set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:${EXTENSION}")
-	  add_dependencies(minifiexe ${EXTENSION})
-    else()
-	  target_link_libraries (minifiexe -Wl,--whole-archive ${EXTENSION} -Wl,--no-whole-archive)
-	  add_dependencies(minifiexe ${EXTENSION})
-	  endif()
-	endforeach()
-endif ()
+get_property(extensions GLOBAL PROPERTY EXTENSION-OPTIONS)
+foreach(EXTENSION ${extensions})
+	message("Linking MiNiFiMain against ${EXTENSION}")
+	target_wholearchive_library(minifiexe ${EXTENSION})
+endforeach()
 
-if(WIN32)
-	set_target_properties(minifiexe PROPERTIES LINK_FLAGS "${LINK_FLAGS} ${WIN32_ARCHIVES}")
-endif()
-set_target_properties(minifiexe
-        PROPERTIES OUTPUT_NAME minifi)
-
-               
+set_target_properties(minifiexe PROPERTIES OUTPUT_NAME minifi)
 
 if (NOT WIN32)
 add_custom_command(TARGET minifiexe POST_BUILD
diff --git a/nanofi/CMakeLists.txt b/nanofi/CMakeLists.txt
index 7110519..a941676 100644
--- a/nanofi/CMakeLists.txt
+++ b/nanofi/CMakeLists.txt
@@ -24,8 +24,7 @@
 ENDIF(POLICY CMP0048)
 
 include_directories(include)
-include_directories(../libminifi/include ../thirdparty/cron ../thirdparty/spdlog-20170710/include)
-include_directories(../thirdparty/ut)
+include_directories(../libminifi/include)
 
 if(WIN32)
 include_directories(../libminifi/opsys/win)
@@ -65,42 +64,23 @@
 
 add_library(nanofi STATIC ${NANOFI_SOURCES})
 
-if (APPLE)
-	target_link_libraries (nanofi -Wl,-all_load core-minifi minifi minifi-standard-processors)
-elseif(NOT WIN32)
-	target_link_libraries (nanofi -Wl,--whole-archive core-minifi minifi minifi-standard-processors -Wl,--no-whole-archive)
-else()
-    set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:core-minifi")
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi")
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi-standard-processors")
-endif ()
+target_link_libraries(nanofi spdlog ut)
+target_wholearchive_library(nanofi core-minifi)
+target_wholearchive_library(nanofi minifi)
+target_wholearchive_library(nanofi minifi-standard-processors)
 
-add_dependencies(nanofi minifi-standard-processors)
-
-if(WIN32)
-	set_target_properties(nanofi PROPERTIES LINK_FLAGS "${WIN32_ARCHIVES}")
-endif()
 
 if (ENABLE_PYTHON AND NOT STATIC_BUILD)
 
 add_library(nanofi-shared SHARED ${NANOFI_SOURCES})
 
-if (APPLE)
-	target_link_libraries (nanofi-shared -Wl,-all_load core-minifi-shared minifi-shared minifi-standard-processors)
-elseif(NOT WIN32)
-	target_link_libraries (nanofi-shared -Wl,--whole-archive core-minifi-shared minifi-shared  minifi-standard-processors -Wl,--no-whole-archive)
-else()
-    set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:core-minifi-shared")
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi-shared")
-	set(WIN32_ARCHIVES "${WIN32_ARCHIVES} /WHOLEARCHIVE:minifi-standard-processors")
-endif ()
+target_link_libraries(nanofi-shared spdlog ut)
+target_wholearchive_library(nanofi-shared core-minifi-shared)
+target_wholearchive_library(nanofi-shared minifi-shared)
+target_wholearchive_library(nanofi-shared minifi-standard-processors)
 
 add_dependencies(nanofi-shared minifi-standard-processors)
 
-if(WIN32)
-	set_target_properties(nanofi-shared PROPERTIES LINK_FLAGS "${WIN32_ARCHIVES}")
-endif()
-
 set_property(TARGET nanofi-shared PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 endif(ENABLE_PYTHON AND NOT STATIC_BUILD)
diff --git a/nanofi/ecu/CMakeLists.txt b/nanofi/ecu/CMakeLists.txt
index fccb443..9c9e314 100644
--- a/nanofi/ecu/CMakeLists.txt
+++ b/nanofi/ecu/CMakeLists.txt
@@ -19,26 +19,17 @@
 
 cmake_minimum_required(VERSION 2.6)
 
-if (APPLE)
-    set(LINK_FLAGS "-Wl,-all_load")
-    set(LINK_END_FLAGS "")
-elseif (UNIX)
-    set(LINK_FLAGS "-Wl,--whole-archive")
-    set(LINK_END_FLAGS "")
-endif ()
 
 if (NOT WIN32)
-
 add_executable(log_aggregator log_aggregator.c)
-
-target_link_libraries(log_aggregator nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_link_libraries(log_aggregator nanofi ${CMAKE_THREAD_LIBS_INIT})
+target_wholearchive_library(log_aggregator minifi-http-curl)
 
 add_executable(tailfile_chunk tailfile_chunk.c)
-
-target_link_libraries(tailfile_chunk nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_link_libraries(tailfile_chunk nanofi ${CMAKE_THREAD_LIBS_INIT})
+target_wholearchive_library(tailfile_chunk minifi-http-curl)
 
 add_executable(tailfile_delimited tailfile_delimited.c)
-
-target_link_libraries(tailfile_delimited nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
-
-endif()
\ No newline at end of file
+target_link_libraries(tailfile_delimited nanofi ${CMAKE_THREAD_LIBS_INIT})
+target_wholearchive_library(tailfile_delimited minifi-http-curl)
+endif()
diff --git a/nanofi/examples/CMakeLists.txt b/nanofi/examples/CMakeLists.txt
index 6a9779c..fa1be9f 100644
--- a/nanofi/examples/CMakeLists.txt
+++ b/nanofi/examples/CMakeLists.txt
@@ -46,24 +46,14 @@
 
 endif()
 
-if (WIN32)
-    set(LINK_FLAGS "/WHOLEARCHIVE")
-    set(LINK_END_FLAGS "")
-elseif (APPLE)
-    set(LINK_FLAGS "-Wl,-all_load")
-    set(LINK_END_FLAGS "")
-else ()
-    set(LINK_FLAGS "-Wl,--whole-archive")
-    set(LINK_END_FLAGS "")
-endif ()
-
 if (NOT WIN32)
 
 add_executable(generate_flow generate_flow.c)
 
 add_executable(terminate_handler terminate_handler.c)
 
-target_link_libraries(generate_flow nanofi ${CMAKE_THREAD_LIBS_INIT} ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_wholearchive_library(generate_flow minifi-http-curl)
+target_link_libraries(generate_flow nanofi ${CMAKE_THREAD_LIBS_INIT})
 
 target_link_libraries(terminate_handler nanofi ${CMAKE_THREAD_LIBS_INIT} )
 
@@ -73,14 +63,17 @@
 
 add_executable(transmit_flow transmit_flow.c)
 
-target_link_libraries(transmit_flow nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_wholearchive_library(transmit_flow minifi-http-curl)
+target_link_libraries(transmit_flow nanofi ${CMAKE_THREAD_LIBS_INIT})
 
 add_executable(transmit_payload transmit_payload.c)
 
-target_link_libraries(transmit_payload nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_wholearchive_library(transmit_payload minifi-http-curl)
+target_link_libraries(transmit_payload nanofi ${CMAKE_THREAD_LIBS_INIT})
 
 add_executable(monitor_directory monitor_directory.c)
 
-target_link_libraries(monitor_directory nanofi ${CMAKE_THREAD_LIBS_INIT}  ${LINK_FLAGS} minifi-http-curl ${LINK_END_FLAGS})
+target_wholearchive_library(monitor_directory minifi-http-curl)
+target_link_libraries(monitor_directory nanofi ${CMAKE_THREAD_LIBS_INIT})
 
 endif()
diff --git a/python/library/CMakeLists.txt b/python/library/CMakeLists.txt
index 684cf22..4a94271 100644
--- a/python/library/CMakeLists.txt
+++ b/python/library/CMakeLists.txt
@@ -23,7 +23,7 @@
   CMAKE_POLICY(SET CMP0048 OLD)
 ENDIF(POLICY CMP0048)
 
-include_directories(../../nanofi/include/ ../../libminifi/include  ../../libminifi/include/c2  ../../libminifi/include/c2/protocols/  ../../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../../libminifi/include/core/yaml  ../../libminifi/include/core  ../../thirdparty/spdlog-20170710/include ../../thirdparty/concurrentqueue ../../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../../thirdparty/civetweb-1.9.1/include ../../thirdparty/)
+include_directories(../../nanofi/include/ ../../libminifi/include  ../../libminifi/include/c2  ../../libminifi/include/c2/protocols/  ../../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics  ../../libminifi/include/core/yaml  ../../libminifi/include/core ../../thirdparty/)
 if(WIN32)
 	include_directories(../../libminifi/opsys/win)
 else()
@@ -38,13 +38,4 @@
 	target_link_libraries(python-lib nanofi-shared core-minifi-shared minifi-shared)
 endif(APPLE)
 
-if (WIN32)
-target_link_libraries(python-lib ${CURL_LIBRARY}  minifi-http-curl)
-    set_target_properties(python-lib PROPERTIES
-        LINK_FLAGS "/WHOLEARCHIVE:minifi-http-curl"
-    )
-elseif (APPLE)
-	target_link_libraries(python-lib ${CURL_LIBRARY}  -Wl,-all_load minifi-http-curl)
-else ()
-	target_link_libraries(python-lib -Wl,--whole-archive minifi-http-curl -Wl,--no-whole-archive ${CURL_LIBRARY} )
-endif ()
\ No newline at end of file
+target_wholearchive_library(python-lib minifi-http-curl)
diff --git a/thirdparty/bustache/CMakeLists.txt b/thirdparty/bustache/CMakeLists.txt
deleted file mode 100644
index 0fefa02..0000000
--- a/thirdparty/bustache/CMakeLists.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
-
-#set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} )
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")
-
-project(bustache VERSION 1.0.0 LANGUAGES CXX)
-
-option(BUSTACHE_ENABLE_TESTING "Enable testing of the bustache library." OFF)
-
-# Set the default CMAKE_BUILD_TYPE to Release.
-# This should be done before the project command since the latter can set
-# CMAKE_BUILD_TYPE itself (it does so for nmake).
-if (NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE Release CACHE STRING
-    "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
-endif()
-
-add_library(${PROJECT_NAME}
-    src/format.cpp
-    src/generate.cpp
-)
-
-find_package(Boost REQUIRED)
-
-# Define headers for this library. PUBLIC headers are used for
-# compiling the library, and will be added to consumers' build
-# paths.
-target_include_directories(${PROJECT_NAME}
-    PUBLIC
-        include
-        ${Boost_INCLUDE_DIR}
-)
-
-# If we have compiler requirements for this library, list them here
-# target_compile_features(${PROJECT_NAME}
-#     PUBLIC
-#         cxx_alias_templates
-#         cxx_auto_type
-#         cxx_decltype_auto
-#         cxx_user_literals
-#         cxx_rvalue_references
-#         cxx_range_for
-#         cxx_nullptr
-#         cxx_noexcept
-#         cxx_inline_namespaces
-# )
-
-set_target_properties(${PROJECT_NAME} PROPERTIES
-    CXX_STANDARD 11
-)
-
-# 'make install' to the correct location
-install(TARGETS ${PROJECT_NAME}
-    ARCHIVE  DESTINATION lib
-    LIBRARY  DESTINATION lib
-    RUNTIME  DESTINATION bin  # This is for Windows
-)
-
-install(DIRECTORY include/ DESTINATION include)
-
-if (BUSTACHE_ENABLE_TESTING)
-    enable_testing()
-    add_subdirectory(test)
-endif()
diff --git a/thirdparty/bustache/README.md b/thirdparty/bustache/README.md
deleted file mode 100644
index d453a04..0000000
--- a/thirdparty/bustache/README.md
+++ /dev/null
@@ -1,267 +0,0 @@
-{{ bustache }} [![Try it online][badge.wandbox]](https://wandbox.org/permlink/Vxmrb2GgcLKicC7N)
-========
-
-C++11 implementation of [{{ mustache }}](http://mustache.github.io/), compliant with [spec](https://github.com/mustache/spec) v1.1.3.
-
-## Dependencies
-* [Boost](http://www.boost.org/) - for `unordered_map`, etc
-
-### Optional Dependencies
-* [Google.Benchmark](https://github.com/google/benchmark) - for benchmark
-* [Catch](https://github.com/philsquared/Catch) - for test
-
-## Supported Features
-* Variables
-* Sections
-* Inverted Sections
-* Comments
-* Partials
-* Set Delimiter
-* Lambdas
-* HTML escaping *(configurable)*
-* Template inheritance *(extension)*
-
-## Basics
-{{ mustache }} is a template language for text-replacing.
-When it comes to formatting, there are 2 essential things -- _Format_ and _Data_.
-{{ mustache }} also allows an extra lookup-context for _Partials_.
-In {{ bustache }}, we represent the _Format_ as a `bustache::format` object, and `bustache::object` for _Data_, and anything that provides interface that is compatible with `Map<std::string, bustache::format>` can be used for _Partials_.
-The _Format_ is orthogonal to the _Data_, so techincally you can use your custom _Data_ type with `bustache::format`, but then you have to write the formatting logic yourself.
-
-### Quick Example
-```c++
-bustache::format format{"{{mustache}} templating"};
-bustache::object data{{"mustache", "bustache"}};
-std::cout << format(data); // should print "bustache templating"
-```
-
-## Manual
-
-### Data Model
-It's basically the JSON Data Model represented in C++, with some extensions.
-
-#### Header
-`#include <bustache/model.hpp>`
-
-#### Synopsis
-```c++
-using array = std::vector<value>;
-using object = boost::unordered_map<std::string, value>;
-using lambda0v = std::function<value()>;
-using lambda0f = std::function<format()>;
-using lambda1v = std::function<value(ast::content_list const&)>;
-using lambda1f = std::function<format(ast::content_list const&)>;
-
-class value =
-    variant
-    <
-        std::nullptr_t
-      , bool
-      , int
-      , double
-      , std::string
-      , array
-      , lambda0v
-      , lambda0f
-      , lambda1v
-      , lambda1f
-      , object
-    >;
-```
-### Format Object
-`bustache::format` parses in-memory string into AST.
-
-#### Header
-`#include <bustache/format.hpp>`
-
-#### Synopsis
-*Constructors*
-```c++
-format(char const* begin, char const* end); // [1]
-
-template<std::size_t N>
-explicit format(char const (&source)[N]); // [2]
-
-template<class Source>
-explicit format(Source const& source); // [3]
-
-template <typename Source>
-explicit format(Source const&& source); // [4]
-
-explicit format(ast::content_list contents, bool copytext = true); // [5]
-```
-* `Source` is an object that represents continous memory, like `std::string`, `std::vector<char>` or `boost::iostreams::mapped_file_source` that provides access to raw memory through `source.data()` and `source.size()`.
-* Version 2 allows implicit conversion from literal.
-* Version 1~3 doesn't hold the text, you must ensure the memory referenced is valid and not modified at the use of the format object.
-* Version 4 copies the necessary text into its internal buffer, so there's no lifetime issue.
-* Version 5 takes a `ast::content_list`, if `copytext == true` the text will be copied into the internal buffer.
-
-*Manipulator*
-```c++
-template <typename T>
-manipulator<T, no_context>
-operator()(T const& data, option_type flag = normal) const;
-
-template <typename T, typename Context>
-manipulator<T, Context>
-operator()(T const& data, Context const& context, option_type flag = normal) const;
-```
-* `Context` is any associative container `Map<std::string, bustache::format>`, which is referenced by _Partials_.
-* `option_type` provides 2 options: `normal` and `escape_html`, if `normal` is chosen, there's no difference between `{{Tag}}` and `{{{Tag}}}`, the text won't be escaped in both cases.
-
-### Stream-based Output
-Output directly to the `std::basic_ostream`.
-
-#### Synopsis
-```c++
-// in <bustache/model.hpp>
-template<class CharT, class Traits, class T, class Context,
-    std::enable_if_t<std::is_constructible<value::view, T>::value, bool> = true>
-inline std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& out, manipulator<T, Context> const& manip)
-```
-
-#### Example
-```c++
-// open the template file
-boost::iostreams::mapped_file_source file(...);
-// create format from source
-bustache::format format(file);
-// create the data we want to output
-bustache::object data{...};
-// create the context for Partials
-std::unordered_map<std::string, bustache::format> context{...};
-// output the result
-std::cout << format(data, context, bustache::escape_html);
-```
-Note that you can output anything that constitutes `bustache::value`, not just `bustache::object`.
-
-### String Output
-Generate a `std::string` from a `manipulator`.
-
-#### Synopsis
-```c++
-// in <bustache/model.hpp>
-template<class T, class Context,
-    std::enable_if_t<std::is_constructible<value::view, T>::value, bool> = true>
-inline std::string to_string(manipulator<T, Context> const& manip)
-```
-#### Example
-```c++
-bustache::format format(...);
-std::string txt = to_string(format(data, context, bustache::escape_html));
-```
-
-### Generate API
-`generate` can be used for customized output.
-
-#### Header
-`#include <bustache/generate.hpp>`
-
-```c++
-template<class Sink>
-inline void generate
-(
-    Sink& sink, format const& fmt, value::view const& data,
-    option_type flag = normal
-);
-
-template<class Sink, class Context>
-void generate
-(
-    Sink& sink, format const& fmt, value::view const& data,
-    Context const& context, option_type flag = normal
-);
-```
-`Sink` is a polymorphic functor that handles:
-```c++
-void operator()(char const* it, char const* end);
-void operator()(bool data);
-void operator()(int data);
-void operator()(double data);
-```
-You don't have to deal with HTML-escaping yourself, it's handled within `generate` depending on the option.
-
-### Predefined Generators
-These are predefined output built on `generate`.
-
-#### Header
-* `#include <bustache/generate/ostream.hpp>`
-* `#include <bustache/generate/string.hpp>`
-
-```c++
-template<class CharT, class Traits, class Context>
-void generate_ostream
-(
-    std::basic_ostream<CharT, Traits>& out, format const& fmt,
-    value::view const& data, Context const& context, option_type flag
-);
-
-template<class String, class Context>
-void generate_string
-(
-    String& out, format const& fmt,
-    value::view const& data, Context const& context, option_type flag
-);
-```
-
-#### Note
-The stream-based output and string output are built on these functions,
-but `<bustache/model.hpp>` doesn't include these headers and only supports `char` output,
-if you need other char-type support for stream/string output, you have to include these headers as well.
-
-
-## Advanced Topics
-### Lambdas
-The lambdas in {{ bustache }} have 4 variants - they're production of 2 param-set x 2 return-type.
-One param-set accepts no params, the other accepts a `bustache::ast::content_list const&`.
-One return-type is `bustache::value`, the other is `bustache::format`.
-
-Note that unlike other implementations, we pass a `bustache::ast::content_list` instead of a raw string.
-A `content_list` is a parsed list of AST nodes, you can make a new `content_list` out of the old one and give it to a `bustache::format`.
-
-### Error Handling
-The constructor of `bustache::format` may throw `bustache::format_error` if the parsing fails.
-```
-class format_error : public std::runtime_error
-{
-public:
-    explicit format_error(error_type err);
-
-    error_type code() const;
-};
-```
-`error_type` has these values:
-* error_set_delim
-* error_baddelim
-* error_delim
-* error_section
-* error_badkey
-
-You can also use `what()` for a descriptive text.
-
-## Performance
-Compare with 2 other libs - [mstch](https://github.com/no1msd/mstch) and [Kainjow.Mustache](https://github.com/kainjow/Mustache).
-See [benchmark.cpp](test/benchmark.cpp). 
-
-Sample run (VS2015 Update 3, boost 1.60.0, 64-bit release build):
-```
-Benchmark               Time           CPU Iterations
------------------------------------------------------
-bustache_usage       6325 ns       6397 ns     112179
-mstch_usage        140822 ns     140795 ns       4986
-kainjow_usage       47354 ns      47420 ns      14475
-```
-Lower is better.
-
-![benchmark](doc/benchmark.png?raw=true)
-
-## License
-
-    Copyright (c) 2014-2017 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-<!-- Links -->
-[badge.Wandbox]: https://img.shields.io/badge/try%20it-online-green.svg
diff --git a/thirdparty/bustache/cmake/FindCatch.cmake b/thirdparty/bustache/cmake/FindCatch.cmake
deleted file mode 100644
index f5c2e7d..0000000
--- a/thirdparty/bustache/cmake/FindCatch.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-find_path(
-	CATCH_INCLUDE_DIR 
-	NAMES catch.hpp
-)
-
-set(CATCH_INCLUDE_DIRS ${CATCH_INCLUDE_DIR})
-
-include(FindPackageHandleStandardArgs)
-
-find_package_handle_standard_args(Catch DEFAULT_MSG
-	CATCH_INCLUDE_DIR)
-
-mark_as_advanced (CATCH_INCLUDE_DIR)
\ No newline at end of file
diff --git a/thirdparty/bustache/cmake/Modules/FindCatch.cmake b/thirdparty/bustache/cmake/Modules/FindCatch.cmake
deleted file mode 100644
index e596841..0000000
--- a/thirdparty/bustache/cmake/Modules/FindCatch.cmake
+++ /dev/null
@@ -1,14 +0,0 @@
-find_path(
-	CATCH_INCLUDE_DIR 
-	NAMES catch.hpp
-	DOC "catch include dir"
-)
-
-set(CATCH_INCLUDE_DIRS ${CATCH_INCLUDE_DIR})
-
-include(FindPackageHandleStandardArgs)
-
-find_package_handle_standard_args(Catch DEFAULT_MSG
-	CATCH_INCLUDE_DIR)
-
-mark_as_advanced (CATCH_INCLUDE_DIR)
\ No newline at end of file
diff --git a/thirdparty/bustache/doc/benchmark.png b/thirdparty/bustache/doc/benchmark.png
deleted file mode 100644
index e69de29..0000000
--- a/thirdparty/bustache/doc/benchmark.png
+++ /dev/null
diff --git a/thirdparty/bustache/example/in.mustache b/thirdparty/bustache/example/in.mustache
deleted file mode 100644
index 996db4f..0000000
--- a/thirdparty/bustache/example/in.mustache
+++ /dev/null
@@ -1,39 +0,0 @@
-<h1>{{header}}</h1>
-{{#bug}}
-{{/bug}}
-
-{{# items}}
-  {{#first}}
-    <li><strong>{{name}}</strong></li>
-  {{/first}}
-  {{#link}}
-    <li><a {{>href}}>{{name}}</a></li>
-  {{/link}}
-{{ /items}}
-
-{{#empty}}
-  <p>The list is empty.</p>
-{{/ empty }}
-
-{{=[ ]=}}
-
-[#array]([.])[/array]
-
-[#items]
-[count]->[count]->[count]
-[/items]
-
-[a.b.c] == [#a][#b][c][/b][/a]
-
-<div class="comments">
-    <h3>[header]</h3>
-    <ul>
-        [#comments]
-        <li class="comment">
-            <h5>[name]</h5>
-            <p>[body]</p>
-        </li>
-        <!--[count]-->
-        [/comments]
-    </ul>
-</div>
\ No newline at end of file
diff --git a/thirdparty/bustache/example/main.cpp b/thirdparty/bustache/example/main.cpp
deleted file mode 100644
index 4a7aea6..0000000
--- a/thirdparty/bustache/example/main.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#include <iostream>
-#include <bustache/model.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
-
-int main()
-{
-    using bustache::object;
-    using bustache::array;
-    using namespace bustache::literals;
-
-    boost::unordered_map<std::string, bustache::format> context
-    {
-        {"href", "href=\"{{url}}\""_fmt}
-    };
-
-    int n = 0;
-    object data
-    {
-        {"header", "Colors"},
-        {"items",
-            array
-            {
-                object
-                {
-                    {"name", "red"},
-                    {"first", true},
-                    {"url", "#Red"}
-                },
-                object
-                {
-                    {"name", "green"},
-                    {"link", true},
-                    {"url", "#Green"}
-                },
-                object
-                {
-                    {"name", "blue"},
-                    {"link", true},
-                    {"url", "#Blue"}
-                }
-            }
-        },
-        {"empty", false},
-        {"count", [&n] { return ++n; }},
-        {"array", array{1, 2, 3}},
-        {"a", object{{"b", object{{"c", true}}}}},
-        {"comments",
-            array
-            {
-                object
-                {
-                    {"name", "Joe"},
-                    {"body", "<html> should be escaped"}
-                },
-                object
-                {
-                    {"name", "Sam"},
-                    {"body", "{{mustache}} can be seen"}
-                },
-                object
-                {
-                    {"name", "New"},
-                    {"body", "break\nup"}
-                }
-            }
-        }
-    };
-
-    try
-    {
-        boost::iostreams::mapped_file_source file("in.mustache");
-        bustache::format format(file);
-        std::cout << "-----------------------\n";
-        std::cout << format(data, context, bustache::escape_html) << "\n";
-        std::cout << "-----------------------\n";
-    }
-    catch (const std::exception& e)
-    {
-        std::cerr << e.what();
-    }
-    return 0;
-}
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/ast.hpp b/thirdparty/bustache/include/bustache/ast.hpp
deleted file mode 100644
index 94e142e..0000000
--- a/thirdparty/bustache/include/bustache/ast.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2014-2017 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_AST_HPP_INCLUDED
-#define BUSTACHE_AST_HPP_INCLUDED
-
-#include <bustache/detail/variant.hpp>
-#include <boost/utility/string_ref.hpp>
-#include <boost/unordered_map.hpp>
-#include <vector>
-#include <string>
-
-namespace bustache { namespace ast
-{
-    struct variable;
-    struct section;
-    class content;
-
-    using text = boost::string_ref;
-
-    using content_list = std::vector<content>;
-
-    using override_map = boost::unordered_map<std::string, content_list>;
-
-    struct null {};
-
-    struct variable
-    {
-        std::string key;
-        char tag = '\0';
-#ifdef _MSC_VER // Workaround MSVC bug.
-        variable() = default;
-
-        explicit variable(std::string key, char tag = '\0')
-          : key(std::move(key)), tag(tag)
-        {}
-#endif
-    };
-
-    struct block
-    {
-        std::string key;
-        content_list contents;
-    };
-
-    struct section : block
-    {
-        char tag = '#';
-    };
-
-    struct partial
-    {
-        std::string key;
-        std::string indent;
-        override_map overriders;
-    };
-
-#define BUSTACHE_AST_CONTENT(X, D)                                              \
-    X(0, null, D)                                                               \
-    X(1, text, D)                                                               \
-    X(2, variable, D)                                                           \
-    X(3, section, D)                                                            \
-    X(4, partial, D)                                                            \
-    X(5, block, D)                                                              \
-/***/
-
-    class content : public variant_base<content>
-    {
-        BUSTACHE_AST_CONTENT(Zz_BUSTACHE_VARIANT_MATCH,)
-    public:
-        Zz_BUSTACHE_VARIANT_DECL(content, BUSTACHE_AST_CONTENT, true)
-
-        content() noexcept : _which(0), _0() {}
-    };
-#undef BUSTACHE_AST_CONTENT
-
-    inline bool is_null(content const& c)
-    {
-        return !c.which();
-    }
-}}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/debug.hpp b/thirdparty/bustache/include/bustache/debug.hpp
deleted file mode 100644
index 1235361..0000000
--- a/thirdparty/bustache/include/bustache/debug.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_DEBUG_HPP_INCLUDED
-#define BUSTACHE_DEBUG_HPP_INCLUDED
-
-#include <iostream>
-#include <iomanip>
-#include <bustache/format.hpp>
-
-namespace bustache { namespace detail
-{
-    template<class CharT, class Traits>
-    struct ast_printer
-    {
-        std::basic_ostream<CharT, Traits>& out;
-        unsigned level;
-        unsigned const space;
-
-        void operator()(ast::text const& text) const
-        {
-            indent();
-            auto i = text.begin();
-            auto i0 = i;
-            auto e = text.end();
-            out << "text: \"";
-            while (i != e)
-            {
-                char const* esc = nullptr;
-                switch (*i)
-                {
-                case '\r': esc = "\\r"; break;
-                case '\n': esc = "\\n"; break;
-                case '\\': esc = "\\\\"; break;
-                default: ++i; continue;
-                }
-                out.write(i0, i - i0);
-                i0 = ++i;
-                out << esc;
-            }
-            out.write(i0, i - i0);
-            out << "\"\n";
-        }
-
-        void operator()(ast::variable const& variable) const
-        {
-            indent();
-            out << "variable";
-            if (variable.tag)
-                out << "(&)";
-            out << ": " << variable.key << "\n";
-        }
-
-        void operator()(ast::section const& section)
-        {
-            out;
-            out << "section(" << section.tag << "): " << section.key << "\n";
-            ++level;
-            for (auto const& content : section.contents)
-                apply_visitor(*this, content);
-            --level;
-        }
-
-        void operator()(ast::partial const& partial) const
-        {
-            out << "partial: " << partial.key << "\n";
-        }
-
-        void operator()(ast::null) const {} // never called
-
-        void indent() const
-        {
-            out << std::setw(space * level) << "";
-        }
-    };
-}}
-
-namespace bustache
-{
-    template<class CharT, class Traits>
-    inline void print_ast(std::basic_ostream<CharT, Traits>& out, format const& fmt, unsigned indent = 4)
-    {
-        detail::ast_printer<CharT, Traits> visitor{out, 0, indent};
-        for (auto const& content : fmt.contents())
-            apply_visitor(visitor, content);
-    }
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/detail/any_context.hpp b/thirdparty/bustache/include/bustache/detail/any_context.hpp
deleted file mode 100644
index 78bf207..0000000
--- a/thirdparty/bustache/include/bustache/detail/any_context.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_DETAIL_ANY_CONTEXT_HPP_INCLUDED
-#define BUSTACHE_DETAIL_ANY_CONTEXT_HPP_INCLUDED
-
-#include <string>
-#include <utility>
-
-namespace bustache
-{
-    struct format;
-}
-
-namespace bustache { namespace detail
-{
-    struct any_context
-    {
-        using value_type = std::pair<std::string const, format>;
-        using iterator = value_type const*;
-
-        template<class Context>
-        any_context(Context const& context) noexcept
-            : _data(&context), _find(find_fn<Context>)
-        {}
-
-        iterator find(std::string const& key) const
-        {
-            return _find(_data, key);
-        }
-
-        iterator end() const
-        {
-            return nullptr;
-        }
-
-    private:
-
-        template<class Context>
-        static value_type const* find_fn(void const* data, std::string const& key)
-        {
-            auto ctx = static_cast<Context const*>(data);
-            auto it = ctx->find(key);
-            return it != ctx->end() ? &*it : nullptr;
-        }
-
-        void const* _data;
-        value_type const* (*_find)(void const*, std::string const&);
-    };
-}}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/detail/variant.hpp b/thirdparty/bustache/include/bustache/detail/variant.hpp
deleted file mode 100644
index 50c6c66..0000000
--- a/thirdparty/bustache/include/bustache/detail/variant.hpp
+++ /dev/null
@@ -1,362 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016-2017 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_DETAIL_VARIANT_HPP_INCLUDED
-#define BUSTACHE_DETAIL_VARIANT_HPP_INCLUDED
-
-#include <cassert>
-#include <cstdlib>
-#include <utility>
-#include <stdexcept>
-#include <type_traits>
-
-namespace bustache { namespace detail
-{
-    template<class T>
-    inline T& cast(void* data)
-    {
-        return *static_cast<T*>(data);
-    }
-
-    template<class T>
-    inline T const& cast(void const* data)
-    {
-        return *static_cast<T const*>(data);
-    }
-
-    template<class T, class U>
-    struct noexcept_ctor_assign
-    {
-        static constexpr bool value =
-            std::is_nothrow_constructible<T, U>::value &&
-            std::is_nothrow_assignable<T, U>::value;
-    };
-
-    struct ctor_visitor
-    {
-        using result_type = void;
-
-        void* data;
-
-        template<class T>
-        void operator()(T& t) const
-        {
-            new(data) T(std::move(t));
-        }
-
-        template<class T>
-        void operator()(T const& t) const
-        {
-            new(data) T(t);
-        }
-    };
-
-    struct assign_visitor
-    {
-        using result_type = void;
-
-        void* data;
-
-        template<class T>
-        void operator()(T& t) const
-        {
-            *static_cast<T*>(data) = std::move(t);
-        }
-
-        template<class T>
-        void operator()(T const& t) const
-        {
-            *static_cast<T*>(data) = t;
-        }
-    };
-
-    struct dtor_visitor
-    {
-        using result_type = void;
-
-        template<class T>
-        void operator()(T& t) const
-        {
-            t.~T();
-        }
-    };
-
-    template<class T>
-    struct type {};
-}}
-
-namespace bustache
-{
-    template<class T>
-    struct variant_base {};
-
-    template<class View>
-    struct variant_ptr
-    {
-        variant_ptr() noexcept : _data() {}
-
-        variant_ptr(std::nullptr_t) noexcept : _data() {}
-
-        variant_ptr(unsigned which, void const* data) noexcept
-            : _which(which), _data(data)
-        {}
-
-        explicit operator bool() const
-        {
-            return !!_data;
-        }
-
-        View operator*() const
-        {
-            return{_which, _data};
-        }
-
-        unsigned which() const
-        {
-            return _which;
-        }
-
-        void const* data() const
-        {
-            return _data;
-        }
-
-    private:
-
-        unsigned _which;
-        void const* _data;
-    };
-
-    class bad_variant_access : public std::exception
-    {
-    public:
-        bad_variant_access() noexcept {}
-
-        const char* what() const noexcept override
-        {
-            return "bustache::bad_variant_access";
-        }
-    };
-    
-    template<class Visitor, class Var>
-    inline auto visit(Visitor&& visitor, variant_base<Var>& v) ->
-        decltype(Var::switcher::common_ret((void*)nullptr, visitor))
-    {
-        auto& var = static_cast<Var&>(v);
-        return Var::switcher::visit(var.which(), var.data(), visitor);
-    }
-
-    template<class Visitor, class Var>
-    inline auto visit(Visitor&& visitor, variant_base<Var> const& v) ->
-        decltype(Var::switcher::common_ret((void const*)nullptr, visitor))
-    {
-        auto& var = static_cast<Var const&>(v);
-        return Var::switcher::visit(var.which(), var.data(), visitor);
-    }
-
-    // Synomym of visit (for Boost.Variant compatibility)
-    template<class Visitor, class Var>
-    inline auto apply_visitor(Visitor&& visitor, variant_base<Var>& v) ->
-        decltype(Var::switcher::common_ret((void*)nullptr, visitor))
-    {
-        return visit(std::forward<Visitor>(visitor), v);
-    }
-
-    template<class Visitor, class Var>
-    inline auto apply_visitor(Visitor&& visitor, variant_base<Var> const& v) ->
-        decltype(Var::switcher::common_ret((void const*)nullptr, visitor))
-    {
-        return visit(std::forward<Visitor>(visitor), v);
-    }
-
-    template<class T, class Var>
-    inline T& get(variant_base<Var>& v)
-    {
-        auto& var = static_cast<Var&>(v);
-        if (Var::switcher::index(detail::type<T>{}) == var.which())
-            return *static_cast<T*>(var.data());
-        throw bad_variant_access();
-    }
-
-    template<class T, class Var>
-    inline T const& get(variant_base<Var> const& v)
-    {
-        auto& var = static_cast<Var const&>(v);
-        if (Var::switcher::index(detail::type<T>{}) == var.which())
-            return *static_cast<T const*>(var.data());
-        throw bad_variant_access();
-    }
-
-    template<class T, class Var>
-    inline T* get(variant_base<Var>* vp)
-    {
-        if (vp)
-        {
-            auto v = static_cast<Var*>(vp);
-            if (Var::switcher::index(detail::type<T>{}) == v->which())
-                return static_cast<T*>(v->data());
-        }
-        return nullptr;
-    }
-
-    template<class T, class Var>
-    inline T const* get(variant_base<Var> const* vp)
-    {
-        if (vp)
-        {
-            auto v = static_cast<Var const*>(vp);
-            if (Var::switcher::index(detail::type<T>{}) == v->which())
-                return static_cast<T const*>(v->data());
-        }
-        return nullptr;
-    }
-
-    template<class T, class Var>
-    inline T const* get(variant_ptr<Var> const& vp)
-    {
-        if (vp)
-        {
-            if (Var::switcher::index(detail::type<T>{}) == vp.which())
-                return static_cast<T const*>(vp.data());
-        }
-        return nullptr;
-    }
-}
-
-#define Zz_BUSTACHE_UNREACHABLE(MSG) { assert(!MSG); std::abort(); }
-#define Zz_BUSTACHE_VARIANT_SWITCH(N, U, D) case N: return v(detail::cast<U>(data));
-#define Zz_BUSTACHE_VARIANT_RET(N, U, D) true ? v(detail::cast<U>(data)) :
-#define Zz_BUSTACHE_VARIANT_MEMBER(N, U, D) U _##N;
-#define Zz_BUSTACHE_VARIANT_CTOR(N, U, D)                                       \
-D(U val) noexcept : _which(N), _##N(std::move(val)) {}
-/***/
-#define Zz_BUSTACHE_VARIANT_INDEX(N, U, D)                                      \
-static constexpr unsigned index(detail::type<U>) { return N; }                  \
-/***/
-#define Zz_BUSTACHE_VARIANT_MATCH(N, U, D) static U match_type(U);
-#define Zz_BUSTACHE_VARIANT_DECL(VAR, TYPES, NOEXCPET)                          \
-struct switcher                                                                 \
-{                                                                               \
-    template<class T, class Visitor>                                            \
-    static auto common_ret(T* data, Visitor& v) ->                              \
-        decltype(TYPES(Zz_BUSTACHE_VARIANT_RET,) throw bad_variant_access());   \
-    template<class T, class Visitor>                                            \
-    static auto visit(unsigned which, T* data, Visitor& v) ->                   \
-        decltype(common_ret(data, v))                                           \
-    {                                                                           \
-        switch (which)                                                          \
-        {                                                                       \
-        TYPES(Zz_BUSTACHE_VARIANT_SWITCH,)                                      \
-        default: throw bad_variant_access();                                    \
-        }                                                                       \
-    }                                                                           \
-    TYPES(Zz_BUSTACHE_VARIANT_INDEX,)                                           \
-};                                                                              \
-private:                                                                        \
-unsigned _which;                                                                \
-union                                                                           \
-{                                                                               \
-    char _storage[1];                                                           \
-    TYPES(Zz_BUSTACHE_VARIANT_MEMBER,)                                          \
-};                                                                              \
-void invalidate()                                                               \
-{                                                                               \
-    if (valid())                                                                \
-    {                                                                           \
-        detail::dtor_visitor v;                                                 \
-        switcher::visit(_which, data(), v);                                     \
-        _which = ~0u;                                                           \
-    }                                                                           \
-}                                                                               \
-template<class T>                                                               \
-void do_init(T& other)                                                          \
-{                                                                               \
-    detail::ctor_visitor v{_storage};                                           \
-    switcher::visit(other._which, other.data(), v);                             \
-}                                                                               \
-template<class T>                                                               \
-void do_assign(T& other)                                                        \
-{                                                                               \
-    if (_which == other._which)                                                 \
-    {                                                                           \
-        detail::assign_visitor v{_storage};                                     \
-        switcher::visit(other._which, other.data(), v);                         \
-    }                                                                           \
-    else                                                                        \
-    {                                                                           \
-        invalidate();                                                           \
-        if (other.valid())                                                      \
-        {                                                                       \
-            do_init(other);                                                     \
-            _which = other._which;                                              \
-        }                                                                       \
-    }                                                                           \
-}                                                                               \
-public:                                                                         \
-unsigned which() const                                                          \
-{                                                                               \
-    return _which;                                                              \
-}                                                                               \
-bool valid() const                                                              \
-{                                                                               \
-    return _which != ~0u;                                                       \
-}                                                                               \
-void* data()                                                                    \
-{                                                                               \
-    return _storage;                                                            \
-}                                                                               \
-void const* data() const                                                        \
-{                                                                               \
-    return _storage;                                                            \
-}                                                                               \
-VAR(VAR&& other) noexcept(NOEXCPET) : _which(other._which)                      \
-{                                                                               \
-    do_init(other);                                                             \
-}                                                                               \
-VAR(VAR const& other) : _which(other._which)                                    \
-{                                                                               \
-    do_init(other);                                                             \
-}                                                                               \
-template<class T, class U = decltype(match_type(std::declval<T>()))>            \
-VAR(T&& other) noexcept(std::is_nothrow_constructible<U, T>::value)             \
-  : _which(switcher::index(detail::type<U>{}))                                  \
-{                                                                               \
-    new(_storage) U(std::forward<T>(other));                                    \
-}                                                                               \
-~VAR()                                                                          \
-{                                                                               \
-    if (valid())                                                                \
-    {                                                                           \
-        detail::dtor_visitor v;                                                 \
-        switcher::visit(_which, data(), v);                                     \
-    }                                                                           \
-}                                                                               \
-template<class T, class U = decltype(match_type(std::declval<T>()))>            \
-U& operator=(T&& other) noexcept(detail::noexcept_ctor_assign<U, T>::value)     \
-{                                                                               \
-    if (switcher::index(detail::type<U>{}) == _which)                           \
-        return *static_cast<U*>(data()) = std::forward<T>(other);               \
-    else                                                                        \
-    {                                                                           \
-        invalidate();                                                           \
-        auto p = new(_storage) U(std::forward<T>(other));                       \
-        _which = switcher::index(detail::type<U>{});                            \
-        return *p;                                                              \
-    }                                                                           \
-}                                                                               \
-VAR& operator=(VAR&& other) noexcept(NOEXCPET)                                  \
-{                                                                               \
-    do_assign(other);                                                           \
-    return *this;                                                               \
-}                                                                               \
-VAR& operator=(VAR const& other)                                                \
-{                                                                               \
-    do_assign(other);                                                           \
-    return *this;                                                               \
-}                                                                               \
-/***/
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/format.hpp b/thirdparty/bustache/include/bustache/format.hpp
deleted file mode 100644
index dd07740..0000000
--- a/thirdparty/bustache/include/bustache/format.hpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2014-2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_FORMAT_HPP_INCLUDED
-#define BUSTACHE_FORMAT_HPP_INCLUDED
-
-#include <bustache/ast.hpp>
-#include <stdexcept>
-#include <memory>
-
-namespace bustache
-{
-    struct format;
-    
-    using option_type = bool;
-    constexpr option_type normal = false;
-    constexpr option_type escape_html = true;
-
-    template<class T, class Context>
-    struct manipulator
-    {
-        format const& fmt;
-        T const& data;
-        Context const& context;
-        option_type const flag;
-    };
-
-    struct no_context
-    {
-        using value_type = std::pair<std::string const, format>;
-        using iterator = value_type const*;
-        
-        constexpr iterator find(std::string const&) const
-        {
-            return nullptr;
-        }
-        
-        constexpr iterator end() const
-        {
-            return nullptr;
-        }
-
-        static no_context const& dummy()
-        {
-            static no_context const _{};
-            return _;
-        }
-    };
-
-    enum error_type
-    {
-        error_set_delim,
-        error_baddelim,
-        error_delim,
-        error_section,
-        error_badkey
-    };
-
-    class format_error : public std::runtime_error
-    {
-        error_type _err;
-
-    public:
-        explicit format_error(error_type err);
-
-        error_type code() const
-        {
-            return _err;
-        }
-    };
-    
-    struct format
-    {
-        format() = default;
-
-        format(char const* begin, char const* end)
-        {
-            init(begin, end);
-        }
-        
-        template<class Source>
-        explicit format(Source const& source)
-        {
-            init(source.data(), source.data() + source.size());
-        }
-        
-        template<class Source>
-        explicit format(Source const&& source)
-        {
-            init(source.data(), source.data() + source.size());
-            copy_text(text_size());
-        }
-
-        template<std::size_t N>
-        explicit format(char const (&source)[N])
-        {
-            init(source, source + (N - 1));
-        }
-
-        explicit format(ast::content_list contents, bool copytext = true)
-          : _contents(std::move(contents))
-        {
-            if (copytext)
-                copy_text(text_size());
-        }
-
-        format(format&& other) noexcept
-          : _contents(std::move(other._contents)), _text(std::move(other._text))
-        {}
-
-        format(format const& other) : _contents(other._contents)
-        {
-            if (other._text)
-                copy_text(text_size());
-        }
-
-        template<class T>
-        manipulator<T, no_context>
-        operator()(T const& data, option_type flag = normal) const
-        {
-            return {*this, data, no_context::dummy(), flag};
-        }
-        
-        template<class T, class Context>
-        manipulator<T, Context>
-        operator()(T const& data, Context const& context, option_type flag = normal) const
-        {
-            return {*this, data, context, flag};
-        }
-        
-        ast::content_list const& contents() const
-        {
-            return _contents;
-        }
-        
-    private:
-        
-        void init(char const* begin, char const* end);
-        std::size_t text_size() const;
-        void copy_text(std::size_t n);
-
-        ast::content_list _contents;
-        std::unique_ptr<char[]> _text;
-    };
-
-    inline namespace literals
-    {
-        inline format operator"" _fmt(char const* str, std::size_t n)
-        {
-            return format(str, str + n);
-        }
-    }
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/generate.hpp b/thirdparty/bustache/include/bustache/generate.hpp
deleted file mode 100644
index 65a6491..0000000
--- a/thirdparty/bustache/include/bustache/generate.hpp
+++ /dev/null
@@ -1,430 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_GENERATE_HPP_INCLUDED
-#define BUSTACHE_GENERATE_HPP_INCLUDED
-
-#include <bustache/model.hpp>
-
-namespace bustache { namespace detail
-{
-    inline value::pointer find(object const& data, std::string const& key)
-    {
-        auto it = data.find(key);
-        if (it != data.end())
-            return it->second.get_pointer();
-        return nullptr;
-    }
-
-    template<class Sink>
-    struct value_printer
-    {
-        typedef void result_type;
-        
-        Sink const& sink;
-        bool const escaping;
-
-        void operator()(std::nullptr_t) const {}
-        
-        template<class T>
-        void operator()(T data) const
-        {
-            sink(data);
-        }
-
-        void operator()(std::string const& data) const
-        {
-            auto it = data.data(), end = it + data.size();
-            if (escaping)
-                escape_html(it, end);
-            else
-                sink(it, end);
-        }
-        
-        void operator()(array const& data) const
-        {
-            auto it = data.begin(), end = data.end();
-            if (it != end)
-            {
-                visit(*this, *it);
-                while (++it != end)
-                {
-                    literal(",");
-                    visit(*this, *it);
-                }
-            }
-        }
-
-        void operator()(object const&) const
-        {
-            literal("[Object]");
-        }
-
-        void operator()(lambda0v const& data) const
-        {
-            visit(*this, data());
-        }
-
-        void operator()(lambda1v const& data) const
-        {
-            visit(*this, data({}));
-        }
-
-        template<class Sig>
-        void operator()(std::function<Sig> const&) const
-        {
-            literal("[Function]");
-        }
-
-        void escape_html(char const* it, char const* end) const
-        {
-            char const* last = it;
-            while (it != end)
-            {
-                switch (*it)
-                {
-                case '&': sink(last, it); literal("&amp;"); break;
-                case '<': sink(last, it); literal("&lt;"); break;
-                case '>': sink(last, it); literal("&gt;"); break;
-                case '\\': sink(last, it); literal("&#92;"); break;
-                case '"': sink(last, it); literal("&quot;"); break;
-                default:  ++it; continue;
-                }
-                last = ++it;
-            }
-            sink(last, it);
-        }
-
-        template<std::size_t N>
-        void literal(char const (&str)[N]) const
-        {
-            sink(str, str + (N - 1));
-        }
-    };
-
-    struct content_scope
-    {
-        content_scope const* const parent;
-        object const& data;
-
-        value::pointer lookup(std::string const& key) const
-        {
-            if (auto pv = find(data, key))
-                return pv;
-            if (parent)
-                return parent->lookup(key);
-            return nullptr;
-        }
-    };
-
-    struct content_visitor_base
-    {
-        using result_type = void;
-
-        content_scope const* scope;
-        value::pointer cursor;
-        std::vector<ast::override_map const*> chain;
-        mutable std::string key_cache;
-
-        // Defined in src/generate.cpp.
-        value::pointer resolve(std::string const& key) const;
-
-        ast::content_list const* find_override(std::string const& key) const
-        {
-            for (auto pm : chain)
-            {
-                auto it = pm->find(key);
-                if (it != pm->end())
-                    return &it->second;
-            }
-            return nullptr;
-        }
-    };
-
-    template<class ContentVisitor>
-    struct variable_visitor : value_printer<typename ContentVisitor::sink_type>
-    {
-        using base_type = value_printer<typename ContentVisitor::sink_type>;
-        
-        ContentVisitor& parent;
-
-        variable_visitor(ContentVisitor& parent, bool escaping)
-          : base_type{parent.sink, escaping}, parent(parent)
-        {}
-
-        using base_type::operator();
-
-        void operator()(lambda0f const& data) const
-        {
-            auto fmt(data());
-            for (auto const& content : fmt.contents())
-                visit(parent, content);
-        }
-    };
-
-    template<class ContentVisitor>
-    struct section_visitor
-    {
-        using result_type = bool;
-
-        ContentVisitor& parent;
-        ast::content_list const& contents;
-        bool const inverted;
-
-        bool operator()(object const& data) const
-        {
-            if (!inverted)
-            {
-                content_scope scope{parent.scope, data};
-                auto old_scope = parent.scope;
-                parent.scope = &scope;
-                for (auto const& content : contents)
-                    visit(parent, content);
-                parent.scope = old_scope;
-            }
-            return false;
-        }
-
-        bool operator()(array const& data) const
-        {
-            if (inverted)
-                return data.empty();
-
-            for (auto const& val : data)
-            {
-                parent.cursor = val.get_pointer();
-                if (auto obj = get<object>(&val))
-                {
-                    content_scope scope{parent.scope, *obj};
-                    auto old_scope = parent.scope;
-                    parent.scope = &scope;
-                    for (auto const& content : contents)
-                        visit(parent, content);
-                    parent.scope = old_scope;
-                }
-                else
-                {
-                    for (auto const& content : contents)
-                        visit(parent, content);
-                }
-            }
-            return false;
-        }
-
-        bool operator()(bool data) const
-        {
-            return data ^ inverted;
-        }
-
-        // The 2 overloads below are not necessary but to suppress
-        // the stupid MSVC warning.
-        bool operator()(int data) const
-        {
-            return !!data ^ inverted;
-        }
-
-        bool operator()(double data) const
-        {
-            return !!data ^ inverted;
-        }
-
-        bool operator()(std::string const& data) const
-        {
-            return !data.empty() ^ inverted;
-        }
-
-        bool operator()(std::nullptr_t) const
-        {
-            return inverted;
-        }
-
-        bool operator()(lambda0v const& data) const
-        {
-            return inverted ? false : visit(*this, data());
-        }
-
-        bool operator()(lambda0f const& data) const
-        {
-            if (!inverted)
-            {
-                auto fmt(data());
-                for (auto const& content : fmt.contents())
-                    visit(parent, content);
-            }
-            return false;
-        }
-
-        bool operator()(lambda1v const& data) const
-        {
-            return inverted ? false : visit(*this, data(contents));
-        }
-
-        bool operator()(lambda1f const& data) const
-        {
-            if (!inverted)
-            {
-                auto fmt(data(contents));
-                for (auto const& content : fmt.contents())
-                    visit(parent, content);
-            }
-            return false;
-        }
-    };
-
-    template<class Sink, class Context>
-    struct content_visitor : content_visitor_base
-    {
-        using sink_type = Sink;
-
-        Sink const& sink;
-        Context const& context;
-        std::string indent;
-        bool needs_indent;
-        bool const escaping;
-
-        content_visitor
-        (
-            content_scope const& scope, value::pointer cursor,
-            Sink const &sink, Context const &context, bool escaping
-        )
-          : content_visitor_base{&scope, cursor, {}, {}}
-          , sink(sink), context(context), needs_indent(), escaping(escaping)
-        {}
-
-        void operator()(ast::text const& text)
-        {
-            auto i = text.begin();
-            auto e = text.end();
-            assert(i != e && "empty text shouldn't be in ast");
-            if (indent.empty())
-            {
-                sink(i, e);
-                return;
-            }
-            --e; // Don't flush indent on last newline.
-            auto const ib = indent.data();
-            auto const ie = ib + indent.size();
-            if (needs_indent)
-                sink(ib, ie);
-            auto i0 = i;
-            while (i != e)
-            {
-                if (*i++ == '\n')
-                {
-                    sink(i0, i);
-                    sink(ib, ie);
-                    i0 = i;
-                }
-            }
-            needs_indent = *i++ == '\n';
-            sink(i0, i);
-        }
-        
-        void operator()(ast::variable const& variable)
-        {
-            if (auto pv = resolve(variable.key))
-            {
-                if (needs_indent)
-                {
-                    sink(indent.data(), indent.data() + indent.size());
-                    needs_indent = false;
-                }
-                variable_visitor<content_visitor> visitor
-                {
-                    *this, escaping && !variable.tag
-                };
-                visit(visitor, *pv);
-            }
-        }
-        
-        void operator()(ast::section const& section)
-        {
-            bool inverted = section.tag == '^';
-            auto old_cursor = cursor;
-            if (auto next = resolve(section.key))
-            {
-                cursor = next;
-                section_visitor<content_visitor> visitor
-                {
-                    *this, section.contents, inverted
-                };
-                if (!visit(visitor, *cursor))
-                {
-                    cursor = old_cursor;
-                    return;
-                }
-            }
-            else if (!inverted)
-                return;
-                
-            for (auto const& content : section.contents)
-                visit(*this, content);
-            cursor = old_cursor;
-        }
-        
-        void operator()(ast::partial const& partial)
-        {
-            auto it = context.find(partial.key);
-            if (it != context.end())
-            {
-                if (it->second.contents().empty())
-                    return;
-
-                auto old_size = indent.size();
-                auto old_chain = chain.size();
-                indent += partial.indent;
-                needs_indent |= !partial.indent.empty();
-                if (!partial.overriders.empty())
-                    chain.push_back(&partial.overriders);
-                for (auto const& content : it->second.contents())
-                    visit(*this, content);
-                chain.resize(old_chain);
-                indent.resize(old_size);
-            }
-        }
-
-        void operator()(ast::block const& block)
-        {
-            auto pc = find_override(block.key);
-            if (!pc)
-                pc = &block.contents;
-            for (auto const& content : *pc)
-                visit(*this, content);
-        }
-
-        void operator()(ast::null) const {} // never called
-    };
-}}
-
-namespace bustache
-{
-    template<class Sink>
-    inline void generate
-    (
-        Sink& sink, format const& fmt, value::view const& data,
-        option_type flag = normal
-    )
-    {
-        generate(sink, fmt, data, no_context::dummy(), flag);
-    }
-    
-    template<class Sink, class Context>
-    void generate
-    (
-        Sink& sink, format const& fmt, value::view const& data,
-        Context const& context, option_type flag = normal
-    )
-    {
-        object const empty;
-        auto obj = get<object>(&data);
-        detail::content_scope scope{nullptr, obj ? *obj : empty};
-        detail::content_visitor<Sink, Context> visitor{scope, data.get_pointer(), sink, context, flag};
-        for (auto const& content : fmt.contents())
-            visit(visitor, content);
-    }
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/generate/ostream.hpp b/thirdparty/bustache/include/bustache/generate/ostream.hpp
deleted file mode 100644
index 8f1a83e..0000000
--- a/thirdparty/bustache/include/bustache/generate/ostream.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_GENERATE_OSTREAM_HPP_INCLUDED
-#define BUSTACHE_GENERATE_OSTREAM_HPP_INCLUDED
-
-#include <iostream>
-#include <bustache/generate.hpp>
-
-namespace bustache { namespace detail
-{
-    template<class CharT, class Traits>
-    struct ostream_sink
-    {
-        std::basic_ostream<CharT, Traits>& out;
-
-        void operator()(char const* it, char const* end) const
-        {
-            out.write(it, end - it);
-        }
-
-        template<class T>
-        void operator()(T data) const
-        {
-            out << data;
-        }
-
-        void operator()(bool data) const
-        {
-            out << (data ? "true" : "false");
-        }
-    };
-}}
-
-namespace bustache
-{
-    template<class CharT, class Traits, class Context>
-    void generate_ostream
-    (
-        std::basic_ostream<CharT, Traits>& out, format const& fmt,
-        value::view const& data, Context const& context, option_type flag
-    )
-    {
-        detail::ostream_sink<CharT, Traits> sink{out};
-        generate(sink, fmt, data, context, flag);
-    }
-
-    // This is instantiated in src/generate.cpp.
-    extern template
-    void generate_ostream
-    (
-        std::ostream& out, format const& fmt,
-        value::view const& data, detail::any_context const& context, option_type flag
-    );
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/generate/string.hpp b/thirdparty/bustache/include/bustache/generate/string.hpp
deleted file mode 100644
index cd1ddb4..0000000
--- a/thirdparty/bustache/include/bustache/generate/string.hpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_GENERATE_STRING_HPP_INCLUDED
-#define BUSTACHE_GENERATE_STRING_HPP_INCLUDED
-
-#include <cstdio> // for snprintf
-#include <string>
-#include <bustache/generate.hpp>
-
-namespace bustache { namespace detail
-{
-    template<class String>
-    struct string_sink
-    {
-        String& out;
-
-        void operator()(char const* it, char const* end) const
-        {
-            out.insert(out.end(), it, end);
-        }
-
-        void operator()(int data) const
-        {
-            append_num("%d", data);
-        }
-
-        void operator()(double data) const
-        {
-            append_num("%g", data);
-        }
-
-        void operator()(bool data) const
-        {
-            data ? append("true") : append("false");
-        }
-
-        template<std::size_t N>
-        void append(char const (&str)[N]) const
-        {
-            out.insert(out.end(), str, str + (N - 1));
-        }
-
-        template<class T>
-        void append_num(char const* fmt, T data) const
-        {
-            char buf[64];
-            char* p;
-            auto old_size = out.size();
-            auto capacity = out.capacity();
-            auto bufsize = capacity - old_size;
-            if (bufsize)
-            {
-                out.resize(capacity);
-                p = &out.front() + old_size;
-            }
-            else
-            {
-                bufsize = sizeof(buf);
-                p = buf;
-            }
-            auto n = std::snprintf(p, bufsize, fmt, data);
-            if (n < 0) // error
-                return;
-            if (unsigned(n + 1) <= bufsize)
-            {
-                if (p == buf)
-                {
-                    out.insert(out.end(), p, p + n);
-                    return;
-                }
-            }
-            else
-            {
-                out.resize(old_size + n + 1); // '\0' will be written
-                std::snprintf(&out.front() + old_size, n + 1, fmt, data);
-            }
-            out.resize(old_size + n);
-        }
-    };
-}}
-
-namespace bustache
-{
-    template<class String, class Context>
-    void generate_string
-    (
-        String& out, format const& fmt,
-        value::view const& data, Context const& context, option_type flag
-    )
-    {
-        detail::string_sink<String> sink{out};
-        generate(sink, fmt, data, context, flag);
-    }
-
-    // This is instantiated in src/generate.cpp.
-    extern template
-    void generate_string
-    (
-        std::string& out, format const& fmt,
-        value::view const& data, detail::any_context const& context, option_type flag
-    );
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/include/bustache/model.hpp b/thirdparty/bustache/include/bustache/model.hpp
deleted file mode 100644
index 87b7a28..0000000
--- a/thirdparty/bustache/include/bustache/model.hpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2014-2017 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#ifndef BUSTACHE_MODEL_HPP_INCLUDED
-#define BUSTACHE_MODEL_HPP_INCLUDED
-
-#include <bustache/format.hpp>
-#include <bustache/detail/variant.hpp>
-#include <bustache/detail/any_context.hpp>
-#include <vector>
-#include <functional>
-#include <boost/unordered_map.hpp>
-
-namespace bustache
-{
-    class value;
-
-    using array = std::vector<value>;
-
-    // We use boost::unordered_map because it allows incomplete type.
-    using object = boost::unordered_map<std::string, value>;
-
-    using lambda0v = std::function<value()>;
-
-    using lambda0f = std::function<format()>;
-
-    using lambda1v = std::function<value(ast::content_list const&)>;
-
-    using lambda1f = std::function<format(ast::content_list const&)>;
-
-    namespace detail
-    {
-        struct bool_
-        {
-            bool_(bool);
-        };
-    }
-
-#define BUSTACHE_VALUE(X, D)                                                    \
-    X(0, std::nullptr_t, D)                                                     \
-    X(1, bool, D)                                                               \
-    X(2, int, D)                                                                \
-    X(3, double, D)                                                             \
-    X(4, std::string, D)                                                        \
-    X(5, array, D)                                                              \
-    X(6, lambda0v, D)                                                           \
-    X(7, lambda0f, D)                                                           \
-    X(8, lambda1v, D)                                                           \
-    X(9, lambda1f, D)                                                           \
-    X(10, object, D)                                                            \
-/***/
-
-    class value : public variant_base<value>
-    {
-        static std::nullptr_t match_type(std::nullptr_t);
-        static int match_type(int);
-        // Use a fake bool_ to prevent unintended bool conversion.
-        static bool match_type(detail::bool_);
-        static double match_type(double);
-        static std::string match_type(std::string);
-        static array match_type(array);
-        static lambda0v match_type(lambda0v);
-        static lambda0f match_type(lambda0f);
-        static lambda1v match_type(lambda1v);
-        static lambda1f match_type(lambda1f);
-        static object match_type(object);
-        // Need to override for `char const*`, otherwise `bool` will be chosen
-        static std::string match_type(char const*);
-
-    public:
-
-        struct view;
-        using pointer = variant_ptr<view>;
-
-        Zz_BUSTACHE_VARIANT_DECL(value, BUSTACHE_VALUE, false)
-
-        value() noexcept : _which(0), _0() {}
-
-        pointer get_pointer() const
-        {
-            return {_which, _storage};
-        }
-    };
-
-    struct value::view : variant_base<view>
-    {
-        using switcher = value::switcher;
-
-#define BUSTACHE_VALUE_VIEW_CTOR(N, U, D)                                       \
-        view(U const& data) noexcept : _which(N), _data(&data) {}
-        BUSTACHE_VALUE(BUSTACHE_VALUE_VIEW_CTOR,)
-#undef BUSTACHE_VALUE_VIEW_CTOR
-
-        view(value const& data) noexcept
-          : _which(data._which), _data(data._storage)
-        {}
-
-        view(unsigned which, void const* data) noexcept
-          : _which(which), _data(data)
-        {}
-
-        unsigned which() const
-        {
-            return _which;
-        }
-
-        void const* data() const
-        {
-            return _data;
-        }
-
-        pointer get_pointer() const
-        {
-            return {_which, _data};
-        }
-
-    private:
-
-        unsigned _which;
-        void const* _data;
-    };
-#undef BUSTACHE_VALUE
-}
-
-namespace bustache
-{
-    // Forward decl only.
-    template<class CharT, class Traits, class Context>
-    void generate_ostream
-    (
-        std::basic_ostream<CharT, Traits>& out, format const& fmt,
-        value::view const& data, Context const& context, option_type flag
-    );
-
-    // Forward decl only.
-    template<class String, class Context>
-    void generate_string
-    (
-        String& out, format const& fmt,
-        value::view const& data, Context const& context, option_type flag
-    );
-
-    template<class CharT, class Traits, class T, class Context,
-        typename std::enable_if<std::is_constructible<value::view, T>::value, bool>::type = true>
-    inline std::basic_ostream<CharT, Traits>&
-    operator<<(std::basic_ostream<CharT, Traits>& out, manipulator<T, Context> const& manip)
-    {
-        generate_ostream(out, manip.fmt, manip.data, detail::any_context(manip.context), manip.flag);
-        return out;
-    }
-
-    template<class T, class Context,
-        typename std::enable_if<std::is_constructible<value::view, T>::value, bool>::type = true>
-    inline std::string to_string(manipulator<T, Context> const& manip)
-    {
-        std::string ret;
-        generate_string(ret, manip.fmt, manip.data, detail::any_context(manip.context), manip.flag);
-        return ret;
-    }
-}
-
-#endif
\ No newline at end of file
diff --git a/thirdparty/bustache/src/format.cpp b/thirdparty/bustache/src/format.cpp
deleted file mode 100644
index 7b56084..0000000
--- a/thirdparty/bustache/src/format.cpp
+++ /dev/null
@@ -1,484 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2014-2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#include <cctype>
-#include <utility>
-#include <cstring>
-#include <bustache/format.hpp>
-
-namespace bustache { namespace parser { namespace
-{
-    using delim = std::pair<std::string, std::string>;
-
-    template<class I>
-    inline void skip(I& i, I e)
-    {
-        while (i != e && std::isspace(*i))
-            ++i;
-    }
-
-    template<class I>
-    inline bool parse_char(I& i, I e, char c)
-    {
-        if (i != e && *i == c)
-        {
-            ++i;
-            return true;
-        }
-        return false;
-    }
-
-    template<class I>
-    inline bool parse_lit(I& i, I e, boost::string_ref const& str)
-    {
-        I i0 = i;
-        for (char c : str)
-        {
-            if (!parse_char(i, e, c))
-            {
-                i = i0;
-                return false;
-            }
-        }
-        return true;
-    }
-
-    template<class I>
-    void expect_key(I& i, I e, delim& d, std::string& attr, bool suffix)
-    {
-        skip(i, e);
-        I i0 = i;
-        while (i != e)
-        {
-            I i1 = i;
-            skip(i, e);
-            if (!suffix || parse_char(i, e, '}'))
-            {
-                skip(i, e);
-                if (parse_lit(i, e, d.second))
-                {
-                    attr.assign(i0, i1);
-                    if (i0 == i1)
-                        throw format_error(error_badkey);
-                    return;
-                }
-            }
-            if (i != e)
-                ++i;
-        }
-        throw format_error(error_badkey);
-    }
-
-    template<class I>
-    bool parse_content
-    (
-        I& i0, I& i, I e, delim& d, bool& pure,
-        boost::string_ref& text, ast::content& attr,
-        boost::string_ref const& section
-    );
-
-    template<class I>
-    void parse_contents
-    (
-        I i0, I& i, I e, delim& d, bool& pure,
-        ast::content_list& attr, boost::string_ref const& section
-    );
-
-    template<class I>
-    I process_pure(I& i, I e, bool& pure)
-    {
-        I i0 = i;
-        if (pure)
-        {
-            while (i != e)
-            {
-                if (*i == '\n')
-                {
-                    i0 = ++i;
-                    break;
-                }
-                else if (std::isspace(*i))
-                    ++i;
-                else
-                {
-                    pure = false;
-                    break;
-                }
-            }
-        }
-        return i0;
-    }
-
-    template<class I>
-    inline bool expect_block(I& i, I e, delim& d, bool& pure, ast::block& attr)
-    {
-        expect_key(i, e, d, attr.key, false);
-        I i0 = process_pure(i, e, pure);
-        bool standalone = pure;
-        parse_contents(i0, i, e, d, pure, attr.contents, attr.key);
-        return standalone;
-    }
-
-    template<class I>
-    bool expect_inheritance(I& i, I e, delim& d, bool& pure, ast::partial& attr)
-    {
-        expect_key(i, e, d, attr.key, false);
-        I i0 = process_pure(i, e, pure);
-        bool standalone = pure;
-        for (boost::string_ref text;;)
-        {
-            ast::content a;
-            auto end = parse_content(i0, i, e, d, pure, text, a, attr.key);
-            if (auto p = get<ast::block>(&a))
-                attr.overriders.emplace(std::move(p->key), std::move(p->contents));
-            if (end)
-                break;
-        }
-        return standalone;
-    }
-
-    template<class I>
-    void expect_comment(I& i, I e, delim& d)
-    {
-        while (!parse_lit(i, e, d.second))
-        {
-            if (i == e)
-                throw format_error(error_delim);
-            ++i;
-        }
-    }
-
-    template<class I>
-    void expect_set_delim(I& i, I e, delim& d)
-    {
-        skip(i, e);
-        I i0 = i;
-        while (i != e)
-        {
-            if (std::isspace(*i))
-                break;
-            ++i;
-        }
-        if (i == e)
-            throw format_error(error_baddelim);
-        d.first.assign(i0, i);
-        skip(i, e);
-        i0 = i;
-        I i1 = i;
-        for (;; ++i)
-        {
-            if (i == e)
-                throw format_error(error_set_delim);
-            if (*i == '=')
-            {
-                i1 = i;
-                break;
-            }
-            if (std::isspace(*i))
-            {
-                i1 = i;
-                skip(++i, e);
-                if (i == e || *i != '=')
-                    throw format_error(error_set_delim);
-                break;
-            }
-        }
-        if (i0 == i1)
-            throw format_error(error_baddelim);
-        std::string new_close(i0, i1);
-        skip(++i, e);
-        if (!parse_lit(i, e, d.second))
-            throw format_error(error_delim);
-        d.second = std::move(new_close);
-    }
-
-    struct tag_result
-    {
-        bool is_end_section;
-        bool check_standalone;
-        bool is_standalone;
-    };
-
-    template<class I>
-    tag_result expect_tag
-    (
-        I& i, I e, delim& d, bool& pure,
-        ast::content& attr, boost::string_ref const& section
-    )
-    {
-        skip(i, e);
-        if (i == e)
-            throw format_error(error_badkey);
-        tag_result ret{};
-        switch (*i)
-        {
-        case '#':
-        case '^':
-        {
-            ast::section a;
-            a.tag = *i;
-            ret.is_standalone = expect_block(++i, e, d, pure, a);
-            attr = std::move(a);
-            return ret;
-        }
-        case '/':
-            skip(++i, e);
-            if (section.empty() || !parse_lit(i, e, section))
-                throw format_error(error_section);
-            skip(i, e);
-            if (!parse_lit(i, e, d.second))
-                throw format_error(error_delim);
-            ret.check_standalone = pure;
-            ret.is_end_section = true;
-            break;
-        case '!':
-        {
-            expect_comment(++i, e, d);
-            ret.check_standalone = pure;
-            break;
-        }
-        case '=':
-        {
-            expect_set_delim(++i, e, d);
-            ret.check_standalone = pure;
-            break;
-        }
-        case '>':
-        {
-            ast::partial a;
-            expect_key(++i, e, d, a.key, false);
-            attr = std::move(a);
-            ret.check_standalone = pure;
-            break;
-        }
-        case '&':
-        case '{':
-        {
-            ast::variable a;
-            a.tag = *i;
-            expect_key(++i, e, d, a.key, a.tag == '{');
-            attr = std::move(a);
-            pure = false;
-            break;
-        }
-        // Extensions
-        case '<':
-        {
-            ast::partial a;
-            ret.is_standalone = expect_inheritance(++i, e, d, pure, a);
-            attr = std::move(a);
-            return ret;
-        }
-        case '$':
-        {
-            ast::block a;
-            ret.is_standalone = expect_block(++i, e, d, pure, a);
-            attr = std::move(a);
-            return ret;
-        }
-        default:
-            ast::variable a;
-            expect_key(i, e, d, a.key, false);
-            attr = std::move(a);
-            pure = false;
-            break;
-        }
-        return ret;
-    }
-
-    // return true if it ends
-    template<class I>
-    bool parse_content
-    (
-        I& i0, I& i, I e, delim& d, bool& pure,
-        boost::string_ref& text, ast::content& attr,
-        boost::string_ref const& section
-    )
-    {
-        for (I i1 = i; i != e;)
-        {
-            if (*i == '\n')
-            {
-                pure = true;
-                i1 = ++i;
-            }
-            else if (std::isspace(*i))
-                ++i;
-            else
-            {
-                I i2 = i;
-                if (parse_lit(i, e, d.first))
-                {
-                    tag_result tag(expect_tag(i, e, d, pure, attr, section));
-                    text = boost::string_ref(i0, i1 - i0);
-                    if (tag.check_standalone)
-                    {
-                        I i3 = i;
-                        while (i != e)
-                        {
-                            if (*i == '\n')
-                            {
-                                ++i;
-                                break;
-                            }
-                            else if (std::isspace(*i))
-                                ++i;
-                            else
-                            {
-                                pure = false;
-                                text = boost::string_ref(i0, i2 - i0);
-                                // For end-section, we move the current pos (i)
-                                // since i0 is local to the section and is not
-                                // propagated upwards.
-                                (tag.is_end_section ? i : i0) = i3;
-                                return tag.is_end_section;
-                            }
-                        }
-                        tag.is_standalone = true;
-                    }
-                    if (!tag.is_standalone)
-                        text = boost::string_ref(i0, i2 - i0);
-                    else if (auto partial = get<ast::partial>(&attr))
-                        partial->indent.assign(i1, i2 - i1);
-                    i0 = i;
-                    return i == e || tag.is_end_section;
-                }
-                else
-                {
-                    pure = false;
-                    ++i;
-                }
-            }
-        }
-        text = boost::string_ref(i0, i - i0);
-        return true;
-    }
-
-    template<class I>
-    void parse_contents
-    (
-        I i0, I& i, I e, delim& d, bool& pure,
-        ast::content_list& attr, boost::string_ref const& section
-    )
-    {
-        for (;;)
-        {
-            boost::string_ref text;
-            ast::content a;
-            auto end = parse_content(i0, i, e, d, pure, text, a, section);
-            if (!text.empty())
-                attr.push_back(text);
-            if (!is_null(a))
-                attr.push_back(std::move(a));
-            if (end)
-                return;
-        }
-    }
-
-    template<class I>
-    inline void parse_start(I& i, I e, ast::content_list& attr)
-    {
-        delim d("{{", "}}");
-        bool pure = true;
-        parse_contents(i, i, e, d, pure, attr, {});
-    }
-}}}
-
-namespace bustache
-{
-    static char const* get_error_string(error_type err)
-    {
-        switch (err)
-        {
-        case error_set_delim:
-            return "format_error(error_set_delim): mismatched '='";
-        case error_baddelim:
-            return "format_error(error_baddelim): invalid delimiter";
-        case error_delim:
-            return "format_error(error_delim): mismatched delimiter";
-        case error_section:
-            return "format_error(error_section): mismatched end section tag";
-        case error_badkey:
-            return "format_error(error_badkey): invalid key";
-        default:
-            return "format_error";
-        }
-    }
-
-    format_error::format_error(error_type err)
-      : runtime_error(get_error_string(err)), _err(err)
-    {}
-
-    void format::init(char const* begin, char const* end)
-    {
-        parser::parse_start(begin, end, _contents);
-    }
-
-    struct accum_size
-    {
-        using result_type = std::size_t;
-
-        std::size_t operator()(ast::text const& text) const
-        {
-            return text.size();
-        }
-
-        std::size_t operator()(ast::section const& section) const
-        {
-            std::size_t n = 0;
-            for (auto const& content : section.contents)
-                n += visit(*this, content);
-            return n;
-        }
-
-        template <typename T>
-        std::size_t operator()(T const&) const
-        {
-            return 0;
-        }
-    };
-
-    std::size_t format::text_size() const
-    {
-        accum_size accum;
-        std::size_t n = 0;
-        for (auto const& content : _contents)
-            n += visit(accum, content);
-        return n;
-    }
-
-    struct copy_text_visitor
-    {
-        using result_type = void;
-
-        char* data;
-
-        void operator()(ast::text& text)
-        {
-            auto n = text.size();
-            std::memcpy(data, text.data(), n);
-            text = {data, n};
-            data += n;
-        }
-
-        void operator()(ast::section& section)
-        {
-            for (auto& content : section.contents)
-                visit(*this, content);
-        }
-
-        template <typename T>
-        void operator()(T const&) const {}
-    };
-
-    void format::copy_text(std::size_t n)
-    {
-        _text.reset(new char[n]);
-        copy_text_visitor visitor{_text.get()};
-        for (auto& content : _contents)
-            visit(visitor, content);
-    }
-}
\ No newline at end of file
diff --git a/thirdparty/bustache/src/generate.cpp b/thirdparty/bustache/src/generate.cpp
deleted file mode 100644
index 1e41455..0000000
--- a/thirdparty/bustache/src/generate.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-
-#include <bustache/generate.hpp>
-#include <bustache/generate/ostream.hpp>
-#include <bustache/generate/string.hpp>
-
-namespace bustache { namespace detail
-{
-    value::pointer content_visitor_base::resolve(std::string const& key) const
-    {
-        auto ki = key.begin();
-        auto ke = key.end();
-        if (ki == ke)
-            return{};
-        value::pointer pv = nullptr;
-        if (*ki == '.')
-        {
-            if (++ki == ke)
-                return cursor;
-            auto k0 = ki;
-            while (*ki != '.' && ++ki != ke);
-            key_cache.assign(k0, ki);
-            pv = find(scope->data, key_cache);
-        }
-        else
-        {
-            auto k0 = ki;
-            while (ki != ke && *ki != '.') ++ki;
-            key_cache.assign(k0, ki);
-            pv = scope->lookup(key_cache);
-        }
-        if (ki == ke)
-            return pv;
-        if (auto obj = get<object>(pv))
-        {
-            auto k0 = ++ki;
-            while (ki != ke)
-            {
-                if (*ki == '.')
-                {
-                    key_cache.assign(k0, ki);
-                    obj = get<object>(find(*obj, key_cache));
-                    if (!obj)
-                        return nullptr;
-                    k0 = ++ki;
-                }
-                else
-                    ++ki;
-            }
-            key_cache.assign(k0, ki);
-            return find(*obj, key_cache);
-        }
-        return nullptr;
-    }
-}}
-
-namespace bustache
-{
-    template
-    void generate_ostream
-    (
-        std::ostream& out, format const& fmt,
-        value::view const& data, detail::any_context const& context, option_type flag
-    );
-
-    template
-    void generate_string
-    (
-        std::string& out, format const& fmt,
-        value::view const& data, detail::any_context const& context, option_type flag
-    );
-}
\ No newline at end of file
diff --git a/thirdparty/bustache/test/CMakeLists.txt b/thirdparty/bustache/test/CMakeLists.txt
deleted file mode 100644
index 74ecaee..0000000
--- a/thirdparty/bustache/test/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-find_package(Catch REQUIRED)
-
-add_library(Catch INTERFACE)
-target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})
-
-function(add_catch_test name)
-    set(TEST_TARGET test_${name})
-    add_executable(${TEST_TARGET}
-        ${name}.cpp
-    )
-    target_link_libraries(${TEST_TARGET}
-        ${PROJECT_NAME} Catch
-    )
-    set_target_properties(${TEST_TARGET} PROPERTIES
-        CXX_STANDARD 14
-    )
-    add_test(${TEST_TARGET} ${TEST_TARGET})
-endfunction()
-
-add_catch_test(specs)
-
-add_catch_test(variant)
diff --git a/thirdparty/bustache/test/benchmark.cpp b/thirdparty/bustache/test/benchmark.cpp
deleted file mode 100644
index d9b434c..0000000
--- a/thirdparty/bustache/test/benchmark.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-#include <benchmark/benchmark.h>
-#include <bustache/model.hpp>
-#include <mstch/mstch.hpp>
-#include <mustache.hpp>
-
-static char tmp[] =
-R"(<h1>{{header}}</h1>
-{{#bug}}
-{{/bug}}
-
-{{# items}}
-  {{#first}}
-    <li><strong>{{name}}</strong></li>
-  {{/first}}
-  {{#link}}
-    <li><a {{>href}}>{{name}}</a></li>
-  {{/link}}
-{{ /items}}
-
-{{#empty}}
-  <p>The list is empty.</p>
-{{/ empty }}
-
-{{=[ ]=}}
-
-[#array]([.])[/array]
-
-[#items]
-[count]->[count]->[count]
-[/items]
-
-[a.b.c] == [#a][#b][c][/b][/a]
-
-<div class="comments">
-    <h3>[header]</h3>
-    <ul>
-        [#comments]
-        <li class="comment">
-            <h5>[name]</h5>
-            <p>[body]</p>
-        </li>
-        <!--[count]-->
-        [/comments]
-    </ul>
-</div>)";
-
-static void bustache_usage(benchmark::State& state)
-{
-    using namespace bustache;
-
-    boost::unordered_map<std::string, bustache::format> context
-    {
-        {"href", "href=\"{{url}}\""_fmt}
-    };
-
-    int n = 0;
-    object data
-    {
-        {"header", "Colors"},
-        {"items",
-            array
-            {
-                object
-                {
-                    {"name", "red"},
-                    {"first", true},
-                    {"url", "#Red"}
-                },
-                object
-                {
-                    {"name", "green"},
-                    {"link", true},
-                    {"url", "#Green"}
-                },
-                object
-                {
-                    {"name", "blue"},
-                    {"link", true},
-                    {"url", "#Blue"}
-                }
-            }
-        },
-        {"empty", false},
-        {"count", [&n] { return ++n; }},
-        {"array", array{1, 2, 3}},
-        {"a", object{{"b", object{{"c", true}}}}},
-        {"comments",
-            array
-            {
-                object
-                {
-                    {"name", "Joe"},
-                    {"body", "<html> should be escaped"}
-                },
-                object
-                {
-                    {"name", "Sam"},
-                    {"body", "{{mustache}} can be seen"}
-                },
-                object
-                {
-                    {"name", "New"},
-                    {"body", "break\nup"}
-                }
-            }
-        }
-    };
-
-    format fmt(tmp);
-
-    while (state.KeepRunning())
-    {
-        n = 0;
-        to_string(fmt(data, context, escape_html));
-    }
-}
-
-static void mstch_usage(benchmark::State& state)
-{
-    using namespace mstch;
-    using namespace std::string_literals;
-
-    std::map<std::string, std::string> context
-    {
-        {"href", "href=\"{{url}}\""}
-    };
-
-    int n = 0;
-    map data
-    {
-        {"header", "Colors"s},
-        {"items",
-            array
-            {
-                map
-                {
-                    {"name", "red"s},
-                    {"first", true},
-                    {"url", "#Red"s}
-                },
-                map
-                {
-                    {"name", "green"s},
-                    {"link", true},
-                    {"url", "#Green"s}
-                },
-                map
-                {
-                    {"name", "blue"s},
-                    {"link", true},
-                    {"url", "#Blue"s}
-                }
-            }
-        },
-        {"empty", false},
-        {"count", lambda{[&n]() -> node { return ++n; }}},
-        {"array", array{1, 2, 3}},
-        {"a", map{{"b", map{{"c", true}}}}},
-        {"comments",
-            array
-            {
-                map
-                {
-                    {"name", "Joe"s},
-                    {"body", "<html> should be escaped"s}
-                },
-                map
-                {
-                    {"name", "Sam"s},
-                    {"body", "{{mustache}} can be seen"s}
-                },
-                map
-                {
-                    {"name", "New"s},
-                    {"body", "break\nup"s}
-                }
-            }
-        }
-    };
-
-    while (state.KeepRunning())
-    {
-        n = 0;
-        render(tmp, data, context);
-    }
-}
-
-static void kainjow_usage(benchmark::State& state)
-{
-    using namespace Kainjow;
-    using Data = Mustache::Data;
-
-    int n = 0;
-    Data data;
-    data.set("header", "Colors");
-    {
-        Data d1, d2, d3;
-        d1.set("name", "red");
-        d1.set("first", Data::Type::True);
-        d1.set("url", "#Red");
-        d2.set("name", "green");
-        d2.set("link", Data::Type::True);
-        d2.set("url", "#Green");
-        d3.set("name", "blue");
-        d3.set("link", Data::Type::True);
-        d3.set("url", "#Blue");
-        data.set("items", Data::ListType{d1, d2, d3});
-    }
-    data.set("empty", Data::Type::False);
-    data.set("count", Data::LambdaType{[&n](const std::string&) { return std::to_string(++n); }});
-    data.set("array", Data::ListType{"1", "2", "3"});
-    data.set("a", {"b",{"c", "true"}});
-    {
-        Data d1, d2, d3;
-        d1.set("name", "Joe");
-        d1.set("body", "<html> should be escaped");
-        d2.set("name", "Sam");
-        d2.set("body", "{{mustache}} can be seen");
-        d3.set("name", "New");
-        d3.set("body", "break\nup");
-        data.set("comments", Data::ListType{d1, d2, d3});
-    }
-    data.set("href", Data::PartialType{[]() { return "href=\"{{url}}\""; }});
-
-    Mustache fmt(tmp);
-
-    while (state.KeepRunning())
-    {
-        n = 0;
-        fmt.render(data);
-    }
-}
-
-BENCHMARK(bustache_usage);
-BENCHMARK(mstch_usage);
-BENCHMARK(kainjow_usage);
-
-BENCHMARK_MAIN();
\ No newline at end of file
diff --git a/thirdparty/bustache/test/specs.cpp b/thirdparty/bustache/test/specs.cpp
deleted file mode 100644
index 617ed1d..0000000
--- a/thirdparty/bustache/test/specs.cpp
+++ /dev/null
@@ -1,714 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#define CATCH_CONFIG_MAIN
-#include <catch.hpp>
-#include <bustache/model.hpp>
-#include <boost/unordered_map.hpp>
-
-using namespace bustache;
-using context = boost::unordered_map<std::string, format>;
-
-TEST_CASE("interpolation")
-{
-    object const empty;
-
-    // No Interpolation
-    CHECK(to_string("Hello from {Mustache}!"_fmt(empty)) == "Hello from {Mustache}!");
-
-    // Basic Interpolation
-    CHECK(to_string("Hello, {{subject}}!"_fmt(object{{"subject", "world"}})) == "Hello, world!");
-
-    // HTML Escaping
-    CHECK(to_string("These characters should be HTML escaped: {{forbidden}}"_fmt(object{{"forbidden", "& \" < >"}}, escape_html))
-        == "These characters should be HTML escaped: &amp; &quot; &lt; &gt;");
-
-    // Triple Mustache
-    CHECK(to_string("These characters should not be HTML escaped: {{{forbidden}}}"_fmt(object{{"forbidden", "& \" < >"}}, escape_html))
-        == "These characters should not be HTML escaped: & \" < >");
-
-    // Ampersand
-    CHECK(to_string("These characters should not be HTML escaped: {{&forbidden}}"_fmt(object{{"forbidden", "& \" < >"}}, escape_html))
-        == "These characters should not be HTML escaped: & \" < >");
-
-    // Basic Integer Interpolation
-    CHECK(to_string(R"("{{mph}} miles an hour!")"_fmt(object{{"mph", 85}})) == R"("85 miles an hour!")");
-
-    // Triple Mustache Integer Interpolation
-    CHECK(to_string(R"("{{{mph}}} miles an hour!")"_fmt(object{{"mph", 85}})) == R"("85 miles an hour!")");
-
-    // Ampersand Integer Interpolation
-    CHECK(to_string(R"("{{&mph}} miles an hour!")"_fmt(object{{"mph", 85}})) == R"("85 miles an hour!")");
-
-    // Basic Decimal Interpolation
-    CHECK(to_string(R"("{{power}} jiggawatts!")"_fmt(object{{"power", 1.21}})) == R"("1.21 jiggawatts!")");
-
-    // Triple Decimal Interpolation
-    CHECK(to_string(R"("{{{power}}} jiggawatts!")"_fmt(object{{"power", 1.21}})) == R"("1.21 jiggawatts!")");
-
-    // Ampersand Decimal Interpolation
-    CHECK(to_string(R"("{{&power}} jiggawatts!")"_fmt(object{{"power", 1.21}})) == R"("1.21 jiggawatts!")");
-
-    // Context Misses
-    {
-        // Basic Context Miss Interpolation
-        CHECK(to_string("I ({{cannot}}) be seen!"_fmt(empty)) == "I () be seen!");
-
-        // Triple Mustache Context Miss Interpolation
-        CHECK(to_string("I ({{{cannot}}}) be seen!"_fmt(empty)) == "I () be seen!");
-
-        // Ampersand Context Miss Interpolation
-        CHECK(to_string("I ({{&cannot}}) be seen!"_fmt(empty)) == "I () be seen!");
-    }
-
-    // Dotted Names
-    {
-        // Dotted Names - Basic Interpolation
-        CHECK(to_string(R"("{{person.name}}" == "{{#person}}{{name}}{{/person}}")"_fmt(object{{"person", object{{"name", "Joe"}}}})) == R"("Joe" == "Joe")");
-
-        // Dotted Names - Triple Mustache Interpolation
-        CHECK(to_string(R"("{{{person.name}}}" == "{{#person}}{{name}}{{/person}}")"_fmt(object{{"person", object{{"name", "Joe"}}}})) == R"("Joe" == "Joe")");
-
-        // Dotted Names - Ampersand Interpolation
-        CHECK(to_string(R"("{{&person.name}}" == "{{#person}}{{name}}{{/person}}")"_fmt(object{{"person", object{{"name", "Joe"}}}})) == R"("Joe" == "Joe")");
-
-        // Dotted Names - Arbitrary Depth
-        CHECK(to_string(R"("{{a.b.c.d.e.name}}" == "Phil")"_fmt(
-            object{{"a", object{{"b", object{{"c", object{{"d", object{{"e", object{{"name", "Phil"}}}}}}}}}}}}))
-            == R"("Phil" == "Phil")");
-
-        // Dotted Names - Broken Chains
-        CHECK(to_string(R"("{{a.b.c}}" == "")"_fmt(empty)) == R"("" == "")");
-
-        // Dotted Names - Broken Chain Resolution
-        CHECK(to_string(R"("{{a.b.c.name}}" == "")"_fmt(
-            object{
-                {"a", object{{"b", empty}}},
-                {"c", object{{"name", "Jim"}}}
-            })) == R"("" == "")");
-
-        // Dotted Names - Initial Resolution
-        CHECK(to_string(R"("{{#a}}{{b.c.d.e.name}}{{/a}}" == "Phil")"_fmt(
-            object{
-                {"a", object{{"b", object{{"c", object{{"d", object{{"e", object{{"name", "Phil"}}}}}}}}}}},
-                {"c", object{{"c", object{{"d", object{{"e", object{{"name", "Wrong"}}}}}}}}}
-        })) == R"("Phil" == "Phil")");
-
-        // Dotted Names - Context Precedence
-        CHECK(to_string("{{#a}}{{b.c}}{{/a}}"_fmt(object{{"b", empty}, {"c", "ERROR"}})) == "");
-    }
-
-    object s{{"string", "---"}};
-
-    // Whitespace Sensitivity
-    {
-        // Interpolation - Surrounding Whitespace
-        CHECK(to_string("| {{string}} |"_fmt(s)) == "| --- |");
-
-        // Triple Mustache - Surrounding Whitespace
-        CHECK(to_string("| {{{string}}} |"_fmt(s)) == "| --- |");
-
-        // Ampersand - Surrounding Whitespace
-        CHECK(to_string("| {{&string}} |"_fmt(s)) == "| --- |");
-
-        // Interpolation - Standalone
-        CHECK(to_string("  {{string}}\n"_fmt(s)) == "  ---\n");
-
-        // Triple Mustache - Standalone
-        CHECK(to_string("  {{{string}}}\n"_fmt(s)) == "  ---\n");
-
-        // Ampersand - Standalone
-        CHECK(to_string("  {{&string}}\n"_fmt(s)) == "  ---\n");
-    }
-
-    // Whitespace Insensitivity
-    {
-        // Interpolation With Padding
-        CHECK(to_string("|{{ string }}|"_fmt(s)) == "|---|");
-
-        // Triple Mustache With Padding
-        CHECK(to_string("|{{{ string }}}|"_fmt(s)) == "|---|");
-
-        // Ampersand With Padding
-        CHECK(to_string("|{{& string }}|"_fmt(s)) == "|---|");
-    }
-}
-
-TEST_CASE("sections")
-{
-    object const empty;
-
-    // Truthy
-    CHECK(to_string(R"("{{#boolean}}This should be rendered.{{/boolean}}")"_fmt(object{{"boolean", true}}))
-        == R"("This should be rendered.")");
-
-    // Falsey
-    CHECK(to_string(R"("{{#boolean}}This should not be rendered.{{/boolean}}")"_fmt(object{{"boolean", false}}))
-        == R"("")");
-
-    // Context
-    CHECK(to_string(R"("{{#context}}Hi {{name}}.{{/context}}")"_fmt(object{{"context", object{{"name", "Joe"}}}}))
-        == R"("Hi Joe.")");
-
-    // Deeply Nested Contexts
-    CHECK(to_string(
-        "{{#a}}\n"
-        "{{one}}\n"
-        "{{#b}}\n"
-        "{{one}}{{two}}{{one}}\n"
-        "{{#c}}\n"
-        "{{one}}{{two}}{{three}}{{two}}{{one}}\n"
-        "{{#d}}\n"
-        "{{one}}{{two}}{{three}}{{four}}{{three}}{{two}}{{one}}\n"
-        "{{#e}}\n"
-        "{{one}}{{two}}{{three}}{{four}}{{five}}{{four}}{{three}}{{two}}{{one}}\n"
-        "{{/e}}\n"
-        "{{one}}{{two}}{{three}}{{four}}{{three}}{{two}}{{one}}\n"
-        "{{/d}}\n"
-        "{{one}}{{two}}{{three}}{{two}}{{one}}\n"
-        "{{/c}}\n"
-        "{{one}}{{two}}{{one}}\n"
-        "{{/b}}\n"
-        "{{one}}\n"
-        "{{/a}}"_fmt(object{
-            {"a", object{{"one", 1}}},
-            {"b", object{{"two", 2}}},
-            {"c", object{{"three", 3}}},
-            {"d", object{{"four", 4}}},
-            {"e", object{{"five", 5}}}}))
-        == 
-        "1\n"
-        "121\n"
-        "12321\n"
-        "1234321\n"
-        "123454321\n"
-        "1234321\n"
-        "12321\n"
-        "121\n"
-        "1\n");
-
-    // List
-    CHECK(to_string(R"("{{#list}}{{item}}{{/list}}")"_fmt(object{{"list", array{object{{"item", 1}}, object{{"item", 2}}, object{{"item", 3}}}}}))
-        == R"("123")");
-
-    // Empty List
-    CHECK(to_string(R"("{{#list}}Yay lists!{{/list}}")"_fmt(object{{"list", array{}}})) == R"("")");
-
-    // Doubled
-    CHECK(to_string(
-        "{{#bool}}\n"
-        "* first\n"
-        "{{/bool}}\n"
-        "* {{two}}\n"
-        "{{#bool}}\n"
-        "* third\n"
-        "{{/bool}}"_fmt(object{{"bool", true}, {"two", "second"}}))
-        == 
-        "* first\n"
-        "* second\n"
-        "* third\n");
-
-    // Nested (Truthy)
-    CHECK(to_string("| A {{#bool}}B {{#bool}}C{{/bool}} D{{/bool}} E |"_fmt(object{{"bool", true}})) == "| A B C D E |");
-
-    // Nested (Falsey)
-    CHECK(to_string("| A {{#bool}}B {{#bool}}C{{/bool}} D{{/bool}} E |"_fmt(object{{"bool", false}})) == "| A  E |");
-
-    // Context Misses
-    CHECK(to_string("[{{#missing}}Found key 'missing'!{{/missing}}]"_fmt(empty)) == "[]");
-
-    // Implicit Iterators
-    {
-        // Implicit Iterator - String
-        CHECK(to_string(R"#("{{#list}}({{.}}){{/list}}")#"_fmt(object{{"list", array{1, 2, 3, 4, 5}}})) == R"#("(1)(2)(3)(4)(5)")#");
-
-        // Implicit Iterator - Decimal
-        CHECK(to_string(R"#("{{#list}}({{.}}){{/list}}")#"_fmt(object{{"list", array{1.1, 2.2, 3.3, 4.4, 5.5}}})) == R"#("(1.1)(2.2)(3.3)(4.4)(5.5)")#");
-
-        // Implicit Iterator - Array
-        CHECK(to_string(R"#("{{#list}}({{#.}}{{.}}{{/.}}){{/list}}")#"_fmt(object{{"list", array{array{1, 2, 3}, array{"a", "b", "c"}}}})) == R"#("(123)(abc)")#");
-    }
-
-    // Dotted Names
-    {
-        // Dotted Names - Truthy
-        CHECK(to_string(R"("{{#a.b.c}}Here{{/a.b.c}}" == "Here")"_fmt(object{{"a", object{{"b", object{{"c", true}}}}}})) == R"("Here" == "Here")");
-
-        // Dotted Names - Falsey
-        CHECK(to_string(R"("{{#a.b.c}}Here{{/a.b.c}}" == "")"_fmt(object{{"a", object{{"b", object{{"c", false}}}}}})) == R"("" == "")");
-
-        // Dotted Names - Broken Chains
-        CHECK(to_string(R"("{{#a.b.c}}Here{{/a.b.c}}" == "")"_fmt(object{{"a", empty}})) == R"("" == "")");
-    }
-
-    object const o{{"boolean", true}};
-
-    // Whitespace Sensitivity
-    {
-        // Surrounding Whitespace
-        CHECK(to_string(" | {{#boolean}}\t|\t{{/boolean}} | \n"_fmt(o)) == " | \t|\t | \n");
-
-        // Internal Whitespace
-        CHECK(to_string(" | {{#boolean}} {{! Important Whitespace }}\n {{/boolean}} | \n"_fmt(o)) == " |  \n  | \n");
-
-        // Indented Inline Sections
-        CHECK(to_string(" {{#boolean}}YES{{/boolean}}\n {{#boolean}}GOOD{{/boolean}}\n"_fmt(o)) == " YES\n GOOD\n");
-
-        // Standalone Lines
-        CHECK(to_string(
-            "| This Is\n"
-            "{{#boolean}}\n"
-            "|\n"
-            "{{/boolean}}\n"
-            "| A Line"_fmt(o))
-            ==
-            "| This Is\n"
-            "|\n"
-            "| A Line");
-
-        // Indented Standalone Lines
-        CHECK(to_string(
-            "| This Is\n"
-            "  {{#boolean}}\n"
-            "|\n"
-            "  {{/boolean}}\n"
-            "| A Line"_fmt(o))
-            ==
-            "| This Is\n"
-            "|\n"
-            "| A Line");
-
-        //  Standalone Line Endings
-        CHECK(to_string("|\r\n{{#boolean}}\r\n{{/boolean}}\r\n|"_fmt(o)) == "|\r\n|");
-
-        // Standalone Without Previous Line
-        CHECK(to_string("  {{#boolean}}\n#{{/boolean}}\n/"_fmt(o)) == "#\n/");
-
-        // Standalone Without Newline
-        CHECK(to_string("#{{#boolean}}\n/\n  {{/boolean}}"_fmt(o)) == "#\n/\n");
-    }
-
-    // Whitespace Insensitivity
-    {
-        CHECK(to_string("|{{# boolean }}={{/ boolean }}|"_fmt(o)) == "|=|");
-    }
-}
-
-TEST_CASE("inverted")
-{
-    object const empty;
-
-    // Falsey
-    CHECK(to_string(R"("{{^boolean}}This should be rendered.{{/boolean}}")"_fmt(object{{"boolean", false}})) == R"("This should be rendered.")");
-
-    // Truthy
-    CHECK(to_string(R"("{{^boolean}}This should not be rendered.{{/boolean}}")"_fmt(object{{"boolean", true}})) == R"("")");
-
-    // Context
-    CHECK(to_string(R"("{{^context}}Hi {{name}}.{{/context}}")"_fmt(object{{"context", object{{"name", "Joe"}}}})) == R"("")");
-
-    // List
-    CHECK(to_string(R"("{{^list}}{{n}}{{/list}}")"_fmt(object{{"list", array{object{{"n", 1}}, object{{"n", 2}}, object{{"n", 3}}}}})) == R"("")");
-
-    // Empty List
-    CHECK(to_string(R"("{{^list}}Yay lists!{{/list}}")"_fmt(object{{"list", array{}}})) == R"("Yay lists!")");
-
-    // Doubled
-    CHECK(to_string(
-        "{{^bool}}\n"
-        "* first\n"
-        "{{/bool}}\n"
-        "* {{two}}\n"
-        "{{^bool}}\n"
-        "* third\n"
-        "{{/bool}}"_fmt(object{{"bool", false}, {"two", "second"}}))
-        ==
-        "* first\n"
-        "* second\n"
-        "* third\n");
-
-    // Nested (Falsey)
-    CHECK(to_string("| A {{^bool}}B {{^bool}}C{{/bool}} D{{/bool}} E |"_fmt(object{{"bool", false}})) == "| A B C D E |");
-
-    // Nested (Truthy)
-    CHECK(to_string("| A {{^bool}}B {{^bool}}C{{/bool}} D{{/bool}} E |"_fmt(object{{"bool", true}})) == "| A  E |");
-
-    // Context Misses
-    CHECK(to_string("[{{^missing}}Cannot find key 'missing'!{{/missing}}]"_fmt(empty)) == "[Cannot find key 'missing'!]");
-
-    // Dotted Names
-    {
-        // Dotted Names - Truthy
-        CHECK(to_string(R"("{{^a.b.c}}Not Here{{/a.b.c}}" == "")"_fmt(object{{"a", object{{"b", object{{"c", true}}}}}})) == R"("" == "")");
-
-        // Dotted Names - Falsey
-        CHECK(to_string(R"("{{^a.b.c}}Not Here{{/a.b.c}}" == "Not Here")"_fmt(object{{"a", object{{"b", object{{"c", false}}}}}})) == R"("Not Here" == "Not Here")");
-
-        // Dotted Names - Broken Chains
-        CHECK(to_string(R"("{{^a.b.c}}Not Here{{/a.b.c}}" == "Not Here")"_fmt(object{{"a", empty}})) == R"("Not Here" == "Not Here")");
-    }
-
-    object const o{{"boolean", false}};
-
-    // Whitespace Sensitivity
-    {
-        // Surrounding Whitespace
-        CHECK(to_string(" | {{^boolean}}\t|\t{{/boolean}} | \n"_fmt(o)) == " | \t|\t | \n");
-
-        // Internal Whitespace
-        CHECK(to_string(" | {{^boolean}} {{! Important Whitespace }}\n {{/boolean}} | \n"_fmt(o)) == " |  \n  | \n");
-
-        // Indented Inline Sections
-        CHECK(to_string(" {{^boolean}}YES{{/boolean}}\n {{^boolean}}GOOD{{/boolean}}\n"_fmt(o)) == " YES\n GOOD\n");
-
-        // Standalone Lines
-        CHECK(to_string(
-            "| This Is\n"
-            "{{^boolean}}\n"
-            "|\n"
-            "{{/boolean}}\n"
-            "| A Line"_fmt(o))
-            ==
-            "| This Is\n"
-            "|\n"
-            "| A Line");
-
-        // Indented Standalone Lines
-        CHECK(to_string(
-            "| This Is\n"
-            "  {{^boolean}}\n"
-            "|\n"
-            "  {{/boolean}}\n"
-            "| A Line"_fmt(o))
-            ==
-            "| This Is\n"
-            "|\n"
-            "| A Line");
-
-        //  Standalone Line Endings
-        CHECK(to_string("|\r\n{{^boolean}}\r\n{{/boolean}}\r\n|"_fmt(o)) == "|\r\n|");
-
-        // Standalone Without Previous Line
-        CHECK(to_string("  {{^boolean}}\n#{{/boolean}}\n/"_fmt(o)) == "#\n/");
-
-        // Standalone Without Newline
-        CHECK(to_string("#{{^boolean}}\n/\n  {{/boolean}}"_fmt(o)) == "#\n/\n");
-    }
-
-    // Whitespace Insensitivity
-    {
-        CHECK(to_string("|{{^ boolean }}={{/ boolean }}|"_fmt(o)) == "|=|");
-    }
-}
-
-TEST_CASE("delimiters")
-{
-    // Pair Behavior
-    CHECK(to_string("{{=<% %>=}}(<%text%>)"_fmt(object{{"text", "Hey!"}})) == "(Hey!)");
-
-    // Special Characters
-    CHECK(to_string("({{=[ ]=}}[text])"_fmt(object{{"text", "It worked!"}})) == "(It worked!)");
-
-    // Sections
-    CHECK(to_string(
-        "[\n"
-        "{{#section}}\n"
-        "  {{data}}\n"
-        "  |data|\n"
-        "{{/section}}\n"
-        "{{= | | =}}\n"
-        "|#section|\n"
-        "  {{data}}\n"
-        "  |data|\n"
-        "|/section|\n"
-        "]"_fmt(object{{"section", true}, {"data", "I got interpolated."}}))
-        == 
-        "[\n"
-        "  I got interpolated.\n"
-        "  |data|\n"
-        "  {{data}}\n"
-        "  I got interpolated.\n"
-        "]");
-
-    // Inverted Sections
-    CHECK(to_string(
-        "[\n"
-        "{{^section}}\n"
-        "  {{data}}\n"
-        "  |data|\n"
-        "{{/section}}\n"
-        "{{= | | =}}\n"
-        "|^section|\n"
-        "  {{data}}\n"
-        "  |data|\n"
-        "|/section|\n"
-        "]"_fmt(object{{"section", false},{"data", "I got interpolated."}}))
-        ==
-        "[\n"
-        "  I got interpolated.\n"
-        "  |data|\n"
-        "  {{data}}\n"
-        "  I got interpolated.\n"
-        "]");
-
-    // Partial Inheritence
-    CHECK(to_string(
-        "[ {{>include}} ]\n"
-        "{{= | | =}}\n"
-        "[ |>include| ]"_fmt(object{{"value", "yes"}}, context{{"include", ".{{value}}."_fmt}}))
-        ==
-        "[ .yes. ]\n"
-        "[ .yes. ]");
-
-    // Post-Partial Behavior
-    CHECK(to_string(
-        "[ {{>include}} ]\n"
-        "[ .{{value}}.  .|value|. ]"_fmt(object{{"value", "yes"}}, context{{"include", ".{{value}}. {{= | | =}} .|value|."_fmt}}))
-        ==
-        "[ .yes.  .yes. ]\n"
-        "[ .yes.  .|value|. ]");
-
-    object const empty;
-
-    // Whitespace Sensitivity
-    {
-        // Surrounding Whitespace
-        CHECK(to_string("| {{=@ @=}} |"_fmt(empty)) == "|  |");
-
-        // Outlying Whitespace (Inline)
-        CHECK(to_string(" | {{=@ @=}}\n"_fmt(empty)) == " | \n");
-
-        // Standalone Tag
-        CHECK(to_string(
-            "Begin.\n"
-            "{{=@ @=}}\n"
-            "End."_fmt(empty))
-            == 
-            "Begin.\n"
-            "End.");
-
-        // Indented Standalone Tag
-        CHECK(to_string(
-            "Begin.\n"
-            "  {{=@ @=}}\n"
-            "End."_fmt(empty))
-            ==
-            "Begin.\n"
-            "End.");
-
-        // Standalone Line Endings
-        CHECK(to_string("|\r\n{{= @ @ =}}\r\n|"_fmt(empty)) == "|\r\n|");
-
-        // Standalone Without Previous Line
-        CHECK(to_string("  {{=@ @=}}\n="_fmt(empty)) == "=");
-
-        // Standalone Without Newline
-        CHECK(to_string("=\n  {{=@ @=}}"_fmt(empty)) == "=\n");
-    }
-
-    // Whitespace Insensitivity
-    {
-        // Pair with Padding
-        CHECK(to_string("|{{= @   @ =}}|"_fmt(empty)) == "||");
-    }
-}
-
-TEST_CASE("comments")
-{
-    object const empty;
-
-    // Inline
-    CHECK(to_string("12345{{! Comment Block! }}67890"_fmt(empty)) == "1234567890");
-
-    // Multiline
-    CHECK(to_string(
-        "12345{{!\n"
-        "  This is a\n"
-        "  multi-line comment...\n"
-        "}}67890"_fmt(empty))
-        == 
-        "1234567890");
-
-    // Standalone
-    CHECK(to_string(
-        "Begin.\n"
-        "{{! Comment Block! }}\n"
-        "End."_fmt(empty))
-        ==
-        "Begin.\n"
-        "End.");
-
-    // Indented Standalone
-    CHECK(to_string(
-        "Begin.\n"
-        "  {{! Comment Block! }}\n"
-        "End."_fmt(empty))
-        ==
-        "Begin.\n"
-        "End.");
-
-    // Standalone Line Endings
-    CHECK(to_string("|\r\n{{! Standalone Comment }}\r\n|"_fmt(empty)) == "|\r\n|");
-
-    // Standalone Without Previous Line
-    CHECK(to_string("  {{! I'm Still Standalone }}\n!"_fmt(empty)) == "!");
-
-    // Standalone Without Newline
-    CHECK(to_string("!\n  {{! I'm Still Standalone }}"_fmt(empty)) == "!\n");
-
-    // Multiline Standalone
-    CHECK(to_string(
-        "Begin.\n"
-        "{{!\n"
-        "Something's going on here...\n"
-        "}}\n"
-        "End."_fmt(empty))
-        ==
-        "Begin.\n"
-        "End.");
-
-    // Indented Multiline Standalone
-    CHECK(to_string(
-        "Begin.\n"
-        "  {{!\n"
-        "    Something's going on here...\n"
-        "  }}\n"
-        "End."_fmt(empty))
-        ==
-        "Begin.\n"
-        "End.");
-
-    // Indented Inline
-    CHECK(to_string("  12 {{! 34 }}\n"_fmt(empty)) == "  12 \n");
-
-    // Surrounding Whitespace
-    CHECK(to_string("12345 {{! Comment Block! }} 67890"_fmt(empty)) == "12345  67890");
-}
-
-TEST_CASE("partials")
-{
-    object const empty;
-
-    // Basic Behavior
-    CHECK(to_string(R"("{{>text}}")"_fmt(empty, context{{"text", "from partial"_fmt}})) == R"("from partial")");
-
-    // Failed Lookup
-    CHECK(to_string(R"("{{>text}}")"_fmt(empty)) == R"("")");
-
-    // Context
-    CHECK(to_string(R"("{{>partial}}")"_fmt(object{{"text", "content"}}, context{{"partial", "*{{text}}*"_fmt}})) == R"("*content*")");
-
-    // Recursion
-    CHECK(to_string("{{>node}}"_fmt(object{
-        {"content", "X"},
-        {"nodes", array{object{{"content", "Y"}, {"nodes", array{}}}}}
-    }, context{{"node", "{{content}}<{{#nodes}}{{>node}}{{/nodes}}>"_fmt}})) == "X<Y<>>");
-
-    // Whitespace Sensitivity
-    {
-        // Surrounding Whitespace
-        CHECK(to_string("| {{>partial}} |"_fmt(empty, context{{"partial", "\t|\t"_fmt}})) == "| \t|\t |");
-
-        // Inline Indentation
-        CHECK(to_string("  {{data}}  {{> partial}}\n"_fmt(object{{"data", "|"}}, context{{"partial", ">\n>"_fmt}})) == "  |  >\n>\n");
-
-        // Standalone Line Endings
-        CHECK(to_string("|\r\n{{>partial}}\r\n|"_fmt(empty, context{{"partial", ">"_fmt}})) == "|\r\n>|");
-
-        // Standalone Without Previous Line
-        CHECK(to_string("  {{>partial}}\n>"_fmt(empty, context{{"partial", ">\n>"_fmt}})) == "  >\n  >>");
-
-        // Standalone Without Newline
-        CHECK(to_string(">\n  {{>partial}}"_fmt(empty, context{{"partial", ">\n>"_fmt}})) == ">\n  >\n  >");
-
-        // Standalone Indentation
-        CHECK(to_string(
-            "\\\n"
-            " {{>partial}}\n"
-            "/"_fmt(object{{"content", "<\n->"}},
-                context{{"partial",
-                "|\n"
-                "{{{content}}}\n"
-                "|\n"_fmt}}))
-            == 
-            "\\\n"
-            " |\n"
-            " <\n"
-            "->\n"
-            " |\n"
-            "/");
-    }
-
-    // Whitespace Insensitivity
-    {
-        // Padding Whitespace
-        CHECK(to_string("|{{> partial }}|"_fmt(empty, context{{"partial", "[]"_fmt}})) == "|[]|");
-    }
-}
-
-TEST_CASE("lambdas")
-{
-    // Interpolation
-    CHECK(to_string("Hello, {{lambda}}!"_fmt(object{{"lambda", [] { return "world"; }}})) == "Hello, world!");
-
-    // Interpolation - Expansion
-    CHECK(to_string(
-        "Hello, {{lambda}}!"_fmt(object{
-            {"lambda", [] { return "{{planet}}"_fmt; }},
-            {"planet", "world"}}))
-        ==
-        "Hello, world!");
-
-    // Interpolation - Alternate Delimiters
-    CHECK(to_string(
-        "{{= | | =}}\nHello, (|&lambda|)!"_fmt(object{
-            {"lambda", [] { return "|planet| => {{planet}}"_fmt; }},
-            {"planet", "world"}}))
-        ==
-        "Hello, (|planet| => world)!");
-
-    // Interpolation - Multiple Calls
-    CHECK(to_string(
-        "{{lambda}} == {{{lambda}}} == {{lambda}}"_fmt(object{
-            {"lambda", [n = 0]() mutable { return ++n; }}}))
-        ==
-        "1 == 2 == 3");
-
-    // Escaping
-    CHECK(to_string("<{{lambda}}{{{lambda}}}"_fmt(object{{"lambda", [] { return ">"; }}}, escape_html)) == "<&gt;>");
-
-    // Section - Expansion
-    CHECK(to_string("<{{#lambda}}-{{/lambda}}>"_fmt(object{
-        {"lambda", [](ast::content_list const& contents) {
-            ast::content_list list;
-            list.insert(list.end(), contents.begin(), contents.end());
-            list.push_back(ast::variable{"planet"});
-            list.insert(list.end(), contents.begin(), contents.end());
-            return format(std::move(list), false);
-        }},
-        {"planet", "Earth"}}))
-        ==
-        "<-Earth->");
-
-    // Section - Multiple Calls
-    CHECK(to_string("{{#lambda}}FILE{{/lambda}} != {{#lambda}}LINE{{/lambda}}"_fmt(object{
-        {"lambda", [](ast::content_list const& contents) {
-            ast::content_list list;
-            list.push_back(ast::text("__"));
-            list.insert(list.end(), contents.begin(), contents.end());
-            list.push_back(ast::text("__"));
-            return format(std::move(list), false);
-        }}}))
-        ==
-        "__FILE__ != __LINE__");
-
-    // Inverted Section
-    CHECK(to_string("<{{^lambda}}{{static}}{{/lambda}}>"_fmt(object{
-        {"lambda", [](ast::content_list const&) { return false; }},
-        {"static", "static"}}))
-        ==
-        "<>");
-}
\ No newline at end of file
diff --git a/thirdparty/bustache/test/variant.cpp b/thirdparty/bustache/test/variant.cpp
deleted file mode 100644
index 9e04858..0000000
--- a/thirdparty/bustache/test/variant.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-/*//////////////////////////////////////////////////////////////////////////////
-    Copyright (c) 2016-2017 Jamboree
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
-#define CATCH_CONFIG_MAIN
-#include <catch.hpp>
-#include <bustache/detail/variant.hpp>
-
-struct BadCopyError {};
-
-struct BadCopy
-{
-    BadCopy() = default;
-
-    BadCopy(BadCopy&&) = default;
-
-    BadCopy(BadCopy const&)
-    {
-        throw BadCopyError();
-    }
-
-    BadCopy& operator=(BadCopy const&)
-    {
-        throw BadCopyError();
-    }
-
-    BadCopy& operator=(BadCopy&&) = default;
-};
-
-struct A
-{
-    A() = default;
-
-    A(A&& other) noexcept
-    {
-        other.moved = true;
-    }
-
-    A(A const&) = default;
-
-    A& operator=(A&& other) noexcept
-    {
-        assigned = true;
-        other.moved = true;
-        return *this;
-    }
-
-    A& operator=(A const& other) noexcept
-    {
-        assigned = true;
-        return *this;
-    }
-
-    bool assigned = false;
-    bool moved = false;
-};
-
-struct GoodInt
-{
-    operator int() const noexcept
-    {
-        return 0;
-    }
-};
-
-struct BadIntError {};
-
-struct BadInt
-{
-    operator int() const
-    {
-        throw BadIntError();
-    }
-};
-
-struct Visitor
-{
-    unsigned operator()(bool const&) const
-    {
-        return 0;
-    }
-
-    unsigned operator()(int const&) const
-    {
-        return 1;
-    }
-
-    unsigned operator()(A const&) const
-    {
-        return 2;
-    }
-
-    unsigned operator()(BadCopy const&) const
-    {
-        return 3;
-    }
-};
-
-namespace bustache
-{
-#define VAR(X, D)                                                               \
-    X(0, bool, D)                                                               \
-    X(1, int, D)                                                                \
-    X(2, A, D)                                                                  \
-    X(3, BadCopy, D)                                                            \
-/***/
-    class Var : public variant_base<Var>
-    {
-        VAR(Zz_BUSTACHE_VARIANT_MATCH,)
-    public:
-        Zz_BUSTACHE_VARIANT_DECL(Var, VAR, false)
-
-        Var() noexcept : _which(0), _0() {}
-    };
-#undef VAR
-}
-
-using namespace bustache;
-
-TEST_CASE("variant-ctor")
-{
-    {
-        Var v;
-        CHECK(v.valid());
-        CHECK(v.which() == 0);
-        Var v2(v);
-        CHECK(v.which() == 0);
-    }
-    {
-        Var v(true);
-        CHECK(v.valid());
-        CHECK(v.which() == 0);
-        Var v2(v);
-        CHECK(v.which() == 0);
-    }
-    {
-        Var v(0);
-        CHECK(v.valid());
-        CHECK(v.which() == 1);
-        Var v2(v);
-        CHECK(v.which() == 1);
-    }
-    {
-        Var v(A{});
-        CHECK(v.valid());
-        CHECK(v.which() == 2);
-        Var v2(v);
-        CHECK(v.which() == 2);
-    }
-    {
-        Var v(BadCopy{});
-        CHECK(v.valid());
-        CHECK(v.which() == 3);
-        CHECK_THROWS_AS(Var{v}, BadCopyError);
-    }
-    {   // Test convertible.
-        Var v(GoodInt{});
-        CHECK(v.valid());
-        CHECK(v.which() == 1);
-    }
-    {
-        Var v1(A{});
-        CHECK(v1.which() == 2);
-        Var v2(std::move(v1));
-        CHECK(v1.which() == 2);
-        CHECK(v2.which() == 2);
-        CHECK(get<A>(v1).moved == true);
-    }
-}
-
-TEST_CASE("variant-access")
-{
-    Var v;
-    CHECK(v.which() == 0);
-    CHECK(get<bool>(&v) != nullptr);
-    CHECK(get<bool>(v) == false);
-    CHECK(get<int>(&v) == nullptr);
-    CHECK_THROWS_AS(get<int>(v), bad_variant_access);
-    v = 1024;
-    CHECK(v.which() == 1);
-    CHECK(get<int>(&v) != nullptr);
-    CHECK(get<int>(v) == 1024);
-    get<int>(v) = true;
-    CHECK(v.which() == 1);
-    CHECK(get<int>(v) == 1);
-    v = true;
-    CHECK(v.which() == 0);
-    CHECK(get<bool>(v) == true);
-    CHECK_THROWS_AS(get<A>(v), bad_variant_access);
-    {
-        REQUIRE(v.which() != 2);
-        auto& a = v = A();
-        CHECK(v.which() == 2);
-        CHECK(get<A>(&v) != nullptr);
-        CHECK(get<A>(&v) == &a);
-        CHECK(!a.assigned);
-    }
-    {
-        REQUIRE(v.which() == 2);
-        auto& b = v = A();
-        CHECK(v.which() == 2);
-        CHECK(get<A>(&v) == &b);
-        CHECK(b.assigned);
-    }
-}
-
-TEST_CASE("variant-valuess-by-exception")
-{
-    Var v;
-    CHECK(v.valid());
-    CHECK_THROWS_AS(v = BadInt(), BadIntError);
-    CHECK(v.which() != 0);
-    CHECK(!v.valid());
-    v = 42;
-    CHECK(v.valid());
-
-    Var v2(BadCopy{});
-    CHECK_THROWS_AS(v = v2, BadCopyError);
-    CHECK(!v.valid());
-    CHECK(v2.which() == 3);
-}
-
-TEST_CASE("variant-visit")
-{
-    Visitor v;
-    CHECK(visit(v, Var{}) == 0);
-    CHECK(visit(v, Var{true}) == 0);
-    CHECK(visit(v, Var{0}) == 1);
-    CHECK(visit(v, Var{A{}}) == 2);
-    CHECK(visit(v, Var{BadCopy{}}) == 3);
-}
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/.clang-format b/thirdparty/civetweb-1.10/.clang-format
deleted file mode 100644
index 37a80d9..0000000
--- a/thirdparty/civetweb-1.10/.clang-format
+++ /dev/null
@@ -1,32 +0,0 @@
-# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
-
-BasedOnStyle: LLVM
-
-IndentWidth: 4
-TabWidth: 4
-UseTab: ForIndentation
-ColumnLimit: 80
-
-Language: Cpp
-
-AlignAfterOpenBracket: true
-AllowAllParametersOfDeclarationOnNextLine: false
-AllowShortBlocksOnASingleLine: false
-AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
-AlwaysBreakAfterDefinitionReturnType: true
-BinPackArguments: false
-BinPackParameters: false
-BreakBeforeBinaryOperators: NonAssignment
-BreakBeforeBraces: Linux
-DerivePointerAlignment: false
-MaxEmptyLinesToKeep: 2
-PenaltyBreakBeforeFirstCallParameter: 100
-
-SpaceBeforeParens: ControlStatements
-SpaceInEmptyParentheses: false
-SpacesInSquareBrackets: false
-
-DisableFormat: false
diff --git a/thirdparty/civetweb-1.10/.gitattributes b/thirdparty/civetweb-1.10/.gitattributes
deleted file mode 100644
index 5c52867..0000000
--- a/thirdparty/civetweb-1.10/.gitattributes
+++ /dev/null
@@ -1,33 +0,0 @@
-# Auto detect text files and perform LF normalization
-* -text
-
-# Custom for Visual Studio
-*.cs     diff=csharp
-*.sln    merge=union
-*.csproj merge=union
-*.vbproj merge=union
-*.fsproj merge=union
-*.dbproj merge=union
-
-# Standard to msysgit
-*.doc    diff=astextplain
-*.DOC    diff=astextplain
-*.docx   diff=astextplain
-*.DOCX   diff=astextplain
-*.dot    diff=astextplain
-*.DOT    diff=astextplain
-*.pdf    diff=astextplain
-*.PDF    diff=astextplain
-*.rtf    diff=astextplain
-*.RTF    diff=astextplain
-
-# Preserver Windows specfic lines endings
-*.cmd text eol=crlf
-
-
-# Settings for github syntax highlighting
-# see https://github.com/github/linguist/blob/master/README.md
-docs/* linguist-documentation
-*.inl linguist-language=C
-*.h linguist-language=C
-include/CivetServer.h linguist-language=C++
diff --git a/thirdparty/civetweb-1.10/.gitignore b/thirdparty/civetweb-1.10/.gitignore
deleted file mode 100644
index f10aa01..0000000
--- a/thirdparty/civetweb-1.10/.gitignore
+++ /dev/null
@@ -1,268 +0,0 @@
-
-civetweb
-civetweb_test
-libcivetweb.a
-libcivetweb.so
-*-cache
-out
-*.dmg
-*.msi
-*.exe
-*.zip
-[oO]utput
-[tT]esting
-
-*.o
-
-#################
-## CMake
-#################
-/CMakeCache.txt
-/CMakeFiles
-/mingw-builds
-
-#################
-## Eclipse
-#################
-
-*.pydevproject
-.project
-.metadata
-bin/
-tmp/
-*.tmp
-*.bak
-*.swp
-*~.nib
-local.properties
-.classpath
-.settings/
-.loadpath
-
-# External tool builders
-.externalToolBuilders/
-
-# Locally stored "Eclipse launch configurations"
-*.launch
-
-# CDT-specific
-.cproject
-
-# PDT-specific
-.buildpath
-
-
-#################
-## Visual Studio
-#################
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-# User-specific files
-*.suo
-*.user
-*.sln.docstates
-
-# Text-mode IDE tools
-cscope.out
-tags
-
-# Build results
-
-[Dd]ebug/
-[Dd]ebug CONSOLE/
-[Rr]elease/
-x64/
-[Bb]in/
-[Oo]bj/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-*_i.c
-*_p.c
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.log
-*.scc
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# NCrunch
-*.ncrunch*
-.*crunch*.local.xml
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.Publish.xml
-*.pubxml
-
-# NuGet Packages Directory
-## TODO: If you have NuGet Package Restore enabled, uncomment the next line
-#packages/
-
-# Windows Azure Build Output
-csx
-*.build.csdef
-
-# Windows Store app package directory
-AppPackages/
-
-# Others
-sql/
-*.Cache
-ClientBin/
-[Ss]tyle[Cc]op.*
-~$*
-*~
-*.dbmdl
-*.[Pp]ublish.xml
-*.pfx
-*.publishsettings
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file to a newer
-# Visual Studio version. Backup files are not needed, because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-
-# SQL Server files
-App_Data/*.mdf
-App_Data/*.ldf
-
-#############
-## Windows detritus
-#############
-
-# Windows image file caches
-Thumbs.db
-ehthumbs.db
-
-# Folder config file
-Desktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Mac crap
-.DS_Store
-
-
-#############
-## Python
-#############
-
-*.py[co]
-
-# Packages
-*.egg
-*.egg-info
-dist/
-eggs/
-parts/
-var/
-sdist/
-develop-eggs/
-.installed.cfg
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-
-#Translations
-*.mo
-
-#Mr Developer
-.mr.developer.cfg
-
-
-##########################
-## Files created by tests
-##########################
-requests.db
-
-##########################
-## Files created by ctags
-##########################
-?tags
-?tags?
-
-##########################
-## Files created by autotools
-##########################
-*.lo
-.libs
-
-##########################
-## Travis Build Dir
-##########################
-ci/lua
-
-
diff --git a/thirdparty/civetweb-1.10/.travis.yml b/thirdparty/civetweb-1.10/.travis.yml
deleted file mode 100644
index 2dd926c..0000000
--- a/thirdparty/civetweb-1.10/.travis.yml
+++ /dev/null
@@ -1,694 +0,0 @@
-##############################################################################

-# Travis version specific build environment specification

-##############################################################################

-

-# The "precise" build environment on Travis is in the process of being decommissioned

-# see https://blog.travis-ci.com/2017-08-31-trusty-as-default-status

-# The "precise=true"+"sudo=required" environment seems to lack IPv6 support.

-# According to some tests, all "sudo=required" environments do not support IPv6, see 

-# https://github.com/travis-ci/travis-ci/issues/8361#issuecomment-328263113

-# The container environments for "sudo=false" support IPv6 localhost [::1] 

-# connections for server/client test. Thus, all tests with ENABLE_IPV6=YES

-#

-

-

-##############################################################################

-# Project specific settings

-##############################################################################

-

-language: c

-

-cache:

-  directories:

-  - $HOME/third-party

-

-osx_image: xcode8

-

-addons:

-  apt:

-    packages:

-      - cmake

-      - openssl

-      - libssl-dev

-    sources:

-      - kubuntu-backports

-

-

-before_install:

-  - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then

-      mkdir $HOME/usr;

-      export PATH="$HOME/usr/bin:$PATH";

-      wget https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.sh --no-check-certificate;

-      chmod +x cmake-3.7.2-Linux-x86_64.sh;

-      ./cmake-3.7.2-Linux-x86_64.sh --prefix=$HOME/usr --exclude-subdir --skip-license;

-    fi

-  - cmake --version

-

-

-install:

-  - if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then

-      PATH=~/.local/bin:${PATH};

-      pip install --user --upgrade pip;

-      pip install --user cpp-coveralls;

-    fi

-

-before_script:

-  # Check some settings of the build server (operating system, IPv6 availability, directory)

-  - uname -a

-  - ifconfig

-  - pwd

-  - ls -la

-  - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then

-      apt-cache search gcc | grep "GNU C compiler";

-      apt-cache search clang | grep compiler;

-    fi

-  - if [[ "${BUILD_TYPE}" == "OSX_OPENSSL_1_1" ]]; then brew install openssl@1.1 ;fi

-  # Generate the build scripts with CMake

-  - mkdir output

-  - gcc test/cgi_test.c -o output/cgi_test.cgi

-  - cd output

-  - cmake --version

-  - cmake

-    -G "Unix Makefiles"

-    -DCMAKE_BUILD_TYPE=${BUILD_TYPE}

-    -DBUILD_SHARED_LIBS=${BUILD_SHARED}

-    "-DCIVETWEB_THIRD_PARTY_DIR=${HOME}/third-party"

-    -DCIVETWEB_ENABLE_THIRD_PARTY_OUTPUT=YES

-    -DCIVETWEB_ENABLE_SSL=${ENABLE_SSL}

-    -DCIVETWEB_DISABLE_CGI=${NO_CGI}

-    -DCIVETWEB_SERVE_NO_FILES=${NO_FILES}

-    -DCIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=${ENABLE_SSL_DYNAMIC_LOADING}

-    -DCIVETWEB_SSL_OPENSSL_API_1_1=${OPENSSL_1_1}

-    -DCIVETWEB_ENABLE_WEBSOCKETS=${ENABLE_WEBSOCKETS}

-    -DCIVETWEB_ENABLE_CXX=${ENABLE_CXX}

-    -DCIVETWEB_ENABLE_IPV6=${ENABLE_IPV6}

-    -DCIVETWEB_ENABLE_SERVER_STATS=${ENABLE_SERVER_STATS}

-    -DCIVETWEB_ENABLE_LUA=${ENABLE_LUA}

-    -DCIVETWEB_ENABLE_LUA_SHARED=${ENABLE_LUA_SHARED}

-    -DCIVETWEB_ENABLE_DUKTAPE=${ENABLE_DUKTAPE}

-    -DCIVETWEB_DISABLE_CACHING=${NO_CACHING}

-    -DCIVETWEB_C_STANDARD=${C_STANDARD}

-    -DCIVETWEB_CXX_STANDARD=${CXX_STANDARD}

-    -DCIVETWEB_ALLOW_WARNINGS=${ALLOW_WARNINGS}

-    ${ADDITIONAL_CMAKE_ARGS}

-    ..

-  - ls -la

-

-script:

-  - if [ "${MACOSX_PACKAGE}" == "1" ]; then

-      cd "${TRAVIS_BUILD_DIR}";

-      make -f Makefile.osx package;

-    else

-      CTEST_OUTPUT_ON_FAILURE=1 make all test;

-    fi

-

-# Coveralls options: https://github.com/eddyxu/cpp-coveralls/blob/master/README.md

-after_success:

-  - if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then

-      coveralls --include src --exclude src/main.c --exclude src/third_party --include include --gcov-options '\-lp' --root .. --build-root .;

-      bash <(curl -s https://codecov.io/bash);

-    fi

-

-

-##############################################################################

-# build matrix (auto generated)

-##############################################################################

-

-

-matrix:

-  fast_finish: false

-  include:

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-precise-3.8

-        packages:

-          - clang-3.8

-    env:

-      idx=1

-      N=Clang3.8-Linux-Minimal-Debug

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-      BUILD_TYPE=Debug

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=0

-      BUILD_SHARED=NO

-      NO_FILES=YES

-      ENABLE_SSL=NO

-      NO_CGI=YES

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-precise-3.8

-        packages:

-          - clang-3.8

-    env:

-      idx=2

-      N=Clang3.8-Linux-Default-Release

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-precise-3.8

-        packages:

-          - clang-3.8

-    env:

-      idx=3

-      N=Clang3.8-Linux-Default-Release

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-precise-3.8

-        packages:

-          - clang-3.8

-    env:

-      idx=4

-      N=Clang3.8-Linux-Complete-NoLua-Release

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=YES

-      ALLOW_WARNINGS=YES

-

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: gcc

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-        packages:

-          - g++-5

-    env:

-      idx=5

-      N=GCC5-Linux-Complete-NoLua-Release

-      MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=YES

-      ALLOW_WARNINGS=YES

-  

-  - os: linux

-    compiler: gcc

-    env:

-      idx=6

-      N=GCCAnyVersion-Linux-Coverage

-      BUILD_TYPE=Coverage

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  - os: osx

-    compiler: clang

-    env:

-      idx=7

-      N=Clang-OSX-Complete-NoLua-Release

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=YES

-      ALLOW_WARNINGS=YES

-

-  -

-    os: osx

-    compiler: clang

-    env:

-      idx=8

-      N=Clang-OSX-Complete-NoLua-Release-OpenSSL_1_1_NoDynLoad

-      BUILD_TYPE=OSX_OPENSSL_1_1

-      ENABLE_SSL_DYNAMIC_LOADING=NO

-      OPENSSL_1_1=YES

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=YES

-      ALLOW_WARNINGS=YES

-      OPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1"

-      LDFLAGS="-L${OPENSSL_ROOT_DIR}/lib"

-      CFLAGS="-I${OPENSSL_ROOT_DIR}/include"

-      ADDITIONAL_CMAKE_ARGS="-DCMAKE_SHARED_LINKER_FLAGS=${LDFLAGS} -DCMAKE_C_FLAGS=${CFLAGS}"

-      PATH="${OPENSSL_ROOT_DIR}/bin:$PATH"

-      DYLD_LIBRARY_PATH="${OPENSSL_ROOT_DIR}/lib:${DYLD_LIBRARY_PATH}"

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-trusty-5.0

-        packages:

-          - clang-5.0

-    env:

-      idx=9

-      N=Clang50-Linux-Default-Shared

-      BUILD_TYPE=Debug

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=YES

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-

-  -

-    os: linux

-    dist: precise

-    sudo: required

-    compiler: clang

-    env:

-      idx=10

-      N=Precise-Clang-Linux-Default

-      BUILD_TYPE=Debug

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  -

-    os: osx

-    compiler: clang

-    env:

-      idx=11

-      N=OSX-Package

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-      MACOSX_PACKAGE=1

-

-  - dist: trusty

-    sudo: false

-    os: linux

-    compiler: clang

-    addons:

-      apt:

-        sources:

-          - ubuntu-toolchain-r-test

-          - llvm-toolchain-trusty-3.8

-        packages:

-          - clang-3.8

-    env:

-      idx=12

-      N=Clang-Linux-32bit-Complete-NoLua-Release

-      ARCH=x86

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_SERVER_STATS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=YES

-      ALLOW_WARNINGS=YES

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-

-

-### Test all build types:

-# According to CMakeLists, options are:

-# None Debug Release RelWithDebInfo MinSizeRel Coverage

-

-  -

-    os: linux

-    compiler: clang

-    env:

-      idx=13

-      N=NoSslDynamicLoading

-      BUILD_TYPE=Release

-      ENABLE_SSL_DYNAMIC_LOADING=NO

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      ENABLE_LUA_SHARED=NO

-      FEATURES=31

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=YES

-      ENABLE_WEBSOCKETS=YES

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-      MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

-

-  -

-    os: linux

-    compiler: gcc

-    env:

-      idx=14

-      N=GCCLinuxDefault_Debug

-      BUILD_TYPE=Debug

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  -

-    os: linux

-    compiler: gcc

-    env:

-      idx=15

-      N=GCCLinuxDefault_RelWithDebInfo

-      BUILD_TYPE=RelWithDebInfo

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  -

-    os: linux

-    compiler: gcc

-    env:

-      idx=16

-      N=GCCLinuxDefault_MinSizeRel

-      BUILD_TYPE=MinSizeRel

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-  -

-    os: linux

-    compiler: gcc

-    env:

-      idx=17

-      N=GCCLinuxDefault_None

-      BUILD_TYPE=None

-      ENABLE_SSL_DYNAMIC_LOADING=YES

-      OPENSSL_1_1=NO

-      ENABLE_CXX=NO

-      ENABLE_LUA_SHARED=NO

-      C_STANDARD=auto

-      CXX_STANDARD=auto

-      FEATURES=7

-      BUILD_SHARED=NO

-      NO_FILES=NO

-      ENABLE_SSL=YES

-      NO_CGI=NO

-      ENABLE_IPV6=NO

-      ENABLE_WEBSOCKETS=NO

-      ENABLE_LUA=NO

-      ENABLE_DUKTAPE=NO

-      NO_CACHING=NO

-      ALLOW_WARNINGS=YES

-

-

-#### Now all define combinations, but only for Linux clang

-##### Generated with Lua:

-#

-#  function YN(i,b)

-#    local bits = {}

-#    while (i > 0.5) do

-#      i = math.floor(i)

-#      bits[#bits+1] = (math.mod(i, 2) == 1)

-#      i = i/2

-#    end

-#    if (bits[b]) then

-#      return "YES"

-#    end

-#    return "NO"

-#  end

-#  function INV(t)

-#    if t=="YES" then

-#      return "NO"

-#    elseif t=="NO" then

-#      return "YES"

-#    else

-#      assert("ERROR in INV!")

-#    end

-#  end

-#  for i=0,511 do

-#    if (YN(i, 6)=="NO") and (YN(i, 7)=="NO") then

-#      print("  -")

-#      print("    os: linux")

-#      print("    compiler: clang")

-#      print("    env:")

-#      print("      N=C" .. tostring(i) .. "_")

-#      print("      BUILD_TYPE=Release")

-#      print("      ENABLE_SSL_DYNAMIC_LOADING=YES")

-#      print("      OPENSSL_1_1=NO")

-#      print("      ENABLE_CXX=NO")

-#      print("      C_STANDARD=auto")

-#      print("      CXX_STANDARD=auto")

-#      print("      ENABLE_LUA_SHARED=NO")

-#      print("      FEATURES=" .. tostring(i))

-#      print("      BUILD_SHARED=NO")

-#      print("      NO_FILES=" .. INV(YN(i, 1)))

-#      print("      ENABLE_SSL=" .. YN(i, 2))

-#      print("      NO_CGI=" .. INV(YN(i, 3)))

-#      print("      ENABLE_IPV6=" .. YN(i, 4))

-#      print("      ENABLE_WEBSOCKETS=" .. YN(i, 5))

-#      print("      ENABLE_LUA=" .. YN(i, 6))

-#      print("      ENABLE_DUKTAPE=" .. YN(i, 7))

-#      print("      NO_CACHING=" .. INV(YN(i, 8)))

-#      print("      ENABLE_SERVER_STATS=" .. YN(i, 9))

-#      print("")

-#    end

-#  end

-#

-

-# TODO: Regenerate this matrix, once a stable Travis build is re-established

-

-

diff --git a/thirdparty/civetweb-1.10/CMakeLists.txt b/thirdparty/civetweb-1.10/CMakeLists.txt
deleted file mode 100644
index f559a04..0000000
--- a/thirdparty/civetweb-1.10/CMakeLists.txt
+++ /dev/null
@@ -1,492 +0,0 @@
-# Determines what CMake APIs we can rely on
-cmake_minimum_required (VERSION 2.8.11)
-if (${CMAKE_VERSION} VERSION_GREATER 3.2.2)
-  cmake_policy(VERSION 3.2.2)
-endif()
-if (${CMAKE_VERSION} VERSION_GREATER 3.1 OR
-    ${CMAKE_VERSION} VERSION_EQUAL 3.1)
-  cmake_policy(SET CMP0054 NEW)
-endif()
-
-# Do not allow in source builds
-set(CMAKE_DISABLE_SOURCE_CHANGES ON)
-set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
-
-# Make sure we can import out CMake functions
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-
-# Load in the needed CMake modules
-include(CheckIncludeFiles)
-include(CheckCCompilerFlag)
-include(CheckCXXCompilerFlag)
-include(AddCCompilerFlag)
-include(AddCXXCompilerFlag)
-include(DetermineTargetArchitecture)
-include(CMakeDependentOption)
-
-# Set up the project
-project (civetweb)
-set(CIVETWEB_VERSION "1.10.0" CACHE STRING "The version of the civetweb library")
-string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CIVETWEB_VERSION_MATCH "${CIVETWEB_VERSION}")
-if ("${CIVETWEB_VERSION_MATCH}" STREQUAL "")
-  message(FATAL_ERROR "Must specify a semantic version: major.minor.patch")
-endif()
-set(CIVETWEB_VERSION_MAJOR "${CMAKE_MATCH_1}")
-set(CIVETWEB_VERSION_MINOR "${CMAKE_MATCH_2}")
-set(CIVETWEB_VERSION_PATCH "${CMAKE_MATCH_3}")
-determine_target_architecture(CIVETWEB_ARCHITECTURE)
-
-# Detect the platform reliably
-if(NOT MACOSX AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-   SET(DARWIN YES)
-elseif(NOT BSD AND ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
-    SET(FREEBSD YES)
-elseif(NOT LINUX AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
-    SET(LINUX YES)
-endif()
-
-# C++ wrappers
-option(CIVETWEB_ENABLE_THIRD_PARTY_OUTPUT "Shows the output of third party dependency processing" OFF)
-
-# Thread Stack Size
-set(CIVETWEB_THREAD_STACK_SIZE 102400 CACHE STRING
-  "The stack size in bytes for each thread created")
-set_property(CACHE CIVETWEB_THREAD_STACK_SIZE PROPERTY VALUE ${CIVETWEB_THREAD_STACK_SIZE})
-message(STATUS "Thread Stack Size - ${CIVETWEB_THREAD_STACK_SIZE}")
-
-# Serve no files from the web server
-option(CIVETWEB_SERVE_NO_FILES "Configures the server to serve no static files" OFF)
-message(STATUS "Serve no static files - ${CIVETWEB_SERVE_NO_FILES}")
-
-# Serve no files from the web server
-option(CIVETWEB_DISABLE_CGI "Disables CGI, so theserver will not execute CGI scripts" OFF)
-message(STATUS "Disable CGI support - ${CIVETWEB_DISABLE_CGI}")
-
-# Disable caching
-option(CIVETWEB_DISABLE_CACHING "Disables caching, so that no timegm is used." OFF)
-message(STATUS "Disable caching support - ${CIVETWEB_DISABLE_CACHING}")
-
-# C++ wrappers
-option(CIVETWEB_ENABLE_CXX "Enables the C++ wrapper library" OFF)
-message(STATUS "C++ wrappers - ${CIVETWEB_ENABLE_CXX}")
-
-# IP Version 6
-option(CIVETWEB_ENABLE_IPV6 "Enables the IP version 6 support" OFF)
-message(STATUS "IP Version 6 - ${CIVETWEB_ENABLE_IPV6}")
-
-# Websocket support
-option(CIVETWEB_ENABLE_WEBSOCKETS "Enable websockets connections" OFF)
-message(STATUS "Websockets support - ${CIVETWEB_ENABLE_WEBSOCKETS}")
-
-# Server statistics support
-option(CIVETWEB_ENABLE_SERVER_STATS "Enable server statistics" OFF)
-message(STATUS "Server statistics support - ${CIVETWEB_ENABLE_SERVER_STATS}")
-
-# Memory debugging
-option(CIVETWEB_ENABLE_MEMORY_DEBUGGING "Enable the memory debugging features" OFF)
-message(STATUS "Memory Debugging - ${CIVETWEB_ENABLE_MEMORY_DEBUGGING}")
-
-# ASAN in debug mode (-fsanitize=address, etc)
-option(CIVETWEB_ENABLE_ASAN "Enable ASAN in debug mode" ON)
-message(STATUS "ASAN in debug mode - ${CIVETWEB_ENABLE_ASAN}")
-
-# ARCH flag
-option(CIVETWEB_ARCH "Force 32/64 bit architecture" OFF)
-message(STATUS "Force x32 / x64 architecture - ${CIVETWEB_ARCH}")
-
-# LUA CGI support
-option(CIVETWEB_ENABLE_LUA "Enable Lua CGIs" OFF)
-message(STATUS "Lua CGI support - ${CIVETWEB_ENABLE_LUA}")
-
-# Enable installing CivetWeb executables
-option(CIVETWEB_INSTALL_EXECUTABLE "Enable installing CivetWeb executable" ON)
-mark_as_advanced(FORCE CIVETWEB_INSTALL_EXECUTABLE) # Advanced users can disable
-message(STATUS "Executable installation - ${CIVETWEB_INSTALL_EXECUTABLE}") 
-
-# Allow builds to complete with warnings (do not set -Werror)
-# CivetWeb Linux support is stable:
-# Builds for GCC 4.6 and clang 3.4 are free from warnings.
-# However, GCC introduced a couple of new, partially idiotic warnings,
-# that can not be disabled using a #pragma directive.
-# It seems unreasonable to have all GCC versions warning free, but only
-# some selected ones.
-option(CIVETWEB_ALLOW_WARNINGS "Do not stop build if there are warnings" ON)
-message(STATUS "Build if there are warnings - ${CIVETWEB_ALLOW_WARNINGS}")
-
-# Link to the shared LUA library
-cmake_dependent_option(
-  CIVETWEB_ENABLE_LUA_SHARED  "Link to the shared LUA system library" OFF
- CIVETWEB_ENABLE_LUA OFF)
-if (CIVETWEB_ENABLE_LUA)
-  message(STATUS "Linking shared Lua library - ${CIVETWEB_ENABLE_LUA_SHARED}")
-endif()
-
-# Lua Third Party Settings
-if (CIVETWEB_ENABLE_LUA)
-  if (NOT CIVETWEB_ENABLE_LUA_SHARED)
-    # Lua Version
-    set(CIVETWEB_LUA_VERSION 5.2.4 CACHE STRING
-      "The version of Lua to build and include statically")
-    set_property(CACHE CIVETWEB_LUA_VERSION PROPERTY VALUE ${CIVETWEB_LUA_VERSION})
-    message(STATUS "Lua Version - ${CIVETWEB_LUA_VERSION}")
-    mark_as_advanced(CIVETWEB_LUA_VERSION)
-
-    # Lua Verification Hash
-    set(CIVETWEB_LUA_MD5_HASH 913fdb32207046b273fdb17aad70be13 CACHE STRING
-      "The hash of Lua archive to be downloaded")
-    set_property(CACHE CIVETWEB_LUA_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_MD5_HASH})
-    mark_as_advanced(CIVETWEB_LUA_MD5_HASH)
-  endif()
-
-  # Lua Filesystem Version
-  set(CIVETWEB_LUA_FILESYSTEM_VERSION 1.6.3 CACHE STRING
-    "The version of Lua Filesystem to build and include statically")
-  set_property(CACHE CIVETWEB_LUA_FILESYSTEM_VERSION PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_VERSION})
-  message(STATUS "Lua Filesystem Version - ${CIVETWEB_LUA_FILESYSTEM_VERSION}")
-  mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_VERSION)
-
-  # Lua Filesystem Verification Hash
-  set(CIVETWEB_LUA_FILESYSTEM_MD5_HASH d0552c7e5a082f5bb2865af63fb9dc95 CACHE STRING
-    "The hash of Lua Filesystem archive to be downloaded")
-  set_property(CACHE CIVETWEB_LUA_FILESYSTEM_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH})
-  mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_MD5_HASH)
-
-  # Lua SQLite Version
-  set(CIVETWEB_LUA_SQLITE_VERSION 0.9.3 CACHE STRING
-    "The version of Lua SQLite to build and include statically")
-  set_property(CACHE CIVETWEB_LUA_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_VERSION})
-  message(STATUS "Lua SQLite Version - ${CIVETWEB_LUA_SQLITE_VERSION}")
-  mark_as_advanced(CIVETWEB_LUA_SQLITE_VERSION)
-
-  # Lua SQLite Verification Hash
-  set(CIVETWEB_LUA_SQLITE_MD5_HASH 43234ae08197dfce6da02482ed14ec92 CACHE STRING
-    "The hash of Lua SQLite archive to be downloaded")
-  set_property(CACHE CIVETWEB_LUA_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_MD5_HASH})
-  mark_as_advanced(CIVETWEB_LUA_SQLITE_MD5_HASH)
-
-  # Lua XML Version
-  set(CIVETWEB_LUA_XML_VERSION 1.8.0 CACHE STRING
-    "The version of Lua XML to build and include statically")
-  set_property(CACHE CIVETWEB_LUA_XML_VERSION PROPERTY VALUE ${CIVETWEB_LUA_XML_VERSION})
-  message(STATUS "Lua XML Version - ${CIVETWEB_LUA_XML_VERSION}")
-  mark_as_advanced(CIVETWEB_LUA_XML_VERSION)
-
-  # Lua XML Verification Hash
-  set(CIVETWEB_LUA_XML_MD5_HASH 25e4c276c5d8716af1de0c7853aec2b4 CACHE STRING
-    "The hash of Lua XML archive to be downloaded")
-  set_property(CACHE CIVETWEB_LUA_XML_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_XML_MD5_HASH})
-  mark_as_advanced(CIVETWEB_LUA_XML_MD5_HASH)
-
-  # SQLite Version
-  set(CIVETWEB_SQLITE_VERSION 3.8.9 CACHE STRING
-    "The version of SQLite to build and include statically")
-  set_property(CACHE CIVETWEB_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_SQLITE_VERSION})
-  message(STATUS "SQLite Version - ${CIVETWEB_SQLITE_VERSION}")
-  mark_as_advanced(CIVETWEB_SQLITE_VERSION)
-
-  # SQLite Verification Hash
-  set(CIVETWEB_SQLITE_MD5_HASH 02e9c3a6daa8b8587cf6bef828c2e33f CACHE STRING
-    "The hash of SQLite archive to be downloaded")
-  set_property(CACHE CIVETWEB_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_SQLITE_MD5_HASH})
-  mark_as_advanced(CIVETWEB_SQLITE_MD5_HASH)
-endif()
-
-# Duktape CGI support
-option(CIVETWEB_ENABLE_DUKTAPE "Enable Duktape CGIs" OFF)
-message(STATUS "Duktape CGI support - ${CIVETWEB_ENABLE_DUKTAPE}")
-
-# SSL support
-option(CIVETWEB_ENABLE_SSL "Enables the secure socket layer" ON)
-message(STATUS "SSL support - ${CIVETWEB_ENABLE_SSL}")
-
-# OpenSSL 1.1 API
-option(CIVETWEB_SSL_OPENSSL_API_1_1 "Use the OpenSSL 1.1 API" OFF)
-message(STATUS "Compile for OpenSSL 1.1 API - ${CIVETWEB_SSL_OPENSSL_API_1_1}")
-
-# Dynamically load or link the SSL libraries
-cmake_dependent_option(
-  CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING "Dynamically loads the SSL library rather than linking it" ON
-  CIVETWEB_ENABLE_SSL OFF)
-if (CIVETWEB_ENABLE_SSL)
-  message(STATUS "Dynamically load SSL libraries - ${CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING}")
-endif()
-
-# Third Party Download location
-set(CIVETWEB_THIRD_PARTY_DIR "${CMAKE_BINARY_DIR}/third_party" CACHE STRING
-  "The location that third party code is downloaded, built and installed")
-set_property(CACHE CIVETWEB_THIRD_PARTY_DIR PROPERTY VALUE ${CIVETWEB_THIRD_PARTY_DIR})
-
-# Unix systems can define the dynamic library names to load
-if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING AND NOT DARWIN AND UNIX)
-  # SSL library name
-  set(CIVETWEB_SSL_SSL_LIB "libssl.so" CACHE STRING
-    "The name of the SSL library to load")
-  set_property(CACHE CIVETWEB_SSL_SSL_LIB PROPERTY VALUE ${CIVETWEB_SSL_SSL_LIB})
-  message(STATUS "SSL Library Name - ${CIVETWEB_SSL_SSL_LIB}")
-
-  # Crytography library name
-  set(CIVETWEB_SSL_CRYPTO_LIB "libcrypto.so" CACHE STRING
-    "The name of the SSL Cryptography library to load")
-  set_property(CACHE CIVETWEB_SSL_CRYPTO_LIB PROPERTY VALUE ${CIVETWEB_SSL_CRYPTO_LIB})
-  message(STATUS "SSL Cryptography Library Name - ${CIVETWEB_SSL_CRYPTO_LIB}")
-endif()
-
-# Allow warnings in 3rd party components
-if (CIVETWEB_ENABLE_LUA OR CIVETWEB_ENABLE_DUKTAPE)
-SET(CIVETWEB_ALLOW_WARNINGS YES)
-endif()
-
-# The C and C++ standards to use
-set(CIVETWEB_C_STANDARD auto CACHE STRING
-  "The C standard to use; auto determines the latest supported by the compiler")
-set_property(CACHE CIVETWEB_C_STANDARD PROPERTY STRINGS auto c11 c99 c89)
-set(CIVETWEB_CXX_STANDARD auto CACHE STRING
-  "The C++ standard to use; auto determines the latest supported by the compiler")
-set_property(CACHE CIVETWEB_CXX_STANDARD PROPERTY STRINGS auto c++14 c++11 c++98)
-
-# Configure the linker
-if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
-  find_program(GCC_AR gcc-ar)
-  if (GCC_AR)
-    set(CMAKE_AR ${GCC_AR})
-  endif()
-  find_program(GCC_RANLIB gcc-ranlib)
-  if (GCC_RANLIB)
-    set(CMAKE_RANLIB ${GCC_RANLIB})
-  endif()
-endif()
-
-# Configure the C compiler
-message(STATUS "Configuring C Compiler")
-if ("${CIVETWEB_C_STANDARD}" STREQUAL "auto")
-  add_c_compiler_flag(-std=c11)
-  if (NOT HAVE_C_FLAG_STD_C11)
-    add_c_compiler_flag(-std=c99)
-    if (NOT HAVE_C_FLAG_STD_C99)
-      add_c_compiler_flag(-std=c89)
-    endif()
-  endif()
-else()
-  add_c_compiler_flag(-std=${CIVETWEB_C_STANDARD})
-endif()
-
-#Warnings: enable everything
-add_c_compiler_flag(-Wall)
-add_c_compiler_flag(-Wextra)
-add_c_compiler_flag(-Wshadow)
-add_c_compiler_flag(-Wconversion)
-add_c_compiler_flag(-Wmissing-prototypes)
-add_c_compiler_flag(-Weverything)
-add_c_compiler_flag(-Wparentheses)
-add_c_compiler_flag(/W4) # VisualStudio highest warning level
-
-#Warnings: Disable some warnings
-add_c_compiler_flag(-Wno-padded) # padding in structures by compiler
-add_c_compiler_flag(-Wno-unused-macros) # so what?
-add_c_compiler_flag(-Wno-reserved-id-macros) # for system headers
-add_c_compiler_flag(-Wno-format-nonliteral) # printf(myFormatStringVar, ...)
-add_c_compiler_flag(-Wno-date-time) # using __DATE__ once
-add_c_compiler_flag(-Wno-cast-qual) # const cast
-add_c_compiler_flag(-Wno-unknown-warning-option) # Xcode 9
-add_c_compiler_flag(/Wd4820) # padding
-
-if (MINGW)
-  add_c_compiler_flag(-Wno-format)
-endif()
-if (NOT CIVETWEB_ALLOW_WARNINGS)
-  add_c_compiler_flag(-Werror)
-endif()
-add_c_compiler_flag(/WX)
-add_c_compiler_flag(-pedantic-errors)
-add_c_compiler_flag(-fvisibility=hidden)
-add_c_compiler_flag(-fstack-protector-strong RELEASE)
-add_c_compiler_flag(-flto RELEASE)
-
-add_c_compiler_flag(-fstack-protector-all DEBUG)
-if (MINGW)
-  add_c_compiler_flag(-mwindows)
-endif()
-
-# Coverage build type
-set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING
-    "Flags used by the C compiler during coverage builds."
-    FORCE)
-set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
-    "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
-    "Flags used for linking binaries during coverage builds."
-    FORCE)
-set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
-    "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
-    "Flags used by the shared libraries linker during coverage builds."
-    FORCE)
-mark_as_advanced(
-    CMAKE_CXX_FLAGS_COVERAGE
-    CMAKE_C_FLAGS_COVERAGE
-    CMAKE_EXE_LINKER_FLAGS_COVERAGE
-    CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
-set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
-    "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
-    FORCE)
-add_c_compiler_flag(--coverage COVERAGE)
-
-# Configure the C++ compiler
-if (CIVETWEB_ENABLE_CXX)
-  message(STATUS "Configuring C++ Compiler")
-  if ("${CIVETWEB_CXX_STANDARD}" STREQUAL "auto")
-    add_cxx_compiler_flag(-std=c++14)
-    if (NOT HAVE_CXX_FLAG_STD_CXX14)
-      add_cxx_compiler_flag(-std=c++11)
-      if (NOT HAVE_CXX_FLAG_STD_CXX11)
-        add_cxx_compiler_flag(-std=c++98)
-      endif()
-    endif()
-  else()
-    add_cxx_compiler_flag(-std=${CIVETWEB_CXX_STANDARD})
-  endif()
-  add_cxx_compiler_flag(-Wall)
-  add_cxx_compiler_flag(-Wextra)
-  add_cxx_compiler_flag(-Wshadow)
-  add_cxx_compiler_flag(-Wmissing-prototypes)
-  add_cxx_compiler_flag(-Weverything)
-  add_cxx_compiler_flag(/W4)
-  add_cxx_compiler_flag(-Wno-padded)
-  add_cxx_compiler_flag(/Wd4820) # padding
-  add_cxx_compiler_flag(-Wno-unused-macros)
-  add_cxx_compiler_flag(-Wno-format-nonliteral)
-  if (MINGW)
-    add_cxx_compiler_flag(-Wno-format)
-  endif()
-  if (NOT CIVETWEB_ALLOW_WARNINGS)
-    add_cxx_compiler_flag(-Werror)
-  endif()
-  add_cxx_compiler_flag(/WX)
-  add_cxx_compiler_flag(-pedantic-errors)
-  add_cxx_compiler_flag(-fvisibility=hidden)
-  add_cxx_compiler_flag(-fstack-protector-strong RELEASE)
-  add_cxx_compiler_flag(-flto RELEASE)
-
-  add_cxx_compiler_flag(-fstack-protector-all DEBUG)
-  if (MINGW)
-    add_cxx_compiler_flag(-mwindows)
-  endif()
-  set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
-      "Flags used by the C++ compiler during coverage builds."
-      FORCE)
-  add_cxx_compiler_flag(--coverage COVERAGE)
-endif()
-
-# Set up the definitions
-if (${CMAKE_BUILD_TYPE} MATCHES "[Dd]ebug")
-  add_definitions(-DDEBUG)
-endif()
-if (CIVETWEB_ENABLE_IPV6)
-  add_definitions(-DUSE_IPV6)
-endif()
-if (CIVETWEB_ENABLE_WEBSOCKETS)
-  add_definitions(-DUSE_WEBSOCKET)
-endif()
-if (CIVETWEB_ENABLE_SERVER_STATS)
-  add_definitions(-DUSE_SERVER_STATS)
-endif()
-if (CIVETWEB_SERVE_NO_FILES)
-  add_definitions(-DNO_FILES)
-endif()
-if (CIVETWEB_DISABLE_CGI)
-  add_definitions(-DNO_CGI)
-endif()
-if (CIVETWEB_DISABLE_CACHING)
-  add_definitions(-DNO_CACHING)
-endif()
-if (CIVETWEB_ENABLE_LUA)
-  add_definitions(-DUSE_LUA)
-endif()
-if (CIVETWEB_ENABLE_DUKTAPE)
-  add_definitions(-DUSE_DUKTAPE)
-endif()
-if (CIVETWEB_ENABLE_MEMORY_DEBUGGING)
-  add_definitions(-DMEMORY_DEBUGGING)
-endif()
-if (NOT CIVETWEB_ENABLE_SSL)
-  add_definitions(-DNO_SSL)
-elseif (NOT CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING)
-  add_definitions(-DNO_SSL_DL)
-else()
-  if(CIVETWEB_SSL_SSL_LIB)
-    add_definitions(-DSSL_LIB="${CIVETWEB_SSL_SSL_LIB}")
-  endif()
-  if(CIVETWEB_SSL_CRYPTO_LIB)
-    add_definitions(-DCRYPTO_LIB="${CIVETWEB_SSL_CRYPTO_LIB}")
-  endif()
-endif()
-if(CIVETWEB_SSL_OPENSSL_API_1_1)
-  add_definitions(-DOPENSSL_API_1_1)
-endif()
-add_definitions(-DUSE_STACK_SIZE=${CIVETWEB_THREAD_STACK_SIZE})
-
-# Set 32 or 64 bit environment
-if (${CMAKE_ARCH} MATCHES "[Xx]86")
-add_c_compiler_flag(-m32)
-endif()
-if (${CMAKE_ARCH} MATCHES "[Xx]64")
-add_c_compiler_flag(-m64)
-endif()
-# TODO: add support for -march
-
-# Build the targets
-add_subdirectory(src)
-
-# Enable the testing of the library/executable
-include(CTest)
-if (BUILD_CIVET_TESTING)
-  message(" -- CIVET TESTING ENABLED -- ")
-  # Check unit testing framework Version
-  set(CIVETWEB_CHECK_VERSION 0.11.0 CACHE STRING
-    "The version of Check unit testing framework to build and include statically")
-  set_property(CACHE CIVETWEB_CHECK_VERSION PROPERTY VALUE ${CIVETWEB_CHECK_VERSION})
-  message(STATUS "Check Unit Testing Framework Version - ${CIVETWEB_CHECK_VERSION}")
-  mark_as_advanced(CIVETWEB_CHECK_VERSION)
-
-  # Check unit testing framework Verification Hash
-  # Hash for Check 0.10.0: 67a34c40b5bc888737f4e5ae82e9939f
-  # Hash for Check 0.11.0: 1b14ee307dca8e954a8219c34484d7c4
-  set(CIVETWEB_CHECK_MD5_HASH 1b14ee307dca8e954a8219c34484d7c4 CACHE STRING
-    "The hash of Check unit testing framework archive to be downloaded")
-  set_property(CACHE CIVETWEB_CHECK_MD5_HASH PROPERTY VALUE ${CIVETWEB_CHECK_MD5_HASH})
-  mark_as_advanced(CIVETWEB_CHECK_MD5_HASH)
-
-  # Build the testing
-  add_subdirectory(test)
-endif()
-
-# Set up CPack
-include(InstallRequiredSystemLibraries)
-set(CPACK_PACKAGE_VENDOR "civetweb Contributors")
-set(CPACK_PACKAGE_CONTACT "civetweb@github.com")
-set(CPACK_PACKAGE_VERSION_MAJOR "${CIVETWEB_VERSION_MAJOR}")
-set(CPACK_PACKAGE_VERSION_MINOR "${CIVETWEB_VERSION_MINOR}")
-set(CPACK_PACKAGE_VERSION_PATCH "${CIVETWEB_VERSION_PATCH}")
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A HTTP library and server")
-set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
-set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md")
-set(CPACK_STRIP_FILES TRUE)
-set(CPACK_PACKAGE_DEPENDS "openssl")
-if (CIVETWEB_ENABLE_LUA_SHARED)
-  set(CPACK_PACKAGE_DEPENDS "lua, ${CPACK_PACKAGE_DEPENDS}")
-endif()
-
-# RPM Packaging
-set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
-set(CPACK_RPM_PACKAGE_LICENSE "MIT")
-set(CPACK_RPM_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}")
-set(CPACK_RPM_PACKAGE_REQUIRES "${CPACK_PACKAGE_DEPENDS}")
-
-# Debian Packaging
-set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}")
-set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/civetweb/civetweb")
-set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_PACKAGE_DEPENDS}")
-
-# WiX Packaging
-# TODO: www.cmake.org/cmake/help/v3.0/module/CPackWIX.html
-
-# Finalize CPack settings
-include(CPack)
diff --git a/thirdparty/civetweb-1.10/CREDITS.md b/thirdparty/civetweb-1.10/CREDITS.md
deleted file mode 100644
index 4e4c987..0000000
--- a/thirdparty/civetweb-1.10/CREDITS.md
+++ /dev/null
@@ -1,167 +0,0 @@
-# Civetweb Contributors
-
-* Abhishek Lekshmanan
-* Adam Bailey
-* Alan Somers
-* Alex Kozlov
-* bel2125
-* Ben M. Ward
-* BigJoe
-* Bjoern Petri
-* Braedy Kuzma
-* brett
-* Brian Lambert
-* Brian Spratke
-* cdbishop
-* celeron55
-* Charles Olivi
-* Christian Mauderer
-* Christopher Galas
-* cjh
-* Daniel Oaks
-* Daniel Rempel
-* Danny Al-Gaaf
-* Dave Brower
-* David Arnold
-* David Loffredo
-* Dialga
-* ehlertjd
-* Eric Tsau
-* Erik Beran
-* extergnoto
-* F-Secure Corporation
-* feneuilflo
-* Fernando G. Aranda
-* Grahack
-* grenclave
-* grunk
-* hansipie
-* HariKamath Kamath
-* Henry Chang
-* Jack
-* Jacob Skillin
-* Jan Willem Janssen
-* Jeremy Lin
-* Jim Evans
-* jmc-
-* Jochen Scheib
-* Joe Mucchiello
-* Joel Gallant
-* Johan De Taeye
-* Jordan
-* Jordan Shelley
-* Joshua Boyd
-* Joshua D. Boyd
-* kakwa
-* kalphamon
-* Keith Kyzivat
-* Kevin Branigan
-* Kevin Wojniak
-* Kimmo Mustonen
-* Lammert Bies
-* Lawrence
-* Li Peng
-* Lianghui
-* Maarten Fremouw
-* makrsmark
-* Mark Lakata
-* Martin Gaida
-* Mateusz Gralka
-* Matt Clarkson
-* mingodad
-* Morgan McGuire
-* mrdvlpr.xnu
-* Neil Jensen
-* Nick Hildebrant
-* Nigel Stewart
-* nihildeb
-* No Face Press
-* palortoff
-* Patrick Drechsler
-* Patrick Trinkle
-* Paul Sokolovsky
-* Paulo Brizolara
-* pavel.pimenov
-* PavelVozenilek
-* Perttu Ahola
-* Peter Foerster
-* Philipp Friedenberger
-* Philipp Hasper
-* Red54
-* Richard Screene
-* pkvamme
-* Sage Weil
-* Sangwhan Moon
-* Saumitra Vikram
-* Scott Nations
-* sgmesservey
-* shantanugadgil
-* Simon Hailes
-* slidertom
-* SpaceLord
-* sunfch
-* thewaterymoon
-* THILMANT, Bernard
-* Thomas Davis
-* tnoho
-* Toni Wilk
-* Ulrich Hertlein
-* Walt Steverson
-* webxer
-* William Greathouse
-* xeoshow
-* xtne6f
-* Yehuda Sadeh
-
-# Mongoose Contributors
-CivetWeb is based on the Mongoose code.  The following users contributed to the original Mongoose release between 2010 and 2013.  This list was generated from the Mongoose GIT logs.  It does not contain contributions from the Mongoose mailing list.  There is no record for contributors prior to 2010.
-
-* Sergey Lyubka
-* Arnout Vandecappelle (Essensium/Mind)
-* Benoît Amiaux
-* Cody Hanson
-* Colin Leitner
-* Daniel Oaks
-* Eric Bakan
-* Erik Oomen
-* Filipp Kovalev
-* Ger Hobbelt
-* Hendrik Polczynski
-* Henrique Mendonça
-* Igor Okulist
-* Jay
-* Joe Mucchiello
-* John Safranek
-* Joseph Mainwaring
-* José Miguel Gonçalves
-* KIU Shueng Chuan
-* Katerina Blinova
-* Konstantin Sorokin
-* Marin Atanasov Nikolov
-* Matt Healy
-* Miguel Morales
-* Mikhail Nikalyukin
-* MikieMorales
-* Mitch Hendrickson
-* Nigel Stewart
-* Pavel
-* Pavel Khlebovich
-* Rogerz Zhang
-* Sebastian Reinhard
-* Stefan Doehla
-* Thileepan
-* abadc0de
-* arvidn
-* bick
-* ff.feng
-* jmucchiello
-* jwang
-* lsm
-* migal
-* mlamb
-* nullable.type
-* shantanugadgil
-* tayS
-* test
-* valenok
-
diff --git a/thirdparty/civetweb-1.10/LICENSE.md b/thirdparty/civetweb-1.10/LICENSE.md
deleted file mode 100644
index be6ae19..0000000
--- a/thirdparty/civetweb-1.10/LICENSE.md
+++ /dev/null
@@ -1,208 +0,0 @@
-ALL LICENSES
-=====
-
-This document includes several copyright licenses for different
-aspects of the software.  Not all licenses may apply depending
-on the features chosen.
-
-
-Civetweb License
------
-
-### Included with all features.
-
-> Copyright (c) 2013-2017 The CivetWeb developers ([CREDITS.md](https://github.com/civetweb/civetweb/blob/master/CREDITS.md))
->
-> Copyright (c) 2004-2013 Sergey Lyubka
->
-> Copyright (c) 2013 No Face Press, LLC (Thomas Davis)
->
-> Copyright (c) 2013 F-Secure Corporation
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
-
-Lua License
-------
-
-### Included only if built with Lua support.
-
-http://www.lua.org/license.html
-
-> Copyright (C) 1994-2015 Lua.org, PUC-Rio.
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
-
-SQLite3 License
-------
-
-### Included only if built with Lua and SQLite support.
-
-http://www.sqlite.org/copyright.html
-
-> 2001 September 15
->
-> The author disclaims copyright to this source code.  In place of
-> a legal notice, here is a blessing:
->
->    May you do good and not evil.
->    May you find forgiveness for yourself and forgive others.
->    May you share freely, never taking more than you give.
-
-
-lsqlite3 License
-------
-
-### Included only if built with Lua and SQLite support.
-
-> Copyright (C) 2002-2013 Tiago Dionizio, Doug Currie
-> All rights reserved.
-> Author    : Tiago Dionizio <tiago.dionizio@ist.utl.pt>
-> Author    : Doug Currie <doug.currie@alum.mit.edu>
-> Library   : lsqlite3 - a SQLite 3 database binding for Lua 5
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
-
-Lua File System License
-------
-
-### Included only if built with Lua support.
-
-http://keplerproject.github.io/luafilesystem/license.html
-
-> Copyright © 2003 Kepler Project.
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
-
-LuaXML License
-------
-
-### Included only if built with Lua and LuaXML support.
-
-> LuaXML License
->
-> LuaXml is licensed under the terms of the MIT license reproduced below,
-> the same as Lua itself. This means that LuaXml is free software and can be
-> used for both academic and commercial purposes at absolutely no cost.
->
-> Copyright (C) 2007-2013 Gerald Franz, eludi.net
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
-
-Duktape License
-------
-
-### Included only if built with Duktape support.
-
-https://github.com/svaarala/duktape/blob/master/LICENSE.txt
-
-> ===============
-> Duktape license
-> ===============
-> 
-> (http://opensource.org/licenses/MIT)
-> 
-> Copyright (c) 2013-2015 by Duktape authors (see AUTHORS.rst)
->
-> Permission is hereby granted, free of charge, to any person obtaining a copy
-> of this software and associated documentation files (the "Software"), to deal
-> in the Software without restriction, including without limitation the rights
-> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-> copies of the Software, and to permit persons to whom the Software is
-> furnished to do so, subject to the following conditions:
->
-> The above copyright notice and this permission notice shall be included in
-> all copies or substantial portions of the Software.
->
-> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-> THE SOFTWARE.
-
diff --git a/thirdparty/civetweb-1.10/Makefile.deprecated b/thirdparty/civetweb-1.10/Makefile.deprecated
deleted file mode 100644
index 288c15b..0000000
--- a/thirdparty/civetweb-1.10/Makefile.deprecated
+++ /dev/null
@@ -1,208 +0,0 @@
-# This Makefile is part of Civetweb web server project,
-# https://github.com/valenok/civetweb
-#
-# Example custom build:
-# COPT="-g -O0 -DNO_SSL_DL -DUSE_LUA -llua -lcrypto -lssl" make linux
-#
-# Flags are:
-# -DHAVE_MD5              - use system md5 library (-2kb)
-# -DNDEBUG                - strip off all debug code (-5kb)
-# -DDEBUG                 - build debug version (very noisy) (+7kb)
-# -DNO_CGI                - disable CGI support (-5kb)
-# -DNO_SSL                - disable SSL functionality (-2kb)
-# -DNO_SSL_DL             - link against system libssl library (-1kb)
-# -DCONFIG_FILE=\"file\"  - use `file' as the default config file
-# -DSSL_LIB=\"libssl.so.<version>\"   - use system versioned SSL shared object
-# -DCRYPTO_LIB=\"libcrypto.so.<version>\" - use system versioned CRYPTO so
-# -DUSE_LUA               - embed Lua in Civetweb (+100kb)
-
-PROG        = civetweb
-CFLAGS      = -std=c99 -O2 -W -Wall -pedantic -pthread -pipe -Iinclude $(COPT)
-
-# To build with Lua, download and unzip Lua 5.2.3 source code into the
-# civetweb directory, and then add $(LUA_SOURCES) to CFLAGS
-LUA         = src/third_party/lua-5.2.3/src
-LUA_FLAGS   = -I$(LUA) -DLUA_COMPAT_ALL
-LUA_SOURCES = $(LUA)/lapi.c $(LUA)/lcode.c $(LUA)/lctype.c \
-              $(LUA)/ldebug.c $(LUA)/ldo.c $(LUA)/ldump.c \
-              $(LUA)/lfunc.c $(LUA)/lgc.c $(LUA)/llex.c \
-              $(LUA)/lmem.c $(LUA)/lobject.c $(LUA)/lopcodes.c \
-              $(LUA)/lparser.c $(LUA)/lstate.c $(LUA)/lstring.c \
-              $(LUA)/ltable.c $(LUA)/ltm.c $(LUA)/lundump.c \
-              $(LUA)/lvm.c $(LUA)/lzio.c $(LUA)/lauxlib.c \
-              $(LUA)/lbaselib.c $(LUA)/lbitlib.c $(LUA)/lcorolib.c \
-              $(LUA)/ldblib.c $(LUA)/liolib.c $(LUA)/lmathlib.c \
-              $(LUA)/loslib.c $(LUA)/lstrlib.c $(LUA)/ltablib.c \
-              $(LUA)/loadlib.c $(LUA)/linit.c
-LUA_WINOBJS = $(LUA_SOURCES:%.c=%.obj)
-
-ifneq ($(OS), Windows_NT)
-  LUA_FLAGS += -DLUA_USE_DLOPEN
-endif
-
-LIB_SOURCES = src/civetweb.c
-
-ALL_SOURCES = src/main.c $(LIB_SOURCES) src/third_party/sqlite3.c src/third_party/lsqlite3.c src/third_party/lfs.c \
-              $(LUA_SOURCES) $(YASSL_SOURCES)
-
-SQLITE_FLAGS = -DTHREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS
-CIVETWEB_FLAGS = -DUSE_LUA -DUSE_LUA_SQLITE3 -DUSE_LUA_FILE_SYSTEM $(COPT)
-FLAGS = $(CIVETWEB_FLAGS) $(SQLITE_FLAGS) $(LUA_FLAGS)
-
-
-# Stock windows binary builds with Lua. 
-# Yassl has a GPL license, so we will leave it out by default.
-
-ifeq ($(WITH_YASSL), 1)
-YASSL       = ../cyassl-2.4.6
-YASSL_FLAGS = -I $(YASSL) -I $(YASSL)/cyassl \
-              -D _LIB -D OPENSSL_EXTRA -D HAVE_ERRNO_H \
-              -D HAVE_GETHOSTBYNAME -D HAVE_INET_NTOA -D HAVE_LIMITS_H \
-              -D HAVE_MEMSET -D HAVE_SOCKET -D HAVE_STDDEF_H -D HAVE_STDLIB_H \
-              -D HAVE_STRING_H -D HAVE_SYS_STAT_H -D HAVE_SYS_TYPES_H
-YASSL_SOURCES = \
-  $(YASSL)/src/internal.c $(YASSL)/src/io.c $(YASSL)/src/keys.c \
-  $(YASSL)/src/ssl.c $(YASSL)/src/tls.c $(YASSL)/ctaocrypt/src/hmac.c \
-  $(YASSL)/ctaocrypt/src/random.c $(YASSL)/ctaocrypt/src/sha.c \
-  $(YASSL)/ctaocrypt/src/sha256.c $(YASSL)/ctaocrypt/src/logging.c \
-  $(YASSL)/ctaocrypt/src/error.c $(YASSL)/ctaocrypt/src/rsa.c \
-  $(YASSL)/ctaocrypt/src/des3.c $(YASSL)/ctaocrypt/src/asn.c \
-  $(YASSL)/ctaocrypt/src/coding.c $(YASSL)/ctaocrypt/src/arc4.c \
-  $(YASSL)/ctaocrypt/src/md4.c $(YASSL)/ctaocrypt/src/md5.c \
-  $(YASSL)/ctaocrypt/src/dh.c $(YASSL)/ctaocrypt/src/dsa.c \
-  $(YASSL)/ctaocrypt/src/pwdbased.c $(YASSL)/ctaocrypt/src/aes.c \
-  $(YASSL)/ctaocrypt/src/md2.c $(YASSL)/ctaocrypt/src/ripemd.c \
-  $(YASSL)/ctaocrypt/src/sha512.c $(YASSL)/src/sniffer.c \
-  $(YASSL)/ctaocrypt/src/rabbit.c $(YASSL)/ctaocrypt/src/misc.c \
-  $(YASSL)/ctaocrypt/src/tfm.c $(YASSL)/ctaocrypt/src/integer.c \
-  $(YASSL)/ctaocrypt/src/ecc.c $(YASSL)/src/ocsp.c $(YASSL)/src/crl.c \
-  $(YASSL)/ctaocrypt/src/hc128.c $(YASSL)/ctaocrypt/src/memory.c
-  
-  ALL_SOURCES += $(YASSL_SOURCES)
-  FLAGS += $(YASSL_FLAGS) -DNO_SSL_DL
-  CIVETWEB_FLAGS += -DNO_SSL_DL 
-
-else
-#  FLAGS += -DNO_SSL
-#  CIVETWEB_FLAGS += -DNO_SSL 
-endif
-
-ALL_OBJECTS = $(ALL_SOURCES:%.c=%.o)
-ALL_WINOBJS = $(ALL_SOURCES:%.c=%.obj)
-
-
-# Using Visual Studio 6.0. To build Civetweb:
-#  Set MSVC variable below to where VS 6.0 is installed on your system
-#  Run "PATH_TO_VC6\bin\nmake windows"
-MSVC = ../vc6
-#DBG = /Zi /Od
-DBG  = /DNDEBUG /O1
-CL   = $(MSVC)/bin/cl /MD /TC /nologo $(DBG) /W3 /GA /I$(MSVC)/include
-LINK = $(MSVC)/bin/link /incremental:no /libpath:$(MSVC)/lib /machine:IX86 \
-       user32.lib shell32.lib comdlg32.lib ws2_32.lib advapi32.lib
-
-all:
-	@echo "make (linux|bsd|solaris|mac|windows|mingw|cygwin)"
-
-%.obj: %.c
-	$(CL) /c $(FLAGS) /Fo$@ $<
-
-%.o: %.c
-	$(CC) -o $@ $< -c $(FLAGS) $(CFLAGS)
-
-# Lua library for Windows
-lua.lib: $(LUA_WINOBJS)
-	$(MSVC)/bin/lib /out:$@ $(LUA_WINOBJS)
-
-# To build with Lua, make sure you have Lua unpacked into src/third_party/lua-5.2.3 directory
-linux_lua: $(ALL_OBJECTS)
-	$(CC) $(ALL_OBJECTS) -o $(PROG) -ldl
-
-civetweb.o: src/mod_lua.inl
-
-# Make sure that the compiler flags come last in the compilation string.
-# If not so, this can break some on some Linux distros which use
-# "-Wl,--as-needed" turned on by default  in cc command.
-# Also, this is turned in many other distros in static linkage builds.
-linux:
-	$(CC) $(LIB_SOURCES) src/main.c -o $(PROG) -ldl $(CFLAGS)
-
-mac: bsd
-bsd:
-	$(CC) $(LIB_SOURCES) src/main.c -o $(PROG) $(CFLAGS)
-
-bsd_lua: $(ALL_OBJECTS)
-	$(CC) $(ALL_OBJECTS) -o $@
-
-solaris:
-	$(CC) $(LIB_SOURCES) src/main.c -lnsl -lsocket -o $(PROG) $(CFLAGS)
-
-lib$(PROG).a: $(ALL_OBJECTS)
-	ar cr $@ $(ALL_OBJECTS)
-
-$(PROG).lib: $(ALL_WINOBJS)
-	$(MSVC)/bin/lib /out:$@ $(ALL_WINOBJS)
-
-# For codesign to work in non-interactive mode, unlock login keychain:
-# security unlock ~/Library/Keychains/login.keychain
-# See e.g. http://lists.apple.com/archives/apple-cdsa/2008/Jan/msg00027.html
-Civetweb: $(LIB_SOURCES) src/main.c
-	$(CC) $(LIB_SOURCES) src/main.c src/third_party/lsqlite3.c src/third_party/sqlite3.c src/third_party/lfs.c \
-          -DUSE_COCOA $(CFLAGS) $(FLAGS) -mmacosx-version-min=10.4 \
-          $(YASSL_SOURCES) $(LUA_SOURCES) \
-          -framework Cocoa -ObjC -arch i386 -arch x86_64 -o Civetweb
-
-cocoa: Civetweb
-	V=`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`; DIR=dmg/Civetweb.app && rm -rf $$DIR && mkdir -p $$DIR/Contents/{MacOS,Resources} && install -m 644 resources/civetweb_*.png resources/civetweb.icns $$DIR/Contents/Resources/ && install -m 644 resources/Info.plist $$DIR/Contents/ && install -m 755 Civetweb $$DIR/Contents/MacOS/ && ln -fs /Applications dmg/ ; hdiutil create Civetweb_$$V.dmg -volname "Civetweb $$V" -srcfolder dmg -ov #; rm -rf dmg
-
-un:
-	$(CC) test/unit_test.c -o unit_test -I. -I$(LUA) $(LUA_SOURCES) \
-          $(CFLAGS) -g -O0
-	./unit_test
-
-wi:
-	$(CL) test/unit_test.c $(LUA_SOURCES) $(LUA_FLAGS) \
-          $(YASSL_SOURCES) $(YASSL_FLAGS) /I. /DNO_SSL_DL \
-          /link /libpath:$(MSVC)/lib advapi32.lib /out:unit_test.exe
-	./unit_test.exe
-
-windows: $(ALL_WINOBJS)
-	$(MSVC)/bin/rc resources/res.rc
-	$(LINK) /nologo $(ALL_WINOBJS) resources/res.res /out:$(PROG).exe
-
-# Build for Windows under MinGW
-#MINGWDBG= -DDEBUG -O0 -ggdb
-MINGWDBG= -DNDEBUG -Os
-MINGWOPT=  -W -Wall -mthreads -Wl,--subsystem,console $(MINGWDBG) -DHAVE_STDINT $(GCC_WARNINGS) $(COPT)
-mingw:
-	windres resources\res.rc resources\res.o
-	$(CC) $(MINGWOPT) $(LIB_SOURCES) -lws2_32 \
-		-shared -Wl,--out-implib=$(PROG).lib -o $(PROG).dll
-	$(CC) $(MINGWOPT) $(LIB_SOURCES) src/main.c resources\res.o \
-	-lws2_32 -ladvapi32 -lcomdlg32 -o $(PROG).exe
-
-# Build for Windows under Cygwin
-#CYGWINDBG= -DDEBUG -O0 -ggdb
-CYGWINDBG= -DNDEBUG -Os
-CYGWINOPT=  -W -Wall -mthreads -Wl,--subsystem,console $(CYGWINDBG) -DHAVE_STDINT $(GCC_WARNINGS) $(COPT)
-cygwin:
-	windres ./resources/res.rc ./resources/res.o
-	$(CC) $(CYGWINOPT) $(LIB_SOURCES) -lws2_32 \
-		-shared -Wl,--out-implib=$(PROG).lib -o $(PROG).dll
-	$(CC) $(CYGWINOPT) -Iinclude $(LIB_SOURCES) src/main.c ./resources/res.o \
-	-lws2_32 -ladvapi32 -o $(PROG).exe
-
-tests:
-	perl test/test.pl $(TEST)
-
-tarball: clean
-	F=civetweb-`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`.tgz ; cd .. && tar -czf x civetweb/{LICENSE.md,Makefile,examples,test,resources,*.[ch],*.md} && mv x civetweb/$$F
-
-release: tarball cocoa
-	wine make windows
-	V=`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`; upx civetweb.exe; cp civetweb.exe civetweb-$$V.exe; cp civetweb.exe civetweb_php_bundle/; zip -r civetweb_php_bundle_$$V.zip civetweb_php_bundle/
-
-clean:
-	rm -rf *.o *.core $(PROG) *.obj *.so $(PROG).txt *.dSYM *.tgz \
-	$(PROG).exe *.dll *.lib resources/res.o resources/res.RES *.dSYM *.zip *.pdb \
-	*.exe *.dmg $(ALL_OBJECTS) $(ALL_WINOBJS)
diff --git a/thirdparty/civetweb-1.10/Makefile.osx b/thirdparty/civetweb-1.10/Makefile.osx
deleted file mode 100644
index 44260e8..0000000
--- a/thirdparty/civetweb-1.10/Makefile.osx
+++ /dev/null
@@ -1,42 +0,0 @@
-# 
-# Copyright (c) 2013 No Face Press, LLC
-# License http://opensource.org/licenses/mit-license.php MIT License
-#
-
-# For codesign to work in non-interactive mode, unlock login keychain:
-# security unlock ~/Library/Keychains/login.keychain
-# See e.g. http://lists.apple.com/archives/apple-cdsa/2008/Jan/msg00027.html
-
-# Civetweb features
-WITH_LUA = 1
-
-PACKAGE = Civetweb
-BUILD_DIR = out
-
-CFLAGS += -DUSE_COCOA -DENABLE_CREATE_CONFIG_FILE -mmacosx-version-min=10.4 -ObjC -arch i386 -arch x86_64
-LDFLAGS += -framework Cocoa
-
-DMG_DIR = $(BUILD_DIR)/dmg
-CONTENTS_DIR = $(DMG_DIR)/$(PACKAGE).app/Contents
-RESOURCES_DIR = $(CONTENTS_DIR)/Resources
-OSXBIN_DIR = $(CONTENTS_DIR)/MacOS
-
-CIVETWEB_VERSION = $(shell perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h)
-ZIPFILENAME = $(PACKAGE)-$(CIVETWEB_VERSION).zip
-
-include Makefile
-
-package: build
-	@rm -rf $(DMG_DIR)
-	install -d -m 755 $(CONTENTS_DIR) $(RESOURCES_DIR) $(OSXBIN_DIR)
-	install -m 644 resources/Info.plist $(CONTENTS_DIR)/
-	install -m 644 resources/civetweb_*.png resources/civetweb.icns $(RESOURCES_DIR)/
-	install -m 644 resources/itworks.html $(OSXBIN_DIR)/index.html
-	install -m 644 resources/civetweb_64x64.png $(OSXBIN_DIR)/
-	install -m 755 $(CPROG) $(OSXBIN_DIR)/$(PACKAGE)
-	install -m 644 docs/Installing.md $(DMG_DIR)/Installing.txt
-	install -m 644 LICENSE.md $(DMG_DIR)/License.txt
-	rm -rf $(ZIPFILENAME)
-	cd $(DMG_DIR) && zip -r ../../$(ZIPFILENAME) .
-
-.PHONY: package
diff --git a/thirdparty/civetweb-1.10/Qt/CivetWeb.pro b/thirdparty/civetweb-1.10/Qt/CivetWeb.pro
deleted file mode 100644
index 6d5e1a2..0000000
--- a/thirdparty/civetweb-1.10/Qt/CivetWeb.pro
+++ /dev/null
@@ -1,34 +0,0 @@
-TEMPLATE = app
-CONFIG += console
-CONFIG -= app_bundle
-CONFIG -= qt
-
-SOURCES += \
-    ../src/md5.inl \
-    ../src/sha1.inl \
-    ../src/handle_form.inl \
-    ../src/mod_lua.inl \
-    ../src/mod_duktape.inl \
-    ../src/timer.inl \
-    ../src/civetweb.c \
-    ../src/main.c
-
-#include(deployment.pri)
-#qtcAddDeployment()
-
-HEADERS += \
-    ../include/civetweb.h
-
-INCLUDEPATH +=  \
-    ../include/
-
-win32 {
-LIBS += -lws2_32 -lComdlg32 -lUser32 -lShell32 -lAdvapi32
-} else {
-LIBS += -lpthread -ldl -lm
-}
-
-
-DEFINES += USE_IPV6
-DEFINES += USE_WEBSOCKET
-DEFINES += USE_SERVER_STATS
diff --git a/thirdparty/civetweb-1.10/README.md b/thirdparty/civetweb-1.10/README.md
deleted file mode 100644
index 4a334ca..0000000
--- a/thirdparty/civetweb-1.10/README.md
+++ /dev/null
@@ -1,168 +0,0 @@
-![CivetWeb](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/civetweb_64x64.png "CivetWeb") CivetWeb
-=======
-
-**The official home of CivetWeb is [https://github.com/civetweb/civetweb](https://github.com/civetweb/civetweb)**
-
-[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
-[![GitHub contributors](https://img.shields.io/github/contributors/civetweb/civetweb.svg)](https://github.com/civetweb/civetweb/blob/master/CREDITS.md)
-
-Continuous integration for Linux and OSX ([Travis CI](https://travis-ci.org/civetweb/civetweb)):
-
-[![Travis Build Status](https://travis-ci.org/civetweb/civetweb.svg?branch=master)](https://travis-ci.org/civetweb/civetweb)
-
-Continuous integration for Windows ([AppVeyor](https://ci.appveyor.com/project/civetweb/civetweb)):
-
-[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/civetweb/civetweb?svg=true)](https://ci.appveyor.com/project/civetweb/civetweb/branch/master)
-
-Test coverage check ([coveralls](https://coveralls.io/github/civetweb/civetweb), [codecov](https://codecov.io/gh/civetweb/civetweb/branch/master)) (currently in a setup and evaluation phase):
-
-[![Coveralls](https://img.shields.io/coveralls/civetweb/civetweb.svg?maxAge=3600)]()
-[![Coverage Status](https://coveralls.io/repos/github/civetweb/civetweb/badge.svg?branch=master)](https://coveralls.io/github/civetweb/civetweb?branch=master)
-
-[![codecov](https://codecov.io/gh/civetweb/civetweb/branch/master/graph/badge.svg)](https://codecov.io/gh/civetweb/civetweb)
-
-
-
-Static source code analysis ([Coverity](https://scan.coverity.com/projects/5784)):
-
-[![Coverity Scan Build Status](https://scan.coverity.com/projects/5784/badge.svg)](https://scan.coverity.com/projects/5784)
-
-
-
-Project Mission
------------------
-
-Project mission is to provide easy to use, powerful, C/C++ embeddable web
-server with optional CGI, SSL and Lua support.
-CivetWeb has a MIT license so you can innovate without restrictions.
-
-CivetWeb can be used by developers as a library, to add web server functionality to an existing application.
-It can also be used by end users as a stand-alone web server. It is available as single executable, no installation is required.
-
-
-Where to find the official version?
------------------------------------
-
-End users can download CivetWeb releases at SourceForge
-[https://sourceforge.net/projects/civetweb/](https://sourceforge.net/projects/civetweb/)
-
-Developers can contribute to CivetWeb via GitHub
-[https://github.com/civetweb/civetweb](https://github.com/civetweb/civetweb)
-
-Trouble tickets should be filed on GitHub
-[https://github.com/civetweb/civetweb/issues](https://github.com/civetweb/civetweb/issues)
-
-Announcements are at Google Groups
-[https://groups.google.com/d/forum/civetweb](https://groups.google.com/d/forum/civetweb). Some older support and discussion threads are there as well. However, recently support questions and discussions are usually [GitHub issues](https://github.com/civetweb/civetweb/issues).
-
-Source releases can be found on GitHub
-[https://github.com/civetweb/civetweb/releases](https://github.com/civetweb/civetweb/releases)
-
-A very brief overview can be found on GitHub Pages
-[http://civetweb.github.io/civetweb/](http://civetweb.github.io/civetweb/)
-
-
-Quick start documentation
---------------------------
-
-- [docs/Installing.md](https://github.com/civetweb/civetweb/blob/master/docs/Installing.md) - Install Guide (for end users using pre-built binaries)
-- [docs/UserManual.md](https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md) - End User Guide
-- [docs/Building.md](https://github.com/civetweb/civetweb/blob/master/docs/Building.md) - Building the Server (quick start guide)
-- [docs/Embedding.md](https://github.com/civetweb/civetweb/blob/master/docs/Embedding.md) - Embedding (how to add HTTP support to an existing application)
-- [docs/OpenSSL.md](https://github.com/civetweb/civetweb/blob/master/docs/OpenSSL.md) - Adding HTTPS (SSL/TLS) support using OpenSSL.
-- [API documentation](https://github.com/civetweb/civetweb/tree/master/docs/api) - Additional documentation on the civetweb application programming interface ([civetweb.h](https://github.com/civetweb/civetweb/blob/master/include/civetweb.h)).
-- [RELEASE_NOTES.md](https://github.com/civetweb/civetweb/blob/master/RELEASE_NOTES.md) - Release Notes
-- [LICENSE.md](https://github.com/civetweb/civetweb/blob/master/LICENSE.md) - Copyright License
-
-
-Overview
---------
-
-CivetWeb keeps the balance between functionality and
-simplicity by a carefully selected list of features:
-
-- Liberal, commercial-friendly, permissive,
-  [MIT license](http://en.wikipedia.org/wiki/MIT_License)
-- Free from copy-left licenses, like GPL, because you should innovate without
-  restrictions.
-- Forked from [Mongoose](https://code.google.com/p/mongoose/) in 2013, before
-  it changed the licence from MIT to commercial + GPL. A lot of enchancements
-  have been added since that time, see
-  [RELEASE_NOTES.md](https://github.com/civetweb/civetweb/blob/master/RELEASE_NOTES.md).
-- Works on Windows, Mac, Linux, UNIX, iPhone, Android, Buildroot, and many
-  other platforms.
-- Scripting and database support (Lua scipts, Lua Server Pages, CGI + SQLite
-  database, Server side javascript).
-  This provides a ready to go, powerful web development platform in a one
-  single-click executable with **no dependencies**.
-- Support for CGI, HTTPS (SSL/TLS), SSI, HTTP digest (MD5) authorization, Websocket,
-  WEbDAV.
-- Optional support for authentication using client side X.509 certificates.
-- Resumed download, URL rewrite, file blacklist, IP-based ACL, Windows service.
-- Download speed limit based on client subnet or URI pattern.
-- Simple and clean embedding API.
-- The source is in single file to make things easy.
-- Embedding examples included.
-- HTTP client capable of sending arbitrary HTTP/HTTPS requests.
-- Websocket client functionality available (WS/WSS).
-
-
-### Optionally included software
-
-[![Lua](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/lua-logo.jpg "Lua Logo")](http://lua.org)
-
-[![Sqlite3](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/sqlite3-logo.jpg "Sqlite3 Logo")](http://sqlite.org)
-
-[![LuaFileSystem](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/luafilesystem-logo.jpg "LuaFileSystem Logo")](http://keplerproject.github.io/luafilesystem/)
-
-[![LuaSQLite3](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/luasqlite-logo.jpg "LuaSQLite3 Logo")](http://lua.sqlite.org/index.cgi/index)
-
-[![LuaXML](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/luaxml-logo.jpg "LuaXML Logo")](http://viremo.eludi.net/LuaXML/index.html)
-
-[![Duktape](https://raw.githubusercontent.com/civetweb/civetweb/master/resources/duktape-logo.png "Duktape Logo")](http://duktape.org)
-
-
-Support
--------
-
-This project is very easy to install and use. 
-Please read the [documentation](https://github.com/civetweb/civetweb/blob/master/docs/)
-and have a look at the [examples](https://github.com/civetweb/civetweb/blob/master/examples/).
-More information may be found on the [mailing list](https://groups.google.com/d/forum/civetweb).
-
-Note: I do not take any liability or warranty for any linked contents.  Visit these pages and try the community support suggestions at your own risk.
-
-
-Contributions
----------------
-
-Contributions are welcome provided all contributions carry the MIT license.
-
-DO NOT APPLY fixes copied from Mongoose to this project to prevent GPL tainting.
-Since 2013, CivetWeb and Mongoose are developed independently.
-By now the code base differs, so patches cannot be safely transfered in either direction.
-
-Some guidelines can be found in [docs/Contribution.md](https://github.com/civetweb/civetweb/blob/master/docs/Contribution.md).
-
-
-### Authors
-
-CivetWeb is based on the Mongoose project.  The original author of Mongoose was
-Sergey Lyubka (Copyright (c) 2004-2013 Sergey Lyubka, MIT license).
-
-However, in August 16, 2013, the [license of Mongoose has been changed](https://groups.google.com/forum/#!topic/mongoose-users/aafbOnHonkI)
-after writing and distributing the original code this project is based on.
-The license change and CivetWeb used to be mentioned on the Mongoose
-[Wikipedia](https://en.wikipedia.org/wiki/Mongoose_(web_server))
-page as well, but it's getting deleted (and added again) there every
-now and then.
-
-CivetWeb has been forked from the last MIT version of Mongoose.
-Since 2013, CivetWeb has seen many improvements from various authors
-(Copyright (c) 2013-2017 the CivetWeb developers, MIT license).
-A list of authors can be found in [CREDITS.md](https://github.com/civetweb/civetweb/blob/master/CREDITS.md).
-
-Using the CivetWeb project ensures the MIT licenses terms are applied and
-GPL cannot be imposed on any of this code, as long as it is sourced from
-here. This code will remain free with the MIT license protection.
-
diff --git a/thirdparty/civetweb-1.10/RELEASE_NOTES.md b/thirdparty/civetweb-1.10/RELEASE_NOTES.md
deleted file mode 100644
index dfae89f..0000000
--- a/thirdparty/civetweb-1.10/RELEASE_NOTES.md
+++ /dev/null
@@ -1,395 +0,0 @@
-Release Notes v1.10
-===
-### Objectives: *OpenSSL 1.1 support, add server statistics and diagnostic data*
-
-Changes
--------
-
-- Add missing `mg_` or `MG_` to symbols in civetweb.h. Symbols without will be removed a future version.
-- Add HTTPS server configuration example
-- Lua Pages: mg.include should support absolute, relative and virtual path types
-- Add API function for HTTP digest authentication
-- Improved interface documentation
-- Support parameters for Lua background scripts
-- Use new connection queue implementation (previously ALTERNATIVE\_QUEUE) as default
-- Add USE\_SERVER\_STATS define, so the server collects statistics data
-- Convert system\_info text output and all other diagnostic strings to JSON format
-- Add experimental function to query the connection status (may be dropped again)
-- Add document on proposed future interface changes (for comments)
-- Officially drop Symbian support
-- Ignore leading blank lines in multipart messages (for Android upload service)
-- Rewrite some functions, in particular request parsing
-- CORS preflight directly in the server, with additional config options
-- Solve some warnings from different static source code analysis tools
-- Collect server status data
-- Allow hostname in listening\_ports
-- Make maximum request size configurable
-- Allow multiple Sec-Websocket-Protocol
-- Add configuration option to send additional headers
-- Add configuration option for Strict-Transport-Security
-- Mark "file in memory" feature is a candidate for deletion
-- Improve examples
-- Fix timeout error when sending larger files
-- Add mg\_send\_chunk interface function
-- Allow to separate server private key and certificate chain in two different files
-- Support for multipart requests without quotes (for some C# clients)
-- Initialize SSL in mg\_init\_library, so https client functions can be used when no server is running
-- Allow "REPORT" HTTP method for REST calls to scripts
-- Allow to compile civetweb.c wih a C++ compiler
-- Lua: Remove internal length limits of encode/decode functions
-- Allow sub-resources of index script files
-- Add config parameter allow\_index\_script\_resource the aforementioned feature
-- Remove deprecated "uri" member of the request from the interface
-- Improve documentation
-- Make auth domain check optional (configuration)
-- Update unit test framework to check 0.11.0 (C89/C90 compilers still need a patched version)
-- Limit depth of mg.include for Lua server pages
-- Additional unit tests
-- OpenSSL 1.1 support
-- Update version number
-
-
-Release Notes v1.9.1
-===
-### Objectives: *Bug fix*
-
-Changes
--------
-
-- Add "open website" button for pre-built Windows binaries
-- Fix for connections closed prematurely
-- Update to a new check unit test framework and remove patches required for previous version
-- Update version number
-
-
-Release Notes v1.9
-===
-### Objectives: *Read SSI client certificate information, improve windows usability, use non-blocking sockets, bug fixes*
-
-Changes
--------
-
-- Add library init/exit functions (call is now optional, but will be required in V1.10)
-- Windows: Show system information from the tray icon
-- Windows: Bring overlaid windows to top from the tray icon
-- Add Lua background script, running independent from server state
-- Move obsolete examples into separated directory
-- Change name of CMake generated C++ library to civetweb-cpp
-- Add option to set linger timeout
-- Update Duktape and Lua (third-party code)
-- Add continuous integration tests
-- Add API documentation
-- Limit recursions in .htpasswd files
-- Fix SCRIPT_NAME for CGI directory index files (index.php)
-- Use non-blocking sockets
-- stdint.h is now required and no longer optional
-- Rewrite connection close handling
-- Rewrite mg_fopen/mg_stat
-- Enhanced tray icon menu for Windows
-- Add subprotocol management for websocket connections
-- Partially rewrite timeout handling
-- Add option keep_alive_timeout_ms
-- Improve support for absolute URIs
-- Allow some additional compiler checks (higher warning level)
-- Add option for case sensitive file names for Windows
-- Short notation for listening_ports option when using IPv4 and IPv6 ports
-- Make usage of Linux sendfile configurable
-- Optimize build matrix for Travis CI
-- Retry failing TLS/HTTPS read/write operations
-- Read client certificate information
-- Do not tolerate URIs with invalid characters
-- Fix mg_get_cookie to ignore substrings
-- Fix memory leak in form handling
-- Fix bug in timer logic (for Lua Websockets)
-- Updated version number
-
-Release Notes v1.8
-===
-### Objectives: *CMake integration and continuous integration tests, Support client certificates, bug fixes*
-
-Changes
--------
-
-- Replace mg_upload by mg_handle_form_request
-- CGI-scripts must receive EOF if all POST data is read
-- Add API function to handle all kinds of HTML form data
-- Do not allow short file names in Windows
-- Callback when a new thread is initialized
-- Support for short lived certificates
-- Add NO_CACHING compile option
-- Update Visual Studio project files to VS2015; rename directory VS2012 to VS
-- Sec-Wesocket-Protocol must only return one protocol
-- Mark some examples and tests as obsolete
-- Remove no longer maintained test utils
-- Add some default MIME types and the mg_send_mime_file API function.
-- Client API using SSL certificates
-- Send "Cache-Control" headers
-- Add alternative to mg_upload
-- Additional configuration options
-- Fix memory leaks
-- Add API function to check available features
-- Add new interface to get listening ports
-- Add websocket client interface and encode websocket data with a simple random number
-- Support SSL client certificates
-- Add configuration options for SSL client certificates
-- Stand-alone server: Add command line option -I to display information about the system
-- Redirect stderr of CGI process to error log
-- Support absolute URI; split uri in mg_request_info to request_uri and local_uri
-- Some source code refactoring, to improve maintainability
-- Use recursive mutex for Linux
-- Allow CGI environment to grow dynamically
-- Support build for Lua 5.1 (including LuaJIT), Lua 5.2 and Lua 5.3
-- Improve examples and documentation
-- Build option CIVETWEB_SERVE_NO_FILES to disable serving static files
-- Add Server side JavaScript support (Duktape library)
-- Created a "civetweb" organization at GitHub.
-- Repository moved from https://github.com/bel2125/civetweb to https://github.com/civetweb/civetweb
-- Improved continuous integration
-- CMake support, continuous integration with Travis CI and Appveyor
-- Adapt/port unit tests to CMake/Travis/Appveyor
-- Bug fixes, including issues from static code analysis
-- Add status badges to the GitHub project main page
-- Updated version number
-
-Release Notes v1.7
-===
-### Objectives: *Examples, documentation, additional API functions, some functions rewritten, bug fixes and updates*
-
-Changes
--------
-
-- Format source with clang_format
-- Use function 'sendfile' for Linux
-- Fix for CRAMFS in Linux
-- Fix for file modification times in Windows
-- Use SO_EXCLUSIVEADDRUSE instead of SO_REUSEADDR for Windows
-- Rewrite push/pull functions
-- Allow to use Lua as shared objects (WITH_LUA_SHARED)
-- Fixes for many warnings
-- URI specific callbacks and different timeouts for websockets
-- Add chunked transfer support
-- Update LuaFileSystem
-- Update Lua to 5.2.4
-- Fix build for MinGW-x64, TDM-GCC and clang
-- Update SQLite to 3.8.10.2
-- Fix CGI variables SCRIPT_NAME and PATH_TRANSLATED
-- Set TCP_USER_TIMEOUT to deal faster with broken connections
-- Add a Lua form handling example
-- Return more differentiated HTTP error codes
-- Add log_access callback
-- Rewrite and comment request handling function
-- Specify in detail and document return values of callback functions
-- Set names for all threads (unless NO_THREAD_NAME is defined)
-- New API functions for TCP/HTTP clients
-- Fix upload of huge files
-- Allow multiple SSL instances within one application
-- Improve API and user documentation
-- Allow to choose between static and dynamic Lua library
-- Improve unit test
-- Use temporary file name for partially uploaded files
-- Additional API functions exported to C++
-- Add a websocket client example
-- Add a websocket client API
-- Update websocket example
-- Make content length available in request_info
-- New API functions: access context, callback for create/delete, access user data
-- Upgraded Lua from 5.2.2 to 5.2.3 and finally 5.2.4
-- Integrate LuaXML (for testing purposes)
-- Fix compiler warnings
-- Updated version number
-
-Release Notes v1.6
-===
-### Objectives: *Enhance Lua support, configuration dialog for windows, new examples, bug fixes and updates*
-
-Changes
--------
-
-- Add examples of Lua pages, scripts and websockets to the test directory (bel)
-- Add dialog to change htpasswd files for the Windows standalone server (bel)
-- Fix compiler warnings and warnings from static code analysis (Danny Al-Gaaf, jmc-, Thomas, bel, ...)
-- Add new unit tests (bel)
-- Support includes in htpasswd files (bel)
-- Add a basic option check for the standalone executable (bel)
-- Support user defined error pages (bel)
-- Method to get POST request parameters via C++ interface (bel)
-- Re-Add unit tests for Linux and Windows (jmc-, bel)
-- Allow to specify title and tray icon for the Windows standalone server (bel)
-- Fix minor memory leaks (bel)
-- Redirect all memory allocation/deallocation through mg functions which may be overwritten (bel)
-- Support Cross-Origin Resource Sharing (CORS) for static files and scripts (bel)
-- Win32: Replace dll.def file by export macros in civetweb.h (CSTAJ)
-- Base64 encode and decode functions for Lua (bel)
-- Support pre-loaded files for the Lua environment (bel)
-- Server should check the nonce for http digest access authentication (bel)
-- Hide read-only flag in file dialogs opened by the Edit Settings dialog for the Windows executable (bel)
-- Add all functions to dll.def, that are in the header (bel)
-- Added Lua extensions: send_file, get_var, get_mime_type, get_cookie, url_decode, url_encode (bel)
-- mg_set_request_handler() mod to use pattern (bel, Patch from Toni Wilk)
-- Solved, tested and documented SSL support for Windows (bel)
-- Fixed: select for Linux needs the nfds parameter set correctly (bel)
-- Add methods for returning the ports civetweb is listening on (keithel)
-- Fixes for Lua Server Pages, as described within the google groups thread. (bel)
-- Added support for plain Lua Scripts, and an example script. (bel)
-- A completely new, and more illustrative websocket example for C. (bel)
-- Websocket for Lua (bel)
-- An optional websocket_root directory, including URL rewriting (bel)
-- Update of SQLite3 to 3.8.1. (bel)
-- Add "date" header field to replies, according to the requirements of RFC 2616 (the HTTP standard), Section 14.18 (bel)
-- Fix websocket long pull (celeron55)
-- Updated API documentation (Alex Kozlov)
-- Fixed Posix locking functions for Windows (bel2125)
-- Updated version number
-
-Release Notes v1.5
-===
-### Objectives: *Bug fixes and updates, repository restoration*
-
-Changes
--------
-
-- Corrected bad mask flag/opcode passing to websocket callback (William Greathouse)
-- Moved CEVITWEB_VERSION define into civetweb.h
-- Added new simple zip deployment build for Windows.
-- Removed windows install package build.
-- Fixes page violation in mod_lua.inl (apkbox)
-- Use C style comments to enable compiling most of civetweb with -ansi. (F-Secure Corporation)
-- Allow directories with non ASCII characters in Windows in UTF-8 encoded (bel2125)
-- Added Lua File System support (bel2125)
-- Added mongoose history back in repository thanks to (Paul Sokolovsky)
-- Fixed keep alive (bel2125)
-- Updated of MIME types (bel2125)
-- Updated lsqlite (bel2125)
-- Fixed master thread priority (bel2125)
-- Fixed IPV6 defines under Windowe (grenclave)
-- Fixed potential dead lock in connection_close() (Morgan McGuire)
-- Added WebSocket example using asynchronous server messages (William Greathouse)
-- Fixed the getcwd() warning (William Greathouse)
-- Implemented the connection_close() callback (William Greathouse)
-- Fixed support URL's in civetweb.c (Daniel Oaks)
-- Allow port number to be zero to use a random free port (F-Secure Corporation)
-- Wait for threads to finish when stopping for a clean shutdown (F-Secure Corporation)
-- More static analysis fixes against Coverity tool (F-Secure Corporation)
-- Travis automated build testing support added (Daniel Oaks)
-- Updated version numbers.
-- Added contributor credits file.
-
-Release Notes v1.4
-===
-### Objectives: *New URI handler interface, feature enhancements, C++ extensions*
-The main idea behind this release is to bring about API consistency. All changes
-are backward compatible and have been kept to a minimum.
-
-Changes
--------
-
-- Added mg_set_request_handler() which provides a URI mapping for callbacks.
-   This is a new alternative to overriding callbacks.begin_request.
-- Externalized mg_url_encode()
-- Externalized mg_strncasecmp() for utiliy
-- Added CivetServer::getParam methods
-- Added CivetServer::urlDecode methods
-- Added CivetServer::urlEncode methods
-- Dealt with compiler warnings and some static analysis hits.
-- Added mg_get_var2() to parse repeated query variables
-- Externalized logging function cry() as mg_cry()
-- Added CivetServer::getCookie method (Hariprasad Kamath)
-- Added CivetServer::getHeader method (Hariprasad Kamath)
-- Added new basic C embedding example
-- Conformed source files to UNIX line endings for consistency.
-- Unified the coding style to improve reability.
-
-Release Notes v1.3
-===
-### Objectives: *Buildroot Integration*
-
-Changes
--------
-
-- Made option to put initial HTMLDIR in a different place
-- Validated build without SQLITE3 large file support
-- Updated documentation
-- Updated Buildroot config example
-
-Release Notes v1.2
-===
-### Objectives: *Installation Improvements, buildroot, cross compile support*
-The objective of this release is to make installation seamless.
-
-Changes
--------
-
-- Create an installation guide
-- Created both 32 and 64 bit windows installations
-- Added install for windows distribution
-- Added 64 bit build profiles for VS 2012.
-- Created a buildroot patch
-- Updated makefile to better support buildroot
-- Made doc root and ports configurable during the make install.
-- Updated Linux Install
-- Updated OS X Package
-- Improved install scheme with welcome web page
-
-Known Issues
------
-
-- The prebuilt Window's version requires [Visual C++ Redistributable for Visual Studio 2012](http://www.microsoft.com/en-us/download/details.aspx?id=30679)
-
-Release Notes v1.1
-===
-### Objectives: *Build, Documentation, License Improvements*
-The objective of this release is to establish a maintable code base, ensure MIT license rights and improve usability and documentation.
-
-Changes
--------
-
-- Reorangized build directories to make them more intuitive
-- Added new build rules for lib and slib with option to include C++ class
-- Upgraded Lua from 5.2.1 to 5.2.2
-- Added fallback configuration file path for Linux systems.
-    + Good for having a system wide default configuration /usr/local/etc/civetweb.conf
-- Added new C++ abstraction class CivetServer
-- Added thread safety for and fixed websocket defects (Morgan McGuire)
-- Created PKGBUILD to use Arch distribution (Daniel Oaks)
-- Created new documentation on Embeddeding, Building and yaSSL (see docs/).
-- Updated License file to include all licenses.
-- Replaced MD5 implementation due to questionable license.
-     + This requires new source file md5.inl
-- Changed UNIX/OSX build to conform to common practices.
-     + Supports build, install and clean rules.
-     + Supports cross compiling
-     + Features can be chosen in make options
-- Moved Cocoa/OSX build and packaging to a separate file.
-     + This actually a second build variant for OSX.
-     + Removed yaSSL from the OSX build, not needed.
-- Added new Visual Studio projects for Windows builds.
-     + Removed Windows support from Makefiles
-     + Provided additional, examples with Lua, and another with yaSSL.
-- Changed Zombie Reaping policy to not ignore SIGCHLD.
-     + The previous method caused trouble in applciations that spawn children.
-
-Known Issues
------
-
-- Build support for VS6 and some other has been deprecated.
-    + This does not impact embedded programs, just the stand-alone build.
-    + The old Makefile was renamed to Makefile.deprecated.
-    + This is partcially do to lack fo testing.
-    + Need to find out what is actually in demand.
-- Build changes may impact current users.
-    + As with any change of this type, changes may impact some users.
-
-Release Notes v1.0
-===
-
-### Objectives: *MIT License Preservation, Rebranding*
-The objective of this release is to establish a version of the Mongoose software distribution that still retains the MIT license.
-
-Changes
--------
-
-- Renamed Mongoose to Civetweb in the code and documentation.
-- Replaced copyrighted images with new images
-- Created a new code respository at https://github.com/civetweb/civetweb
-- Created a distribution site at https://sourceforge.net/projects/civetweb/
-- Basic build testing
diff --git a/thirdparty/civetweb-1.10/VisualStudio/buildRelease.pl b/thirdparty/civetweb-1.10/VisualStudio/buildRelease.pl
deleted file mode 100644
index df8db09..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/buildRelease.pl
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/perl
-# 
-# Copyright (c) 2013 No Face Press, LLC
-# License http://opensource.org/licenses/mit-license.php MIT License
-#
-
-# This script builds and packages a Windows release.
-# It requires ActiveState Perl to use and is intended
-# to be run from the its directory under the 
-# VS Developer Command Prompt.
-
-# Create a Zip file
-use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
-my $zip = Archive::Zip->new();
-
-my $src = "..";
-
-sub getCivetwebVersion {
-    print "Fetching CivetWeb version...\n";
-    open HEADER, "${src}/include/civetweb.h";
-    while (<HEADER>) {
-        if (m/define\s+CIVETWEB_VERSION\s+"(.+)"/) {
-            close HEADER;
-            return $1;
-        }
-    }
-    close HEADER;
-    return "UNKNOWN_VERSION";
-}
-
-my $CIVETWEB_VERSION = getCivetwebVersion();
-my $basename         = "civetweb-$CIVETWEB_VERSION";
-my $dir              = "${basename}";
-
-sub build32() {
-    print "\nBuilding Win32 Release version...\n";
-    system("msbuild /p:Configuration=Release /p:Platform=Win32 civetweb.sln");
-}
-
-sub build64() {
-    print "\nBuilding x64 Release version...\n";
-    system("msbuild /p:Configuration=Release /p:Platform=x64 civetweb.sln");
-}
-
-sub writeArchive() {
-    my $archive = "${basename}-win.zip";
-    print "Creating archive $archive ...\n";
-
-    $zip->addDirectory("${dir}/");
-
-    $zip->addFile( "${src}/LICENSE.md",            "${dir}/LICENSE.md" );
-    $zip->addFile( "${src}/README.md",             "${dir}/README.md" );
-    $zip->addFile( "${src}/resources/systray.ico", "${dir}/systray.ico" );
-    $zip->addFile( "${src}/resources/civetweb_64x64.png",
-        "${dir}/civetweb_64x64.png" );
-    $zip->addFile( "${src}/resources/itworks.html", "${dir}/index.html" );
-    $zip->addFile( "${src}/VS2012/Release/Win32/civetweb_lua.exe",
-        "${dir}/civetweb32.exe" );
-    $zip->addFile( "${src}/VS2012/Release/x64/civetweb_lua.exe",
-        "${dir}/civetweb64.exe" );
-
-    unless ( $zip->writeToFileNamed($archive) == AZ_OK ) {
-        die 'write error';
-    }
-
-}
-
-build32();
-build64();
-writeArchive();
-exit 0;
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb.sln b/thirdparty/civetweb-1.10/VisualStudio/civetweb.sln
deleted file mode 100644
index 0e8672b..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb.sln
+++ /dev/null
@@ -1,75 +0,0 @@
-

-Microsoft Visual Studio Solution File, Format Version 12.00

-# Visual Studio 14

-VisualStudioVersion = 14.0.25420.1

-MinimumVisualStudioVersion = 10.0.40219.1

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_lua", "civetweb_lua\civetweb_lua.vcxproj", "{9BE9C008-E851-42B1-A034-BD4630AE4CD6}"

-	ProjectSection(ProjectDependencies) = postProject

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} = {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}

-	EndProjectSection

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua_lib", "lua_lib\lua_lib.vcxproj", "{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}"

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embedded_c", "ex_embedded_c\ex_embedded_c.vcxproj", "{882EC43C-2EEE-434B-A711-C844108D29C6}"

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit_test", "unit_test\unit_test.vcxproj", "{1AC4A7A6-0100-4287-97F4-B95807BE5607}"

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duktape_lib", "duktape_lib\duktape_lib.vcxproj", "{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}"

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embed_cpp", "ex_embed_cpp\ex_embed_cpp.vcxproj", "{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}"

-EndProject

-Global

-	GlobalSection(SolutionConfigurationPlatforms) = preSolution

-		Debug|Win32 = Debug|Win32

-		Debug|x64 = Debug|x64

-		Release|Win32 = Release|Win32

-		Release|x64 = Release|x64

-	EndGlobalSection

-	GlobalSection(ProjectConfigurationPlatforms) = postSolution

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.ActiveCfg = Debug|Win32

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.Build.0 = Debug|Win32

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.ActiveCfg = Debug|x64

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.Build.0 = Debug|x64

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.ActiveCfg = Release|Win32

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.Build.0 = Release|Win32

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.ActiveCfg = Release|x64

-		{9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.Build.0 = Release|x64

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.ActiveCfg = Debug|Win32

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.Build.0 = Debug|Win32

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.ActiveCfg = Debug|x64

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.Build.0 = Debug|x64

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.ActiveCfg = Release|Win32

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.Build.0 = Release|Win32

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.ActiveCfg = Release|x64

-		{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.Build.0 = Release|x64

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.ActiveCfg = Debug|Win32

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.Build.0 = Debug|Win32

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.ActiveCfg = Debug|x64

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.ActiveCfg = Release|Win32

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.Build.0 = Release|Win32

-		{882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.ActiveCfg = Release|x64

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.ActiveCfg = Debug|Win32

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.Build.0 = Debug|Win32

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|x64.ActiveCfg = Debug|Win32

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.ActiveCfg = Release|Win32

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.Build.0 = Release|Win32

-		{1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|x64.ActiveCfg = Release|Win32

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.ActiveCfg = Debug|Win32

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.Build.0 = Debug|Win32

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|x64.ActiveCfg = Debug|x64

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|x64.Build.0 = Debug|x64

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.ActiveCfg = Release|Win32

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.Build.0 = Release|Win32

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|x64.ActiveCfg = Release|x64

-		{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|x64.Build.0 = Release|x64

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.ActiveCfg = Debug|Win32

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.Build.0 = Debug|Win32

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|x64.ActiveCfg = Debug|x64

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.ActiveCfg = Release|Win32

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.Build.0 = Release|Win32

-		{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|x64.ActiveCfg = Release|x64

-	EndGlobalSection

-	GlobalSection(SolutionProperties) = preSolution

-		HideSolutionNode = FALSE

-	EndGlobalSection

-EndGlobal

diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj b/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj
deleted file mode 100644
index 45f8bbe..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj
+++ /dev/null
@@ -1,216 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup Label="ProjectConfigurations">

-    <ProjectConfiguration Include="Debug|Win32">

-      <Configuration>Debug</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug|x64">

-      <Configuration>Debug</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|Win32">

-      <Configuration>Release</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|x64">

-      <Configuration>Release</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-  </ItemGroup>

-  <PropertyGroup Label="Globals">

-    <ProjectGuid>{9BE9C008-E851-42B1-A034-BD4630AE4CD6}</ProjectGuid>

-    <Keyword>Win32Proj</Keyword>

-    <RootNamespace>civetweb_lua</RootNamespace>

-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v140_xp</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v140</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug CONSOLE|x64'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v140_xp</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <PlatformToolset>v140</PlatformToolset>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

-  <ImportGroup Label="ExtensionSettings">

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug CONSOLE|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <PropertyGroup Label="UserMacros" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <LinkIncremental>true</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <LinkIncremental>true</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug CONSOLE|x64'">

-    <LinkIncremental>true</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <LinkIncremental>false</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <LinkIncremental>false</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\</OutDir>

-  </PropertyGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>USE_SERVER_STATS;USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.5.2\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>USE_SERVER_STATS;USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.5.2\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug CONSOLE|x64'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>USE_SERVER_STATS;USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.5.2\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>USE_SERVER_STATS;USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.5.2\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemGroup>

-    <Text Include="ReadMe.txt" />

-  </ItemGroup>

-  <ItemGroup>

-    <ClInclude Include="..\..\include\civetweb.h" />

-    <ClInclude Include="..\..\src\third_party\civetweb_lua.h" />

-    <ClInclude Include="..\..\src\third_party\lua-5.2.4\src\lauxlib.h" />

-    <ClInclude Include="..\..\src\third_party\lua-5.2.4\src\lua.h" />

-  </ItemGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\src\civetweb.c" />

-    <ClCompile Include="..\..\src\main.c" />

-  </ItemGroup>

-  <ItemGroup>

-    <ResourceCompile Include="..\..\resources\res.rc" />

-  </ItemGroup>

-  <ItemGroup>

-    <Image Include="..\..\resources\systray.ico" />

-  </ItemGroup>

-  <ItemGroup>

-    <ProjectReference Include="..\lua_lib\lua_lib.vcxproj">

-      <Project>{8f5e5d77-d269-4665-9e27-1045da6cf0d8}</Project>

-    </ProjectReference>

-    <ProjectReference Include="..\duktape_lib\duktape_lib.vcxproj">

-      <Project>{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}</Project>

-    </ProjectReference>

-  </ItemGroup>

-  <ItemGroup>

-    <None Include="..\..\src\handle_form.inl" />

-    <None Include="..\..\src\md5.inl" />

-    <None Include="..\..\src\sha1.inl" />

-    <None Include="..\..\src\mod_duktape.inl" />

-    <None Include="..\..\src\mod_lua.inl" />

-    <None Include="..\..\src\timer.inl" />

-    <None Include="..\..\src\file_ops.inl" />

-  </ItemGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

-  <ImportGroup Label="ExtensionTargets">

-  </ImportGroup>

-</Project>
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj.filters b/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj.filters
deleted file mode 100644
index caf951c..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_lua/civetweb_lua.vcxproj.filters
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup>

-    <Filter Include="Source Files">

-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

-    </Filter>

-    <Filter Include="Header Files">

-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>

-    </Filter>

-    <Filter Include="Resource Files">

-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>

-    </Filter>

-    <Filter Include="inl files">

-      <UniqueIdentifier>{1ef3413b-2315-48f2-ad22-57af6b4f7aca}</UniqueIdentifier>

-    </Filter>

-  </ItemGroup>

-  <ItemGroup>

-    <Text Include="ReadMe.txt" />

-  </ItemGroup>

-  <ItemGroup>

-    <ClInclude Include="..\..\include\civetweb.h">

-      <Filter>Header Files</Filter>

-    </ClInclude>

-    <ClInclude Include="..\..\src\third_party\lua-5.2.4\src\lua.h">

-      <Filter>Header Files</Filter>

-    </ClInclude>

-    <ClInclude Include="..\..\src\third_party\lua-5.2.4\src\lauxlib.h">

-      <Filter>Header Files</Filter>

-    </ClInclude>

-    <ClInclude Include="..\..\src\third_party\civetweb_lua.h">

-      <Filter>Header Files</Filter>

-    </ClInclude>

-  </ItemGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\src\civetweb.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\src\main.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-  </ItemGroup>

-  <ItemGroup>

-    <ResourceCompile Include="..\..\resources\res.rc">

-      <Filter>Resource Files</Filter>

-    </ResourceCompile>

-  </ItemGroup>

-  <ItemGroup>

-    <Image Include="..\..\resources\systray.ico">

-      <Filter>Resource Files</Filter>

-    </Image>

-  </ItemGroup>

-  <ItemGroup>

-    <None Include="..\..\src\md5.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\sha1.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\mod_lua.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\timer.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\file_ops.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\mod_duktape.inl">

-      <Filter>inl files</Filter>

-    </None>

-    <None Include="..\..\src\handle_form.inl">

-      <Filter>inl files</Filter>

-    </None>

-  </ItemGroup>

-</Project>
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl.sln b/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl.sln
deleted file mode 100644
index 49e36ce..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl.sln
+++ /dev/null
@@ -1,36 +0,0 @@
-

-Microsoft Visual Studio Solution File, Format Version 12.00

-# Visual Studio 2012

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_yassl", "civetweb_yassl\civetweb_yassl.vcxproj", "{F02517CC-F896-41A2-86E4-509E55C70059}"

-EndProject

-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yassl_lib", "yassl_lib\yassl_lib.vcxproj", "{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}"

-EndProject

-Global

-	GlobalSection(SolutionConfigurationPlatforms) = preSolution

-		Debug|Win32 = Debug|Win32

-		Debug|x64 = Debug|x64

-		Release|Win32 = Release|Win32

-		Release|x64 = Release|x64

-	EndGlobalSection

-	GlobalSection(ProjectConfigurationPlatforms) = postSolution

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.ActiveCfg = Debug|Win32

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.Build.0 = Debug|Win32

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.ActiveCfg = Debug|x64

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.Build.0 = Debug|x64

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.ActiveCfg = Release|Win32

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.Build.0 = Release|Win32

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.ActiveCfg = Release|x64

-		{F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.Build.0 = Release|x64

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.ActiveCfg = Debug|Win32

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.Build.0 = Debug|Win32

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.ActiveCfg = Debug|x64

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.Build.0 = Debug|x64

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.ActiveCfg = Release|Win32

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.Build.0 = Release|Win32

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.ActiveCfg = Release|x64

-		{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.Build.0 = Release|x64

-	EndGlobalSection

-	GlobalSection(SolutionProperties) = preSolution

-		HideSolutionNode = FALSE

-	EndGlobalSection

-EndGlobal

diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj b/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj
deleted file mode 100644
index b9a048e..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup Label="ProjectConfigurations">

-    <ProjectConfiguration Include="Debug|Win32">

-      <Configuration>Debug</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug|x64">

-      <Configuration>Debug</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|Win32">

-      <Configuration>Release</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|x64">

-      <Configuration>Release</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-  </ItemGroup>

-  <PropertyGroup Label="Globals">

-    <ProjectGuid>{F02517CC-F896-41A2-86E4-509E55C70059}</ProjectGuid>

-    <Keyword>Win32Proj</Keyword>

-    <RootNamespace>civetweb_yassl</RootNamespace>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

-    <ConfigurationType>Application</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

-  <ImportGroup Label="ExtensionSettings">

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <PropertyGroup Label="UserMacros" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <LinkIncremental>true</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <LinkIncremental>true</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <LinkIncremental>false</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <LinkIncremental>false</LinkIncremental>

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemGroup>

-    <ClInclude Include="..\..\..\include\civetweb.h" />

-  </ItemGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\..\src\civetweb.c" />

-    <ClCompile Include="..\..\..\src\main.c" />

-  </ItemGroup>

-  <ItemGroup>

-    <ResourceCompile Include="..\..\..\resources\res.rc" />

-  </ItemGroup>

-  <ItemGroup>

-    <Image Include="..\..\..\resources\systray.ico" />

-  </ItemGroup>

-  <ItemGroup>

-    <ProjectReference Include="..\yassl_lib\yassl_lib.vcxproj">

-      <Project>{8c0c878b-bbd6-4241-bca6-61753ffcc7f1}</Project>

-    </ProjectReference>

-  </ItemGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

-  <ImportGroup Label="ExtensionTargets">

-  </ImportGroup>

-</Project>
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters b/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters
deleted file mode 100644
index 1c5ee40..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup>

-    <Filter Include="Source Files">

-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

-    </Filter>

-    <Filter Include="Header Files">

-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>

-    </Filter>

-    <Filter Include="Resource Files">

-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>

-    </Filter>

-  </ItemGroup>

-  <ItemGroup>

-    <ClInclude Include="..\..\..\include\civetweb.h">

-      <Filter>Header Files</Filter>

-    </ClInclude>

-  </ItemGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\..\src\civetweb.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\main.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-  </ItemGroup>

-  <ItemGroup>

-    <ResourceCompile Include="..\..\..\resources\res.rc">

-      <Filter>Resource Files</Filter>

-    </ResourceCompile>

-  </ItemGroup>

-  <ItemGroup>

-    <Image Include="..\..\..\resources\systray.ico">

-      <Filter>Resource Files</Filter>

-    </Image>

-  </ItemGroup>

-</Project>
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj b/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj
deleted file mode 100644
index 033b82d..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj
+++ /dev/null
@@ -1,185 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup Label="ProjectConfigurations">

-    <ProjectConfiguration Include="Debug|Win32">

-      <Configuration>Debug</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug|x64">

-      <Configuration>Debug</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|Win32">

-      <Configuration>Release</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release|x64">

-      <Configuration>Release</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-  </ItemGroup>

-  <PropertyGroup Label="Globals">

-    <ProjectGuid>{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}</ProjectGuid>

-    <Keyword>Win32Proj</Keyword>

-    <RootNamespace>yassl_lib</RootNamespace>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseDebugLibraries>true</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseDebugLibraries>false</UseDebugLibraries>

-    <PlatformToolset>v110</PlatformToolset>

-    <WholeProgramOptimization>true</WholeProgramOptimization>

-    <CharacterSet>MultiByte</CharacterSet>

-  </PropertyGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

-  <ImportGroup Label="ExtensionSettings">

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">

-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

-  </ImportGroup>

-  <PropertyGroup Label="UserMacros" />

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)</OutDir>

-  </PropertyGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

-    <ClCompile>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <WarningLevel>Level3</WarningLevel>

-      <Optimization>Disabled</Optimization>

-      <PreprocessorDefinitions>OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

-    <ClCompile>

-      <WarningLevel>Level3</WarningLevel>

-      <PrecompiledHeader>

-      </PrecompiledHeader>

-      <Optimization>MaxSpeed</Optimization>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <PreprocessorDefinitions>OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\</AdditionalIncludeDirectories>

-    </ClCompile>

-    <Link>

-      <SubSystem>Windows</SubSystem>

-      <GenerateDebugInformation>true</GenerateDebugInformation>

-      <EnableCOMDATFolding>true</EnableCOMDATFolding>

-      <OptimizeReferences>true</OptimizeReferences>

-    </Link>

-  </ItemDefinitionGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\aes.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\arc4.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\asn.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\coding.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\des3.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\dh.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\dsa.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\ecc.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\error.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\hc128.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\hmac.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\integer.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\logging.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md2.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md4.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md5.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\memory.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\misc.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\pwdbased.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\rabbit.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\random.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\ripemd.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\rsa.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\sha.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\sha256.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\sha512.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\tfm.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\crl.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\internal.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\io.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\keys.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\ocsp.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\sniffer.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\ssl.c" />

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\src\tls.c" />

-  </ItemGroup>

-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

-  <ImportGroup Label="ExtensionTargets">

-  </ImportGroup>

-</Project>
\ No newline at end of file
diff --git a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters b/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters
deleted file mode 100644
index 566b892..0000000
--- a/thirdparty/civetweb-1.10/VisualStudio/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

-  <ItemGroup>

-    <Filter Include="Source Files">

-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

-    </Filter>

-    <Filter Include="Header Files">

-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>

-    </Filter>

-    <Filter Include="Resource Files">

-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>

-    </Filter>

-  </ItemGroup>

-  <ItemGroup>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\aes.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\arc4.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\asn.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\coding.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\des3.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\dh.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\dsa.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\ecc.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\error.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\hc128.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\hmac.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\integer.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\logging.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md2.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md4.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\md5.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\memory.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\misc.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\..\cyassl-2.7.0\ctaocrypt\src\pwdbased.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>