From 7fd5bef36ee1052571a50e296ee9853757558d29 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Tue, 7 Jan 2020 23:12:01 -0800 Subject: [PATCH 01/29] Initial commit of changes to simplify creation of shared library --- CMakeLists.txt | 2 +- build.sh | 101 +++++++++++++++++--------- examples/cpp/SampleCpp/CMakeLists.txt | 27 ++++--- install.sh | 2 +- lib/CMakeLists.txt | 25 ++++++- tools/MakeDeb.cmake | 2 +- tools/MakeRpm.cmake | 2 +- tools/MakeTgz.cmake | 6 +- 8 files changed, 112 insertions(+), 55 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dc14bf6a..b035caa66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,7 +191,7 @@ option(BUILD_OBJC_WRAPPER "Build Obj-C wrapper" YES) option(BUILD_PACKAGE "Build package" YES) if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - option(BUILD_APPLE_HTTP "Build Apple HTTP client" YES) + option(BUILD_APPLE_HTTP "Build Apple HTTP client" NO) endif() if(BUILD_UNIT_TESTS OR BUILD_FUNC_TESTS) diff --git a/build.sh b/build.sh index d345b8387..8e6ec296f 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,7 @@ #!/bin/bash - export PATH=/usr/local/bin:$PATH +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd $DIR if [[ ! -z "${GIT_PULL_TOKEN}" ]]; then rm -rf lib/modules @@ -12,27 +13,59 @@ if [[ ! -z "${GIT_PULL_TOKEN}" ]]; then git clone https://${GIT_PULL_TOKEN}:x-oauth-basic@github.com/microsoft/cpp_client_telemetry_modules.git lib/modules fi -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -echo "Current directory: $DIR" -cd $DIR - export NOROOT=$NOROOT if [ "$1" == "clean" ]; then - rm -f CMakeCache.txt *.cmake - rm -rf out - rm -rf .buildtools -# make clean + rm -f CMakeCache.txt *.cmake + rm -rf out + rm -rf .buildtools + # make clean fi +# Don't elevate, don't deploy package if [ "$1" == "noroot" ] || [ "$2" == "noroot" ]; then -export NOROOT=true + export NOROOT=true fi +# Build release bits if [ "$1" == "release" ] || [ "$2" == "release" ]; then -BUILD_TYPE="Release" + BUILD_TYPE="Release" else -BUILD_TYPE="Debug" + BUILD_TYPE="Debug" +fi + +LINK_TYPE= +CMAKE_OPTS="${CMAKE_OPTS:-DBUILD_SHARED_LIBS=OFF}" +while getopts "h?vl:D:" opt; do + case "$opt" in + h|\?) + echo "Usage: build.sh [clean] [noroot] [release] [-h|-?] [-l (static|shared)] [-D CMAKE_OPTION]" + echo " " + echo "options: " + echo " " + echo " -h | -? - this help. " + echo " -l [static|shared] - build static (default) or shared library. " + echo " -D [CMAKE_OPTION] - additional option to pass to cmake. " + echo " " + echo "cmake options can be passed using CMAKE_OPTS environment variable. " + echo " " + exit 0 + ;; + :) echo "Invalid option: $OPTARG requires an argument" 1>&2 + exit 0 + ;; + v) verbose=1 + ;; + D) CMAKE_OPTS="$CMAKE_OPTS -D$OPTARG" + ;; + l) LINK_TYPE=$OPTARG + ;; + esac +done +shift $((OPTIND -1)) + +if [ "$LINK_TYPE" == "shared" ]; then + CMAKE_OPTS="$CMAKE_OPTS -DBUILD_SHARED_LIBS=ON" fi # Set target MacOS minver @@ -42,21 +75,21 @@ export MACOSX_DEPLOYMENT_TARGET=10.10 FILE=.buildtools OS_NAME=`uname -a` if [ ! -f $FILE ]; then -case "$OS_NAME" in - *Darwin*) tools/setup-buildtools-mac.sh ;; - *Linux*) [[ -z "$NOROOT" ]] && sudo tools/setup-buildtools.sh || echo "No root: skipping build tools installation." ;; - *) echo "WARNING: unsupported OS $OS_NAME , skipping build tools installation.." -esac -# Assume that the build tools have been successfully installed -echo > $FILE + case "$OS_NAME" in + *Darwin*) tools/setup-buildtools-mac.sh ;; + *Linux*) [[ -z "$NOROOT" ]] && sudo tools/setup-buildtools.sh || echo "No root: skipping build tools installation." ;; + *) echo "WARNING: unsupported OS $OS_NAME , skipping build tools installation." ;; + esac + # Assume that the build tools have been successfully installed + echo > $FILE fi if [ -f /usr/bin/gcc ]; then -echo "gcc version: `gcc --version`" + echo "gcc version: `gcc --version`" fi if [ -f /usr/bin/clang ]; then -echo "clang version: `clang --version`" + echo "clang version: `clang --version`" fi # Skip Version.hpp changes @@ -71,21 +104,19 @@ CMAKE_PACKAGE_TYPE=tgz # .deb package if [ -f /usr/bin/dpkg ]; then -export CMAKE_PACKAGE_TYPE=deb + export CMAKE_PACKAGE_TYPE=deb fi # .rpm package if [ -f /usr/bin/rpmbuild ]; then -export CMAKE_PACKAGE_TYPE=rpm + export CMAKE_PACKAGE_TYPE=rpm fi - # Fail on error set -e - # TODO: pass custom build flags? -cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_PACKAGE_TYPE=$CMAKE_PACKAGE_TYPE .. +cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_PACKAGE_TYPE=$CMAKE_PACKAGE_TYPE $CMAKE_OPTS .. # TODO: strip symbols to minimize (release-only) # Build all @@ -104,13 +135,13 @@ make package # Debian / Ubuntu / Raspbian if [ -f /usr/bin/dpkg ]; then -# Install new package -[[ -z "$NOROOT" ]] && sudo dpkg -i *.deb || echo "No root: skipping package deployment." + # Install new package + [[ -z "$NOROOT" ]] && sudo dpkg -i *.deb || echo "No root: skipping package deployment." fi # RedHat / CentOS if [ -f /usr/bin/rpmbuild ]; then -[[ -z "$NOROOT" ]] && sudo rpm -i --force -v *.rpm || echo "No root: skipping package deployment." + [[ -z "$NOROOT" ]] && sudo rpm -i --force -v *.rpm || echo "No root: skipping package deployment." fi # Install SDK headers and lib to /usr/local @@ -120,10 +151,10 @@ fi ## strip -S --strip-unneeded --remove-section=.note.gnu.gold-version --remove-section=.comment --remove-section=.note --remove-section=.note.gnu.build-id --remove-section=.note.ABI-tag out/lib/libmat.so if [ "$CMAKE_PACKAGE_TYPE" == "tgz" ]; then -cd .. -MATSDK_INSTALL_DIR="${MATSDK_INSTALL_DIR:-/usr/local}" -echo "+-----------------------------------------------------------------------------------+" -echo " This step may prompt for your sudo password to deploy SDK to $MATSDK_INSTALL_DIR " -echo "+-----------------------------------------------------------------------------------+" -[[ -z "$NOROOT" ]] && sudo ./install.sh $MATSDK_INSTALL_DIR || echo "No root: skipping package deployment." + cd .. + MATSDK_INSTALL_DIR="${MATSDK_INSTALL_DIR:-/usr/local}" + echo "+-----------------------------------------------------------------------------------+" + echo " This step may prompt for your sudo password to deploy SDK to $MATSDK_INSTALL_DIR " + echo "+-----------------------------------------------------------------------------------+" + [[ -z "$NOROOT" ]] && sudo ./install.sh $MATSDK_INSTALL_DIR || echo "No root: skipping package deployment." fi diff --git a/examples/cpp/SampleCpp/CMakeLists.txt b/examples/cpp/SampleCpp/CMakeLists.txt index 46c1c4013..fbaeab3de 100644 --- a/examples/cpp/SampleCpp/CMakeLists.txt +++ b/examples/cpp/SampleCpp/CMakeLists.txt @@ -4,24 +4,27 @@ project(SampleCpp) # Uncomment for building i386 binary on x86_64 system #set(CMAKE_SYSTEM_PROCESSOR i386) +if (NOT TARGET_ARCH) + set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) +endif() + # For ARM / Raspberry Pi 3 cross-compile # set(MAT_SDK_LIB /usr/local/lib/armv7l-linux-gnu) -# Point example to SDK dirs for x86_64 Desktop -if(EXISTS "/usr/local/lib/libmat.a") -# Use local libmat.a -set(MAT_SDK_LIB /usr/local/lib/) -else() -# Use architecture-specific libmat.a -set(MAT_SDK_LIB /usr/local/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu) +# Search for static lib first +find_path(MAT_SDK_LIB_PATH NAMES libmat.a PATHS /usr/lib /usr/local/lib /usr/local/lib/${TARGET_ARCH}-linux-gnu) +if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # Search for .dylib on Mac OS X + find_path(MAT_SDK_DYLIB_PATH NAMES libmat.dylib PATHS /usr/lib /usr/local/lib) endif() +find_library(LIBMAT NAMES libmat.a libmat.dylib HINTS ${MAT_SDK_LIB_PATH} ${MAT_SDK_DYLIB_PATH}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb -gdwarf-2 -std=c11") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -ggdb -gdwarf-2 -std=c++11") find_package (Threads) -set(MAT_SDK_INCLUDE /usr/local/include/mat) +set(MAT_SDK_INCLUDE /usr/local/include/mat) # Aria SDK to include dirs include_directories( . ${MAT_SDK_INCLUDE} ) @@ -32,9 +35,9 @@ source_group(" " REGULAR_EXPRESSION "") # Prefer linking to more recent local sqlite3 if(EXISTS "/usr/local/lib/libsqlite3.a") -set (SQLITE3_LIB "/usr/local/lib/libsqlite3.a") + set (SQLITE3_LIB "/usr/local/lib/libsqlite3.a") else() -set (SQLITE3_LIB "sqlite3") + set (SQLITE3_LIB "sqlite3") endif() set (PLATFORM_LIBS "") @@ -51,4 +54,6 @@ endif() #tcmalloc turned off by default #target_link_libraries(SampleCpp ${MAT_SDK_LIB}/libmat.a curl z ${CMAKE_THREAD_LIBS_INIT} ${SQLITE3_LIB} dl tcmalloc) -target_link_libraries(SampleCpp ${MAT_SDK_LIB}/libmat.a curl z ${CMAKE_THREAD_LIBS_INIT} ${SQLITE3_LIB} ${PLATFORM_LIBS} dl) +# Static: +# target_link_libraries(SampleCpp ${MAT_SDK_LIB_STATIC} curl z ${CMAKE_THREAD_LIBS_INIT} ${SQLITE3_LIB} ${PLATFORM_LIBS} dl) +target_link_libraries(SampleCpp ${LIBMAT} curl z ${CMAKE_THREAD_LIBS_INIT} ${SQLITE3_LIB} ${PLATFORM_LIBS} dl) diff --git a/install.sh b/install.sh index ef390b49e..db0fa0f38 100755 --- a/install.sh +++ b/install.sh @@ -2,6 +2,6 @@ MATSDK_INSTALL_DIR=$1 echo "Install SDK to $MATSDK_INSTALL_DIR" mkdir -p $MATSDK_INSTALL_DIR/lib/mat -cp out/lib/libmat.a $MATSDK_INSTALL_DIR/lib +cp out/lib/libmat.* $MATSDK_INSTALL_DIR/lib mkdir -p $MATSDK_INSTALL_DIR/include/mat cp lib/include/public/* $MATSDK_INSTALL_DIR/include/mat diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index b9134d5d7..a487eb061 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -173,11 +173,30 @@ endif() if(BUILD_SHARED_LIBS STREQUAL "ON") message("-- Building shared SDK library") + + # include(FindCURL) + # find_package(CURL REQUIRED) + # set(CMAKE_REQUIRED_LIBRARIES "${CURL_LIBRARIES}") + + # find_package(sqlite3 REQUIRED) + add_library(mat SHARED ${SRCS}) - add_library(sqlite3 SHARED IMPORTED GLOBAL) - add_library(z SHARED IMPORTED GLOBAL) + add_library(sqlite3 STATIC IMPORTED GLOBAL) + # add_library(sqlite3 SHARED IMPORTED GLOBAL) + # add_library(z STATIC IMPORTED GLOBAL) + # add_library(z SHARED IMPORTED GLOBAL) + # add_library(curl SHARED IMPORTED GLOBAL) + + # Add flags for obtaining system UUID via IOKit + if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(CMAKE_SHARED_LINKER_FLAGS + "-framework CoreFoundation -framework IOKit -framework Foundation" + ) + endif() + #target_link_libraries(mat PUBLIC libsqlite3.so libz.so ${LIBS} "${CMAKE_THREAD_LIBS_INIT}" "${CMAKE_DL_LIBS}" "${Tcmalloc_LIBRARIES}") - target_link_libraries(mat PUBLIC libsqlite3.so libz.so ${LIBS} "${CMAKE_THREAD_LIBS_INIT}" "${CMAKE_DL_LIBS}") + target_link_libraries(mat PRIVATE libsqlite3.a PUBLIC z ${LIBS} "${CMAKE_THREAD_LIBS_INIT}" "${CMAKE_DL_LIBS}" "${CMAKE_REQUIRED_LIBRARIES}") + # target_link_libraries(mat PUBLIC libsqlite3 libcurl.a libz.a libssl.a libcrypto.a "${SQLITE_LIBRARY}" "${CMAKE_THREAD_LIBS_INIT}" "${CMAKE_DL_LIBS}" ) install(TARGETS mat EXPORT mat LIBRARY DESTINATION ${INSTALL_LIB_DIR}) else() diff --git a/tools/MakeDeb.cmake b/tools/MakeDeb.cmake index 28e6301d4..7a30ff09c 100644 --- a/tools/MakeDeb.cmake +++ b/tools/MakeDeb.cmake @@ -10,7 +10,7 @@ set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") set(CPACK_GENERATOR "DEB") set(MAJOR_VERSION "3") -set(MINOR_VERSION "2") +set(MINOR_VERSION "3") string(TIMESTAMP DAYNUMBER "%j") set(PATCH_VERSION "${DAYNUMBER}") diff --git a/tools/MakeRpm.cmake b/tools/MakeRpm.cmake index 47e2f6fba..8b45f4150 100644 --- a/tools/MakeRpm.cmake +++ b/tools/MakeRpm.cmake @@ -8,7 +8,7 @@ set(CPACK_RPM_PACKAGE_DESCRIPTION_SUMMARY "Microsoft Applications Telemetry SDK set(CPACK_RPM_PACKAGE_CONTACT "1ds.sdk.cpp@service.microsoft.com") set(MAJOR_VERSION "3") -set(MINOR_VERSION "2") +set(MINOR_VERSION "3") string(TIMESTAMP DAYNUMBER "%j") set(PATCH_VERSION "${DAYNUMBER}") diff --git a/tools/MakeTgz.cmake b/tools/MakeTgz.cmake index 058b00340..8f0b8502e 100644 --- a/tools/MakeTgz.cmake +++ b/tools/MakeTgz.cmake @@ -7,7 +7,7 @@ set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") set(CPACK_GENERATOR "TGZ") set(MAJOR_VERSION "3") -set(MINOR_VERSION "2") +set(MINOR_VERSION "3") string(TIMESTAMP DAYNUMBER "%j") set(PATCH_VERSION "${DAYNUMBER}") @@ -19,7 +19,9 @@ set(CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}") set(CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}") set(CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}") -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib/libmat.a DESTINATION lib COMPONENT libraries) +file(GLOB ALL_TARGET_LIBS "${CMAKE_CURRENT_BINARY_DIR}/lib/libmat.*") + +install(FILES ${ALL_TARGET_LIBS} DESTINATION lib COMPONENT libraries) #install(FILES ${MAT_SDK_INC_DIR}/*.* DESTINATION include/mat COMPONENT libraries) # FIXME: add architecture name in file name From 7a99957059e116ce46dc2958d5e71775596fd230 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 8 Jan 2020 02:20:56 -0800 Subject: [PATCH 02/29] Add netcore30 wrapper example on top of shared lib --- lib/include/public/mat.h | 8 +- wrappers/netcore/EventSender.csproj | 12 +++ wrappers/netcore/Program.cs | 126 ++++++++++++++++++++++++++++ wrappers/netcore/appsettings.json | 18 ++++ wrappers/netcore/run.sh | 11 +++ wrappers/netcore/sdk-config.json | 46 ++++++++++ 6 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 wrappers/netcore/EventSender.csproj create mode 100644 wrappers/netcore/Program.cs create mode 100644 wrappers/netcore/appsettings.json create mode 100755 wrappers/netcore/run.sh create mode 100644 wrappers/netcore/sdk-config.json diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index 0a9d2f02e..482568c23 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -14,6 +14,12 @@ #include #endif +#ifdef __clang__ +#define PACKED_STRUCT __attribute__((packed)) +#else +#define PACKED_STRUCT +#endif + #if (_MSC_VER == 1500) || (_MSC_VER == 1600) /* Visual Studio 2010 */ typedef __int64 int64_t; @@ -114,7 +120,7 @@ extern "C" { typedef int32_t evt_status_t; typedef struct evt_event evt_event; - typedef struct + typedef struct PACKED_STRUCT { evt_call_t call; /* In */ evt_handle_t handle; /* In / Out */ diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj new file mode 100644 index 000000000..059cc350c --- /dev/null +++ b/wrappers/netcore/EventSender.csproj @@ -0,0 +1,12 @@ + + + Exe + netcoreapp3.1 + + + + + + + + diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs new file mode 100644 index 000000000..4450893d8 --- /dev/null +++ b/wrappers/netcore/Program.cs @@ -0,0 +1,126 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.IO; +using System.Json; + +namespace EventSender +{ + public enum EventCallType + { + EVT_OP_LOAD = 0x00000001, + EVT_OP_UNLOAD = 0x00000002, + EVT_OP_OPEN = 0x00000003, + EVT_OP_CLOSE = 0x00000004, + EVT_OP_CONFIG = 0x00000005, + EVT_OP_LOG = 0x00000006, + EVT_OP_PAUSE = 0x00000007, + EVT_OP_RESUME = 0x00000008, + EVT_OP_UPLOAD = 0x00000009, + EVT_OP_FLUSH = 0x0000000A, + EVT_OP_VERSION = 0x0000000B, + EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, + EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 + } + + // [StructLayout(LayoutKind.Sequential)] + [StructLayout(LayoutKind.Explicit, Size=32, CharSet=CharSet.Ansi)] + public struct EventCallContext + { + [FieldOffset(0)]public UInt32 call; + [FieldOffset(4)]public ulong handle; + [FieldOffset(12)]public IntPtr data; + [FieldOffset(16)]public UInt32 result; + [FieldOffset(20)]public UInt32 size; + } + + internal static class NativeMethods + { + [DllImport("libmat", EntryPoint = "evt_api_call_default" /* , CallingConvention = CallingConvention.Cdecl */)] + public static extern UInt32 evt_api_call([In, Out] ref EventCallContext context); + // public static extern UInt32 evt_api_call(ref EventCallContext context); + // Alternatives: + // [MarshalAs(UnmanagedType.LPStruct)] + } + + class Program + { + public const string SDK_VERSION = "3.3.0-netcore"; + + static string ReadConfiguration(string filename) + { + string result = ""; + using (StreamReader sr = new StreamReader(filename)) + { + result = sr.ReadToEnd(); + } + return result; + } + + static ulong evt_open(string cfg) + { + /* + byte[] data = Encoding.ASCII.GetBytes(cfg); + var nativeDataPtr = Marshal.AllocHGlobal(data.Length+1); + Marshal.Copy(data, 0, nativeDataPtr, data.Length); + Marshal.WriteByte(nativeDataPtr+data.Length, 0); + */ + var nativeDataPtr = Marshal.StringToHGlobalAnsi(cfg); + EventCallContext context = new EventCallContext + { + call = (Byte)EventCallType.EVT_OP_OPEN, + data = nativeDataPtr + }; + NativeMethods.evt_api_call(ref context); + // Marshal.Release(nativeDataPtr); + return context.handle; + } + + static ulong evt_close(ulong inHandle) + { + EventCallContext context = new EventCallContext + { + call = (Byte)EventCallType.EVT_OP_CLOSE, + handle = inHandle + }; + return NativeMethods.evt_api_call(ref context); + } + + static string evt_version() + { + byte[] data = Encoding.ASCII.GetBytes(SDK_VERSION); + var nativeDataPtr = Marshal.AllocHGlobal(data.Length+1); + Marshal.Copy(data, 0, nativeDataPtr, data.Length); + Marshal.WriteByte(nativeDataPtr+data.Length, 0); + EventCallContext context = new EventCallContext + { + call = (Byte)EventCallType.EVT_OP_VERSION, + data = nativeDataPtr + }; + NativeMethods.evt_api_call(ref context); + return Marshal.PtrToStringAnsi(context.data); // x.y.z + // PtrToStringAnsi(context.data); + } + + static void Main(string[] args) + { + // Environment.SetEnvironmentVariable("DYLD_FALLBACK_LIBRARY_PATH", "/usr/local/lib"); + + Console.WriteLine("Reading configuration..."); + string cfg = ReadConfiguration("sdk-config.json"); + // Parse to verify it is valid and print it out + JsonObject jsonDoc = (JsonObject)JsonObject.Parse(cfg); + Console.WriteLine("configuration:\n{0}", jsonDoc.ToString()); + + Console.WriteLine("SDK version: {0}", evt_version()); + + Console.WriteLine("evt_open..."); + var handle = evt_open(cfg); + Console.WriteLine("handle={0}", handle); + + Console.WriteLine("evt_close..."); + var result = evt_close(handle); + Console.WriteLine("result={0}", result); + } + } +} diff --git a/wrappers/netcore/appsettings.json b/wrappers/netcore/appsettings.json new file mode 100644 index 000000000..ecd461122 --- /dev/null +++ b/wrappers/netcore/appsettings.json @@ -0,0 +1,18 @@ +{ + "Logging": { + "IncludeScopes": true, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + }, + "Console": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } + } +} + diff --git a/wrappers/netcore/run.sh b/wrappers/netcore/run.sh new file mode 100755 index 000000000..dd2764567 --- /dev/null +++ b/wrappers/netcore/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Mac OS X: +# brew cask install dotnet-sdk + +#export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH +#export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib:$DYLD_FALLBACK_LIBRARY_PATH + +dotnet run -c Debug -v diag + + + diff --git a/wrappers/netcore/sdk-config.json b/wrappers/netcore/sdk-config.json new file mode 100644 index 000000000..98cbeed13 --- /dev/null +++ b/wrappers/netcore/sdk-config.json @@ -0,0 +1,46 @@ +{ + "config": {"host": "*"}, + "name": "C-API-Client-0", + "version": "1.0.0", + "cacheFileFullNotificationPercentage": 75, + "cacheFilePath": "/tmp/storage.db", + "cacheFileSizeLimitInBytes": 3145728, + "cacheMemoryFullNotificationPercentage": 75, + "cacheMemorySizeLimitInBytes": 524288, + "compat": { + "dotType": true + }, + "enableLifecycleSession": false, + "eventCollectorUri": "https://self.events.data.microsoft.com/OneCollector/1.0/", + "hostMode": true, + "http": { + "compress": true + }, + "maxDBFlushQueues": 3, + "maxPendingHTTPRequests": 4, + "maxTeardownUploadTimeInSec": 1, + "minimumTraceLevel": 1, + "multiTenantEnabled": true, + "primaryToken": "6d084bbf6a9644ef83f40a77c9e34580-c2d379e0-4408-4325-9b4d-2a7d78131e14-7322", + "sample": { + "rate": 0 + }, + "sdkmode": 0, + "skipSqliteInitAndShutdown": null, + "stats": { + "interval": 5, + "split": false, + "tokenInt": "8130ef8ff472405d89d6f420038927ea-0c0d561e-cca5-4c81-90ed-0aa9ad786a03-7166", + "tokenProd": "4bb4d6f7cafc4e9292f972dca2dcde42-bd019ee8-e59c-4b0f-a02c-84e72157a3ef-7485" + }, + "tpm": { + "backoffConfig": "E,3000,300000,2,1", + "clockSkewEnabled": true, + "maxBlobSize": 2097152, + "maxRetryCount": 5 + }, + "traceLevelMask": 268435455, + "utc": { + "providerGroupId": "780dddc8-18a1-5781-895a-a690464fa89c" + } +} \ No newline at end of file From 4abaff917b30fb79c151c7e96b5806067d021759 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 8 Jan 2020 02:34:37 -0800 Subject: [PATCH 03/29] Clean-up the wrapper a little bit --- wrappers/netcore/Program.cs | 51 ++++++++++++++++--------------------- wrappers/netcore/run.sh | 3 ++- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index 4450893d8..385029e74 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -23,24 +23,23 @@ public enum EventCallType EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 } - // [StructLayout(LayoutKind.Sequential)] - [StructLayout(LayoutKind.Explicit, Size=32, CharSet=CharSet.Ansi)] + [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] public struct EventCallContext { - [FieldOffset(0)]public UInt32 call; - [FieldOffset(4)]public ulong handle; - [FieldOffset(12)]public IntPtr data; - [FieldOffset(16)]public UInt32 result; - [FieldOffset(20)]public UInt32 size; + [FieldOffset(0)] public UInt32 call; + [FieldOffset(4)] public ulong handle; + [FieldOffset(12)] public IntPtr data; + [FieldOffset(16)] public UInt32 result; + [FieldOffset(20)] public UInt32 size; } internal static class NativeMethods { - [DllImport("libmat", EntryPoint = "evt_api_call_default" /* , CallingConvention = CallingConvention.Cdecl */)] + // Conditional compilation: pass different library name depending on target OS? + const string SDK_LIBRARY_NAME = "libmat"; + + [DllImport(SDK_LIBRARY_NAME, EntryPoint = "evt_api_call_default")] public static extern UInt32 evt_api_call([In, Out] ref EventCallContext context); - // public static extern UInt32 evt_api_call(ref EventCallContext context); - // Alternatives: - // [MarshalAs(UnmanagedType.LPStruct)] } class Program @@ -59,20 +58,12 @@ static string ReadConfiguration(string filename) static ulong evt_open(string cfg) { - /* - byte[] data = Encoding.ASCII.GetBytes(cfg); - var nativeDataPtr = Marshal.AllocHGlobal(data.Length+1); - Marshal.Copy(data, 0, nativeDataPtr, data.Length); - Marshal.WriteByte(nativeDataPtr+data.Length, 0); - */ - var nativeDataPtr = Marshal.StringToHGlobalAnsi(cfg); EventCallContext context = new EventCallContext { call = (Byte)EventCallType.EVT_OP_OPEN, - data = nativeDataPtr + data = Marshal.StringToHGlobalAnsi(cfg) }; NativeMethods.evt_api_call(ref context); - // Marshal.Release(nativeDataPtr); return context.handle; } @@ -89,35 +80,37 @@ static ulong evt_close(ulong inHandle) static string evt_version() { byte[] data = Encoding.ASCII.GetBytes(SDK_VERSION); - var nativeDataPtr = Marshal.AllocHGlobal(data.Length+1); + var nativeDataPtr = Marshal.AllocHGlobal(data.Length + 1); Marshal.Copy(data, 0, nativeDataPtr, data.Length); - Marshal.WriteByte(nativeDataPtr+data.Length, 0); + Marshal.WriteByte(nativeDataPtr + data.Length, 0); EventCallContext context = new EventCallContext { call = (Byte)EventCallType.EVT_OP_VERSION, data = nativeDataPtr }; NativeMethods.evt_api_call(ref context); - return Marshal.PtrToStringAnsi(context.data); // x.y.z - // PtrToStringAnsi(context.data); + return Marshal.PtrToStringAnsi(context.data); } static void Main(string[] args) { - // Environment.SetEnvironmentVariable("DYLD_FALLBACK_LIBRARY_PATH", "/usr/local/lib"); - - Console.WriteLine("Reading configuration..."); + Console.WriteLine("Reading configuration..."); string cfg = ReadConfiguration("sdk-config.json"); - // Parse to verify it is valid and print it out + + // Parse to verify it is valid and print it out.. + // Parser should throw if config is invalid. JsonObject jsonDoc = (JsonObject)JsonObject.Parse(cfg); - Console.WriteLine("configuration:\n{0}", jsonDoc.ToString()); + Console.WriteLine("SDK configuration:\n{0}", jsonDoc.ToString()); + // Obtain SDK version from native library Console.WriteLine("SDK version: {0}", evt_version()); + // Initialize Console.WriteLine("evt_open..."); var handle = evt_open(cfg); Console.WriteLine("handle={0}", handle); + // FlushAndTeardown Console.WriteLine("evt_close..."); var result = evt_close(handle); Console.WriteLine("result={0}", result); diff --git a/wrappers/netcore/run.sh b/wrappers/netcore/run.sh index dd2764567..d975d50fc 100755 --- a/wrappers/netcore/run.sh +++ b/wrappers/netcore/run.sh @@ -5,7 +5,8 @@ #export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH #export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib:$DYLD_FALLBACK_LIBRARY_PATH -dotnet run -c Debug -v diag +#dotnet run -c Debug -v diag +dotnet run -c Debug From c73b4ef06d810218d7c2b30f59b28dd8627d413a Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sat, 18 Jan 2020 02:28:55 -0800 Subject: [PATCH 04/29] Add more APIs to netcore implementation --- lib/include/public/mat.h | 2 +- wrappers/netcore/EventNativeAPI.cs | 346 ++++++++++++++++++++++++++++ wrappers/netcore/EventSender.csproj | 1 + wrappers/netcore/Program.cs | 91 ++------ 4 files changed, 363 insertions(+), 77 deletions(-) create mode 100644 wrappers/netcore/EventNativeAPI.cs diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index 482568c23..3adb184e0 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -6,7 +6,7 @@ * For version handshake check there is no mandatory requirement to update the $PATCH level. * Ref. https://semver.org/ for Semantic Versioning documentation. */ -#define TELEMETRY_EVENTS_VERSION "3.1.0" +#define TELEMETRY_EVENTS_VERSION "3.3.0" #include "ctmacros.hpp" diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs new file mode 100644 index 000000000..44b6a7650 --- /dev/null +++ b/wrappers/netcore/EventNativeAPI.cs @@ -0,0 +1,346 @@ +#pragma warning disable IDE1006 // ignore naming rule violations: we preserve original C API naming for clarity here +#pragma warning disable IDE0044 // ignore readonly suggestion for field passed over P/Invoke + +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.IO; +using System.Json; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Collections; + +namespace Microsoft +{ + namespace Telemetry + { + namespace Core + { + public class Constants + { + public const string LIBRARY_NAME_POSIX = "libmat"; + public const string LIBRARY_NAME_WIN32 = "ClientTelemetry.dll"; + public const string VERSION = "3.3.0-netcore"; + } + + public enum EventCallType + { + EVT_OP_LOAD = 0x00000001, + EVT_OP_UNLOAD = 0x00000002, + EVT_OP_OPEN = 0x00000003, + EVT_OP_CLOSE = 0x00000004, + EVT_OP_CONFIG = 0x00000005, + EVT_OP_LOG = 0x00000006, + EVT_OP_PAUSE = 0x00000007, + EVT_OP_RESUME = 0x00000008, + EVT_OP_UPLOAD = 0x00000009, + EVT_OP_FLUSH = 0x0000000A, + EVT_OP_VERSION = 0x0000000B, + EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, + EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 + } + + public enum EventPropertyType + { + /* Basic types */ + TYPE_STRING = 0, + TYPE_INT64 = 1, + TYPE_DOUBLE = 2, + TYPE_TIME = 3, + TYPE_BOOLEAN = 4, + TYPE_GUID = 5, + /* Arrays of basic types */ + TYPE_STRING_ARRAY = 6, + TYPE_INT64_ARRAY = 7, + TYPE_DOUBLE_ARRAY = 8, + TYPE_TIME_ARRAY = 9, + TYPE_BOOL_ARRAY = 10, + TYPE_GUID_ARRAY = 11, + /* NULL-type */ + TYPE_NULL = 12 + } + + public struct PiiValue + { + public string value; + public UInt32 piKind; + } + + public class EventProperties : Dictionary + { + public EventProperties() + { + } + }; + + [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] + public unsafe struct EventGUIDType + { + /** + * + * Specifies the first eight hexadecimal digits of the GUID. + * + */ + [FieldOffset(0)] UInt32 Data1; + + /* + * Specifies the first group of four hexadecimal digits. + * + */ + [FieldOffset(4)] UInt16 Data2; + + /** + * + * Specifies the second group of four hexadecimal digits. + * + */ + [FieldOffset(6)] UInt16 Data3; + + /** + * An array of eight bytes. + * The first two bytes contain the third group of four hexadecimal digits. + * The remaining six bytes contain the final 12 hexadecimal digits. + * + */ + [FieldOffset(8)] + fixed byte Data4[8]; + } + + [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] + public struct EventContextType + { + [FieldOffset(0)] public UInt32 call; + [FieldOffset(4)] public ulong handle; + [FieldOffset(12)] public IntPtr data; + [FieldOffset(16)] public UInt32 result; + [FieldOffset(20)] public UInt32 size; + } + + public enum EventOpenParamType + { + OPEN_PARAM_TYPE_HTTP_HANDLER_SEND = 0, + OPEN_PARAM_TYPE_HTTP_HANDLER_CANCEL = 1, + OPEN_PARAM_TYPE_TASK_DISPATCHER_QUEUE = 2, + OPEN_PARAM_TYPE_TASK_DISPATCHER_CANCEL = 3, + OPEN_PARAM_TYPE_TASK_DISPATCHER_JOIN = 4 + } + + [StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] + public struct EventOpenParam + { + [FieldOffset(0)] public UInt32 type; + [FieldOffset(4)] public IntPtr data; + }; + + /** + * + * Wraps logger configuration string and all input parameters to 'evt_open_with_params' + * + */ + // TODO: this structure size depends on architecture - 32-bit or 64-bit.. + // Since all Mac OS X and Linux are mostly 64-bit by now, as well as + // most Windows - we should assume that the struct layout is optimized + // for 64-bit. From a practical standpoint - somebody building .NET Core + // app would likely consider running it on a platform that is modern + // enough. One way to solve this issue for 32-bit machines is to add a + // custom SDK build flag that enforces certain struct layout. i.e. + // positioning the two pointers below as 64-bit integers instead of 32-bit. + [StructLayout(LayoutKind.Explicit, Size = 20, CharSet = CharSet.Ansi)] + public struct EventOpenWithParamsDataType + { + [FieldOffset(0)] public IntPtr config; + [FieldOffset(8)] public IntPtr parameters; /* pointer to array of EventOpenParam */ + [FieldOffset(8)] public UInt32 paramsCount; + } + + [StructLayout(LayoutKind.Explicit, Size = 8, CharSet = CharSet.Ansi)] + public struct EventPropertyValue + { + /* Basic types */ + [FieldOffset(0)] UInt64 as_uint64; + [FieldOffset(0)] IntPtr as_string; + [FieldOffset(0)] Int64 as_int64; + [FieldOffset(0)] double as_double; + [FieldOffset(0)] bool as_bool; + [FieldOffset(0)] IntPtr as_guid; + [FieldOffset(0)] UInt64 as_time; +#if FALSE + /* We don't support passing arrays yet. Code below needs to be ported from C++ to C# */ + /* Array types are nullptr-terminated array of pointers */ + char** as_arr_string; + int64_t** as_arr_int64; + bool** as_arr_bool; + double** as_arr_double; + evt_guid_t** as_arr_guid; + uint64_t** as_arr_time; +#endif + }; + + [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] + public struct EventProperty + { + [FieldOffset(0)] IntPtr name; + [FieldOffset(4)] EventPropertyType type; + [FieldOffset(8)] EventPropertyValue value; + [FieldOffset(12)] UInt32 piiKind; + } + + /** + * + * Identifies HTTP request method type + * + */ + public enum HttpRequestType + { + HTTP_REQUEST_TYPE_GET = 0, + HTTP_REQUEST_TYPE_POST = 1, + } + + public static class EventNativeAPI + { + // Conditional compilation: pass different library name depending on target OS + + [DllImport(Constants.LIBRARY_NAME_POSIX, EntryPoint = "evt_api_call_default")] + internal static extern UInt32 evt_api_call([In, Out] ref EventContextType context); + + /** + * + * Create or open existing SDK instance. + * + * SDK configuration. + * SDK instance handle. + */ + public static ulong evt_open(string cfg) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_OPEN, + data = Marshal.StringToHGlobalAnsi(cfg) + }; + evt_api_call(ref context); + return context.handle; + } + + /** + * + * Destroy or close SDK instance by handle + * + * SDK instance handle. + * Status code. + */ + public static ulong evt_close(ulong inHandle) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_CLOSE, + handle = inHandle + }; + return evt_api_call(ref context); + } + + public static ulong evt_log(ulong inHandle, ref EventProperties properties) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_LOG, + handle = inHandle + }; + return evt_api_call(ref context); + } + + /** + * + * Pauses transmission. In that mode events stay in ram or saved to disk, not sent. + * + * SDK handle. + * Status code. + */ + public static ulong evt_pause(ulong inHandle) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_PAUSE, + handle = inHandle + }; + return evt_api_call(ref context); + } + + /** + * + * Resumes transmission. Pending telemetry events should be attempted to be sent. + * + * SDK handle. + * Status code. + */ + public static ulong evt_resume(ulong inHandle) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_RESUME, + handle = inHandle + }; + return evt_api_call(ref context); + } + + /** + * Provide a hint to telemetry system to attempt force-upload of events + * without waiting for the next batch timer interval. This API does not + * guarantee the upload. + * + * SDK handle. + * Status code. + */ + public static ulong evt_upload(ulong inHandle) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_RESUME, + handle = inHandle + }; + return evt_api_call(ref context); + } + + /** + * Save pending telemetry events to offline storage on disk. + * + * SDK handle. + * Status code. + */ + public static ulong evt_flush(ulong inHandle) + { + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_FLUSH, + handle = inHandle + }; + return evt_api_call(ref context); + } + + /** + * Pass down SDK header version to SDK library. Needed for late binding version checking. + * This method provides means of a handshake between library header and a library impl. + * It is up to app dev to verify the value returned, making a decision whether some SDK + * features are implemented/supported by particular SDK version or not. + * + * SDK header semver. + * SDK library semver + */ + public static string evt_version() + { + byte[] data = Encoding.ASCII.GetBytes(Constants.VERSION); + var nativeDataPtr = Marshal.AllocHGlobal(data.Length + 1); + Marshal.Copy(data, 0, nativeDataPtr, data.Length); + Marshal.WriteByte(nativeDataPtr + data.Length, 0); + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_VERSION, + data = nativeDataPtr + }; + evt_api_call(ref context); + return Marshal.PtrToStringAnsi(context.data); + } + } + + } + } +} \ No newline at end of file diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj index 059cc350c..3a42309a4 100644 --- a/wrappers/netcore/EventSender.csproj +++ b/wrappers/netcore/EventSender.csproj @@ -2,6 +2,7 @@ Exe netcoreapp3.1 + true diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index 385029e74..bea811e4e 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -4,48 +4,13 @@ using System.IO; using System.Json; +using Microsoft.Telemetry.Core; + namespace EventSender { - public enum EventCallType - { - EVT_OP_LOAD = 0x00000001, - EVT_OP_UNLOAD = 0x00000002, - EVT_OP_OPEN = 0x00000003, - EVT_OP_CLOSE = 0x00000004, - EVT_OP_CONFIG = 0x00000005, - EVT_OP_LOG = 0x00000006, - EVT_OP_PAUSE = 0x00000007, - EVT_OP_RESUME = 0x00000008, - EVT_OP_UPLOAD = 0x00000009, - EVT_OP_FLUSH = 0x0000000A, - EVT_OP_VERSION = 0x0000000B, - EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, - EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 - } - - [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] - public struct EventCallContext - { - [FieldOffset(0)] public UInt32 call; - [FieldOffset(4)] public ulong handle; - [FieldOffset(12)] public IntPtr data; - [FieldOffset(16)] public UInt32 result; - [FieldOffset(20)] public UInt32 size; - } - - internal static class NativeMethods - { - // Conditional compilation: pass different library name depending on target OS? - const string SDK_LIBRARY_NAME = "libmat"; - - [DllImport(SDK_LIBRARY_NAME, EntryPoint = "evt_api_call_default")] - public static extern UInt32 evt_api_call([In, Out] ref EventCallContext context); - } class Program { - public const string SDK_VERSION = "3.3.0-netcore"; - static string ReadConfiguration(string filename) { string result = ""; @@ -56,42 +21,6 @@ static string ReadConfiguration(string filename) return result; } - static ulong evt_open(string cfg) - { - EventCallContext context = new EventCallContext - { - call = (Byte)EventCallType.EVT_OP_OPEN, - data = Marshal.StringToHGlobalAnsi(cfg) - }; - NativeMethods.evt_api_call(ref context); - return context.handle; - } - - static ulong evt_close(ulong inHandle) - { - EventCallContext context = new EventCallContext - { - call = (Byte)EventCallType.EVT_OP_CLOSE, - handle = inHandle - }; - return NativeMethods.evt_api_call(ref context); - } - - static string evt_version() - { - byte[] data = Encoding.ASCII.GetBytes(SDK_VERSION); - var nativeDataPtr = Marshal.AllocHGlobal(data.Length + 1); - Marshal.Copy(data, 0, nativeDataPtr, data.Length); - Marshal.WriteByte(nativeDataPtr + data.Length, 0); - EventCallContext context = new EventCallContext - { - call = (Byte)EventCallType.EVT_OP_VERSION, - data = nativeDataPtr - }; - NativeMethods.evt_api_call(ref context); - return Marshal.PtrToStringAnsi(context.data); - } - static void Main(string[] args) { Console.WriteLine("Reading configuration..."); @@ -103,16 +32,26 @@ static void Main(string[] args) Console.WriteLine("SDK configuration:\n{0}", jsonDoc.ToString()); // Obtain SDK version from native library - Console.WriteLine("SDK version: {0}", evt_version()); + Console.WriteLine("SDK version: {0}", EventNativeAPI.evt_version()); // Initialize Console.WriteLine("evt_open..."); - var handle = evt_open(cfg); + var handle = EventNativeAPI.evt_open(cfg); Console.WriteLine("handle={0}", handle); +#if FALSE + var props = new EventProperties() { + { "strKey", "value1" }, + { "intKey", 12345 }, + { "dblKey", 0.12345 }, + { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } + }; + EventNativeAPI.evt_log(handle, ref props); +#endif + // FlushAndTeardown Console.WriteLine("evt_close..."); - var result = evt_close(handle); + var result = EventNativeAPI.evt_close(handle); Console.WriteLine("result={0}", result); } } From 30b7fe0d5cceaf68921f8fd0a4f6df5fe7344b46 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sat, 18 Jan 2020 18:32:07 -0800 Subject: [PATCH 05/29] Working implementation of C# .NET Core 3.1 wrapper on top of C API (tested on Mac) --- lib/include/public/mat.h | 363 ++++++++++++++++++----------- wrappers/netcore/EventNativeAPI.cs | 305 +++++++++++++++++++----- wrappers/netcore/Program.cs | 46 +++- wrappers/netcore/sdk-config.json | 8 +- 4 files changed, 524 insertions(+), 198 deletions(-) diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index 3adb184e0..7e284f49c 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -6,7 +6,7 @@ * For version handshake check there is no mandatory requirement to update the $PATCH level. * Ref. https://semver.org/ for Semantic Versioning documentation. */ -#define TELEMETRY_EVENTS_VERSION "3.3.0" +#define TELEMETRY_EVENTS_VERSION "3.3.0" #include "ctmacros.hpp" @@ -22,15 +22,15 @@ #if (_MSC_VER == 1500) || (_MSC_VER == 1600) /* Visual Studio 2010 */ -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef int bool; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef int bool; #define inline #else /* Other compilers with C11 support */ @@ -39,16 +39,17 @@ typedef int bool; #endif #ifndef EVT_ARRAY_SIZE -#define EVT_ARRAY_SIZE(a) \ - ((sizeof(a) / sizeof(*(a))) / \ - (unsigned)(!(sizeof(a) % sizeof(*(a))))) +#define EVT_ARRAY_SIZE(a) \ + ((sizeof(a) / sizeof(*(a))) / \ + (unsigned)(!(sizeof(a) % sizeof(*(a))))) #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - typedef enum + typedef enum /* 32-bit */ { EVT_OP_LOAD = 0x00000001, EVT_OP_UNLOAD = 0x00000002, @@ -62,10 +63,11 @@ extern "C" { EVT_OP_FLUSH = 0x0000000A, EVT_OP_VERSION = 0x0000000B, EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, - EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 + EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1, + EVT_OP_MAXINT = 0xFFFFFFFF } evt_call_t; - typedef enum + typedef enum /* 32-bit */ { /* Basic types */ TYPE_STRING, @@ -82,7 +84,8 @@ extern "C" { TYPE_BOOL_ARRAY, TYPE_GUID_ARRAY, /* NULL-type */ - TYPE_NULL + TYPE_NULL, + TYPE_MAXINT = 0xFFFFFFFF } evt_prop_t; typedef struct @@ -113,20 +116,20 @@ extern "C" { * The remaining six bytes contain the final 12 hexadecimal digits. * */ - uint8_t Data4[8]; + uint8_t Data4[8]; } evt_guid_t; - typedef int64_t evt_handle_t; - typedef int32_t evt_status_t; - typedef struct evt_event evt_event; + typedef int64_t evt_handle_t; + typedef int32_t evt_status_t; + typedef struct evt_event evt_event; typedef struct PACKED_STRUCT { - evt_call_t call; /* In */ - evt_handle_t handle; /* In / Out */ - void* data; /* In / Out */ - evt_status_t result; /* Out */ - uint32_t size; /* In / Out */ + evt_call_t call; /* In */ + evt_handle_t handle; /* In / Out */ + void* data; /* In / Out */ + evt_status_t result; /* Out */ + uint32_t size; /* In / Out */ } evt_context_t; /** @@ -151,8 +154,8 @@ extern "C" { */ typedef struct { - evt_open_param_type_t type; - void* data; + evt_open_param_type_t type; + void* data; } evt_open_param_t; /** @@ -162,38 +165,37 @@ extern "C" { */ typedef struct { - const char* config; + const char* config; const evt_open_param_t* params; - int32_t paramsCount; + int32_t paramsCount; } evt_open_with_params_data_t; - typedef union - { + typedef union { /* Basic types */ - uint64_t as_uint64; - const char* as_string; - int64_t as_int64; - double as_double; - bool as_bool; - evt_guid_t* as_guid; - uint64_t as_time; + uint64_t as_uint64; + const char* as_string; + int64_t as_int64; + double as_double; + bool as_bool; + evt_guid_t* as_guid; + uint64_t as_time; /* Array types are nullptr-terminated array of pointers */ - char** as_arr_string; - int64_t** as_arr_int64; - bool** as_arr_bool; - double** as_arr_double; - evt_guid_t** as_arr_guid; - uint64_t** as_arr_time; + char** as_arr_string; + int64_t** as_arr_int64; + bool** as_arr_bool; + double** as_arr_double; + evt_guid_t** as_arr_guid; + uint64_t** as_arr_time; } evt_prop_v; - typedef struct + typedef struct PACKED_STRUCT { - const char* name; - evt_prop_t type; - evt_prop_v value; - uint32_t piiKind; + const char* name; + evt_prop_t type; + evt_prop_v value; + uint32_t piiKind; } evt_prop; - + /** * * Identifies HTTP request method type @@ -225,8 +227,8 @@ extern "C" { */ typedef struct { - const char* name; - const char* value; + const char* name; + const char* value; } http_header_t; /** @@ -236,13 +238,13 @@ extern "C" { */ typedef struct { - const char* id; - http_request_type_t type; - const char* url; - const uint8_t* body; - int32_t bodySize; - const http_header_t* headers; - int32_t headersCount; + const char* id; + http_request_type_t type; + const char* url; + const uint8_t* body; + int32_t bodySize; + const http_header_t* headers; + int32_t headersCount; } http_request_t; /** @@ -252,17 +254,17 @@ extern "C" { */ typedef struct { - int32_t statusCode; - const uint8_t* body; - int32_t bodySize; - const http_header_t* headers; - int32_t headersCount; + int32_t statusCode; + const uint8_t* body; + int32_t bodySize; + const http_header_t* headers; + int32_t headersCount; } http_response_t; /* HTTP callback function signatures */ - typedef void (EVTSDK_LIBABI_CDECL *http_complete_fn_t)(const char* /*requestId*/, http_result_t, http_response_t*); - typedef void (EVTSDK_LIBABI_CDECL *http_send_fn_t)(http_request_t*, http_complete_fn_t); - typedef void (EVTSDK_LIBABI_CDECL *http_cancel_fn_t)(const char* /*requestId*/); + typedef void(EVTSDK_LIBABI_CDECL* http_complete_fn_t)(const char* /*requestId*/, http_result_t, http_response_t*); + typedef void(EVTSDK_LIBABI_CDECL* http_send_fn_t)(http_request_t*, http_complete_fn_t); + typedef void(EVTSDK_LIBABI_CDECL* http_cancel_fn_t)(const char* /*requestId*/); /** * @@ -271,21 +273,27 @@ extern "C" { */ typedef struct { - const char* id; - int64_t delayMs; - const char* typeName; + const char* id; + int64_t delayMs; + const char* typeName; } evt_task_t; /* Async worker thread callback function signatures */ - typedef void (EVTSDK_LIBABI_CDECL *task_callback_fn_t)(const char* /*taskId*/); + typedef void(EVTSDK_LIBABI_CDECL* task_callback_fn_t)(const char* /*taskId*/); typedef void(EVTSDK_LIBABI_CDECL* task_dispatcher_queue_fn_t)(evt_task_t*, task_callback_fn_t); - typedef bool (EVTSDK_LIBABI_CDECL *task_dispatcher_cancel_fn_t)(const char* /*taskId*/); - typedef void (EVTSDK_LIBABI_CDECL *task_dispatcher_join_fn_t)(); + typedef bool(EVTSDK_LIBABI_CDECL* task_dispatcher_cancel_fn_t)(const char* /*taskId*/); + typedef void(EVTSDK_LIBABI_CDECL* task_dispatcher_join_fn_t)(); #if (_MSC_VER == 1500) || (_MSC_VER == 1600) || (defined(__cplusplus) && !defined(__GNUG__)) /* Code to support C89 compiler, including VS2010 */ -#define TELEMETRY_EVENT(...) { __VA_ARGS__ , { NULL, TYPE_NULL } } -/* With C89-style initializers, structure members must be initialized in the order declared. +#define TELEMETRY_EVENT(...) \ + { \ + __VA_ARGS__, \ + { \ + NULL, TYPE_NULL \ + } \ + } + /* With C89-style initializers, structure members must be initialized in the order declared. ...and (!) - only the first member of a union can be initialized. Which means that we have to do the hack of C-style casting from value to char* ... */ @@ -297,8 +305,14 @@ extern "C" { pv.as_double = val; return pv; }; -#define _DBL(key, val) { key, TYPE_DOUBLE, _DBL2({ NULL }, val) } -#define PII_DBL(key, val, kind) { key, TYPE_DOUBLE, _DBL2({ NULL }, val), kind } +#define _DBL(key, val) \ + { \ + key, TYPE_DOUBLE, _DBL2({NULL}, val) \ + } +#define PII_DBL(key, val, kind) \ + { \ + key, TYPE_DOUBLE, _DBL2({NULL}, val), kind \ + } /* static inline evt_prop_v _TIME2(evt_prop_v pv, uint64_t val) @@ -313,48 +327,135 @@ extern "C" { #pragma message "C89 compiler does not support passing DOUBLE and TIME values via C API" #endif -#define _STR(key, val) { key, TYPE_STRING, { (uint64_t)((char *)val) } } -#define _INT(key, val) { key, TYPE_INT64, { (uint64_t)val } } -#define _BOOL(key, val) { key, TYPE_BOOLEAN, { (uint64_t)val } } -#define _GUID(key, val) { key, TYPE_GUID, { (uint64_t)((char *)val) } } -#define _TIME(key, val) { key, TYPE_TIME, { (uint64_t)val } } +#define _STR(key, val) \ + { \ + key, TYPE_STRING, \ + { \ + (uint64_t)((char*)val) \ + } \ + } +#define _INT(key, val) \ + { \ + key, TYPE_INT64, \ + { \ + (uint64_t) val \ + } \ + } +#define _BOOL(key, val) \ + { \ + key, TYPE_BOOLEAN, \ + { \ + (uint64_t) val \ + } \ + } +#define _GUID(key, val) \ + { \ + key, TYPE_GUID, \ + { \ + (uint64_t)((char*)val) \ + } \ + } +#define _TIME(key, val) \ + { \ + key, TYPE_TIME, \ + { \ + (uint64_t) val \ + } \ + } -#define PII_STR(key, val, kind) { key, TYPE_STRING, { (uint64_t)((char *)val) }, kind } -#define PII_INT(key, val, kind) { key, TYPE_INT64, { (uint64_t)val }, kind } -#define PII_BOOL(key, val, kind) { key, TYPE_BOOLEAN, { (uint64_t)val }, kind } -#define PII_GUID(key, val, kind) { key, TYPE_GUID, { (uint64_t)((char *)val) }, kind } -#define PII_TIME(key, val, kind) { key, TYPE_TIME, { (uint64_t)val }, kind } +#define PII_STR(key, val, kind) \ + { \ + key, TYPE_STRING, {(uint64_t)((char*)val)}, kind \ + } +#define PII_INT(key, val, kind) \ + { \ + key, TYPE_INT64, {(uint64_t)val}, kind \ + } +#define PII_BOOL(key, val, kind) \ + { \ + key, TYPE_BOOLEAN, {(uint64_t)val}, kind \ + } +#define PII_GUID(key, val, kind) \ + { \ + key, TYPE_GUID, {(uint64_t)((char*)val)}, kind \ + } +#define PII_TIME(key, val, kind) \ + { \ + key, TYPE_TIME, {(uint64_t)val}, kind \ + } #else - /* Code to support any modern C99 compiler */ -#define TELEMETRY_EVENT(...) { __VA_ARGS__ , { .name = NULL, .type = TYPE_NULL, .value = { .as_int64 = 0 }, .piiKind = 0 } } - -#define _STR(key, val) { .name = key, .type = TYPE_STRING, .value = { .as_string = val }, .piiKind = 0 } -#define _INT(key, val) { .name = key, .type = TYPE_INT64, .value = { .as_int64 = val }, .piiKind = 0 } -#define _DBL(key, val) { .name = key, .type = TYPE_DOUBLE, .value = { .as_double = val }, .piiKind = 0 } -#define _BOOL(key, val) { .name = key, .type = TYPE_BOOLEAN, .value = { .as_bool = val }, .piiKind = 0 } -#define _GUID(key, val) { .name = key, .type = TYPE_GUID, .value = { .as_string = val }, .piiKind = 0 } -#define _TIME(key, val) { .name = key, .type = TYPE_TIME, .value = { .as_time = val }, .piiKind = 0 } - -#define PII_STR(key, val, kind) { .name = key, .type = TYPE_STRING, .value = { .as_string = val }, .piiKind = kind } -#define PII_INT(key, val, kind) { .name = key, .type = TYPE_INT64, .value = { .as_int64 = val }, .piiKind = kind } -#define PII_DBL(key, val, kind) { .name = key, .type = TYPE_DOUBLE, .value = { .as_double = val }, .piiKind = kind } -#define PII_BOOL(key, val, kind) { .name = key, .type = TYPE_BOOLEAN, .value = { .as_bool = val }, .piiKind = kind } -#define PII_GUID(key, val, kind) { .name = key, .type = TYPE_GUID, .value = { .as_string = val }, .piiKind = kind } -#define PII_TIME(key, val, kind) { .name = key, .type = TYPE_TIME, .value = { .as_time = val }, .piiKind = kind } +/* Code to support any modern C99 compiler */ +#define TELEMETRY_EVENT(...) \ + { \ + __VA_ARGS__, \ + { \ + .name = NULL, .type = TYPE_NULL, .value = {.as_int64 = 0}, .piiKind = 0 \ + } \ + } + +#define _STR(key, val) \ + { \ + .name = key, .type = TYPE_STRING, .value = {.as_string = val}, .piiKind = 0 \ + } +#define _INT(key, val) \ + { \ + .name = key, .type = TYPE_INT64, .value = {.as_int64 = val}, .piiKind = 0 \ + } +#define _DBL(key, val) \ + { \ + .name = key, .type = TYPE_DOUBLE, .value = {.as_double = val}, .piiKind = 0 \ + } +#define _BOOL(key, val) \ + { \ + .name = key, .type = TYPE_BOOLEAN, .value = {.as_bool = val}, .piiKind = 0 \ + } +#define _GUID(key, val) \ + { \ + .name = key, .type = TYPE_GUID, .value = {.as_string = val}, .piiKind = 0 \ + } +#define _TIME(key, val) \ + { \ + .name = key, .type = TYPE_TIME, .value = {.as_time = val}, .piiKind = 0 \ + } + +#define PII_STR(key, val, kind) \ + { \ + .name = key, .type = TYPE_STRING, .value = {.as_string = val}, .piiKind = kind \ + } +#define PII_INT(key, val, kind) \ + { \ + .name = key, .type = TYPE_INT64, .value = {.as_int64 = val}, .piiKind = kind \ + } +#define PII_DBL(key, val, kind) \ + { \ + .name = key, .type = TYPE_DOUBLE, .value = {.as_double = val}, .piiKind = kind \ + } +#define PII_BOOL(key, val, kind) \ + { \ + .name = key, .type = TYPE_BOOLEAN, .value = {.as_bool = val}, .piiKind = kind \ + } +#define PII_GUID(key, val, kind) \ + { \ + .name = key, .type = TYPE_GUID, .value = {.as_string = val}, .piiKind = kind \ + } +#define PII_TIME(key, val, kind) \ + { \ + .name = key, .type = TYPE_TIME, .value = {.as_time = val}, .piiKind = kind \ + } #endif - typedef evt_status_t(EVTSDK_LIBABI_CDECL *evt_app_call_t)(evt_context_t *); + typedef evt_status_t(EVTSDK_LIBABI_CDECL* evt_app_call_t)(evt_context_t*); - EVTSDK_LIBABI evt_status_t EVTSDK_LIBABI_CDECL evt_api_call_default(evt_context_t *ctx); + EVTSDK_LIBABI evt_status_t EVTSDK_LIBABI_CDECL evt_api_call_default(evt_context_t* ctx); #ifdef _MSC_VER /* User of the library may delay-load the invocation of __impl_evt_api_call to assign their own implementation */ __declspec(selectany) evt_app_call_t evt_api_call = evt_api_call_default; #else - /* Implementation of evt_api_call can be provided by the executable module that includes this header */ - __attribute__((weak)) evt_app_call_t evt_api_call = evt_api_call_default; +/* Implementation of evt_api_call can be provided by the executable module that includes this header */ +__attribute__((weak)) evt_app_call_t evt_api_call = evt_api_call_default; #endif /** @@ -377,17 +478,17 @@ extern "C" { // Unable to load alternate implementation return -1; #else - /* TODO: + /* TODO: * - provide implementation for Linux and Mac * - consider accepting a library path rather than a library handle for dlopen */ - evt_context_t ctx; - ctx.call = EVT_OP_LOAD; - ctx.handle = handle; - return evt_api_call(&ctx); + evt_context_t ctx; + ctx.call = EVT_OP_LOAD; + ctx.handle = handle; + return evt_api_call(&ctx); #endif } - + /** * * Unloads SDK instance loaded with evt_load @@ -404,7 +505,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * * Create or open existing SDK instance. @@ -416,7 +517,7 @@ extern "C" { { evt_context_t ctx; ctx.call = EVT_OP_OPEN; - ctx.data = (void *)config; + ctx.data = (void*)config; evt_api_call(&ctx); return ctx.handle; } @@ -442,7 +543,7 @@ extern "C" { evt_context_t ctx; ctx.call = EVT_OP_OPEN_WITH_PARAMS; - ctx.data = (void *)(&data); + ctx.data = (void*)(&data); evt_api_call(&ctx); return ctx.handle; } @@ -461,7 +562,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * * Configure SDK instance using configuration provided. @@ -475,10 +576,10 @@ extern "C" { evt_context_t ctx; ctx.call = EVT_OP_CONFIG; ctx.handle = handle; - ctx.data = (void *)config; + ctx.data = (void*)config; return evt_api_call(&ctx); } - + /** * * Logs a telemetry event (security-enhanced _s function) @@ -493,7 +594,7 @@ extern "C" { evt_context_t ctx; ctx.call = EVT_OP_LOG; ctx.handle = handle; - ctx.data = (void *)evt; + ctx.data = (void*)evt; ctx.size = size; return evt_api_call(&ctx); } @@ -513,7 +614,7 @@ extern "C" { evt_context_t ctx; ctx.call = EVT_OP_LOG; ctx.handle = handle; - ctx.data = (void *)evt; + ctx.data = (void*)evt; ctx.size = 0; return evt_api_call(&ctx); } @@ -528,7 +629,7 @@ extern "C" { #define evt_log(handle, evt) evt_log_s(handle, EVT_ARRAY_SIZE(evt), evt) #endif #endif - + /** * * Pauses transmission. In that mode events stay in ram or saved to disk, not sent. @@ -543,7 +644,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * * Resumes transmission. Pending telemetry events should be attempted to be sent. @@ -558,7 +659,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * Provide a hint to telemetry system to attempt force-upload of events * without waiting for the next batch timer interval. This API does not @@ -574,7 +675,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * Save pending telemetry events to offline storage on disk. * @@ -588,7 +689,7 @@ extern "C" { ctx.handle = handle; return evt_api_call(&ctx); } - + /** * Pass down SDK header version to SDK library. Needed for late binding version checking. * This method provides means of a handshake between library header and a library impl. @@ -598,14 +699,14 @@ extern "C" { * SDK header semver. * SDK library semver */ - static inline const char * evt_version() + static inline const char* evt_version() { - static const char * libSemver = TELEMETRY_EVENTS_VERSION; + static const char* libSemver = TELEMETRY_EVENTS_VERSION; evt_context_t ctx; ctx.call = EVT_OP_VERSION; ctx.data = (void*)libSemver; evt_api_call(&ctx); - return (const char *)(ctx.data); + return (const char*)(ctx.data); } /* New API calls to be added using evt_api_call(&ctx) for backwards-forward / ABI compat */ diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index 44b6a7650..c18a594c8 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -1,5 +1,6 @@ #pragma warning disable IDE1006 // ignore naming rule violations: we preserve original C API naming for clarity here #pragma warning disable IDE0044 // ignore readonly suggestion for field passed over P/Invoke +#undef TRACE using System; using System.Runtime.InteropServices; @@ -23,7 +24,7 @@ public class Constants public const string VERSION = "3.3.0-netcore"; } - public enum EventCallType + public enum EventCallType : UInt32 { EVT_OP_LOAD = 0x00000001, EVT_OP_UNLOAD = 0x00000002, @@ -40,7 +41,7 @@ public enum EventCallType EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 } - public enum EventPropertyType + public enum EventPropertyType : UInt32 { /* Basic types */ TYPE_STRING = 0, @@ -60,19 +61,39 @@ public enum EventPropertyType TYPE_NULL = 12 } - public struct PiiValue + public struct PiiKind { - public string value; - public UInt32 piKind; + /// No PII kind. + public const int None = 0; + /// An LDAP distinguished name. + public const int DistinguishedName = 1; + /// Generic data. + public const int GenericData = 2; + /// An IPV4 Internet address. + public const int IPv4Address = 3; + /// An IPV6 Internet address. + public const int IPv6Address = 4; + /// An e-mail subject. + public const int MailSubject = 5; + /// A telephone number. + public const int PhoneNumber = 6; + /// A query string. + public const int QueryString = 7; + /// A SIP address + public const int SipAddress = 8; + /// An e-mail address. + public const int SmtpAddress = 9; + /// An identity. + public const int Identity = 10; + /// A uniform resource indicator. + public const int Uri = 11; + /// A fully-qualified domain name. + public const int Fqdn = 12; + /// A legacy IPV4 Internet address. + public const int IPv4AddressLegacy = 13; + public const int CustomerData = 32; } - public class EventProperties : Dictionary - { - public EventProperties() - { - } - }; - [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] public unsafe struct EventGUIDType { @@ -106,14 +127,14 @@ public unsafe struct EventGUIDType fixed byte Data4[8]; } - [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] - public struct EventContextType + [StructLayout(LayoutKind.Explicit, Size = 28, CharSet = CharSet.Ansi)] + public unsafe struct EventContextType { [FieldOffset(0)] public UInt32 call; [FieldOffset(4)] public ulong handle; [FieldOffset(12)] public IntPtr data; - [FieldOffset(16)] public UInt32 result; - [FieldOffset(20)] public UInt32 size; + [FieldOffset(20)] public UInt32 result; + [FieldOffset(24)] public UInt32 size; } public enum EventOpenParamType @@ -126,12 +147,35 @@ public enum EventOpenParamType } [StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] - public struct EventOpenParam + public unsafe struct EventOpenParam { [FieldOffset(0)] public UInt32 type; [FieldOffset(4)] public IntPtr data; }; + [StructLayout(LayoutKind.Explicit, Size = 8, CharSet = CharSet.Ansi)] + public unsafe struct EventPropertyValue + { + /* Basic types */ + [FieldOffset(0)] public UInt64 as_uint64; + [FieldOffset(0)] public IntPtr as_string; + [FieldOffset(0)] public Int64 as_int64; + [FieldOffset(0)] public double as_double; + [FieldOffset(0)] public bool as_bool; + [FieldOffset(0)] public IntPtr as_guid; + [FieldOffset(0)] public UInt64 as_time; +#if FALSE + /* We don't support passing arrays yet. Code below needs to be ported from C++ to C# */ + /* Array types are nullptr-terminated array of pointers */ + char** as_arr_string; + int64_t** as_arr_int64; + bool** as_arr_bool; + double** as_arr_double; + evt_guid_t** as_arr_guid; + uint64_t** as_arr_time; +#endif + }; + /** * * Wraps logger configuration string and all input parameters to 'evt_open_with_params' @@ -146,43 +190,20 @@ public struct EventOpenParam // custom SDK build flag that enforces certain struct layout. i.e. // positioning the two pointers below as 64-bit integers instead of 32-bit. [StructLayout(LayoutKind.Explicit, Size = 20, CharSet = CharSet.Ansi)] - public struct EventOpenWithParamsDataType + public unsafe struct EventOpenWithParamsDataType { [FieldOffset(0)] public IntPtr config; [FieldOffset(8)] public IntPtr parameters; /* pointer to array of EventOpenParam */ [FieldOffset(8)] public UInt32 paramsCount; } - [StructLayout(LayoutKind.Explicit, Size = 8, CharSet = CharSet.Ansi)] - public struct EventPropertyValue - { - /* Basic types */ - [FieldOffset(0)] UInt64 as_uint64; - [FieldOffset(0)] IntPtr as_string; - [FieldOffset(0)] Int64 as_int64; - [FieldOffset(0)] double as_double; - [FieldOffset(0)] bool as_bool; - [FieldOffset(0)] IntPtr as_guid; - [FieldOffset(0)] UInt64 as_time; -#if FALSE - /* We don't support passing arrays yet. Code below needs to be ported from C++ to C# */ - /* Array types are nullptr-terminated array of pointers */ - char** as_arr_string; - int64_t** as_arr_int64; - bool** as_arr_bool; - double** as_arr_double; - evt_guid_t** as_arr_guid; - uint64_t** as_arr_time; -#endif - }; - - [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] - public struct EventProperty + [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] + public unsafe struct EventPropertyKeyValue { - [FieldOffset(0)] IntPtr name; - [FieldOffset(4)] EventPropertyType type; - [FieldOffset(8)] EventPropertyValue value; - [FieldOffset(12)] UInt32 piiKind; + [FieldOffset(0)] public IntPtr name; + [FieldOffset(8)] public EventPropertyType type; + [FieldOffset(12)] public EventPropertyValue value; + [FieldOffset(20)] public UInt32 piiKind; } /** @@ -196,6 +217,174 @@ public enum HttpRequestType HTTP_REQUEST_TYPE_POST = 1, } + public class EventProperties : Dictionary + { + + public IntPtr nativeBuffer = IntPtr.Zero; + public int nativeSize = 0; + public int szEvtPropKV = Marshal.SizeOf(typeof(EventPropertyKeyValue)); + + public EventProperties() + { + } + internal unsafe void AllocNative() + { + nativeSize = (Count+1) * szEvtPropKV; + nativeBuffer = Marshal.AllocHGlobal(nativeSize);// sizeof(EventPropertyKeyValue)); + int i = 0; + EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(IntPtr.Zero); + foreach (KeyValuePair item in this) + { + propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; + (*propPtr).name = Marshal.StringToHGlobalAnsi(item.Key); + (*propPtr).piiKind = 0; // TODO: add Pii Kind support + (*propPtr).type = item.Value.type; +#if (TRACE) + Console.Write("0x{0:X} ", (long)propPtr); +#endif + switch (item.Value.type) + { + case EventPropertyType.TYPE_BOOLEAN: + (*propPtr).value.as_bool = item.Value.value.as_bool; +#if (TRACE) + Console.WriteLine("boolean {0}={1}", item.Key, (*propPtr).value.as_bool); +#endif + break; + case EventPropertyType.TYPE_DOUBLE: + (*propPtr).value.as_double = item.Value.value.as_double; +#if (TRACE) + Console.WriteLine("double {0}={1}", item.Key, (*propPtr).value.as_double); +#endif + break; + case EventPropertyType.TYPE_GUID: + // TODO: not implemented +#if (TRACE) + Console.WriteLine("guid {0}={1}", item.Key, (*propPtr).value.as_guid); +#endif + break; + case EventPropertyType.TYPE_INT64: + (*propPtr).value.as_int64 = item.Value.value.as_int64; +#if (TRACE) + Console.WriteLine("int64 {0}={1}", item.Key, (*propPtr).value.as_int64); +#endif + break; + case EventPropertyType.TYPE_STRING: + { + string s = (string)(item.Value.objValue); + (*propPtr).value.as_string = Marshal.StringToHGlobalAnsi(s); + (*propPtr).piiKind = item.Value.piiKind; +#if (TRACE) + Console.WriteLine("string {0}={1} (piiKind={2})", item.Key, s, item.Value.piiKind); +#endif + break; + } + default: + break; + } + i++; + } + /* NULL terminator property at the end of property list */ + propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; + (*propPtr).name = IntPtr.Zero; + (*propPtr).type = EventPropertyType.TYPE_NULL; + } + + internal unsafe void FreeNative() + { + if (nativeBuffer==IntPtr.Zero) + { + throw new Exception("Memory not allocated!"); + } + // TODO: assert count==Count + int count = nativeSize / szEvtPropKV; + for (int i = 0; i < count; i++) + { + EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; + EventPropertyType type = (EventPropertyType)((*propPtr).type); + switch (type) + { + case EventPropertyType.TYPE_GUID: + // TODO: not implemented + break; + case EventPropertyType.TYPE_STRING: + { + IntPtr strPtr = (*propPtr).value.as_string; + if (strPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(strPtr); + } + break; + } + default: + break; + } + if ((*propPtr).name != IntPtr.Zero) + { + Marshal.FreeHGlobal((*propPtr).name); + } + } + Marshal.FreeHGlobal(nativeBuffer); + nativeBuffer = IntPtr.Zero; + nativeSize = 0; + } + } + + public class EventProperty + { + public EventPropertyType type; + public EventPropertyValue value; + public object objValue = null; + public UInt32 piiKind = 0; + + public EventProperty(string strValue) + { + type = EventPropertyType.TYPE_STRING; + objValue = strValue; + } + + public EventProperty(string strValue, UInt32 piiKind) + { + type = EventPropertyType.TYPE_STRING; + objValue = strValue; + this.piiKind = piiKind; + } + + public EventProperty(Guid guidValue) + { + type = EventPropertyType.TYPE_GUID; + objValue = guidValue; + } + + public EventProperty(Int64 intValue) + { + type = EventPropertyType.TYPE_INT64; + value.as_int64 = intValue; + } + + public EventProperty(int intValue) + { + type = EventPropertyType.TYPE_INT64; + value.as_int64 = intValue; + } + + public EventProperty(double doubleValue) + { + type = EventPropertyType.TYPE_DOUBLE; + value.as_double = doubleValue; + } + + public EventProperty(bool boolValue) + { + type = EventPropertyType.TYPE_BOOLEAN; + value.as_bool = boolValue; + } + + public static implicit operator EventProperty(string v) => new EventProperty(v); + public static implicit operator EventProperty(int v) => new EventProperty(v); + public static implicit operator EventProperty(double v) => new EventProperty(v); + + }; + public static class EventNativeAPI { // Conditional compilation: pass different library name depending on target OS @@ -218,6 +407,7 @@ public static ulong evt_open(string cfg) data = Marshal.StringToHGlobalAnsi(cfg) }; evt_api_call(ref context); + Marshal.FreeHGlobal(context.data); return context.handle; } @@ -240,12 +430,21 @@ public static ulong evt_close(ulong inHandle) public static ulong evt_log(ulong inHandle, ref EventProperties properties) { - EventContextType context = new EventContextType + ulong result = 0; + unsafe { - call = (Byte)EventCallType.EVT_OP_LOG, - handle = inHandle + properties.AllocNative(); + EventContextType context = new EventContextType + { + call = (Byte)EventCallType.EVT_OP_LOG, + handle = inHandle, + data = properties.nativeBuffer, + size = 0 /* (uint)(properties.Count) */ + }; + result = evt_api_call(ref context); + properties.FreeNative(); }; - return evt_api_call(ref context); + return result; } /** @@ -337,7 +536,9 @@ public static string evt_version() data = nativeDataPtr }; evt_api_call(ref context); - return Marshal.PtrToStringAnsi(context.data); + string result = Marshal.PtrToStringAnsi(context.data); + Marshal.FreeHGlobal(nativeDataPtr); + return result; } } diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index bea811e4e..856f0dd2b 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -3,6 +3,7 @@ using System.Text; using System.IO; using System.Json; +using System.Diagnostics; using Microsoft.Telemetry.Core; @@ -35,22 +36,45 @@ static void Main(string[] args) Console.WriteLine("SDK version: {0}", EventNativeAPI.evt_version()); // Initialize - Console.WriteLine("evt_open..."); + Console.WriteLine(">>> evt_open..."); var handle = EventNativeAPI.evt_open(cfg); Console.WriteLine("handle={0}", handle); -#if FALSE - var props = new EventProperties() { - { "strKey", "value1" }, - { "intKey", 12345 }, - { "dblKey", 0.12345 }, - { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } - }; - EventNativeAPI.evt_log(handle, ref props); -#endif + // Initialize + Console.WriteLine(">>> evt_pause..."); + EventNativeAPI.evt_pause(handle); + + Console.WriteLine(">>> evt_log..."); + + long total0 = GC.GetTotalMemory(true); + long frag0 = GC.GetGCMemoryInfo().FragmentedBytes; + Stopwatch sw = new Stopwatch(); + sw.Start(); + + const int MAX_ITERATIONS = 100000; + for (int i = 0; i < MAX_ITERATIONS; i++) + { + var props = new EventProperties() { + { "strKey", "value1" }, + { "intKey", 12345 }, + { "dblKey", 0.12345 } +// , { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } + }; + EventNativeAPI.evt_log(handle, ref props); + } + sw.Stop(); + long total1 = GC.GetTotalMemory(true); + long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; + // Print some benchmarking results for offline storage + serialization + TimeSpan ts = sw.Elapsed; + Console.WriteLine("Elapsed = {0}", ts); + Console.WriteLine("Event rate = {0} eps", (MAX_ITERATIONS/ts.TotalSeconds) ); + Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds/MAX_ITERATIONS) ); + Console.WriteLine("Mem used = {0} bytes", total1-total0); + Console.WriteLine("Fragmented = {0} bytes", frag1-frag0); // FlushAndTeardown - Console.WriteLine("evt_close..."); + Console.WriteLine(">>> evt_close..."); var result = EventNativeAPI.evt_close(handle); Console.WriteLine("result={0}", result); } diff --git a/wrappers/netcore/sdk-config.json b/wrappers/netcore/sdk-config.json index 98cbeed13..0b396daac 100644 --- a/wrappers/netcore/sdk-config.json +++ b/wrappers/netcore/sdk-config.json @@ -4,9 +4,9 @@ "version": "1.0.0", "cacheFileFullNotificationPercentage": 75, "cacheFilePath": "/tmp/storage.db", - "cacheFileSizeLimitInBytes": 3145728, + "cacheFileSizeLimitInBytes": 13145728, "cacheMemoryFullNotificationPercentage": 75, - "cacheMemorySizeLimitInBytes": 524288, + "cacheMemorySizeLimitInBytes": 32768000, "compat": { "dotType": true }, @@ -19,7 +19,7 @@ "maxDBFlushQueues": 3, "maxPendingHTTPRequests": 4, "maxTeardownUploadTimeInSec": 1, - "minimumTraceLevel": 1, + "minimumTraceLevel": 5, "multiTenantEnabled": true, "primaryToken": "6d084bbf6a9644ef83f40a77c9e34580-c2d379e0-4408-4325-9b4d-2a7d78131e14-7322", "sample": { @@ -39,7 +39,7 @@ "maxBlobSize": 2097152, "maxRetryCount": 5 }, - "traceLevelMask": 268435455, + "traceLevelMask": 0, "utc": { "providerGroupId": "780dddc8-18a1-5781-895a-a690464fa89c" } From 5a3059cfacffeb32a8dcaa08901f1cd1100879a8 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sat, 18 Jan 2020 19:04:56 -0800 Subject: [PATCH 06/29] Add some support for GUID type (not the final impl) --- wrappers/netcore/EventNativeAPI.cs | 9 ++++++--- wrappers/netcore/Program.cs | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index c18a594c8..3c0b5c6d1 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -351,8 +351,11 @@ public EventProperty(string strValue, UInt32 piiKind) public EventProperty(Guid guidValue) { - type = EventPropertyType.TYPE_GUID; - objValue = guidValue; + // TODO: compact GUID on wire is not implemented! + // Currently we flatten it to string. + // type = EventPropertyType.TYPE_GUID; + type = EventPropertyType.TYPE_STRING; + objValue = guidValue.ToString(); } public EventProperty(Int64 intValue) @@ -382,7 +385,7 @@ public EventProperty(bool boolValue) public static implicit operator EventProperty(string v) => new EventProperty(v); public static implicit operator EventProperty(int v) => new EventProperty(v); public static implicit operator EventProperty(double v) => new EventProperty(v); - + public static implicit operator EventProperty(Guid v) => new EventProperty(v); }; public static class EventNativeAPI diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index 856f0dd2b..bb3102d2d 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -57,8 +57,8 @@ static void Main(string[] args) var props = new EventProperties() { { "strKey", "value1" }, { "intKey", 12345 }, - { "dblKey", 0.12345 } -// , { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } + { "dblKey", 0.12345 } , + { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } }; EventNativeAPI.evt_log(handle, ref props); } From 3e0c9a6f05d5cc3783e31772bab051a2961add9e Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Thu, 24 Sep 2020 23:04:52 -0700 Subject: [PATCH 07/29] Verify that the .NET Core wrapper sample works on Windows --- wrappers/netcore/EventNativeAPI.cs | 7 +++---- wrappers/netcore/EventSender.csproj | 3 +++ wrappers/netcore/EventSender.xml | 3 +++ wrappers/netcore/Program.cs | 2 +- wrappers/netcore/README.md | 19 +++++++++++++++++++ wrappers/netcore/run.cmd | 2 ++ 6 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 wrappers/netcore/EventSender.xml create mode 100644 wrappers/netcore/README.md create mode 100644 wrappers/netcore/run.cmd diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index 3c0b5c6d1..8fde9915c 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -19,9 +19,8 @@ namespace Core { public class Constants { - public const string LIBRARY_NAME_POSIX = "libmat"; - public const string LIBRARY_NAME_WIN32 = "ClientTelemetry.dll"; - public const string VERSION = "3.3.0-netcore"; + public const string LIBRARY_NAME = "ClientTelemetry"; + public const string VERSION = "3.4.0-netcore"; } public enum EventCallType : UInt32 @@ -392,7 +391,7 @@ public static class EventNativeAPI { // Conditional compilation: pass different library name depending on target OS - [DllImport(Constants.LIBRARY_NAME_POSIX, EntryPoint = "evt_api_call_default")] + [DllImport(Constants.LIBRARY_NAME, EntryPoint = "evt_api_call_default")] internal static extern UInt32 evt_api_call([In, Out] ref EventContextType context); /** diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj index 3a42309a4..666be2695 100644 --- a/wrappers/netcore/EventSender.csproj +++ b/wrappers/netcore/EventSender.csproj @@ -6,6 +6,9 @@ + + PreserveNewest + diff --git a/wrappers/netcore/EventSender.xml b/wrappers/netcore/EventSender.xml new file mode 100644 index 000000000..706ff14b5 --- /dev/null +++ b/wrappers/netcore/EventSender.xml @@ -0,0 +1,3 @@ + + + diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index bb3102d2d..2d7aecf1e 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -71,7 +71,7 @@ static void Main(string[] args) Console.WriteLine("Event rate = {0} eps", (MAX_ITERATIONS/ts.TotalSeconds) ); Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds/MAX_ITERATIONS) ); Console.WriteLine("Mem used = {0} bytes", total1-total0); - Console.WriteLine("Fragmented = {0} bytes", frag1-frag0); + // Console.WriteLine("Fragmented = {0} bytes", frag1-frag0); // FlushAndTeardown Console.WriteLine(">>> evt_close..."); diff --git a/wrappers/netcore/README.md b/wrappers/netcore/README.md new file mode 100644 index 000000000..a74a77c07 --- /dev/null +++ b/wrappers/netcore/README.md @@ -0,0 +1,19 @@ +# .NET Core wrapper example for 1DS C/C++ SDK + +Note that this wrapper is incomplete simple reference implementation that illustrates how to use 1DS C API from cross-platform .NET Core application. + +## POSIX instructions (Linux, Mac) + +1. Install latest .NET Core for your platform. + +2. Make sure you compile and install shared library build of SDK (`build.sh -l shared`). + +3. `run.sh` to compile and run the sample wrapper. + +## Windows instructions + +1. Install latest .NET Core for your platform. + +2. Open `Solutions\MSTelemetry.sln` and compile `win32-dll` project, producing `ClientTelemetry.dll` + +3. `run.cmd` to compile and run the sample wrapper. diff --git a/wrappers/netcore/run.cmd b/wrappers/netcore/run.cmd new file mode 100644 index 000000000..d31eb7c7e --- /dev/null +++ b/wrappers/netcore/run.cmd @@ -0,0 +1,2 @@ +set "PATH=%CD%\..\..\Solutions\out\Release\x64\win32-dll;%PATH%" +dotnet run -c Release From ef6ccbd6522ade999f94a8bfc07fdc38e1cda045 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 14:10:48 -0800 Subject: [PATCH 08/29] Move packing behavior where it would fit better - ctmacros.hpp --- lib/include/public/ctmacros.hpp | 20 ++++++++++++++++++ lib/include/public/mat.h | 36 ++++++++++----------------------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/lib/include/public/ctmacros.hpp b/lib/include/public/ctmacros.hpp index 42547e41d..b32b4b9b6 100644 --- a/lib/include/public/ctmacros.hpp +++ b/lib/include/public/ctmacros.hpp @@ -127,4 +127,24 @@ #define EVTSDK_LIBABI_CDECL MATSDK_LIBABI_CDECL #define EVTSDK_SPEC MATSDK_SPEC +/* Implement struct packing for stable FFI C API */ +#ifdef __clang__ +# define MATSDK_PACKED_STRUCT __attribute__((packed)) +# define MATSDK_PACK_PUSH +# define MATSDK_PACK_POP +#elif __GNUC__ +# define MATSDK_PACKED_STRUCT __attribute__((packed)) +# define MATSDK_PACK_PUSH +# define MATSDK_PACK_POP +#elif _MSC_VER +# define MATSDK_PACKED_STRUCT +# define MATSDK_PACK_PUSH __pragma(pack(push, 1)) +# define MATSDK_PACK_POP __pragma(pack(pop)) +#else +/* No packing behavior on unknown compilers */ +# define MATSDK_PACKED_STRUCT +# define MATSDK_PACK_PUSH +# define MATSDK_PACK_POP +#endif + #endif diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index 6fd65da85..fd148fe1d 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -17,20 +17,6 @@ #include #endif -#ifdef __clang__ -#define PACKED_STRUCT __attribute__((packed)) -#define PACK_PUSH -#define PACK_POP -#elif __GNUC__ -#define PACKED_STRUCT __attribute__((packed)) -#define PACK_PUSH -#define PACK_POP -#else -#define PACKED_STRUCT -#define PACK_PUSH __pragma(pack(push, 1)) -#define PACK_POP __pragma(pack(pop)) -#endif - #if (_MSC_VER == 1500) || (_MSC_VER == 1600) /* Visual Studio 2010 */ typedef __int64 int64_t; @@ -59,7 +45,7 @@ typedef int bool; extern "C" { #endif - typedef enum evt_call_t /* 32-bit */ + typedef enum evt_call_t { EVT_OP_LOAD = 0x00000001, EVT_OP_UNLOAD = 0x00000002, @@ -77,7 +63,7 @@ extern "C" { EVT_OP_MAXINT = 0xFFFFFFFF } evt_call_t; - typedef enum evt_prop_t /* 32-bit */ + typedef enum evt_prop_t { /* Basic types */ TYPE_STRING, @@ -98,9 +84,9 @@ extern "C" { TYPE_MAXINT = 0xFFFFFFFF } evt_prop_t; - typedef struct PACKED_STRUCT evt_guid_t + typedef struct MATSDK_PACKED_STRUCT evt_guid_t { -PACK_PUSH +MATSDK_PACK_PUSH /** * * Specifies the first eight hexadecimal digits of the GUID. @@ -128,22 +114,22 @@ PACK_PUSH * */ uint8_t Data4[8]; -PACK_POP +MATSDK_PACK_POP } evt_guid_t; typedef int64_t evt_handle_t; typedef int32_t evt_status_t; typedef struct evt_event evt_event; - typedef struct PACKED_STRUCT evt_context_t + typedef struct MATSDK_PACKED_STRUCT evt_context_t { -PACK_PUSH +MATSDK_PACK_PUSH evt_call_t call; /* In */ evt_handle_t handle; /* In / Out */ void* data; /* In / Out */ evt_status_t result; /* Out */ uint32_t size; /* In / Out */ -PACK_POP +MATSDK_PACK_POP } evt_context_t; /** @@ -203,14 +189,14 @@ PACK_POP uint64_t** as_arr_time; } evt_prop_v; - typedef struct PACKED_STRUCT evt_prop + typedef struct MATSDK_PACKED_STRUCT evt_prop { -PACK_PUSH +MATSDK_PACK_PUSH const char* name; evt_prop_t type; evt_prop_v value; uint32_t piiKind; -PACK_POP +MATSDK_PACK_POP } evt_prop; /** From 2faa5c195bb03604fc5bf7a2219dd86d9614fb27 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 15:05:50 -0800 Subject: [PATCH 09/29] There really is 8 of them, not 7 --- examples/cpp/SampleCppMini/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cpp/SampleCppMini/main.cpp b/examples/cpp/SampleCppMini/main.cpp index 3cddf79a2..1d371ced6 100644 --- a/examples/cpp/SampleCppMini/main.cpp +++ b/examples/cpp/SampleCppMini/main.cpp @@ -31,7 +31,7 @@ void test_cpp_api(const char * token, int ticketType, const char *ticket) if (ticket != nullptr) { - const char *ticketNames[7] = + const char *ticketNames[8] = { "TicketType_MSA_Device", "TicketType_MSA_User", @@ -40,7 +40,7 @@ void test_cpp_api(const char * token, int ticketType, const char *ticket) "TicketType_AAD", "TicketType_AAD_User", "TicketType_AAD_JWT", - "TicketType_AAD_Device", + "TicketType_AAD_Device" }; printf("\nSet ticket %s=%s\n", ticketNames[ticketType], ticket); auto tc = LogManager::GetAuthTokensController(); From d2bbc6132877e5e5d9485bf10b4db3ebde4a4d01 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 19:28:08 -0800 Subject: [PATCH 10/29] Clean-up C# side --- wrappers/netcore/Program.cs | 108 +++++++++++++++++++++---------- wrappers/netcore/sdk-config.json | 98 +++++++++++++++------------- 2 files changed, 129 insertions(+), 77 deletions(-) diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index 2d7aecf1e..e1767003d 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -12,6 +12,12 @@ namespace EventSender class Program { + + /// + /// Read 1DS SDK configuration from JSON configuration file. + /// + /// + /// static string ReadConfiguration(string filename) { string result = ""; @@ -22,6 +28,41 @@ static string ReadConfiguration(string filename) return result; } + /// + /// Run action in a loop and measure common performance characteristics. + /// + /// + /// + static void StressTest(Action action, int maxIterations) + { + long total0 = GC.GetTotalMemory(true); + long frag0 = GC.GetGCMemoryInfo().FragmentedBytes; + Stopwatch sw = new Stopwatch(); + sw.Start(); + + for (int i = 0; i < maxIterations; i++) + { + action(i); + } + + sw.Stop(); + long total1 = GC.GetTotalMemory(true); + long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; + // Print some benchmarking results for offline storage + serialization + TimeSpan ts = sw.Elapsed; + Console.WriteLine("Elapsed = {0}", ts); + Console.WriteLine("Event rate = {0} eps", + (ts.TotalMilliseconds != 0) ? + (maxIterations / ts.TotalSeconds) : 1000); + Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds / maxIterations)); + Console.WriteLine("Mem used = {0} bytes", total1 - total0); + } + + /// + /// Small demo how to use 1DS .NET Core API routed via 1DS C API. + /// All features of C API are supported. + /// + /// static void Main(string[] args) { Console.WriteLine("Reading configuration..."); @@ -40,43 +81,44 @@ static void Main(string[] args) var handle = EventNativeAPI.evt_open(cfg); Console.WriteLine("handle={0}", handle); - // Initialize - Console.WriteLine(">>> evt_pause..."); - EventNativeAPI.evt_pause(handle); - + // Log something Console.WriteLine(">>> evt_log..."); + var props = new EventProperties() { + { "name", "SampleNetCore" }, + { "strKey", "value1" }, + { "intKey", 12345 }, + { "dblKey", 0.12345 } , + { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } + }; + EventNativeAPI.evt_log(handle, ref props); - long total0 = GC.GetTotalMemory(true); - long frag0 = GC.GetGCMemoryInfo().FragmentedBytes; - Stopwatch sw = new Stopwatch(); - sw.Start(); - - const int MAX_ITERATIONS = 100000; - for (int i = 0; i < MAX_ITERATIONS; i++) - { - var props = new EventProperties() { - { "strKey", "value1" }, - { "intKey", 12345 }, - { "dblKey", 0.12345 } , - { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } - }; - EventNativeAPI.evt_log(handle, ref props); - } - sw.Stop(); - long total1 = GC.GetTotalMemory(true); - long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; - // Print some benchmarking results for offline storage + serialization - TimeSpan ts = sw.Elapsed; - Console.WriteLine("Elapsed = {0}", ts); - Console.WriteLine("Event rate = {0} eps", (MAX_ITERATIONS/ts.TotalSeconds) ); - Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds/MAX_ITERATIONS) ); - Console.WriteLine("Mem used = {0} bytes", total1-total0); - // Console.WriteLine("Fragmented = {0} bytes", frag1-frag0); + // Now let's run a small stress test... + StressTest( + (param1) => + { + var props = new EventProperties() { + { "name", "SampleNetCore.PerfTest" }, + { "intKey", param1 }, + }; + EventNativeAPI.evt_log(handle, ref props); + } + , 10 // number of iterations + ); - // FlushAndTeardown + ulong result = 0; + + // Flush events to storage + result = EventNativeAPI.evt_flush(handle); + Console.WriteLine("result={0}", result); + + // Force upload of all pending events + result = EventNativeAPI.evt_upload(handle); + Console.WriteLine("result={0}", result); + + // FlushAndTeardown Console.WriteLine(">>> evt_close..."); - var result = EventNativeAPI.evt_close(handle); - Console.WriteLine("result={0}", result); + result = EventNativeAPI.evt_close(handle); + Console.WriteLine("result={0}", result); } } } diff --git a/wrappers/netcore/sdk-config.json b/wrappers/netcore/sdk-config.json index 0b396daac..dfc4796ed 100644 --- a/wrappers/netcore/sdk-config.json +++ b/wrappers/netcore/sdk-config.json @@ -1,46 +1,56 @@ { - "config": {"host": "*"}, - "name": "C-API-Client-0", - "version": "1.0.0", - "cacheFileFullNotificationPercentage": 75, - "cacheFilePath": "/tmp/storage.db", - "cacheFileSizeLimitInBytes": 13145728, - "cacheMemoryFullNotificationPercentage": 75, - "cacheMemorySizeLimitInBytes": 32768000, - "compat": { - "dotType": true - }, - "enableLifecycleSession": false, - "eventCollectorUri": "https://self.events.data.microsoft.com/OneCollector/1.0/", - "hostMode": true, - "http": { - "compress": true - }, - "maxDBFlushQueues": 3, - "maxPendingHTTPRequests": 4, - "maxTeardownUploadTimeInSec": 1, - "minimumTraceLevel": 5, - "multiTenantEnabled": true, - "primaryToken": "6d084bbf6a9644ef83f40a77c9e34580-c2d379e0-4408-4325-9b4d-2a7d78131e14-7322", - "sample": { - "rate": 0 - }, - "sdkmode": 0, - "skipSqliteInitAndShutdown": null, - "stats": { - "interval": 5, - "split": false, - "tokenInt": "8130ef8ff472405d89d6f420038927ea-0c0d561e-cca5-4c81-90ed-0aa9ad786a03-7166", - "tokenProd": "4bb4d6f7cafc4e9292f972dca2dcde42-bd019ee8-e59c-4b0f-a02c-84e72157a3ef-7485" - }, - "tpm": { - "backoffConfig": "E,3000,300000,2,1", - "clockSkewEnabled": true, - "maxBlobSize": 2097152, - "maxRetryCount": 5 - }, - "traceLevelMask": 0, - "utc": { - "providerGroupId": "780dddc8-18a1-5781-895a-a690464fa89c" - } + "config": { + "host": "*", + "scope": "*" + }, + "name": "C-API-Client-0", + "version": "1.0.0", + "cacheFileFullNotificationPercentage": 75, + "cacheFilePath": "offline-storage.db", + "cacheFileSizeLimitInBytes": 3145728, + "cacheFullNotificationIntervalTime": 5000, + "cacheMemoryFullNotificationPercentage": 75, + "cacheMemorySizeLimitInBytes": 524288, + "compat": { + "customTypePrefix": "custom", + "dotType": true + }, + "enableDbDropIfFull": false, + "enableLifecycleSession": false, + "enableNetworkDetector": true, + "enableTrace": true, + "eventCollectorUri": "https://mobile.events.data.microsoft.com/OneCollector/1.0/", + "hostMode": true, + "http": { + "compress": false, + "contentEncoding": "deflate", + "msRootCheck": false + }, + "maxDBFlushQueues": 3, + "maxPendingHTTPRequests": 4, + "maxTeardownUploadTimeInSec": 5, + "minimumTraceLevel": 1, + "multiTenantEnabled": true, + "primaryToken": "fba3c287ba474016b77e0ab612175255-8ef3561c-6103-4027-8ca0-2c79dcbd8901-6902", + "sample": { + "rate": 0 + }, + "sdkmode": 0, + "sessionResetEnabled": false, + "stats": { + "interval": 0, + "split": false, + "tokenInt": "8130ef8ff472405d89d6f420038927ea-0c0d561e-cca5-4c81-90ed-0aa9ad786a03-7166", + "tokenProd": "4bb4d6f7cafc4e9292f972dca2dcde42-bd019ee8-e59c-4b0f-a02c-84e72157a3ef-7485" + }, + "tpm": { + "backoffConfig": "E,3000,300000,2,1", + "clockSkewEnabled": true, + "maxBlobSize": 2097152, + "maxRetryCount": 5 + }, + "traceLevelMask": 4294967295, + "utc": { + "enabled": false + } } \ No newline at end of file From 3266cd90c61aec7a32ee21e45309710566464b27 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 19:29:01 -0800 Subject: [PATCH 11/29] Allow C API to decide what token to use: LogManager primaryToken or iKey specified on event --- lib/api/capi.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index 3e0d9bd53..13d9f5b5d 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -242,10 +242,24 @@ evt_status_t mat_log(evt_context_t *ctx) EventProperties props; props.unpack(evt, ctx->size); + // Determine ingestion token to use for this record. + std::string token; + + // Use LogManager configuration primary token if available. + if (config.HasConfig(CFG_STR_PRIMARY_TOKEN)) + { + token = static_cast(config[CFG_STR_PRIMARY_TOKEN]); + } + + // Allow to override iKey per event via property. + // C API client maintains one handle for different tenants. auto m = props.GetProperties(); - EventProperty &prop = m[COMMONFIELDS_IKEY]; - std::string token = prop.as_string; - props.erase(COMMONFIELDS_IKEY); + if (m.count(COMMONFIELDS_IKEY)) + { + EventProperty& prop = m[COMMONFIELDS_IKEY]; + token = prop.as_string; + props.erase(COMMONFIELDS_IKEY); + } // Privacy feature for OTEL C API client: // From 515e059f79d219832d229fe760450be1fd97f8a8 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 19:29:41 -0800 Subject: [PATCH 12/29] Since packing is a potentially ABI-breaking change, need to update the version to current v3.7 --- lib/include/public/mat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index fd148fe1d..a633b1b89 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -9,7 +9,7 @@ * For version handshake check there is no mandatory requirement to update the $PATCH level. * Ref. https://semver.org/ for Semantic Versioning documentation. */ -#define TELEMETRY_EVENTS_VERSION "3.4.0" +#define TELEMETRY_EVENTS_VERSION "3.7.0" #include "ctmacros.hpp" From 7f525d9a10c1303c20c8f9b17c765b88d23c86c4 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 19:31:26 -0800 Subject: [PATCH 13/29] Minor bugfix --- wrappers/netcore/EventNativeAPI.cs | 20 ++++++++++++++------ wrappers/netcore/EventSender.csproj | 13 ++++++++++++- wrappers/netcore/EventSender.xml | 1 + 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index 8fde9915c..e861c8f9e 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -20,7 +20,7 @@ namespace Core public class Constants { public const string LIBRARY_NAME = "ClientTelemetry"; - public const string VERSION = "3.4.0-netcore"; + public const string VERSION = "3.7.0-netcore"; } public enum EventCallType : UInt32 @@ -158,9 +158,9 @@ public unsafe struct EventPropertyValue /* Basic types */ [FieldOffset(0)] public UInt64 as_uint64; [FieldOffset(0)] public IntPtr as_string; - [FieldOffset(0)] public Int64 as_int64; + [FieldOffset(0)] public Int64 as_int64; [FieldOffset(0)] public double as_double; - [FieldOffset(0)] public bool as_bool; + [FieldOffset(0)] public bool as_bool; [FieldOffset(0)] public IntPtr as_guid; [FieldOffset(0)] public UInt64 as_time; #if FALSE @@ -228,7 +228,7 @@ public EventProperties() } internal unsafe void AllocNative() { - nativeSize = (Count+1) * szEvtPropKV; + nativeSize = (Count + 1) * szEvtPropKV; nativeBuffer = Marshal.AllocHGlobal(nativeSize);// sizeof(EventPropertyKeyValue)); int i = 0; EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(IntPtr.Zero); @@ -290,7 +290,7 @@ internal unsafe void AllocNative() internal unsafe void FreeNative() { - if (nativeBuffer==IntPtr.Zero) + if (nativeBuffer == IntPtr.Zero) { throw new Exception("Memory not allocated!"); } @@ -430,6 +430,14 @@ public static ulong evt_close(ulong inHandle) return evt_api_call(ref context); } + /** + * REMEMBER! Privacy feature for OTEL C API client: + * + * C API customer that does not explicitly pass down JSON + * config["config]["scope"] = COMMONFIELDS_SCOPE_ALL; + * + * should not be able to capture the host's context vars. + */ public static ulong evt_log(ulong inHandle, ref EventProperties properties) { ulong result = 0; @@ -495,7 +503,7 @@ public static ulong evt_upload(ulong inHandle) { EventContextType context = new EventContextType { - call = (Byte)EventCallType.EVT_OP_RESUME, + call = (Byte)EventCallType.EVT_OP_UPLOAD, handle = inHandle }; return evt_api_call(ref context); diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj index 666be2695..73dc23c23 100644 --- a/wrappers/netcore/EventSender.csproj +++ b/wrappers/netcore/EventSender.csproj @@ -1,4 +1,4 @@ - + Exe netcoreapp3.1 @@ -9,6 +9,17 @@ PreserveNewest + + + PreserveNewest + + + diff --git a/wrappers/netcore/EventSender.xml b/wrappers/netcore/EventSender.xml index 706ff14b5..b10fcd35f 100644 --- a/wrappers/netcore/EventSender.xml +++ b/wrappers/netcore/EventSender.xml @@ -1,3 +1,4 @@ + From 9de1d489567c6c6aec753230e6e42a3cff948fd1 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Sun, 12 Feb 2023 19:31:50 -0800 Subject: [PATCH 14/29] Use debug library in the sample --- wrappers/netcore/run.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrappers/netcore/run.cmd b/wrappers/netcore/run.cmd index d31eb7c7e..3700b2611 100644 --- a/wrappers/netcore/run.cmd +++ b/wrappers/netcore/run.cmd @@ -1,2 +1,2 @@ -set "PATH=%CD%\..\..\Solutions\out\Release\x64\win32-dll;%PATH%" -dotnet run -c Release +set "PATH=%CD%\..\..\Solutions\out\Debug\x64\win32-dll;%PATH%" +dotnet run -c Debug From b9b8fc0bae4df0cacf12adc4336d2eead4240752 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 13 Feb 2023 00:08:15 -0800 Subject: [PATCH 15/29] Add helper method and use Newtonsoft for now --- wrappers/netcore/EventNativeAPI.cs | 30 +++++++++- wrappers/netcore/Program.cs | 91 ++++++++++++++++-------------- 2 files changed, 78 insertions(+), 43 deletions(-) diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index e861c8f9e..26ad7a82a 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; using System.Text; using System.IO; -using System.Json; + using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Collections; @@ -385,6 +385,32 @@ public EventProperty(bool boolValue) public static implicit operator EventProperty(int v) => new EventProperty(v); public static implicit operator EventProperty(double v) => new EventProperty(v); public static implicit operator EventProperty(Guid v) => new EventProperty(v); + + public static EventProperty FromObject(object v) + { + if (v is Guid guid) + { + return new EventProperty(guid); + } + + switch (Type.GetTypeCode(v.GetType())) + { + case TypeCode.String: + return new EventProperty((string)v); + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + return new EventProperty((int)v); + case TypeCode.Double: + return new EventProperty((double)v); + case TypeCode.Boolean: + return new EventProperty((bool)v); + default: + break; + } + + return new EventProperty(v.ToString()); + } }; public static class EventNativeAPI @@ -554,4 +580,4 @@ public static string evt_version() } } -} \ No newline at end of file +} diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index e1767003d..99b0133c8 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -2,21 +2,26 @@ using System.Runtime.InteropServices; using System.Text; using System.IO; -using System.Json; using System.Diagnostics; - using Microsoft.Telemetry.Core; +#if HAVE_SYSTEM_JSON +// TODO: Unity 2021 doesn't have support for System.Json yet +using System.Json; +#else +using Newtonsoft.Json.Linq; +#endif + namespace EventSender { class Program { - /// - /// Read 1DS SDK configuration from JSON configuration file. - /// - /// + /// + /// Read 1DS SDK configuration from JSON configuration file. + /// + /// /// static string ReadConfiguration(string filename) { @@ -28,23 +33,23 @@ static string ReadConfiguration(string filename) return result; } - /// - /// Run action in a loop and measure common performance characteristics. - /// - /// + /// + /// Run action in a loop and measure common performance characteristics. + /// + /// /// - static void StressTest(Action action, int maxIterations) - { + static void StressTest(Action action, int maxIterations) + { long total0 = GC.GetTotalMemory(true); long frag0 = GC.GetGCMemoryInfo().FragmentedBytes; Stopwatch sw = new Stopwatch(); - sw.Start(); - - for (int i = 0; i < maxIterations; i++) - { - action(i); - } - + sw.Start(); + + for (int i = 0; i < maxIterations; i++) + { + action(i); + } + sw.Stop(); long total1 = GC.GetTotalMemory(true); long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; @@ -55,13 +60,13 @@ static void StressTest(Action action, int maxIterations) (ts.TotalMilliseconds != 0) ? (maxIterations / ts.TotalSeconds) : 1000); Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds / maxIterations)); - Console.WriteLine("Mem used = {0} bytes", total1 - total0); + Console.WriteLine("Mem used = {0} bytes", total1 - total0); } - /// - /// Small demo how to use 1DS .NET Core API routed via 1DS C API. - /// All features of C API are supported. - /// + /// + /// Small demo how to use 1DS .NET Core API routed via 1DS C API. + /// All features of C API are supported. + /// /// static void Main(string[] args) { @@ -70,7 +75,11 @@ static void Main(string[] args) // Parse to verify it is valid and print it out.. // Parser should throw if config is invalid. +#if HAVE_SYSTEM_JSON JsonObject jsonDoc = (JsonObject)JsonObject.Parse(cfg); +#else + JObject jsonDoc = JObject.Parse(cfg); +#endif Console.WriteLine("SDK configuration:\n{0}", jsonDoc.ToString()); // Obtain SDK version from native library @@ -94,31 +103,31 @@ static void Main(string[] args) // Now let's run a small stress test... StressTest( - (param1) => - { + (param1) => + { var props = new EventProperties() { { "name", "SampleNetCore.PerfTest" }, - { "intKey", param1 }, - }; + { "intKey", param1 }, + }; EventNativeAPI.evt_log(handle, ref props); } , 10 // number of iterations ); - ulong result = 0; - - // Flush events to storage - result = EventNativeAPI.evt_flush(handle); - Console.WriteLine("result={0}", result); - - // Force upload of all pending events - result = EventNativeAPI.evt_upload(handle); - Console.WriteLine("result={0}", result); - - // FlushAndTeardown + ulong result = 0; + + // Flush events to storage + result = EventNativeAPI.evt_flush(handle); + Console.WriteLine("result={0}", result); + + // Force upload of all pending events + result = EventNativeAPI.evt_upload(handle); + Console.WriteLine("result={0}", result); + + // FlushAndTeardown Console.WriteLine(">>> evt_close..."); - result = EventNativeAPI.evt_close(handle); - Console.WriteLine("result={0}", result); + result = EventNativeAPI.evt_close(handle); + Console.WriteLine("result={0}", result); } } } From 7bb531011d8b2b4fb7ee242d2606d47d5a857b1b Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 6 Mar 2023 14:01:34 -0800 Subject: [PATCH 16/29] .NET Core wrapper clean-up --- wrappers/netcore/EventNativeAPI.cs | 178 ++++++++++++++++++---------- wrappers/netcore/EventSender.csproj | 4 +- wrappers/netcore/Program.cs | 22 ++-- wrappers/netcore/run.cmd | 4 + wrappers/netcore/sdk-config.json | 2 +- 5 files changed, 132 insertions(+), 78 deletions(-) diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index 26ad7a82a..1817a263d 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -1,15 +1,13 @@ #pragma warning disable IDE1006 // ignore naming rule violations: we preserve original C API naming for clarity here #pragma warning disable IDE0044 // ignore readonly suggestion for field passed over P/Invoke -#undef TRACE +#undef TRACE // Comment this line to enable additional diagnostics to be printed to console using System; +using System.Collections.Generic; +using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; -using System.IO; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Collections; namespace Microsoft { @@ -21,9 +19,10 @@ public class Constants { public const string LIBRARY_NAME = "ClientTelemetry"; public const string VERSION = "3.7.0-netcore"; + public const string ENTRYPOINT = "evt_api_call_default"; } - public enum EventCallType : UInt32 + enum EventCallType : UInt32 { EVT_OP_LOAD = 0x00000001, EVT_OP_UNLOAD = 0x00000002, @@ -40,15 +39,15 @@ public enum EventCallType : UInt32 EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 } - public enum EventPropertyType : UInt32 + enum EventPropertyType : UInt32 { /* Basic types */ TYPE_STRING = 0, TYPE_INT64 = 1, TYPE_DOUBLE = 2, - TYPE_TIME = 3, + TYPE_TIME = 3, /* not implemented yet */ TYPE_BOOLEAN = 4, - TYPE_GUID = 5, + TYPE_GUID = 5, /* converted to string */ /* Arrays of basic types */ TYPE_STRING_ARRAY = 6, TYPE_INT64_ARRAY = 7, @@ -94,7 +93,7 @@ public struct PiiKind } [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] - public unsafe struct EventGUIDType + unsafe struct EventGUIDType { /** * @@ -127,7 +126,7 @@ public unsafe struct EventGUIDType } [StructLayout(LayoutKind.Explicit, Size = 28, CharSet = CharSet.Ansi)] - public unsafe struct EventContextType + unsafe struct EventContextType { [FieldOffset(0)] public UInt32 call; [FieldOffset(4)] public ulong handle; @@ -136,7 +135,7 @@ public unsafe struct EventContextType [FieldOffset(24)] public UInt32 size; } - public enum EventOpenParamType + enum EventOpenParamType { OPEN_PARAM_TYPE_HTTP_HANDLER_SEND = 0, OPEN_PARAM_TYPE_HTTP_HANDLER_CANCEL = 1, @@ -146,14 +145,14 @@ public enum EventOpenParamType } [StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] - public unsafe struct EventOpenParam + unsafe struct EventOpenParam { [FieldOffset(0)] public UInt32 type; [FieldOffset(4)] public IntPtr data; }; [StructLayout(LayoutKind.Explicit, Size = 8, CharSet = CharSet.Ansi)] - public unsafe struct EventPropertyValue + unsafe struct EventPropertyValue { /* Basic types */ [FieldOffset(0)] public UInt64 as_uint64; @@ -189,15 +188,15 @@ public unsafe struct EventPropertyValue // custom SDK build flag that enforces certain struct layout. i.e. // positioning the two pointers below as 64-bit integers instead of 32-bit. [StructLayout(LayoutKind.Explicit, Size = 20, CharSet = CharSet.Ansi)] - public unsafe struct EventOpenWithParamsDataType + unsafe struct EventOpenWithParamsDataType { [FieldOffset(0)] public IntPtr config; [FieldOffset(8)] public IntPtr parameters; /* pointer to array of EventOpenParam */ - [FieldOffset(8)] public UInt32 paramsCount; + [FieldOffset(16)] public UInt32 paramsCount; } [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] - public unsafe struct EventPropertyKeyValue + unsafe struct EventPropertyKeyValue { [FieldOffset(0)] public IntPtr name; [FieldOffset(8)] public EventPropertyType type; @@ -219,24 +218,25 @@ public enum HttpRequestType public class EventProperties : Dictionary { - public IntPtr nativeBuffer = IntPtr.Zero; - public int nativeSize = 0; - public int szEvtPropKV = Marshal.SizeOf(typeof(EventPropertyKeyValue)); + internal IntPtr _nativeBuffer = IntPtr.Zero; + internal int _nativeSize = 0; + + private static readonly int SzEvtPropKv = Marshal.SizeOf(typeof(EventPropertyKeyValue)); public EventProperties() { } internal unsafe void AllocNative() { - nativeSize = (Count + 1) * szEvtPropKV; - nativeBuffer = Marshal.AllocHGlobal(nativeSize);// sizeof(EventPropertyKeyValue)); + _nativeSize = (Count + 1) * SzEvtPropKv; + _nativeBuffer = Marshal.AllocHGlobal(_nativeSize); int i = 0; EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(IntPtr.Zero); foreach (KeyValuePair item in this) { - propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; + propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; (*propPtr).name = Marshal.StringToHGlobalAnsi(item.Key); - (*propPtr).piiKind = 0; // TODO: add Pii Kind support + (*propPtr).piiKind = item.Value.piiKind; (*propPtr).type = item.Value.type; #if (TRACE) Console.Write("0x{0:X} ", (long)propPtr); @@ -256,7 +256,9 @@ internal unsafe void AllocNative() #endif break; case EventPropertyType.TYPE_GUID: - // TODO: not implemented + // Currently we are not using TYPE_GUID. All GUID values get converted to + // TYPE_STRING on assignment. This also aligns well with how service + // telemetry handles GUID type in OpenTelemetry and R9 SDKs. #if (TRACE) Console.WriteLine("guid {0}={1}", item.Key, (*propPtr).value.as_guid); #endif @@ -283,27 +285,27 @@ internal unsafe void AllocNative() i++; } /* NULL terminator property at the end of property list */ - propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; + propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; (*propPtr).name = IntPtr.Zero; (*propPtr).type = EventPropertyType.TYPE_NULL; } internal unsafe void FreeNative() { - if (nativeBuffer == IntPtr.Zero) + if (_nativeBuffer == IntPtr.Zero) { throw new Exception("Memory not allocated!"); } - // TODO: assert count==Count - int count = nativeSize / szEvtPropKV; + int count = _nativeSize / SzEvtPropKv; + // Debug.Assert(count == Count + 1); for (int i = 0; i < count; i++) { - EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(nativeBuffer) + i; - EventPropertyType type = (EventPropertyType)((*propPtr).type); + EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; + EventPropertyType type = (*propPtr).type; switch (type) { case EventPropertyType.TYPE_GUID: - // TODO: not implemented + // Unused. Guid type gets converted to String on assignment. break; case EventPropertyType.TYPE_STRING: { @@ -322,18 +324,18 @@ internal unsafe void FreeNative() Marshal.FreeHGlobal((*propPtr).name); } } - Marshal.FreeHGlobal(nativeBuffer); - nativeBuffer = IntPtr.Zero; - nativeSize = 0; + Marshal.FreeHGlobal(_nativeBuffer); + _nativeBuffer = IntPtr.Zero; + _nativeSize = 0; } } public class EventProperty { - public EventPropertyType type; - public EventPropertyValue value; - public object objValue = null; - public UInt32 piiKind = 0; + internal EventPropertyType type; + internal EventPropertyValue value; + internal object objValue = null; + internal UInt32 piiKind = 0; public EventProperty(string strValue) { @@ -350,9 +352,7 @@ public EventProperty(string strValue, UInt32 piiKind) public EventProperty(Guid guidValue) { - // TODO: compact GUID on wire is not implemented! - // Currently we flatten it to string. - // type = EventPropertyType.TYPE_GUID; + // All Guid types get converted to string representation. type = EventPropertyType.TYPE_STRING; objValue = guidValue.ToString(); } @@ -411,20 +411,52 @@ public static EventProperty FromObject(object v) return new EventProperty(v.ToString()); } + + public override String ToString() + { + switch (type) + { + /* Basic types */ + case EventPropertyType.TYPE_STRING: + return objValue.ToString(); + + case EventPropertyType.TYPE_INT64: + return $"{value.as_int64}"; + + case EventPropertyType.TYPE_DOUBLE: + return $"{value.as_double}"; + + case EventPropertyType.TYPE_TIME: + // Time type not implemented. Please use string or int64 + break; + + case EventPropertyType.TYPE_BOOLEAN: + return $"{(value.as_bool ? "true" : "false")}"; + + case EventPropertyType.TYPE_GUID: + // Presently we are not using Guid type. Values get converted + // to String type on assignment. + break; + + default: + break; + } + return ""; + } }; public static class EventNativeAPI { - // Conditional compilation: pass different library name depending on target OS - [DllImport(Constants.LIBRARY_NAME, EntryPoint = "evt_api_call_default")] + // Conditional compilation: pass different library name depending on target OS + [DllImport(Constants.LIBRARY_NAME, EntryPoint = Constants.ENTRYPOINT)] internal static extern UInt32 evt_api_call([In, Out] ref EventContextType context); /** * * Create or open existing SDK instance. * - * SDK configuration. + * SDK configuration. * SDK instance handle. */ public static ulong evt_open(string cfg) @@ -443,7 +475,7 @@ public static ulong evt_open(string cfg) * * Destroy or close SDK instance by handle * - * SDK instance handle. + * SDK instance handle. * Status code. */ public static ulong evt_close(ulong inHandle) @@ -466,20 +498,16 @@ public static ulong evt_close(ulong inHandle) */ public static ulong evt_log(ulong inHandle, ref EventProperties properties) { - ulong result = 0; - unsafe + properties.AllocNative(); + EventContextType context = new EventContextType { - properties.AllocNative(); - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_LOG, - handle = inHandle, - data = properties.nativeBuffer, - size = 0 /* (uint)(properties.Count) */ - }; - result = evt_api_call(ref context); - properties.FreeNative(); + call = (Byte)EventCallType.EVT_OP_LOG, + handle = inHandle, + data = properties._nativeBuffer, + size = 0 /* (uint)(properties.Count) */ }; + ulong result = evt_api_call(ref context); + properties.FreeNative(); return result; } @@ -487,7 +515,7 @@ public static ulong evt_log(ulong inHandle, ref EventProperties properties) * * Pauses transmission. In that mode events stay in ram or saved to disk, not sent. * - * SDK handle. + * SDK handle. * Status code. */ public static ulong evt_pause(ulong inHandle) @@ -504,7 +532,7 @@ public static ulong evt_pause(ulong inHandle) * * Resumes transmission. Pending telemetry events should be attempted to be sent. * - * SDK handle. + * SDK handle. * Status code. */ public static ulong evt_resume(ulong inHandle) @@ -522,7 +550,7 @@ public static ulong evt_resume(ulong inHandle) * without waiting for the next batch timer interval. This API does not * guarantee the upload. * - * SDK handle. + * SDK handle. * Status code. */ public static ulong evt_upload(ulong inHandle) @@ -538,7 +566,7 @@ public static ulong evt_upload(ulong inHandle) /** * Save pending telemetry events to offline storage on disk. * - * SDK handle. + * SDK handle. * Status code. */ public static ulong evt_flush(ulong inHandle) @@ -557,11 +585,11 @@ public static ulong evt_flush(ulong inHandle) * It is up to app dev to verify the value returned, making a decision whether some SDK * features are implemented/supported by particular SDK version or not. * - * SDK header semver. * SDK library semver */ public static string evt_version() { + string result = ""; byte[] data = Encoding.ASCII.GetBytes(Constants.VERSION); var nativeDataPtr = Marshal.AllocHGlobal(data.Length + 1); Marshal.Copy(data, 0, nativeDataPtr, data.Length); @@ -571,8 +599,28 @@ public static string evt_version() call = (Byte)EventCallType.EVT_OP_VERSION, data = nativeDataPtr }; - evt_api_call(ref context); - string result = Marshal.PtrToStringAnsi(context.data); + + try + { + evt_api_call(ref context); + result = Marshal.PtrToStringAnsi(context.data); +#pragma warning disable CS0168 // Variable is declared but never used + } + catch (EntryPointNotFoundException ex) + { +#if (TRACE) + // Library found, but entry point in the library not found. + Console.Write("Method not found: {0}", Constants.ENTRYPOINT); +#endif + } + catch (DllNotFoundException ex) + { +#if (TRACE) + // Library not found. + Console.Write("Library not found: {0}", Constants.LIBRARY_NAME); +#endif + } +#pragma warning restore CS0168 // Variable is declared but never used Marshal.FreeHGlobal(nativeDataPtr); return result; } diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj index 73dc23c23..cad792c56 100644 --- a/wrappers/netcore/EventSender.csproj +++ b/wrappers/netcore/EventSender.csproj @@ -22,6 +22,8 @@ - + + + diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs index 99b0133c8..e433b392b 100644 --- a/wrappers/netcore/Program.cs +++ b/wrappers/netcore/Program.cs @@ -1,6 +1,4 @@ using System; -using System.Runtime.InteropServices; -using System.Text; using System.IO; using System.Diagnostics; using Microsoft.Telemetry.Core; @@ -14,7 +12,6 @@ namespace EventSender { - class Program { @@ -25,11 +22,8 @@ class Program /// static string ReadConfiguration(string filename) { - string result = ""; - using (StreamReader sr = new StreamReader(filename)) - { - result = sr.ReadToEnd(); - } + using StreamReader sr = new StreamReader(filename); + string result = sr.ReadToEnd(); return result; } @@ -51,6 +45,11 @@ static void StressTest(Action action, int maxIterations) } sw.Stop(); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + long total1 = GC.GetTotalMemory(true); long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; // Print some benchmarking results for offline storage + serialization @@ -90,6 +89,7 @@ static void Main(string[] args) var handle = EventNativeAPI.evt_open(cfg); Console.WriteLine("handle={0}", handle); + // Log something Console.WriteLine(">>> evt_log..."); var props = new EventProperties() { @@ -105,13 +105,13 @@ static void Main(string[] args) StressTest( (param1) => { - var props = new EventProperties() { + var eventProperties = new EventProperties() { { "name", "SampleNetCore.PerfTest" }, { "intKey", param1 }, }; - EventNativeAPI.evt_log(handle, ref props); + EventNativeAPI.evt_log(handle, ref eventProperties); } - , 10 // number of iterations + , 100 // number of iterations ); ulong result = 0; diff --git a/wrappers/netcore/run.cmd b/wrappers/netcore/run.cmd index 3700b2611..783e71ca0 100644 --- a/wrappers/netcore/run.cmd +++ b/wrappers/netcore/run.cmd @@ -1,2 +1,6 @@ set "PATH=%CD%\..\..\Solutions\out\Debug\x64\win32-dll;%PATH%" dotnet run -c Debug + +set "PATH=%CD%\..\..\Solutions\out\Release\x64\win32-dll;%PATH%" +dotnet run -c Release + diff --git a/wrappers/netcore/sdk-config.json b/wrappers/netcore/sdk-config.json index dfc4796ed..5b888065e 100644 --- a/wrappers/netcore/sdk-config.json +++ b/wrappers/netcore/sdk-config.json @@ -31,7 +31,7 @@ "maxTeardownUploadTimeInSec": 5, "minimumTraceLevel": 1, "multiTenantEnabled": true, - "primaryToken": "fba3c287ba474016b77e0ab612175255-8ef3561c-6103-4027-8ca0-2c79dcbd8901-6902", + "primaryToken": "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991", "sample": { "rate": 0 }, From d969ba9d921a5c4076527efc344966b46bbc062b Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 27 Mar 2023 22:22:37 -0700 Subject: [PATCH 17/29] Sync to main --- Solutions/MSTelemetrySDK.sln | 496 +++++++++++--- Solutions/net40/dllmain.cpp | 1 + Solutions/net40/net40.vcxproj | 3 + Solutions/win32-dll/win32-dll.vcxproj | 23 +- Solutions/win32-lib/win32-lib.vcxproj | 1 + .../win32-mini-dll/win32-mini-dll.vcxproj | 1 + .../win32-mini-lib/win32-mini-lib.vcxproj | 1 + examples/c/SampleC/SampleC.vcxproj | 102 +++ examples/c/SampleC/deploy-dll.cmd | 13 +- examples/c/SampleC/main.c | 189 ++++-- examples/cpp/EventSender/EventSender.vcxproj | 1 + .../EventSender/EventSender.vcxproj.filters | 137 +--- examples/cpp/SampleCpp/SampleCpp.vcxproj | 1 + .../SampleCppLogManagers.vcxproj | 391 +++++------ .../cpp/SampleCppMini/SampleCppMini.vcxproj | 1 + examples/cs/SampleCsUWP/SampleCsUWP.csproj | 348 +++++----- lib/api/capi.cpp | 5 +- lib/include/mat/config-default.h | 2 + sqlite/sqlite.vcxproj | 1 + sqliteUWP/sqlite-uwp.vcxproj | 615 +++++++++--------- tests/functests/FuncTests.vcxproj | 3 +- tests/functests/FuncTests.vcxproj.filters | 12 +- .../googlemock/msvc/2015/gmock.vcxproj | 3 +- .../googletest/googletest/msvc/gtest.vcxproj | 3 +- .../googletest/msvc/gtest.vcxproj.filters | 32 +- tests/unittests/UnitTests.vcxproj | 3 +- tools/RunMsBuild.bat | 3 + wrappers/netcore/EventNativeAPI.cs | 17 +- wrappers/netcore/EventSender.sln | 25 + 29 files changed, 1449 insertions(+), 984 deletions(-) create mode 100644 wrappers/netcore/EventSender.sln diff --git a/Solutions/MSTelemetrySDK.sln b/Solutions/MSTelemetrySDK.sln index 9f6289284..cf2ca8ffb 100644 --- a/Solutions/MSTelemetrySDK.sln +++ b/Solutions/MSTelemetrySDK.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31205.134 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite", "..\sqlite\sqlite.vcxproj", "{2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}" EndProject @@ -129,122 +129,58 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cds", "..\lib\modules\cds\c EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liveeventinspector", "..\lib\modules\liveeventinspector\liveeventinspector.vcxitems", "{F8BB42F6-9C93-423B-B0C6-23EF79DD959A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wrappers", "wrappers", "{B592ADDE-757A-4F77-88FA-CABD6F373D79}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netcore", "netcore", "{93AB10DB-BBB3-42E3-99BA-039EE1F015CF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventSender", "..\wrappers\netcore\EventSender.csproj", "{C43AD33F-28C5-4F37-B31A-6012EA182EA7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{98474492-0FBE-4BA0-833D-A27FD5F92B01}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\lib\modules\cds\cds.vcxitems*{0299c8ba-03b9-451e-8a52-8df1291173a5}*SharedItemsImports = 9 - ..\lib\pal\universal\universal.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cc}*SharedItemsImports = 9 - ..\lib\pal\desktop\desktop.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cd}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{20ad4f2b-3f98-4baf-8144-e1e7682a7927}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{2bfafe9a-45b0-4c02-841e-03e47fd2e340}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\shared\Shared.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\azmon\azmon.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\decoder\decoder.vcxitems*{65b6880e-fc36-443d-a7a5-0e6cda6523ac}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{6dc5ab1d-3d64-4c52-8d8e-d9a8b0c16f14}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{d74e42ec-c6ee-4944-b92a-eb711be002a9}*SharedItemsImports = 9 - ..\lib\shared\Shared.vcxitems*{dc91621e-a203-42df-8e03-3a23dd0602b1}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{e1f6ca48-3bbf-4378-8d1e-6bbf4869db5b}*SharedItemsImports = 9 - ..\lib\shared\Shared.vcxitems*{ef859326-2a11-481c-ae8c-03d754f1c412}*SharedItemsImports = 9 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{f8bb42f6-9c93-423b-b0c6-23ef79dd959a}*SharedItemsImports = 9 - ..\lib\decoder\decoder.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\azmon\azmon.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug.static|Any CPU = Debug.static|Any CPU Debug.static|ARM = Debug.static|ARM Debug.static|ARM64 = Debug.static|ARM64 Debug.static|Win32 = Debug.static|Win32 Debug.static|x64 = Debug.static|x64 + Debug.vc14x.MT-sqlite|Any CPU = Debug.vc14x.MT-sqlite|Any CPU Debug.vc14x.MT-sqlite|ARM = Debug.vc14x.MT-sqlite|ARM Debug.vc14x.MT-sqlite|ARM64 = Debug.vc14x.MT-sqlite|ARM64 Debug.vc14x.MT-sqlite|Win32 = Debug.vc14x.MT-sqlite|Win32 Debug.vc14x.MT-sqlite|x64 = Debug.vc14x.MT-sqlite|x64 + Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release.static|Any CPU = Release.static|Any CPU Release.static|ARM = Release.static|ARM Release.static|ARM64 = Release.static|ARM64 Release.static|Win32 = Release.static|Win32 Release.static|x64 = Release.static|x64 + Release.vc14x.MT-sqlite|Any CPU = Release.vc14x.MT-sqlite|Any CPU Release.vc14x.MT-sqlite|ARM = Release.vc14x.MT-sqlite|ARM Release.vc14x.MT-sqlite|ARM64 = Release.vc14x.MT-sqlite|ARM64 Release.vc14x.MT-sqlite|Win32 = Release.vc14x.MT-sqlite|Win32 Release.vc14x.MT-sqlite|x64 = Release.vc14x.MT-sqlite|x64 + Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM64.Build.0 = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Win32.ActiveCfg = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Win32.Build.0 = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|x64.ActiveCfg = Debug|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -252,6 +188,8 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Any CPU.ActiveCfg = Debug|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Any CPU.Build.0 = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -259,6 +197,8 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Win32.Build.0 = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|x64.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|x64.Build.0 = Debug|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM64.ActiveCfg = Release|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -266,6 +206,8 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Win32.Build.0 = Release|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|x64.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|x64.Build.0 = Release|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -274,6 +216,8 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release.vc14x.MT-sqlite|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Any CPU.ActiveCfg = Release|x64 + {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Any CPU.Build.0 = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM64.ActiveCfg = Release|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM64.Build.0 = Release|ARM64 @@ -281,16 +225,22 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Win32.Build.0 = Release|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|x64.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|x64.Build.0 = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM64.Build.0 = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Win32.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|x64.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -298,15 +248,21 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|x64.Build.0 = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM64.Build.0 = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Win32.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|x64.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM64.Build.0 = Release|ARM64 @@ -314,16 +270,22 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|x64.Build.0 = Release|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM64.Build.0 = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Win32.ActiveCfg = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|x64.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM.Build.0 = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -332,15 +294,21 @@ Global {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Win32.Build.0 = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|x64.ActiveCfg = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|x64.Build.0 = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Any CPU.ActiveCfg = Release|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM.ActiveCfg = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM64.ActiveCfg = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM64.Build.0 = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Win32.ActiveCfg = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|x64.ActiveCfg = Release|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Any CPU.ActiveCfg = Release|x64 + {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM.ActiveCfg = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM.Build.0 = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -349,16 +317,22 @@ Global {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Win32.Build.0 = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|x64.ActiveCfg = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|x64.Build.0 = Release|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM64.Build.0 = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Win32.ActiveCfg = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|x64.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Any CPU.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM.Build.0 = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -367,15 +341,21 @@ Global {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Win32.Build.0 = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|x64.ActiveCfg = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|x64.Build.0 = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Any CPU.ActiveCfg = Release|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM.ActiveCfg = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM64.ActiveCfg = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM64.Build.0 = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Win32.ActiveCfg = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|x64.ActiveCfg = Release|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Any CPU.ActiveCfg = Release|x64 + {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM.ActiveCfg = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM.Build.0 = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -384,46 +364,58 @@ Global {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Win32.Build.0 = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|x64.ActiveCfg = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|x64.Build.0 = Release|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|ARM.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|x64.ActiveCfg = Debug|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|ARM.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|ARM64.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Win32.Build.0 = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|x64.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|x64.Build.0 = Debug|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|x64.ActiveCfg = Release|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 + {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Win32.Build.0 = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|x64.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|x64.Build.0 = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM64.Build.0 = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Win32.ActiveCfg = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|x64.ActiveCfg = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Any CPU.ActiveCfg = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -431,17 +423,23 @@ Global {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.Build.0 = Debug|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Any CPU.ActiveCfg = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM64.Build.0 = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Win32.ActiveCfg = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|x64.ActiveCfg = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Any CPU.ActiveCfg = Release|x64 + {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM64.Build.0 = Release|ARM64 @@ -449,17 +447,23 @@ Global {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.Build.0 = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM64.Build.0 = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Win32.ActiveCfg = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -467,17 +471,23 @@ Global {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.Build.0 = Debug|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Any CPU.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM64.Build.0 = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Win32.ActiveCfg = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|x64.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Any CPU.ActiveCfg = Release|x64 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM64.Build.0 = Release|ARM64 @@ -485,17 +495,23 @@ Global {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.Build.0 = Release|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM64.Build.0 = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Win32.ActiveCfg = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|x64.ActiveCfg = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|x64.Build.0 = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Any CPU.ActiveCfg = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM.Build.0 = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -504,15 +520,21 @@ Global {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Win32.Build.0 = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|x64.ActiveCfg = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|x64.Build.0 = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Any CPU.ActiveCfg = Release|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM.ActiveCfg = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM64.ActiveCfg = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM64.Build.0 = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Win32.ActiveCfg = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|x64.ActiveCfg = Release|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Any CPU.ActiveCfg = Release|x64 + {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM.ActiveCfg = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM.Build.0 = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -521,6 +543,8 @@ Global {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Win32.Build.0 = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|x64.ActiveCfg = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM.Build.0 = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 @@ -529,6 +553,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Win32.Build.0 = Debug|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|x64.ActiveCfg = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -536,6 +562,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Any CPU.Build.0 = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -544,6 +572,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM.ActiveCfg = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM64.ActiveCfg = Release|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -551,6 +581,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Win32.Build.0 = Release|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|x64.ActiveCfg = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -558,6 +590,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Any CPU.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Any CPU.Build.0 = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -566,6 +600,8 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM64.Build.0 = Debug|ARM64 @@ -573,6 +609,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|x64.Build.0 = Debug|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -580,6 +618,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Any CPU.Build.0 = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -587,6 +627,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|x64.Build.0 = Debug|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -594,6 +636,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|x64.Build.0 = Release|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -601,6 +645,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Any CPU.ActiveCfg = Release|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Any CPU.Build.0 = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM64.Build.0 = Release|ARM64 @@ -608,16 +654,22 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|x64.Build.0 = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM64.Build.0 = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Win32.ActiveCfg = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|x64.ActiveCfg = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Any CPU.ActiveCfg = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -625,15 +677,21 @@ Global {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Win32.Build.0 = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|x64.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|x64.Build.0 = Debug|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Any CPU.ActiveCfg = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM64.Build.0 = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Win32.ActiveCfg = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|x64.ActiveCfg = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Any CPU.ActiveCfg = Release|x64 + {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM64.Build.0 = Release|ARM64 @@ -641,16 +699,22 @@ Global {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Win32.Build.0 = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|x64.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|x64.Build.0 = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM64.Build.0 = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Win32.ActiveCfg = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|x64.ActiveCfg = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Any CPU.ActiveCfg = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -658,15 +722,21 @@ Global {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Win32.Build.0 = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|x64.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|x64.Build.0 = Debug|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Any CPU.ActiveCfg = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM64.Build.0 = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Win32.ActiveCfg = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|x64.ActiveCfg = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Any CPU.ActiveCfg = Release|x64 + {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM64.Build.0 = Release|ARM64 @@ -674,16 +744,19 @@ Global {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Win32.Build.0 = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|x64.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|x64.Build.0 = Release|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM64.Build.0 = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|Win32.ActiveCfg = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|x64.ActiveCfg = Debug|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|Any CPU.ActiveCfg = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM.Build.0 = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -692,15 +765,18 @@ Global {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|Win32.Build.0 = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|x64.ActiveCfg = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|x64.Build.0 = Debug|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|Any CPU.ActiveCfg = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM.ActiveCfg = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM64.ActiveCfg = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM64.Build.0 = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|Win32.ActiveCfg = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|x64.ActiveCfg = Release|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 + {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|Any CPU.ActiveCfg = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM.ActiveCfg = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM.Build.0 = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -709,6 +785,8 @@ Global {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|Win32.Build.0 = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|x64.ActiveCfg = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|x64.Build.0 = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 @@ -717,6 +795,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|x64.Build.0 = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 @@ -725,6 +805,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Any CPU.ActiveCfg = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -732,6 +814,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|x64.Build.0 = Debug|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM64.ActiveCfg = Release|ARM64 @@ -740,6 +824,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|x64.Build.0 = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 @@ -748,6 +834,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Any CPU.ActiveCfg = Release|x64 + {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM64.Build.0 = Release|ARM64 @@ -755,6 +843,8 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|x64.Build.0 = Release|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 @@ -763,6 +853,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -770,6 +862,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Any CPU.ActiveCfg = Debug|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Any CPU.Build.0 = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM.ActiveCfg = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -777,6 +871,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|x64.Build.0 = Debug|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 @@ -785,6 +881,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -792,6 +890,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Any CPU.ActiveCfg = Release|x64 + {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Any CPU.Build.0 = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM.ActiveCfg = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM64.Build.0 = Release|ARM64 @@ -799,6 +899,8 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|x64.Build.0 = Release|x64 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Any CPU.ActiveCfg = Debug|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM64.ActiveCfg = Release|Win32 @@ -807,6 +909,8 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|x64.Build.0 = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 @@ -815,11 +919,15 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|x64.Build.0 = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|ARM.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|ARM64.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Win32.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|x64.ActiveCfg = Debug|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Any CPU.ActiveCfg = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM64.ActiveCfg = Release|Win32 @@ -828,6 +936,8 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|x64.Build.0 = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 @@ -836,11 +946,15 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Any CPU.ActiveCfg = Release|Win32 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|ARM64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Win32.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|x64.ActiveCfg = Release|Win32 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Any CPU.Build.0 = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -848,6 +962,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Win32.Build.0 = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|x64.ActiveCfg = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|x64.Build.0 = Debug.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -855,6 +971,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Any CPU.ActiveCfg = Debug|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Any CPU.Build.0 = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM.ActiveCfg = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM64.ActiveCfg = Debug|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -862,6 +980,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Win32.Build.0 = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|x64.ActiveCfg = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|x64.Build.0 = Debug|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Any CPU.ActiveCfg = Release.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Any CPU.Build.0 = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM.ActiveCfg = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -869,6 +989,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Win32.Build.0 = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|x64.ActiveCfg = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|x64.Build.0 = Release.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -876,6 +998,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Any CPU.ActiveCfg = Release|x64 + {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Any CPU.Build.0 = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM.ActiveCfg = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM64.ActiveCfg = Release|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM64.Build.0 = Release|ARM64 @@ -883,6 +1007,7 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Win32.Build.0 = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|x64.ActiveCfg = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|x64.Build.0 = Release|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.Deploy.0 = Debug|ARM @@ -895,6 +1020,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.Deploy.0 = Debug|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Debug|ARM @@ -907,6 +1033,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.Deploy.0 = Debug|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.Deploy.0 = Debug|ARM @@ -917,6 +1044,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.Deploy.0 = Debug|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.Deploy.0 = Release|ARM @@ -929,6 +1057,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.Deploy.0 = Release|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|ARM @@ -941,6 +1070,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 + {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.Deploy.0 = Release|ARM @@ -952,6 +1082,7 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.Deploy.0 = Release|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -960,6 +1091,7 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|x64.Build.0 = Debug|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -968,12 +1100,14 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|ARM.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|ARM64.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Win32.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|x64.Build.0 = Debug|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -982,6 +1116,7 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|x64.Build.0 = Release|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -990,12 +1125,14 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 + {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|ARM.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|ARM64.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Win32.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|x64.Build.0 = Release|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.Deploy.0 = Debug|ARM @@ -1008,6 +1145,7 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.Deploy.0 = Debug|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Debug|ARM @@ -1020,6 +1158,7 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.Deploy.0 = Debug|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.Deploy.0 = Debug|ARM @@ -1032,6 +1171,7 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.Deploy.0 = Debug|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.Deploy.0 = Release|ARM @@ -1044,6 +1184,7 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.Deploy.0 = Release|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|ARM @@ -1056,6 +1197,7 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.Deploy.0 = Release|ARM @@ -1068,6 +1210,8 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.Deploy.0 = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -1076,6 +1220,8 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|x64.Build.0 = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1084,6 +1230,8 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM.ActiveCfg = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM64.Build.0 = Debug|x64 @@ -1091,6 +1239,8 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|x64.Build.0 = Debug|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Any CPU.ActiveCfg = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -1099,6 +1249,8 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|x64.Build.0 = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1107,12 +1259,16 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Any CPU.ActiveCfg = Release|x64 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|ARM.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|ARM64.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Win32.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|x64.Build.0 = Release|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Any CPU.Build.0 = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -1120,6 +1276,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Win32.Build.0 = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|x64.ActiveCfg = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|x64.Build.0 = Debug.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -1127,6 +1285,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Any CPU.ActiveCfg = Debug|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Any CPU.Build.0 = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM.ActiveCfg = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM64.ActiveCfg = Debug|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -1134,6 +1294,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Win32.Build.0 = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|x64.ActiveCfg = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|x64.Build.0 = Debug|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Any CPU.ActiveCfg = Release.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Any CPU.Build.0 = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM.ActiveCfg = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -1141,6 +1303,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Win32.Build.0 = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|x64.ActiveCfg = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|x64.Build.0 = Release.static|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -1148,6 +1312,8 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Any CPU.ActiveCfg = Release|x64 + {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Any CPU.Build.0 = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM.ActiveCfg = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM64.ActiveCfg = Release|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM64.Build.0 = Release|ARM64 @@ -1155,6 +1321,7 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Win32.Build.0 = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|x64.ActiveCfg = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|x64.Build.0 = Release|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -1162,6 +1329,7 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|Win32.Build.0 = Debug.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|x64.ActiveCfg = Debug.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|x64.Build.0 = Debug.static|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -1169,6 +1337,7 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|Any CPU.ActiveCfg = Debug|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM.ActiveCfg = Debug|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -1176,6 +1345,7 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|Win32.Build.0 = Debug|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|x64.ActiveCfg = Debug|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|x64.Build.0 = Debug|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|Any CPU.ActiveCfg = Release.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM.ActiveCfg = Release.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -1183,6 +1353,7 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|Win32.Build.0 = Release.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|x64.ActiveCfg = Release.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|x64.Build.0 = Release.static|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -1190,6 +1361,7 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 + {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|Any CPU.ActiveCfg = Release|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM.ActiveCfg = Release|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM64.ActiveCfg = Release|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM64.Build.0 = Release|ARM64 @@ -1197,6 +1369,8 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|Win32.Build.0 = Release|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|x64.ActiveCfg = Release|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|x64.Build.0 = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Any CPU.ActiveCfg = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -1205,6 +1379,8 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|x64.Build.0 = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1213,12 +1389,16 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Any CPU.ActiveCfg = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|ARM.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|ARM64.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Win32.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|x64.Build.0 = Debug|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Any CPU.ActiveCfg = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -1227,6 +1407,8 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|x64.Build.0 = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1235,12 +1417,74 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Any CPU.ActiveCfg = Release|x64 + {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|ARM.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|ARM64.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Win32.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|x64.Build.0 = Release|x64 + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|Any CPU.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|Any CPU.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|ARM.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|ARM.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|ARM64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|ARM64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|Win32.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|Win32.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|x64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.static|x64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|ARM.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|ARM64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|Win32.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|Win32.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Debug|x64.Build.0 = Debug|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|Any CPU.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|Any CPU.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|ARM.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|ARM.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|ARM64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|ARM64.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|Win32.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|Win32.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|x64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.static|x64.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|Any CPU.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|ARM.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|ARM.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|ARM64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|ARM64.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|Win32.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|Win32.Build.0 = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|x64.ActiveCfg = Release|Any CPU + {C43AD33F-28C5-4F37-B31A-6012EA182EA7}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1277,8 +1521,92 @@ Global {6DC5AB1D-3D64-4C52-8D8E-D9A8B0C16F14} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} {0299C8BA-03B9-451E-8A52-8DF1291173A5} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} {F8BB42F6-9C93-423B-B0C6-23EF79DD959A} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} + {93AB10DB-BBB3-42E3-99BA-039EE1F015CF} = {B592ADDE-757A-4F77-88FA-CABD6F373D79} + {C43AD33F-28C5-4F37-B31A-6012EA182EA7} = {93AB10DB-BBB3-42E3-99BA-039EE1F015CF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7EE8585B-C10F-4DAC-BDAF-3726EDF8FCD7} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\lib\modules\cds\cds.vcxitems*{0299c8ba-03b9-451e-8a52-8df1291173a5}*SharedItemsImports = 9 + ..\lib\pal\universal\universal.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cc}*SharedItemsImports = 9 + ..\lib\pal\desktop\desktop.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cd}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{20ad4f2b-3f98-4baf-8144-e1e7682a7927}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{2bfafe9a-45b0-4c02-841e-03e47fd2e340}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\shared\Shared.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\azmon\azmon.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\decoder\decoder.vcxitems*{65b6880e-fc36-443d-a7a5-0e6cda6523ac}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{6dc5ab1d-3d64-4c52-8d8e-d9a8b0c16f14}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{d74e42ec-c6ee-4944-b92a-eb711be002a9}*SharedItemsImports = 9 + ..\lib\shared\Shared.vcxitems*{dc91621e-a203-42df-8e03-3a23dd0602b1}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{e1f6ca48-3bbf-4378-8d1e-6bbf4869db5b}*SharedItemsImports = 9 + ..\lib\shared\Shared.vcxitems*{ef859326-2a11-481c-ae8c-03d754f1c412}*SharedItemsImports = 9 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{f8bb42f6-9c93-423b-b0c6-23ef79dd959a}*SharedItemsImports = 9 + ..\lib\decoder\decoder.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\azmon\azmon.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + EndGlobalSection EndGlobal diff --git a/Solutions/net40/dllmain.cpp b/Solutions/net40/dllmain.cpp index 6de55458a..eb2266ab5 100644 --- a/Solutions/net40/dllmain.cpp +++ b/Solutions/net40/dllmain.cpp @@ -24,6 +24,7 @@ void LockInMemory() { #ifndef _WINRT_DLL HMODULE mstelModule; + // TODO: this is supposed to be L"ClientTelemetry.dll" or different DLL depending on flavor??? ::GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN, L"ClientTelemetry3m.dll", &mstelModule); #endif } diff --git a/Solutions/net40/net40.vcxproj b/Solutions/net40/net40.vcxproj index 56b97bc3e..640562d91 100644 --- a/Solutions/net40/net40.vcxproj +++ b/Solutions/net40/net40.vcxproj @@ -27,6 +27,7 @@ net40 true true + 10.0 @@ -136,6 +137,8 @@ false false false + false + false Console diff --git a/Solutions/win32-dll/win32-dll.vcxproj b/Solutions/win32-dll/win32-dll.vcxproj index bd4369a9a..4f8052973 100644 --- a/Solutions/win32-dll/win32-dll.vcxproj +++ b/Solutions/win32-dll/win32-dll.vcxproj @@ -92,15 +92,16 @@ - - - - - - - - - + + + + + + + + + + @@ -115,7 +116,7 @@ *.cdf;*.cache;*.obj;*.pdb;*.obj.enc;*.ilk;*.ipdb;*.iobj;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.xml;*.metagen;*.bi - $(LibraryPath) + $(LibraryPath);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) AllRules.ruleset false @@ -136,7 +137,7 @@ *.cdf;*.cache;*.obj;*.pdb;*.obj.enc;*.ilk;*.ipdb;*.iobj;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.xml;*.metagen;*.bi - $(LibraryPath) + $(LibraryPath);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) AllRules.ruleset false diff --git a/Solutions/win32-lib/win32-lib.vcxproj b/Solutions/win32-lib/win32-lib.vcxproj index 8c40d7335..57411dd91 100644 --- a/Solutions/win32-lib/win32-lib.vcxproj +++ b/Solutions/win32-lib/win32-lib.vcxproj @@ -148,6 +148,7 @@ + diff --git a/Solutions/win32-mini-dll/win32-mini-dll.vcxproj b/Solutions/win32-mini-dll/win32-mini-dll.vcxproj index d450add27..da0420901 100644 --- a/Solutions/win32-mini-dll/win32-mini-dll.vcxproj +++ b/Solutions/win32-mini-dll/win32-mini-dll.vcxproj @@ -46,6 +46,7 @@ true $(ProjectDir)..\build.compact-min.props + 10.0 OACR diff --git a/Solutions/win32-mini-lib/win32-mini-lib.vcxproj b/Solutions/win32-mini-lib/win32-mini-lib.vcxproj index c29bcea39..e7750d902 100644 --- a/Solutions/win32-mini-lib/win32-mini-lib.vcxproj +++ b/Solutions/win32-mini-lib/win32-mini-lib.vcxproj @@ -59,6 +59,7 @@ true $(ProjectDir)..\build.compact-min.props + 10.0 OACR diff --git a/examples/c/SampleC/SampleC.vcxproj b/examples/c/SampleC/SampleC.vcxproj index d307939cf..d5816f4bf 100644 --- a/examples/c/SampleC/SampleC.vcxproj +++ b/examples/c/SampleC/SampleC.vcxproj @@ -6,10 +6,18 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {277AEB2C-E995-4A40-B63A-B16B8A3A4550} @@ -22,30 +30,61 @@ true Unicode + + Application + true + Unicode + Application false true Unicode + + Application + false + true + Unicode + + + + + + + false + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + $(VC_IncludePath);$(WindowsSDK_IncludePath); + $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + false $(MSBuildProjectDirectory)\lib\$(Configuration)\$(Platform);$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(MSBuildProjectDirectory)\include + + false + $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(VC_IncludePath);$(WindowsSDK_IncludePath); + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + @@ -68,6 +107,34 @@ Deploy DLLs + + + + + Level3 + Disabled + HAVE_DYNAMIC_C_LIB;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(SolutionDir)\..\lib\include\public + + + Console + true + Enabled + false + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + false + + Level3 @@ -98,6 +165,36 @@ Deploy DLLs + + + Level3 + NotUsing + MaxSpeed + true + true + HAVE_DYNAMIC_C_LIB;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + + + $(SolutionDir)\..\lib\include\public + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Enabled + false + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + @@ -110,6 +207,11 @@ + + + {216a8e97-21f7-4bef-9e52-7f772c177c32} + + diff --git a/examples/c/SampleC/deploy-dll.cmd b/examples/c/SampleC/deploy-dll.cmd index 8ba37cacd..5ef345b46 100644 --- a/examples/c/SampleC/deploy-dll.cmd +++ b/examples/c/SampleC/deploy-dll.cmd @@ -2,15 +2,10 @@ set PROJECT_DIR=%~dp0 @mkdir %PROJECT_DIR%\include -copy %PROJECT_DIR%..\..\..\lib\include\public\mat.h %PROJECT_DIR%\include -copy %PROJECT_DIR%..\..\..\lib\include\public\Version.h %PROJECT_DIR%\include -copy %PROJECT_DIR%..\..\..\lib\include\public\ctmacros.hpp %PROJECT_DIR%\include +copy /Y %PROJECT_DIR%..\..\..\lib\include\public\mat.h %PROJECT_DIR%\include +copy /Y %PROJECT_DIR%..\..\..\lib\include\public\ctmacros.hpp %PROJECT_DIR%\include @mkdir %PROJECT_DIR%\lib\%1\%2 -copy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll\*.lib %PROJECT_DIR%\lib\%1\%2 - -@mkdir -p %PROJECT_DIR%\%1\%2 -copy %PROJECT_DIR%..\..\ -copy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll\*.* %PROJECT_DIR%\lib\%1\%2 -copy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll\*.* %3 +robocopy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll %PROJECT_DIR%\lib\%1\%2 *.lib /S +robocopy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll %3 *.dll /S exit /b 0 diff --git a/examples/c/SampleC/main.c b/examples/c/SampleC/main.c index 7b3514e3f..015acf672 100644 --- a/examples/c/SampleC/main.c +++ b/examples/c/SampleC/main.c @@ -4,68 +4,149 @@ #define _CRT_SECURE_LOG_S #include "mat.h" -#define API_KEY "99999999999999999999999999999999-99999999-9999-9999-9999-999999999999-9999" - -char* config = - "{" - "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path - "\"config\":{\"host\": \"*\"}," // Attach as guest to any host - "\"name\":\"C-API-Client-0\"," // Module ID - "\"version\":\"1.0.0\"," // Module semver - "\"primaryToken\":\"" API_KEY "\"," // Primary Token - "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload - "\"hostMode\":false," // Explicitly declare yourself as guest - "\"minimumTraceLevel\":0," // Debug printout level - "\"sdkmode\":0" // SDK direct-upload mode - "}"; - -void test_c_api() +#define API_KEY "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991" + +static const char* host_config = + "{" + "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path + "\"config\":{\"host\": \"*\"}," + "\"name\":\"C-API-Client-0\"," // Module ID + "\"version\":\"1.0.0\"," // Module semver + "\"primaryToken\":\"" API_KEY + "\"," // Primary Token + "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload + "\"hostMode\":true," // Explicitly declare as host + "\"minimumTraceLevel\":0," // Debug printout level + "\"sdkmode\":0" // 1DS direct-upload mode + "}"; + +static const char* guest_config = + "{" + "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path + "\"config\":{\"host\": \"*\"}," // Attach as guest to any host + "\"name\":\"C-API-Client-1\"," // Module ID + "\"version\":\"1.0.0\"," // Module semver + "\"primaryToken\":\"" API_KEY + "\"," // Primary Token + "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload + "\"hostMode\":false," // Explicitly declare yourself as guest + "\"minimumTraceLevel\":0," // Debug printout level + "\"sdkmode\":0" // 1DS direct-upload mode + "}"; + + +evt_handle_t host_handle = 0; + +evt_handle_t guest_handle = 0; + +/** + * Initialize as Host - main owner of LogManager instance. + */ +void test_c_api_host() { - evt_handle_t handle; - evt_prop event[] = TELEMETRY_EVENT - ( - // Common Data Extensions.Envelope - reserved keywords that C API should not use. - // Alternate solution is to declare a special macro for envelope 'root' namespace props, - // such as $STR, $INT, etc. - _STR("name", "Event.Name.Pure.C.vs2010"), // Represents the uniquely qualified name for the event - _STR("ver", "3.0"), // Represents the major and minor version of the extension - _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format - _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client - _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. - _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... - _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. - // Customer Data fields go as part of userdata - _STR("strKey", "value1"), - _INT("intKey", 12345), - PII_STR("piiKey", "secret", 1), - // Part "X" demo - populating CS extension props - // Common Data Extensions.App - PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), - _STR("ext.app.ver", "1.0.0") - ); + evt_prop event[] = TELEMETRY_EVENT( + // Common Data Extensions.Envelope - reserved keywords that C API should not use. + // Alternate solution is to declare a special macro for envelope 'root' namespace props, + // such as $STR, $INT, etc. + _STR("name", "TestApp.Event.Host"), // Represents the uniquely qualified name for the event + _STR("ver", "3.0"), // Represents the major and minor version of the extension + // _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format + _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client + _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. + _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... + _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. + // Customer Data fields go as part of userdata + _STR("strKey", "value1"), + _INT("intKey", 12345), + PII_STR("piiKey", "secret", 1), + // Part "X" demo - populating CS extension props + // Common Data Extensions.App + PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), + _STR("ext.app.ver", "1.0.0")); #ifdef _WIN32 - // It is possible to delay-load the loading of default ClientTelemetry.dll , - // then load an alternate implementation with a matching set of exported syms. - // That way the calls are essentially redirected to user-supplied telemetry - printf("Loading ClientTelemetry implementation library...\n"); - evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); + // It is possible to delay-load the loading of default ClientTelemetry.dll , + // then load an alternate implementation with a matching set of exported syms. + // That way the calls are essentially redirected to user-supplied telemetry + printf("Loading ClientTelemetry implementation library...\n"); + evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); #endif - printf("Testing C API...\n"); - handle = evt_open(config); + printf("Testing C API (host)...\n"); + host_handle = evt_open(host_config); - // Ref. https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields for description of Common Schema fields + printf("evt_log(host_handle)\n"); + evt_log(host_handle, event); - evt_log(handle, event); - evt_flush(handle); - evt_upload(handle); - evt_close(handle); + printf("evt_flush(host_handle)\n"); + evt_flush(host_handle); + + printf("evt_upload(host_handle)\n"); + evt_upload(host_handle); } -int main(int argc, char *argv[]) +/** + * Initialize as Guest - SDK in the main app, anchor to existing LogManager instance. + */ +void test_c_api_guest() { - printf("Hello, C API!\n"); - test_c_api(); - return 0; +#ifdef _WIN32 + // Check if we can load the same library again. + printf("Loading ClientTelemetry implementation library (again)...\n"); + evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); +#endif + + printf("Testing C API (guest)...\n"); + guest_handle = evt_open(guest_config); + + // Ref. https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields for description of Common Schema fields + evt_prop event[] = TELEMETRY_EVENT( + // Common Data Extensions.Envelope - reserved keywords that C API should not use. + // Alternate solution is to declare a special macro for envelope 'root' namespace props, + // such as $STR, $INT, etc. + _STR("name", "TestApp.Event.Guest"), // Represents the uniquely qualified name for the event + _STR("ver", "3.0"), // Represents the major and minor version of the extension + _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format + _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client + _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. + _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... + _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. + // Customer Data fields go as part of userdata + _STR("strKey", "value1"), + _INT("intKey", 12345), + PII_STR("piiKey", "secret", 1), + // Part "X" demo - populating CS extension props + // Common Data Extensions.App + PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), + _STR("ext.app.ver", "1.0.0")); + + printf("evt_log(guest_handle)\n"); + evt_log(guest_handle, event); + + printf("evt_flush(guest_handle)\n"); + evt_flush(guest_handle); + + printf("evt_upload(guest_handle)\n"); + evt_upload(guest_handle); +} + +int main(int argc, char* argv[]) +{ + printf("Hello, C API... "); + + // Send events as Host + test_c_api_host(); + // Send events as Guest + test_c_api_guest(); + + // Close Host handle + printf("evt_close(host_handle)\n"); + evt_close(host_handle); + + // Close Guest handle + printf("evt_close(guest_handle)\n"); + evt_close(guest_handle); + + printf("[ DONE ]\n"); + return 0; } diff --git a/examples/cpp/EventSender/EventSender.vcxproj b/examples/cpp/EventSender/EventSender.vcxproj index b55221e14..953b12c5f 100644 --- a/examples/cpp/EventSender/EventSender.vcxproj +++ b/examples/cpp/EventSender/EventSender.vcxproj @@ -24,6 +24,7 @@ {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222} Win32Proj EventSender + 10.0 diff --git a/examples/cpp/EventSender/EventSender.vcxproj.filters b/examples/cpp/EventSender/EventSender.vcxproj.filters index f5b9ccda5..edd3c98f1 100644 --- a/examples/cpp/EventSender/EventSender.vcxproj.filters +++ b/examples/cpp/EventSender/EventSender.vcxproj.filters @@ -1,117 +1,22 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - - Header Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + \ No newline at end of file diff --git a/examples/cpp/SampleCpp/SampleCpp.vcxproj b/examples/cpp/SampleCpp/SampleCpp.vcxproj index 500d966f6..7e95b3dcf 100644 --- a/examples/cpp/SampleCpp/SampleCpp.vcxproj +++ b/examples/cpp/SampleCpp/SampleCpp.vcxproj @@ -81,6 +81,7 @@ Win32Proj SampleCpp true + 10.0 diff --git a/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj b/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj index 7f6b47434..57382de88 100644 --- a/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj +++ b/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj @@ -1,196 +1,197 @@ - - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC} - Win32Proj - SampleCppLogManagers - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public;$(SolutionDir)\..\lib\pal\ - $(ProjectDir) - $(Configuration)\ - $(LibraryPath) - - - true - $(ProjectDir) - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public;$(SolutionDir)\..\lib\pal\ - $(LibraryPath) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public - - - - NotUsing - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - - - Console - true - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - - - - NotUsing - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - - - Console - true - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - - - - NotUsing - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - - - Console - true - true - true - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - - - - NotUsing - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - - - Console - true - true - true - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - - - - - - - {216a8e97-21f7-4bef-9e52-7f772c177c32} - - - - - - - - - + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {77053F92-F003-4D1C-A489-1DEB7CFEA4EC} + Win32Proj + SampleCppLogManagers + 10.0 + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + + + + + true + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public;$(SolutionDir)\..\lib\pal\ + $(ProjectDir) + $(Configuration)\ + $(LibraryPath) + + + true + $(ProjectDir) + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public;$(SolutionDir)\..\lib\pal\ + $(LibraryPath) + + + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public + + + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)\..\lib\include\public + + + + NotUsing + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + + + Console + true + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + + + + NotUsing + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + + + Console + true + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + + + + NotUsing + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + + + Console + true + true + true + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + + + + NotUsing + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + + + Console + true + true + true + + + $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) + + + Deploy DLLs + + + + + + + + {216a8e97-21f7-4bef-9e52-7f772c177c32} + + + + + + + + + \ No newline at end of file diff --git a/examples/cpp/SampleCppMini/SampleCppMini.vcxproj b/examples/cpp/SampleCppMini/SampleCppMini.vcxproj index 88bca8d6d..dacadd491 100644 --- a/examples/cpp/SampleCppMini/SampleCppMini.vcxproj +++ b/examples/cpp/SampleCppMini/SampleCppMini.vcxproj @@ -81,6 +81,7 @@ Win32Proj SampleCppMini true + 10.0 diff --git a/examples/cs/SampleCsUWP/SampleCsUWP.csproj b/examples/cs/SampleCsUWP/SampleCsUWP.csproj index 4c73a88f9..8ce730391 100644 --- a/examples/cs/SampleCsUWP/SampleCsUWP.csproj +++ b/examples/cs/SampleCsUWP/SampleCsUWP.csproj @@ -1,181 +1,181 @@ - - - - - Debug - x86 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA} - AppContainerExe - Properties - SampleCsUWP - SampleCsUWP - en-US - UAP - 10.0.17763.0 - 10.0.10240.0 - 14 - 512 - {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - TemporaryKey.pfx - 5D2C91E522EAF83739013D206CCA199DF5D3AFD6 - - - true - bin\x86\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - x86 - false - prompt - true - - - bin\x86\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - x86 - false - prompt - true - true - - - true - bin\ARM\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - ARM - false - prompt - true - - - bin\ARM\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - ARM - false - prompt - true - true - - - true - bin\ARM64\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - ARM64 - false - prompt - true - true - - - bin\ARM64\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - ARM64 - false - prompt - true - true - - - true - bin\x64\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - x64 - false - prompt - true - - - bin\x64\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - x64 - false - prompt - true - true - - - PackageReference - - - - App.xaml - - - MainPage.xaml - - - - - - Designer - - - - - - - - - - - - - - - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - - - - 6.2.8 - - - - - {49077dbf-e363-4d2d-8334-636569a771b6} - win10-cs - - - - - Visual C++ 2015 Runtime for Universal Windows Platform Apps - - - - 14.0 - - + + + + + Debug + x86 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA} + AppContainerExe + Properties + SampleCsUWP + SampleCsUWP + en-US + UAP + 10.0.10586.0 + 10.0.10586.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + TemporaryKey.pfx + 5D2C91E522EAF83739013D206CCA199DF5D3AFD6 + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + true + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + true + true + + + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM64 + false + prompt + true + true + + + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM64 + false + prompt + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + true + true + + + PackageReference + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + 6.2.8 + + + + + {49077dbf-e363-4d2d-8334-636569a771b6} + win10-cs + + + + + Visual C++ 2015 Runtime for Universal Windows Platform Apps + + + + 14.0 + + + --> \ No newline at end of file diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index 13d9f5b5d..9ac6672bc 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -1,9 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. #include "mat/config.h" -#ifdef _WIN32 -#define MATSDK_DECLSPEC __declspec(dllexport) -#endif #if !defined (ANDROID) || defined(ENABLE_CAPI_HTTP_CLIENT) #include "http/HttpClient_CAPI.hpp" @@ -356,7 +353,7 @@ extern "C" { /** * Simple stable backwards- / forward- compatible ABI interface */ - evt_status_t EVTSDK_LIBABI_CDECL evt_api_call_default(evt_context_t *ctx) + MATSDK_LIBABI evt_status_t EVTSDK_LIBABI_CDECL evt_api_call_default(evt_context_t* ctx) { evt_status_t result = EFAIL; diff --git a/lib/include/mat/config-default.h b/lib/include/mat/config-default.h index ae01e6004..75a406a94 100644 --- a/lib/include/mat/config-default.h +++ b/lib/include/mat/config-default.h @@ -4,6 +4,8 @@ // #pragma once +#define HAVE_PRIVATE_MODULES + #define EVTSDK_VERSION_PREFIX "EVT" #if defined(_WIN32) #if defined __has_include diff --git a/sqlite/sqlite.vcxproj b/sqlite/sqlite.vcxproj index 95bbef456..1848c420b 100644 --- a/sqlite/sqlite.vcxproj +++ b/sqlite/sqlite.vcxproj @@ -64,6 +64,7 @@ Win32Proj sqlite true + 10.0 OACR diff --git a/sqliteUWP/sqlite-uwp.vcxproj b/sqliteUWP/sqlite-uwp.vcxproj index c153beb24..873da4aa8 100644 --- a/sqliteUWP/sqlite-uwp.vcxproj +++ b/sqliteUWP/sqlite-uwp.vcxproj @@ -1,308 +1,309 @@ - - - - - - Debug - ARM - - - Debug - ARM64 - - - Debug - Win32 - - - Debug - x64 - - - Release - ARM - - - Release - ARM64 - - - Release - Win32 - - - Release - x64 - - - - {6883a688-89f5-424a-9bfa-50d42f691b29} - en-US - 14.0 - 10.0.10240.0 - - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ - $(Platform)\$(Configuration)\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ - $(Platform)\$(Configuration)\ - - - false - - - false - - - false - - - false - - - false - - - false - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - false - NotUsing - _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) - false - - - false - true - - - - - false - NotUsing - _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) - false - - - true - false - - - - - - - - - false - false - - - - - - + + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {6883a688-89f5-424a-9bfa-50d42f691b29} + en-US + 14.0 + 10.0.10240.0 + 10.0 + + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + false + + + false + + + false + + + false + + + false + + + false + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + false + NotUsing + _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) + false + + + false + true + + + + + false + NotUsing + _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) + false + + + true + false + + + + + + + + + false + false + + + + + + \ No newline at end of file diff --git a/tests/functests/FuncTests.vcxproj b/tests/functests/FuncTests.vcxproj index 5ef46bf60..abe757d81 100644 --- a/tests/functests/FuncTests.vcxproj +++ b/tests/functests/FuncTests.vcxproj @@ -50,6 +50,7 @@ Win32 FuncTests true + 10.0 @@ -458,4 +459,4 @@ - + \ No newline at end of file diff --git a/tests/functests/FuncTests.vcxproj.filters b/tests/functests/FuncTests.vcxproj.filters index 71dbe5451..204630396 100644 --- a/tests/functests/FuncTests.vcxproj.filters +++ b/tests/functests/FuncTests.vcxproj.filters @@ -14,13 +14,14 @@ - - - - - + + + + + + @@ -66,6 +67,7 @@ mocks + diff --git a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj index cfcb24ad1..10689236d 100644 --- a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj +++ b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj @@ -32,6 +32,7 @@ gmock Win32Proj true + 10.0 @@ -212,4 +213,4 @@ - + \ No newline at end of file diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj b/tests/googletest/googletest/msvc/gtest.vcxproj index 7112ed0f6..99f204e82 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj +++ b/tests/googletest/googletest/msvc/gtest.vcxproj @@ -31,6 +31,7 @@ {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} Win32Proj true + 10.0 @@ -215,4 +216,4 @@ - + \ No newline at end of file diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj.filters b/tests/googletest/googletest/msvc/gtest.vcxproj.filters index b566f891e..93188ad16 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj.filters +++ b/tests/googletest/googletest/msvc/gtest.vcxproj.filters @@ -1,18 +1,16 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Source Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + \ No newline at end of file diff --git a/tests/unittests/UnitTests.vcxproj b/tests/unittests/UnitTests.vcxproj index 8245eac06..637e5092a 100644 --- a/tests/unittests/UnitTests.vcxproj +++ b/tests/unittests/UnitTests.vcxproj @@ -50,6 +50,7 @@ Win32 UnitTests true + 10.0 @@ -491,4 +492,4 @@ - + \ No newline at end of file diff --git a/tools/RunMsBuild.bat b/tools/RunMsBuild.bat index 38bab739c..9a9814f6f 100644 --- a/tools/RunMsBuild.bat +++ b/tools/RunMsBuild.bat @@ -14,6 +14,9 @@ echo %CUSTOM_PROPS% call tools\vcvars.cmd +REM nuget restore .\Solutions\win10-lib\packages.config -PackagesDirectory .\Solutions\packages +REM nuget restore .\Solutions\win10-dll\packages.config -PackagesDirectory .\Solutions\packages + set MAXCPUCOUNT=%NUMBER_OF_PROCESSORS% set platform= set SOLUTION=Solutions\MSTelemetrySDK.sln diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs index 1817a263d..36b47725c 100644 --- a/wrappers/netcore/EventNativeAPI.cs +++ b/wrappers/netcore/EventNativeAPI.cs @@ -8,16 +8,25 @@ using System.Runtime.InteropServices; using System.Text; - namespace Microsoft { namespace Telemetry { namespace Core { + + public class Handles + { + /// + /// Handles.InvalidHandle is returned if API call fails. + /// + public const ulong InvalidHandle = ulong.MaxValue; + } + public class Constants { public const string LIBRARY_NAME = "ClientTelemetry"; + public const string VERSION = "3.7.0-netcore"; public const string ENTRYPOINT = "evt_api_call_default"; } @@ -466,16 +475,16 @@ public static ulong evt_open(string cfg) call = (Byte)EventCallType.EVT_OP_OPEN, data = Marshal.StringToHGlobalAnsi(cfg) }; - evt_api_call(ref context); + uint result = evt_api_call(ref context); Marshal.FreeHGlobal(context.data); - return context.handle; + return (result == 0) ? context.handle : Handles.InvalidHandle; } /** * * Destroy or close SDK instance by handle * - * SDK instance handle. + * SDK instance handle. * Status code. */ public static ulong evt_close(ulong inHandle) diff --git a/wrappers/netcore/EventSender.sln b/wrappers/netcore/EventSender.sln new file mode 100644 index 000000000..aa1113c42 --- /dev/null +++ b/wrappers/netcore/EventSender.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33403.182 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventSender", "EventSender.csproj", "{D69C30C5-CBAD-415C-9F93-19BB7219D085}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9EE7D92A-8808-4AA8-9D5D-79B199AC8A9F} + EndGlobalSection +EndGlobal From 22eb472791ed65b2d526cb55f930ad3019b98c79 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 27 Mar 2023 22:31:55 -0700 Subject: [PATCH 18/29] Cherry-pick latest changes --- Solutions/net40/net40.vcxproj | 3 - .../win32-mini-dll/win32-mini-dll.vcxproj | 1 - .../win32-mini-lib/win32-mini-lib.vcxproj | 1 - examples/cpp/EventSender/EventSender.vcxproj | 1 - .../EventSender/EventSender.vcxproj.filters | 95 +++++++++++++++++++ examples/cpp/SampleCpp/SampleCpp.vcxproj | 1 - .../SampleCppLogManagers.vcxproj | 1 - .../cpp/SampleCppMini/SampleCppMini.vcxproj | 1 - examples/cs/SampleCsUWP/SampleCsUWP.csproj | 4 +- lib/include/mat/config-default.h | 1 + lib/modules | 2 +- sqlite/sqlite.vcxproj | 1 - sqliteUWP/sqlite-uwp.vcxproj | 1 - .../googlemock/msvc/2015/gmock.vcxproj | 1 - .../googletest/googletest/msvc/gtest.vcxproj | 1 - 15 files changed, 99 insertions(+), 16 deletions(-) diff --git a/Solutions/net40/net40.vcxproj b/Solutions/net40/net40.vcxproj index 640562d91..56b97bc3e 100644 --- a/Solutions/net40/net40.vcxproj +++ b/Solutions/net40/net40.vcxproj @@ -27,7 +27,6 @@ net40 true true - 10.0 @@ -137,8 +136,6 @@ false false false - false - false Console diff --git a/Solutions/win32-mini-dll/win32-mini-dll.vcxproj b/Solutions/win32-mini-dll/win32-mini-dll.vcxproj index da0420901..d450add27 100644 --- a/Solutions/win32-mini-dll/win32-mini-dll.vcxproj +++ b/Solutions/win32-mini-dll/win32-mini-dll.vcxproj @@ -46,7 +46,6 @@ true $(ProjectDir)..\build.compact-min.props - 10.0 OACR diff --git a/Solutions/win32-mini-lib/win32-mini-lib.vcxproj b/Solutions/win32-mini-lib/win32-mini-lib.vcxproj index e7750d902..c29bcea39 100644 --- a/Solutions/win32-mini-lib/win32-mini-lib.vcxproj +++ b/Solutions/win32-mini-lib/win32-mini-lib.vcxproj @@ -59,7 +59,6 @@ true $(ProjectDir)..\build.compact-min.props - 10.0 OACR diff --git a/examples/cpp/EventSender/EventSender.vcxproj b/examples/cpp/EventSender/EventSender.vcxproj index 953b12c5f..b55221e14 100644 --- a/examples/cpp/EventSender/EventSender.vcxproj +++ b/examples/cpp/EventSender/EventSender.vcxproj @@ -24,7 +24,6 @@ {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222} Win32Proj EventSender - 10.0 diff --git a/examples/cpp/EventSender/EventSender.vcxproj.filters b/examples/cpp/EventSender/EventSender.vcxproj.filters index edd3c98f1..de72b7eb5 100644 --- a/examples/cpp/EventSender/EventSender.vcxproj.filters +++ b/examples/cpp/EventSender/EventSender.vcxproj.filters @@ -19,4 +19,99 @@ Source Files + + + + Header Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file diff --git a/examples/cpp/SampleCpp/SampleCpp.vcxproj b/examples/cpp/SampleCpp/SampleCpp.vcxproj index 7e95b3dcf..500d966f6 100644 --- a/examples/cpp/SampleCpp/SampleCpp.vcxproj +++ b/examples/cpp/SampleCpp/SampleCpp.vcxproj @@ -81,7 +81,6 @@ Win32Proj SampleCpp true - 10.0 diff --git a/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj b/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj index 57382de88..a8cc24be1 100644 --- a/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj +++ b/examples/cpp/SampleCppLogManagers/SampleCppLogManagers.vcxproj @@ -24,7 +24,6 @@ {77053F92-F003-4D1C-A489-1DEB7CFEA4EC} Win32Proj SampleCppLogManagers - 10.0 diff --git a/examples/cpp/SampleCppMini/SampleCppMini.vcxproj b/examples/cpp/SampleCppMini/SampleCppMini.vcxproj index dacadd491..88bca8d6d 100644 --- a/examples/cpp/SampleCppMini/SampleCppMini.vcxproj +++ b/examples/cpp/SampleCppMini/SampleCppMini.vcxproj @@ -81,7 +81,6 @@ Win32Proj SampleCppMini true - 10.0 diff --git a/examples/cs/SampleCsUWP/SampleCsUWP.csproj b/examples/cs/SampleCsUWP/SampleCsUWP.csproj index 8ce730391..823a4fe4e 100644 --- a/examples/cs/SampleCsUWP/SampleCsUWP.csproj +++ b/examples/cs/SampleCsUWP/SampleCsUWP.csproj @@ -11,8 +11,8 @@ SampleCsUWP en-US UAP - 10.0.10586.0 - 10.0.10586.0 + 10.0.17763.0 + 10.0.10240.0 14 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} diff --git a/lib/include/mat/config-default.h b/lib/include/mat/config-default.h index 176ddb46b..a983c03e8 100644 --- a/lib/include/mat/config-default.h +++ b/lib/include/mat/config-default.h @@ -4,6 +4,7 @@ // #pragma once +// TODO: [MG] - do not merge this #define HAVE_PRIVATE_MODULES #define EVTSDK_VERSION_PREFIX "EVT" diff --git a/lib/modules b/lib/modules index 31c166521..883a3e3b9 160000 --- a/lib/modules +++ b/lib/modules @@ -1 +1 @@ -Subproject commit 31c1665219726a69ec9220ce754a0860a54fe846 +Subproject commit 883a3e3b9c63fa713bdde31bf7417e63e416fe4e diff --git a/sqlite/sqlite.vcxproj b/sqlite/sqlite.vcxproj index 1848c420b..95bbef456 100644 --- a/sqlite/sqlite.vcxproj +++ b/sqlite/sqlite.vcxproj @@ -64,7 +64,6 @@ Win32Proj sqlite true - 10.0 OACR diff --git a/sqliteUWP/sqlite-uwp.vcxproj b/sqliteUWP/sqlite-uwp.vcxproj index 873da4aa8..8d51e574c 100644 --- a/sqliteUWP/sqlite-uwp.vcxproj +++ b/sqliteUWP/sqlite-uwp.vcxproj @@ -40,7 +40,6 @@ en-US 14.0 10.0.10240.0 - 10.0 diff --git a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj index 10689236d..7cec61a69 100644 --- a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj +++ b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj @@ -32,7 +32,6 @@ gmock Win32Proj true - 10.0 diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj b/tests/googletest/googletest/msvc/gtest.vcxproj index 99f204e82..7f25372d5 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj +++ b/tests/googletest/googletest/msvc/gtest.vcxproj @@ -31,7 +31,6 @@ {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} Win32Proj true - 10.0 From 70f52d0df0db6ac11e121e2c9178733e72d79559 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 21:35:08 -0700 Subject: [PATCH 19/29] Revert change --- lib/include/mat/config-default.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/include/mat/config-default.h b/lib/include/mat/config-default.h index a983c03e8..44cf12a88 100644 --- a/lib/include/mat/config-default.h +++ b/lib/include/mat/config-default.h @@ -4,9 +4,6 @@ // #pragma once -// TODO: [MG] - do not merge this -#define HAVE_PRIVATE_MODULES - #define EVTSDK_VERSION_PREFIX "EVT" #if defined(_WIN32) #if defined __has_include From 35236a2036c74d9aa4ad68a59b0f08b7a8e4ab9c Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 21:51:04 -0700 Subject: [PATCH 20/29] C API improvements --- Solutions/net40/dllmain.cpp | 1 - examples/c/SampleC/SampleC.vcxproj | 104 +-- examples/c/SampleC/deploy-dll.cmd | 1 - examples/c/SampleC/main.c | 189 ++---- lib/api/ContextFieldsProvider.cpp | 144 ++++ lib/api/ContextFieldsProvider.hpp | 2 + lib/api/LogManagerImpl.cpp | 1 - lib/api/Logger.cpp | 3 +- lib/api/capi.cpp | 108 ++- lib/include/public/mat.h | 124 +++- tests/functests/BasicFuncTests.cpp | 11 +- tests/functests/CMakeLists.txt | 1 + tests/functests/FuncTests.vcxproj | 3 +- tests/functests/FuncTests.vcxproj.filters | 3 +- tests/functests/HostGuestTests.cpp | 602 ++++++++++++++++ .../googlemock/msvc/2015/gmock.vcxproj | 2 +- .../googletest/googletest/msvc/gtest.vcxproj | 2 +- .../googletest/msvc/gtest.vcxproj.filters | 4 +- tools/RunMsBuild.bat | 3 - wrappers/netcore/EventNativeAPI.cs | 640 ------------------ wrappers/netcore/EventSender.csproj | 29 - wrappers/netcore/EventSender.sln | 25 - wrappers/netcore/EventSender.xml | 4 - wrappers/netcore/Program.cs | 133 ---- wrappers/netcore/README.md | 19 - wrappers/netcore/appsettings.json | 18 - wrappers/netcore/run.cmd | 6 - wrappers/netcore/run.sh | 12 - wrappers/netcore/sdk-config.json | 56 -- 29 files changed, 1038 insertions(+), 1212 deletions(-) create mode 100644 tests/functests/HostGuestTests.cpp delete mode 100644 wrappers/netcore/EventNativeAPI.cs delete mode 100644 wrappers/netcore/EventSender.csproj delete mode 100644 wrappers/netcore/EventSender.sln delete mode 100644 wrappers/netcore/EventSender.xml delete mode 100644 wrappers/netcore/Program.cs delete mode 100644 wrappers/netcore/README.md delete mode 100644 wrappers/netcore/appsettings.json delete mode 100644 wrappers/netcore/run.cmd delete mode 100755 wrappers/netcore/run.sh delete mode 100644 wrappers/netcore/sdk-config.json diff --git a/Solutions/net40/dllmain.cpp b/Solutions/net40/dllmain.cpp index eb2266ab5..6de55458a 100644 --- a/Solutions/net40/dllmain.cpp +++ b/Solutions/net40/dllmain.cpp @@ -24,7 +24,6 @@ void LockInMemory() { #ifndef _WINRT_DLL HMODULE mstelModule; - // TODO: this is supposed to be L"ClientTelemetry.dll" or different DLL depending on flavor??? ::GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN, L"ClientTelemetry3m.dll", &mstelModule); #endif } diff --git a/examples/c/SampleC/SampleC.vcxproj b/examples/c/SampleC/SampleC.vcxproj index d5816f4bf..4f3890959 100644 --- a/examples/c/SampleC/SampleC.vcxproj +++ b/examples/c/SampleC/SampleC.vcxproj @@ -1,4 +1,4 @@ - + @@ -6,18 +6,10 @@ Debug Win32 - - Debug - x64 - Release Win32 - - Release - x64 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550} @@ -30,61 +22,30 @@ true Unicode - - Application - true - Unicode - Application false true Unicode - - Application - false - true - Unicode - - - - - - - false - - false - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - $(VC_IncludePath);$(WindowsSDK_IncludePath); - $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - false $(MSBuildProjectDirectory)\lib\$(Configuration)\$(Platform);$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(MSBuildProjectDirectory)\include - - false - $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(VC_IncludePath);$(WindowsSDK_IncludePath); - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - @@ -107,34 +68,6 @@ Deploy DLLs - - - - - Level3 - Disabled - HAVE_DYNAMIC_C_LIB;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - $(SolutionDir)\..\lib\include\public - - - Console - true - Enabled - false - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - false - - Level3 @@ -165,36 +98,6 @@ Deploy DLLs - - - Level3 - NotUsing - MaxSpeed - true - true - HAVE_DYNAMIC_C_LIB;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - - - $(SolutionDir)\..\lib\include\public - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - Enabled - false - - - $(MSBuildProjectDirectory)\deploy-dll.cmd $(Configuration) $(Platform) $(OutDir) - - - Deploy DLLs - - @@ -207,11 +110,6 @@ - - - {216a8e97-21f7-4bef-9e52-7f772c177c32} - - diff --git a/examples/c/SampleC/deploy-dll.cmd b/examples/c/SampleC/deploy-dll.cmd index 5ef345b46..8d42b51fc 100644 --- a/examples/c/SampleC/deploy-dll.cmd +++ b/examples/c/SampleC/deploy-dll.cmd @@ -6,6 +6,5 @@ copy /Y %PROJECT_DIR%..\..\..\lib\include\public\mat.h %PROJECT_DIR%\include copy /Y %PROJECT_DIR%..\..\..\lib\include\public\ctmacros.hpp %PROJECT_DIR%\include @mkdir %PROJECT_DIR%\lib\%1\%2 -robocopy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll %PROJECT_DIR%\lib\%1\%2 *.lib /S robocopy %PROJECT_DIR%..\..\..\Solutions\out\%1\%2\win32-dll %3 *.dll /S exit /b 0 diff --git a/examples/c/SampleC/main.c b/examples/c/SampleC/main.c index 015acf672..7b3514e3f 100644 --- a/examples/c/SampleC/main.c +++ b/examples/c/SampleC/main.c @@ -4,149 +4,68 @@ #define _CRT_SECURE_LOG_S #include "mat.h" -#define API_KEY "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991" - -static const char* host_config = - "{" - "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path - "\"config\":{\"host\": \"*\"}," - "\"name\":\"C-API-Client-0\"," // Module ID - "\"version\":\"1.0.0\"," // Module semver - "\"primaryToken\":\"" API_KEY - "\"," // Primary Token - "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload - "\"hostMode\":true," // Explicitly declare as host - "\"minimumTraceLevel\":0," // Debug printout level - "\"sdkmode\":0" // 1DS direct-upload mode - "}"; - -static const char* guest_config = - "{" - "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path - "\"config\":{\"host\": \"*\"}," // Attach as guest to any host - "\"name\":\"C-API-Client-1\"," // Module ID - "\"version\":\"1.0.0\"," // Module semver - "\"primaryToken\":\"" API_KEY - "\"," // Primary Token - "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload - "\"hostMode\":false," // Explicitly declare yourself as guest - "\"minimumTraceLevel\":0," // Debug printout level - "\"sdkmode\":0" // 1DS direct-upload mode - "}"; - - -evt_handle_t host_handle = 0; - -evt_handle_t guest_handle = 0; - -/** - * Initialize as Host - main owner of LogManager instance. - */ -void test_c_api_host() +#define API_KEY "99999999999999999999999999999999-99999999-9999-9999-9999-999999999999-9999" + +char* config = + "{" + "\"cacheFilePath\":\"MyOfflineStorage.db\"," // Custom storage path + "\"config\":{\"host\": \"*\"}," // Attach as guest to any host + "\"name\":\"C-API-Client-0\"," // Module ID + "\"version\":\"1.0.0\"," // Module semver + "\"primaryToken\":\"" API_KEY "\"," // Primary Token + "\"maxTeardownUploadTimeInSec\":5," // Allow up to 5 seconds for upload + "\"hostMode\":false," // Explicitly declare yourself as guest + "\"minimumTraceLevel\":0," // Debug printout level + "\"sdkmode\":0" // SDK direct-upload mode + "}"; + +void test_c_api() { - evt_prop event[] = TELEMETRY_EVENT( - // Common Data Extensions.Envelope - reserved keywords that C API should not use. - // Alternate solution is to declare a special macro for envelope 'root' namespace props, - // such as $STR, $INT, etc. - _STR("name", "TestApp.Event.Host"), // Represents the uniquely qualified name for the event - _STR("ver", "3.0"), // Represents the major and minor version of the extension - // _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format - _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client - _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. - _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... - _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. - // Customer Data fields go as part of userdata - _STR("strKey", "value1"), - _INT("intKey", 12345), - PII_STR("piiKey", "secret", 1), - // Part "X" demo - populating CS extension props - // Common Data Extensions.App - PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), - _STR("ext.app.ver", "1.0.0")); + evt_handle_t handle; + evt_prop event[] = TELEMETRY_EVENT + ( + // Common Data Extensions.Envelope - reserved keywords that C API should not use. + // Alternate solution is to declare a special macro for envelope 'root' namespace props, + // such as $STR, $INT, etc. + _STR("name", "Event.Name.Pure.C.vs2010"), // Represents the uniquely qualified name for the event + _STR("ver", "3.0"), // Represents the major and minor version of the extension + _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format + _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client + _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. + _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... + _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. + // Customer Data fields go as part of userdata + _STR("strKey", "value1"), + _INT("intKey", 12345), + PII_STR("piiKey", "secret", 1), + // Part "X" demo - populating CS extension props + // Common Data Extensions.App + PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), + _STR("ext.app.ver", "1.0.0") + ); #ifdef _WIN32 - // It is possible to delay-load the loading of default ClientTelemetry.dll , - // then load an alternate implementation with a matching set of exported syms. - // That way the calls are essentially redirected to user-supplied telemetry - printf("Loading ClientTelemetry implementation library...\n"); - evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); + // It is possible to delay-load the loading of default ClientTelemetry.dll , + // then load an alternate implementation with a matching set of exported syms. + // That way the calls are essentially redirected to user-supplied telemetry + printf("Loading ClientTelemetry implementation library...\n"); + evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); #endif - printf("Testing C API (host)...\n"); - host_handle = evt_open(host_config); + printf("Testing C API...\n"); + handle = evt_open(config); - printf("evt_log(host_handle)\n"); - evt_log(host_handle, event); + // Ref. https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields for description of Common Schema fields - printf("evt_flush(host_handle)\n"); - evt_flush(host_handle); - - printf("evt_upload(host_handle)\n"); - evt_upload(host_handle); + evt_log(handle, event); + evt_flush(handle); + evt_upload(handle); + evt_close(handle); } -/** - * Initialize as Guest - SDK in the main app, anchor to existing LogManager instance. - */ -void test_c_api_guest() +int main(int argc, char *argv[]) { -#ifdef _WIN32 - // Check if we can load the same library again. - printf("Loading ClientTelemetry implementation library (again)...\n"); - evt_load((evt_handle_t)LoadLibrary(L"ClientTelemetry.dll")); -#endif - - printf("Testing C API (guest)...\n"); - guest_handle = evt_open(guest_config); - - // Ref. https://docs.microsoft.com/en-us/windows/privacy/basic-level-windows-diagnostic-events-and-fields for description of Common Schema fields - evt_prop event[] = TELEMETRY_EVENT( - // Common Data Extensions.Envelope - reserved keywords that C API should not use. - // Alternate solution is to declare a special macro for envelope 'root' namespace props, - // such as $STR, $INT, etc. - _STR("name", "TestApp.Event.Guest"), // Represents the uniquely qualified name for the event - _STR("ver", "3.0"), // Represents the major and minor version of the extension - _STR("time", "1979-08-12"), // Represents the event date time in Coordinated Universal Time(UTC) when the event was generated on the client.This should be in ISO 8601 format - _INT("popSample", 100), // Represents the effective sample rate for this event at the time it was generated by a client - _STR("iKey", API_KEY), // Represents an ID for applications or other logical groupings of events. - _INT("flags", 0xffffffff), // Represents a collection of bits that describe how the event should be processed ... - _STR("cV", "12345"), // Represents the Correlation Vector : A single field for tracking partial order of related telemetry events across component boundaries. - // Customer Data fields go as part of userdata - _STR("strKey", "value1"), - _INT("intKey", 12345), - PII_STR("piiKey", "secret", 1), - // Part "X" demo - populating CS extension props - // Common Data Extensions.App - PII_STR("ext.app.userId", "jackfrost@microsoft.com", 1), - _STR("ext.app.ver", "1.0.0")); - - printf("evt_log(guest_handle)\n"); - evt_log(guest_handle, event); - - printf("evt_flush(guest_handle)\n"); - evt_flush(guest_handle); - - printf("evt_upload(guest_handle)\n"); - evt_upload(guest_handle); -} - -int main(int argc, char* argv[]) -{ - printf("Hello, C API... "); - - // Send events as Host - test_c_api_host(); - // Send events as Guest - test_c_api_guest(); - - // Close Host handle - printf("evt_close(host_handle)\n"); - evt_close(host_handle); - - // Close Guest handle - printf("evt_close(guest_handle)\n"); - evt_close(guest_handle); - - printf("[ DONE ]\n"); - return 0; + printf("Hello, C API!\n"); + test_c_api(); + return 0; } diff --git a/lib/api/ContextFieldsProvider.cpp b/lib/api/ContextFieldsProvider.cpp index e5792cc66..f3a922a26 100644 --- a/lib/api/ContextFieldsProvider.cpp +++ b/lib/api/ContextFieldsProvider.cpp @@ -8,8 +8,104 @@ #include "pal/PAL.hpp" #include "utils/StringUtils.hpp" +#include + namespace MAT_NS_BEGIN { + // clang-format off + /** + * This map allows to remap from canonical Common Schema JSON notation to "CommonFields" + * (ex. AppInfo.*) notation historically used by Aria v1/v2 and 1DS v3 SDKs. Field name + * reshaping is performed as follows: + * + * CS3.0/4.0 JSON notation -> Common Alias -> :CsProtocol::Record object -> CS on wire + * + * Common Alias (no reshaping) -> :CsProtocol::Record object -> CS on wire + * + * Lookup for the data transform is a hashtable-based. Performed only in case if + * customer-supplied Common Context property starts with "ext.": check 4 bytes match, + * then perform the hash map lookup: + * - If there is a match, promote to corresponding COMMONFIELDS_* name. + * - If there's no match, keep as is with its original context field name. + * This logic allows to respect both - "canonical" names and "legacy" entity names. + * + * Why do we have to support both naming conventions? It's an organizational choice whether + * to rely on 'legacy' AppInfo.*, EventInfo.*, naming (Aria-Kusto) or migrate to more modern, + * standard Common Schema notation (standalone Kusto). Organizational choice depends on + * final data storage and consumption model. From a developer perspective - the solution is + * to allow a developer to use the naming convention as they would use to query a dataset + * in Kusto or ADLS Gen2. Having 1-1 mapping between instrumentation properties and storage + * allows to resolve ambiguities and avoid confusion. + * + * For any extension that is not supported by the map below, a developer could implement + * their own custom IDecorator - to stamp a common field property at decorator-level. + */ + static const std::unordered_map kCommonSchemaToCommonFieldsMap= + { + // ext.app extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/app.html + {"ext.app.id", COMMONFIELDS_APP_ID}, + {"ext.app.ver", COMMONFIELDS_APP_VERSION}, + {"ext.app.name", COMMONFIELDS_APP_NAME}, + {"ext.app.locale", COMMONFIELDS_APP_LANGUAGE}, + // {"ext.app.asId", NOT_SUPPORTED}, + // {"ext.app.sesId", NOT_SUPPORTED}, + // {"ext.app.userId", NOT_SUPPORTED}, // use "ext.user.*id" instead + {"ext.app.expId", COMMONFIELDS_APP_EXPERIMENTIDS}, + {"ext.app.env", COMMONFIELDS_APP_ENV}, + // ext.device extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/device.html + // {"ext.device.id", NOT_SUPPORTED}, // Device g: ID can only be populated via MSAL ticket claim. + {"ext.device.deviceClass", COMMONFIELDS_DEVICE_CLASS}, + {"ext.device.make", COMMONFIELDS_DEVICE_MAKE}, + {"ext.device.model", COMMONFIELDS_DEVICE_MODEL}, + {"ext.device.localId", COMMONFIELDS_DEVICE_ID}, + // {"ext.device.auth*", NOT_SUPPORTED}, // Use IDecorator + // {"ext.device.org*", NOT_SUPPORTED}, // Use IDecorator + // ext.net extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/net.html + {"ext.net.provider", COMMONFIELDS_NETWORK_PROVIDER}, + {"ext.net.cost", COMMONFIELDS_NETWORK_COST}, + {"ext.net.type", COMMONFIELDS_NETWORK_TYPE}, + // ext.os extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/os.html + {"ext.os.name", COMMONFIELDS_OS_NAME}, + + // Special case for CS3.0 vs CS4.0: + // - ext.os.ver - exists in both - CS3.0 and CS4.0 + // - ext.os.build - exists only in CS4.0 +#if defined(HAVE_CS4) || defined(HAVE_CS4_FULL) + {"ext.os.ver", COMMONFIELDS_OS_VERSION}, + {"ext.os.build", COMMONFIELDS_OS_BUILD}, +#else + // For some historical reason, the code treated + // COMMONFIELDS_OS_BUILD as an alias for ext.os.ver. + // Keep it that way, so we don't break the contract + // for existing apps. COMMONFIELDS_OS_BUILD lands + // on extOs[0].ver anyways. Thus, we keep consistency + // for devs that use Common Schema notation. + {"ext.os.ver", COMMONFIELDS_OS_BUILD}, +#endif + //{"ext.os.locale", NOT_SUPPORTED}, // Use IDecorator + //{"ext.os.bootId", NOT_SUPPORTED}, // Use IDecorator + //{"ext.os.expId", NOT_SUPPORTED}, // Use IDecorator + // ext.user extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/user.html + // {"ext.user.id", NOT_SUPPORTED}, // User g: ID can only be populated via MSAL ticket claim. + {"ext.user.localId", COMMONFIELDS_USER_ID}, + // {"ext.user.authId", NOT_SUPPORTED}, // Use IDecorator + {"ext.user.locale", COMMONFIELDS_USER_LANGUAGE}, + // ext.loc extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/loc.html + // {"ext.loc.id", NOT_SUPPORTED}, // Use IDecorator + // {"ext.loc.country", NOT_SUPPORTED}, // Use IDecorator + {"ext.loc.tz", COMMONFIELDS_USER_TIMEZONE}, + {"ext.loc.timezone", COMMONFIELDS_USER_TIMEZONE}, // alias of 'tz' + // ext.m365 extension: + // https://1dsdocs.azurewebsites.net/schema/PartA/m365a.html + {"ext.m365a.enrolledTenantId", COMMONFIELDS_COMMERCIAL_ID } + }; + // clang-format on ContextFieldsProvider::ContextFieldsProvider() : ContextFieldsProvider(nullptr) @@ -256,12 +352,33 @@ namespace MAT_NS_BEGIN record.extOs[0].name = iter->second.as_string; } +#if defined(HAVE_CS4) || defined(HAVE_CS4_FULL) + // Straightforward implementation for CS4.0+. No quirks. + // - OS_VERSION maps to ext.os.ver field. + iter = m_commonContextFields.find(COMMONFIELDS_OS_VERSION); + if (iter != m_commonContextFields.end()) + { + record.extOs[0].ver = iter->second.as_string; + } + // - OS_BUILD maps to ext.os.build field. + iter = m_commonContextFields.find(COMMONFIELDS_OS_BUILD); + if (iter != m_commonContextFields.end()) + { + record.extOs[0].build = iter->second.as_string; + } +#else + // This is a historical quirk due to difference between CS3.0 and CS4.0 + // `ext.os.ver` exists in both schemas; but `ext.os.build` only in CS4.0 + // However, it appears like the preference in this code has been to use + // the newer Aria-style alias. Fixing this could break existing apps. + // Thus, we keep the legacy behavior untouched. iter = m_commonContextFields.find(COMMONFIELDS_OS_BUILD); if (iter != m_commonContextFields.end()) { //EventProperty prop = (*m_commonContextFieldsP)[COMMONFIELDS_OS_VERSION]; record.extOs[0].ver = iter->second.as_string; } +#endif iter = m_commonContextFields.find(COMMONFIELDS_USER_ID); if (iter != m_commonContextFields.end()) @@ -433,6 +550,19 @@ namespace MAT_NS_BEGIN void ContextFieldsProvider::SetCommonField(const std::string& name, const EventProperty& value) { LOCKGUARD(m_lock); + // Any common field that starts with "ext." prefix and exists in kCommonSchemaToCommonFieldsMap + // is considered to be a Part A extension property. Code below allows to remap from JSON CS + // notation to CommonFields, e.g. (AppInfo.*, DeviceInfo.*, etc.) notation. + if (name.rfind("ext.", 0)==0) + { + const auto it = kCommonSchemaToCommonFieldsMap.find(name); + if (it != kCommonSchemaToCommonFieldsMap.end()) + { + // Rename the key from Common Schema dotted notation to COMMONFIELDS_* alias + m_commonContextFields[it->second] = value; + return; + } + } m_commonContextFields[name] = value; } @@ -451,6 +581,20 @@ namespace MAT_NS_BEGIN } } + void ContextFieldsProvider::ClearParentContext() + { + // This method allows to disassociate from parent LogManager context due to isolation + // reasons. For example, when Guest attaches to Host LogManager, it could be configured + // to avoid capturing common context properties. Logger context on creation by default + // acquires the properties populated by its LogManager. Guest Logger context should be + // wiped clean if Guest scope has been set to none ("-"). + m_parent = nullptr; + m_commonContextFields.clear(); + m_customContextFields.clear(); + m_commonContextEventToConfigIds.clear(); + PAL::registerSemanticContext(this); + } + void ContextFieldsProvider::SetParentContext(ContextFieldsProvider* parent) { m_parent = parent; diff --git a/lib/api/ContextFieldsProvider.hpp b/lib/api/ContextFieldsProvider.hpp index 20c9bcdc9..ea9dbaa57 100644 --- a/lib/api/ContextFieldsProvider.hpp +++ b/lib/api/ContextFieldsProvider.hpp @@ -32,6 +32,8 @@ namespace MAT_NS_BEGIN virtual void SetCustomField(const std::string& name, const EventProperty& value) override; virtual void SetParentContext(ContextFieldsProvider* parent); + virtual void ClearParentContext(); + virtual void SetTicket(TicketType type, std::string const& ticketValue) override; virtual void SetEventExperimentIds(std::string const & eventName, std::string const & experimentIds) override; diff --git a/lib/api/LogManagerImpl.cpp b/lib/api/LogManagerImpl.cpp index 6a98e6406..f6e6750b4 100644 --- a/lib/api/LogManagerImpl.cpp +++ b/lib/api/LogManagerImpl.cpp @@ -623,7 +623,6 @@ namespace MAT_NS_BEGIN LOG_INFO("SetContext"); EventProperty prop(value, piiKind); m_context.SetCustomField(name, prop); - m_context.SetCustomField(name, prop); { LOCKGUARD(m_dataInspectorGuard); for(const auto& dataInspector : m_dataInspectors) diff --git a/lib/api/Logger.cpp b/lib/api/Logger.cpp index 8540d0bcf..aef35046c 100644 --- a/lib/api/Logger.cpp +++ b/lib/api/Logger.cpp @@ -230,7 +230,8 @@ namespace MAT_NS_BEGIN // Since common props would typically be populated by the root-level // LogManager instance and we are detaching from that one, we need // to populate this context with common props directly. - PAL::registerSemanticContext(&m_context); + m_context.ClearParentContext(); + return; } m_context.SetParentContext(static_cast(context)); } diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index 9ac6672bc..ef5be0358 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -228,9 +228,12 @@ evt_status_t mat_open_with_params(evt_context_t *ctx) } /** - * Marashal C struct to C++ API + * Marashal C struct to C++ API for the following methods: + * - ILogger->LogEvent(...) + * - ILogger->SetContext(...) - for each string key - prop value + * - ILogManager->SetContext(...) - for each string key - prop value */ -evt_status_t mat_log(evt_context_t *ctx) +evt_status_t mat_sendprops(evt_context_t* ctx, evt_call_t op) { VERIFY_CLIENT_HANDLE(client, ctx); @@ -286,12 +289,91 @@ evt_status_t mat_log(evt_context_t *ctx) if (logger == nullptr) { ctx->result = EFAULT; /* invalid address */ + return ctx->result; } - else + + // Enforce if scope sharing is not enabled (default). + // However, if a client / extension explicitly opts-in to append its + // context to host variables, then we respect their choice and append + // the corresponding host context values on guest events. This is + // required for the case where the app, SDK, and extension SDKs run + // within the same data silo / trust boundary, ensuring uniform and + // consistent symmetric data contract for all parties involved. + if (scope == CONTEXT_SCOPE_NONE) + { + if (op == EVT_OP_SET_LOGMANAGER_CONTEXT) + { + // We are running in isolation. It does not make sense to propagate + // the context at LogManager (parent) -level since we do not have + // ability to modify it. Downgrade to EVT_OP_SET_LOGGER_CONTEXT. + op = EVT_OP_SET_LOGGER_CONTEXT; + } + } + + // Allows to pass C API properties to ILogger or LogManager semantic context. + // Semantic context layer provides access to both - Common Fields (Part A), + // as well as Custom Fields (Part C). For C API due to performance reasons - + // the determination of what is considered Common versus Custom is done + // by checking the first 4 bytes of context property name: + // - This is in alignment with canonical Common Schema JSON notation. + // - This is much faster than validating the list of old-style COMMONFIELDS_ + // aliases. + // + // Developers can find the mapping on 1DS site or use ContextFieldProvider.cpp + // as a reference. + auto populateContext = [m](ISemanticContext& context) { - logger->SetParentContext(nullptr); + for (auto prop : m) + { + if (prop.first.rfind("ext.", 0) == 0) + { + context.SetCommonField(prop.first, prop.second); + } + else + { + context.SetCustomField(prop.first, prop.second); + } + } + }; + + switch (op) + { + // This path allows to implement common props stamping via C#->C->C++ API. + // Calls ILogger->SetContext(...) to populate the "local" current ILogger context. + case EVT_OP_SET_LOGGER_CONTEXT: + { + const auto loggerContext = logger->GetSemanticContext(); + populateContext(*loggerContext); + ctx->result = EOK; + } + break; + + // This path allows to implement common props stamping via C#->C->C++ API. + // Calls ILogManager->SetContext(...) to populate the "global" LogManager context. + case EVT_OP_SET_LOGMANAGER_CONTEXT: + { + auto& logManagerContext = client->logmanager->GetSemanticContext(); + populateContext(logManagerContext); + ctx->result = EOK; + } + break; + + // Original implementation of evt_log call remains unaltered. Note that the processing + // of Common Fields via C API could only done using: + // - set_logger_context(_s) + // - set_logmanager_context(_s) + // Practical reasons: + // - done intentionally to avoid altering behavior of legacy code. + // - Part A extension values typically remain constant for an app/user session. + case EVT_OP_LOG: logger->LogEvent(props); ctx->result = EOK; + break; + + default: + // Unsupported API. Call failed. + ctx->result = EFAULT; + break; } return ctx->result; } @@ -386,7 +468,7 @@ extern "C" { break; case EVT_OP_LOG: - result = mat_log(ctx); + result = mat_sendprops(ctx, EVT_OP_LOG); break; case EVT_OP_PAUSE: @@ -422,6 +504,22 @@ extern "C" { result = STATUS_SUCCESS; break; + // New API in v3.7.1. This does not break ABI compat from v3.7.0. + // If v3.7.0 client calls into v3.7.1 implementation, then the + // call is a noop - handled by safely returning ENOTSUP. + // No new structs, no struct layout changes. + case EVT_OP_SET_LOGGER_CONTEXT: + result = mat_sendprops(ctx, EVT_OP_SET_LOGGER_CONTEXT); + break; + + // New API in v3.7.1. This does not break ABI compat from v3.7.0. + // If v3.7.0 client calls into v3.7.1 implementation, then the + // call is a noop - handled by safely returning ENOTSUP. + // No new structs, no struct layout changes. + case EVT_OP_SET_LOGMANAGER_CONTEXT: + result = mat_sendprops(ctx, EVT_OP_SET_LOGMANAGER_CONTEXT); + break; + // Add more OPs here default: diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index a633b1b89..b669e413e 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -9,7 +9,7 @@ * For version handshake check there is no mandatory requirement to update the $PATCH level. * Ref. https://semver.org/ for Semantic Versioning documentation. */ -#define TELEMETRY_EVENTS_VERSION "3.7.0" +#define TELEMETRY_EVENTS_VERSION "3.7.1" #include "ctmacros.hpp" @@ -59,7 +59,17 @@ extern "C" { EVT_OP_FLUSH = 0x0000000A, EVT_OP_VERSION = 0x0000000B, EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, - EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1, + /** + * Context operations allow to set ILogger or ILogManager semantic context values. + * In addition to custom Part C context values, Common Schema attributes, e.g. `ext.device.id` + * or `ext.app.name` - Part A values are respected and applied using corresponding + * ISemanticContext API call. This approach allows to express most Common Schema + * event fields to C API for extensions, SDK-in-SDK, and higher-level programming + * languages such as Unity C# and .NET Standard. + */ + EVT_OP_SET_LOGGER_CONTEXT = 0x0000000D, + EVT_OP_SET_LOGMANAGER_CONTEXT = 0x0000000E, + EVT_OP_MAX = EVT_OP_SET_LOGMANAGER_CONTEXT + 1, EVT_OP_MAXINT = 0xFFFFFFFF } evt_call_t; @@ -491,17 +501,22 @@ MATSDK_PACK_POP /** * - * Logs a telemetry event (security-enhanced _s function) + * Sends a collection of telemetry event properties (security-enhanced _s function). + * This is internal API used by other functions: + * - evt_log_s - calls ILogger->LogEvent(props) + * - evt_set_logger_context_s - sets ILogger semantic context values + * - evt_set_logmanager_context_s - sets ILogManager semantic context values * * SDK handle. + * Code of event properties operation. * Number of event properties in array. * Event properties array. * */ - static inline evt_status_t evt_log_s(evt_handle_t handle, uint32_t size, evt_prop* evt) + static inline evt_status_t evt_sendprops_s(evt_handle_t handle, evt_call_t op, uint32_t size, evt_prop* evt) { evt_context_t ctx; - ctx.call = EVT_OP_LOG; + ctx.call = op; ctx.handle = handle; ctx.data = (void *)evt; ctx.size = size; @@ -510,24 +525,113 @@ MATSDK_PACK_POP /** * - * Logs a telemetry event. - * Last item in evt_prop array must be { .name = NULL, .type = TYPE_NULL } + * Sends a collection of telemetry event properties. + * This is internal function used by other functions: + * - evt_log - calls ILogger->LogEvent(props) + * - evt_set_logger_context - sets ILogger semantic context values + * - evt_set_logmanager_context - sets ILogManager semantic context values * * SDK handle. - * Number of event properties in array. + * Code of event properties operation. * Event properties array. * */ - static inline evt_status_t evt_log(evt_handle_t handle, evt_prop* evt) + static inline evt_status_t evt_sendprops(evt_handle_t handle, evt_call_t op, evt_prop* evt) { evt_context_t ctx; - ctx.call = EVT_OP_LOG; + ctx.call = op; ctx.handle = handle; ctx.data = (void *)evt; ctx.size = 0; return evt_api_call(&ctx); } + /** + * + * Logs a telemetry event (security-enhanced _s function) + * + * SDK handle. + * Number of event properties in array. + * Event properties array. + * + */ + static inline evt_status_t evt_log_s(evt_handle_t handle, uint32_t size, evt_prop* evt) + { + return evt_sendprops_s(handle, EVT_OP_LOG, size, evt); + } + + /** + * + * Logs a telemetry event. + * Last item in evt_prop array must be { .name = NULL, .type = TYPE_NULL } + * + * SDK handle. + * Event properties array. + * + */ + static inline evt_status_t evt_log(evt_handle_t handle, evt_prop* evt) + { + return evt_sendprops(handle, EVT_OP_LOG, evt); + } + + /** + * + * Sets ILogger semantic context using a collection of properties (security-enhanced _s function) + * + * SDK handle. + * Number of event properties in array. + * Event properties array. + * + */ + static inline evt_status_t evt_set_logger_context_s(evt_handle_t handle, uint32_t size, evt_prop* evt) + { + return evt_sendprops_s(handle, EVT_OP_SET_LOGGER_CONTEXT, size, evt); + } + + /** + * + * Sets ILogger semantic context using a collection of properties. + * Last item in evt_prop array must be { .name = NULL, .type = TYPE_NULL } + * + * SDK handle. + * Number of event properties in array. + * Event properties array. + * + */ + static inline evt_status_t evt_set_logger_context(evt_handle_t handle, evt_prop* evt) + { + return evt_sendprops(handle, EVT_OP_SET_LOGGER_CONTEXT, evt); + } + + /** + * + * Sets ILogManager semantic context using a collection of properties (security-enhanced _s function) + * + * SDK handle. + * Number of event properties in array. + * Event properties array. + * + */ + static inline evt_status_t evt_set_logmanager_context_s(evt_handle_t handle, uint32_t size, evt_prop* evt) + { + return evt_sendprops_s(handle, EVT_OP_SET_LOGMANAGER_CONTEXT, size, evt); + } + + /** + * + * Sets ILogManager semantic context using a collection of properties. + * Last item in evt_prop array must be { .name = NULL, .type = TYPE_NULL } + * + * SDK handle. + * Number of event properties in array. + * Event properties array. + * + */ + static inline evt_status_t evt_set_logmanager_context(evt_handle_t handle, evt_prop* evt) + { + return evt_sendprops(handle, EVT_OP_SET_LOGMANAGER_CONTEXT, evt); + } + /* This macro automagically calculates the array size and passes it down to evt_log_s. * Developers don't have to calculate the number of event properties passed down to *'Log Event' API call utilizing the concept of Secure Template Overloads: diff --git a/tests/functests/BasicFuncTests.cpp b/tests/functests/BasicFuncTests.cpp index 8225edd61..08c073ba8 100644 --- a/tests/functests/BasicFuncTests.cpp +++ b/tests/functests/BasicFuncTests.cpp @@ -181,7 +181,7 @@ class BasicFuncTests : public ::testing::Test, std::remove(fileName.c_str()); } - virtual void Initialize() + virtual void Initialize(bool statsOff = false) /* stats are flaky because event is exceeding ingestion capacity */ { receivedRequests.clear(); auto configuration = LogManager::GetLogConfiguration(); @@ -199,7 +199,8 @@ class BasicFuncTests : public ::testing::Test, configuration[CFG_INT_MAX_TEARDOWN_TIME] = 2; // 2 seconds wait on shutdown configuration[CFG_STR_COLLECTOR_URL] = serverAddress.c_str(); configuration[CFG_MAP_HTTP][CFG_BOOL_HTTP_COMPRESSION] = false; // disable compression for now - configuration[CFG_MAP_METASTATS_CONFIG][CFG_INT_METASTATS_INTERVAL] = 30 * 60; // 30 mins + int64_t statsInterval = (statsOff) ? 0 : 30 * 60; // 30 mins; + configuration[CFG_MAP_METASTATS_CONFIG][CFG_INT_METASTATS_INTERVAL] = statsInterval; configuration["name"] = __FILE__; configuration["version"] = "1.0.0"; @@ -763,7 +764,7 @@ TEST_F(BasicFuncTests, restartRecoversEventsFromStorage) { { CleanStorage(); - Initialize(); + Initialize(true); // This code is a bit racy because ResumeTransmission is done in Initialize LogManager::PauseTransmission(); EventProperties event1("first_event"); @@ -780,7 +781,7 @@ TEST_F(BasicFuncTests, restartRecoversEventsFromStorage) } { - Initialize(); + Initialize(true); EventProperties fooEvent("fooEvent"); fooEvent.SetLatency(EventLatency_RealTime); fooEvent.SetPersistence(EventPersistence_Critical); @@ -788,7 +789,7 @@ TEST_F(BasicFuncTests, restartRecoversEventsFromStorage) LogManager::UploadNow(); // 1st request for realtime event - waitForEvents(3, 5); // start, first_event, second_event, ongoing, stop, start, fooEvent + waitForEvents(3, 3); // first_event, second_event, fooEvent // we drop two of the events during pause, though. EXPECT_GE(receivedRequests.size(), (size_t)1); if (receivedRequests.size() != 0) diff --git a/tests/functests/CMakeLists.txt b/tests/functests/CMakeLists.txt index ba0e524e7..c6e9059a5 100644 --- a/tests/functests/CMakeLists.txt +++ b/tests/functests/CMakeLists.txt @@ -2,6 +2,7 @@ message("--- functests") set(SRCS APITest.cpp + HostGuestTests.cpp BasicFuncTests.cpp LogSessionDataFuncTests.cpp Main.cpp diff --git a/tests/functests/FuncTests.vcxproj b/tests/functests/FuncTests.vcxproj index 79d3f97c0..1acaf5f72 100644 --- a/tests/functests/FuncTests.vcxproj +++ b/tests/functests/FuncTests.vcxproj @@ -418,6 +418,7 @@ + @@ -461,4 +462,4 @@ - + \ No newline at end of file diff --git a/tests/functests/FuncTests.vcxproj.filters b/tests/functests/FuncTests.vcxproj.filters index a6aee552b..cdc49850c 100644 --- a/tests/functests/FuncTests.vcxproj.filters +++ b/tests/functests/FuncTests.vcxproj.filters @@ -11,6 +11,7 @@ common + @@ -22,7 +23,7 @@ - + diff --git a/tests/functests/HostGuestTests.cpp b/tests/functests/HostGuestTests.cpp new file mode 100644 index 000000000..f35be87ce --- /dev/null +++ b/tests/functests/HostGuestTests.cpp @@ -0,0 +1,602 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +// +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "mat/config.h" + +#ifdef _MSC_VER +#pragma warning(disable : 4389) +#endif + +#include "CsProtocol_types.hpp" +#include "common/Common.hpp" + +#include +#include +#include + +#include "PayloadDecoder.hpp" + +#include "IDecorator.hpp" +#include "mat.h" + +#ifdef HAVE_MAT_JSONHPP +#include "json.hpp" +#endif + +#include + +using namespace MAT; + +// Allows to dump test events in their perfect Common Schema shape. +// #define ALLOW_RECORD_DECODER + +// 1DSCppSdkTest sandbox key +#define TEST_TOKEN "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991" +#define DUMMY_TOKEN "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-ffff" + +#define EVENT_NAME_HOST "Event.Name.Host" +#define EVENT_NAME_GUEST "Event.Name.Guest" + +#define JSON_CONFIG(...) #__VA_ARGS__ + +class TestDebugEventListener : public DebugEventListener +{ + public: + std::atomic netChanged; + std::atomic eps; + std::atomic numLogged0; + std::atomic numLogged; + std::atomic numSent; + std::atomic numDropped; + std::atomic numReject; + std::atomic numHttpError; + std::atomic numHttpOK; + std::atomic numCached; + std::atomic numFiltered; + std::atomic logLatMin; + std::atomic logLatMax; + std::atomic storageFullPct; + std::atomic storageFailed; + + std::function OnLogX; + + TestDebugEventListener() : + netChanged(false), + eps(0), + numLogged0(0), + numLogged(0), + numSent(0), + numDropped(0), + numReject(0), + numHttpError(0), + numHttpOK(0), + numCached(0), + numFiltered(0), + logLatMin(100), + logLatMax(0), + storageFullPct(0), + storageFailed(false) + { + resetOnLogX(); + } + + void reset() + { + netChanged = false; + eps = 0; + numLogged0 = 0; + numLogged = 0; + numSent = 0; + numDropped = 0; + numReject = 0; + numHttpError = 0; + numHttpOK = 0; + numCached = 0; + numFiltered = 0; + logLatMin = 100; + logLatMax = 0; + storageFullPct = 0; + storageFailed = false; + resetOnLogX(); + } + + virtual void OnLogXDefault(::CsProtocol::Record&){ + + }; + + void resetOnLogX() + { + OnLogX = [this](::CsProtocol::Record& record) + { + OnLogXDefault(record); + }; + } + + virtual void OnDebugEvent(DebugEvent& evt) + { + switch (evt.type) + { + case EVT_LOG_EVENT: + case EVT_LOG_LIFECYCLE: + case EVT_LOG_FAILURE: + case EVT_LOG_PAGEVIEW: + case EVT_LOG_PAGEACTION: + case EVT_LOG_SAMPLEMETR: + case EVT_LOG_AGGRMETR: + case EVT_LOG_TRACE: + case EVT_LOG_USERSTATE: + case EVT_LOG_SESSION: + { + /* Test-only code */ + ::CsProtocol::Record& record = *static_cast<::CsProtocol::Record*>(evt.data); + numLogged++; + OnLogX(record); + } + break; + + case EVT_REJECTED: + numReject++; + break; + + case EVT_ADDED: + break; + + /* Event counts below would never overflow the size of unsigned int */ + case EVT_CACHED: + numCached += (unsigned int)evt.param1; + break; + + case EVT_DROPPED: + numDropped += (unsigned int)evt.param1; + break; + + case EVT_SENT: + numSent += (unsigned int)evt.param1; + break; + + case EVT_STORAGE_FULL: + storageFullPct = (unsigned int)evt.param1; + break; + + case EVT_STORAGE_FAILED: + storageFailed = true; + break; + + case EVT_CONN_FAILURE: + case EVT_HTTP_FAILURE: + case EVT_COMPRESS_FAILED: + case EVT_UNKNOWN_HOST: + case EVT_SEND_FAILED: + + case EVT_HTTP_ERROR: + numHttpError++; + break; + + case EVT_HTTP_OK: + numHttpOK++; + break; + case EVT_FILTERED: + numFiltered++; + break; + + case EVT_SEND_RETRY: + case EVT_SEND_RETRY_DROPPED: + break; + + case EVT_NET_CHANGED: + netChanged = true; + break; + + case EVT_UNKNOWN: + default: + break; + }; + }; + + void printStats() + { + std::cerr << "[ ] netChanged = " << netChanged << std::endl; + std::cerr << "[ ] numLogged0 = " << numLogged0 << std::endl; + std::cerr << "[ ] numLogged = " << numLogged << std::endl; + std::cerr << "[ ] numSent = " << numSent << std::endl; + std::cerr << "[ ] numDropped = " << numDropped << std::endl; + std::cerr << "[ ] numReject = " << numReject << std::endl; + std::cerr << "[ ] numCached = " << numCached << std::endl; + std::cerr << "[ ] numFiltered = " << numFiltered << std::endl; + } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +TestDebugEventListener debugListener; + +const int maxEventsCount = 1; + +unsigned totalEvents = 0; + +const char* hostConfig = JSON_CONFIG( + { + "cacheFilePath" : "MyOfflineStorage.db", + "config" : { + "host" : "C-API-Host", + "scope" : "*" + }, + "stats" : { + "interval" : 0 + }, + "name" : "C-API-Host", + "version" : "1.0.0", + "primaryToken" : "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991", + "maxTeardownUploadTimeInSec" : 0, + "hostMode" : true, + "minimumTraceLevel" : 0, + "sdkmode" : 0 + }); + +const char* guestConfig = JSON_CONFIG( + { + "cacheFilePath" : "MyOfflineStorage.db", + "config" : { + "host" : "*", + "scope" : "*" + }, + "stats" : { + "interval" : 0 + }, + "name" : "C-API-Guest", + "version" : "1.0.0", + "primaryToken" : "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991", + "maxTeardownUploadTimeInSec" : 0, + "hostMode" : false, + "minimumTraceLevel" : 0, + "sdkmode" : 0 + }); + +const char* guestConfigIsolation = JSON_CONFIG( + { + "cacheFilePath" : "MyOfflineStorage2.db", + "config" : { + "host" : "*", + "scope" : "-" + }, + "stats" : { + "interval" : 0 + }, + "name" : "C-API-GuestIsolated", + "version" : "1.0.0", + "primaryToken" : "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-ffff", + "maxTeardownUploadTimeInSec" : 0, + "hostMode" : false, + "minimumTraceLevel" : 0, + "sdkmode" : 0 + }); + +std::time_t now = time(0); + +MAT::time_ticks_t ticks(&now); + +evt_handle_t hostHandle = 0; + +evt_prop hostContext[] = TELEMETRY_EVENT( + _STR("ext.device.localId", "a:4318b22fbc11ca8f"), + _STR("ext.device.make", "Microsoft"), + _STR("ext.device.model", "Clippy"), + _STR("ext.os.name", "MS-DOS"), + _STR("ext.os.ver", "2100")); + +evt_prop hostEvent[] = TELEMETRY_EVENT( + // Part A/B + _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_HOST), // Event name + _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time + _DBL("popSample", 100.0), // Effective sample rate + _STR(COMMONFIELDS_IKEY, TEST_TOKEN), // iKey to send this event to + _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), + _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), + // Part C + _STR("strKey", "value1"), + _INT("intKey", 12345), + _DBL("dblKey", 3.14), + _BOOL("boolKey", true), + _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f00}"), + _TIME("timeKey", ticks.ticks)); // .NET ticks + +evt_prop guestContext[] = TELEMETRY_EVENT( + _STR("ext.app.id", "com.Microsoft.Clippy"), + _STR("ext.app.ver", "1.0.0"), + _STR("ext.app.locale", "en-US"), + _STR("ext.net.cost", "Unmetered"), + _STR("ext.net.type", "QuantumLeap")); + +// C-style definition of a guest event that contains iKey +evt_prop guestEvent[] = TELEMETRY_EVENT( + // Part A/B + _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_GUEST), // Event name + _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time + _DBL("popSample", 100.0), // Effective sample rate + _STR(COMMONFIELDS_IKEY, TEST_TOKEN), // iKey to send this event to + _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), + _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), + // Part C + _STR("strKey", "value1"), + _INT("intKey", 12345), + _DBL("dblKey", 3.14), + _BOOL("boolKey", true), + _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f00}"), + _TIME("timeKey", ticks.ticks)); // .NET ticks + +// C-style definition of a guest event that uses its client instance iKey +evt_prop guestEventIsolated[] = TELEMETRY_EVENT( + // Part A/B + _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_GUEST), // Event name + _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time + _DBL("popSample", 100.0), // Effective sample rate + _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), + _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), + // Part C + _STR("strKey", "value1"), + _INT("intKey", 12345), + _DBL("dblKey", 3.14), + _BOOL("boolKey", true), + _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f00}"), + _TIME("timeKey", ticks.ticks)); // .NET ticks + +////////////////////////////////////////////////////////////////////////////////////////// +// HOST TEST +////////////////////////////////////////////////////////////////////////////////////////// +void createHost() +{ + totalEvents = 0; + debugListener.OnLogX = [&](::CsProtocol::Record& record) + { + totalEvents++; + EXPECT_EQ(record.name, EVENT_NAME_HOST); // Verify event name + auto recordTimeTicks = MAT::time_ticks_t(record.time); // Verify event time + EXPECT_EQ(record.time, int64_t(recordTimeTicks.ticks)); + std::string iToken_o = "o:"; + iToken_o += TEST_TOKEN; + EXPECT_THAT(iToken_o, testing::HasSubstr(record.iKey)); // Verify event iKey + ASSERT_STREQ(record.data[0].properties["strKey"].stringValue.c_str(), "value1"); // Verify string + ASSERT_EQ(record.data[0].properties["intKey"].longValue, 12345); // Verify integer + ASSERT_EQ(record.data[0].properties["dblKey"].doubleValue, 3.14); // Verify double + ASSERT_EQ(record.data[0].properties["boolKey"].longValue, 1); // Verify boolean + auto guid = record.data[0].properties["guidKey"].guidValue[0].data(); + auto guidStr = GUID_t(guid).to_string(); + std::string guidStr2 = "01020304-0506-0708-090a-0b0c0d0e0f00"; + ASSERT_STRCASEEQ(guidStr.c_str(), guidStr2.c_str()); // Verify GUID + ASSERT_EQ(record.data[0].properties["timeKey"].longValue, (int64_t)ticks.ticks); // Verify time + + ASSERT_EQ(record.extDevice[0].localId, "a:4318b22fbc11ca8f"); // Verify ext.device.localId + ASSERT_EQ(record.extProtocol[0].devMake, "Microsoft"); // NOTE the schema quirk == ext.device.make + ASSERT_EQ(record.extProtocol[0].devModel, "Clippy"); // NOTE the schema quirk == ext.device.model + ASSERT_EQ(record.extOs[0].name, "MS-DOS"); // Verify ext.os.name + ASSERT_EQ(record.extOs[0].ver, "2100"); // Verify ext.os.ver +#ifdef ALLOW_RECORD_DECODER + // Transform to JSON and print + std::string s; + exporters::DecodeRecord(record, s); + printf( + "*************************************** Event %u ***************************************\n%s\n", + totalEvents, + s.c_str()); +#endif + }; + + hostHandle = evt_open(hostConfig); + ASSERT_NE(hostHandle, 0); + evt_pause(hostHandle); + // Use self (LogManager) context to append additional context variables. + evt_set_logmanager_context(hostHandle, hostContext); + + const auto client = capi_get_client(hostHandle); + ASSERT_NE(client, nullptr); + ASSERT_NE(client->logmanager, nullptr); + + // Bind from C API LogManager instance to C++ DebugEventListener + // to verify event contents. Currently we do not support registering + // debug callbacks via C API, so we obtain the ILogManager first, + // then register event listener on it. + client->logmanager->AddEventListener(EVT_LOG_EVENT, debugListener); + + for (size_t i = 0; i < maxEventsCount; i++) + { + evt_log(hostHandle, hostEvent); + } + + EXPECT_EQ(totalEvents, maxEventsCount); + evt_flush(hostHandle); + + // Remove debug listener + client->logmanager->RemoveEventListener(EVT_LOG_EVENT, debugListener); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// GUEST TEST +////////////////////////////////////////////////////////////////////////////////////////// +void createGuest() +{ + totalEvents = 0; + debugListener.OnLogX = [&](::CsProtocol::Record& record) + { + totalEvents++; + EXPECT_EQ(record.name, EVENT_NAME_GUEST); // Verify event name + auto recordTimeTicks = MAT::time_ticks_t(record.time); // Verify event time + EXPECT_EQ(record.time, int64_t(recordTimeTicks.ticks)); + + ASSERT_STREQ(record.data[0].properties["strKey"].stringValue.c_str(), "value1"); // Verify string + ASSERT_EQ(record.data[0].properties["intKey"].longValue, 12345); // Verify integer + ASSERT_EQ(record.data[0].properties["dblKey"].doubleValue, 3.14); // Verify double + ASSERT_EQ(record.data[0].properties["boolKey"].longValue, 1); // Verify boolean + auto guid = record.data[0].properties["guidKey"].guidValue[0].data(); + auto guidStr = GUID_t(guid).to_string(); + std::string guidStr2 = "01020304-0506-0708-090a-0b0c0d0e0f00"; + ASSERT_STRCASEEQ(guidStr.c_str(), guidStr2.c_str()); // Verify GUID + ASSERT_EQ(record.data[0].properties["timeKey"].longValue, (int64_t)ticks.ticks); // Verify time + + // Host context properties must remain the same + ASSERT_EQ(record.extDevice[0].localId, "a:4318b22fbc11ca8f"); // Verify ext.device.localId + ASSERT_EQ(record.extProtocol[0].devMake, "Microsoft"); // NOTE the schema quirk == ext.device.make + ASSERT_EQ(record.extProtocol[0].devModel, "Clippy"); // NOTE the schema quirk == ext.device.model + ASSERT_EQ(record.extOs[0].name, "MS-DOS"); // Verify ext.os.name + ASSERT_EQ(record.extOs[0].ver, "2100"); // Verify ext.os.ver + + // These new properties got appended by Guest + ASSERT_EQ(record.extApp[0].id, "com.Microsoft.Clippy"); // Verify ext.app.id + ASSERT_EQ(record.extApp[0].ver, "1.0.0"); // Verify ext.app.ver + ASSERT_EQ(record.extApp[0].locale, "en-US"); // Verify ext.app.locale + ASSERT_EQ(record.extNet[0].cost, "Unmetered"); // Verify ext.net.cost + ASSERT_EQ(record.extNet[0].type, "QuantumLeap"); // Verify ext.net.type +#ifdef ALLOW_RECORD_DECODER + // Transform to JSON and print + std::string s; + exporters::DecodeRecord(record, s); + printf( + "*************************************** Event %u ***************************************\n%s\n", + totalEvents, + s.c_str()); +#endif + }; + + // Keep host LogManager running and attach Guest to it. + const auto guestHandle = evt_open(guestConfig); + ASSERT_NE(guestHandle, 0); + evt_pause(guestHandle); + const auto client = capi_get_client(guestHandle); + ASSERT_NE(client, nullptr); + ASSERT_NE(client->logmanager, nullptr); + + // Use parent LogManager context to append additional context variables. + evt_set_logmanager_context(guestHandle, guestContext); + + client->logmanager->AddEventListener(EVT_LOG_EVENT, debugListener); + + for (size_t i = 0; i < maxEventsCount; i++) + { + evt_log(guestHandle, guestEvent); + } + + EXPECT_EQ(totalEvents, maxEventsCount); + evt_flush(guestHandle); + + // Remove debug listener + client->logmanager->RemoveEventListener(EVT_LOG_EVENT, debugListener); + + // Close guest + evt_close(guestHandle); + ASSERT_EQ(capi_get_client(guestHandle), nullptr); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// GUEST TEST ISOLATED +////////////////////////////////////////////////////////////////////////////////////////// +void createGuestIsolated() +{ + // Reset total events + totalEvents = 0; + debugListener.OnLogX = [&](::CsProtocol::Record& record) + { + totalEvents++; + EXPECT_EQ(record.name, EVENT_NAME_GUEST); // Verify event name + auto recordTimeTicks = MAT::time_ticks_t(record.time); // Verify event time + EXPECT_EQ(record.time, int64_t(recordTimeTicks.ticks)); + std::string iToken_o = "o:"; + iToken_o += DUMMY_TOKEN; + EXPECT_THAT(iToken_o, testing::HasSubstr(record.iKey)); // Verify event iKey + ASSERT_STREQ(record.data[0].properties["strKey"].stringValue.c_str(), "value1"); // Verify string + ASSERT_EQ(record.data[0].properties["intKey"].longValue, 12345); // Verify integer + ASSERT_EQ(record.data[0].properties["dblKey"].doubleValue, 3.14); // Verify double + ASSERT_EQ(record.data[0].properties["boolKey"].longValue, 1); // Verify boolean + auto guid = record.data[0].properties["guidKey"].guidValue[0].data(); + auto guidStr = GUID_t(guid).to_string(); + std::string guidStr2 = "01020304-0506-0708-090a-0b0c0d0e0f00"; + ASSERT_STRCASEEQ(guidStr.c_str(), guidStr2.c_str()); // Verify GUID + ASSERT_EQ(record.data[0].properties["timeKey"].longValue, (int64_t)ticks.ticks); // Verify time + + // Host context properties are NOT shared this time. We run in isolation. + ASSERT_NE(record.extDevice[0].localId, "a:4318b22fbc11ca8f"); // Verify ext.device.localId + ASSERT_NE(record.extProtocol[0].devMake, "Microsoft"); // NOTE the schema quirk == ext.device.make + ASSERT_NE(record.extProtocol[0].devModel, "Clippy"); // NOTE the schema quirk == ext.device.model + ASSERT_NE(record.extOs[0].name, "MS-DOS"); // Verify ext.os.name + ASSERT_NE(record.extOs[0].ver, "2100"); // Verify ext.os.ver + + // These new properties got appended by Guest + ASSERT_EQ(record.extApp[0].id, "com.Microsoft.Clippy"); // Verify ext.app.id + ASSERT_EQ(record.extApp[0].ver, "1.0.0"); // Verify ext.app.ver + ASSERT_EQ(record.extApp[0].locale, "en-US"); // Verify ext.app.locale + ASSERT_EQ(record.extNet[0].cost, "Unmetered"); // Verify ext.net.cost + ASSERT_EQ(record.extNet[0].type, "QuantumLeap"); // Verify ext.net.type +#ifdef ALLOW_RECORD_DECODER + // Transform to JSON and print + std::string s; + exporters::DecodeRecord(record, s); + printf( + "*************************************** Event %u ***************************************\n%s\n", + totalEvents, + s.c_str()); +#endif + }; + + // Keep host LogManager running and attach Guest to it. + const auto guestHandle = evt_open(guestConfigIsolation); + ASSERT_NE(guestHandle, 0); + evt_pause(guestHandle); + const auto client = capi_get_client(guestHandle); + ASSERT_NE(client, nullptr); + ASSERT_NE(client->logmanager, nullptr); + + // Guest uses its own context and not the parent context. + evt_set_logger_context(guestHandle, guestContext); + + client->logmanager->AddEventListener(EVT_LOG_EVENT, debugListener); + + for (size_t i = 0; i < maxEventsCount; i++) + { + evt_log(guestHandle, guestEventIsolated); + } + + EXPECT_EQ(totalEvents, maxEventsCount); + evt_flush(guestHandle); + + // Remove debug listener + client->logmanager->RemoveEventListener(EVT_LOG_EVENT, debugListener); + + // Close guest + evt_close(guestHandle); + ASSERT_EQ(capi_get_client(guestHandle), nullptr); + ////////////////////////////////////////////////////////////////////////////////////////// +} + +TEST(HostGuestTest, C_API_CreateHost) +{ + hostHandle = 0; + createHost(); + evt_close(hostHandle); + ASSERT_EQ(capi_get_client(hostHandle), nullptr); +} + +TEST(HostGuestTest, C_API_CreateGuest) +{ + hostHandle = 0; + createHost(); + createGuest(); + evt_close(hostHandle); + ASSERT_EQ(capi_get_client(hostHandle), nullptr); +} + +TEST(HostGuestTest, C_API_CreateGuestIsolated) +{ + hostHandle = 0; + createHost(); + createGuestIsolated(); + evt_close(hostHandle); + ASSERT_EQ(capi_get_client(hostHandle), nullptr); +} + +// TEST_PULL_ME_IN(HostGuestTests) diff --git a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj index 7cec61a69..cfcb24ad1 100644 --- a/tests/googletest/googlemock/msvc/2015/gmock.vcxproj +++ b/tests/googletest/googlemock/msvc/2015/gmock.vcxproj @@ -212,4 +212,4 @@ - \ No newline at end of file + diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj b/tests/googletest/googletest/msvc/gtest.vcxproj index 7f25372d5..7112ed0f6 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj +++ b/tests/googletest/googletest/msvc/gtest.vcxproj @@ -215,4 +215,4 @@ - \ No newline at end of file + diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj.filters b/tests/googletest/googletest/msvc/gtest.vcxproj.filters index 93188ad16..cdbfc123e 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj.filters +++ b/tests/googletest/googletest/msvc/gtest.vcxproj.filters @@ -11,6 +11,8 @@ - + + Source Files + \ No newline at end of file diff --git a/tools/RunMsBuild.bat b/tools/RunMsBuild.bat index 9a9814f6f..38bab739c 100644 --- a/tools/RunMsBuild.bat +++ b/tools/RunMsBuild.bat @@ -14,9 +14,6 @@ echo %CUSTOM_PROPS% call tools\vcvars.cmd -REM nuget restore .\Solutions\win10-lib\packages.config -PackagesDirectory .\Solutions\packages -REM nuget restore .\Solutions\win10-dll\packages.config -PackagesDirectory .\Solutions\packages - set MAXCPUCOUNT=%NUMBER_OF_PROCESSORS% set platform= set SOLUTION=Solutions\MSTelemetrySDK.sln diff --git a/wrappers/netcore/EventNativeAPI.cs b/wrappers/netcore/EventNativeAPI.cs deleted file mode 100644 index 36b47725c..000000000 --- a/wrappers/netcore/EventNativeAPI.cs +++ /dev/null @@ -1,640 +0,0 @@ -#pragma warning disable IDE1006 // ignore naming rule violations: we preserve original C API naming for clarity here -#pragma warning disable IDE0044 // ignore readonly suggestion for field passed over P/Invoke -#undef TRACE // Comment this line to enable additional diagnostics to be printed to console - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Text; - -namespace Microsoft -{ - namespace Telemetry - { - namespace Core - { - - public class Handles - { - /// - /// Handles.InvalidHandle is returned if API call fails. - /// - public const ulong InvalidHandle = ulong.MaxValue; - } - - public class Constants - { - public const string LIBRARY_NAME = "ClientTelemetry"; - - public const string VERSION = "3.7.0-netcore"; - public const string ENTRYPOINT = "evt_api_call_default"; - } - - enum EventCallType : UInt32 - { - EVT_OP_LOAD = 0x00000001, - EVT_OP_UNLOAD = 0x00000002, - EVT_OP_OPEN = 0x00000003, - EVT_OP_CLOSE = 0x00000004, - EVT_OP_CONFIG = 0x00000005, - EVT_OP_LOG = 0x00000006, - EVT_OP_PAUSE = 0x00000007, - EVT_OP_RESUME = 0x00000008, - EVT_OP_UPLOAD = 0x00000009, - EVT_OP_FLUSH = 0x0000000A, - EVT_OP_VERSION = 0x0000000B, - EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, - EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 - } - - enum EventPropertyType : UInt32 - { - /* Basic types */ - TYPE_STRING = 0, - TYPE_INT64 = 1, - TYPE_DOUBLE = 2, - TYPE_TIME = 3, /* not implemented yet */ - TYPE_BOOLEAN = 4, - TYPE_GUID = 5, /* converted to string */ - /* Arrays of basic types */ - TYPE_STRING_ARRAY = 6, - TYPE_INT64_ARRAY = 7, - TYPE_DOUBLE_ARRAY = 8, - TYPE_TIME_ARRAY = 9, - TYPE_BOOL_ARRAY = 10, - TYPE_GUID_ARRAY = 11, - /* NULL-type */ - TYPE_NULL = 12 - } - - public struct PiiKind - { - /// No PII kind. - public const int None = 0; - /// An LDAP distinguished name. - public const int DistinguishedName = 1; - /// Generic data. - public const int GenericData = 2; - /// An IPV4 Internet address. - public const int IPv4Address = 3; - /// An IPV6 Internet address. - public const int IPv6Address = 4; - /// An e-mail subject. - public const int MailSubject = 5; - /// A telephone number. - public const int PhoneNumber = 6; - /// A query string. - public const int QueryString = 7; - /// A SIP address - public const int SipAddress = 8; - /// An e-mail address. - public const int SmtpAddress = 9; - /// An identity. - public const int Identity = 10; - /// A uniform resource indicator. - public const int Uri = 11; - /// A fully-qualified domain name. - public const int Fqdn = 12; - /// A legacy IPV4 Internet address. - public const int IPv4AddressLegacy = 13; - public const int CustomerData = 32; - } - - [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)] - unsafe struct EventGUIDType - { - /** - * - * Specifies the first eight hexadecimal digits of the GUID. - * - */ - [FieldOffset(0)] UInt32 Data1; - - /* - * Specifies the first group of four hexadecimal digits. - * - */ - [FieldOffset(4)] UInt16 Data2; - - /** - * - * Specifies the second group of four hexadecimal digits. - * - */ - [FieldOffset(6)] UInt16 Data3; - - /** - * An array of eight bytes. - * The first two bytes contain the third group of four hexadecimal digits. - * The remaining six bytes contain the final 12 hexadecimal digits. - * - */ - [FieldOffset(8)] - fixed byte Data4[8]; - } - - [StructLayout(LayoutKind.Explicit, Size = 28, CharSet = CharSet.Ansi)] - unsafe struct EventContextType - { - [FieldOffset(0)] public UInt32 call; - [FieldOffset(4)] public ulong handle; - [FieldOffset(12)] public IntPtr data; - [FieldOffset(20)] public UInt32 result; - [FieldOffset(24)] public UInt32 size; - } - - enum EventOpenParamType - { - OPEN_PARAM_TYPE_HTTP_HANDLER_SEND = 0, - OPEN_PARAM_TYPE_HTTP_HANDLER_CANCEL = 1, - OPEN_PARAM_TYPE_TASK_DISPATCHER_QUEUE = 2, - OPEN_PARAM_TYPE_TASK_DISPATCHER_CANCEL = 3, - OPEN_PARAM_TYPE_TASK_DISPATCHER_JOIN = 4 - } - - [StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] - unsafe struct EventOpenParam - { - [FieldOffset(0)] public UInt32 type; - [FieldOffset(4)] public IntPtr data; - }; - - [StructLayout(LayoutKind.Explicit, Size = 8, CharSet = CharSet.Ansi)] - unsafe struct EventPropertyValue - { - /* Basic types */ - [FieldOffset(0)] public UInt64 as_uint64; - [FieldOffset(0)] public IntPtr as_string; - [FieldOffset(0)] public Int64 as_int64; - [FieldOffset(0)] public double as_double; - [FieldOffset(0)] public bool as_bool; - [FieldOffset(0)] public IntPtr as_guid; - [FieldOffset(0)] public UInt64 as_time; -#if FALSE - /* We don't support passing arrays yet. Code below needs to be ported from C++ to C# */ - /* Array types are nullptr-terminated array of pointers */ - char** as_arr_string; - int64_t** as_arr_int64; - bool** as_arr_bool; - double** as_arr_double; - evt_guid_t** as_arr_guid; - uint64_t** as_arr_time; -#endif - }; - - /** - * - * Wraps logger configuration string and all input parameters to 'evt_open_with_params' - * - */ - // TODO: this structure size depends on architecture - 32-bit or 64-bit.. - // Since all Mac OS X and Linux are mostly 64-bit by now, as well as - // most Windows - we should assume that the struct layout is optimized - // for 64-bit. From a practical standpoint - somebody building .NET Core - // app would likely consider running it on a platform that is modern - // enough. One way to solve this issue for 32-bit machines is to add a - // custom SDK build flag that enforces certain struct layout. i.e. - // positioning the two pointers below as 64-bit integers instead of 32-bit. - [StructLayout(LayoutKind.Explicit, Size = 20, CharSet = CharSet.Ansi)] - unsafe struct EventOpenWithParamsDataType - { - [FieldOffset(0)] public IntPtr config; - [FieldOffset(8)] public IntPtr parameters; /* pointer to array of EventOpenParam */ - [FieldOffset(16)] public UInt32 paramsCount; - } - - [StructLayout(LayoutKind.Explicit, Size = 24, CharSet = CharSet.Ansi)] - unsafe struct EventPropertyKeyValue - { - [FieldOffset(0)] public IntPtr name; - [FieldOffset(8)] public EventPropertyType type; - [FieldOffset(12)] public EventPropertyValue value; - [FieldOffset(20)] public UInt32 piiKind; - } - - /** - * - * Identifies HTTP request method type - * - */ - public enum HttpRequestType - { - HTTP_REQUEST_TYPE_GET = 0, - HTTP_REQUEST_TYPE_POST = 1, - } - - public class EventProperties : Dictionary - { - - internal IntPtr _nativeBuffer = IntPtr.Zero; - internal int _nativeSize = 0; - - private static readonly int SzEvtPropKv = Marshal.SizeOf(typeof(EventPropertyKeyValue)); - - public EventProperties() - { - } - internal unsafe void AllocNative() - { - _nativeSize = (Count + 1) * SzEvtPropKv; - _nativeBuffer = Marshal.AllocHGlobal(_nativeSize); - int i = 0; - EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(IntPtr.Zero); - foreach (KeyValuePair item in this) - { - propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; - (*propPtr).name = Marshal.StringToHGlobalAnsi(item.Key); - (*propPtr).piiKind = item.Value.piiKind; - (*propPtr).type = item.Value.type; -#if (TRACE) - Console.Write("0x{0:X} ", (long)propPtr); -#endif - switch (item.Value.type) - { - case EventPropertyType.TYPE_BOOLEAN: - (*propPtr).value.as_bool = item.Value.value.as_bool; -#if (TRACE) - Console.WriteLine("boolean {0}={1}", item.Key, (*propPtr).value.as_bool); -#endif - break; - case EventPropertyType.TYPE_DOUBLE: - (*propPtr).value.as_double = item.Value.value.as_double; -#if (TRACE) - Console.WriteLine("double {0}={1}", item.Key, (*propPtr).value.as_double); -#endif - break; - case EventPropertyType.TYPE_GUID: - // Currently we are not using TYPE_GUID. All GUID values get converted to - // TYPE_STRING on assignment. This also aligns well with how service - // telemetry handles GUID type in OpenTelemetry and R9 SDKs. -#if (TRACE) - Console.WriteLine("guid {0}={1}", item.Key, (*propPtr).value.as_guid); -#endif - break; - case EventPropertyType.TYPE_INT64: - (*propPtr).value.as_int64 = item.Value.value.as_int64; -#if (TRACE) - Console.WriteLine("int64 {0}={1}", item.Key, (*propPtr).value.as_int64); -#endif - break; - case EventPropertyType.TYPE_STRING: - { - string s = (string)(item.Value.objValue); - (*propPtr).value.as_string = Marshal.StringToHGlobalAnsi(s); - (*propPtr).piiKind = item.Value.piiKind; -#if (TRACE) - Console.WriteLine("string {0}={1} (piiKind={2})", item.Key, s, item.Value.piiKind); -#endif - break; - } - default: - break; - } - i++; - } - /* NULL terminator property at the end of property list */ - propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; - (*propPtr).name = IntPtr.Zero; - (*propPtr).type = EventPropertyType.TYPE_NULL; - } - - internal unsafe void FreeNative() - { - if (_nativeBuffer == IntPtr.Zero) - { - throw new Exception("Memory not allocated!"); - } - int count = _nativeSize / SzEvtPropKv; - // Debug.Assert(count == Count + 1); - for (int i = 0; i < count; i++) - { - EventPropertyKeyValue* propPtr = (EventPropertyKeyValue*)(_nativeBuffer) + i; - EventPropertyType type = (*propPtr).type; - switch (type) - { - case EventPropertyType.TYPE_GUID: - // Unused. Guid type gets converted to String on assignment. - break; - case EventPropertyType.TYPE_STRING: - { - IntPtr strPtr = (*propPtr).value.as_string; - if (strPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(strPtr); - } - break; - } - default: - break; - } - if ((*propPtr).name != IntPtr.Zero) - { - Marshal.FreeHGlobal((*propPtr).name); - } - } - Marshal.FreeHGlobal(_nativeBuffer); - _nativeBuffer = IntPtr.Zero; - _nativeSize = 0; - } - } - - public class EventProperty - { - internal EventPropertyType type; - internal EventPropertyValue value; - internal object objValue = null; - internal UInt32 piiKind = 0; - - public EventProperty(string strValue) - { - type = EventPropertyType.TYPE_STRING; - objValue = strValue; - } - - public EventProperty(string strValue, UInt32 piiKind) - { - type = EventPropertyType.TYPE_STRING; - objValue = strValue; - this.piiKind = piiKind; - } - - public EventProperty(Guid guidValue) - { - // All Guid types get converted to string representation. - type = EventPropertyType.TYPE_STRING; - objValue = guidValue.ToString(); - } - - public EventProperty(Int64 intValue) - { - type = EventPropertyType.TYPE_INT64; - value.as_int64 = intValue; - } - - public EventProperty(int intValue) - { - type = EventPropertyType.TYPE_INT64; - value.as_int64 = intValue; - } - - public EventProperty(double doubleValue) - { - type = EventPropertyType.TYPE_DOUBLE; - value.as_double = doubleValue; - } - - public EventProperty(bool boolValue) - { - type = EventPropertyType.TYPE_BOOLEAN; - value.as_bool = boolValue; - } - - public static implicit operator EventProperty(string v) => new EventProperty(v); - public static implicit operator EventProperty(int v) => new EventProperty(v); - public static implicit operator EventProperty(double v) => new EventProperty(v); - public static implicit operator EventProperty(Guid v) => new EventProperty(v); - - public static EventProperty FromObject(object v) - { - if (v is Guid guid) - { - return new EventProperty(guid); - } - - switch (Type.GetTypeCode(v.GetType())) - { - case TypeCode.String: - return new EventProperty((string)v); - case TypeCode.Int16: - case TypeCode.Int32: - case TypeCode.Int64: - return new EventProperty((int)v); - case TypeCode.Double: - return new EventProperty((double)v); - case TypeCode.Boolean: - return new EventProperty((bool)v); - default: - break; - } - - return new EventProperty(v.ToString()); - } - - public override String ToString() - { - switch (type) - { - /* Basic types */ - case EventPropertyType.TYPE_STRING: - return objValue.ToString(); - - case EventPropertyType.TYPE_INT64: - return $"{value.as_int64}"; - - case EventPropertyType.TYPE_DOUBLE: - return $"{value.as_double}"; - - case EventPropertyType.TYPE_TIME: - // Time type not implemented. Please use string or int64 - break; - - case EventPropertyType.TYPE_BOOLEAN: - return $"{(value.as_bool ? "true" : "false")}"; - - case EventPropertyType.TYPE_GUID: - // Presently we are not using Guid type. Values get converted - // to String type on assignment. - break; - - default: - break; - } - return ""; - } - }; - - public static class EventNativeAPI - { - - // Conditional compilation: pass different library name depending on target OS - [DllImport(Constants.LIBRARY_NAME, EntryPoint = Constants.ENTRYPOINT)] - internal static extern UInt32 evt_api_call([In, Out] ref EventContextType context); - - /** - * - * Create or open existing SDK instance. - * - * SDK configuration. - * SDK instance handle. - */ - public static ulong evt_open(string cfg) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_OPEN, - data = Marshal.StringToHGlobalAnsi(cfg) - }; - uint result = evt_api_call(ref context); - Marshal.FreeHGlobal(context.data); - return (result == 0) ? context.handle : Handles.InvalidHandle; - } - - /** - * - * Destroy or close SDK instance by handle - * - * SDK instance handle. - * Status code. - */ - public static ulong evt_close(ulong inHandle) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_CLOSE, - handle = inHandle - }; - return evt_api_call(ref context); - } - - /** - * REMEMBER! Privacy feature for OTEL C API client: - * - * C API customer that does not explicitly pass down JSON - * config["config]["scope"] = COMMONFIELDS_SCOPE_ALL; - * - * should not be able to capture the host's context vars. - */ - public static ulong evt_log(ulong inHandle, ref EventProperties properties) - { - properties.AllocNative(); - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_LOG, - handle = inHandle, - data = properties._nativeBuffer, - size = 0 /* (uint)(properties.Count) */ - }; - ulong result = evt_api_call(ref context); - properties.FreeNative(); - return result; - } - - /** - * - * Pauses transmission. In that mode events stay in ram or saved to disk, not sent. - * - * SDK handle. - * Status code. - */ - public static ulong evt_pause(ulong inHandle) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_PAUSE, - handle = inHandle - }; - return evt_api_call(ref context); - } - - /** - * - * Resumes transmission. Pending telemetry events should be attempted to be sent. - * - * SDK handle. - * Status code. - */ - public static ulong evt_resume(ulong inHandle) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_RESUME, - handle = inHandle - }; - return evt_api_call(ref context); - } - - /** - * Provide a hint to telemetry system to attempt force-upload of events - * without waiting for the next batch timer interval. This API does not - * guarantee the upload. - * - * SDK handle. - * Status code. - */ - public static ulong evt_upload(ulong inHandle) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_UPLOAD, - handle = inHandle - }; - return evt_api_call(ref context); - } - - /** - * Save pending telemetry events to offline storage on disk. - * - * SDK handle. - * Status code. - */ - public static ulong evt_flush(ulong inHandle) - { - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_FLUSH, - handle = inHandle - }; - return evt_api_call(ref context); - } - - /** - * Pass down SDK header version to SDK library. Needed for late binding version checking. - * This method provides means of a handshake between library header and a library impl. - * It is up to app dev to verify the value returned, making a decision whether some SDK - * features are implemented/supported by particular SDK version or not. - * - * SDK library semver - */ - public static string evt_version() - { - string result = ""; - byte[] data = Encoding.ASCII.GetBytes(Constants.VERSION); - var nativeDataPtr = Marshal.AllocHGlobal(data.Length + 1); - Marshal.Copy(data, 0, nativeDataPtr, data.Length); - Marshal.WriteByte(nativeDataPtr + data.Length, 0); - EventContextType context = new EventContextType - { - call = (Byte)EventCallType.EVT_OP_VERSION, - data = nativeDataPtr - }; - - try - { - evt_api_call(ref context); - result = Marshal.PtrToStringAnsi(context.data); -#pragma warning disable CS0168 // Variable is declared but never used - } - catch (EntryPointNotFoundException ex) - { -#if (TRACE) - // Library found, but entry point in the library not found. - Console.Write("Method not found: {0}", Constants.ENTRYPOINT); -#endif - } - catch (DllNotFoundException ex) - { -#if (TRACE) - // Library not found. - Console.Write("Library not found: {0}", Constants.LIBRARY_NAME); -#endif - } -#pragma warning restore CS0168 // Variable is declared but never used - Marshal.FreeHGlobal(nativeDataPtr); - return result; - } - } - - } - } -} diff --git a/wrappers/netcore/EventSender.csproj b/wrappers/netcore/EventSender.csproj deleted file mode 100644 index cad792c56..000000000 --- a/wrappers/netcore/EventSender.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - Exe - netcoreapp3.1 - true - - - - - PreserveNewest - - - - PreserveNewest - - - - - - - - - - diff --git a/wrappers/netcore/EventSender.sln b/wrappers/netcore/EventSender.sln deleted file mode 100644 index aa1113c42..000000000 --- a/wrappers/netcore/EventSender.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.4.33403.182 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventSender", "EventSender.csproj", "{D69C30C5-CBAD-415C-9F93-19BB7219D085}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D69C30C5-CBAD-415C-9F93-19BB7219D085}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9EE7D92A-8808-4AA8-9D5D-79B199AC8A9F} - EndGlobalSection -EndGlobal diff --git a/wrappers/netcore/EventSender.xml b/wrappers/netcore/EventSender.xml deleted file mode 100644 index b10fcd35f..000000000 --- a/wrappers/netcore/EventSender.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/wrappers/netcore/Program.cs b/wrappers/netcore/Program.cs deleted file mode 100644 index e433b392b..000000000 --- a/wrappers/netcore/Program.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.IO; -using System.Diagnostics; -using Microsoft.Telemetry.Core; - -#if HAVE_SYSTEM_JSON -// TODO: Unity 2021 doesn't have support for System.Json yet -using System.Json; -#else -using Newtonsoft.Json.Linq; -#endif - -namespace EventSender -{ - class Program - { - - /// - /// Read 1DS SDK configuration from JSON configuration file. - /// - /// - /// - static string ReadConfiguration(string filename) - { - using StreamReader sr = new StreamReader(filename); - string result = sr.ReadToEnd(); - return result; - } - - /// - /// Run action in a loop and measure common performance characteristics. - /// - /// - /// - static void StressTest(Action action, int maxIterations) - { - long total0 = GC.GetTotalMemory(true); - long frag0 = GC.GetGCMemoryInfo().FragmentedBytes; - Stopwatch sw = new Stopwatch(); - sw.Start(); - - for (int i = 0; i < maxIterations; i++) - { - action(i); - } - - sw.Stop(); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - - long total1 = GC.GetTotalMemory(true); - long frag1 = GC.GetGCMemoryInfo().FragmentedBytes; - // Print some benchmarking results for offline storage + serialization - TimeSpan ts = sw.Elapsed; - Console.WriteLine("Elapsed = {0}", ts); - Console.WriteLine("Event rate = {0} eps", - (ts.TotalMilliseconds != 0) ? - (maxIterations / ts.TotalSeconds) : 1000); - Console.WriteLine("Latency = {0} ms", (ts.TotalMilliseconds / maxIterations)); - Console.WriteLine("Mem used = {0} bytes", total1 - total0); - } - - /// - /// Small demo how to use 1DS .NET Core API routed via 1DS C API. - /// All features of C API are supported. - /// - /// - static void Main(string[] args) - { - Console.WriteLine("Reading configuration..."); - string cfg = ReadConfiguration("sdk-config.json"); - - // Parse to verify it is valid and print it out.. - // Parser should throw if config is invalid. -#if HAVE_SYSTEM_JSON - JsonObject jsonDoc = (JsonObject)JsonObject.Parse(cfg); -#else - JObject jsonDoc = JObject.Parse(cfg); -#endif - Console.WriteLine("SDK configuration:\n{0}", jsonDoc.ToString()); - - // Obtain SDK version from native library - Console.WriteLine("SDK version: {0}", EventNativeAPI.evt_version()); - - // Initialize - Console.WriteLine(">>> evt_open..."); - var handle = EventNativeAPI.evt_open(cfg); - Console.WriteLine("handle={0}", handle); - - - // Log something - Console.WriteLine(">>> evt_log..."); - var props = new EventProperties() { - { "name", "SampleNetCore" }, - { "strKey", "value1" }, - { "intKey", 12345 }, - { "dblKey", 0.12345 } , - { "guidKey", new Guid("73e21739-9d4e-497d-9c66-8e399a532ec9") } - }; - EventNativeAPI.evt_log(handle, ref props); - - // Now let's run a small stress test... - StressTest( - (param1) => - { - var eventProperties = new EventProperties() { - { "name", "SampleNetCore.PerfTest" }, - { "intKey", param1 }, - }; - EventNativeAPI.evt_log(handle, ref eventProperties); - } - , 100 // number of iterations - ); - - ulong result = 0; - - // Flush events to storage - result = EventNativeAPI.evt_flush(handle); - Console.WriteLine("result={0}", result); - - // Force upload of all pending events - result = EventNativeAPI.evt_upload(handle); - Console.WriteLine("result={0}", result); - - // FlushAndTeardown - Console.WriteLine(">>> evt_close..."); - result = EventNativeAPI.evt_close(handle); - Console.WriteLine("result={0}", result); - } - } -} diff --git a/wrappers/netcore/README.md b/wrappers/netcore/README.md deleted file mode 100644 index a74a77c07..000000000 --- a/wrappers/netcore/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# .NET Core wrapper example for 1DS C/C++ SDK - -Note that this wrapper is incomplete simple reference implementation that illustrates how to use 1DS C API from cross-platform .NET Core application. - -## POSIX instructions (Linux, Mac) - -1. Install latest .NET Core for your platform. - -2. Make sure you compile and install shared library build of SDK (`build.sh -l shared`). - -3. `run.sh` to compile and run the sample wrapper. - -## Windows instructions - -1. Install latest .NET Core for your platform. - -2. Open `Solutions\MSTelemetry.sln` and compile `win32-dll` project, producing `ClientTelemetry.dll` - -3. `run.cmd` to compile and run the sample wrapper. diff --git a/wrappers/netcore/appsettings.json b/wrappers/netcore/appsettings.json deleted file mode 100644 index ecd461122..000000000 --- a/wrappers/netcore/appsettings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Logging": { - "IncludeScopes": true, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - }, - "Console": { - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } - } -} - diff --git a/wrappers/netcore/run.cmd b/wrappers/netcore/run.cmd deleted file mode 100644 index 783e71ca0..000000000 --- a/wrappers/netcore/run.cmd +++ /dev/null @@ -1,6 +0,0 @@ -set "PATH=%CD%\..\..\Solutions\out\Debug\x64\win32-dll;%PATH%" -dotnet run -c Debug - -set "PATH=%CD%\..\..\Solutions\out\Release\x64\win32-dll;%PATH%" -dotnet run -c Release - diff --git a/wrappers/netcore/run.sh b/wrappers/netcore/run.sh deleted file mode 100755 index d975d50fc..000000000 --- a/wrappers/netcore/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# Mac OS X: -# brew cask install dotnet-sdk - -#export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH -#export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib:$DYLD_FALLBACK_LIBRARY_PATH - -#dotnet run -c Debug -v diag -dotnet run -c Debug - - - diff --git a/wrappers/netcore/sdk-config.json b/wrappers/netcore/sdk-config.json deleted file mode 100644 index 5b888065e..000000000 --- a/wrappers/netcore/sdk-config.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "config": { - "host": "*", - "scope": "*" - }, - "name": "C-API-Client-0", - "version": "1.0.0", - "cacheFileFullNotificationPercentage": 75, - "cacheFilePath": "offline-storage.db", - "cacheFileSizeLimitInBytes": 3145728, - "cacheFullNotificationIntervalTime": 5000, - "cacheMemoryFullNotificationPercentage": 75, - "cacheMemorySizeLimitInBytes": 524288, - "compat": { - "customTypePrefix": "custom", - "dotType": true - }, - "enableDbDropIfFull": false, - "enableLifecycleSession": false, - "enableNetworkDetector": true, - "enableTrace": true, - "eventCollectorUri": "https://mobile.events.data.microsoft.com/OneCollector/1.0/", - "hostMode": true, - "http": { - "compress": false, - "contentEncoding": "deflate", - "msRootCheck": false - }, - "maxDBFlushQueues": 3, - "maxPendingHTTPRequests": 4, - "maxTeardownUploadTimeInSec": 5, - "minimumTraceLevel": 1, - "multiTenantEnabled": true, - "primaryToken": "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991", - "sample": { - "rate": 0 - }, - "sdkmode": 0, - "sessionResetEnabled": false, - "stats": { - "interval": 0, - "split": false, - "tokenInt": "8130ef8ff472405d89d6f420038927ea-0c0d561e-cca5-4c81-90ed-0aa9ad786a03-7166", - "tokenProd": "4bb4d6f7cafc4e9292f972dca2dcde42-bd019ee8-e59c-4b0f-a02c-84e72157a3ef-7485" - }, - "tpm": { - "backoffConfig": "E,3000,300000,2,1", - "clockSkewEnabled": true, - "maxBlobSize": 2097152, - "maxRetryCount": 5 - }, - "traceLevelMask": 4294967295, - "utc": { - "enabled": false - } -} \ No newline at end of file From 061b8ce405d7c2ef362da77415f062683435c87f Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 22:47:13 -0700 Subject: [PATCH 21/29] Add design document --- docs/host-guest-design.md | 358 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 docs/host-guest-design.md diff --git a/docs/host-guest-design.md b/docs/host-guest-design.md new file mode 100644 index 000000000..d8f34c843 --- /dev/null +++ b/docs/host-guest-design.md @@ -0,0 +1,358 @@ +# 1DS C/C++ Host-Guest API detailed design + +## Preface + +There are scenarios where hybrid applications (C#, C/C++, JavaScript) may need to propagate telemetry +to Common Shared Telemetry library (1DS). + +In those scenarios all parts of application need to discover the SDK instance. For example: + +- App Core C++ SDK initializes Telemetry Stack as Telemetry "Host", letting other delay-loaded components +of application to reuse its telemetry stack. +- App Core C++ SDK could use `LogManager::SetContext(...)` and Semantic Context C++ APIs to populate some +common low-level knowledge, accessible only from C++ layer, ex. `ext.user.localId`. +- Extension SDKs (Plugins) could act as Telemetry "Guest". These would discover the existing telemetry +stack and could use `evt_set_logmanager_context` C API to append their context variables to shared +telemetry context. +- App Common C# layer could also act as Telemetry "Guest". It latches itself to the existing instance +of native telemetry stack, appending its own variables available from application store, ex. `ext.app.name`, +`ext.app.id`. Since packaged application also knows from its package what platform it is designed for, +it could populate `ext.os.name`. For example, set it to `Meta Quest 2` / `Meta Quest Pro` intead of +generic `Android` moniker. Presently 1DS C/C++ SDK itself cannot auto-discover those intricacies. +- App layer could also propagate additional compile-time constants, such as `app.build.env`, git tag +of app, etc. + +Consolidated Shared Telemetry Context contains a set of fields populated by various elements of +a system stack. From top C# / JS layers to the bottom C++ layer, spanning across extension plugins / +libraries loaded in app context. Those libraries could consume telemetry stack via C API. + +Shared context properties could get stamped on all events emitted by a product, irrespective of whether +these events originated from: ia high-level app written in C#, or a lower-level extension SDK written in C. + +## Ultimate user guide to 1DS C/C++ SDK Host-Guest API + +Host-Guest API has been designed for the following scenarios: + +### Sharing telemetry stack + +Main component - `Host` loads its accessory component (or SDK) - `Guest`. Both components use the +same shared dynamically loadable 1DS C++ SDK binary, e.g. `ClientTelemetry.dll`, `libmaesdk.so`, or +`libcat.so` - whatever is the "distro" used to package 1DS C++ SDK. + +`Guest` could dynamically discover and load 1DS C++ via C API. It could latch to currently initialized +instance of Main component `LogManager`. `Guest` could also create its own totally separate sandboxed +instance of a Guest `LogManager`. `GetProcAddress` is supported on Windows. `dlsym` supported on Linux +and Android. Lazy-binding (automagic binding / auto-discovery of `Host` telemetry stack) is supported +on Linux, Mac and Android. PInvoke for C# is also fully supported since across platforms - C API provides +one unified struct layout, with packed structs, approach that works on modern Intel-x64 and ARM64 OS. + +### SDK-in-SDK scenario + +Native code SDK could loads another extension/accessory SDK. Both parts must share the same telemetry stack. +Extension SDK could be written in C or C++. Main SDK is treated as `Host`, additional SDKs are treated +as `Guests`. `Host` could also facilitate the ingection of Diagnostic Data Viewer plugin, in order to +satisfy our Privacy and Compliance oblogations. Additional `Guest` modules could enrich the main `Host` +shared telemetry context with their properties. + +### Telemetry flows and `Isolation` scenario + +In some cases many different application modules (plugins) get loaded into the main app address space. +For example, `Azure Calling SDK` or `Microsoft Information Protection SDK` running in another product. +These plugin(s) may not necessarily need to share their telemetry flows with the main app. In that case +the modules must operate within their own trust and data collection boundary. Data uploads need to be +controlled separately, with Required Service Data flowing to Azure location of a service resource; +while Optional Customer Data may need to flow to its own regional EUDB-compliant collector. + +`Host`-`Guest` API solves this challenge by providing partitioning for different components using the +same telemetry SDK. + +## Common Considerations + +`HostGuestTests.cpp` module in functional test contains several usage examples. + +See detailed explanation of configuration and examples below. + +### Dissecting Host configuration + +Host configuration example: + +```json +{ + "cacheFilePath": "MyOfflineStorage.db", + "config": { + "host": "C-API-Host", + "scope": "*" + }, + "stats": { + "interval": 0 + }, + "name": "C-API-Host", + "version": "1.0.0", + "primaryToken": "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-0001" + "maxTeardownUploadTimeInSec": 5, + "hostMode": true, + "minimumTraceLevel": 0, + "sdkmode": 0 +} +``` + +Host could specify the two matching parameters: + +- `"host": "C-API-Host"` +- `"name": "C-API-Host"` + +If host parameter matches the name parameter, then it assumed that the Host module acts as the one and +only Host in the application. It will be creating its own data collection sandbox. It will not latch to +any other Host modules that could be running in the same app. Multiple Host modules supported. + +In some scenarios a Host would prefer to latch (join) an existing telemetry session. This is especially +helpful if multiple Hosts need to share one data collection domain and their startup/load order is not +clearly defined. In that case, a session initialized by first Host could be shared with other Hosts. +Data collection domain performs ref-counting of instances latched to it. + +Hosts could specify `"host": "*"` to attach to existing data collection session. If first Host leaves +(unloads or closes its handle), remaining entities in that session continue operating until the last +Host leaves the data collection domain. + +Both Guests and Hosts may utilize the `scope` parameter that controls if these would be sharing the +same common telemetry context shared within a sandbox: + +- `scope="*"` - SHARED or ALL, means that a component will contribute its context to shared context. +- `scope="-"` - NONE or RESTRICTED, means that a component will not contribute its context, and will +not receive any values from the shared context. This mechanism allows to satisfy data collection +and privacy obligations. Each entity acts within their own data collection and compliance boundary +without sharing any of their telemetry contexts with other modules in the process. + +## Dissecting Guest configuration + +Guest configuration example: + +```json +{ + "cacheFilePath": "MyOfflineStorage.db", + "config": { + "host": "*", + "scope": "*" + }, + "stats": { + "interval": 0 + }, + "name": "C-API-Guest", + "version": "1.0.0", + "primaryToken": "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-0002", + "maxTeardownUploadTimeInSec": 5, + "hostMode": false, + "minimumTraceLevel": 0, + "sdkmode": 0 +} +``` + +Guest entity: + +- specifies its own data storage file. This is helpful if Guest starts up prior to any other Host. +- `"host": "*"` parameter allows the Guest to latch to any host. +- `"scope": "*"` parameter allows the Guest to contribute and share its telemetry context with other modules (Host and Guests). +- Hosts and Guests to present themselves with unique name, ex. `"name": "C-API-Guest"` and unique version, ex. `1.0.0`. +- Guest must specify `"hostMode": false`. That is how SDK knows that a Guest is expected to join another Host's sandbox. +- Guest may omit the scope parameter. In this case the Guest cannot capture the main Host telemetry contexts. +This is done intentionally as a security feature. Main application developers may ask their plugin developers +to never capture any telemetry contexts populated by the main application. For example, in some cases - main +application `ext.user.localId` or session `TraceId` cannot be shared with extension. There is no explicit +permission model. Since most components are expected to be assembled and tested by product development teams, +the team should audit the usage of Guest scope parameter by the plugins it is loading. There is runtime code +isolation provided by this mechanism. It is based on trust thast all loadable modules excercise their due +diligence while setting up their telemetry configuration. + +### End-to-end example + +Host code: + +```cpp + // Host JSON configuration: + const char* hostConfig = JSON_CONFIG( + { + "cacheFilePath" : "/some/path/MyOfflineStorage.db", + "config" : { + "host" : "C-API-Host", + "scope" : "*" + }, + "name" : "C-API-Host", + "version" : "1.0.0", + "primaryToken" : "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-0001", + "hostMode" : true + }); + + // Host initializes in Host mode, waiting for Guest()s to register. + evt_handle_t hostHandle = evt_open(hostConfig); + + // evt_prop[] array that contains common context properties. + // Contexts between Hosts and Guests could be merged into one shared context. + evt_prop hostContext[] = TELEMETRY_EVENT( + _STR("ext.device.localId", "a:4318b22fbc11ca8f"), + _STR("ext.device.make", "Microsoft"), + _STR("ext.device.model", "Clippy"), + _STR("ext.os.name", "MS-DOS"), + _STR("ext.os.ver", "2100") + ); + + // Host appends common context properties at top-level LogManager. + // These variables will be shared with Guest(s). + evt_set_logmanager_context(hostHandle, hostContext); + + evt_prop hostEvent[] = TELEMETRY_EVENT( + // Part A/B fields + _STR(COMMONFIELDS_EVENT_NAME, "Event.Host"), + _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), + _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), + _STR("strKey", "value1"), + _INT("intKey", 12345), + _DBL("dblKey", 3.14), + _BOOL("boolKey", true), + _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f00}"); + evt_log(hostHandle, hostEvent); + +``` + +In above example: + +- Host performs initialization. +- populates its top-level LogManager semantic context with known values. + +For example, the Host C++ layer could use native API to access the lower-level platform-specific +Device Id, Device Make, Model. Host may emit a telemetry event that would combine the event data +with its context data. + +Guest code: + +```cpp + + // Guest JSON configuration: + const char* guestConfig = JSON_CONFIG( + { + "config" : { + "host" : "*", + "scope" : "*" + }, + "name" : "C-API-Guest", + "version" : "1.0.0", + "primaryToken" : "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-0002", + "hostMode" : false + }); + + // Guest initializes in Guest mode and latches to previously running Host. + auto guestHandle = evt_open(guestConfig); + + // evt_prop[] array that contains context properties: + evt_prop guestContext[] = TELEMETRY_EVENT( + _STR("ext.app.id", "com.Microsoft.Clippy"), + _STR("ext.app.ver", "1.0.0"), + _STR("ext.app.locale", "en-US"), + _STR("ext.net.cost", "Unmetered"), + _STR("ext.net.type", "QuantumLeap")); + + // Guest could append some of its common context properties on top of shared context: + evt_set_logmanager_context(guestHandle, guestContext); + + evt_prop guestEvent[] = TELEMETRY_EVENT( + _STR("name", "Event.Guest"), + _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), + _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), + _STR("strKey", "value2"), + _INT("intKey", 67890), + _DBL("dblKey", 3.14), + _BOOL("boolKey", false), + _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f01}"); + evt_log(guestHandle, guestEvent); + +``` + +In above example: + +- Guest registers and shares the scope with the Host. +- Guest entity could operate on a totally different abstraction layer, e.g. higher-level Unity C# or Android Java app. +It could obtain certain system parameters that are easily accessible only by the higher-level app. Such as, app store +application name and version. It could be a layer that performs User Authentication and Authorization, subsequently +sharing the User Identity as part of common telemetry context shared with lower-level code across the language boundary. + +Reference design showing how to use 1DS C API from .NET Core, Mono and Unity applications is provided. + +Above examples generate the following event payloads. + +Host Event payload in Common Schema notation: + +```json +{ + "data": { + "boolKey": true, + "dblKey": 3.14, + "guidKey": [[4,3,2,1,6,5,8,7,9,10,11,12,13,14,15,0]], + "intKey": 12345, + "strKey": "value1" + }, + "ext": { + "device": { + "localId": "a:4318b22fbc11ca8f", + "make": "Microsoft", + "model": "Clippy" + }, + "os": { + "name": "MS-DOS", + "ver": "2100" + } + }, + "iKey": "o:7c8b1796cbc44bd5a03803c01c2b9d61", + "name": "Event.Host", + "time": 1680074712000, + "ver": "3.0" +} +``` + +Guest Event payload in Common Schema notation. Note that Guest event emitted after Host initialization contains +the superset of all consolidated common properties: + +```json +{ + "data": { + "boolKey": true, + "dblKey": 3.14, + "guidKey": [[4,3,2,1,6,5,8,7,9,10,11,12,13,14,15,0]], + "intKey": 12345, + "strKey": "value1" + }, + "ext": { + "app": { + "id": "com.Microsoft.Clippy", + "locale": "en-US", + "name": "com.Microsoft.Clippy", + "ver": "1.0.0" + }, + "device": { + "localId": "a:4318b22fbc11ca8f", + "make": "Microsoft", + "model": "Clippy" + }, + "net": { + "cost": "Unmetered", + "provider": "", + "type": "QuantumLeap" + }, + "os": { + "name": "MS-DOS", + "ver": "2100" + } + }, + "iKey": "o:7c8b1796cbc44bd5a03803c01c2b9d61", + "name": "Event.Guest", + "time": 1680074712000, + "ver": "3.0" +} +``` + +Host-Guest approach allows us to share one common telemetry diagnostic context across the language boundaries +in a hybrid applications designed with C/C++, C#, and JavaScript. Other programming languages may leverage +Foreign Function Interface C API. + +Host-Guest interface plays a central role in aggregation of different module contexts in one shared telemetry +context. C++ example is available in `SampleCppLogManagers` project. From 67dadfe17040e8024101cfef10413c54defbca0b Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 23:04:26 -0700 Subject: [PATCH 22/29] Fix typos --- docs/host-guest-design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/host-guest-design.md b/docs/host-guest-design.md index d8f34c843..c63dcf9a8 100644 --- a/docs/host-guest-design.md +++ b/docs/host-guest-design.md @@ -160,7 +160,7 @@ to never capture any telemetry contexts populated by the main application. For e application `ext.user.localId` or session `TraceId` cannot be shared with extension. There is no explicit permission model. Since most components are expected to be assembled and tested by product development teams, the team should audit the usage of Guest scope parameter by the plugins it is loading. There is runtime code -isolation provided by this mechanism. It is based on trust thast all loadable modules excercise their due +isolation provided by this mechanism. It is based on trust that all loadable modules exercise their due diligence while setting up their telemetry configuration. ### End-to-end example From 17481923edfd17bc91a2048877edd16fc3d68f56 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 23:08:34 -0700 Subject: [PATCH 23/29] Remove unnecessary files --- examples/c/SampleC/SampleC.vcxproj | 2 +- .../EventSender/EventSender.vcxproj.filters | 232 +++---- examples/cs/SampleCsUWP/SampleCsUWP.csproj | 348 +++++----- sqliteUWP/sqlite-uwp.vcxproj | 614 +++++++++--------- tests/functests/FuncTests.vcxproj | 2 +- tests/functests/FuncTests.vcxproj.filters | 2 +- .../googletest/msvc/gtest.vcxproj.filters | 34 +- 7 files changed, 617 insertions(+), 617 deletions(-) diff --git a/examples/c/SampleC/SampleC.vcxproj b/examples/c/SampleC/SampleC.vcxproj index 4f3890959..d307939cf 100644 --- a/examples/c/SampleC/SampleC.vcxproj +++ b/examples/c/SampleC/SampleC.vcxproj @@ -1,4 +1,4 @@ - + diff --git a/examples/cpp/EventSender/EventSender.vcxproj.filters b/examples/cpp/EventSender/EventSender.vcxproj.filters index de72b7eb5..f5b9ccda5 100644 --- a/examples/cpp/EventSender/EventSender.vcxproj.filters +++ b/examples/cpp/EventSender/EventSender.vcxproj.filters @@ -1,117 +1,117 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - - Header Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + + Header Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file diff --git a/examples/cs/SampleCsUWP/SampleCsUWP.csproj b/examples/cs/SampleCsUWP/SampleCsUWP.csproj index 823a4fe4e..4c73a88f9 100644 --- a/examples/cs/SampleCsUWP/SampleCsUWP.csproj +++ b/examples/cs/SampleCsUWP/SampleCsUWP.csproj @@ -1,181 +1,181 @@ - - - - - Debug - x86 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA} - AppContainerExe - Properties - SampleCsUWP - SampleCsUWP - en-US - UAP - 10.0.17763.0 - 10.0.10240.0 - 14 - 512 - {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - TemporaryKey.pfx - 5D2C91E522EAF83739013D206CCA199DF5D3AFD6 - - - true - bin\x86\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - x86 - false - prompt - true - - - bin\x86\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - x86 - false - prompt - true - true - - - true - bin\ARM\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - ARM - false - prompt - true - - - bin\ARM\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - ARM - false - prompt - true - true - - - true - bin\ARM64\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - ARM64 - false - prompt - true - true - - - bin\ARM64\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - ARM64 - false - prompt - true - true - - - true - bin\x64\Debug\ - DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP - ;2008 - full - x64 - false - prompt - true - - - bin\x64\Release\ - TRACE;NETFX_CORE;WINDOWS_UWP - true - ;2008 - pdbonly - x64 - false - prompt - true - true - - - PackageReference - - - - App.xaml - - - MainPage.xaml - - - - - - Designer - - - - - - - - - - - - - - - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - - - - 6.2.8 - - - - - {49077dbf-e363-4d2d-8334-636569a771b6} - win10-cs - - - - - Visual C++ 2015 Runtime for Universal Windows Platform Apps - - - - 14.0 - - + + + + + Debug + x86 + {F797B22C-A1C4-4136-9DCC-0682A183A4DA} + AppContainerExe + Properties + SampleCsUWP + SampleCsUWP + en-US + UAP + 10.0.17763.0 + 10.0.10240.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + TemporaryKey.pfx + 5D2C91E522EAF83739013D206CCA199DF5D3AFD6 + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + true + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + true + true + + + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM64 + false + prompt + true + true + + + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM64 + false + prompt + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + true + true + + + PackageReference + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + 6.2.8 + + + + + {49077dbf-e363-4d2d-8334-636569a771b6} + win10-cs + + + + + Visual C++ 2015 Runtime for Universal Windows Platform Apps + + + + 14.0 + + + --> \ No newline at end of file diff --git a/sqliteUWP/sqlite-uwp.vcxproj b/sqliteUWP/sqlite-uwp.vcxproj index 8d51e574c..c153beb24 100644 --- a/sqliteUWP/sqlite-uwp.vcxproj +++ b/sqliteUWP/sqlite-uwp.vcxproj @@ -1,308 +1,308 @@ - - - - - - Debug - ARM - - - Debug - ARM64 - - - Debug - Win32 - - - Debug - x64 - - - Release - ARM - - - Release - ARM64 - - - Release - Win32 - - - Release - x64 - - - - {6883a688-89f5-424a-9bfa-50d42f691b29} - en-US - 14.0 - 10.0.10240.0 - - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - true - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - StaticLibrary - false - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ - $(Platform)\$(Configuration)\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ - $(Platform)\$(Configuration)\ - - - false - - - false - - - false - - - false - - - false - - - false - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - $(OutDir)$(TargetName).pdb - Default - false - - - Console - false - false - - - false - true - - - - - NotUsing - false - true - SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - MinSpace - $(OutDir)$(TargetName).pdb - false - - - Console - false - false - - - true - false - - - - - false - NotUsing - _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) - false - - - false - true - - - - - false - NotUsing - _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) - false - - - true - false - - - - - - - - - false - false - - - - - - + + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {6883a688-89f5-424a-9bfa-50d42f691b29} + en-US + 14.0 + 10.0.10240.0 + + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + true + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + false + + + false + + + false + + + false + + + false + + + false + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + $(OutDir)$(TargetName).pdb + Default + false + + + Console + false + false + + + false + true + + + + + NotUsing + false + true + SQLITE_DEFAULT_AUTOVACUUM=1;SQLITE_OS_WINRT;_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + MinSpace + $(OutDir)$(TargetName).pdb + false + + + Console + false + false + + + true + false + + + + + false + NotUsing + _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) + false + + + false + true + + + + + false + NotUsing + _UNICODE;UNICODE;SQLITE_OS_WINRT;%(PreprocessorDefinitions) + false + + + true + false + + + + + + + + + false + false + + + + + + \ No newline at end of file diff --git a/tests/functests/FuncTests.vcxproj b/tests/functests/FuncTests.vcxproj index 1acaf5f72..54a3403a0 100644 --- a/tests/functests/FuncTests.vcxproj +++ b/tests/functests/FuncTests.vcxproj @@ -462,4 +462,4 @@ - \ No newline at end of file + diff --git a/tests/functests/FuncTests.vcxproj.filters b/tests/functests/FuncTests.vcxproj.filters index cdc49850c..663e3d447 100644 --- a/tests/functests/FuncTests.vcxproj.filters +++ b/tests/functests/FuncTests.vcxproj.filters @@ -82,4 +82,4 @@ {5f02135a-4d1e-496a-900a-e5ea8cfb222d} - \ No newline at end of file + diff --git a/tests/googletest/googletest/msvc/gtest.vcxproj.filters b/tests/googletest/googletest/msvc/gtest.vcxproj.filters index cdbfc123e..b566f891e 100644 --- a/tests/googletest/googletest/msvc/gtest.vcxproj.filters +++ b/tests/googletest/googletest/msvc/gtest.vcxproj.filters @@ -1,18 +1,18 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Source Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + \ No newline at end of file From 99682b65b408f6549639cb17b1d802c81cf2c126 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 23:23:21 -0700 Subject: [PATCH 24/29] Fix a few typos and improve markdown looks --- docs/host-guest-design.md | 79 ++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/docs/host-guest-design.md b/docs/host-guest-design.md index c63dcf9a8..2a1a6fd15 100644 --- a/docs/host-guest-design.md +++ b/docs/host-guest-design.md @@ -7,7 +7,7 @@ to Common Shared Telemetry library (1DS). In those scenarios all parts of application need to discover the SDK instance. For example: -- App Core C++ SDK initializes Telemetry Stack as Telemetry "Host", letting other delay-loaded components +- App Core C++ SDK initializes Telemetry Stack as Telemetry `Host`, letting other delay-loaded components of application to reuse its telemetry stack. - App Core C++ SDK could use `LogManager::SetContext(...)` and Semantic Context C++ APIs to populate some common low-level knowledge, accessible only from C++ layer, ex. `ext.user.localId`. @@ -27,11 +27,11 @@ a system stack. From top C# / JS layers to the bottom C++ layer, spanning across libraries loaded in app context. Those libraries could consume telemetry stack via C API. Shared context properties could get stamped on all events emitted by a product, irrespective of whether -these events originated from: ia high-level app written in C#, or a lower-level extension SDK written in C. +these events originated from a high-level app written in C#, or a lower-level extension SDK written in C. ## Ultimate user guide to 1DS C/C++ SDK Host-Guest API -Host-Guest API has been designed for the following scenarios: +`Host`-`Guest` API has been designed for the following scenarios: ### Sharing telemetry stack @@ -40,21 +40,22 @@ same shared dynamically loadable 1DS C++ SDK binary, e.g. `ClientTelemetry.dll`, `libcat.so` - whatever is the "distro" used to package 1DS C++ SDK. `Guest` could dynamically discover and load 1DS C++ via C API. It could latch to currently initialized -instance of Main component `LogManager`. `Guest` could also create its own totally separate sandboxed -instance of a Guest `LogManager`. `GetProcAddress` is supported on Windows. `dlsym` supported on Linux +instance of its `Host` component `LogManager`. `Guest` could also create its own totally separate sandboxed +instance of a `Guest` `LogManager`. `GetProcAddress` is supported on Windows. `dlsym` supported on Linux and Android. Lazy-binding (automagic binding / auto-discovery of `Host` telemetry stack) is supported -on Linux, Mac and Android. PInvoke for C# is also fully supported since across platforms - C API provides -one unified struct layout, with packed structs, approach that works on modern Intel-x64 and ARM64 OS. +on Linux, Mac and Android. `P/Invoke` for C# is also fully supported cross-platform for .NET and Mono. +1DS C API provides one unified struct layout, with packed structs approach that works on modern +Intel-x64 and ARM64 OS. One single C# assembly could interoperate with 1DS C++ SDK in a uniform way. ### SDK-in-SDK scenario -Native code SDK could loads another extension/accessory SDK. Both parts must share the same telemetry stack. +Native code SDK could load another extension/accessory SDK. Both parts must share the same telemetry stack. Extension SDK could be written in C or C++. Main SDK is treated as `Host`, additional SDKs are treated as `Guests`. `Host` could also facilitate the ingection of Diagnostic Data Viewer plugin, in order to satisfy our Privacy and Compliance oblogations. Additional `Guest` modules could enrich the main `Host` shared telemetry context with their properties. -### Telemetry flows and `Isolation` scenario +### Telemetry flows and `Telemetry Data Isolation` scenarios In some cases many different application modules (plugins) get loaded into the main app address space. For example, `Azure Calling SDK` or `Microsoft Information Protection SDK` running in another product. @@ -64,17 +65,18 @@ controlled separately, with Required Service Data flowing to Azure location of a while Optional Customer Data may need to flow to its own regional EUDB-compliant collector. `Host`-`Guest` API solves this challenge by providing partitioning for different components using the -same telemetry SDK. +same telemetry SDK. If necessary, different modules telemetry collection processes run totally isolated +from one another. ## Common Considerations `HostGuestTests.cpp` module in functional test contains several usage examples. -See detailed explanation of configuration and examples below. +See detailed explanation of configuration options and examples below. ### Dissecting Host configuration -Host configuration example: +`Host` configuration example: ```json { @@ -96,23 +98,23 @@ Host configuration example: } ``` -Host could specify the two matching parameters: +`Host` could specify the two matching parameters: - `"host": "C-API-Host"` - `"name": "C-API-Host"` -If host parameter matches the name parameter, then it assumed that the Host module acts as the one and -only Host in the application. It will be creating its own data collection sandbox. It will not latch to -any other Host modules that could be running in the same app. Multiple Host modules supported. +If host parameter matches the name parameter, then it assumed that the `Host` module acts as the one and +only `Host` in the application. It will be creating its own data collection sandbox. It will not latch to +any other `Host` modules that could be running in the same app. Multiple `Host` modules supported. -In some scenarios a Host would prefer to latch (join) an existing telemetry session. This is especially +In some scenarios a `Host` would prefer to latch (join) an existing telemetry session. This is especially helpful if multiple Hosts need to share one data collection domain and their startup/load order is not -clearly defined. In that case, a session initialized by first Host could be shared with other Hosts. +clearly defined. In that case, a session initialized by first `Host` could be shared with other Hosts. Data collection domain performs ref-counting of instances latched to it. -Hosts could specify `"host": "*"` to attach to existing data collection session. If first Host leaves +Hosts could specify `"host": "*"` to attach to existing data collection session. If first `Host` leaves (unloads or closes its handle), remaining entities in that session continue operating until the last -Host leaves the data collection domain. +`Host` leaves the data collection domain. Both Guests and Hosts may utilize the `scope` parameter that controls if these would be sharing the same common telemetry context shared within a sandbox: @@ -149,12 +151,12 @@ Guest configuration example: Guest entity: -- specifies its own data storage file. This is helpful if Guest starts up prior to any other Host. +- specifies its own data storage file. This is helpful if Guest starts up prior to any other `Host`. - `"host": "*"` parameter allows the Guest to latch to any host. -- `"scope": "*"` parameter allows the Guest to contribute and share its telemetry context with other modules (Host and Guests). +- `"scope": "*"` parameter allows the Guest to contribute and share its telemetry context with other modules (`Host` and Guests). - Hosts and Guests to present themselves with unique name, ex. `"name": "C-API-Guest"` and unique version, ex. `1.0.0`. -- Guest must specify `"hostMode": false`. That is how SDK knows that a Guest is expected to join another Host's sandbox. -- Guest may omit the scope parameter. In this case the Guest cannot capture the main Host telemetry contexts. +- Guest must specify `"hostMode": false`. That is how SDK knows that a Guest is expected to join another `Host`'s sandbox. +- Guest may omit the scope parameter. In this case the Guest cannot capture the main `Host` telemetry contexts. This is done intentionally as a security feature. Main application developers may ask their plugin developers to never capture any telemetry contexts populated by the main application. For example, in some cases - main application `ext.user.localId` or session `TraceId` cannot be shared with extension. There is no explicit @@ -165,7 +167,7 @@ diligence while setting up their telemetry configuration. ### End-to-end example -Host code: +`Host` code: ```cpp // Host JSON configuration: @@ -186,7 +188,7 @@ Host code: evt_handle_t hostHandle = evt_open(hostConfig); // evt_prop[] array that contains common context properties. - // Contexts between Hosts and Guests could be merged into one shared context. + // Contexts between Hosts and Guests could be merged into one shared context. evt_prop hostContext[] = TELEMETRY_EVENT( _STR("ext.device.localId", "a:4318b22fbc11ca8f"), _STR("ext.device.make", "Microsoft"), @@ -216,11 +218,11 @@ Host code: In above example: -- Host performs initialization. +- `Host` performs initialization. - populates its top-level LogManager semantic context with known values. -For example, the Host C++ layer could use native API to access the lower-level platform-specific -Device Id, Device Make, Model. Host may emit a telemetry event that would combine the event data +For example, the `Host` C++ layer could use native API to access the lower-level platform-specific +Device Id, Device Make, Model. `Host` may emit a telemetry event that would combine the event data with its context data. Guest code: @@ -270,7 +272,7 @@ Guest code: In above example: -- Guest registers and shares the scope with the Host. +- Guest registers and shares the scope with the `Host`. - Guest entity could operate on a totally different abstraction layer, e.g. higher-level Unity C# or Android Java app. It could obtain certain system parameters that are easily accessible only by the higher-level app. Such as, app store application name and version. It could be a layer that performs User Authentication and Authorization, subsequently @@ -280,7 +282,7 @@ Reference design showing how to use 1DS C API from .NET Core, Mono and Unity app Above examples generate the following event payloads. -Host Event payload in Common Schema notation: +`Host` Event payload in Common Schema notation: ```json { @@ -309,8 +311,8 @@ Host Event payload in Common Schema notation: } ``` -Guest Event payload in Common Schema notation. Note that Guest event emitted after Host initialization contains -the superset of all consolidated common properties: +Guest Event payload in Common Schema notation. Note that Guest event emitted after `Host` initialization +contains the superset of all consolidated common properties: ```json { @@ -350,9 +352,10 @@ the superset of all consolidated common properties: } ``` -Host-Guest approach allows us to share one common telemetry diagnostic context across the language boundaries -in a hybrid applications designed with C/C++, C#, and JavaScript. Other programming languages may leverage -Foreign Function Interface C API. +`Host`-`Guest` approach allows us to share one common telemetry diagnostic context across the language +boundaries in a hybrid application designed with different programming languages: C/C++, C#, and +JavaScript. Other programming languages may easily leverage Foreign Function Interface and 1DS C API. -Host-Guest interface plays a central role in aggregation of different module contexts in one shared telemetry -context. C++ example is available in `SampleCppLogManagers` project. +`Host`-`Guest` interface plays a central role in aggregation of different module contexts into one +common shared telemetry context of application. C++ example is available in `SampleCppLogManagers` +project. From e44dcb2405d6c102a728ccec095373fc8b6bfa13 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Wed, 29 Mar 2023 23:48:18 -0700 Subject: [PATCH 25/29] Fix sign mismatch warning for Linux tests --- tests/functests/HostGuestTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functests/HostGuestTests.cpp b/tests/functests/HostGuestTests.cpp index f35be87ce..ef2d59434 100644 --- a/tests/functests/HostGuestTests.cpp +++ b/tests/functests/HostGuestTests.cpp @@ -215,7 +215,7 @@ class TestDebugEventListener : public DebugEventListener TestDebugEventListener debugListener; -const int maxEventsCount = 1; +const unsigned maxEventsCount = 1; unsigned totalEvents = 0; From af67f9c0773069ae7be60b283d4e0526d1396413 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 3 Apr 2023 22:29:17 -0700 Subject: [PATCH 26/29] - Implement cross-arch 32-bit vs 64-bit standard layout. - Fix Host-Guest feature bugs. - Add more tests for Host-Guest feature. --- lib/api/LogManagerFactory.cpp | 48 +++++++- lib/api/LogManagerImpl.hpp | 5 + lib/api/capi.cpp | 20 +++- lib/include/public/ctmacros.hpp | 30 ++++- lib/include/public/mat.h | 12 +- lib/stats/Statistics.cpp | 1 + tests/functests/APITest.cpp | 50 ++++++++- tests/functests/HostGuestTests.cpp | 169 ++++++++++++++++------------- 8 files changed, 247 insertions(+), 88 deletions(-) diff --git a/lib/api/LogManagerFactory.cpp b/lib/api/LogManagerFactory.cpp index 0f6a31171..ebed45df9 100644 --- a/lib/api/LogManagerFactory.cpp +++ b/lib/api/LogManagerFactory.cpp @@ -25,6 +25,30 @@ namespace MAT_NS_BEGIN std::recursive_mutex ILogManagerInternal::managers_lock; std::set ILogManagerInternal::managers; + // Internal utility function to validate if LogManager instance (handle) + // is still alive. Used in Host-Guest scenarios to determine if instance + // needs to be recreated. It will return `false` in case if ILogManager + // pointer does not refer to valid object, OR in case if instance has + // already called `FlushAndTeardown` method and destroyed its loggers. + static inline bool IsInstanceAlive(ILogManager* instance) + { + bool result = true; + // Quick peek at the list of LogManagers to check if this entity + // has been destroyed. + LOCKGUARD(ILogManagerInternal::managers_lock); + if (ILogManagerInternal::managers.count(instance)) + { + // This is a valid instance. One of instances created via: + // > ILogManager* LogManagerFactory::Create(ILogConfiguration& configuration) + // method. Instance type is (LogManagerImpl*) casted to ILogManager. + // Use static_cast to reconstruct back to its actual type: + const auto instance_internal = static_cast(instance); + // Call its internal method to check if FlushAndTeardown has been called: + result = instance_internal->IsAlive(); + } + return result; + } + /// /// Creates an instance of ILogManager using specified configuration. /// @@ -159,6 +183,14 @@ namespace MAT_NS_BEGIN // If there was no module configuration supplied explicitly, then do we treat the client as host or guest? c[CFG_BOOL_HOST_MODE] = (name == host); + if (!IsInstanceAlive(shared[host].instance)) + { + // "Reanimate" this instance by creating new instance using new config. + // This allows guests to reattach to the same host by name after its + // reinitialization, e.g. in EUDB scenarios where URL needs to change. + // Guests can keep holding on to the same instance handle. + shared[host].instance = Create(c); + } return shared[host].instance; } @@ -177,9 +209,21 @@ namespace MAT_NS_BEGIN if (kv.second.names.count(name)) { kv.second.names.erase(name); - if (kv.second.names.empty()) + auto instance = shared[host].instance; + const bool forceRelease = !IsInstanceAlive(instance); + const bool zeroGuestsRemaining = kv.second.names.empty(); + if (zeroGuestsRemaining || forceRelease) { - // Last owner is gone, destroy + if (!zeroGuestsRemaining) + { + // In this case the logs emitted by Guests attached to "stale" Host + // would be lost. Emit a warning when that happens. Typically it + // could happen when the main app is unloaded and shut down its + // telemetry, but Guest library is still running some processing. + LOG_WARN("Host released before Guests: %s", name.c_str()); + dump(); + } + // Destroy it. Destroy(shared[host].instance); shared.erase(host); } diff --git a/lib/api/LogManagerImpl.hpp b/lib/api/LogManagerImpl.hpp index f48b7a847..f3f0b1bb1 100644 --- a/lib/api/LogManagerImpl.hpp +++ b/lib/api/LogManagerImpl.hpp @@ -308,6 +308,11 @@ namespace MAT_NS_BEGIN virtual bool StartActivity() override; virtual void EndActivity() override; + virtual bool IsAlive() + { + return m_alive; + } + protected: std::unique_ptr& GetSystem(); void InitializeModules() noexcept; diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index ef5be0358..9fee8803a 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -10,13 +10,17 @@ #include "pal/TaskDispatcher_CAPI.hpp" #include "utils/Utils.hpp" +#include "LogManager.hpp" + #include "pal/PAL.hpp" #include "CommonFields.h" +#include "config/RuntimeConfig_Default.hpp" #include #include #include +#include static const char * libSemver = TELEMETRY_EVENTS_VERSION; @@ -88,7 +92,8 @@ evt_status_t mat_open_core( { if (client->ctx_data == config) { - // Guest instance with the same config is already open + // Guest or Host instance with the same config is already open + ctx->handle = code; return EALREADY; } // hash code is assigned to another client, increment and retry @@ -99,11 +104,18 @@ evt_status_t mat_open_core( isHashFound = true; } while (!isHashFound); + // Make sure that we fully inherit the default configuration, then + // overlay custom configuraiton on top of default. + clients[code].config = ILogConfiguration(); + Variant::merge_map(*clients[code].config, *defaultRuntimeConfig); + // JSON configuration must start with { if (config[0] == '{') { // Create new configuration object from JSON - clients[code].config = MAT::FromJSON(config); + ILogConfiguration jsonConfig = MAT::FromJSON(config); + // Overwrite default values with custom configuration. + Variant::merge_map(*clients[code].config, *jsonConfig, true); } else { @@ -111,7 +123,7 @@ evt_status_t mat_open_core( // That approach allows to consume the lightweght C API without JSON parser compiled in. std::string moduleName = "CAPI-Client-"; moduleName += std::to_string(code); - clients[code].config = + VariantMap customConfig = { { CFG_STR_FACTORY_NAME, moduleName }, { "version", "1.0.0" }, @@ -123,6 +135,8 @@ evt_status_t mat_open_core( }, { CFG_STR_PRIMARY_TOKEN, config } }; + // Overwrite host-guest related settings using VariantMap above. + Variant::merge_map(*clients[code].config, customConfig, true); } // Remember the original config string. Needed to avoid hash code collisions diff --git a/lib/include/public/ctmacros.hpp b/lib/include/public/ctmacros.hpp index b32b4b9b6..3188ec111 100644 --- a/lib/include/public/ctmacros.hpp +++ b/lib/include/public/ctmacros.hpp @@ -127,24 +127,48 @@ #define EVTSDK_LIBABI_CDECL MATSDK_LIBABI_CDECL #define EVTSDK_SPEC MATSDK_SPEC -/* Implement struct packing for stable FFI C API */ -#ifdef __clang__ +/* Implement struct packing for stable FFI C API to allow for C# apps + * written in Mono and .NET Standard 2.x to call into 1DS C API. + */ +#ifdef HAVE_MAT_ABI_V3_1_0 +/* Legacy v3.1 struct ABI. Not compatible with cross-plat C# projection */ +#define MATSDK_PACKED_STRUCT +#define MATSDK_PACK_PUSH +#define MATSDK_PACK_POP +#define MATSDK_ALIGN64(x) x +/* Modern v3.7 struct ABI. Compatible with cross-plat C# callers on both + * 32-bit and 64-bit Intel and ARM architectures - on Windows, Android + * and Mac. This should ideally be the default going forward, as it + * ensures predictable, compiler optimization level-agnostic C API FFI. + */ +#elif __clang__ # define MATSDK_PACKED_STRUCT __attribute__((packed)) # define MATSDK_PACK_PUSH # define MATSDK_PACK_POP +#define MATSDK_ALIGN64(x) union { x; uint64_t padding; } #elif __GNUC__ # define MATSDK_PACKED_STRUCT __attribute__((packed)) # define MATSDK_PACK_PUSH # define MATSDK_PACK_POP +#define MATSDK_ALIGN64(x) union { x; uint64_t padding; } #elif _MSC_VER # define MATSDK_PACKED_STRUCT # define MATSDK_PACK_PUSH __pragma(pack(push, 1)) # define MATSDK_PACK_POP __pragma(pack(pop)) +#define MATSDK_ALIGN64(x) union { x; uint64_t padding; } #else -/* No packing behavior on unknown compilers */ +/* Fallback to HAVE_MAT_ABI_V3_1_0 : compatible with prebuilt shared libraries + * that used the old C API only within the same arch/compiler domain. Unfortunately + * the old layout is not usable if you'd like to invoke C API from Mono (e.g. Unity) + * or cross-platform .NET Standard apps. + */ +#ifndef HAVE_MAT_ABI_V3_1_0 +#define HAVE_MAT_ABI_V3_1_0 +#endif # define MATSDK_PACKED_STRUCT # define MATSDK_PACK_PUSH # define MATSDK_PACK_POP +#define MATSDK_ALIGN64(x) x #endif #endif diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index b669e413e..c8c463c90 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -9,7 +9,13 @@ * For version handshake check there is no mandatory requirement to update the $PATCH level. * Ref. https://semver.org/ for Semantic Versioning documentation. */ -#define TELEMETRY_EVENTS_VERSION "3.7.1" +#ifdef HAVE_MAT_ABI_V3_1_0 +/* Allow to fallback to same C ABI interface as in old releases */ +#define TELEMETRY_EVENTS_VERSION "3.1.0" +#else +/* More modern "cross-arch" ABI interface with fixed padding. */ +#define TELEMETRY_EVENTS_VERSION "3.7.0" +#endif #include "ctmacros.hpp" @@ -136,7 +142,7 @@ MATSDK_PACK_POP MATSDK_PACK_PUSH evt_call_t call; /* In */ evt_handle_t handle; /* In / Out */ - void* data; /* In / Out */ + MATSDK_ALIGN64(void* data); evt_status_t result; /* Out */ uint32_t size; /* In / Out */ MATSDK_PACK_POP @@ -202,7 +208,7 @@ MATSDK_PACK_POP typedef struct MATSDK_PACKED_STRUCT evt_prop { MATSDK_PACK_PUSH - const char* name; + MATSDK_ALIGN64(const char* name); evt_prop_t type; evt_prop_v value; uint32_t piiKind; diff --git a/lib/stats/Statistics.cpp b/lib/stats/Statistics.cpp index 2f421714c..85f93d6b3 100644 --- a/lib/stats/Statistics.cpp +++ b/lib/stats/Statistics.cpp @@ -20,6 +20,7 @@ namespace MAT_NS_BEGIN { m_logManager(telemetrySystem.getLogManager()), m_baseDecorator(m_logManager), m_semanticContextDecorator(m_logManager), + m_isScheduled(false), m_isStarted(false) { } diff --git a/tests/functests/APITest.cpp b/tests/functests/APITest.cpp index 5c2dbb770..e467a0378 100644 --- a/tests/functests/APITest.cpp +++ b/tests/functests/APITest.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include "PayloadDecoder.hpp" @@ -616,6 +617,53 @@ TEST(APITest, LogManager_Reinitialize_Test) #define EVENT_NAME_PURE_C "Event.Name.Pure.C" #define JSON_CONFIG(...) #__VA_ARGS__ + +#ifndef HAVE_MAT_ABI_V3_1_0 +/* NOTE: if your library needs to be built with legacy C API, make sure that + * the same build settings get applied to your Functional Tests build. + */ +template +void check_size() { + static_assert(ExpectedSize == RealSize, "Size is off!"); +} + +/* This test performs size-checks of cross-architecture C API structs. Same C# projection + * compiled as IL assembly could be used on Mono, .NET Standard across currently supported + * architectures: Windows, Linux, Android and Mac, 32-bit/64-bit, Intel and ARM. + */ +TEST(APITest, C_API_Test_CheckSize) +{ + check_size(); + check_size(); + check_size(); + check_size(); + check_size(); + + // C# should take care of context.data void* being 32-bit on x86 and 64-bit on x64. + // Presently we support all modern 64-bit OS with C# projection (Windows-x64, + // Linux-64, Mac Intel-x64 and ARM-x64, as well as Meta Quest 2+ ARM64). + evt_context_t context; + check_size< evt_context_t, + sizeof(context.call) + + sizeof(uint64_t) + // sizeof(void*) + 32-bit padding AFTER on 32-bit OS + sizeof(context.handle) + + sizeof(context.result) + + sizeof(context.size)>(); + + // C# should take care of prop.name char* being 32-bit on x86 and 64-bit on x64. + // Presently we support all modern 64-bit OS with C# projection (Windows-x64, + // Linux-64, Mac Intel-x64 and ARM-x64, as well as Meta Quest 2+ ARM64). + evt_prop prop; + check_size(); + + check_size(); +} + +#endif TEST(APITest, C_API_Test) { TestDebugEventListener debugListener; @@ -651,7 +699,7 @@ TEST(APITest, C_API_Test) ( // Part A/B fields _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_PURE_C), // Event name - _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time in millis, ms since Jan 01 1970. (UTC) + _INT(COMMONFIELDS_EVENT_TIME, static_cast(ticks.ticks)), // Epoch time in .NET ticks _DBL("popSample", 100.0), // Effective sample rate _STR(COMMONFIELDS_IKEY, TEST_TOKEN), // iKey to send this event to _INT(COMMONFIELDS_EVENT_POLICYFLAGS, 0xffffffff), // UTC policy bitflags (optional) diff --git a/tests/functests/HostGuestTests.cpp b/tests/functests/HostGuestTests.cpp index ef2d59434..e2483846d 100644 --- a/tests/functests/HostGuestTests.cpp +++ b/tests/functests/HostGuestTests.cpp @@ -219,30 +219,43 @@ const unsigned maxEventsCount = 1; unsigned totalEvents = 0; +/* + +// +// EXAMPLE #1: configure host instance via C API. +// + const char* hostConfig = JSON_CONFIG( { "cacheFilePath" : "MyOfflineStorage.db", "config" : { - "host" : "C-API-Host", + "host" : "Mesh-Core-C-API-Host", "scope" : "*" }, "stats" : { "interval" : 0 }, - "name" : "C-API-Host", + "name" : "Mesh-Core-C-API-Host", "version" : "1.0.0", "primaryToken" : "7c8b1796cbc44bd5a03803c01c2b9d61-b6e370dd-28d9-4a52-9556-762543cf7aa7-6991", - "maxTeardownUploadTimeInSec" : 0, + "maxTeardownUploadTimeInSec" : 1, "hostMode" : true, "minimumTraceLevel" : 0, - "sdkmode" : 0 + "sdkmode" : 0, + "disableZombieLoggers": true }); +// +// EXAMPLE #2: configure host instance in C++ via JSON configuration above. +// + +static ILogConfiguration hostConfiguration = MAT::FromJSON(hostConfig); +*/ + const char* guestConfig = JSON_CONFIG( { - "cacheFilePath" : "MyOfflineStorage.db", "config" : { - "host" : "*", + "host" : "C-API-Host", "scope" : "*" }, "stats" : { @@ -254,58 +267,33 @@ const char* guestConfig = JSON_CONFIG( "maxTeardownUploadTimeInSec" : 0, "hostMode" : false, "minimumTraceLevel" : 0, - "sdkmode" : 0 + "sdkmode" : 0, + "disableZombieLoggers" : true }); const char* guestConfigIsolation = JSON_CONFIG( { - "cacheFilePath" : "MyOfflineStorage2.db", "config" : { - "host" : "*", + "host" : "C-API-Host", "scope" : "-" }, "stats" : { "interval" : 0 }, - "name" : "C-API-GuestIsolated", + "name" : "C-API-Guest2", "version" : "1.0.0", "primaryToken" : "ffffffffffffffffffffffffffffffff-ffffffff-ffff-ffff-ffff-ffffffffffff-ffff", "maxTeardownUploadTimeInSec" : 0, "hostMode" : false, "minimumTraceLevel" : 0, - "sdkmode" : 0 + "sdkmode" : 0, + "disableZombieLoggers" : true }); std::time_t now = time(0); MAT::time_ticks_t ticks(&now); -evt_handle_t hostHandle = 0; - -evt_prop hostContext[] = TELEMETRY_EVENT( - _STR("ext.device.localId", "a:4318b22fbc11ca8f"), - _STR("ext.device.make", "Microsoft"), - _STR("ext.device.model", "Clippy"), - _STR("ext.os.name", "MS-DOS"), - _STR("ext.os.ver", "2100")); - -evt_prop hostEvent[] = TELEMETRY_EVENT( - // Part A/B - _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_HOST), // Event name - _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time - _DBL("popSample", 100.0), // Effective sample rate - _STR(COMMONFIELDS_IKEY, TEST_TOKEN), // iKey to send this event to - _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), - _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), - _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), - // Part C - _STR("strKey", "value1"), - _INT("intKey", 12345), - _DBL("dblKey", 3.14), - _BOOL("boolKey", true), - _GUID("guidKey", "{01020304-0506-0708-090a-0b0c0d0e0f00}"), - _TIME("timeKey", ticks.ticks)); // .NET ticks - evt_prop guestContext[] = TELEMETRY_EVENT( _STR("ext.app.id", "com.Microsoft.Clippy"), _STR("ext.app.ver", "1.0.0"), @@ -320,8 +308,8 @@ evt_prop guestEvent[] = TELEMETRY_EVENT( _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time _DBL("popSample", 100.0), // Effective sample rate _STR(COMMONFIELDS_IKEY, TEST_TOKEN), // iKey to send this event to - _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), - _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), +// _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), +// _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), // Part C _STR("strKey", "value1"), @@ -337,8 +325,9 @@ evt_prop guestEventIsolated[] = TELEMETRY_EVENT( _STR(COMMONFIELDS_EVENT_NAME, EVENT_NAME_GUEST), // Event name _INT(COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)), // Epoch time _DBL("popSample", 100.0), // Effective sample rate - _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), - _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), + _STR(COMMONFIELDS_IKEY, DUMMY_TOKEN), // iKey to send this event to + // _INT(COMMONFIELDS_EVENT_PRIORITY, static_cast(EventPriority_Immediate)), // <-- Useful for realtime force-push + // _INT(COMMONFIELDS_EVENT_LATENCY, static_cast(EventLatency_Max)), _INT(COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED), // Part C _STR("strKey", "value1"), @@ -351,8 +340,19 @@ evt_prop guestEventIsolated[] = TELEMETRY_EVENT( ////////////////////////////////////////////////////////////////////////////////////////// // HOST TEST ////////////////////////////////////////////////////////////////////////////////////////// -void createHost() +void createHostCpp() { + auto& cfg = LogManager::GetLogConfiguration(); + cfg["name"] = "C-API-Host"; + cfg["version"] = "1.0.0"; + cfg["config"]["host"] = "C-API-Host"; + cfg["hostMode"] = true; + cfg["primaryToken"] = TEST_TOKEN; + cfg[CFG_STR_COLLECTOR_URL] = COLLECTOR_URL_PROD; + cfg["stats"]["interval"] = 0; // no stats events + cfg["maxTeardownUploadTimeInSec"] = 0; // fast teardown + cfg["disableZombieLoggers"] = true; + totalEvents = 0; debugListener.OnLogX = [&](::CsProtocol::Record& record) { @@ -367,11 +367,6 @@ void createHost() ASSERT_EQ(record.data[0].properties["intKey"].longValue, 12345); // Verify integer ASSERT_EQ(record.data[0].properties["dblKey"].doubleValue, 3.14); // Verify double ASSERT_EQ(record.data[0].properties["boolKey"].longValue, 1); // Verify boolean - auto guid = record.data[0].properties["guidKey"].guidValue[0].data(); - auto guidStr = GUID_t(guid).to_string(); - std::string guidStr2 = "01020304-0506-0708-090a-0b0c0d0e0f00"; - ASSERT_STRCASEEQ(guidStr.c_str(), guidStr2.c_str()); // Verify GUID - ASSERT_EQ(record.data[0].properties["timeKey"].longValue, (int64_t)ticks.ticks); // Verify time ASSERT_EQ(record.extDevice[0].localId, "a:4318b22fbc11ca8f"); // Verify ext.device.localId ASSERT_EQ(record.extProtocol[0].devMake, "Microsoft"); // NOTE the schema quirk == ext.device.make @@ -389,32 +384,44 @@ void createHost() #endif }; - hostHandle = evt_open(hostConfig); - ASSERT_NE(hostHandle, 0); - evt_pause(hostHandle); - // Use self (LogManager) context to append additional context variables. - evt_set_logmanager_context(hostHandle, hostContext); + // C++ syntax for populating Common Part A properties in context. + const auto logger = LogManager::Initialize(TEST_TOKEN, cfg); + EXPECT_NE(logger, nullptr); - const auto client = capi_get_client(hostHandle); - ASSERT_NE(client, nullptr); - ASSERT_NE(client->logmanager, nullptr); + // Populate common Part A ext.* properties using `SetCommonField` API + // These properties would be inherited by Guest instances. + const auto context = LogManager::GetSemanticContext(); + context->SetCommonField("ext.device.localId", "a:4318b22fbc11ca8f"); + context->SetCommonField("ext.device.make", "Microsoft"); + context->SetCommonField("ext.device.model", "Clippy"); + context->SetCommonField("ext.os.name", "MS-DOS"); + context->SetCommonField("ext.os.ver", "2100"); - // Bind from C API LogManager instance to C++ DebugEventListener - // to verify event contents. Currently we do not support registering - // debug callbacks via C API, so we obtain the ILogManager first, - // then register event listener on it. - client->logmanager->AddEventListener(EVT_LOG_EVENT, debugListener); + const auto instance = LogManager::GetInstance(); + EXPECT_NE(instance, nullptr); + + LogManager::AddEventListener(EVT_LOG_EVENT, debugListener); for (size_t i = 0; i < maxEventsCount; i++) { - evt_log(hostHandle, hostEvent); + EventProperties props{ + EVENT_NAME_HOST, + {{COMMONFIELDS_EVENT_TIME, static_cast(now * 1000L)}, // Epoch time + {"popSample", 100.0}, // Effective sample rate + {COMMONFIELDS_EVENT_LEVEL, DIAG_LEVEL_REQUIRED}, + {"strKey", "value1"}, + {"intKey", 12345}, + {"dblKey", 3.14}, + {"boolKey", static_cast(true)} + } + }; + logger->LogEvent(props); } EXPECT_EQ(totalEvents, maxEventsCount); - evt_flush(hostHandle); // Remove debug listener - client->logmanager->RemoveEventListener(EVT_LOG_EVENT, debugListener); + LogManager::RemoveEventListener(EVT_LOG_EVENT, debugListener); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -570,33 +577,43 @@ void createGuestIsolated() // Close guest evt_close(guestHandle); ASSERT_EQ(capi_get_client(guestHandle), nullptr); - ////////////////////////////////////////////////////////////////////////////////////////// } +// Create and teardown host. +// Validate that events get emitted with right props. TEST(HostGuestTest, C_API_CreateHost) { - hostHandle = 0; - createHost(); - evt_close(hostHandle); - ASSERT_EQ(capi_get_client(hostHandle), nullptr); + createHostCpp(); + LogManager::FlushAndTeardown(); } +// Verify that we can create Host + Guest pair. +// Validate that events get emitted with right props. TEST(HostGuestTest, C_API_CreateGuest) { - hostHandle = 0; - createHost(); + createHostCpp(); + createGuest(); + LogManager::FlushAndTeardown(); +} + +// Verify that we properly deallocated all resources: +// same Host + Guest pair can be recreated again. +// Validate that events get emitted with right props. +TEST(HostGuestTest, C_API_CreateGuestAgain) +{ + createHostCpp(); createGuest(); - evt_close(hostHandle); - ASSERT_EQ(capi_get_client(hostHandle), nullptr); + LogManager::FlushAndTeardown(); } +// Create Host with "sandboxed" Guest with limited scope +// that does not inherit its Host context. +// Validate that events get emitted with right props. TEST(HostGuestTest, C_API_CreateGuestIsolated) { - hostHandle = 0; - createHost(); + createHostCpp(); createGuestIsolated(); - evt_close(hostHandle); - ASSERT_EQ(capi_get_client(hostHandle), nullptr); + LogManager::FlushAndTeardown(); } // TEST_PULL_ME_IN(HostGuestTests) From 12012483d98ae5ee814ab8ff31d57b7dcd9bd382 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Mon, 3 Apr 2023 23:37:02 -0700 Subject: [PATCH 27/29] Fix typo. --- lib/api/capi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index 9fee8803a..3f5bc9bce 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -105,7 +105,7 @@ evt_status_t mat_open_core( } while (!isHashFound); // Make sure that we fully inherit the default configuration, then - // overlay custom configuraiton on top of default. + // overlay custom configuration on top of default. clients[code].config = ILogConfiguration(); Variant::merge_map(*clients[code].config, *defaultRuntimeConfig); From fe63e64e782f4651a3186372f273c99a733df00f Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Tue, 12 Sep 2023 20:21:40 -0700 Subject: [PATCH 28/29] Formatting change and resolve merge conflicts --- lib/api/capi.cpp | 1 - lib/include/public/mat.h | 6 ++++-- tests/functests/APITest.cpp | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/api/capi.cpp b/lib/api/capi.cpp index 508685630..f64fa2b94 100644 --- a/lib/api/capi.cpp +++ b/lib/api/capi.cpp @@ -551,7 +551,6 @@ extern "C" { // Add more OPs here - default: result = ENOTSUP; break; diff --git a/lib/include/public/mat.h b/lib/include/public/mat.h index 72540e31d..c61a174bb 100644 --- a/lib/include/public/mat.h +++ b/lib/include/public/mat.h @@ -65,6 +65,7 @@ extern "C" { EVT_OP_FLUSH = 0x0000000A, EVT_OP_VERSION = 0x0000000B, EVT_OP_OPEN_WITH_PARAMS = 0x0000000C, + EVT_OP_FLUSHANDTEARDOWN = 0x0000000D, /** * Context operations allow to set ILogger or ILogManager semantic context values. * In addition to custom Part C context values, Common Schema attributes, e.g. `ext.device.id` @@ -73,8 +74,9 @@ extern "C" { * event fields to C API for extensions, SDK-in-SDK, and higher-level programming * languages such as Unity C# and .NET Standard. */ - EVT_OP_SET_LOGGER_CONTEXT = 0x0000000D, - EVT_OP_MAX = EVT_OP_OPEN_WITH_PARAMS + 1 + EVT_OP_SET_LOGGER_CONTEXT = 0x0000000E, + EVT_OP_SET_LOGMANAGER_CONTEXT = 0x0000000F, + EVT_OP_MAX = EVT_OP_SET_LOGMANAGER_CONTEXT + 1, EVT_OP_MAXINT = 0xFFFFFFFF } evt_call_t; diff --git a/tests/functests/APITest.cpp b/tests/functests/APITest.cpp index fd4b7d184..1c6293f30 100644 --- a/tests/functests/APITest.cpp +++ b/tests/functests/APITest.cpp @@ -773,7 +773,7 @@ TEST(APITest, C_API_Test) // Must remove event listener befor closing the handle! client->logmanager->RemoveEventListener(EVT_LOG_EVENT, debugListener); - evt_flushAndTeardown(handle); + // evt_flushAndTeardown(handle); // <-- This is redundant since evt_close ref-counts and performs FlushAndTeardown evt_close(handle); ASSERT_EQ(capi_get_client(handle), nullptr); From 3f6bf3df84c28ed1a240de963528c38009ecfbf6 Mon Sep 17 00:00:00 2001 From: Max Golovanov Date: Tue, 12 Sep 2023 21:20:16 -0700 Subject: [PATCH 29/29] Revert unrelated changes --- Solutions/MSTelemetrySDK.sln | 503 ++++++----------------------------- tools/decoder/Decoder.cs | 1 + tools/server/Program.cs | 1 - tools/server/Startup.cs | 25 +- 4 files changed, 90 insertions(+), 440 deletions(-) diff --git a/Solutions/MSTelemetrySDK.sln b/Solutions/MSTelemetrySDK.sln index daf5e9172..ef5c2c277 100644 --- a/Solutions/MSTelemetrySDK.sln +++ b/Solutions/MSTelemetrySDK.sln @@ -131,52 +131,128 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liveeventinspector", "..\li EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "signals", "..\lib\modules\signals\signals.vcxitems", "{D5E1C2E4-DF23-4D2E-85F8-DF737C6A9B9D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventSender", "..\wrappers\netcore\EventSender.csproj", "{1DED6E39-F83D-47EF-83D6-77FBF5690C1B}" -EndProject Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\lib\modules\cds\cds.vcxitems*{0299c8ba-03b9-451e-8a52-8df1291173a5}*SharedItemsImports = 9 + ..\lib\pal\universal\universal.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cc}*SharedItemsImports = 9 + ..\lib\pal\desktop\desktop.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cd}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{20ad4f2b-3f98-4baf-8144-e1e7682a7927}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{2bfafe9a-45b0-4c02-841e-03e47fd2e340}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\shared\Shared.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 + ..\lib\modules\azmon\azmon.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 + ..\lib\decoder\decoder.vcxitems*{65b6880e-fc36-443d-a7a5-0e6cda6523ac}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{6dc5ab1d-3d64-4c52-8d8e-d9a8b0c16f14}*SharedItemsImports = 9 + ..\lib\modules\azmon\azmon.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\exp\exp.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\pal\universal\universal.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 + ..\lib\modules\signals\signals.vcxitems*{d5e1c2e4-df23-4d2e-85f8-df737c6a9b9d}*SharedItemsImports = 9 + ..\lib\modules\filter\filter.vcxitems*{d74e42ec-c6ee-4944-b92a-eb711be002a9}*SharedItemsImports = 9 + ..\lib\shared\Shared.vcxitems*{dc91621e-a203-42df-8e03-3a23dd0602b1}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{e1f6ca48-3bbf-4378-8d1e-6bbf4869db5b}*SharedItemsImports = 9 + ..\lib\shared\Shared.vcxitems*{ef859326-2a11-481c-ae8c-03d754f1c412}*SharedItemsImports = 9 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{f8bb42f6-9c93-423b-b0c6-23ef79dd959a}*SharedItemsImports = 9 + ..\lib\decoder\decoder.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\azmon\azmon.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\cds\cds.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\dataviewer\dataviewer.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\filter\filter.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\modules\privacyguard\privacyguard.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + ..\lib\pal\desktop\desktop.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + Clienttelemetry\Clienttelemetry.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug.static|Any CPU = Debug.static|Any CPU Debug.static|ARM = Debug.static|ARM Debug.static|ARM64 = Debug.static|ARM64 Debug.static|Win32 = Debug.static|Win32 Debug.static|x64 = Debug.static|x64 - Debug.vc14x.MT-sqlite|Any CPU = Debug.vc14x.MT-sqlite|Any CPU Debug.vc14x.MT-sqlite|ARM = Debug.vc14x.MT-sqlite|ARM Debug.vc14x.MT-sqlite|ARM64 = Debug.vc14x.MT-sqlite|ARM64 Debug.vc14x.MT-sqlite|Win32 = Debug.vc14x.MT-sqlite|Win32 Debug.vc14x.MT-sqlite|x64 = Debug.vc14x.MT-sqlite|x64 - Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 - Release.static|Any CPU = Release.static|Any CPU Release.static|ARM = Release.static|ARM Release.static|ARM64 = Release.static|ARM64 Release.static|Win32 = Release.static|Win32 Release.static|x64 = Release.static|x64 - Release.vc14x.MT-sqlite|Any CPU = Release.vc14x.MT-sqlite|Any CPU Release.vc14x.MT-sqlite|ARM = Release.vc14x.MT-sqlite|ARM Release.vc14x.MT-sqlite|ARM64 = Release.vc14x.MT-sqlite|ARM64 Release.vc14x.MT-sqlite|Win32 = Release.vc14x.MT-sqlite|Win32 Release.vc14x.MT-sqlite|x64 = Release.vc14x.MT-sqlite|x64 - Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|ARM64.Build.0 = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Win32.ActiveCfg = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|Win32.Build.0 = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.static|x64.ActiveCfg = Debug|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -184,8 +260,6 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Any CPU.ActiveCfg = Debug|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Any CPU.Build.0 = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -193,8 +267,6 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|Win32.Build.0 = Debug|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|x64.ActiveCfg = Debug|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Debug|x64.Build.0 = Debug|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM64.ActiveCfg = Release|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -202,8 +274,6 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|Win32.Build.0 = Release|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|x64.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.static|x64.Build.0 = Release|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -212,8 +282,6 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release.vc14x.MT-sqlite|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Any CPU.ActiveCfg = Release|x64 - {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Any CPU.Build.0 = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM64.ActiveCfg = Release|ARM64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|ARM64.Build.0 = Release|ARM64 @@ -221,22 +289,16 @@ Global {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|Win32.Build.0 = Release|Win32 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|x64.ActiveCfg = Release|x64 {2EBC7B3C-2AF1-442C-9285-CAB39BBB8C00}.Release|x64.Build.0 = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|ARM64.Build.0 = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|Win32.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.static|x64.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -244,21 +306,15 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Debug|x64.Build.0 = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|ARM64.Build.0 = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|Win32.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.static|x64.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|ARM64.Build.0 = Release|ARM64 @@ -266,22 +322,16 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C32}.Release|x64.Build.0 = Release|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|ARM64.Build.0 = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|Win32.ActiveCfg = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.static|x64.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Any CPU.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Any CPU.Build.0 = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM.Build.0 = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -290,21 +340,15 @@ Global {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|Win32.Build.0 = Debug|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|x64.ActiveCfg = Debug|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Debug|x64.Build.0 = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Any CPU.ActiveCfg = Release|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM.ActiveCfg = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM64.ActiveCfg = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|ARM64.Build.0 = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|Win32.ActiveCfg = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.static|x64.ActiveCfg = Release|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Any CPU.ActiveCfg = Release|x64 - {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Any CPU.Build.0 = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM.ActiveCfg = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM.Build.0 = Release|ARM {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -313,22 +357,16 @@ Global {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|Win32.Build.0 = Release|Win32 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|x64.ActiveCfg = Release|x64 {57A81ED9-5603-471F-AFEE-9656DA74178D}.Release|x64.Build.0 = Release|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|ARM64.Build.0 = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|Win32.ActiveCfg = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.static|x64.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Any CPU.Build.0 = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM.Build.0 = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -337,21 +375,15 @@ Global {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|Win32.Build.0 = Debug|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|x64.ActiveCfg = Debug|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Debug|x64.Build.0 = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Any CPU.ActiveCfg = Release|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM.ActiveCfg = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM64.ActiveCfg = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|ARM64.Build.0 = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|Win32.ActiveCfg = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.static|x64.ActiveCfg = Release|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Any CPU.ActiveCfg = Release|x64 - {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Any CPU.Build.0 = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM.ActiveCfg = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM.Build.0 = Release|ARM {49077DBF-E363-4D2D-8334-636569A771B6}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -360,58 +392,46 @@ Global {49077DBF-E363-4D2D-8334-636569A771B6}.Release|Win32.Build.0 = Release|Win32 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|x64.ActiveCfg = Release|x64 {49077DBF-E363-4D2D-8334-636569A771B6}.Release|x64.Build.0 = Release|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|ARM.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.static|x64.ActiveCfg = Debug|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Any CPU.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|ARM.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|ARM64.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Win32.ActiveCfg = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|Win32.Build.0 = Debug|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|x64.ActiveCfg = Debug|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Debug|x64.Build.0 = Debug|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.static|x64.ActiveCfg = Release|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 - {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Any CPU.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|ARM.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|ARM64.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Win32.ActiveCfg = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|Win32.Build.0 = Release|Win32 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|x64.ActiveCfg = Release|x64 {DC91621E-A203-42DF-8E03-3A23DD0602B1}.Release|x64.Build.0 = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|ARM64.Build.0 = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|Win32.ActiveCfg = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.static|x64.ActiveCfg = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Any CPU.Build.0 = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -419,23 +439,17 @@ Global {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.ActiveCfg = Debug|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|x64.Build.0 = Debug|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Any CPU.ActiveCfg = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|ARM64.Build.0 = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|Win32.ActiveCfg = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.static|x64.ActiveCfg = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Any CPU.ActiveCfg = Release|x64 - {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Any CPU.Build.0 = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM64.ActiveCfg = Release|ARM64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|ARM64.Build.0 = Release|ARM64 @@ -443,23 +457,17 @@ Global {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.ActiveCfg = Release|x64 {34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|x64.Build.0 = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|ARM64.Build.0 = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|Win32.ActiveCfg = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.static|x64.ActiveCfg = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Any CPU.ActiveCfg = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Any CPU.Build.0 = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -467,23 +475,17 @@ Global {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.ActiveCfg = Debug|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|x64.Build.0 = Debug|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Any CPU.ActiveCfg = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|ARM64.Build.0 = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|Win32.ActiveCfg = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.static|x64.ActiveCfg = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Any CPU.ActiveCfg = Release|x64 - {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Any CPU.Build.0 = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM64.ActiveCfg = Release|ARM64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|ARM64.Build.0 = Release|ARM64 @@ -491,23 +493,17 @@ Global {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.ActiveCfg = Release|x64 {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|x64.Build.0 = Release|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|ARM64.Build.0 = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|Win32.ActiveCfg = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|x64.ActiveCfg = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.static|x64.Build.0 = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Any CPU.ActiveCfg = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Any CPU.Build.0 = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM.Build.0 = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -516,21 +512,15 @@ Global {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|Win32.Build.0 = Debug|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|x64.ActiveCfg = Debug|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Debug|x64.Build.0 = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Any CPU.ActiveCfg = Release|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM.ActiveCfg = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM64.ActiveCfg = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|ARM64.Build.0 = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|Win32.ActiveCfg = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.static|x64.ActiveCfg = Release|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Any CPU.ActiveCfg = Release|x64 - {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Any CPU.Build.0 = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM.ActiveCfg = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM.Build.0 = Release|ARM {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -539,8 +529,6 @@ Global {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|Win32.Build.0 = Release|Win32 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|x64.ActiveCfg = Release|x64 {6883A688-89F5-424A-9BFA-50D42F691B29}.Release|x64.Build.0 = Release|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM.Build.0 = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 @@ -549,8 +537,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|Win32.Build.0 = Debug|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|x64.ActiveCfg = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.static|x64.Build.0 = Debug|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -558,8 +544,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Any CPU.Build.0 = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -568,8 +552,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM.ActiveCfg = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM64.ActiveCfg = Release|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -577,8 +559,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|Win32.Build.0 = Release|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|x64.ActiveCfg = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.static|x64.Build.0 = Release|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -586,8 +566,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Any CPU.ActiveCfg = Release|x64 - {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Any CPU.Build.0 = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -596,8 +574,6 @@ Global {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|ARM64.Build.0 = Debug|ARM64 @@ -605,8 +581,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.static|x64.Build.0 = Debug|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -614,8 +588,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Any CPU.Build.0 = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -623,8 +595,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Debug|x64.Build.0 = Debug|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|ARM64.Build.0 = Release|ARM64 @@ -632,8 +602,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.static|x64.Build.0 = Release|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -641,8 +609,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Any CPU.ActiveCfg = Release|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Any CPU.Build.0 = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|ARM64.Build.0 = Release|ARM64 @@ -650,22 +616,16 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D42}.Release|x64.Build.0 = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|ARM64.Build.0 = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|Win32.ActiveCfg = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.static|x64.ActiveCfg = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Any CPU.ActiveCfg = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Any CPU.Build.0 = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM64.ActiveCfg = Debug|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -673,21 +633,15 @@ Global {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|Win32.Build.0 = Debug|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|x64.ActiveCfg = Debug|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Debug|x64.Build.0 = Debug|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Any CPU.ActiveCfg = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|ARM64.Build.0 = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|Win32.ActiveCfg = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.static|x64.ActiveCfg = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Any CPU.ActiveCfg = Release|x64 - {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Any CPU.Build.0 = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM64.ActiveCfg = Release|ARM64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|ARM64.Build.0 = Release|ARM64 @@ -695,22 +649,16 @@ Global {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|Win32.Build.0 = Release|Win32 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|x64.ActiveCfg = Release|x64 {434C594F-CDE0-3690-AC0A-9ED854B74092}.Release|x64.Build.0 = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|ARM64.Build.0 = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|Win32.ActiveCfg = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.static|x64.ActiveCfg = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Any CPU.ActiveCfg = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Any CPU.Build.0 = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -718,21 +666,15 @@ Global {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|Win32.Build.0 = Debug|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|x64.ActiveCfg = Debug|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Debug|x64.Build.0 = Debug|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Any CPU.ActiveCfg = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|ARM64.Build.0 = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|Win32.ActiveCfg = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.static|x64.ActiveCfg = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Any CPU.ActiveCfg = Release|x64 - {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Any CPU.Build.0 = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM64.ActiveCfg = Release|ARM64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|ARM64.Build.0 = Release|ARM64 @@ -740,22 +682,16 @@ Global {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|Win32.Build.0 = Release|Win32 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|x64.ActiveCfg = Release|x64 {FE79FB3A-B3EF-38DF-B7A4-11277DB72B39}.Release|x64.Build.0 = Release|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|Any CPU.Build.0 = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|ARM64.Build.0 = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|Win32.ActiveCfg = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.static|x64.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|Any CPU.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|Any CPU.Build.0 = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM.Build.0 = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -764,21 +700,15 @@ Global {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|Win32.Build.0 = Debug|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|x64.ActiveCfg = Debug|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Debug|x64.Build.0 = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|Any CPU.ActiveCfg = Release|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|Any CPU.Build.0 = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM.ActiveCfg = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM64.ActiveCfg = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|ARM64.Build.0 = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|Win32.ActiveCfg = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.static|x64.ActiveCfg = Release|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|Any CPU.ActiveCfg = Release|x64 - {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|Any CPU.Build.0 = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM.ActiveCfg = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM.Build.0 = Release|ARM {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|ARM64.ActiveCfg = Release|ARM64 @@ -787,8 +717,6 @@ Global {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|Win32.Build.0 = Release|Win32 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|x64.ActiveCfg = Release|x64 {7A75748D-5D6B-48A5-83CB-F5F439133D59}.Release|x64.Build.0 = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|ARM64.ActiveCfg = Debug|ARM64 @@ -797,8 +725,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.static|x64.Build.0 = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|ARM64 @@ -807,8 +733,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Any CPU.ActiveCfg = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Any CPU.Build.0 = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM.ActiveCfg = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM64.ActiveCfg = Debug|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -816,8 +740,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|Win32.Build.0 = Debug|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|x64.ActiveCfg = Debug|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Debug|x64.Build.0 = Debug|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|ARM64.ActiveCfg = Release|ARM64 @@ -826,8 +748,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.static|x64.Build.0 = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|ARM64 @@ -836,8 +756,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Any CPU.ActiveCfg = Release|x64 - {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Any CPU.Build.0 = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM.ActiveCfg = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM64.ActiveCfg = Release|ARM64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|ARM64.Build.0 = Release|ARM64 @@ -845,8 +763,6 @@ Global {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|Win32.Build.0 = Release|Win32 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|x64.ActiveCfg = Release|x64 {216A8E97-21F7-4BEF-9E52-7F772C177C33}.Release|x64.Build.0 = Release|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 @@ -855,8 +771,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.static|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -864,8 +778,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Any CPU.Build.0 = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM.ActiveCfg = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -873,8 +785,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|Win32.Build.0 = Debug|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|x64.ActiveCfg = Debug|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Debug|x64.Build.0 = Debug|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM.Build.0 = Debug.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 @@ -883,8 +793,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.static|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -892,8 +800,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Any CPU.ActiveCfg = Release|x64 - {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Any CPU.Build.0 = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM.ActiveCfg = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM64.ActiveCfg = Release|ARM64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|ARM64.Build.0 = Release|ARM64 @@ -901,8 +807,6 @@ Global {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|Win32.Build.0 = Release|Win32 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|x64.ActiveCfg = Release|x64 {1DC6B38A-B390-34CE-907F-4958807A3D43}.Release|x64.Build.0 = Release|x64 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Any CPU.ActiveCfg = Debug|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|ARM64.ActiveCfg = Release|Win32 @@ -911,8 +815,6 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.static|x64.Build.0 = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 @@ -921,15 +823,11 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug.vc14x.MT-sqlite|x64.Build.0 = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Any CPU.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|ARM.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|ARM64.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Win32.ActiveCfg = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|Win32.Build.0 = Debug|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Debug|x64.ActiveCfg = Debug|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Any CPU.ActiveCfg = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|ARM64.ActiveCfg = Release|Win32 @@ -938,8 +836,6 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.static|x64.Build.0 = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Win32 @@ -948,15 +844,11 @@ Global {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Any CPU.ActiveCfg = Release|Win32 - {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Any CPU.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|ARM.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|ARM64.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Win32.ActiveCfg = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|Win32.Build.0 = Release|Win32 {277AEB2C-E995-4A40-B63A-B16B8A3A4550}.Release|x64.ActiveCfg = Release|Win32 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Any CPU.Build.0 = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -964,8 +856,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|Win32.Build.0 = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|x64.ActiveCfg = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.static|x64.Build.0 = Debug.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -973,8 +863,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Any CPU.ActiveCfg = Debug|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Any CPU.Build.0 = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM.ActiveCfg = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM64.ActiveCfg = Debug|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -982,8 +870,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|Win32.Build.0 = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|x64.ActiveCfg = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Debug|x64.Build.0 = Debug|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Any CPU.ActiveCfg = Release.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Any CPU.Build.0 = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM.ActiveCfg = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -991,8 +877,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|Win32.Build.0 = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|x64.ActiveCfg = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.static|x64.Build.0 = Release.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -1000,8 +884,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Any CPU.ActiveCfg = Release|x64 - {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Any CPU.Build.0 = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM.ActiveCfg = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM64.ActiveCfg = Release|ARM64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|ARM64.Build.0 = Release|ARM64 @@ -1009,7 +891,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF360}.Release|Win32.Build.0 = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|x64.ActiveCfg = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF360}.Release|x64.Build.0 = Release|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|ARM.Deploy.0 = Debug|ARM @@ -1022,7 +903,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.static|x64.Deploy.0 = Debug|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Debug|ARM @@ -1035,7 +915,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug.vc14x.MT-sqlite|x64.Deploy.0 = Debug|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|Any CPU.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.ActiveCfg = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.Build.0 = Debug|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|ARM.Deploy.0 = Debug|ARM @@ -1046,7 +925,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.ActiveCfg = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.Build.0 = Debug|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Debug|x64.Deploy.0 = Debug|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|ARM.Deploy.0 = Release|ARM @@ -1059,7 +937,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.static|x64.Deploy.0 = Release|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|ARM @@ -1072,7 +949,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 - {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|Any CPU.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.ActiveCfg = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.Build.0 = Release|ARM {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|ARM.Deploy.0 = Release|ARM @@ -1084,7 +960,6 @@ Global {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.ActiveCfg = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.Build.0 = Release|x64 {39DBD601-4D79-49F9-AD18-065404DBA273}.Release|x64.Deploy.0 = Release|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -1093,7 +968,6 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.static|x64.Build.0 = Debug|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1102,14 +976,12 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Any CPU.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|ARM.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|ARM64.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Win32.ActiveCfg = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|Win32.Build.0 = Debug|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|x64.ActiveCfg = Debug|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Debug|x64.Build.0 = Debug|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -1118,7 +990,6 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.static|x64.Build.0 = Release|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1127,14 +998,12 @@ Global {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 - {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Any CPU.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|ARM.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|ARM64.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Win32.ActiveCfg = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|Win32.Build.0 = Release|x86 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|x64.ActiveCfg = Release|x64 {65AFA0E2-F9A2-4309-87E7-E419D59583C1}.Release|x64.Build.0 = Release|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|ARM.Deploy.0 = Debug|ARM @@ -1147,7 +1016,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.static|x64.Deploy.0 = Debug|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|ARM.Deploy.0 = Debug|ARM @@ -1160,7 +1028,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug.vc14x.MT-sqlite|x64.Deploy.0 = Debug|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|Any CPU.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.ActiveCfg = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.Build.0 = Debug|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|ARM.Deploy.0 = Debug|ARM @@ -1173,7 +1040,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.ActiveCfg = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.Build.0 = Debug|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Debug|x64.Deploy.0 = Debug|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|ARM.Deploy.0 = Release|ARM @@ -1186,7 +1052,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.static|x64.Deploy.0 = Release|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|ARM.Deploy.0 = Release|ARM @@ -1199,7 +1064,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release.vc14x.MT-sqlite|x64.Deploy.0 = Release|x64 - {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|Any CPU.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.ActiveCfg = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.Build.0 = Release|ARM {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|ARM.Deploy.0 = Release|ARM @@ -1212,8 +1076,6 @@ Global {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.ActiveCfg = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.Build.0 = Release|x64 {F797B22C-A1C4-4136-9DCC-0682A183A4DA}.Release|x64.Deploy.0 = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -1222,8 +1084,6 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.static|x64.Build.0 = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1232,8 +1092,6 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Any CPU.Build.0 = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM.ActiveCfg = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|ARM64.Build.0 = Debug|x64 @@ -1241,8 +1099,6 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|Win32.Build.0 = Debug|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|x64.ActiveCfg = Debug|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Debug|x64.Build.0 = Debug|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Any CPU.ActiveCfg = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -1251,8 +1107,6 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.static|x64.Build.0 = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1261,16 +1115,12 @@ Global {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Any CPU.ActiveCfg = Release|x64 - {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Any CPU.Build.0 = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|ARM.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|ARM64.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Win32.ActiveCfg = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|Win32.Build.0 = Release|Win32 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|x64.ActiveCfg = Release|x64 {77053F92-F003-4D1C-A489-1DEB7CFEA4EC}.Release|x64.Build.0 = Release|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Any CPU.Build.0 = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -1278,8 +1128,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|Win32.Build.0 = Debug.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|x64.ActiveCfg = Debug.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.static|x64.Build.0 = Debug.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -1287,8 +1135,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Any CPU.ActiveCfg = Debug|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Any CPU.Build.0 = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM.ActiveCfg = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM64.ActiveCfg = Debug|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -1296,8 +1142,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|Win32.Build.0 = Debug|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|x64.ActiveCfg = Debug|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Debug|x64.Build.0 = Debug|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Any CPU.ActiveCfg = Release.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Any CPU.Build.0 = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM.ActiveCfg = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -1305,8 +1149,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|Win32.Build.0 = Release.static|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|x64.ActiveCfg = Release.static|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.static|x64.Build.0 = Release.static|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -1314,8 +1156,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Any CPU.ActiveCfg = Release|x64 - {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Any CPU.Build.0 = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM.ActiveCfg = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM64.ActiveCfg = Release|ARM64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|ARM64.Build.0 = Release|ARM64 @@ -1323,7 +1163,6 @@ Global {86AC752C-5687-4377-841E-943D9BEEF361}.Release|Win32.Build.0 = Release|Win32 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|x64.ActiveCfg = Release|x64 {86AC752C-5687-4377-841E-943D9BEEF361}.Release|x64.Build.0 = Release|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|Any CPU.ActiveCfg = Debug.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM.ActiveCfg = Debug.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM64.ActiveCfg = Debug.static|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|ARM64.Build.0 = Debug.static|ARM64 @@ -1331,7 +1170,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|Win32.Build.0 = Debug.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|x64.ActiveCfg = Debug.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.static|x64.Build.0 = Debug.static|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug.vc14x.MT-sqlite|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug.vc14x.MT-sqlite|ARM64 @@ -1339,7 +1177,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug.vc14x.MT-sqlite|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|Any CPU.ActiveCfg = Debug|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM.ActiveCfg = Debug|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -1347,7 +1184,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|Win32.Build.0 = Debug|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|x64.ActiveCfg = Debug|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Debug|x64.Build.0 = Debug|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|Any CPU.ActiveCfg = Release.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM.ActiveCfg = Release.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM64.ActiveCfg = Release.static|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|ARM64.Build.0 = Release.static|ARM64 @@ -1355,7 +1191,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|Win32.Build.0 = Release.static|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|x64.ActiveCfg = Release.static|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.static|x64.Build.0 = Release.static|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release.vc14x.MT-sqlite|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release.vc14x.MT-sqlite|ARM64 @@ -1363,7 +1198,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release.vc14x.MT-sqlite|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release.vc14x.MT-sqlite|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release.vc14x.MT-sqlite|x64.Build.0 = Release.vc14x.MT-sqlite|x64 - {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|Any CPU.ActiveCfg = Release|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM.ActiveCfg = Release|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM64.ActiveCfg = Release|ARM64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|ARM64.Build.0 = Release|ARM64 @@ -1371,8 +1205,6 @@ Global {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|Win32.Build.0 = Release|Win32 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|x64.ActiveCfg = Release|x64 {C947B185-2B00-4073-A19D-483ED5C7EDC2}.Release|x64.Build.0 = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Any CPU.ActiveCfg = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|ARM64.ActiveCfg = Release|x64 @@ -1381,8 +1213,6 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.static|x64.Build.0 = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1391,16 +1221,12 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Any CPU.ActiveCfg = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Any CPU.Build.0 = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|ARM.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|ARM64.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Win32.ActiveCfg = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|Win32.Build.0 = Debug|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|x64.ActiveCfg = Debug|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Debug|x64.Build.0 = Debug|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Any CPU.ActiveCfg = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|ARM64.ActiveCfg = Release|x64 @@ -1409,8 +1235,6 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.static|x64.Build.0 = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|x64 @@ -1419,74 +1243,12 @@ Global {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Any CPU.ActiveCfg = Release|x64 - {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Any CPU.Build.0 = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|ARM.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|ARM64.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Win32.ActiveCfg = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|Win32.Build.0 = Release|Win32 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|x64.ActiveCfg = Release|x64 {7DBFBA1F-520D-4C93-A33E-DD92FD4F9222}.Release|x64.Build.0 = Release|x64 - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|Any CPU.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|Any CPU.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|ARM.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|ARM.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|ARM64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|ARM64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|Win32.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|Win32.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|x64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.static|x64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|Any CPU.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|Any CPU.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|ARM.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|ARM.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|ARM64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|ARM64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|Win32.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|Win32.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|x64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug.vc14x.MT-sqlite|x64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|ARM.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|ARM.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|ARM64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|Win32.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|Win32.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|x64.ActiveCfg = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Debug|x64.Build.0 = Debug|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|Any CPU.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|Any CPU.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|ARM.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|ARM.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|ARM64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|ARM64.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|Win32.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|Win32.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|x64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.static|x64.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|Any CPU.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|Any CPU.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|ARM.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|ARM.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|ARM64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|ARM64.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|Win32.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|Win32.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|x64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release.vc14x.MT-sqlite|x64.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|Any CPU.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|ARM.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|ARM.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|ARM64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|ARM64.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|Win32.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|Win32.Build.0 = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|x64.ActiveCfg = Release|Any CPU - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1524,97 +1286,8 @@ Global {0299C8BA-03B9-451E-8A52-8DF1291173A5} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} {F8BB42F6-9C93-423B-B0C6-23EF79DD959A} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} {D5E1C2E4-DF23-4D2E-85F8-DF737C6A9B9D} = {23F546DE-29F8-4F18-A378-42BCFE1781C0} - {1DED6E39-F83D-47EF-83D6-77FBF5690C1B} = {11A3C4B2-1800-4A80-9771-E92E98B9485B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7EE8585B-C10F-4DAC-BDAF-3726EDF8FCD7} EndGlobalSection - GlobalSection(SharedMSBuildProjectFiles) = preSolution - ..\lib\modules\cds\cds.vcxitems*{0299c8ba-03b9-451e-8a52-8df1291173a5}*SharedItemsImports = 9 - ..\lib\pal\universal\universal.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cc}*SharedItemsImports = 9 - ..\lib\pal\desktop\desktop.vcxitems*{10e9165b-49d1-4d1c-8248-334b9905b9cd}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d42}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{1dc6b38a-b390-34ce-907f-4958807a3d43}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{20ad4f2b-3f98-4baf-8144-e1e7682a7927}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c32}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{216a8e97-21f7-4bef-9e52-7f772c177c33}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{2bfafe9a-45b0-4c02-841e-03e47fd2e340}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{434c594f-cde0-3690-ac0a-9ed854b74092}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\shared\Shared.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{49077dbf-e363-4d2d-8334-636569a771b6}*SharedItemsImports = 4 - ..\lib\modules\azmon\azmon.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{57a81ed9-5603-471f-afee-9656da74178d}*SharedItemsImports = 4 - ..\lib\decoder\decoder.vcxitems*{65b6880e-fc36-443d-a7a5-0e6cda6523ac}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{6dc5ab1d-3d64-4c52-8d8e-d9a8b0c16f14}*SharedItemsImports = 9 - ..\lib\modules\azmon\azmon.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\exp\exp.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\pal\universal\universal.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{7a75748d-5d6b-48a5-83cb-f5f439133d59}*SharedItemsImports = 4 - ..\lib\modules\signals\signals.vcxitems*{d5e1c2e4-df23-4d2e-85f8-df737c6a9b9d}*SharedItemsImports = 9 - ..\lib\modules\filter\filter.vcxitems*{d74e42ec-c6ee-4944-b92a-eb711be002a9}*SharedItemsImports = 9 - ..\lib\shared\Shared.vcxitems*{dc91621e-a203-42df-8e03-3a23dd0602b1}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{e1f6ca48-3bbf-4378-8d1e-6bbf4869db5b}*SharedItemsImports = 9 - ..\lib\shared\Shared.vcxitems*{ef859326-2a11-481c-ae8c-03d754f1c412}*SharedItemsImports = 9 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{f8bb42f6-9c93-423b-b0c6-23ef79dd959a}*SharedItemsImports = 9 - ..\lib\decoder\decoder.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\azmon\azmon.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\cds\cds.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\dataviewer\dataviewer.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\filter\filter.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\liveeventinspector\liveeventinspector.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\modules\privacyguard\privacyguard.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - ..\lib\pal\desktop\desktop.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - Clienttelemetry\Clienttelemetry.vcxitems*{fe79fb3a-b3ef-38df-b7a4-11277db72b39}*SharedItemsImports = 4 - EndGlobalSection EndGlobal diff --git a/tools/decoder/Decoder.cs b/tools/decoder/Decoder.cs index 40184a754..9e9bf0981 100644 --- a/tools/decoder/Decoder.cs +++ b/tools/decoder/Decoder.cs @@ -26,6 +26,7 @@ using Newtonsoft.Json.Linq; using CsProtocol; using System.Linq; +using Fiddler; namespace CommonSchema { diff --git a/tools/server/Program.cs b/tools/server/Program.cs index 83e17c5fb..7a574dffa 100644 --- a/tools/server/Program.cs +++ b/tools/server/Program.cs @@ -29,7 +29,6 @@ public static void Main(string[] args) .UseKestrel(options => { options.AllowSynchronousIO = true; - options.ListenAnyIP(8000); }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")) diff --git a/tools/server/Startup.cs b/tools/server/Startup.cs index ab890bc30..193616aae 100644 --- a/tools/server/Startup.cs +++ b/tools/server/Startup.cs @@ -28,27 +28,6 @@ public void ConfigureServices(/* IServiceCollection services */) // TODO: add services configuration } - public void AppendToFile(string text) - { - lock (this) - { - string path = "output.json"; - // This text is added only once to the file. - if (!File.Exists(path)) - { - File.Create(path); - } - - // This text is always added, making the file longer over time - // if it is not deleted. - using (StreamWriter sw = File.AppendText(path)) - { - sw.WriteLine(text); - sw.Close(); - } - } - } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { @@ -75,7 +54,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF try { string path = context.Request.Path.Value; - if (path.StartsWith("/OneCollector/") || path.StartsWith("/")) + if (path.StartsWith("/OneCollector/")) { int length = Int32.Parse(context.Request.Headers["Content-Length"]); BinaryReader reader = new BinaryReader(context.Request.Body); @@ -94,8 +73,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF decoder.Logger = decoderLogger; string result = decoder.ToJson(false, true, 2); - AppendToFile(result); - // Echo the body converted to JSON array context.Response.StatusCode = 200; requestLogger.LogInformation(result);