From 3ed6d56dd3f05d6faf7d07cb2c08b4ee8c8c92a5 Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Tue, 25 Sep 2018 09:29:14 +0100 Subject: [PATCH 01/69] FS-11409: add "ice-lite" SDP attribute --- src/switch_core_media.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 1e8ab68efb..04df82685d 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -10580,6 +10580,9 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess } switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=end-of-candidates\r\n"); + if (switch_true(switch_channel_get_variable(session->channel, "ice_lite"))) { + switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ice-lite\r\n"); + } switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u cname:%s\r\n", a_engine->ssrc, smh->cname); switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u msid:%s a0\r\n", a_engine->ssrc, smh->msid); From d298b4f93aab54db3ff991abd4ea51ad35f0f963 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Thu, 27 Sep 2018 13:29:07 -0400 Subject: [PATCH 02/69] FS-11416 [core] add test framework header files. --- Makefile.am | 5 + freeswitch.spec | 1 + src/include/test/switch_fct.h | 3951 ++++++++++++++++++++++++++++++++ src/include/test/switch_test.h | 478 ++++ 4 files changed, 4435 insertions(+) create mode 100644 src/include/test/switch_fct.h create mode 100644 src/include/test/switch_test.h diff --git a/Makefile.am b/Makefile.am index 907b832916..9edfbba65f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -271,6 +271,11 @@ CORE_LIBS += libs/libzrtp/libzrtp.a LIBS += libs/libzrtp/third_party/bnlib/libbn.a endif +library_includetestdir = $(includedir)/test +library_includetest_HEADERS = \ + src/include/test/switch_fct.h \ + src/include/test/switch_test.h + library_includedir = $(includedir) library_include_HEADERS = \ src/include/switch_am_config.h \ diff --git a/freeswitch.spec b/freeswitch.spec index 759553e03b..0cc0462323 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -1884,6 +1884,7 @@ fi %{PKGCONFIGDIR}/* %{MODINSTDIR}/*.*a %{INCLUDEDIR}/*.h +%{INCLUDEDIR}/test/*.h ###################################################################################################################### diff --git a/src/include/test/switch_fct.h b/src/include/test/switch_fct.h new file mode 100644 index 0000000000..24d0c8a59d --- /dev/null +++ b/src/include/test/switch_fct.h @@ -0,0 +1,3951 @@ +/* +==================================================================== +Copyright (c) 2008 Ian Blumel. All rights reserved. + +FCTX (Fast C Test) Unit Testing Framework + +Copyright (c) 2008, Ian Blumel (ian.blumel@gmail.com) +All rights reserved. + +This license is based on the BSD License. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of, Ian Blumel, nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==================================================================== + +File: fct.h +*/ + +#if !defined(FCT_INCLUDED__IMB) +#define FCT_INCLUDED__IMB + +/* Configuration Values. You can over-ride these values in your own +header, then include this header. For example, in your file, myfct.h, + + #define FCT_DEFAULT_LOGGER "standard" + #include "fct.h" + +then if your unit tests included, myfct.h, you would default to work +with a standard logger. */ + +#if !defined(FCT_DEFAULT_LOGGER) +# define FCT_DEFAULT_LOGGER "standard" +#endif /* !FCT_DEFAULT_LOGGER */ + +#define FCT_VERSION_MAJOR 1 +#define FCT_VERSION_MINOR 6 +#define FCT_VERSION_MICRO 1 + +#define _FCT_QUOTEME(x) #x +#define FCT_QUOTEME(x) _FCT_QUOTEME(x) + +#define FCT_VERSION_STR (FCT_QUOTEME(FCT_VERSION_MAJOR) "."\ + FCT_QUOTEME(FCT_VERSION_MINOR) "."\ + FCT_QUOTEME(FCT_VERSION_MICRO)) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FCT_MAX_NAME 256 +#define FCT_MAX_LOG_LINE 256 + +#define nbool_t int +#define FCT_TRUE 1 +#define FCT_FALSE 0 + +#define FCTMIN(x, y) ( x < y) ? (x) : (y) + +#ifndef __INTEL_COMPILER +/* Use regular assertions for non-Intel compilers */ +#define FCT_ASSERT(expr) assert(expr) +#else +/* Silence Intel warnings on assert(expr && "str") or assert("str") */ +#define FCT_ASSERT(expr) do { \ + _Pragma("warning(push,disable:279)"); \ + assert(expr); \ + _Pragma("warning(pop)"); \ + } while (0) +#endif + +#if defined(__cplusplus) +#define FCT_EXTERN_C extern "C" +#else +#define FCT_EXTERN_C +#endif + +/* Forward declarations. The following forward declarations are required +because there is a inter-relationship between certain objects that +just can not be untwined. */ +typedef struct _fct_logger_evt_t fct_logger_evt_t; +typedef struct _fct_logger_i fct_logger_i; +typedef struct _fct_logger_types_t fct_logger_types_t; +typedef struct _fct_standard_logger_t fct_standard_logger_t; +typedef struct _fct_junit_logger_t fct_junit_logger_t; +typedef struct _fct_minimal_logger_t fct_minimal_logger_t; +typedef struct _fctchk_t fctchk_t; +typedef struct _fct_test_t fct_test_t; +typedef struct _fct_ts_t fct_ts_t; +typedef struct _fctkern_t fctkern_t; + +/* Forward declare some functions used throughout. */ +static fct_logger_i* +fct_standard_logger_new(void); + +static fct_logger_i* +fct_minimal_logger_new(void); + +static fct_junit_logger_t * +fct_junit_logger_new(void); + +static void +fct_logger__del(fct_logger_i *logger); + +static void +fct_logger__on_chk(fct_logger_i *self, fctchk_t const *chk); + +static void +fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test); + +static void +fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test); + +static void +fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts); + +static void +fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts); + +static void +fct_logger__on_test_suite_skip( + fct_logger_i *logger, + char const *condition, + char const *name +); + +static void +fct_logger__on_test_skip( + fct_logger_i *logger, + char const *condition, + char const *name +); + + +static void +fct_logger__on_warn(fct_logger_i *logger, char const *warn); + + + +/* Explicitly indicate a no-op */ +#define fct_pass() + +#define fct_unused(x) (void)(x) + +/* This is just a little trick to let me put comments inside of macros. I +really only want to bother with this when we are "unwinding" the macros +for debugging purposes. */ +#if defined(FCT_CONF_UNWIND) +# define _fct_cmt(string) {char*_=string;} +#else +# define _fct_cmt(string) +#endif + +/* +-------------------------------------------------------- +UTILITIES +-------------------------------------------------------- +*/ + + +/* STDIO and STDERR redirect support */ +#define FCT_PIPE_RESERVE_BYTES_DEFAULT 512 +static int fct_stdout_pipe[2]; +static int fct_stderr_pipe[2]; +static int fct_saved_stdout; +static int fct_saved_stderr; + +/* Platform independent pipe functions. TODO: Look to figure this out in a way +that follows the ISO C++ conformant naming convention. */ +#if defined(WIN32) +# include +# include +# define _fct_pipe(_PFDS_) \ + _pipe((_PFDS_), FCT_PIPE_RESERVE_BYTES_DEFAULT, _O_TEXT) +# define _fct_dup _dup +# define _fct_dup2 _dup2 +# define _fct_close _close +# define _fct_read _read +/* Until I can figure a better way to do this, rely on magic numbers. */ +# define STDOUT_FILENO 1 +# define STDERR_FILENO 2 +#else +# include +# define _fct_pipe pipe +# define _fct_dup dup +# define _fct_dup2 dup2 +# define _fct_close close +# define _fct_read read +#endif /* WIN32 */ + + + + +static void +fct_switch_std_to_buffer(int std_pipe[2], FILE *out, int fileno_, int *save_handle) +{ + fflush(out); + *save_handle = _fct_dup(fileno_); + if ( _fct_pipe(std_pipe) != 0 ) + { + exit(1); + } + _fct_dup2(std_pipe[1], fileno_); + _fct_close(std_pipe[1]); +} + + +static void +fct_switch_std_to_std(FILE *out, int fileno_, int save_handle) +{ + fflush(out); + _fct_dup2(save_handle, fileno_); +} + + +#define FCT_SWITCH_STDOUT_TO_BUFFER() \ + fct_switch_std_to_buffer(fct_stdout_pipe, stdout, STDOUT_FILENO, &fct_saved_stdout) +#define FCT_SWITCH_STDOUT_TO_STDOUT() \ + fct_switch_std_to_std(stdout, STDOUT_FILENO, fct_saved_stdout) +#define FCT_SWITCH_STDERR_TO_BUFFER() \ + fct_switch_std_to_buffer(fct_stderr_pipe, stderr, STDERR_FILENO, &fct_saved_stderr) +#define FCT_SWITCH_STDERR_TO_STDERR() \ + fct_switch_std_to_std(stderr, STDERR_FILENO, fct_saved_stderr) + + +/* Utility for truncated, safe string copies. The NUM +should be the length of DST plus the null-terminator. */ +static void +fctstr_safe_cpy(char *dst, char const *src, size_t num) +{ + FCT_ASSERT( dst != NULL ); + FCT_ASSERT( src != NULL ); + FCT_ASSERT( num > 0 ); +#if defined(WIN32) && _MSC_VER >= 1400 + strncpy_s(dst, num, src, _TRUNCATE); +#else + strncpy(dst, src, num); +#endif + dst[num-1] = '\0'; +} + +/* Isolate the vsnprintf implementation */ +static int +fct_vsnprintf(char *buffer, + size_t buffer_len, + char const *format, + va_list args) +{ + int count =0; + /* Older Microsoft compilers where not ANSI compliant with this + function and you had to use _vsnprintf. I will assume that newer + Microsoft Compilers start implementing vsnprintf. */ +#if defined(_MSC_VER) && (_MSC_VER < 1400) + count = _vsnprintf(buffer, buffer_len, format, args); +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + count = vsnprintf_s(buffer, buffer_len, _TRUNCATE, format, args); +#else + count = vsnprintf(buffer, buffer_len, format, args); +#endif + return count; +} + + +/* Isolate the snprintf implementation. */ +static int +fct_snprintf(char *buffer, size_t buffer_len, char const *format, ...) +{ + int count =0; + va_list args; + va_start(args, format); + count =fct_vsnprintf(buffer, buffer_len, format, args); + va_end(args); + return count; +} + + +/* Helper to for cloning strings on the heap. Returns NULL for +an out of memory condition. */ +static char* +fctstr_clone(char const *s) +{ + char *k =NULL; + size_t klen =0; + FCT_ASSERT( s != NULL && "invalid arg"); + klen = strlen(s)+1; + k = (char*)malloc(sizeof(char)*klen+1); + fctstr_safe_cpy(k, s, klen); + return k; +} + + +/* Clones and returns a lower case version of the original string. */ +static char* +fctstr_clone_lower(char const *s) +{ + char *k =NULL; + size_t klen =0; + size_t i; + if ( s == NULL ) + { + return NULL; + } + klen = strlen(s)+1; + k = (char*)malloc(sizeof(char)*klen+1); + for ( i=0; i != klen; ++i ) + { + k[i] = (char)tolower(s[i]); + } + return k; +} + + +/* A very, very simple "filter". This just compares the supplied prefix +against the test_str, to see if they both have the same starting +characters. If they do we return true, otherwise we return false. If the +prefix is a blank string or NULL, then it will return FCT_TRUE.*/ +static nbool_t +fct_filter_pass(char const *prefix, char const *test_str) +{ + nbool_t is_match = FCT_FALSE; + char const *prefix_p; + char const *test_str_p; + + /* If you got nothing to test against, why test? */ + FCT_ASSERT( test_str != NULL ); + + /* When the prefix is NULL or blank, we always return FCT_TRUE. */ + if ( prefix == NULL || prefix[0] == '\0' ) + { + return FCT_TRUE; + } + + /* Iterate through both character arrays at the same time. We are + going to play a game and see if we can beat the house. */ + for ( prefix_p = prefix, test_str_p = test_str; + *prefix_p != '\0' && *test_str_p != '\0'; + ++prefix_p, ++test_str_p ) + { + is_match = *prefix_p == *test_str_p; + if ( !is_match ) + { + break; /* Quit the first time we don't match. */ + } + } + + /* If the iterator for the test_str is pointing at the null char, and + the iterator for the prefix string is not, then the prefix string is + larger than the actual test string, and therefore we failed to pass the + filter. */ + if ( *test_str_p == '\0' && *prefix_p != '\0' ) + { + return FCT_FALSE; + } + + /* is_match will be set to the either FCT_TRUE if we kicked of the loop + early because our filter ran out of characters or FCT_FALSE if we + encountered a mismatch before our filter ran out of characters. */ + return is_match; +} + + +/* Routine checks if two strings are equal. Taken from +http://publications.gbdirect.co.uk/c_book/chapter5/character_handling.html +*/ +static int +fctstr_eq(char const *s1, char const *s2) +{ + if ( s1 == s2 ) + { + return 1; + } + if ( (s1 == NULL && s2 != NULL) + || (s1 != NULL && s2 == NULL) ) + { + return 0; + } + while (*s1 == *s2) + { + if (*s1 == '\0') + return 1; + s1++; + s2++; + } + /* Difference detected! */ + return 0; +} + + +static int +fctstr_ieq(char const *s1, char const *s2) +{ + if ( s1 == s2 ) + { + return 1; + } + if ( (s1 == NULL && s2 != NULL) + || (s1 != NULL && s2 == NULL) ) + { + return 0; + } + while (tolower(*s1) == tolower(*s2)) + { + if (*s1 == '\0') + return 1; + s1++; + s2++; + } + /* Difference detected! */ + return 0; +} + + +/* Returns 1 if the STR contains the CHECK_INCL substring. NULLs +are handled, and NULL always INCLUDES NULL. This check is case +sensitive. If two strings point to the same place they are +included. */ +static int +fctstr_incl(char const *str, char const *check_incl) +{ + static char const *blank_s = ""; + char const *found = NULL; + if ( str == NULL ) + { + str = blank_s; + } + if ( check_incl == NULL ) + { + check_incl = blank_s; + } + if ( str == check_incl ) + { + return 1; + } + found = strstr(str, check_incl); + return found != NULL; +} + + +/* Does a case insensitive include check. */ +static int +fctstr_iincl(char const *str, char const *check_incl) +{ + /* Going to do this with a memory allocation to save coding + time. In the future this can be rewritten. Both clone_lower + and _incl are NULL tolerant. */ + char *lstr = fctstr_clone_lower(str); + char *lcheck_incl = fctstr_clone_lower(check_incl); + int found = fctstr_incl(lstr, lcheck_incl); + free(lstr); + free(lcheck_incl); + return found; +} + + +/* Returns true if STR starts with CHECK. NULL and NULL is consider +true. */ +static int +fctstr_startswith(char const *str, char const *check) +{ + char const *sp; + if ( str == NULL && check == NULL ) + { + return 1; + } + else if ( ((str == NULL) && (check != NULL)) + || ((str != NULL) && (check == NULL)) ) + { + return 0; + } + sp = strstr(str, check); + return sp == str; +} + + +/* Case insensitive variant of fctstr_startswith. */ +static int +fctstr_istartswith(char const *str, char const *check) +{ + /* Taking the lazy approach for now. */ + char *istr = fctstr_clone_lower(str); + char *icheck = fctstr_clone_lower(check); + /* TODO: check for memory. */ + int startswith = fctstr_startswith(istr, icheck); + free(istr); + free(icheck); + return startswith; +} + + +/* Returns true if the given string ends with the given +check. Treats NULL as a blank string, and as such, will +pass the ends with (a blank string endswith a blank string). */ +static int +fctstr_endswith(char const *str, char const *check) +{ + size_t check_i; + size_t str_i; + if ( str == NULL && check == NULL ) + { + return 1; + } + else if ( ((str == NULL) && (check != NULL)) + || ((str != NULL) && (check == NULL)) ) + { + return 0; + } + check_i = strlen(check); + str_i = strlen(str); + if ( str_i < check_i ) + { + return 0; /* Can't do it string is too small. */ + } + for ( ; check_i != 0; --check_i, --str_i) + { + if ( str[str_i] != check[check_i] ) + { + return 0; /* Found a case where they are not equal. */ + } + } + /* Exhausted check against string, can only be true. */ + return 1; +} + + +static int +fctstr_iendswith(char const *str, char const *check) +{ + size_t check_i; + size_t str_i; + if ( str == NULL && check == NULL ) + { + return 1; + } + else if ( ((str == NULL) && (check != NULL)) + || ((str != NULL) && (check == NULL)) ) + { + return 0; + } + check_i = strlen(check); + str_i = strlen(str); + if ( str_i < check_i ) + { + return 0; /* Can't do it string is too small. */ + } + for ( ; check_i != 0; --check_i, --str_i) + { + if ( tolower(str[str_i]) != tolower(check[check_i]) ) + { + return 0; /* Found a case where they are not equal. */ + } + } + /* Exhausted check against string, can only be true. */ + return 1; +} + + +/* Use this with the _end variant to get the + +STARTSWITH ........................................ END + +effect. Assumes that the line will be maxwidth in characters. The +maxwidth can't be greater than FCT_DOTTED_MAX_LEN. */ +#define FCT_DOTTED_MAX_LEN 256 +static void +fct_dotted_line_start(size_t maxwidth, char const *startwith) +{ + char line[FCT_DOTTED_MAX_LEN]; + size_t len =0; + size_t line_len =0; + + memset(line, '.', sizeof(char)*maxwidth); + len = strlen(startwith); + line_len = FCTMIN(maxwidth-1, len); + memcpy(line, startwith, sizeof(char)*line_len); + if ( len < maxwidth-1) + { + line[len] = ' '; + } + line[maxwidth-1] = '\0'; + fputs(line, stdout); +} + + +static void +fct_dotted_line_end(char const *endswith) +{ + printf(" %s\n", endswith); +} + + +/* +-------------------------------------------------------- +TIMER +-------------------------------------------------------- +This is a low-res implementation at the moment. + +We will improve this in the future, and isolate the +implementation from the rest of the code. +*/ + +typedef struct _fct_timer_t fct_timer_t; +struct _fct_timer_t +{ + clock_t start; + clock_t stop; + double duration; +}; + + +static void +fct_timer__init(fct_timer_t *timer) +{ + FCT_ASSERT(timer != NULL); + memset(timer, 0, sizeof(fct_timer_t)); +} + + +static void +fct_timer__start(fct_timer_t *timer) +{ + FCT_ASSERT(timer != NULL); + timer->start = clock(); +} + + +static void +fct_timer__stop(fct_timer_t *timer) +{ + FCT_ASSERT(timer != NULL); + timer->stop = clock(); + timer->duration = (double) (timer->stop - timer->start) / CLOCKS_PER_SEC; +} + + +/* Returns the time in seconds. */ +static double +fct_timer__duration(fct_timer_t const *timer) +{ + FCT_ASSERT( timer != NULL ); + return timer->duration; +} + + +/* +-------------------------------------------------------- +GENERIC LIST +-------------------------------------------------------- +*/ + +/* For now we will just keep it at a linear growth rate. */ +#define FCT_LIST_GROWTH_FACTOR 2 + +/* Starting size for the list, to keep it simple we will start +at a reasonable size. */ +#define FCT_LIST_DEFAULT_START_SZ 8 + +/* Helper macros for quickly iterating through a list. You should be able +to do something like, + + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, my_list) + { + fct_logger__on_blah(logger); + } + FCT_NLIST_FOREACH_END(); + +*/ +#define FCT_NLIST_FOREACH_BGN(Type, Var, List)\ +{\ + if ( List != NULL ) {\ + size_t item_i##Var;\ + size_t num_items##Var = fct_nlist__size(List);\ + for( item_i##Var =0; item_i##Var != num_items##Var; ++item_i##Var )\ + {\ + Type Var = (Type) fct_nlist__at((List), item_i##Var); + +#define FCT_NLIST_FOREACH_END() }}} + +/* Used to manage a list of loggers. This works mostly like +the STL vector, where the array grows as more items are +appended. */ +typedef struct _fct_nlist_t fct_nlist_t; +struct _fct_nlist_t +{ + /* Item's are stored as pointers to void. */ + void **itm_list; + + /* Indicates the number of element's in the array. */ + size_t avail_itm_num; + + /* Indicates the number of actually elements in the array. */ + size_t used_itm_num; +}; +typedef void (*fct_nlist_on_del_t)(void*); + + +/* Clears the contents of the list, and sets the list count to 0. The +actual count remains unchanged. If on_del is supplied it is executed +against each list element. */ +static void +fct_nlist__clear(fct_nlist_t *list, fct_nlist_on_del_t on_del) +{ + size_t itm_i__ =0; + FCT_ASSERT( list != NULL ); + if ( on_del != NULL ) + { + for ( itm_i__=0; itm_i__ != list->used_itm_num; ++itm_i__ ) + { + on_del(list->itm_list[itm_i__]); + } + } + list->used_itm_num =0; +} + + +/* If you used init, then close with final. This is useful for +working with structures that live on the stack. */ +static void +fct_nlist__final(fct_nlist_t *list, fct_nlist_on_del_t on_del) +{ + FCT_ASSERT( list != NULL ); + fct_nlist__clear(list, on_del); + free(list->itm_list); +} + + +static int +fct_nlist__init2(fct_nlist_t *list, size_t start_sz) +{ + FCT_ASSERT( list != NULL ); + if ( start_sz == 0 ) + { + list->itm_list = NULL; + } + else + { + list->itm_list = (void**)malloc(sizeof(void*)*start_sz); + if ( list->itm_list == NULL ) + { + return 0; + } + } + /* If these are both 0, then they are equal and that means + that the first append operation will allocate memory. The beauty + here is that if the list remains empty, then we save a malloc. + Empty lists are relatively common in FCT (consider an error list). */ + list->avail_itm_num = start_sz; + list->used_itm_num =0; + return 1; +} + + +/* Initializes a list. Useful for populating existing structures. +Returns 0 if there was an error allocating memory. Returns 1 otherwise. */ +#define fct_nlist__init(_LIST_PTR_) \ + (fct_nlist__init2((_LIST_PTR_), FCT_LIST_DEFAULT_START_SZ)) + + +/* Returns the number of elements within the list. */ +static size_t +fct_nlist__size(fct_nlist_t const *list) +{ + FCT_ASSERT( list != NULL ); + return list->used_itm_num; +} + + +/* Returns the item at idx, asserts otherwise. */ +static void* +fct_nlist__at(fct_nlist_t const *list, size_t idx) +{ + FCT_ASSERT( list != NULL ); + FCT_ASSERT( idx < list->used_itm_num ); + return list->itm_list[idx]; +} + + +static void +fct_nlist__append(fct_nlist_t *list, void *itm) +{ + FCT_ASSERT( list != NULL ); + /* If we ran out of room, then the last increment should be equal to the + available space, in this case we need to grow a little more. If this + list started as size 0, then we should encounter the same effect as + "running out of room." */ + if ( list->used_itm_num == list->avail_itm_num ) + { + /* Use multiple and add, since the avail_itm_num could be 0. */ + list->avail_itm_num = list->avail_itm_num*FCT_LIST_GROWTH_FACTOR+\ + FCT_LIST_GROWTH_FACTOR; + list->itm_list = (void**)realloc( + list->itm_list, sizeof(void*)*list->avail_itm_num + ); + FCT_ASSERT( list->itm_list != NULL && "memory check"); + } + + list->itm_list[list->used_itm_num] = itm; + ++(list->used_itm_num); +} + + + +/* +----------------------------------------------------------- +A SINGLE CHECK +----------------------------------------------------------- +This defines a single check. It indicates what the check was, +and where it occurred. A "Test" object will have-a bunch +of "checks". +*/ + +struct _fctchk_t +{ + /* This string that represents the condition. */ + char cndtn[FCT_MAX_LOG_LINE]; + + /* These indicate where the condition occurred. */ + char file[FCT_MAX_LOG_LINE]; + + int lineno; + + nbool_t is_pass; + + /* This is a message that we can "format into", if + no format string is specified this should be + equivalent to the cntdn. */ + char msg[FCT_MAX_LOG_LINE]; +}; + +#define fctchk__is_pass(_CHK_) ((_CHK_)->is_pass) +#define fctchk__file(_CHK_) ((_CHK_)->file) +#define fctchk__lineno(_CHK_) ((_CHK_)->lineno) +#define fctchk__cndtn(_CHK_) ((_CHK_)->cndtn) +#define fctchk__msg(_CHK_) ((_CHK_)->msg) + +static fctchk_t* +fctchk_new(int is_pass, + char const *cndtn, + char const *file, + int lineno, + char const *format, + va_list args) +{ + fctchk_t *chk = NULL; + + FCT_ASSERT( cndtn != NULL ); + FCT_ASSERT( file != NULL ); + FCT_ASSERT( lineno > 0 ); + + chk = (fctchk_t*)calloc(1, sizeof(fctchk_t)); + if ( chk == NULL ) + { + return NULL; + } + + fctstr_safe_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE); + fctstr_safe_cpy(chk->file, file, FCT_MAX_LOG_LINE); + chk->lineno = lineno; + + chk->is_pass =is_pass; + + if ( format != NULL ) + { + fct_vsnprintf(chk->msg, FCT_MAX_LOG_LINE, format, args); + } + else + { + /* Default to make the condition be the message, if there was no format + specified. */ + fctstr_safe_cpy(chk->msg, cndtn, FCT_MAX_LOG_LINE); + } + + return chk; +} + + +/* Cleans up a "check" object. If the `chk` is NULL, this function does +nothing. */ +static void +fctchk__del(fctchk_t *chk) +{ + if ( chk == NULL ) + { + return; + } + free( chk ); +} + + +/* +----------------------------------------------------------- +A TEST +----------------------------------------------------------- +A suite will have-a list of tests. Where each test will have-a +list of failed and passed checks. +*/ + +struct _fct_test_t +{ + /* List of failed and passed "checks" (fctchk_t). Two separate + lists make it faster to determine how many checks passed and how + many checks failed. */ + fct_nlist_t failed_chks; + fct_nlist_t passed_chks; + + /* To store the test run time */ + fct_timer_t timer; + + /* The name of the test case. */ + char name[FCT_MAX_NAME]; +}; + +#define fct_test__name(_TEST_) ((_TEST_)->name) + +/* Clears the failed tests ... partly for internal testing. */ +#define fct_test__clear_failed(test) \ + fct_nlist__clear(test->failed_chks, (fct_nlist_on_del_t)fctchk__del);\ + + +static void +fct_test__del(fct_test_t *test) +{ + if (test == NULL ) + { + return; + } + fct_nlist__final(&(test->passed_chks), (fct_nlist_on_del_t)fctchk__del); + fct_nlist__final(&(test->failed_chks), (fct_nlist_on_del_t)fctchk__del); + free(test); +} + + +static fct_test_t* +fct_test_new(char const *name) +{ + nbool_t ok =FCT_FALSE; + fct_test_t *test =NULL; + +#ifndef __clang_analyzer__ + test = (fct_test_t*)malloc(sizeof(fct_test_t)); +#else + test = NULL; +#endif + if ( test == NULL ) + { + return NULL; + } + + fctstr_safe_cpy(test->name, name, FCT_MAX_NAME); + + /* Failures are an exception, so lets not allocate up + the list until we need to. */ + fct_nlist__init2(&(test->failed_chks), 0); + if (!fct_nlist__init(&(test->passed_chks))) + { + ok =FCT_FALSE; + goto finally; + } + + fct_timer__init(&(test->timer)); + + ok =FCT_TRUE; +finally: + if ( !ok ) + { + fct_test__del(test); + test =NULL; + } + return test; +} + + +static void +fct_test__start_timer(fct_test_t *test) +{ + FCT_ASSERT( test != NULL ); + fct_timer__start(&(test->timer)); +} + + +static void +fct_test__stop_timer(fct_test_t *test) +{ + FCT_ASSERT( test != NULL ); + fct_timer__stop(&(test->timer)); +} + + +static double +fct_test__duration(fct_test_t const *test) +{ + FCT_ASSERT( test != NULL ); + return fct_timer__duration(&(test->timer)); +} + + +static nbool_t +fct_test__is_pass(fct_test_t const *test) +{ + FCT_ASSERT( test != NULL ); + return fct_nlist__size(&(test->failed_chks)) == 0; +} + + +static void +fct_test__add(fct_test_t *test, fctchk_t *chk) +{ + + FCT_ASSERT( test != NULL ); + FCT_ASSERT( chk != NULL ); + + if ( fctchk__is_pass(chk) ) + { + fct_nlist__append(&(test->passed_chks), (void*)chk); + } + else + { + fct_nlist__append(&(test->failed_chks), (void*)chk); + } +} + +/* Returns the number of checks made throughout the test. */ +static size_t +fct_test__chk_cnt(fct_test_t const *test) +{ + FCT_ASSERT( test != NULL ); + return fct_nlist__size(&(test->failed_chks)) \ + + fct_nlist__size(&(test->passed_chks)); +} + + +/* +----------------------------------------------------------- +TEST SUITE (TS) +----------------------------------------------------------- +*/ + + +/* The different types of 'modes' that a test suite can be in. + +While the test suite is iterating through all the tests, its "State" +can change from "setup mode", to "test mode" to "tear down" mode. +These help to indicate what mode are currently in. Think of it as a +basic FSM. + + if the count was 0 end + +--------->---------------------> ending_mode-----+-+ + | ^ | + ^ | ^ +start | [if no more tests] | + | | | | + +-count_mode -> setup_mode -> test_mode -> teardown_mode->-+ + | ^ | | + | +-----------<---------------+ | + +----------->---[if fct_req fails]--------+ + +*/ +enum ts_mode +{ + ts_mode_cnt, /* To setup when done counting. */ + ts_mode_setup, /* To test when done setup. */ + ts_mode_teardown, /* To ending mode, when no more tests. */ + ts_mode_test, /* To tear down mode. */ + ts_mode_ending, /* To ... */ + ts_mode_end, /* .. The End. */ + ts_mode_abort /* Abort */ +}; + +/* Types of states the test could be in. */ +typedef enum +{ + fct_test_status_SUCCESS, + fct_test_status_FAILURE +} fct_test_status; + + +struct _fct_ts_t +{ + /* For counting our 'current' test number, and the total number of + tests. */ + int curr_test_num; + int total_test_num; + + /* Keeps track of the current state of the object while it is walking + through its "FSM" */ + enum ts_mode mode; + + /* The name of the test suite. */ + char name[FCT_MAX_NAME]; + + /* List of tests that where executed within the test suite. */ + fct_nlist_t test_list; +}; + + +#define fct_ts__is_setup_mode(ts) ((ts)->mode == ts_mode_setup) +#define fct_ts__is_teardown_mode(ts) ((ts)->mode == ts_mode_teardown) +#define fct_ts__is_test_mode(ts) ((ts)->mode == ts_mode_test) +#define fct_ts__is_ending_mode(ts) ((ts)->mode == ts_mode_ending) +#define fct_ts__is_end(ts) ((ts)->mode == ts_mode_end) +#define fct_ts__is_cnt_mode(ts) ((ts)->mode == ts_mode_cnt) +#define fct_ts__is_abort_mode(ts) ((ts)->mode == ts_mode_abort) + +/* This cndtn is set when we have iterated through all the tests, and +there was nothing more to do. */ +#define fct_ts__ending(ts) ((ts)->mode = ts_mode_ending) + +/* Flag a test suite as complete. It will no longer accept any more tests. */ +#define fct_ts__end(ts) ((ts)->mode = ts_mode_end) + +#define fct_ts__name(ts) ((ts)->name) + + +static void +fct_ts__del(fct_ts_t *ts) +{ + if ( ts == NULL ) + { + return; + } + fct_nlist__final(&(ts->test_list), (fct_nlist_on_del_t)fct_test__del); + free(ts); +} + +static fct_ts_t * +fct_ts_new(char const *name) +{ + fct_ts_t *ts =NULL; + ts = (fct_ts_t*)calloc(1, sizeof(fct_ts_t)); + FCT_ASSERT( ts != NULL ); + + fctstr_safe_cpy(ts->name, name, FCT_MAX_NAME); + ts->mode = ts_mode_cnt; + fct_nlist__init(&(ts->test_list)); + return ts; +} + + + +static nbool_t +fct_ts__is_more_tests(fct_ts_t const *ts) +{ + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( !fct_ts__is_end(ts) ); + return ts->curr_test_num < ts->total_test_num; +} + + +/* Indicates that we have started a test case. */ +static void +fct_ts__test_begin(fct_ts_t *ts) +{ + FCT_ASSERT( !fct_ts__is_end(ts) ); + ++(ts->curr_test_num); +} + + +/* Takes OWNERSHIP of a test object, and warehouses it for later stat +generation. */ +static void +fct_ts__add_test(fct_ts_t *ts, fct_test_t *test) +{ + FCT_ASSERT( ts != NULL && "invalid arg"); + FCT_ASSERT( test != NULL && "invalid arg"); + FCT_ASSERT( !fct_ts__is_end(ts) ); + fct_nlist__append(&(ts->test_list), test); +} + + +static void +fct_ts__test_end(fct_ts_t *ts) +{ + FCT_ASSERT( ts != NULL ); + /* After a test has completed, move to teardown mode. */ + ts->mode = ts_mode_teardown; +} + + +/* Increments the internal count by 1. */ +static void +fct_ts__inc_total_test_num(fct_ts_t *ts) +{ + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( fct_ts__is_cnt_mode(ts) ); + FCT_ASSERT( !fct_ts__is_end(ts) ); + ++(ts->total_test_num); +} + + +/* Flags the end of the setup, which implies we are going to move into +setup mode. You must be already in setup mode for this to work! */ +static void +fct_ts__setup_end(fct_ts_t *ts) +{ + if ( ts->mode != ts_mode_abort ) + { + ts->mode = ts_mode_test; + } +} + + +static fct_test_t * +fct_ts__make_abort_test(fct_ts_t *ts) +{ + char setup_testname[FCT_MAX_LOG_LINE+1] = {'\0'}; + char const *suitename = fct_ts__name(ts); + fct_snprintf(setup_testname, FCT_MAX_LOG_LINE, "setup_%s", suitename); + return fct_test_new(setup_testname); +} + +/* Flags a pre-mature abort of a setup (like a failed fct_req). */ +static void +fct_ts__setup_abort(fct_ts_t *ts) +{ + FCT_ASSERT( ts != NULL ); + ts->mode = ts_mode_abort; +} + +/* Flags the end of the teardown, which implies we are going to move +into setup mode (for the next 'iteration'). */ +static void +fct_ts__teardown_end(fct_ts_t *ts) +{ + if ( ts->mode == ts_mode_abort ) + { + return; /* Because we are aborting . */ + } + /* We have to decide if we should keep on testing by moving into tear down + mode or if we have reached the real end and should be moving into the + ending mode. */ + if ( fct_ts__is_more_tests(ts) ) + { + ts->mode = ts_mode_setup; + } + else + { + ts->mode = ts_mode_ending; + } +} + + +/* Flags the end of the counting, and proceeding to the first setup. +Consider the special case when a test suite has NO tests in it, in +that case we will have a current count that is zero, in which case +we can skip right to 'ending'. */ +static void +fct_ts__cnt_end(fct_ts_t *ts) +{ + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( fct_ts__is_cnt_mode(ts) ); + FCT_ASSERT( !fct_ts__is_end(ts) ); + if (ts->total_test_num == 0 ) + { + ts->mode = ts_mode_ending; + } + else + { + ts->mode = ts_mode_setup; + } +} + + +static nbool_t +fct_ts__is_test_cnt(fct_ts_t const *ts, int test_num) +{ + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( 0 <= test_num ); + FCT_ASSERT( test_num < ts->total_test_num ); + FCT_ASSERT( !fct_ts__is_end(ts) ); + + /* As we roll through the tests we increment the count. With this + count we can decide if we need to execute a test or not. */ + return test_num == ts->curr_test_num; +} + + +/* Returns the # of tests on the FCT TS object. This is the actual +# of tests executed. */ +static size_t +fct_ts__tst_cnt(fct_ts_t const *ts) +{ + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( + fct_ts__is_end(ts) + && "can't count number of tests executed until the test suite ends" + ); + return fct_nlist__size(&(ts->test_list)); +} + + +/* Returns the # of tests in the TS object that passed. */ +static size_t +fct_ts__tst_cnt_passed(fct_ts_t const *ts) +{ + size_t tally =0; + + FCT_ASSERT( ts != NULL ); + FCT_ASSERT( fct_ts__is_end(ts) ); + + FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list)) + { + if ( fct_test__is_pass(test) ) + { + tally += 1; + } + } + FCT_NLIST_FOREACH_END(); + return tally; +} + + +/* Returns the # of checks made throughout a test suite. */ +static size_t +fct_ts__chk_cnt(fct_ts_t const *ts) +{ + size_t tally =0; + + FCT_ASSERT( ts != NULL ); + + FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list)) + { + tally += fct_test__chk_cnt(test); + } + FCT_NLIST_FOREACH_END(); + return tally; +} + +/* Currently the duration is simply a sum of all the tests. */ +static double +fct_ts__duration(fct_ts_t const *ts) +{ + double tally =0.0; + FCT_ASSERT( ts != NULL ); + FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list)) + { + tally += fct_test__duration(test); + } + FCT_NLIST_FOREACH_END(); + return tally; +} + + +/* +-------------------------------------------------------- +FCT COMMAND LINE OPTION INITIALIZATION (fctcl_init) +-------------------------------------------------------- + +Structure used for command line initialization. To keep it clear that we do +not delete the char*'s present on this structure. +*/ + + +typedef enum +{ + FCTCL_STORE_UNDEFINED, + FCTCL_STORE_TRUE, + FCTCL_STORE_VALUE +} fctcl_store_t; + + +typedef struct _fctcl_init_t +{ + /* What to parse for this option. --long versus -s. */ + char const *long_opt; /* i.e. --help */ + char const *short_opt; /* i.e. -h */ + + /* What action to take when the option is activated. */ + fctcl_store_t action; + + /* The help string for the action. */ + char const *help; +} fctcl_init_t; + + +/* Use when defining the option list. */ +#define FCTCL_INIT_NULL \ + {NULL, NULL, FCTCL_STORE_UNDEFINED, NULL} + + +/* +-------------------------------------------------------- +FCT COMMAND LINE OPTION (fctcl) +-------------------------------------------------------- + +Specifies the command line configuration options. Use this +to help initialize the fct_clp (command line parser). +*/ + + +/* Handy strings for storing "true" and "false". We can reference +these strings throughout the parse operation and not have to +worry about dealing with memory. */ +#define FCTCL_TRUE_STR "1" + + +typedef struct _fctcl_t +{ + /* What to parse for this option. --long versus -s. */ + char *long_opt; /* i.e. --help */ + char *short_opt; /* i.e. -h */ + + /* What action to take when the option is activated. */ + fctcl_store_t action; + + /* The help string for the action. */ + char *help; + + /* The result. */ + char *value; +} fctcl_t; + + +#define fctcl_new() ((fctcl_t*)calloc(1, sizeof(fctcl_t))) + + +static void +fctcl__del(fctcl_t *clo) +{ + if ( clo == NULL ) + { + return; + } + free(clo->long_opt); + free(clo->short_opt); + free(clo->value); + free(clo->help); + free(clo); +} + + +static fctcl_t* +fctcl_new2(fctcl_init_t const *clo_init) +{ + fctcl_t *clone = NULL; + int ok =0; + clone = fctcl_new(); + if ( clone == NULL ) + { + return NULL; + } + clone->action = clo_init->action; + if ( clo_init->help == NULL ) + { + clone->help = NULL; + } + else + { + clone->help = fctstr_clone(clo_init->help); + if ( clone->help == NULL ) + { + ok =0; + goto finally; + } + } + if ( clo_init->long_opt == NULL ) + { + clone->long_opt = NULL; + } + else + { + clone->long_opt = fctstr_clone(clo_init->long_opt); + if ( clone->long_opt == NULL ) + { + ok = 0; + goto finally; + } + } + if ( clo_init->short_opt == NULL ) + { + clone->short_opt = NULL; + } + else + { + clone->short_opt = fctstr_clone(clo_init->short_opt); + if ( clone->short_opt == NULL ) + { + ok =0; + goto finally; + } + } + ok = 1; +finally: + if ( !ok ) + { + fctcl__del(clone); + clone = NULL; + } + return clone; +} + + +static int +fctcl__is_option(fctcl_t const *clo, char const *option) +{ + FCT_ASSERT( clo != NULL ); + if ( option == NULL ) + { + return 0; + } + return ((clo->long_opt != NULL + && fctstr_eq(clo->long_opt, option)) + || + (clo->short_opt != NULL + && fctstr_eq(clo->short_opt, option)) + ); +} + + +#define fctcl__set_value(_CLO_, _VAL_) \ + (_CLO_)->value = fctstr_clone((_VAL_)); + +/* +-------------------------------------------------------- +FCT COMMAND PARSER (fct_clp) +-------------------------------------------------------- +*/ + +#define FCT_CLP_MAX_ERR_MSG_LEN 256 + +typedef struct _fct_clp_t +{ + /* List of command line options. */ + fct_nlist_t clo_list; + + /* List of parameters (not options). */ + fct_nlist_t param_list; + + char error_msg[FCT_CLP_MAX_ERR_MSG_LEN]; + int is_error; +} fct_clp_t; + + +static void +fct_clp__final(fct_clp_t *clp) +{ + fct_nlist__final(&(clp->clo_list), (fct_nlist_on_del_t)fctcl__del); + fct_nlist__final(&(clp->param_list), (fct_nlist_on_del_t)free); +} + + +/* Add an configuration options. */ +static int +fct_clp__add_options(fct_clp_t *clp, fctcl_init_t const *options) +{ + fctcl_init_t const *pclo =NULL; + int ok; + for ( pclo = options; pclo->action != FCTCL_STORE_UNDEFINED; ++pclo ) + { + fctcl_t *cpy = fctcl_new2(pclo); + if ( cpy == NULL ) + { + ok = 0; + goto finally; + } + fct_nlist__append(&(clp->clo_list), (void*)cpy); + } + ok =1; +finally: + return ok; +} + +/* Returns false if we ran out of memory. */ +static int +fct_clp__init(fct_clp_t *clp, fctcl_init_t const *options) +{ + int ok =0; + FCT_ASSERT( clp != NULL ); + /* It is just much saner to manage a clone of the options. Then we know + who is in charge of the memory. */ + ok = fct_nlist__init(&(clp->clo_list)); + if ( !ok ) + { + goto finally; + } + if ( options != NULL ) + { + ok = fct_clp__add_options(clp, options); + if ( !ok ) + { + goto finally; + } + } + ok = fct_nlist__init(&(clp->param_list)); + if ( !ok ) + { + goto finally; + } + ok =1; +finally: + if ( !ok ) + { + fct_clp__final(clp); + } + return ok; +} + + +/* Parses the command line arguments. Use fct_clp__is_error and +fct_clp__get_error to figure out if something went awry. */ +static void +fct_clp__parse(fct_clp_t *clp, int argc, char const *argv[]) +{ + int argi =1; + int is_option =0; + char *arg =NULL; + char *token =NULL; + char *next_token =NULL; + + clp->error_msg[0] = '\0'; + clp->is_error =0; + + while ( argi < argc ) + { + is_option =0; + token =NULL; + next_token = NULL; + arg = fctstr_clone(argv[argi]); + +#if defined(_MSC_VER) && _MSC_VER > 1300 + token = strtok_s(arg, "=", &next_token); +#else + token = strtok(arg, "="); + next_token = strtok(NULL, "="); +#endif + + FCT_NLIST_FOREACH_BGN(fctcl_t*, pclo, &(clp->clo_list)) + { + /* Need to reset for each search. strtok below is destructive. */ + if ( fctcl__is_option(pclo, token) ) + { + is_option =1; + if ( pclo->action == FCTCL_STORE_VALUE ) + { + /* If this is --xxxx=value then the next strtok should succeed. + Otherwise, we need to chew up the next argument. */ + if ( next_token != NULL && strlen(next_token) > 0 ) + { + fctcl__set_value(pclo, next_token); + } + else + { + ++argi; /* Chew up the next value */ + if ( argi >= argc ) + { + /* error */ + fct_snprintf( + clp->error_msg, + FCT_CLP_MAX_ERR_MSG_LEN, + "missing argument for %s", + token + ); + clp->is_error =1; + break; + } + fctcl__set_value(pclo, argv[argi]); + } + } + else if (pclo->action == FCTCL_STORE_TRUE) + { + fctcl__set_value(pclo, FCTCL_TRUE_STR); + } + else + { + FCT_ASSERT("undefined action requested"); + } + break; /* No need to parse this argument further. */ + } + } + FCT_NLIST_FOREACH_END(); + /* If we have an error, exit. */ + if ( clp->is_error ) + { + break; + } + /* If we walked through all the options, and didn't find + anything, then we must have a parameter. Forget the fact that + an unknown option will be treated like a parameter... */ + if ( !is_option ) + { + fct_nlist__append(&(clp->param_list), arg); + arg =NULL; /* Owned by the nlist */ + } + ++argi; + if ( arg != NULL ) + { + free(arg); + arg =NULL; + } + } +} + + +static fctcl_t const* +fct_clp__get_clo(fct_clp_t const *clp, char const *option) +{ + fctcl_t const *found =NULL; + + FCT_NLIST_FOREACH_BGN(fctcl_t const*, pclo, &(clp->clo_list)) + { + if ( fctcl__is_option(pclo, option) ) + { + found = pclo; + break; + } + } + FCT_NLIST_FOREACH_END(); + return found; +} + + +#define fct_clp__optval(_CLP_, _OPTION_) \ + fct_clp__optval2((_CLP_), (_OPTION_), NULL) + + +/* Returns the value parsed at the command line, and equal to OPTION. +If the value wasn't parsed, the DEFAULT_VAL is returned instead. */ +static char const* +fct_clp__optval2(fct_clp_t *clp, char const *option, char const *default_val) +{ + fctcl_t const *clo =NULL; + FCT_ASSERT( clp != NULL ); + FCT_ASSERT( option != NULL ); + clo = fct_clp__get_clo(clp, option); + if ( clo == NULL || clo->value == NULL) + { + return default_val; + } + return clo->value; +} + + + +/* Mainly used for unit tests. */ +static int +fct_clp__is_param(fct_clp_t *clp, char const *param) +{ + if ( clp == NULL || param == NULL ) + { + return 0; + } + FCT_NLIST_FOREACH_BGN(char *, aparam, &(clp->param_list)) + { + if ( fctstr_eq(aparam, param) ) + { + return 1; + } + } + FCT_NLIST_FOREACH_END(); + return 0; +} + + +#define fct_clp__is_error(_CLP_) ((_CLP_)->is_error) +#define fct_clp__get_error(_CLP_) ((_CLP_)->error_msg); + +#define fct_clp__num_clo(_CLP_) \ + (fct_nlist__size(&((_CLP_)->clo_list))) + +#define fct_clp__param_cnt(_CLP_) \ + (fct_nlist__size(&((_CLP_)->param_list))) + +/* Returns a *reference* to the parameter at _IDX_. Do not modify +its contents. */ +#define fct_clp__param_at(_CLP_, _IDX_) \ + ((char const*)fct_nlist__at(&((_CLP_)->param_list), (_IDX_))) + + +/* Returns true if the given option was on the command line. +Use either the long or short option name to check against. */ +#define fct_clp__is(_CLP_, _OPTION_) \ + (fct_clp__optval((_CLP_), (_OPTION_)) != NULL) + + + +/* +-------------------------------------------------------- +FCT NAMESPACE +-------------------------------------------------------- + +The macros below start to pollute the watch window with +lots of "system" variables. This NAMESPACE is an +attempt to hide all the "system" variables in one place. +*/ +typedef struct _fct_namespace_t +{ + /* The currently active test suite. */ + fct_ts_t *ts_curr; + int ts_is_skip_suite; + char const *ts_skip_cndtn; + + /* Current test name. */ + char const* curr_test_name; + fct_test_t *curr_test; + const char *test_skip_cndtn; + int test_is_skip; + + /* Counts the number of tests in a test suite. */ + int test_num; + + /* Set at the end of the test suites. */ + size_t num_total_failed; +} fct_namespace_t; + + +static void +fct_namespace_init(fct_namespace_t *ns) +{ + FCT_ASSERT( ns != NULL && "invalid argument!"); + memset(ns, 0, sizeof(fct_namespace_t)); +} + + +/* +-------------------------------------------------------- +FCT KERNEL +-------------------------------------------------------- + +The "fctkern" is a singleton that is defined throughout the +system. +*/ + +struct _fctkern_t +{ + /* Holds variables used throughout MACRO MAGIC. In order to reduce + the "noise" in the watch window during a debug trace. */ + fct_namespace_t ns; + + /* Command line parsing. */ + fct_clp_t cl_parser; + + /* Hold onto the command line arguments. */ + int cl_argc; + char const **cl_argv; + /* Track user options. */ + fctcl_init_t const *cl_user_opts; + + /* Tracks the delay parsing. */ + int cl_is_parsed; + + /* This is an list of loggers that can be used in the fct system. */ + fct_nlist_t logger_list; + + /* Array of custom types, you have built-in system ones and you + have optionally supplied user ones.. */ + fct_logger_types_t *lt_usr; + fct_logger_types_t *lt_sys; + + /* This is a list of prefix's that can be used to determine if a + test is should be run or not. */ + fct_nlist_t prefix_list; + + /* This is a list of test suites that where generated throughout the + testing process. */ + fct_nlist_t ts_list; + + /* Records what we expect to fail. */ + size_t num_expected_failures; +}; + + +#define FCT_OPT_VERSION "--version" +#define FCT_OPT_VERSION_SHORT "-v" +#define FCT_OPT_HELP "--help" +#define FCT_OPT_HELP_SHORT "-h" +#define FCT_OPT_LOGGER "--logger" +#define FCT_OPT_LOGGER_SHORT "-l" +static fctcl_init_t FCT_CLP_OPTIONS[] = +{ + /* Totally unsafe, since we are assuming we can clean out this data, + what I need to do is have an "initialization" object, full of + const objects. But for now, this should work. */ + { + FCT_OPT_VERSION, + FCT_OPT_VERSION_SHORT, + FCTCL_STORE_TRUE, + "Displays the FCTX version number and exits." + }, + { + FCT_OPT_HELP, + FCT_OPT_HELP_SHORT, + FCTCL_STORE_TRUE, + "Shows this help." + }, + { + FCT_OPT_LOGGER, + FCT_OPT_LOGGER_SHORT, + FCTCL_STORE_VALUE, + NULL + }, + FCTCL_INIT_NULL /* Sentinel */ +}; + +typedef fct_logger_i* (*fct_logger_new_fn)(void); +struct _fct_logger_types_t +{ + char const *name; + fct_logger_new_fn logger_new_fn; + char const *desc; +}; + +static fct_logger_types_t FCT_LOGGER_TYPES[] = +{ + { + "standard", + (fct_logger_new_fn)fct_standard_logger_new, + "the basic fctx logger" + }, + { + "minimal", + (fct_logger_new_fn)fct_minimal_logger_new, + "the least amount of logging information." + }, + { + "junit", + (fct_logger_new_fn)fct_junit_logger_new, + "junit compatible xml" + }, + {NULL, (fct_logger_new_fn)NULL, NULL} /* Sentinel */ +}; + + +/* Returns the number of filters defined for the fct kernel. */ +#define fctkern__filter_cnt(_NK_) (fct_nlist__size(&((_NK_)->prefix_list))) + + +static void +fctkern__add_logger(fctkern_t *nk, fct_logger_i *logger_owns) +{ + FCT_ASSERT(nk != NULL && "invalid arg"); + FCT_ASSERT(logger_owns != NULL && "invalid arg"); + fct_nlist__append(&(nk->logger_list), logger_owns); +} + + +static void +fctkern__write_help(fctkern_t *nk, FILE *out) +{ + fct_clp_t *clp = &(nk->cl_parser); + fprintf(out, "test.exe [options] prefix_filter ...\n\n"); + FCT_NLIST_FOREACH_BGN(fctcl_t*, clo, &(clp->clo_list)) + { + if ( clo->short_opt != NULL ) + { + fprintf(out, "%s, %s\n", clo->short_opt, clo->long_opt); + } + else + { + fprintf(out, "%s\n", clo->long_opt); + } + if ( !fctstr_ieq(clo->long_opt, FCT_OPT_LOGGER) ) + { + /* For now lets not get to fancy with the text wrapping. */ + fprintf(out, " %s\n", clo->help); + } + else + { + fct_logger_types_t *types[2]; + int type_i; + fct_logger_types_t *itr; + types[0] = nk->lt_sys; + types[1] = nk->lt_usr; + fputs(" Sets the logger. The types of loggers currently " + "available are,\n", out); + for (type_i =0; type_i != 2; ++type_i ) + { + for ( itr=types[type_i]; itr && itr->name != NULL; ++itr ) + { + fprintf(out, " =%s : %s\n", itr->name, itr->desc); + } + } + fprintf(out, " default is '%s'.\n", FCT_DEFAULT_LOGGER); + } + } + FCT_NLIST_FOREACH_END(); + fputs("\n", out); +} + + +/* Appends a prefix filter that is used to determine if a test can +be executed or not. If the test starts with the same characters as +the prefix, then it should be "runnable". The prefix filter must be +a non-NULL, non-Blank string. */ +static void +fctkern__add_prefix_filter(fctkern_t *nk, char const *prefix_filter) +{ + char *filter =NULL; + size_t filter_len =0; + FCT_ASSERT( nk != NULL && "invalid arg" ); + FCT_ASSERT( prefix_filter != NULL && "invalid arg" ); + FCT_ASSERT( strlen(prefix_filter) > 0 && "invalid arg" ); + /* First we make a copy of the prefix, then we store it away + in our little list. */ + filter_len = strlen(prefix_filter); + filter = (char*)malloc(sizeof(char)*(filter_len+1)); + fctstr_safe_cpy(filter, prefix_filter, filter_len+1); + fct_nlist__append(&(nk->prefix_list), (void*)filter); +} + + +/* Cleans up the contents of a fctkern. NULL does nothing. */ +static void +fctkern__final(fctkern_t *nk) +{ + if ( nk == NULL ) + { + return; + } + fct_clp__final(&(nk->cl_parser)); + fct_nlist__final(&(nk->logger_list), (fct_nlist_on_del_t)fct_logger__del); + /* The prefix list is a list of malloc'd strings. */ + fct_nlist__final(&(nk->prefix_list), (fct_nlist_on_del_t)free); + fct_nlist__final(&(nk->ts_list), (fct_nlist_on_del_t)fct_ts__del); +} + + +#define fctkern__cl_is_parsed(_NK_) ((_NK_)->cl_is_parsed) + + +static int +fctkern__cl_is(fctkern_t *nk, char const *opt_str) +{ + FCT_ASSERT( opt_str != NULL ); + return opt_str[0] != '\0' + && fct_clp__is(&(nk->cl_parser), opt_str); +} + + +/* Returns the command line value given by OPT_STR. If OPT_STR was not defined +at the command line, DEF_STR is returned (you can use NULL for the DEF_STR). +The result returned should not be modified, and MAY even be the same pointer +to DEF_STR. */ +static char const * +fctkern__cl_val2(fctkern_t *nk, char const *opt_str, char const *def_str) +{ + FCT_ASSERT( opt_str != NULL ); + if ( nk == NULL ) + { + return NULL; + } + return fct_clp__optval2(&(nk->cl_parser), opt_str, def_str); +} + + +/* Selects a logger from the list based on the selection name. +May return NULL if the name doesn't exist in the list. */ +static fct_logger_i* +fckern_sel_log(fct_logger_types_t *search, char const *sel_logger) +{ + fct_logger_types_t *iter; + FCT_ASSERT(search != NULL); + FCT_ASSERT(sel_logger != NULL); + FCT_ASSERT(strlen(sel_logger) > 0); + for ( iter = search; iter->name != NULL; ++iter) + { + if ( fctstr_ieq(iter->name, sel_logger) ) + { + return iter->logger_new_fn(); + } + } + return NULL; +} + +static int +fctkern__cl_parse_config_logger(fctkern_t *nk) +{ + fct_logger_i *logger =NULL; + char const *sel_logger =NULL; + char const *def_logger =FCT_DEFAULT_LOGGER; + sel_logger = fctkern__cl_val2(nk, FCT_OPT_LOGGER, def_logger); + FCT_ASSERT(sel_logger != NULL && "should never be NULL"); + /* First search the user selected types, then search the + built-in types. */ + if ( nk->lt_usr != NULL ) + { + logger = fckern_sel_log(nk->lt_usr, sel_logger); + } + if ( nk->lt_sys != NULL && logger == NULL ) + { + logger = fckern_sel_log(nk->lt_sys, sel_logger); + } + if ( logger == NULL ) + { + /* No logger configured, you must have supplied an invalid selection. */ + fprintf(stderr, "error: unknown logger selected - '%s'", sel_logger); + return 0; + } + fctkern__add_logger(nk, logger); + logger = NULL; /* owned by nk. */ + return 1; +} + + + +/* Call this if you want to (re)parse the command line options with a new +set of options. Returns -1 if you are to abort with EXIT_SUCCESS, returns +0 if you are to abort with EXIT_FAILURE and returns 1 if you are to continue. */ +static int +fctkern__cl_parse(fctkern_t *nk) +{ + int status =0; + size_t num_params =0; + size_t param_i =0; + if ( nk == NULL ) + { + return 0; + } + if ( nk->cl_user_opts != NULL ) + { + if ( !fct_clp__add_options(&(nk->cl_parser), nk->cl_user_opts) ) + { + status =0; + goto finally; + } + } + /* You want to add the "house options" after the user defined ones. The + options are stored as a list so it means that any option listed after + the above ones won't get parsed. */ + if ( !fct_clp__add_options(&(nk->cl_parser), FCT_CLP_OPTIONS) ) + { + status =0; + goto finally; + } + fct_clp__parse(&(nk->cl_parser), nk->cl_argc, nk->cl_argv); + if ( fct_clp__is_error(&(nk->cl_parser)) ) + { + char *err = fct_clp__get_error(&(nk->cl_parser)); + fprintf(stderr, "error: %s", err); + status =0; + goto finally; + } + num_params = fct_clp__param_cnt(&(nk->cl_parser)); + for ( param_i =0; param_i != num_params; ++param_i ) + { + char const *param = fct_clp__param_at(&(nk->cl_parser), param_i); + fctkern__add_prefix_filter(nk, param); + } + if ( fctkern__cl_is(nk, FCT_OPT_VERSION) ) + { + (void)printf("Built using FCTX version %s.\n", FCT_VERSION_STR); + status = -1; + goto finally; + } + if ( fctkern__cl_is(nk, FCT_OPT_HELP) ) + { + fctkern__write_help(nk, stdout); + status = -1; + goto finally; + } + if ( !fctkern__cl_parse_config_logger(nk) ) + { + status = -1; + goto finally; + } + status =1; + nk->cl_is_parsed =1; +finally: + return status; +} + + + +/* Parses the command line and sets up the framework. The argc and argv +should be directly from the program's main. */ +static int +fctkern__init(fctkern_t *nk, int argc, const char *argv[]) +{ + if ( argc == 0 && argv == NULL ) + { + return 0; + } + memset(nk, 0, sizeof(fctkern_t)); + fct_clp__init(&(nk->cl_parser), NULL); + fct_nlist__init(&(nk->logger_list)); + nk->lt_usr = NULL; /* Supplied via 'install' mechanics. */ + nk->lt_sys = FCT_LOGGER_TYPES; + fct_nlist__init2(&(nk->prefix_list), 0); + fct_nlist__init2(&(nk->ts_list), 0); + nk->cl_is_parsed =0; + /* Save a copy of the arguments. We do a delay parse of the command + line arguments in order to allow the client code to optionally configure + the command line parser.*/ + nk->cl_argc = argc; + nk->cl_argv = argv; + fct_namespace_init(&(nk->ns)); + return 1; +} + + +/* Takes OWNERSHIP of the test suite after we have finished executing +its contents. This way we can build up all kinds of summaries at the end +of a run. */ +static void +fctkern__add_ts(fctkern_t *nk, fct_ts_t *ts) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( ts != NULL ); + fct_nlist__append(&(nk->ts_list), ts); +} + + +/* Returns FCT_TRUE if the supplied test_name passes the filters set on +this test suite. If there are no filters, we return FCT_TRUE always. */ +static nbool_t +fctkern__pass_filter(fctkern_t *nk, char const *test_name) +{ + size_t prefix_i =0; + size_t prefix_list_size =0; + FCT_ASSERT( nk != NULL && "invalid arg"); + FCT_ASSERT( test_name != NULL ); + FCT_ASSERT( strlen(test_name) > 0 ); + prefix_list_size = fctkern__filter_cnt(nk); + /* If there is no filter list, then we return FCT_TRUE always. */ + if ( prefix_list_size == 0 ) + { + return FCT_TRUE; + } + /* Iterate through the prefix filter list, and see if we have + anything that does not pass. All we require is ONE item that + passes the test in order for us to succeed here. */ + for ( prefix_i = 0; prefix_i != prefix_list_size; ++prefix_i ) + { + char const *prefix = (char const*)fct_nlist__at( + &(nk->prefix_list), prefix_i + ); + nbool_t pass = fct_filter_pass(prefix, test_name); + if ( pass ) + { + return FCT_TRUE; + } + } + /* Otherwise, we never managed to find a prefix that satisfied the + supplied test name. Therefore we have failed to pass to the filter + list test. */ + return FCT_FALSE; +} + + +/* Returns the number of tests that were performed. */ +static size_t +fctkern__tst_cnt(fctkern_t const *nk) +{ + size_t tally =0; + FCT_ASSERT( nk != NULL ); + FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list)) + { + tally += fct_ts__tst_cnt(ts); + } + FCT_NLIST_FOREACH_END(); + return tally; +} + + +/* Returns the number of tests that passed. */ +static size_t +fctkern__tst_cnt_passed(fctkern_t const *nk) +{ + size_t tally =0; + FCT_ASSERT( nk != NULL ); + + FCT_NLIST_FOREACH_BGN(fct_ts_t*, ts, &(nk->ts_list)) + { + tally += fct_ts__tst_cnt_passed(ts); + } + FCT_NLIST_FOREACH_END(); + + return tally; +} + + +/* Returns the number of tests that failed. */ +#define fctkern__tst_cnt_failed(nk) \ + (fctkern__tst_cnt(nk) - fctkern__tst_cnt_passed(nk)) + + +/* Returns the number of checks made throughout the entire test. */ +#if defined(FCT_USE_TEST_COUNT) +static size_t +fctkern__chk_cnt(fctkern_t const *nk) +{ + size_t tally =0; + FCT_ASSERT( nk != NULL ); + + FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list)) + { + tally += fct_ts__chk_cnt(ts); + } + FCT_NLIST_FOREACH_END(); + return tally; +} +#endif /* FCT_USE_TEST_COUNT */ + + +/* Indicates the very end of all the tests. */ +#define fctkern__end(nk) /* unused */ + + +static void +fctkern__log_suite_start(fctkern_t *nk, fct_ts_t const *ts) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( ts != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_suite_start(logger, ts); + } + FCT_NLIST_FOREACH_END(); +} + + +static void +fctkern__log_suite_end(fctkern_t *nk, fct_ts_t const *ts) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( ts != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_suite_end(logger, ts); + } + FCT_NLIST_FOREACH_END(); +} + + +static void +fctkern__log_suite_skip(fctkern_t *nk, char const *condition, char const *name) +{ + if ( nk == NULL ) + { + return; + } + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_suite_skip(logger, condition, name); + } + FCT_NLIST_FOREACH_END(); +} + + +static void +fctkern__log_test_skip(fctkern_t *nk, char const *condition, char const *name) +{ + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_skip(logger, condition, name); + } + FCT_NLIST_FOREACH_END(); +} + + +/* Use this for displaying information about a "Check" (i.e. +a condition). */ +static void +fctkern__log_chk(fctkern_t *nk, fctchk_t const *chk) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( chk != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_chk(logger, chk); + } + FCT_NLIST_FOREACH_END(); +} + + +/* Use this for displaying warning messages. */ +static void +fctkern__log_warn(fctkern_t *nk, char const *warn) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( warn != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_warn(logger, warn); + } + FCT_NLIST_FOREACH_END(); +} + + +/* Called whenever a test is started. */ +static void +fctkern__log_test_start(fctkern_t *nk, fct_test_t const *test) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( test != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_start(logger, test); + } + FCT_NLIST_FOREACH_END(); +} + + +static void +fctkern__log_test_end(fctkern_t *nk, fct_test_t *test) +{ + FCT_ASSERT( nk != NULL ); + FCT_ASSERT( test != NULL ); + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list)) + { + fct_logger__on_test_end(logger, test); + } + FCT_NLIST_FOREACH_END(); +} + + +#define fctkern__log_start(_NK_) \ + {\ + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\ + {\ + fct_logger__on_fctx_start(logger, (_NK_));\ + }\ + FCT_NLIST_FOREACH_END();\ + } + + +#define fctkern__log_end(_NK_) \ + {\ + FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\ + {\ + fct_logger__on_fctx_end(logger, (_NK_));\ + }\ + FCT_NLIST_FOREACH_END();\ + } + + + + +/* +----------------------------------------------------------- +LOGGER INTERFACE + +Defines an interface to a logging system. A logger +must define the following functions in order to hook +into the logging system. + +See the "Standard Logger" and "Minimal Logger" as examples +of the implementation. +----------------------------------------------------------- +*/ + +/* Common event argument. The values of the each event may or may not be +defined depending on the event in question. */ +struct _fct_logger_evt_t +{ + fctkern_t const *kern; + fctchk_t const *chk; + fct_test_t const *test; + fct_ts_t const *ts; + char const *msg; + char const *cndtn; + char const *name; +}; + + +typedef struct _fct_logger_i_vtable_t +{ + /* 1 + * Fired when an "fct_chk*" (check) function is completed. The event + * will contain a reference to the "chk" object created. + * */ + void (*on_chk)(fct_logger_i *logger, fct_logger_evt_t const *e); + + /* 2 + * Fired when a test starts and before any checks are made. The + * event will have its "test" object set. */ + void (*on_test_start)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 3 */ + void (*on_test_end)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 4 */ + void (*on_test_suite_start)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 5 */ + void (*on_test_suite_end)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 6 */ + void (*on_fctx_start)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 7 */ + void (*on_fctx_end)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 8 + Called when the logger object must "clean up". */ + void (*on_delete)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 9 */ + void (*on_warn)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* -- new in 1.2 -- */ + /* 10 */ + void (*on_test_suite_skip)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); + /* 11 */ + void (*on_test_skip)( + fct_logger_i *logger, + fct_logger_evt_t const *e + ); +} fct_logger_i_vtable_t; + +#define _fct_logger_head \ + fct_logger_i_vtable_t vtable; \ + fct_logger_evt_t evt + +struct _fct_logger_i +{ + _fct_logger_head; +}; + + +static void +fct_logger__stub(fct_logger_i *l, fct_logger_evt_t const *e) +{ + fct_unused(l); + fct_unused(e); +} + + +static fct_logger_i_vtable_t fct_logger_default_vtable = +{ + fct_logger__stub, /* 1. on_chk */ + fct_logger__stub, /* 2. on_test_start */ + fct_logger__stub, /* 3. on_test_end */ + fct_logger__stub, /* 4. on_test_suite_start */ + fct_logger__stub, /* 5. on_test_suite_end */ + fct_logger__stub, /* 6. on_fctx_start */ + fct_logger__stub, /* 7. on_fctx_end */ + fct_logger__stub, /* 8. on_delete */ + fct_logger__stub, /* 9. on_warn */ + fct_logger__stub, /* 10. on_test_suite_skip */ + fct_logger__stub, /* 11. on_test_skip */ +}; + + +/* Initializes the elements of a logger interface so they are at their +standard values. */ +static void +fct_logger__init(fct_logger_i *logger) +{ + FCT_ASSERT( logger != NULL ); + memcpy( + &(logger->vtable), + &fct_logger_default_vtable, + sizeof(fct_logger_i_vtable_t) + ); + memset(&(logger->evt),0, sizeof(fct_logger_evt_t)); +} + +static void +fct_logger__del(fct_logger_i *logger) +{ + if ( logger ) + { + logger->vtable.on_delete(logger, &(logger->evt)); + } +} + + +static void +fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test) +{ + logger->evt.test = test; + logger->vtable.on_test_start(logger, &(logger->evt)); +} + + +static void +fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test) +{ + logger->evt.test = test; + logger->vtable.on_test_end(logger, &(logger->evt)); +} + + +static void +fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts) +{ + logger->evt.ts = ts; + logger->vtable.on_test_suite_start(logger, &(logger->evt)); +} + + +static void +fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts) +{ + logger->evt.ts = ts; + logger->vtable.on_test_suite_end(logger, &(logger->evt)); +} + + +static void +fct_logger__on_test_suite_skip( + fct_logger_i *logger, + char const *condition, + char const *name +) +{ + logger->evt.cndtn = condition; + logger->evt.name = name; + logger->vtable.on_test_suite_skip(logger, &(logger->evt)); +} + + +static void +fct_logger__on_test_skip( + fct_logger_i *logger, + char const *condition, + char const *name +) +{ + logger->evt.cndtn = condition; + logger->evt.name = name; + logger->vtable.on_test_skip(logger, &(logger->evt)); +} + + +static void +fct_logger__on_chk(fct_logger_i *logger, fctchk_t const *chk) +{ + logger->evt.chk = chk; + logger->vtable.on_chk(logger, &(logger->evt)); +} + +/* When we start all our tests. */ +#define fct_logger__on_fctx_start(LOGGER, KERN) \ + (LOGGER)->evt.kern = (KERN);\ + (LOGGER)->vtable.on_fctx_start((LOGGER), &((LOGGER)->evt)); + + +/* When we have reached the end of ALL of our testing. */ +#define fct_logger__on_fctx_end(LOGGER, KERN) \ + (LOGGER)->evt.kern = (KERN);\ + (LOGGER)->vtable.on_fctx_end((LOGGER), &((LOGGER)->evt)); + + +static void +fct_logger__on_warn(fct_logger_i *logger, char const *msg) +{ + logger->evt.msg = msg; + logger->vtable.on_warn(logger, &(logger->evt)); +} + + +/* Common routine to record strings representing failures. The +chk should be a failure before we call this, and the list is a list +of char*'s that will eventually be free'd by the logger. */ +static void +fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list) +{ + /* For now we will truncate the string to some set amount, later + we can work out a dynamic string object. */ + char *str = (char*)malloc(sizeof(char)*FCT_MAX_LOG_LINE); + FCT_ASSERT( str != NULL ); + fct_snprintf( + str, + FCT_MAX_LOG_LINE, + "%s(%d):\n %s", + fctchk__file(chk), + fctchk__lineno(chk), + fctchk__msg(chk) + ); + /* Append it to the listing ... */ + fct_nlist__append(fail_list, (void*)str); +} + + +/* Another common routine, to print the failures at the end of a run. */ +static void +fct_logger_print_failures(fct_nlist_t const *fail_list) +{ + puts( + "\n----------------------------------------------------------------------------\n" + ); + puts("FAILED TESTS\n\n"); + FCT_NLIST_FOREACH_BGN(char *, cndtn_str, fail_list) + { + printf("%s\n", cndtn_str); + } + FCT_NLIST_FOREACH_END(); + + puts("\n"); +} + + + + +/* +----------------------------------------------------------- +MINIMAL LOGGER +----------------------------------------------------------- + +At the moment the MINIMAL LOGGER is currently disabled. Hope +to bring it back online soon. The only reason it is +disabled is that we don't currently have the ability to specify +loggers. +*/ + + +/* Minimal logger, reports the minimum amount of information needed +to determine "something is happening". */ +struct _fct_minimal_logger_t +{ + _fct_logger_head; + /* A list of char*'s that needs to be cleaned up. */ + fct_nlist_t failed_cndtns_list; +}; + + +static void +fct_minimal_logger__on_chk( + fct_logger_i *self_, + fct_logger_evt_t const *e +) +{ + fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_; + if ( fctchk__is_pass(e->chk) ) + { + fputs(".", stdout); + } + else + { + fputs("x", stdout); + fct_logger_record_failure(e->chk, &(self->failed_cndtns_list)); + + } +} + +static void +fct_minimal_logger__on_fctx_end( + fct_logger_i *self_, + fct_logger_evt_t const *e +) +{ + fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_; + fct_unused(e); + if ( fct_nlist__size(&(self->failed_cndtns_list)) >0 ) + { + fct_logger_print_failures(&(self->failed_cndtns_list)); + } +} + + +static void +fct_minimal_logger__on_delete( + fct_logger_i *self_, + fct_logger_evt_t const *e +) +{ + fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_; + fct_unused(e); + fct_nlist__final(&(self->failed_cndtns_list), free); + free(self); + +} + + +fct_logger_i* +fct_minimal_logger_new(void) +{ + fct_minimal_logger_t *self = (fct_minimal_logger_t*)\ + calloc(1,sizeof(fct_minimal_logger_t)); + if ( self == NULL ) + { + return NULL; + } + fct_logger__init((fct_logger_i*)self); + self->vtable.on_chk = fct_minimal_logger__on_chk; + self->vtable.on_fctx_end = fct_minimal_logger__on_fctx_end; + self->vtable.on_delete = fct_minimal_logger__on_delete; + fct_nlist__init2(&(self->failed_cndtns_list), 0); + return (fct_logger_i*)self; +} + + +/* +----------------------------------------------------------- +STANDARD LOGGER +----------------------------------------------------------- +*/ + +struct _fct_standard_logger_t +{ + _fct_logger_head; + + /* Start time. For now we use the low-accuracy time_t version. */ + fct_timer_t timer; + + /* A list of char*'s that needs to be cleaned up. */ + fct_nlist_t failed_cndtns_list; +}; + + +#define FCT_STANDARD_LOGGER_MAX_LINE 68 + + +/* When a failure occurs, we will record the details so we can display +them when the log "finishes" up. */ +static void +fct_standard_logger__on_chk( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_; + /* Only record failures. */ + if ( !fctchk__is_pass(e->chk) ) + { + fct_logger_record_failure(e->chk, &(logger->failed_cndtns_list)); + } +} + + +static void +fct_standard_logger__on_test_skip( + fct_logger_i* logger_, + fct_logger_evt_t const *e +) +{ + char const *condition = e->cndtn; + char const *name = e->name; + char msg[256] = {'\0'}; + fct_unused(logger_); + fct_unused(condition); + fct_snprintf(msg, sizeof(msg), "%s (%s)", name, condition); + msg[sizeof(msg)-1] = '\0'; + fct_dotted_line_start(FCT_STANDARD_LOGGER_MAX_LINE, msg); + fct_dotted_line_end("- SKIP -"); +} + + +static void +fct_standard_logger__on_test_start( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_unused(logger_); + fct_dotted_line_start( + FCT_STANDARD_LOGGER_MAX_LINE, + fct_test__name(e->test) + ); +} + + +static void +fct_standard_logger__on_test_end( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + nbool_t is_pass; + fct_unused(logger_); + is_pass = fct_test__is_pass(e->test); + fct_dotted_line_end((is_pass) ? "PASS" : "FAIL ***" ); +} + + +static void +fct_standard_logger__on_fctx_start( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_; + fct_unused(e); + fct_timer__start(&(logger->timer)); +} + + +static void +fct_standard_logger__on_fctx_end( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_; + nbool_t is_success =1; + double elasped_time =0; + size_t num_tests =0; + size_t num_passed =0; + + fct_timer__stop(&(logger->timer)); + + is_success = fct_nlist__size(&(logger->failed_cndtns_list)) ==0; + + if ( !is_success ) + { + fct_logger_print_failures(&(logger->failed_cndtns_list)); + } + puts( + "\n----------------------------------------------------------------------------\n" + ); + num_tests = fctkern__tst_cnt(e->kern); + num_passed = fctkern__tst_cnt_passed(e->kern); + printf( + "%s (%lu/%lu tests", + (is_success) ? "PASSED" : "FAILED", + (unsigned long) num_passed, + (unsigned long) num_tests + ); + elasped_time = fct_timer__duration(&(logger->timer)); + if ( elasped_time > 0.0000001 ) + { + printf(" in %.6fs)\n", elasped_time); + } + else + { + /* Don't bother displaying the time to execute. */ + puts(")\n"); + } +} + + +static void +fct_standard_logger__on_delete( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_; + fct_unused(e); + fct_nlist__final(&(logger->failed_cndtns_list), free); + free(logger); + logger_ =NULL; +} + + +static void +fct_standard_logger__on_warn( + fct_logger_i* logger_, + fct_logger_evt_t const *e +) +{ + fct_unused(logger_); + (void)printf("WARNING: %s", e->msg); +} + + +fct_logger_i* +fct_standard_logger_new(void) +{ + fct_standard_logger_t *logger = (fct_standard_logger_t *)calloc( + 1, sizeof(fct_standard_logger_t) + ); + if ( logger == NULL ) + { + return NULL; + } + fct_logger__init((fct_logger_i*)logger); + logger->vtable.on_chk = fct_standard_logger__on_chk; + logger->vtable.on_test_start = fct_standard_logger__on_test_start; + logger->vtable.on_test_end = fct_standard_logger__on_test_end; + logger->vtable.on_fctx_start = fct_standard_logger__on_fctx_start; + logger->vtable.on_fctx_end = fct_standard_logger__on_fctx_end; + logger->vtable.on_delete = fct_standard_logger__on_delete; + logger->vtable.on_warn = fct_standard_logger__on_warn; + logger->vtable.on_test_skip = fct_standard_logger__on_test_skip; + fct_nlist__init2(&(logger->failed_cndtns_list), 0); + fct_timer__init(&(logger->timer)); + return (fct_logger_i*)logger; +} + + +/* +----------------------------------------------------------- +JUNIT LOGGER +----------------------------------------------------------- +*/ + + +/* JUnit logger */ +struct _fct_junit_logger_t +{ + _fct_logger_head; +}; + + +static void +fct_junit_logger__on_test_suite_start( + fct_logger_i *l, + fct_logger_evt_t const *e +) +{ + fct_unused(l); + fct_unused(e); + FCT_SWITCH_STDOUT_TO_BUFFER(); + FCT_SWITCH_STDERR_TO_BUFFER(); +} + + +static void +fct_junit_logger__on_test_suite_end( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_ts_t const *ts = e->ts; /* Test Suite */ + nbool_t is_pass; + double elasped_time = 0; + char std_buffer[1024]; + int read_length; + int first_out_line; + + fct_unused(logger_); + + elasped_time = fct_ts__duration(ts); + + FCT_SWITCH_STDOUT_TO_STDOUT(); + FCT_SWITCH_STDERR_TO_STDERR(); + + /* opening testsuite tag */ + printf("\t\n", + (unsigned long) fct_ts__tst_cnt(ts) + - fct_ts__tst_cnt_passed(ts), + (unsigned long) fct_ts__tst_cnt(ts), + fct_ts__name(ts), + elasped_time); + + FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list)) + { + is_pass = fct_test__is_pass(test); + + /* opening testcase tag */ + if (is_pass) + { + printf("\t\t\n", + fct_test__name(test), + fct_test__duration(test) + ); + } + + FCT_NLIST_FOREACH_BGN(fctchk_t*, chk, &(test->failed_chks)) + { + /* error tag */ + printf("\t\t\t", chk->msg); + printf("file:%s, line:%d", chk->file, chk->lineno); + printf("\n"); + } + FCT_NLIST_FOREACH_END(); + + /* closing testcase tag */ + if (is_pass) + { + printf(" />\n"); + } + else + { + printf("\t\t\n"); + } + } + FCT_NLIST_FOREACH_END(); + + /* print the std streams */ + first_out_line = 1; + printf("\t\t\n\t\t\t 0) + { + if (first_out_line) + { + printf("\n"); + first_out_line = 0; + } + printf("%.*s", read_length, std_buffer); + } + printf("]]>\n\t\t\n"); + + first_out_line = 1; + printf("\t\t\n\t\t\t 0) + { + if (first_out_line) + { + printf("\n"); + first_out_line = 0; + } + printf("%.*s", read_length, std_buffer); + } + printf("]]>\n\t\t\n"); + + /* closing testsuite tag */ + printf("\t\n"); +} + +static void +fct_junit_logger__on_fct_start( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_unused(logger_); + fct_unused(e); + printf("\n"); + printf("\n"); +} + +static void +fct_junit_logger__on_fctx_end( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_unused(logger_); + fct_unused(e); + printf("\n"); +} + +static void +fct_junit_logger__on_delete( + fct_logger_i *logger_, + fct_logger_evt_t const *e +) +{ + fct_junit_logger_t *logger = (fct_junit_logger_t*)logger_; + fct_unused(e); + free(logger); + logger_ =NULL; +} + + +fct_junit_logger_t * +fct_junit_logger_new(void) +{ + fct_junit_logger_t *logger = + (fct_junit_logger_t *)calloc(1, sizeof(fct_junit_logger_t)); + if ( logger == NULL ) + { + return NULL; + } + fct_logger__init((fct_logger_i*)logger); + logger->vtable.on_test_suite_start = fct_junit_logger__on_test_suite_start; + logger->vtable.on_test_suite_end = fct_junit_logger__on_test_suite_end; + logger->vtable.on_fctx_start = fct_junit_logger__on_fct_start; + logger->vtable.on_fctx_end = fct_junit_logger__on_fctx_end; + logger->vtable.on_delete = fct_junit_logger__on_delete; + return logger; +} + + +/* +------------------------------------------------------------ +MACRO MAGIC +------------------------------------------------------------ +This is where the show begins! +*/ + +/* This macro invokes a bunch of functions that need to be referenced in +order to avoid a "unreferenced local function has been removed" warning. +The logical acrobatics below try and make it appear to the compiler that +they are needed, but at runtime, only the cheap, first call is made. */ +#define FCT_REFERENCE_FUNCS() \ + {\ + int check = 0 && fctstr_ieq(NULL, NULL);\ + if ( check ) {\ + _fct_cmt("not to be executed");\ + (void)_fct_chk_empty_str(NULL);\ + (void)_fct_chk_full_str(NULL);\ + (void)fct_test__start_timer(NULL);\ + (void)fct_test__stop_timer(NULL);\ + (void)fct_ts_new(NULL);\ + (void)fct_ts__test_begin(NULL);\ + (void)fct_ts__add_test(NULL, NULL);\ + (void)fct_ts__test_end(NULL);\ + (void)fct_ts__inc_total_test_num(NULL);\ + (void)fct_ts__make_abort_test(NULL);\ + (void)fct_ts__setup_abort(NULL);\ + (void)fct_ts__setup_end(NULL);\ + (void)fct_ts__teardown_end(NULL);\ + (void)fct_ts__cnt_end(NULL);\ + (void)fct_ts__is_test_cnt(NULL, 0);\ + (void)fct_xchk_fn(0, "");\ + (void)fct_xchk2_fn(NULL, 0, "");\ + (void)fctkern__cl_parse(NULL);\ + (void)fctkern__add_ts(NULL, NULL);\ + (void)fctkern__pass_filter(NULL, NULL);\ + (void)fctkern__log_suite_start(NULL, NULL);\ + (void)fctkern__log_suite_end(NULL, NULL);\ + (void)fctkern__log_test_skip(NULL, NULL, NULL);\ + (void)fctkern__log_test_start(NULL, NULL);\ + (void)fctkern__log_test_end(NULL, NULL);\ + (void)fctstr_endswith(NULL,NULL);\ + (void)fctstr_iendswith(NULL,NULL);\ + (void)fctstr_ieq(NULL,NULL);\ + (void)fctstr_incl(NULL, NULL);\ + (void)fctstr_iincl(NULL, NULL);\ + (void)fctstr_iendswith(NULL,NULL);\ + (void)fctstr_istartswith(NULL,NULL);\ + (void)fctstr_clone_lower(NULL);\ + (void)fctstr_startswith(NULL,NULL);\ + (void)fctkern__init(NULL, 0, NULL);\ + (void)fctkern__cl_is(NULL, "");\ + (void)fctkern__cl_val2(NULL, NULL, NULL);\ + fctkern__log_suite_skip(NULL, NULL, NULL);\ + (void)fct_clp__is_param(NULL,NULL);\ + _fct_cmt("should never construct an object");\ + (void)fct_test_new(NULL);\ + (void)fct_ts__chk_cnt(NULL);\ + }\ + } + + +#define FCT_INIT(_ARGC_, _ARGV_) \ + fctkern_t fctkern__; \ + fctkern_t* fctkern_ptr__ = &fctkern__; \ + FCT_REFERENCE_FUNCS(); \ + if ( !fctkern__init(fctkern_ptr__, (_ARGC_), (const char **)(_ARGV_)) ) {\ + (void)fprintf( \ + stderr, "FATAL ERROR: Unable to initialize FCTX Kernel." \ + ); \ + exit(EXIT_FAILURE); \ + } \ + + +#define FCT_FINAL() \ + fctkern_ptr__->ns.num_total_failed = fctkern__tst_cnt_failed( \ + (fctkern_ptr__) \ + ); \ + fctkern__log_end(fctkern_ptr__); \ + fctkern__end(fctkern_ptr__); \ + fctkern__final(fctkern_ptr__); \ + FCT_ASSERT( !((int)fctkern_ptr__->ns.num_total_failed < 0) \ + && "or we got truncated!"); \ + if ( fctkern_ptr__->ns.num_total_failed == \ + fctkern_ptr__->num_expected_failures) { \ + fctkern_ptr__->ns.num_total_failed = 0; \ + } \ + + + +#define FCT_NUM_FAILED() \ + fctkern_ptr__->ns.num_total_failed \ + + + +/* Typically used internally only, this mentions to FCTX that you EXPECT +to _NUM_FAILS_. If you the expected matches the actual, a 0 value is returned +from the program. */ +#define FCT_EXPECTED_FAILURES(_NUM_FAILS_) \ + ((fctkern_ptr__->num_expected_failures = (_NUM_FAILS_))) + + +#define FCT_BGN_FN(_FNNAME_) \ + int _FNNAME_(int argc, char* argv[])\ + { \ + FCT_INIT(argc, argv) + +#define FCT_END_FN() FCT_END() + +/* This defines our start. The fctkern__ is a kernel object +that lives throughout the lifetime of our program. The +fctkern_ptr__ makes it easier to abstract out macros. */ +#define FCT_BGN() FCT_BGN_FN(main) + + +/* Silence Intel complaints about unspecified operand order in user's code */ +#ifndef __INTEL_COMPILER +# define FCT_END_WARNINGFIX_BGN +# define FCT_END_WARNINGFIX_END +#else +# define FCT_END_WARNINGFIX_BGN _Pragma("warning(push,disable:981)"); +# define FCT_END_WARNINGFIX_END _Pragma("warning(pop)"); +#endif + +/* Ends the test suite by returning the number failed. The "chk_cnt" call is +made in order allow strict compilers to pass when it encounters unreferenced +functions. */ +#define FCT_END() \ + { \ + FCT_END_WARNINGFIX_BGN \ + FCT_FINAL(); \ + return (int) FCT_NUM_FAILED();\ + FCT_END_WARNINGFIX_END \ + }\ +} + +#define fctlog_install(_CUST_LOGGER_LIST_) \ + fctkern_ptr__->lt_usr = (_CUST_LOGGER_LIST_) + +/* Re-parses the command line options with the addition of user defined +options. */ +#define fctcl_install(_CLO_INIT_) \ + {\ + fctkern_ptr__->cl_user_opts = (_CLO_INIT_);\ + _fct_cmt("Delay parse in order to allow for user customization.");\ + if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\ + int status = fctkern__cl_parse((fctkern_ptr__));\ + _fct_cmt("Need to parse command line before we start logger.");\ + fctkern__log_start((fctkern_ptr__));\ + switch( status ) {\ + case -1:\ + case 0:\ + fctkern__final(fctkern_ptr__);\ + exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\ + break;\ + default:\ + fct_pass();\ + }\ + }\ + } + + +#define fctcl_is(_OPT_STR_) (fctkern__cl_is(fctkern_ptr__, (_OPT_STR_))) + +#define fctcl_val(_OPT_STR_) (fctcl_val2((_OPT_STR_), NULL)) + +#define fctcl_val2(_OPT_STR_, _DEF_STR_) \ + (fctkern__cl_val2(fctkern_ptr__, (_OPT_STR_), (_DEF_STR_))) + + +/* We delay the first parse of the command line until we get the first +test fixture. This allows the user to possibly add their own parse +specification. */ +#define FCT_FIXTURE_SUITE_BGN(_NAME_) \ + {\ + fctkern_ptr__->ns.ts_curr = fct_ts_new( #_NAME_ );\ + _fct_cmt("Delay parse in order to allow for user customization.");\ + if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\ + int status = fctkern__cl_parse((fctkern_ptr__));\ + _fct_cmt("Need to parse command line before we start logger.");\ + fctkern__log_start((fctkern_ptr__));\ + switch( status ) {\ + case -1:\ + case 0:\ + fct_ts__del((fctkern_ptr__->ns.ts_curr));\ + fctkern__final(fctkern_ptr__);\ + exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\ + break;\ + default:\ + fct_pass();\ + }\ + }\ + if ( fctkern_ptr__->ns.ts_curr == NULL ) {\ + fctkern__log_warn((fctkern_ptr__), "out of memory");\ + }\ + else\ + {\ + fctkern__log_suite_start((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\ + for (;;)\ + {\ + fctkern_ptr__->ns.test_num = -1;\ + if ( fct_ts__is_ending_mode(fctkern_ptr__->ns.ts_curr) \ + || fct_ts__is_abort_mode(fctkern_ptr__->ns.ts_curr) )\ + {\ + _fct_cmt("flag the test suite as complete.");\ + fct_ts__end(fctkern_ptr__->ns.ts_curr);\ + break;\ + } + + + +/* Closes off a "Fixture" test suite. */ +#define FCT_FIXTURE_SUITE_END() \ + if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\ + {\ + fct_ts__cnt_end(fctkern_ptr__->ns.ts_curr);\ + }\ + }\ + fctkern__add_ts((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\ + fctkern__log_suite_end((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\ + fct_ts__end(fctkern_ptr__->ns.ts_curr);\ + fctkern_ptr__->ns.ts_curr = NULL;\ + }\ + } + +#define FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, _NAME_) \ + fctkern_ptr__->ns.ts_is_skip_suite = !(_CONDITION_);\ + fctkern_ptr__->ns.ts_skip_cndtn = #_CONDITION_;\ + if ( fctkern_ptr__->ns.ts_is_skip_suite ) {\ + fctkern__log_suite_skip((fctkern_ptr__), #_CONDITION_, #_NAME_);\ + }\ + FCT_FIXTURE_SUITE_BGN(_NAME_); + +#define FCT_FIXTURE_SUITE_END_IF() \ + FCT_FIXTURE_SUITE_END();\ + fctkern_ptr__->ns.ts_is_skip_suite =0;\ + fctkern_ptr__->ns.ts_skip_cndtn =NULL;\ + +#define FCT_SETUP_BGN()\ + if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) ) { + +#define FCT_SETUP_END() \ + fct_ts__setup_end(fctkern_ptr__->ns.ts_curr); } + +#define FCT_TEARDOWN_BGN() \ + if ( fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) {\ + +#define FCT_TEARDOWN_END() \ + fct_ts__teardown_end(fctkern_ptr__->ns.ts_curr); \ + continue; \ + } + +/* Lets you create a test suite, where maybe you don't want a fixture. We +do it by 'stubbing' out the setup/teardown logic. */ +#define FCT_SUITE_BGN(Name) \ + FCT_FIXTURE_SUITE_BGN(Name) {\ + FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\ + FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\ + +#define FCT_SUITE_END() } FCT_FIXTURE_SUITE_END() + +#define FCT_SUITE_BGN_IF(_CONDITION_, _NAME_) \ + FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, (_NAME_)) {\ + FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\ + FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\ + +#define FCT_SUITE_END_IF() } FCT_FIXTURE_SUITE_END_IF() + +typedef enum +{ + FCT_TEST_END_FLAG_Default = 0x0000, + FCT_TEST_END_FLAG_ClearFail = 0x0001 +} FCT_TEST_END_FLAG; + + +#define FCT_TEST_BGN_IF(_CONDITION_, _NAME_) { \ + fctkern_ptr__->ns.test_is_skip = !(_CONDITION_);\ + fctkern_ptr__->ns.test_skip_cndtn = #_CONDITION_;\ + FCT_TEST_BGN(_NAME_) {\ + +#define FCT_TEST_END_IF() \ + } FCT_TEST_END();\ + fctkern_ptr__->ns.test_is_skip = 0;\ + fctkern_ptr__->ns.test_skip_cndtn = NULL;\ + } + + +/* Depending on whether or not we are counting the tests, we will have to +first determine if the test is the "current" count. Then we have to determine +if we can pass the filter. Finally we will execute everything so that when a +check fails, we can "break" out to the end of the test. And in between all +that we do a memory check and fail a test if we can't build a fct_test +object (should be rare). */ +#define FCT_TEST_BGN(_NAME_) \ + {\ + fctkern_ptr__->ns.curr_test_name = #_NAME_;\ + ++(fctkern_ptr__->ns.test_num);\ + if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\ + {\ + fct_ts__inc_total_test_num(fctkern_ptr__->ns.ts_curr);\ + }\ + else if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) \ + && fct_ts__is_test_cnt(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.test_num) )\ + {\ + fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\ + if ( fctkern__pass_filter(fctkern_ptr__, fctkern_ptr__->ns.curr_test_name ) )\ + {\ + fctkern_ptr__->ns.curr_test = fct_test_new( fctkern_ptr__->ns.curr_test_name );\ + if ( fctkern_ptr__->ns.curr_test == NULL ) {\ + fctkern__log_warn(fctkern_ptr__, "out of memory");\ + } else if ( fctkern_ptr__->ns.ts_is_skip_suite \ + || fctkern_ptr__->ns.test_is_skip ) {\ + fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\ + fctkern__log_test_skip(\ + fctkern_ptr__,\ + fctkern_ptr__->ns.curr_test_name,\ + (fctkern_ptr__->ns.test_is_skip) ?\ + (fctkern_ptr__->ns.test_skip_cndtn) :\ + (fctkern_ptr__->ns.ts_skip_cndtn)\ + );\ + fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\ + continue;\ + } else {\ + fctkern__log_test_start(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\ + fct_test__start_timer(fctkern_ptr__->ns.curr_test);\ + for (;;) \ + { + + + + +#define FCT_TEST_END() \ + break;\ + }\ + fct_test__stop_timer(fctkern_ptr__->ns.curr_test);\ + }\ + fct_ts__add_test(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test);\ + fctkern__log_test_end(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\ + }\ + fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\ + continue;\ + }\ + }\ + + + +/* +--------------------------------------------------------- +CHECKING MACROS +---------------------------------------------------------- + +The chk variants will continue on while the req variants will abort +a test if a chk condition fails. The req variants are useful when you +no longer want to keep checking conditions because a critical condition +is not being met. */ + + +/* To support older compilers that do not have macro variable argument lists +we have to use a function. The macro manages to store away the line/file +location into a global before it runs this function, a trick I picked up from +the error handling in the APR library. The unfortunate thing is that we can +not carry forth the actual test through a "stringize" operation, but if you +wanted to do that you should use fct_chk. */ + +static int fct_xchk_lineno =0; +static char const *fct_xchk_file = NULL; +static fct_test_t *fct_xchk_test = NULL; +static fctkern_t *fct_xchk_kern =NULL; + + +static int +_fct_xchk_fn_varg( + char const *condition, + int is_pass, + char const *format, + va_list args +) +{ + fctchk_t *chk =NULL; + chk = fctchk_new( + is_pass, + condition, + fct_xchk_file, + fct_xchk_lineno, + format, + args + ); + if ( chk == NULL ) + { + fctkern__log_warn(fct_xchk_kern, "out of memory (aborting test)"); + goto finally; + } + + fct_test__add(fct_xchk_test, chk); + fctkern__log_chk(fct_xchk_kern, chk); +finally: + fct_xchk_lineno =0; + fct_xchk_file =NULL; + fct_xchk_test =NULL; + fct_xchk_kern =NULL; + return is_pass; +} + + +static int +fct_xchk2_fn(const char *condition, int is_pass, char const *format, ...) +{ + int r =0; + va_list args; + va_start(args, format); + r = _fct_xchk_fn_varg(condition, is_pass, format, args); + va_end(args); + return r; +} + + +static int +fct_xchk_fn(int is_pass, char const *format, ...) +{ + int r=0; + va_list args; + va_start(args, format); + r = _fct_xchk_fn_varg("", is_pass, format, args); + va_end(args); + return r; +} + + +/* Call this with the following argument list: + + fct_xchk(test_condition, format_str, ...) + +the bulk of this macro presets some globals to allow us to support +variable argument lists on older compilers. The idea came from the APR +libraries error checking routines. */ +#define fct_xchk fct_xchk_kern = fctkern_ptr__,\ + fct_xchk_test = fctkern_ptr__->ns.curr_test,\ + fct_xchk_lineno =__LINE__,\ + fct_xchk_file=__FILE__,\ + fct_xchk_fn + +#define fct_xchk2 fct_xchk_kern = fctkern_ptr__,\ + fct_xchk_test = fctkern_ptr__->ns.curr_test,\ + fct_xchk_lineno =__LINE__,\ + fct_xchk_file=__FILE__,\ + fct_xchk2_fn + + +/* This checks the condition and reports the condition as a string +if it fails. */ +#define fct_chk(_CNDTN_) (fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) + +#define _fct_req(_CNDTN_) \ + if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { break; } + + +/* When in test mode, construct a mock test object for fct_xchk to operate +with. If we fail a setup up, then we go directly to a teardown mode. */ +#define fct_req(_CNDTN_) \ + if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) ) { \ + _fct_req((_CNDTN_)); \ + } \ + else if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) \ + || fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) { \ + fctkern_ptr__->ns.curr_test = fct_ts__make_abort_test( \ + fctkern_ptr__->ns.ts_curr \ + ); \ + if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { \ + fct_ts__setup_abort(fctkern_ptr__->ns.ts_curr); \ + fct_ts__add_test( \ + fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test \ + ); \ + } \ + } else { \ + assert("invalid condition for fct_req!"); \ + _fct_req((_CNDTN_)); \ + } + + +#define fct_chk_eq_dbl(V1, V2) \ + fct_xchk(\ + ((int)(fabs((V1)-(V2)) < DBL_EPSILON)),\ + "chk_eq_dbl: %f != %f",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_neq_dbl(V1, V2) \ + fct_xchk(\ + ((int)(fabs((V1)-(V2)) >= DBL_EPSILON)),\ + "chk_neq_dbl: %f == %f",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_eq_str(V1, V2) \ + fct_xchk(fctstr_eq((V1), (V2)),\ + "chk_eq_str: '%s' != '%s'",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_neq_str(V1, V2) \ + fct_xchk(!fctstr_eq((V1), (V2)),\ + "chk_neq_str: '%s' == '%s'",\ + (V1),\ + (V2)\ + ) + +/* To quiet warnings with GCC, who think we are being silly and passing +in NULL to strlen, we will filter the predicate through these little +functions */ +static int +_fct_chk_empty_str(char const *s) +{ + if ( s == NULL ) + { + return 1; + } + return strlen(s) ==0; +} +static int +_fct_chk_full_str(char const *s) +{ + if ( s == NULL ) + { + return 0; + } + return strlen(s) >0; +} + + +#define fct_chk_empty_str(V) \ + fct_xchk(_fct_chk_empty_str((V)),\ + "string not empty: '%s'",\ + (V)\ + ) + +#define fct_chk_full_str(V) \ + fct_xchk(_fct_chk_full_str((V)),\ + "string is full: '%s'",\ + (V)\ + ) + + +#define fct_chk_eq_istr(V1, V2) \ + fct_xchk(fctstr_ieq((V1), (V2)),\ + "chk_eq_str: '%s' != '%s'",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_neq_istr(V1, V2) \ + fct_xchk(!fctstr_ieq((V1), (V2)),\ + "chk_neq_str: '%s' == '%s'",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_endswith_str(STR, CHECK)\ + fct_xchk(fctstr_endswith((STR),(CHECK)),\ + "fct_chk_endswith_str: '%s' doesn't end with '%s'",\ + (STR),\ + (CHECK)\ + ) + + +#define fct_chk_iendswith_str(STR, CHECK)\ + fct_xchk(fctstr_iendswith((STR), (CHECK)),\ + "fch_chk_iendswith_str: '%s' doesn't end with '%s'.",\ + (STR),\ + (CHECK)\ + ) + +#define fct_chk_excl_str(STR, CHECK_EXCLUDE) \ + fct_xchk(!fctstr_incl((STR), (CHECK_EXCLUDE)),\ + "fct_chk_excl_str: '%s' is included in '%s'",\ + (STR),\ + (CHECK_EXCLUDE)\ + ) + +#define fct_chk_excl_istr(ISTR, ICHECK_EXCLUDE) \ + fct_xchk(!fctstr_iincl((ISTR), (ICHECK_EXCLUDE)),\ + "fct_chk_excl_istr (case insensitive): '%s' is "\ + "included in'%s'",\ + (ISTR),\ + (ICHECK_EXCLUDE)\ + ) + +#define fct_chk_incl_str(STR, CHECK_INCLUDE) \ + fct_xchk(fctstr_incl((STR), (CHECK_INCLUDE)),\ + "fct_chk_incl_str: '%s' does not include '%s'",\ + (STR),\ + (CHECK_INCLUDE)\ + ) + + +#define fct_chk_incl_istr(ISTR, ICHECK_INCLUDE) \ + fct_xchk(fctstr_iincl((ISTR), (ICHECK_INCLUDE)),\ + "fct_chk_incl_istr (case insensitive): '%s' does "\ + "not include '%s'",\ + (ISTR),\ + (ICHECK_INCLUDE)\ + ) + + +#define fct_chk_startswith_str(STR, CHECK)\ + fct_xchk(fctstr_startswith((STR), (CHECK)),\ + "'%s' does not start with '%s'",\ + (STR),\ + (CHECK)\ + ) + + +#define fct_chk_startswith_istr(STR, CHECK)\ + fct_xchk(fctstr_istartswith((STR), (CHECK)),\ + "case insensitive check: '%s' does not start with '%s'",\ + (STR),\ + (CHECK)\ + ) + +#define fct_chk_eq_int(V1, V2) \ + fct_xchk(\ + ((V1) == (V2)),\ + "chq_eq_int: %d != %d",\ + (V1),\ + (V2)\ + ) + + +#define fct_chk_neq_int(V1, V2) \ + fct_xchk(\ + ((V1) != (V2)),\ + "chq_neq_int: %d == %d",\ + (V1),\ + (V2)\ + ) + +#define fct_chk_ex(EXCEPTION, CODE) \ + { \ + bool pass_chk_ex = false; \ + try { \ + CODE; \ + pass_chk_ex = false; \ + } catch ( EXCEPTION ) { \ + pass_chk_ex = true; \ + } catch ( ... ) { \ + pass_chk_ex = false; \ + } \ + fct_xchk( \ + pass_chk_ex, \ + "%s exception not generated", \ + #EXCEPTION \ + ); \ + } \ + +/* +--------------------------------------------------------- +GUT CHECK MACROS +---------------------------------------------------------- + +The following macros are used to help check the "guts" of +the FCT, and to confirm that it all works according to spec. +*/ + +/* Generates a message to STDERR and exits the application with a +non-zero number. */ +#define _FCT_GUTCHK(_CNDTN_) \ + if ( !(_CNDTN_) ) {\ + fprintf(stderr, "gutchk fail: '" #_CNDTN_ "' was not true.\n");\ + exit(1);\ + }\ + else {\ + fprintf(stdout, "gutchk pass: '" #_CNDTN_ "'\n");\ + } + +/* +--------------------------------------------------------- +MULTI-FILE TEST SUITE MACROS +---------------------------------------------------------- + +I struggled trying to figure this out in a way that was +as simple as possible. I wanted to be able to define +the test suite in one object file, then refer it within +the other one within the minimum amount of typing. + +Unfortunately without resorting to some supermacro +work, I could only find a happy comprimise. + +See test_multi.c for an example. +*/ + +/* The following macros are used in your separate object +file to define your test suite. */ + + +#define FCTMF_FIXTURE_SUITE_BGN(NAME) \ + void NAME (fctkern_t *fctkern_ptr__) {\ + FCT_REFERENCE_FUNCS();\ + FCT_FIXTURE_SUITE_BGN( NAME ) { + +#define FCTMF_FIXTURE_SUITE_END() \ + } FCT_FIXTURE_SUITE_END();\ + } + +#define FCTMF_SUITE_BGN(NAME) \ + void NAME (fctkern_t *fctkern_ptr__) {\ + FCT_REFERENCE_FUNCS();\ + FCT_SUITE_BGN( NAME ) { +#define FCTMF_SUITE_END() \ + } FCT_SUITE_END(); \ + } + + +/* Deprecated, no longer required. */ +#define FCTMF_SUITE_DEF(NAME) + + +/* Executes a test suite defined by FCTMF_SUITE* */ +#define FCTMF_SUITE_CALL(NAME) {\ + void NAME (fctkern_t *);\ + NAME (fctkern_ptr__);\ + } + + +/* +--------------------------------------------------------- +FCT QUICK TEST API +---------------------------------------------------------- +The goal of these little macros is to try and get you +up and running with a test as quick as possible. + +The basic idea is that there is one test per test suite. +*/ + +#define FCT_QTEST_BGN(NAME) \ + FCT_SUITE_BGN(NAME) {\ + FCT_TEST_BGN(NAME) {\ + +#define FCT_QTEST_END() \ + } FCT_TEST_END();\ + } FCT_SUITE_END(); + + +#define FCT_QTEST_BGN_IF(_CONDITION_, _NAME_) \ + FCT_SUITE_BGN(_NAME_) {\ + FCT_TEST_BGN_IF(_CONDITION_, _NAME_) {\ + +#define FCT_QTEST_END_IF() \ + } FCT_TEST_END_IF();\ + } FCT_SUITE_END(); + +#endif /* !FCT_INCLUDED__IMB */ diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h new file mode 100644 index 0000000000..268f779e3c --- /dev/null +++ b/src/include/test/switch_test.h @@ -0,0 +1,478 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Chris Rienzo + * Seven Du + * + * switch_test.h -- FreeSWITCH test macros + */ +#ifndef SWITCH_FST_H +#define SWITCH_FST_H + +#include + +#include + + +/** + * Get environment variable and save to var + */ +#define fst_getenv(env, default_value) \ + char *env = getenv(#env); \ + if (!env) { \ + env = (char *)default_value; \ + } + +/** + * Get mandatory environment variable and save to var. Exit with error if missing. + */ +#define fst_getenv_required(env) \ + char *env = getenv(#env); \ + if (!env) { \ + fprintf(stderr, "Failed to start test: environment variable \"%s\" is not set!\n", #env); \ + exit(1); \ + } + + +/** + * initialize FS core from optional configuration dir + */ +static void fst_init_core_and_modload(const char *confdir) +{ + const char *err; + if (!zstr(confdir)) { + SWITCH_GLOBAL_dirs.conf_dir = strdup(confdir); + } + SWITCH_GLOBAL_dirs.sounds_dir = strdup("./"); + switch_core_init_and_modload(0, SWITCH_TRUE, &err); + switch_sleep(1 * 1000000); + switch_core_set_variable("sound_prefix", ""); +} + +/** + * Park FreeSWITCH session. This is handy when wanting to use switch_core_session_execute_async() on the test session. + * @param session to park + */ +static void fst_session_park(switch_core_session_t *session) +{ + switch_ivr_park_session(session); + switch_channel_wait_for_state(switch_core_session_get_channel(session), NULL, CS_PARK); +} + + +/** + * check for test requirement - execute teardown on failure + */ +#define fst_requires fct_req + +/** + * check for required module - execute teardown on failure + */ +#define fst_requires_module(modname) fct_req(switch_loadable_module_exists(modname) == SWITCH_STATUS_SUCCESS) + +/** + * test boolean expression - continue test execution on failure + */ +#define fst_check fct_chk + +/** + * test integers for equality - continue test execution on failure + */ +#define fst_check_int_equals fct_chk_eq_int + +/** + * test strings for equality - continue test execution on failure + */ +#define fst_check_string_equals fct_chk_eq_str + +/** + * test strings for inequality - continue test execution on failure + */ +#define fst_check_string_not_equals fct_chk_neq_str + + +/** + * Define the beginning of a freeswitch core test driver. Only one per test application allowed. + * @param confdir directory containing freeswitch.xml configuration + */ +#define FST_CORE_BEGIN(confdir) \ + FCT_BGN() \ + { \ + switch_timer_t fst_timer = { 0 }; \ + switch_memory_pool_t *fst_pool = NULL; \ + fst_init_core_and_modload(confdir); + +/** + * Define the end of a freeswitch core test driver. + */ +#define FST_CORE_END() \ + /*switch_core_destroy();*/ \ + } \ + FCT_END() + + +/** + * Define the beginning of a FreeSWITCH module test suite. Loads the module for test. + * @param modname name of module to load. + * @param suite the name of this test suite + */ +#define FST_MODULE_BEGIN(modname,suite) \ + const char *fst_test_module = #modname; \ + if (!zstr(fst_test_module)) { \ + const char *err; \ + switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ + } \ + FCT_FIXTURE_SUITE_BGN(suite) + +/** + * Define the end of a FreeSWITCH module test suite. + */ +#define FST_MODULE_END FCT_FIXTURE_SUITE_END + + +/** + * Define the beginning of a test suite not associated with a module. + * @param suite the name of this test suite + */ +#define FST_SUITE_BEGIN(suite) FCT_FIXTURE_SUITE_BGN \ + const char *fst_test_module = NULL; \ + FCT_FIXTURE_SUITE_BGN(suite) + +/** + * Define the end of a test suite. + */ +#define FST_SUITE_END FCT_FIXTURE_SUITE_END + + +/** + * Define the test suite setup. This is run before each test or session test. + */ +#define FST_SETUP_BEGIN() \ + FCT_SETUP_BGN() \ + switch_core_new_memory_pool(&fst_pool); \ + fst_requires(fst_pool != NULL); \ + fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); + +/** + * Define the end of test suite setup. + */ +#define FST_SETUP_END FCT_SETUP_END + + +/** + * Define the test suite teardown. This is run after each test or session test. + */ +#define FST_TEARDOWN_BEGIN() \ + FCT_TEARDOWN_BGN() \ + switch_core_destroy_memory_pool(&fst_pool); \ + switch_core_timer_destroy(&fst_timer); + +/** + * Define the test suite teardown end. + */ +#define FST_TEARDOWN_END FCT_TEARDOWN_END + +/** + * Define a test in a test suite. + * Defined vars: + * switch_memory_pool_t *fst_pool; A memory pool that is torn down on test completion + * switch_core_timer_t *fst_timer; A 8kHz, 20ms soft timer (160 samples per frame) + * @param name the name of this test + */ +#define FST_TEST_BEGIN(name) \ + FCT_TEST_BGN(name) \ + if (fst_test_module) { \ + fst_requires_module(fst_test_module); \ + } + +#define FST_TEST_END FCT_TEST_END + + +/** + * Define a session test in a test suite. This can be used to test IVR functions. + * + * Records session audio to /tmp/name.wav where name is the name of the test. + * + * Required modules: + * mod_loopback - for null endpoint + * mod_sndfile - for wav file support + * + * Defined vars: + * switch_memory_pool_t *fst_pool; A memory pool that is torn down on test completion + * switch_core_timer_t *fst_timer; A 8kHz, 20ms soft timer (160 samples per frame) + * switch_core_session_t *fst_session; The outbound null session. L16, 1 channel, 8kHz. + * switch_core_session_t *fst_session_pool; The outbound null session's pool. + * switch_channel_t *fst_channel; The outbound null session's channel. + * + * @param name the name of this test + */ +#define FST_SESSION_BEGIN(name) \ + FCT_TEST_BGN(name) \ + { \ + switch_core_session_t *fst_session = NULL; \ + switch_event_t *fst_originate_vars = NULL; \ + switch_call_cause_t fst_cause = SWITCH_CAUSE_NORMAL_CLEARING; \ + if (fst_test_module) { \ + fst_requires_module(fst_test_module); \ + } \ + fst_requires_module("mod_loopback"); \ + fst_requires_module("mod_sndfile"); \ + fst_requires(switch_core_running()); \ + fst_requires(switch_event_create_plain(&fst_originate_vars, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS); \ + switch_event_add_header_string(fst_originate_vars, SWITCH_STACK_BOTTOM, "origination_caller_id_number", "+15551112222"); \ + if (switch_ivr_originate(NULL, &fst_session, &fst_cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, fst_originate_vars, SOF_NONE, NULL, NULL) == SWITCH_STATUS_SUCCESS && fst_session) { \ + switch_memory_pool_t *fst_session_pool = switch_core_session_get_pool(fst_session); \ + switch_channel_t *fst_channel = switch_core_session_get_channel(fst_session); \ + switch_channel_set_state(fst_channel, CS_SOFT_EXECUTE); \ + switch_channel_wait_for_state(fst_channel, NULL, CS_SOFT_EXECUTE); \ + switch_channel_set_variable(fst_channel, "send_silence_when_idle", "-1"); \ + switch_channel_set_variable(fst_channel, "RECORD_STEREO", "true"); \ + switch_ivr_record_session(fst_session, (char *)"/tmp/"#name".wav", 0, NULL); \ + for(;;) { + +/* BODY OF TEST CASE HERE */ + +/** + * Define the end of a session test in a test suite. + * Hangs up session under test. + */ +#define FST_SESSION_END() \ + break; \ + } \ + if (switch_channel_ready(fst_channel)) { \ + switch_channel_hangup(fst_channel, SWITCH_CAUSE_NORMAL_CLEARING); \ + } \ + if (fst_originate_vars) { \ + switch_event_destroy(&fst_originate_vars); \ + } \ + switch_core_session_rwunlock(fst_session); \ + switch_sleep(1000000); \ + } \ + } \ + FCT_TEST_END() + + +/* CORE ASR TEST MACROS */ + +/** + * Open core ASR for a recognizer module. Opens for L16, 1 channel, 8KHz. + * + * Test Requires: + * switch_core_asr_open() == SWITCH_STATUS_SUCCESS + * + * Defined vars: + * switch_asr_handle_t ah; Core ASR handle + * switch_asr_flag_t flags; Core ASR flags used to open recognizer. + * char *fst_asr_result; Result of last recognition. Allocated from test memory pool. + * + * @param recognizer name of recognizer to open (like gcloud_dialogflow) + * + */ +#define fst_test_core_asr_open(recognizer) \ +{\ + char *fst_asr_result = NULL; \ + switch_asr_handle_t ah = { 0 }; \ + switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE; \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Open recognizer: %s\n", recognizer); \ + /* open ASR interface and feed recorded audio into it and collect result */ \ + fst_requires(switch_core_asr_open(&ah, recognizer, "L16", 8000, "", &flags, fst_pool) == SWITCH_STATUS_SUCCESS); \ + +/** + * Execute test on opened recognizer. Reads audio from input file and passes it to the recognizer. + * + * Test Requires: + * switch_core_asr_load_grammar(grammar) == SWITCH_STATUS_SUCCESS + * switch_core_file_open(input_filename) == SWITCH_STATUS_SUCCESS + * switch_core_file_close() == SWITCH_STATUS_SUCCESS + * + * Test Checks: + * Got result from recognizer. + * + * Test Output: + * fst_asr_result has the xmlstr from switch_core_file_get_results() + * + * @param grammar recognizer grammar + * @param input_filename name of file containing audio to send to recognizer. + */ +#define fst_test_core_asr(grammar, input_filename) \ +{ \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \ + fst_asr_result = NULL; \ + fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \ + /* feed file into ASR */ \ + switch_status_t result; \ + switch_file_handle_t file_handle = { 0 }; \ + file_handle.channels = 1; \ + file_handle.native_rate = 8000; \ + fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \ + uint8_t *buf = (uint8_t *)switch_core_alloc(fst_pool, sizeof(uint8_t) * 160 * sizeof(uint16_t) * file_handle.channels); \ + size_t len = 160; \ + int got_result = 0; \ + switch_core_timer_sync(&fst_timer); \ + while ((result = switch_core_file_read(&file_handle, buf, &len)) == SWITCH_STATUS_SUCCESS) { \ + fst_requires(switch_core_asr_feed(&ah, buf, len * sizeof(int16_t), &flags) == SWITCH_STATUS_SUCCESS); \ + switch_core_timer_next(&fst_timer); \ + if (switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS) { \ + flags = SWITCH_ASR_FLAG_NONE; \ + /* switch_ivr_detect_speech.. checks one in media bug then again in speech_thread */ \ + fst_requires(switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS); \ + char *xmlstr = NULL; \ + switch_event_t *headers = NULL; \ + result = switch_core_asr_get_results(&ah, &xmlstr, &flags); \ + if (result == SWITCH_STATUS_SUCCESS) { \ + got_result++; \ + switch_core_asr_get_result_headers(&ah, &headers, &flags); \ + if (headers) { \ + switch_event_destroy(&headers); \ + } \ + fst_check(xmlstr != NULL); \ + if (xmlstr != NULL) { \ + fst_asr_result = switch_core_strdup(fst_pool, xmlstr);\ + } \ + switch_safe_free(xmlstr); \ + break; \ + } \ + } \ + len = 160; \ + } \ + fst_check(got_result == 1); \ + fst_requires(switch_core_file_close(&file_handle) == SWITCH_STATUS_SUCCESS); \ +} + +/** + * Pause an open recognizer. + * + * Test Requires: + * switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS + */ +#define fst_test_core_asr_pause() \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Pause recognizer\n"); \ + flags = SWITCH_ASR_FLAG_NONE; \ + fst_requires(switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS); + +/** + * Resumes an open recognizer + * + * Test Requires: + * switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS + */ +#define fst_test_core_asr_resume() \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Resume recognizer\n"); \ + flags = SWITCH_ASR_FLAG_NONE; \ + fst_requires(switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS); + +/** + * Close an open recognizer + * + * Test Requires: + * switch_core_asr_close(&ah, flags) == SWITCH_STATUS_SUCCESS + */ +#define fst_test_core_asr_close() \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Close recognizer\n"); \ + flags = SWITCH_ASR_FLAG_NONE; \ + fst_requires(switch_core_asr_close(&ah, &flags) == SWITCH_STATUS_SUCCESS); \ +} + + + +/* PLAY AND DETECT SPEECH TEST MACROS - requires FST_SESSION */ + +/** + * Define beginning of play_and_detect_speech recognizer test + * + * Defined vars: + * const char *fst_asr_result; Result of last recognition. Allocated from test memory pool. + */ +#define fst_play_and_detect_speech_test_begin() \ +{ \ + const char *fst_asr_result = NULL; + +/** + * Use play_and_detect_speech APP to test recognizer + * + * Test Requires: + * switch_ivr_displace_session(input_filename) == SWITCH_STATUS_SUCCESS + * switch_core_session_execute_application(play_and_detect_speech) == SWITCH_STATUS_SUCCESS + * + * Test Checks: + * fst_asr_result != NULL after recognition completes + * + * Test Output: + * fst_asr_result has the result from detect_speech_result channel variable. + * + * @param recognizer name of recognizer + * @param grammar recognizer grammar + * @param prompt_filename name of prompt to play + * @param input_filename name of file containing input audio for the recognizer + */ +#define fst_play_and_detect_speech_test(recognizer, grammar, prompt_filename, input_filename) \ +{ \ + char *args = NULL; \ + switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \ + fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "r") == SWITCH_STATUS_SUCCESS); \ + args = switch_core_session_sprintf(fst_session, "%s detect:%s %s", prompt_filename, recognizer, grammar); \ + fst_requires(switch_core_session_execute_application(fst_session, "play_and_detect_speech", args) == SWITCH_STATUS_SUCCESS); \ + fst_asr_result = switch_channel_get_variable(fst_channel, "detect_speech_result"); \ + fst_check(fst_asr_result != NULL); \ +} + +/** + * Define end of play_and_detect_speech recognizer test + */ +#define fst_play_and_detect_speech_test_end() \ +} + +/** + * Parse JSON file and save to varname + * + * Test Requires: + * JSON file can be opened and parsed + * + * Test Output: + * varname points at cJSON object + * + * @param varname name of var to store the resulting cJSON object + * @param file name of file to parse + */ +#define fst_parse_json_file(varname, file) \ +cJSON *varname = NULL; \ +{ \ + char *buf; \ + struct stat s; \ + int size; \ + int fd = open(file, O_RDONLY); \ + fst_requires(fd >= 0); \ + fstat(fd, &s); \ + buf = malloc(s.st_size + 1); \ + fst_requires(buf); \ + size = read(fd, buf, s.st_size); \ + fst_requires(size == s.st_size); \ + close(fd); \ + varname = cJSON_Parse(buf); \ + free(buf); \ + fst_requires(varname); \ +} + +#endif From 3b281cd5a1d2eebf009ea3fb456ee072f70cdb06 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Sat, 29 Sep 2018 13:21:37 +0300 Subject: [PATCH 03/69] FS-11422: [mod_java] Fix logging. --- src/mod/languages/mod_java/freeswitch_java.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/languages/mod_java/freeswitch_java.cpp b/src/mod/languages/mod_java/freeswitch_java.cpp index d8508e145c..d71d212b45 100644 --- a/src/mod/languages/mod_java/freeswitch_java.cpp +++ b/src/mod/languages/mod_java/freeswitch_java.cpp @@ -14,7 +14,7 @@ SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler) if ( stateHandler != NULL && originate_state_handler != NULL ) { const char* errorMessage = "Originate state handler is already registered"; jclass exceptionClass = env->FindClass("java/util/TooManyListenersException"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s", errorMessage); env->ThrowNew(exceptionClass, errorMessage); } else if ( stateHandler == NULL && originate_state_handler != NULL ) { env->DeleteGlobalRef(originate_state_handler); @@ -24,7 +24,7 @@ SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler) if ( originate_state_handler == NULL ) { const char* errorMessage = "Unable to create global reference for state handler"; jclass exceptionClass = env->FindClass("java/lang/OutOfMemoryError"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s", errorMessage); env->ThrowNew(exceptionClass, errorMessage); } } From 7ebe4134efe420a2b8be19e52584b1eb87691ee0 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Sun, 30 Sep 2018 18:53:41 +0300 Subject: [PATCH 04/69] FS-11423: [mod_isac] Add ARM64 detection. --- src/mod/codecs/mod_isac/typedefs.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/codecs/mod_isac/typedefs.h b/src/mod/codecs/mod_isac/typedefs.h index e4a85afe30..df0df45723 100644 --- a/src/mod/codecs/mod_isac/typedefs.h +++ b/src/mod/codecs/mod_isac/typedefs.h @@ -61,6 +61,9 @@ #define WEBRTC_ARCH_X86_64 #define WEBRTC_ARCH_64_BITS #define WEBRTC_ARCH_LITTLE_ENDIAN +#elif defined(__aarch64__) +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN #elif defined(_M_IX86) || defined(__i386__) #define WEBRTC_ARCH_X86_FAMILY #define WEBRTC_ARCH_X86 From f8335607c244ac5fea04f2ae3188e59f3284c3ca Mon Sep 17 00:00:00 2001 From: Luis Azedo Date: Wed, 1 Nov 2017 12:19:44 +0000 Subject: [PATCH 05/69] FS-10745 [mod_sofia] provide more context to transferor event --- src/mod/endpoints/mod_sofia/sofia.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 758435d15d..fa0c547716 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -8906,11 +8906,15 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(channel_a, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_core_session_get_uuid(b_session)); switch_event_fire(&event); } if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEREE) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(a_channel, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_replaced_call_id", switch_core_session_get_uuid(b_session)); switch_event_fire(&event); } } @@ -9013,6 +9017,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(channel_a, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_core_session_get_uuid(b_session)); switch_event_fire(&event); } @@ -9091,6 +9098,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t if(sofia_test_pflag(profile, PFLAG_FIRE_TRANFER_EVENTS)) { if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(channel_a, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", switch_core_session_get_uuid(hup_session)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", switch_core_session_get_uuid(t_session)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_peer_uuid", switch_channel_get_partner_uuid(t_channel)); switch_event_fire(&event); } @@ -9278,6 +9288,8 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t if(sofia_test_pflag(profile, PFLAG_FIRE_TRANFER_EVENTS)) { if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_TRANSFEROR) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_original_call_id", br_a); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "att_xfer_destination_call_id", br_b); switch_channel_event_set_data(channel_a, event); switch_event_fire(&event); } From 785ac737ca2883a817328e088c97c3053b4cde1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hunyadv=C3=A1ri=20P=C3=A9ter?= Date: Fri, 5 Oct 2018 14:43:55 +0200 Subject: [PATCH 06/69] FS-11207: [core] Fix msrp_init_ssl error handling --- src/switch_msrp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/switch_msrp.c b/src/switch_msrp.c index 665b848984..5c48a77781 100644 --- a/src/switch_msrp.c +++ b/src/switch_msrp.c @@ -316,7 +316,10 @@ SWITCH_DECLARE(switch_status_t) switch_msrp_init() globals.msock.thread = thread; } - msrp_init_ssl(); + if (msrp_init_ssl() == 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MSRP ssl init failed\n"); + return SWITCH_STATUS_FALSE; + } status = msock_init(globals.ip, globals.msock_ssl.port, &globals.msock_ssl.sock, pool); if (status == SWITCH_STATUS_SUCCESS) { From 5e895b28c7b0facdfdd8a8a07eff50a464bf9315 Mon Sep 17 00:00:00 2001 From: Andrew Siplas Date: Sat, 6 Oct 2018 22:53:49 -0400 Subject: [PATCH 07/69] FS-11444: Capture return code from `os.execute()`; stop attempting to concat boolean/nil to error string. os.execute() returns [3 variables](https://github.com/lua/lua/blob/f59e6a93c0ad38a27a420e51abf8f13d962446b5/lauxlib.c#L286). Capture the 2nd (e.g. "exit") and 3rd (e.g. 0) in addition to the first which would be merely `true` on success or `nil` on error. --- scripts/lua/sound_test.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/lua/sound_test.lua b/scripts/lua/sound_test.lua index e29c2f9ca7..ee169f88f2 100644 --- a/scripts/lua/sound_test.lua +++ b/scripts/lua/sound_test.lua @@ -60,15 +60,15 @@ else -- Looks good, let's play some sound files sound_base = session:getVariable('sounds_dir') .. '/en/us/callie/' .. stype .. '/' .. srate; input_file = '/tmp/filez.txt'; - res = os.execute('ls -1 ' .. sound_base .. ' > ' .. input_file); - freeswitch.consoleLog("INFO","Result of system call: " .. res .. "\n"); - if ( res == 0 ) then + res, what, code = os.execute('ls -1 ' .. sound_base .. ' > ' .. input_file); + freeswitch.consoleLog("INFO","Result of system call: " .. what .. " " .. code .. "\n"); + if ( res == true and what == 'exit' and code == 0 ) then for fname in io.lines(input_file) do freeswitch.consoleLog("NOTICE","Playing file: " .. fname .. "\n"); session:streamFile(sound_base .. '/' .. fname); session:sleep(100); end else - freeswitch.consoleLog("ERR","Result of system call: " .. res .. "\n"); + freeswitch.consoleLog("ERR","Result of system call: " .. what .. " " .. code .. "\n"); end end \ No newline at end of file From 0fbe46ea0916e9a3e1a789e3b21cb205ef56ae5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hunyadv=C3=A1ri=20P=C3=A9ter?= Date: Fri, 12 Oct 2018 11:06:04 +0200 Subject: [PATCH 08/69] FS-11207: [core] Fix msrp_init_ssl and msrp_deinit_ssl functions, check globals.ssl_ready variable --- src/switch_msrp.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/switch_msrp.c b/src/switch_msrp.c index 5c48a77781..c4d430194b 100644 --- a/src/switch_msrp.c +++ b/src/switch_msrp.c @@ -103,13 +103,14 @@ static switch_bool_t msrp_check_success_report(switch_msrp_msg_t *msrp_msg) static void msrp_deinit_ssl() { + globals.ssl_ready = 0; if (globals.ssl_ctx) { SSL_CTX_free(globals.ssl_ctx); globals.ssl_ctx = NULL; } } -static int msrp_init_ssl() +static void msrp_init_ssl() { const char *err = ""; @@ -175,15 +176,11 @@ static int msrp_init_ssl() SSL_CTX_set_cipher_list(globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH"); - return 1; + return; fail: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL ERR: %s\n", err); - - globals.ssl_ready = 0; msrp_deinit_ssl(); - - return 0; } SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_ip, globals.ip); @@ -316,10 +313,7 @@ SWITCH_DECLARE(switch_status_t) switch_msrp_init() globals.msock.thread = thread; } - if (msrp_init_ssl() == 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MSRP ssl init failed\n"); - return SWITCH_STATUS_FALSE; - } + msrp_init_ssl(); status = msock_init(globals.ip, globals.msock_ssl.port, &globals.msock_ssl.sock, pool); if (status == SWITCH_STATUS_SUCCESS) { @@ -1145,6 +1139,10 @@ static void *SWITCH_THREAD_FUNC msrp_worker(switch_thread_t *thread, void *obj) // switch_socket_opt_set(csock->sock, SWITCH_SO_NONBLOCK, TRUE); if (csock->secure) { // tls? + if (globals.ssl_ready != 1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL not ready\n"); + goto end; + } int secure_established = 0; int sanity = 10; switch_os_socket_t sockdes = SWITCH_SOCK_INVALID; From 3221557807d08cfc7c825b1b0f970b0b7ea96626 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 9 Oct 2018 00:36:12 +0300 Subject: [PATCH 09/69] FS-11445: [Build-System] Add distro to the name of the source tarball. --- debian/util.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/util.sh b/debian/util.sh index 9dfe135c89..073ad422c3 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -152,7 +152,7 @@ create_orig () { hrev="$(get_nightly_revision_human)" fi local treeish="$1" dver="$(mk_dver "$uver")" - local orig="../freeswitch_$dver.orig.tar.xz" + local orig="../freeswitch_$dver~$(lsb_release -sc).orig.tar.xz" [ -n "$treeish" ] || treeish="HEAD" check_repo_clean git reset --hard "$treeish" From 7ce7b11b30fd312d50dd7abce13977ce5897caf6 Mon Sep 17 00:00:00 2001 From: Serj Date: Sun, 14 Oct 2018 16:19:51 +0000 Subject: [PATCH 10/69] add freeswitch-mod-shout as dep --- debian/bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 4ce68473fd..a51b308f12 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -624,6 +624,7 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-png (= \${binary:Version}), freeswitch-mod-redis (= \${binary:Version}), freeswitch-mod-rss (= \${binary:Version}), + freeswitch-mod-shout (= \${binary:Version}), freeswitch-mod-sms (= \${binary:Version}), freeswitch-mod-snapshot (= \${binary:Version}), freeswitch-mod-snom (= \${binary:Version}), From 3cc2f8ab0d98b18c421435707b6256106a34f668 Mon Sep 17 00:00:00 2001 From: Serj Date: Sun, 14 Oct 2018 16:26:20 +0000 Subject: [PATCH 11/69] fix mod_hiredis deps --- debian/control-modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control-modules b/debian/control-modules index 15174f6c00..b19e12e575 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -117,7 +117,7 @@ Module: applications/mod_hiredis Description: Redis client support This module provides a mechanism to use Redis as a datastore. Build-Depends: libhiredis-dev -Depends: libhiredis0.10 +Depends: libhiredis0.10 | libhiredis0.13 Module: applications/mod_httapi Description: HT-TAPI Hypertext Telephony API From 8a5aa4209f1b0707b3827e31a1de4a6ea1649426 Mon Sep 17 00:00:00 2001 From: Serj Date: Sun, 14 Oct 2018 17:25:22 +0000 Subject: [PATCH 12/69] Fix FS-9865 --- debian/freeswitch.install | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/freeswitch.install b/debian/freeswitch.install index b58e589b8f..7e6e44f810 100644 --- a/debian/freeswitch.install +++ b/debian/freeswitch.install @@ -1,3 +1,4 @@ /usr/bin fonts/FreeMono.ttf /usr/share/freeswitch/fonts/ -fonts/FreeSans.ttf /usr/share/freeswitch/fonts/ \ No newline at end of file +fonts/FreeSans.ttf /usr/share/freeswitch/fonts/ +images/*.png /var/lib/freeswitch/images/ \ No newline at end of file From 0e0d5881444fa7af0730c56dc24ef7fc730870a1 Mon Sep 17 00:00:00 2001 From: lazedo Date: Sat, 4 Aug 2018 10:09:22 +0000 Subject: [PATCH 13/69] FS-11312 [core] prevent double firing record_start event --- src/switch_ivr_async.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 6722371776..d80426f347 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1145,6 +1145,7 @@ struct record_helper { uint32_t writes; uint32_t vwrites; const char *completion_cause; + int start_event_sent; }; /** @@ -1188,6 +1189,7 @@ static void send_record_stop_event(switch_channel_t *channel, switch_codec_imple { switch_event_t *event; + rh->start_event_sent = 0; if (rh->fh) { switch_channel_set_variable_printf(channel, "record_samples", "%d", rh->fh->samples_out); if (read_impl->actual_samples_per_second) { @@ -1304,10 +1306,13 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s } } - if (switch_event_create(&event, SWITCH_EVENT_RECORD_START) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Record-File-Path", rh->file); - switch_channel_event_set_data(channel, event); - switch_event_fire(&event); + if(rh->start_event_sent == 0) { + rh->start_event_sent = 1; + if (switch_event_create(&event, SWITCH_EVENT_RECORD_START) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(channel, event); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Record-File-Path", rh->file); + switch_event_fire(&event); + } } rh->silence_time = switch_micro_time_now(); From 90bc06e56471cbd205227f915105e4a0ce06eba0 Mon Sep 17 00:00:00 2001 From: Chad Phillips Date: Sun, 21 Oct 2018 14:50:04 -0700 Subject: [PATCH 14/69] FS-11470: WebRTC Unified plan not properly supported Chrome is beginning to default their SDP semantics to the WebRTC standard 'Unified Plan', and Verto does not currently construct its SDP according to this standard. For now, force the browser to use 'Plan B' semantics. --- html5/verto/js/src/jquery.FSRTC.js | 1 + 1 file changed, 1 insertion(+) diff --git a/html5/verto/js/src/jquery.FSRTC.js b/html5/verto/js/src/jquery.FSRTC.js index 661442f0b4..82b7c6fd8d 100644 --- a/html5/verto/js/src/jquery.FSRTC.js +++ b/html5/verto/js/src/jquery.FSRTC.js @@ -715,6 +715,7 @@ } config.bundlePolicy = "max-compat"; + config.sdpSemantics = "plan-b"; var peer = new window.RTCPeerConnection(config); From 850c0f411fa710aed286837f0eb666b1b6c5a8fb Mon Sep 17 00:00:00 2001 From: Chad Phillips Date: Sun, 21 Oct 2018 15:38:14 -0700 Subject: [PATCH 15/69] FS-11472: Remove Android frameRate.min OverconstrainedError hack https://freeswitch.org/jira/browse/FS-11285 put in a temporary hack to deal with https://bugs.chromium.org/p/chromium/issues/detail?id=862325, which has now been fixed as of Chrome 69 (70 is current stable). --- html5/verto/js/src/jquery.FSRTC.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/html5/verto/js/src/jquery.FSRTC.js b/html5/verto/js/src/jquery.FSRTC.js index 661442f0b4..0c384ef68d 100644 --- a/html5/verto/js/src/jquery.FSRTC.js +++ b/html5/verto/js/src/jquery.FSRTC.js @@ -550,11 +550,6 @@ mandatory: obj.options.videoParams, optional: opt }; - // NOTE: This is a workaround for - // https://bugs.chromium.org/p/chromium/issues/detail?id=862325 - if (!!navigator.userAgent.match(/Android/i)) { - delete video.frameRate.min; - } } } else { From 9e8ae18f95e7e5a1de1c751eaf562425d93c41df Mon Sep 17 00:00:00 2001 From: Brian West Date: Mon, 22 Oct 2018 11:00:33 -0500 Subject: [PATCH 16/69] FS-11471: [mod_sofia] revert changes to send PAI for polycom 4.x versions differently, seems polycom has now fixed this --- src/mod/endpoints/mod_sofia/mod_sofia.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index a6afe36f97..2a5c667579 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1994,11 +1994,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), SIPTAG_PAYLOAD_STR(message), TAG_END()); } else if (update_allowed && ua && switch_stristr("polycom", ua)) { - if ( switch_stristr("UA/4", ua) ) { - snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip); - } else { - snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", name, number); - } + snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip); + sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY); nua_update(tech_pvt->nh, NUTAG_SESSION_TIMER(tech_pvt->session_timeout), From ee1942bebb8d7b45888d056d221a02a4a1ef1c25 Mon Sep 17 00:00:00 2001 From: Chad Phillips Date: Thu, 25 Oct 2018 13:48:33 -0700 Subject: [PATCH 17/69] FS-11485: Debian systemd service file out of date - syslog.target is no longer available, replaced with syslog.socket - add Requires= to match After= section --- debian/freeswitch-systemd.freeswitch.service | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/freeswitch-systemd.freeswitch.service b/debian/freeswitch-systemd.freeswitch.service index d53dfd1cd5..6225d37d5c 100644 --- a/debian/freeswitch-systemd.freeswitch.service +++ b/debian/freeswitch-systemd.freeswitch.service @@ -2,7 +2,8 @@ [Unit] Description=freeswitch -After=syslog.target network.target local-fs.target +Requires=syslog.socket network.target local-fs.target +After=syslog.socket network.target local-fs.target [Service] ; service From 6ea0e815a70336dc1580d17fe3c0fcdada0d1a23 Mon Sep 17 00:00:00 2001 From: kgribunin Date: Wed, 31 Oct 2018 19:17:51 +0300 Subject: [PATCH 18/69] FS-11450 [mod_conference] Fix for memory leak when conference json list api command is executed --- src/mod/applications/mod_conference/conference_api.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index 6f6b1a41f9..ec9fee5724 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -4084,6 +4084,8 @@ switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switc switch_assert(ebuf); stream->write_function(stream, "%s", ebuf); free(ebuf); + + cJSON_Delete(conferences); return SWITCH_STATUS_SUCCESS; } From 76b3bb586b55370bea9df59c8a482b9b879fa794 Mon Sep 17 00:00:00 2001 From: Mike Jerris Date: Wed, 31 Oct 2018 15:10:53 -0400 Subject: [PATCH 19/69] FS-11494: [Debian] force build of iksemel before modules to avoid -j race condition on dep lib build --- Makefile.am | 3 +++ debian/rules | 2 ++ src/mod/endpoints/mod_dingaling/Makefile.am | 2 ++ 3 files changed, 7 insertions(+) diff --git a/Makefile.am b/Makefile.am index 9edfbba65f..dcfee8161b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -698,6 +698,9 @@ nodepends: .nodepends yesdepends: rm .nodepends +iksemel-dep: + make -C src/mod/endpoints/mod_dingaling deps + core: $(switch_builddir)/modules.conf src/include/switch_version.h $(CORE_LIBS) $(MAKE) $(AM_MAKEFLAGS) libfreeswitch.la diff --git a/debian/rules b/debian/rules index b403d0aecc..bb0e56f2c0 100755 --- a/debian/rules +++ b/debian/rules @@ -82,6 +82,8 @@ override_dh_auto_configure: .stamp-configure .stamp-build: .stamp-configure @$(call show_vars) + make -j$(NJOBS) core + make iksemel-dep make -j$(NJOBS) make -C libs/esl pymod make -C libs/esl perlmod diff --git a/src/mod/endpoints/mod_dingaling/Makefile.am b/src/mod/endpoints/mod_dingaling/Makefile.am index d19cf41bdf..3412a3ef59 100644 --- a/src/mod/endpoints/mod_dingaling/Makefile.am +++ b/src/mod/endpoints/mod_dingaling/Makefile.am @@ -20,3 +20,5 @@ BUILT_SOURCES=$(IKS_LA) $(IKS_LA): $(IKS_BUILDDIR) $(IKS_DIR) $(IKS_DIR)/.update @cd $(IKS_BUILDDIR) && $(MAKE) @$(TOUCH_TARGET) + +deps: $(IKS_LA) \ No newline at end of file From c854466ed2479fca28c957421216cbf4098bad76 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Tue, 6 Nov 2018 12:02:05 -0500 Subject: [PATCH 20/69] [core] Test commit- bump copyright date. --- src/switch_core_media.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_core_media.c b/src/switch_core_media.c index fbd7e7b771..6c370d7923 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2014, Anthony Minessale II + * Copyright (C) 2005-2018, Anthony Minessale II * * Version: MPL 1.1 * From da49b042ba3d83e9d71241515e0eafeb6e5780a1 Mon Sep 17 00:00:00 2001 From: Mike Jerris Date: Tue, 6 Nov 2018 20:56:11 +0000 Subject: [PATCH 21/69] FS-11506: [mod_sofia] Handle multiple History-Info headers in MESSAGE --- src/mod/endpoints/mod_sofia/sofia_presence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index d04fb02533..767ec8c8e0 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -4945,7 +4945,7 @@ void sofia_presence_handle_sip_i_message(int status, first_history_info = 0; } else { /* Append the History-Info into one long string */ - const char *history_var = switch_channel_get_variable(channel, "sip_history_info"); + const char *history_var = switch_event_get_header(event, "sip_history_info"); if (!zstr(history_var)) { char *tmp_str; if ((tmp_str = switch_mprintf("%s, %s", history_var, un->un_value))) { From 8c8b7b51046436619aacc1ad91c37e272c2a80f0 Mon Sep 17 00:00:00 2001 From: s3rj1k Date: Tue, 6 Nov 2018 23:49:00 +0200 Subject: [PATCH 22/69] [FS-11507] use explicit architecture in control file Signed-off-by: s3rj1k --- debian/bootstrap.sh | 60 +++++++++++++------------- scripts/perl/FreeSWITCH/debian/control | 2 +- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index a51b308f12..18c221bf5a 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -343,7 +343,7 @@ EOF print_core_control () { cat <= 3.0-6), sysvinit | sysvinit-utils Conflicts: freeswitch-init Provides: freeswitch-init @@ -1022,7 +1022,7 @@ EOF else cat <= 5.8.0-7), libmodule-install-perl, Maintainer: Massimo Cetra Package: libfreeswitch-client-perl -Architecture: all +Architecture: amd64 Depends: ${perl:Depends}, ${misc:Depends}, libmodule-scandeps-perl (>= 0.51), libio-socket-ssl-perl (>= 0.97) Recommends: gnupg, libmodule-signature-perl, libpar-packer-perl Description: FreeSWITCH Client perl library From 69ec4aadab36d96a2aee439c33b1d802567f7672 Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Thu, 8 Nov 2018 12:45:45 +0100 Subject: [PATCH 23/69] FS-11508: [mod_sofia] Make max-registrations-per-extension use extension instead of username --- src/mod/endpoints/mod_sofia/sofia_reg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 842e6c3bf7..601824c334 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -3075,7 +3075,7 @@ auth_res_t sofia_reg_parse_auth(sofia_profile_t *profile, switch_assert(call_id); sql = switch_mprintf("select count(sip_user) from sip_registrations where sip_user='%q' AND call_id <> '%q' AND sip_host='%q'", - username, call_id, domain_name); + sip->sip_to->a_url->url_user, call_id, domain_name); switch_assert(sql != NULL); sofia_glue_execute_sql_callback(profile, NULL, sql, sofia_reg_regcount_callback, &count); free(sql); From f0a03ca33797d8da04f2eb6841d958052d494ee2 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 13 Nov 2018 20:47:28 +0400 Subject: [PATCH 24/69] Revert "Merge pull request #1608 in FS/freeswitch from ~HUNYI/freeswitch:bugfix/FS-11207-sofia-msrp_worker-crash-when-initializing to master" This reverts commit abd8b0b061465cc71d42718b724d3639f9cd662d, reversing changes made to 102161e14d1ee4e1283c38e5d755adf739d9091a. --- src/switch_msrp.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/switch_msrp.c b/src/switch_msrp.c index c4d430194b..665b848984 100644 --- a/src/switch_msrp.c +++ b/src/switch_msrp.c @@ -103,14 +103,13 @@ static switch_bool_t msrp_check_success_report(switch_msrp_msg_t *msrp_msg) static void msrp_deinit_ssl() { - globals.ssl_ready = 0; if (globals.ssl_ctx) { SSL_CTX_free(globals.ssl_ctx); globals.ssl_ctx = NULL; } } -static void msrp_init_ssl() +static int msrp_init_ssl() { const char *err = ""; @@ -176,11 +175,15 @@ static void msrp_init_ssl() SSL_CTX_set_cipher_list(globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH"); - return; + return 1; fail: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL ERR: %s\n", err); + + globals.ssl_ready = 0; msrp_deinit_ssl(); + + return 0; } SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_ip, globals.ip); @@ -1139,10 +1142,6 @@ static void *SWITCH_THREAD_FUNC msrp_worker(switch_thread_t *thread, void *obj) // switch_socket_opt_set(csock->sock, SWITCH_SO_NONBLOCK, TRUE); if (csock->secure) { // tls? - if (globals.ssl_ready != 1) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL not ready\n"); - goto end; - } int secure_established = 0; int sanity = 10; switch_os_socket_t sockdes = SWITCH_SOCK_INVALID; From fcc81f385e5d3856f11ad5e7a5682eda1c81ae41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hunyadv=C3=A1ri=20P=C3=A9ter?= Date: Tue, 13 Nov 2018 18:21:02 +0100 Subject: [PATCH 25/69] FS-11207: [core] msrp: fix init ssl --- src/switch_msrp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/switch_msrp.c b/src/switch_msrp.c index 665b848984..5ba0e88b92 100644 --- a/src/switch_msrp.c +++ b/src/switch_msrp.c @@ -103,13 +103,14 @@ static switch_bool_t msrp_check_success_report(switch_msrp_msg_t *msrp_msg) static void msrp_deinit_ssl() { + globals.ssl_ready = 0; if (globals.ssl_ctx) { SSL_CTX_free(globals.ssl_ctx); globals.ssl_ctx = NULL; } } -static int msrp_init_ssl() +static void msrp_init_ssl() { const char *err = ""; @@ -175,15 +176,11 @@ static int msrp_init_ssl() SSL_CTX_set_cipher_list(globals.ssl_ctx, "HIGH:!DSS:!aNULL@STRENGTH"); - return 1; + return; fail: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL ERR: %s\n", err); - - globals.ssl_ready = 0; msrp_deinit_ssl(); - - return 0; } SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_ip, globals.ip); @@ -1147,6 +1144,11 @@ static void *SWITCH_THREAD_FUNC msrp_worker(switch_thread_t *thread, void *obj) switch_os_socket_t sockdes = SWITCH_SOCK_INVALID; int code = 0; + if (globals.ssl_ready != 1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SSL not ready\n"); + goto end; + } + switch_os_sock_get(&sockdes, csock->sock); // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "socket: %d\n", sockdes); switch_assert(sockdes != SWITCH_SOCK_INVALID); From 221d728e62bd0a4b0f8d9a325a43d156defd8519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Silva?= Date: Wed, 21 Nov 2018 16:04:29 +0100 Subject: [PATCH 26/69] FS-11118 #resolve mod_sofia send display update to Grandstream family user-agent --- src/mod/endpoints/mod_sofia/mod_sofia.c | 26 +++++++++---------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 2a5c667579..7b639de0ac 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1993,23 +1993,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), SIPTAG_PAYLOAD_STR(message), TAG_END()); - } else if (update_allowed && ua && switch_stristr("polycom", ua)) { - snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip); - - sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY); - nua_update(tech_pvt->nh, - NUTAG_SESSION_TIMER(tech_pvt->session_timeout), - NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), - NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), - TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)), - TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)), - TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)), - TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), TAG_END()); - } else if (update_allowed && ua && ((switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) || - (switch_stristr("cisco/spa50", ua) || switch_stristr("cisco/spa525", ua)) || - switch_stristr("cisco/spa30", ua) || switch_stristr("Grandstream GXP", ua) || - switch_stristr("Yealink", ua) || switch_stristr("Mitel", ua) || - switch_stristr("Panasonic", ua))) { + } else if (update_allowed && ua && (switch_stristr("polycom", ua) || + (switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) || + (switch_stristr("cisco/spa50", ua) || + switch_stristr("cisco/spa525", ua)) || + switch_stristr("cisco/spa30", ua) || + switch_stristr("Grandstream", ua) || + switch_stristr("Yealink", ua) || + switch_stristr("Mitel", ua) || + switch_stristr("Panasonic", ua))) { snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" ", name, number, tech_pvt->profile->sipip); sofia_set_flag_locked(tech_pvt, TFLAG_UPDATING_DISPLAY); From 65e20af3474e1099b380193f4e5a83ce9ee88949 Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Mon, 12 Nov 2018 21:12:26 +0100 Subject: [PATCH 27/69] FS-11520: [mod_curl] Make max_bytes configurable --- conf/vanilla/autoload_configs/curl.conf.xml | 5 +++ .../conf/autoload_configs/curl.conf.xml | 5 +++ src/mod/applications/mod_curl/mod_curl.c | 39 +++++++++++++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 conf/vanilla/autoload_configs/curl.conf.xml create mode 100644 src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml diff --git a/conf/vanilla/autoload_configs/curl.conf.xml b/conf/vanilla/autoload_configs/curl.conf.xml new file mode 100644 index 0000000000..eff3c6b9ac --- /dev/null +++ b/conf/vanilla/autoload_configs/curl.conf.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml new file mode 100644 index 0000000000..eff3c6b9ac --- /dev/null +++ b/src/mod/applications/mod_curl/conf/autoload_configs/curl.conf.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/mod/applications/mod_curl/mod_curl.c b/src/mod/applications/mod_curl/mod_curl.c index 2438490432..e82502cb6c 100644 --- a/src/mod/applications/mod_curl/mod_curl.c +++ b/src/mod/applications/mod_curl/mod_curl.c @@ -55,11 +55,20 @@ static char *SYNTAX = "curl url [headers|json|content-type |connect-t #define HTTP_SENDFILE_ACK_EVENT "curl_sendfile::ack" #define HTTP_SENDFILE_RESPONSE_SIZE 32768 #define HTTP_MAX_APPEND_HEADERS 10 +#define HTTP_DEFAULT_MAX_BYTES 64000 static struct { switch_memory_pool_t *pool; + switch_event_node_t *node; + int max_bytes; } globals; +static switch_xml_config_item_t instructions[] = { + /* parameter name type reloadable pointer default value options structure */ + SWITCH_CONFIG_ITEM("max-bytes", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &globals.max_bytes, (void *) HTTP_DEFAULT_MAX_BYTES, NULL,NULL, NULL), + SWITCH_CONFIG_ITEM_END() +}; + typedef enum { CSO_NONE = (1 << 0), CSO_EVENT = (1 << 1), @@ -173,7 +182,7 @@ static http_data_t *do_lookup_url(switch_memory_pool_t *pool, const char *url, c memset(http_data, 0, sizeof(http_data_t)); http_data->pool = pool; - http_data->max_bytes = 64000; + http_data->max_bytes = globals.max_bytes; SWITCH_STANDARD_STREAM(http_data->stream); if (!method) { @@ -1037,24 +1046,44 @@ SWITCH_STANDARD_API(curl_function) return status; } +static void do_config(switch_bool_t reload) +{ + globals.max_bytes = HTTP_DEFAULT_MAX_BYTES; + + switch_xml_config_parse_module_settings("curl.conf", reload, instructions); +} + +static void event_handler(switch_event_t *event) +{ + do_config(SWITCH_TRUE); +} + /* Macro expands to: switch_status_t mod_cidlookup_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */ SWITCH_MODULE_LOAD_FUNCTION(mod_curl_load) { switch_api_interface_t *api_interface; switch_application_interface_t *app_interface; + memset(&globals, 0, sizeof(globals)); + if (switch_event_reserve_subclass(HTTP_SENDFILE_ACK_EVENT) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!\n", HTTP_SENDFILE_ACK_EVENT); return SWITCH_STATUS_TERM; } + if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &globals.node) != SWITCH_STATUS_SUCCESS)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind event!\n"); + switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT); + return SWITCH_STATUS_TERM; + } + /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); - memset(&globals, 0, sizeof(globals)); - globals.pool = pool; + do_config(SWITCH_FALSE); + SWITCH_ADD_API(api_interface, "curl", "curl API", curl_function, SYNTAX); SWITCH_ADD_APP(app_interface, "curl", "Perform a http request", "Perform a http request", curl_app_function, SYNTAX, SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC); @@ -1074,6 +1103,10 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_curl_shutdown) switch_event_free_subclass(HTTP_SENDFILE_ACK_EVENT); + switch_xml_config_cleanup(instructions); + + switch_event_unbind(&globals.node); + /* Cleanup dynamically allocated config settings */ return SWITCH_STATUS_SUCCESS; } From 1a05fe0dcfa65a94093b61d5b59039bb4dd28f82 Mon Sep 17 00:00:00 2001 From: Jamil Abdullayev Date: Tue, 27 Nov 2018 00:27:57 +0000 Subject: [PATCH 28/69] FS-11530: [mod_lua] add configure support for LuaJIT --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0b3cc902ca..fa802d491f 100644 --- a/configure.ac +++ b/configure.ac @@ -595,7 +595,7 @@ AC_SUBST(SYS_XMLRPC_CFLAGS) AC_SUBST(SYS_XMLRPC_LDFLAGS) AM_CONDITIONAL([SYSTEM_XMLRPCC],[test "${enable_xmlrpcc}" = "yes"]) -for luaversion in lua5.2 lua-5.2 lua52 lua5.1 lua-5.1 lua; do +for luaversion in luajit lua5.2 lua-5.2 lua52 lua5.1 lua-5.1 lua; do PKG_CHECK_MODULES([LUA],[${luaversion}],[have_lua=yes],[have_lua=no]) if test ${have_lua} = yes; then break From 4333f6813d3ef38b9df5a399c69f75496b42269b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 27 Sep 2018 03:21:17 +0400 Subject: [PATCH 29/69] FS-11413: [freeswitch-core,mod_conference,mod_local_stream] High memory footprint in some video situations #resolve --- src/mod/applications/mod_av/avformat.c | 2 ++ .../mod_conference/conference_file.c | 2 +- .../mod_local_stream/mod_local_stream.c | 30 ++++++++++--------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c index 84900b601c..d5ad0d6e25 100644 --- a/src/mod/applications/mod_av/avformat.c +++ b/src/mod/applications/mod_av/avformat.c @@ -2357,6 +2357,7 @@ static switch_status_t av_file_read_video(switch_file_handle_t *handle, switch_f } if (pop && status == SWITCH_STATUS_SUCCESS) { + switch_img_free(&context->last_img); context->last_img = (switch_image_t *)pop; switch_img_copy(context->last_img, &frame->img); context->vid_ready = 1; @@ -2467,6 +2468,7 @@ GCC_DIAG_ON(deprecated-declarations) if (switch_micro_time_now() - mst->next_pts > -10000) { frame->img = img; } else { + switch_img_free(&context->last_img); context->last_img = img; return SWITCH_STATUS_BREAK; } diff --git a/src/mod/applications/mod_conference/conference_file.c b/src/mod/applications/mod_conference/conference_file.c index f4e2866052..8f0dc1d8b7 100644 --- a/src/mod/applications/mod_conference/conference_file.c +++ b/src/mod/applications/mod_conference/conference_file.c @@ -248,7 +248,7 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u flags = SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT; - if (conference_utils_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { + if (conference_utils_test_flag(conference, CFLAG_TRANSCODE_VIDEO) && conference->conference_video_mode == CONF_VIDEO_MODE_MUX) { flags |= SWITCH_FILE_FLAG_VIDEO; } diff --git a/src/mod/formats/mod_local_stream/mod_local_stream.c b/src/mod/formats/mod_local_stream/mod_local_stream.c index 8edba9aa94..d07bfb34f3 100644 --- a/src/mod/formats/mod_local_stream/mod_local_stream.c +++ b/src/mod/formats/mod_local_stream/mod_local_stream.c @@ -529,10 +529,11 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void source->has_video = 1; if (source->total) { if (switch_queue_trypush(source->video_q, vid_frame.img) == SWITCH_STATUS_SUCCESS) { + vid_frame.img = NULL; flush = 0; } } - + if (flush) { switch_img_free(&vid_frame.img); flush_video_queue(source->video_q); @@ -645,13 +646,15 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void if (!pop) break; img = (switch_image_t *) pop; - + switch_mutex_lock(source->mutex); if (source->context_list) { if (source->total == 1) { - if (switch_queue_trypush(source->context_list->video_q, img) != SWITCH_STATUS_SUCCESS) { + if (!switch_test_flag(source->context_list->handle, SWITCH_FILE_FLAG_VIDEO)) { flush_video_queue(source->context_list->video_q); - + } else if (switch_queue_trypush(source->context_list->video_q, img) != SWITCH_STATUS_SUCCESS) { + flush_video_queue(source->context_list->video_q); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Flushing video queue\n"); if (++source->context_list->video_flushes > 1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Disconnecting file\n"); @@ -659,6 +662,7 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void } } else { source->context_list->video_flushes = 0; + img = NULL; } } else { for (cp = source->context_list; cp && RUNNING; cp = cp->next) { @@ -671,7 +675,9 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void imgcp = NULL; switch_img_copy(img, &imgcp); if (imgcp) { - if (switch_queue_trypush(cp->video_q, imgcp) != SWITCH_STATUS_SUCCESS) { + if (!switch_test_flag(cp->handle, SWITCH_FILE_FLAG_VIDEO)) { + flush_video_queue(cp->video_q); + } else if (switch_queue_trypush(cp->video_q, imgcp) != SWITCH_STATUS_SUCCESS) { flush_video_queue(cp->video_q); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Flushing video queue\n"); if (++cp->video_flushes > 1) { @@ -684,10 +690,10 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void } } } - switch_img_free(&img); } } switch_mutex_unlock(source->mutex); + switch_img_free(&img); } } } @@ -887,7 +893,7 @@ static switch_status_t local_stream_file_open(switch_file_handle_t *handle, cons context->pool = pool; - switch_queue_create(&context->video_q, 500, context->pool); + switch_queue_create(&context->video_q, 40, context->pool); handle->samples = 0; handle->samplerate = source->rate; @@ -907,7 +913,7 @@ static switch_status_t local_stream_file_open(switch_file_handle_t *handle, cons goto end; } - if (!switch_core_has_video() || + if (!switch_core_has_video() || !source->has_video || (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO) && !source->has_video && !source->blank_img && !source->cover_art && !source->banner_txt)) { switch_clear_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO); } @@ -1037,7 +1043,7 @@ static switch_status_t local_stream_file_read_video(switch_file_handle_t *handle buf_qsize = 1; } - while(context->ready && context->source->ready && (flags & SVR_FLUSH) && switch_queue_size(context->video_q) > min_qsize) { + while(context->ready && context->source->ready && switch_queue_size(context->video_q) > min_qsize) { if (switch_queue_trypop(context->video_q, &pop) == SWITCH_STATUS_SUCCESS) { switch_image_t *img = (switch_image_t *) pop; switch_img_free(&img); @@ -1151,11 +1157,7 @@ static switch_status_t local_stream_file_read(switch_file_handle_t *handle, void return SWITCH_STATUS_FALSE; } - if (context->source->has_video) { - if (!switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) { - switch_set_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO); - } - } else { + if (!context->source->has_video) { if (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) { switch_clear_flag_locked(handle, SWITCH_FILE_FLAG_VIDEO); } From f3b65c2ee758419673b80161215e738d509c7050 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 27 Sep 2018 19:13:48 +0000 Subject: [PATCH 30/69] FS-11394: [mod_av] Clean up defaults cos they are still wrong --- conf/vanilla/autoload_configs/av.conf.xml | 2 +- src/mod/applications/mod_av/autoload_configs/av.conf.xml | 2 +- src/mod/applications/mod_av/avcodec.c | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/conf/vanilla/autoload_configs/av.conf.xml b/conf/vanilla/autoload_configs/av.conf.xml index 7d0390646a..cf28fab3d3 100644 --- a/conf/vanilla/autoload_configs/av.conf.xml +++ b/conf/vanilla/autoload_configs/av.conf.xml @@ -9,7 +9,7 @@ - + diff --git a/src/mod/applications/mod_av/autoload_configs/av.conf.xml b/src/mod/applications/mod_av/autoload_configs/av.conf.xml index 7d0390646a..cf28fab3d3 100644 --- a/src/mod/applications/mod_av/autoload_configs/av.conf.xml +++ b/src/mod/applications/mod_av/autoload_configs/av.conf.xml @@ -9,7 +9,7 @@ - + diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index 39b426acd6..a2eda7caf9 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -1095,8 +1095,8 @@ static void set_h264_private_data(h264_codec_context_t *context, avcodec_profile av_opt_set(context->encoder_ctx->priv_data, "preset", "veryfast", 0); av_opt_set(context->encoder_ctx->priv_data, "intra-refresh", "1", 0); av_opt_set(context->encoder_ctx->priv_data, "tune", "animation+zerolatency", 0); - av_opt_set(context->encoder_ctx->priv_data, "sc_threshold", "40", 0); - av_opt_set(context->encoder_ctx->priv_data, "crf", "18", 0); + //av_opt_set(context->encoder_ctx->priv_data, "sc_threshold", "40", 0); + //av_opt_set(context->encoder_ctx->priv_data, "crf", "18", 0); if (profile->options) { switch_event_header_t *hp; @@ -1993,6 +1993,9 @@ static void load_config() val = atoi(value); + ctx->profile = FF_PROFILE_H264_BASELINE; + ctx->level = 31; + if (!strcmp(name, "dec-threads")) { aprofile->decoder_thread_count = switch_parse_cpu_string(value); } else if (!strcmp(name, "enc-threads")) { From d9de41349baca53f29ceb53982639006f6e64895 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 27 Sep 2018 18:49:07 +0000 Subject: [PATCH 31/69] FS-11394: [mod_av] Fix cpu race created by this patch --- src/mod/applications/mod_av/avcodec.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index a2eda7caf9..7df1aa42e0 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -1269,22 +1269,19 @@ GCC_DIAG_ON(deprecated-declarations) return SWITCH_STATUS_FALSE; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not open hardware codec %s, trying software encoder\n", codec_string); + if (context->encoder_ctx) { + if (avcodec_is_open(context->encoder_ctx)) { + avcodec_close(context->encoder_ctx); + } + av_free(context->encoder_ctx); + context->encoder_ctx = NULL; + } + context->encoder = NULL; context->hw_encoder = 0; - av_opt_free(context->encoder_ctx->priv_data); - set_h264_private_data(context, profile); - context->encoder = avcodec_find_encoder(context->av_codec_id); - - if (!context->encoder) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find encoder id: %d\n", context->av_codec_id); - return SWITCH_STATUS_FALSE; - } - - if (avcodec_open2(context->encoder_ctx, context->encoder, NULL) < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open codec %s\n", codec_string); - return SWITCH_STATUS_FALSE; - } + context->codec_settings.video.try_hardware_encoder = 0; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not open hardware codec %s, trying software encoder\n", codec_string); + return open_encoder(context, width, height); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "codec opened: %s\n", codec_string); From c371c7504509a4e78bc93c883f691fdfeb98f29d Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Wed, 17 Oct 2018 20:17:03 +0300 Subject: [PATCH 32/69] FS-11466: [mod_av] Fix h264 hardware encoding delay. --- src/mod/applications/mod_av/avcodec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index 7df1aa42e0..594999310c 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -1089,6 +1089,8 @@ static void set_h264_private_data(h264_codec_context_t *context, avcodec_profile if (context->hw_encoder) { av_opt_set(context->encoder_ctx->priv_data, "preset", "llhp", 0); av_opt_set_int(context->encoder_ctx->priv_data, "2pass", 1, 0); + av_opt_set_int(context->encoder_ctx->priv_data, "delay", 0, 0); + av_opt_set(context->encoder_ctx->priv_data, "forced-idr", "true", 0); return; } From 13f6890f411598bd2c567762d457d1a8163a7a8a Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Mon, 19 Nov 2018 20:45:04 +0400 Subject: [PATCH 33/69] FS-11523: [mod_av] Add ffmpeg 4.1 support. --- libs/win32/ffmpeg/ffmpeg.2017.vcxproj | 437 ++++++++++++++++++------- src/mod/applications/mod_av/avformat.c | 16 +- w32/ffmpeg-version.props | 2 +- w32/ffmpeg.props | 2 +- 4 files changed, 341 insertions(+), 116 deletions(-) diff --git a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj index 6ab4c5f3bc..8cca451268 100644 --- a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj +++ b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj @@ -52,6 +52,11 @@ + + + BUILDING_avdevice;BUILDING_avfilter;BUILDING_avformat;BUILDING_avcodec;BUILDING_avresample;BUILDING_swresample;BUILDING_swscale;BUILDING_avutil;%(PreprocessorDefinitions) + + X64 @@ -117,9 +122,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -225,6 +227,12 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -279,6 +287,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -318,10 +329,10 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -330,6 +341,15 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -348,6 +368,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -444,6 +467,21 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -498,6 +536,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -510,7 +551,7 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -693,9 +734,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -720,6 +758,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -747,9 +788,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -768,12 +806,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -819,6 +851,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -846,15 +881,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -879,9 +905,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -975,12 +998,18 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -996,6 +1025,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1029,12 +1061,18 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1131,12 +1169,18 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1245,9 +1289,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1290,6 +1331,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1416,6 +1460,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1509,9 +1556,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1584,6 +1628,33 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1644,6 +1715,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1671,21 +1745,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1704,9 +1766,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1719,6 +1778,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1809,12 +1871,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1839,9 +1895,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1887,6 +1940,27 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -1896,9 +1970,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2022,9 +2093,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2052,6 +2120,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2064,9 +2135,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2256,6 +2324,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2406,9 +2477,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2505,9 +2573,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2520,6 +2585,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2652,15 +2720,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2706,15 +2765,27 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2724,6 +2795,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2736,6 +2810,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2745,6 +2822,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2805,6 +2885,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2835,6 +2918,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2889,6 +2975,12 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2934,15 +3026,27 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -2952,12 +3056,18 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3021,9 +3131,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3054,6 +3161,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3078,6 +3188,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3099,6 +3212,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3141,6 +3257,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3174,6 +3293,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3183,6 +3305,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3198,6 +3323,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3270,9 +3398,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3315,6 +3440,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3330,6 +3458,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3420,7 +3551,7 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3447,6 +3578,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3507,6 +3641,12 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3528,6 +3668,12 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3573,21 +3719,24 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3597,6 +3746,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3618,6 +3770,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3627,6 +3782,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3702,6 +3860,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3744,6 +3905,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3819,6 +3983,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3849,6 +4016,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3903,12 +4073,6 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -3918,6 +4082,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4038,6 +4205,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4101,6 +4271,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4221,6 +4394,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4314,6 +4490,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4491,6 +4670,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4659,6 +4841,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4683,9 +4868,15 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -4821,6 +5012,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -5013,6 +5207,9 @@ $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj @@ -5395,11 +5592,6 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - Assembling %(Filename)%(Extension) - $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5605,11 +5797,6 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - - Assembling %(Filename)%(Extension) - $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" - $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj - Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5635,6 +5822,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5805,6 +5997,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5815,6 +6012,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5840,6 +6042,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5870,6 +6077,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" @@ -5950,6 +6162,11 @@ $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + + Assembling %(Filename)%(Extension) + $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" + $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj + Assembling %(Filename)%(Extension) $(YasmCommand) -I %(RelativeDir) -o $(IntDir)$([System.String]::Copy(%(RelativeDir)).Replace('\','_')).%(FileName).obj "%(FullPath)" diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c index d5ad0d6e25..42abce911c 100644 --- a/src/mod/applications/mod_av/avformat.c +++ b/src/mod/applications/mod_av/avformat.c @@ -51,6 +51,13 @@ GCC_DIAG_ON(deprecated-declarations) #define AV_TS_MAX_STRING_SIZE 32 +// Compatibility with old libav on Debian Jessie +// Not required if libavcodec version > 56.34.1 +#ifndef AV_CODEC_FLAG_LOOP_FILTER +#define AV_CODEC_FLAG_LOOP_FILTER CODEC_FLAG_LOOP_FILTER +#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE +#endif /* App interface */ @@ -479,13 +486,14 @@ GCC_DIAG_ON(deprecated-declarations) c->ticks_per_frame = 2; - c->flags|=CODEC_FLAG_LOOP_FILTER; // flags=+loop + c->flags|=AV_CODEC_FLAG_LOOP_FILTER; // flags=+loop c->me_cmp|= 1; // cmp=+chroma, where CHROMA = 1 c->me_range = 16; // me_range=16 c->max_b_frames = 3; // bf=3 av_opt_set_int(c->priv_data, "b_strategy", 1, 0); - av_opt_set_int(c->priv_data, "motion_est", ME_HEX, 0); + //av_opt_set_int(c->priv_data, "motion_est", ME_HEX, 0); + av_opt_set(c->priv_data, "motion_est", "hex", 0); av_opt_set_int(c->priv_data, "coder", 1, 0); switch (mm->vprofile) { @@ -568,7 +576,7 @@ GCC_DIAG_ON(deprecated-declarations) /* Some formats want stream headers to be separate. */ if (fc->oformat->flags & AVFMT_GLOBALHEADER) { - c->flags |= CODEC_FLAG_GLOBAL_HEADER; + c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } mst->active = 1; @@ -660,7 +668,7 @@ GCC_DIAG_ON(deprecated-declarations) mst->frame->format = AV_SAMPLE_FMT_S16; mst->frame->channel_layout = c->channel_layout; - if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE) { + if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) { //mst->frame->nb_samples = 10000; mst->frame->nb_samples = (mst->frame->sample_rate / 50) * c->channels; } else { diff --git a/w32/ffmpeg-version.props b/w32/ffmpeg-version.props index a4b02d4434..012af42ccb 100644 --- a/w32/ffmpeg-version.props +++ b/w32/ffmpeg-version.props @@ -4,7 +4,7 @@ - 3.4.4 + 4.1 true diff --git a/w32/ffmpeg.props b/w32/ffmpeg.props index 23b473ae54..4963a9e668 100644 --- a/w32/ffmpeg.props +++ b/w32/ffmpeg.props @@ -19,7 +19,7 @@ HAVE_FFMPEG;FFMPEG_STATICLIB;HAVE_AV_CONFIG_H;_ISOC99_SOURCE;_FILE_OFFSET_BITS=64;_LARGEFILE_SOURCE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions) - Secur32.lib;%(AdditionalDependencies) + Bcrypt.lib;Secur32.lib;%(AdditionalDependencies) From 359035bf696efc3c64b19cebd5dac841c4c47e06 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Wed, 17 Oct 2018 16:07:34 +0300 Subject: [PATCH 34/69] FS-11464: [Build-System] Improve CUDA detection in Visual Studio on Windows. --- libs/win32/ffmpeg/ffmpeg.2017.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj index 8cca451268..a8c70cd22a 100644 --- a/libs/win32/ffmpeg/ffmpeg.2017.vcxproj +++ b/libs/win32/ffmpeg/ffmpeg.2017.vcxproj @@ -16,7 +16,7 @@ 10.0.17134.0 {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} - + From 866bd44efc441c79722bd4cc7e9665f1a07c804c Mon Sep 17 00:00:00 2001 From: Mike Jerris Date: Wed, 28 Nov 2018 22:13:42 +0000 Subject: [PATCH 35/69] FS-11539: [core] session message names print wrong in log messages --- src/switch_core_session.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 23307bf81a..a27b4ce284 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -772,6 +772,7 @@ static const char *message_names[] = { "REDIRECT_AUDIO", "TRANSMIT_TEXT", "ANSWER", + "ACKNOWLEDGE_CALL", "PROGRESS", "BRIDGE", "UNBRIDGE", From 8ca7a5492d84c2c340d81770497e6b1a7e021e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Silva?= Date: Thu, 29 Nov 2018 09:54:24 +0100 Subject: [PATCH 36/69] FS-11512 [mod_sofia] #resolve missing privacy header on display update --- src/mod/endpoints/mod_sofia/mod_sofia.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 7b639de0ac..0c7a27534d 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -2009,6 +2009,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi NUTAG_SESSION_TIMER(tech_pvt->session_timeout), NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher), NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher), + TAG_IF(!zstr(tech_pvt->privacy), SIPTAG_PRIVACY_STR(tech_pvt->privacy)), TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)), TAG_IF(!zstr(tech_pvt->route_uri), NUTAG_PROXY(tech_pvt->route_uri)), TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)), From 551ce4c46f0a497829585a4c640a4eebb2148df9 Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Wed, 5 Dec 2018 21:30:03 -0500 Subject: [PATCH 37/69] FS-11554: fix crash in conference API when no param given to "moh". --- .../applications/mod_conference/conference_api.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index ec9fee5724..3e15aa9fd8 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -2709,6 +2709,9 @@ switch_status_t conference_api_sub_file_seek(conference_obj_t *conference, switc switch_status_t conference_api_set_moh(conference_obj_t *conference, const char *what) { + if (!what) { + return SWITCH_STATUS_FALSE; + } if (!strcasecmp(what, "toggle")) { if (conference_utils_test_flag(conference, CFLAG_NO_MOH)) { @@ -2737,7 +2740,15 @@ switch_status_t conference_api_set_moh(conference_obj_t *conference, const char switch_status_t conference_api_sub_moh(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { - conference_api_set_moh(conference, argv[2]); + if (conference_api_set_moh(conference, argv[2]) == SWITCH_STATUS_SUCCESS) { + if (stream) { + stream->write_function(stream, "+OK moh\n"); + } + } else { + if (stream) { + stream->write_function(stream, "-ERR invalid moh param\n"); + } + } return SWITCH_STATUS_SUCCESS; } From 9911004b5269539a5b874bd8940eef2005d37268 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Mon, 10 Dec 2018 22:04:16 +0800 Subject: [PATCH 38/69] FS-11562 #resolve add register ip and port to gateway register state change events --- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 ++ src/mod/endpoints/mod_sofia/sofia_reg.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 6b9b90ad5b..cdb311f35a 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -561,6 +561,8 @@ struct sofia_gateway { sofia_gateway_subscription_t *subscriptions; int distinct_to; sofia_cid_type_t cid_type; + char register_network_ip[80]; + int register_network_port; }; typedef enum { diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 601824c334..d6db3d19e6 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -151,6 +151,9 @@ void sofia_reg_fire_custom_gateway_state_event(sofia_gateway_t *gateway, int sta switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Gateway", gateway->name); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "State", sofia_state_string(gateway->state)); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Ping-Status", sofia_gateway_status_name(gateway->status)); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Register-Network-IP", gateway->register_network_ip); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "Register-Network-Port", "%d", gateway->register_network_port); + if (!zstr(phrase)) { switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Phrase", phrase); } @@ -2402,6 +2405,11 @@ void sofia_reg_handle_sip_r_register(int status, if (sofia_private && gateway) { reg_state_t ostate = gateway->state; + char network_ip[80]; + + sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &gateway->register_network_port); + snprintf(gateway->register_network_ip, sizeof(gateway->register_network_ip), (msg_addrinfo(de->data->e_msg))->ai_addr->sa_family == AF_INET6 ? "[%s]" : "%s", network_ip); + switch (status) { case 200: if (sip && sip->sip_contact) { From ef123b6c2e907cf660d4ba69451156aad2353019 Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Fri, 7 Dec 2018 20:16:02 -0500 Subject: [PATCH 39/69] FS-11532: fix crash (87d4a6a0) --- src/switch_ivr_async.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index d80426f347..23d669214f 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1321,11 +1321,12 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s rh->completion_cause = NULL; switch_core_session_get_read_impl(session, &rh->read_impl); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->read_impl.actual_samples_per_second); - rh->fh->native_rate = rh->read_impl.actual_samples_per_second; - - if (rh->fh && switch_core_file_has_video(rh->fh, SWITCH_TRUE)) { - switch_core_media_bug_set_media_params(bug, &rh->fh->mm); + if (rh->fh) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->read_impl.actual_samples_per_second); + rh->fh->native_rate = rh->read_impl.actual_samples_per_second; + if (switch_core_file_has_video(rh->fh, SWITCH_TRUE)) { + switch_core_media_bug_set_media_params(bug, &rh->fh->mm); + } } } From cae7f0fa2f55fe04265353a8be03f1e39ef00354 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Mon, 10 Dec 2018 21:26:10 -0500 Subject: [PATCH 40/69] FS-11562 [mod_sofia] fire register state event on changing registrar IP --- src/mod/endpoints/mod_sofia/sofia_reg.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index d6db3d19e6..39ae6b3b03 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -2405,8 +2405,12 @@ void sofia_reg_handle_sip_r_register(int status, if (sofia_private && gateway) { reg_state_t ostate = gateway->state; + char oregister_network_ip[80] = { 0 }; char network_ip[80]; + if (!zstr_buf(gateway->register_network_ip)) { + strncpy(oregister_network_ip, gateway->register_network_ip, sizeof(oregister_network_ip) - 1); + } sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &gateway->register_network_port); snprintf(gateway->register_network_ip, sizeof(gateway->register_network_ip), (msg_addrinfo(de->data->e_msg))->ai_addr->sa_family == AF_INET6 ? "[%s]" : "%s", network_ip); @@ -2465,7 +2469,9 @@ void sofia_reg_handle_sip_r_register(int status, gateway->name, switch_str_nil(phrase), status, ++gateway->failures); break; } - if (ostate != gateway->state) { + if (ostate != gateway->state || + zstr_buf(oregister_network_ip) || strcmp(oregister_network_ip, gateway->register_network_ip)) { + sofia_reg_fire_custom_gateway_state_event(gateway, status, phrase); } } From abde630feab06adfc6b2773bf03b4c699861e9c5 Mon Sep 17 00:00:00 2001 From: Sergey Safarov Date: Wed, 12 Dec 2018 05:27:06 +0000 Subject: [PATCH 41/69] FS-11345: Fixed Werror=stringop-truncation for mod_opus Fixed Werror=format-truncation on sofia-sip/libsofia-sip-ua/tport Fixed Werror=format-truncation on mod/endpoints/mod_verto Fixed unused-but-set-variable in mod_lua Fixed Werror=format-truncation on libs/sofia-sip/libsofia-sip-ua/tport Fixed Wunused-variable Wmaybe-uninitialized on mod_soundtouch Fixed Wliteral-suffix for libs/unimrcp --- libs/sofia-sip/libsofia-sip-ua/tport/tport_logging.c | 4 ++-- libs/sofia-sip/libsofia-sip-ua/tport/ws.c | 4 ++-- libs/unimrcp/libs/apr-toolkit/include/apt_log.h | 6 +++--- libs/unimrcp/platforms/umc/src/umcconsole.cpp | 2 +- libs/unimrcp/platforms/umc/src/umcscenario.cpp | 2 +- src/mod/applications/mod_soundtouch/mod_soundtouch.cpp | 4 ++-- src/mod/codecs/mod_opus/mod_opus.c | 10 +++++----- src/mod/endpoints/mod_verto/ws.c | 4 ++-- src/mod/languages/mod_lua/mod_lua.cpp | 3 +-- 9 files changed, 19 insertions(+), 20 deletions(-) diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_logging.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport_logging.c index 8d7beeeeb0..1c889da5f6 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_logging.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_logging.c @@ -315,7 +315,7 @@ int tport_open_log(tport_master_t *mr, tagi_t *tags) /** Create log stamp */ void tport_stamp(tport_t const *self, msg_t *msg, - char stamp[128], char const *what, + char stamp[512], char const *what, size_t n, char const *via, su_time_t now) { @@ -357,7 +357,7 @@ void tport_stamp(tport_t const *self, msg_t *msg, su_inet_ntop(su->su_family, SU_ADDR(su), name, sizeof(name)); - snprintf(stamp, 128, + snprintf(stamp, 144, "%s "MOD_ZU" bytes %s %s/[%s]:%u%s%s at %02u:%02u:%02u.%06lu:\n", what, (size_t)n, via, self->tp_name->tpn_proto, name, ntohs(su->su_port), label[0] ? label : "", comp, diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index ced491d829..8d6de2909b 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -254,10 +254,10 @@ int ws_handshake(wsh_t *wsh) char version[5] = ""; char proto[256] = ""; char proto_buf[384] = ""; - char input[256] = ""; + char input[512] = ""; unsigned char output[SHA1_HASH_SIZE] = ""; char b64[256] = ""; - char respond[512] = ""; + char respond[1024] = ""; ssize_t bytes; char *p, *e = 0; diff --git a/libs/unimrcp/libs/apr-toolkit/include/apt_log.h b/libs/unimrcp/libs/apr-toolkit/include/apt_log.h index a9ec8d91c6..9e022c3163 100644 --- a/libs/unimrcp/libs/apr-toolkit/include/apt_log.h +++ b/libs/unimrcp/libs/apr-toolkit/include/apt_log.h @@ -58,11 +58,11 @@ APT_BEGIN_EXTERN_C /** Format to log string identifiers and resources */ #define APT_SIDRES_FMT "<%s@%s>" /** Format to log pointers and identifiers */ -#define APT_PTRSID_FMT APT_PTR_FMT" "APT_SID_FMT +#define APT_PTRSID_FMT APT_PTR_FMT" " APT_SID_FMT /** Format to log pointers and identifiers */ -#define APT_NAMESID_FMT "%s "APT_SID_FMT +#define APT_NAMESID_FMT "%s " APT_SID_FMT /** Format to log names, identifiers and resources */ -#define APT_NAMESIDRES_FMT "%s "APT_SIDRES_FMT +#define APT_NAMESIDRES_FMT "%s " APT_SIDRES_FMT /** Priority of log messages ordered from highest priority to lowest (rfc3164) */ typedef enum { diff --git a/libs/unimrcp/platforms/umc/src/umcconsole.cpp b/libs/unimrcp/platforms/umc/src/umcconsole.cpp index 3165854082..a065208a91 100644 --- a/libs/unimrcp/platforms/umc/src/umcconsole.cpp +++ b/libs/unimrcp/platforms/umc/src/umcconsole.cpp @@ -246,7 +246,7 @@ void UmcConsole::Usage() { printf( "\n" - " * "UNI_COPYRIGHT"\n" + " * " UNI_COPYRIGHT"\n" " *\n" UNI_LICENSE"\n" "\n" diff --git a/libs/unimrcp/platforms/umc/src/umcscenario.cpp b/libs/unimrcp/platforms/umc/src/umcscenario.cpp index 085aa755fb..d9300dcf3c 100644 --- a/libs/unimrcp/platforms/umc/src/umcscenario.cpp +++ b/libs/unimrcp/platforms/umc/src/umcscenario.cpp @@ -221,7 +221,7 @@ const char* UmcScenario::LoadFileContent(const char* pFileName, apr_size_t& size size = (apr_size_t)finfo.size; char* pContent = (char*) apr_palloc(pool,size+1); - apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Load File Content size [%"APR_SIZE_T_FMT" bytes] %s",size,pFilePath); + apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Load File Content size [%" APR_SIZE_T_FMT" bytes] %s",size,pFilePath); if(apr_file_read(pFile,pContent,&size) != APR_SUCCESS) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Read Content %s",pFilePath); diff --git a/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp b/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp index 734a09ba4e..fc2843440b 100644 --- a/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp +++ b/src/mod/applications/mod_soundtouch/mod_soundtouch.cpp @@ -252,7 +252,8 @@ SWITCH_STANDARD_APP(soundtouch_start_function) char *argv[6]; int argc; char *lbuf = NULL; - int x, n; + int x; + int n=0; if ((bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_soundtouch_"))) { if (!zstr(data) && !strcasecmp(data, "stop")) { @@ -334,7 +335,6 @@ SWITCH_STANDARD_API(soundtouch_api_function) char *argv[10] = { 0 }; char *uuid = NULL; char *action = NULL; - char *lbuf = NULL; int x, n; if (zstr(cmd)) { diff --git a/src/mod/codecs/mod_opus/mod_opus.c b/src/mod/codecs/mod_opus/mod_opus.c index b06d8fa188..1125a27d17 100644 --- a/src/mod/codecs/mod_opus/mod_opus.c +++ b/src/mod/codecs/mod_opus/mod_opus.c @@ -207,19 +207,19 @@ static uint32_t switch_opus_encoder_set_audio_bandwidth(OpusEncoder *encoder_obj static switch_bool_t switch_opus_show_audio_bandwidth(int audiobandwidth,char *audiobandwidth_str) { if (audiobandwidth == OPUS_BANDWIDTH_NARROWBAND) { - strncpy(audiobandwidth_str, "NARROWBAND",10); + strncpy(audiobandwidth_str, "NARROWBAND",11); return SWITCH_TRUE; } else if (audiobandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { - strncpy(audiobandwidth_str, "MEDIUMBAND",10); + strncpy(audiobandwidth_str, "MEDIUMBAND",11); return SWITCH_TRUE; } else if (audiobandwidth == OPUS_BANDWIDTH_WIDEBAND) { - strncpy(audiobandwidth_str,"WIDEBAND",8); + strncpy(audiobandwidth_str,"WIDEBAND",9); return SWITCH_TRUE; } else if (audiobandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) { - strncpy(audiobandwidth_str, "SUPERWIDEBAND",13); + strncpy(audiobandwidth_str, "SUPERWIDEBAND",14); return SWITCH_TRUE; } else if (audiobandwidth == OPUS_BANDWIDTH_FULLBAND) { - strncpy(audiobandwidth_str, "FULLBAND",8); + strncpy(audiobandwidth_str, "FULLBAND",9); return SWITCH_TRUE; } return SWITCH_FALSE; diff --git a/src/mod/endpoints/mod_verto/ws.c b/src/mod/endpoints/mod_verto/ws.c index d92fd0bcea..86c73c18fa 100644 --- a/src/mod/endpoints/mod_verto/ws.c +++ b/src/mod/endpoints/mod_verto/ws.c @@ -254,10 +254,10 @@ int ws_handshake(wsh_t *wsh) char version[5] = ""; char proto[256] = ""; char proto_buf[384] = ""; - char input[256] = ""; + char input[512] = ""; unsigned char output[SHA1_HASH_SIZE] = ""; char b64[256] = ""; - char respond[512] = ""; + char respond[1024] = ""; ssize_t bytes; char *p, *e = 0; diff --git a/src/mod/languages/mod_lua/mod_lua.cpp b/src/mod/languages/mod_lua/mod_lua.cpp index 47d14c6d48..63aaf25fc0 100644 --- a/src/mod/languages/mod_lua/mod_lua.cpp +++ b/src/mod/languages/mod_lua/mod_lua.cpp @@ -118,7 +118,6 @@ int docall(lua_State * L, int narg, int nresults, int perror, int fatal) static lua_State *lua_init(void) { lua_State *L = luaL_newstate(); - int error = 0; if (L) { const char *buff = "os.exit = function() freeswitch.consoleLog(\"err\", \"Surely you jest! exiting is a bad plan....\\n\") end"; @@ -127,7 +126,7 @@ static lua_State *lua_init(void) luaopen_freeswitch(L); lua_gc(L, LUA_GCRESTART, 0); lua_atpanic(L, panic); - error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1); + luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1); } return L; } From 54c142933a474a0e0e0a5c007b8b8f0c242d237b Mon Sep 17 00:00:00 2001 From: Sergey Safarov Date: Thu, 13 Dec 2018 07:02:22 +0000 Subject: [PATCH 42/69] FS-11345: Fixed Werror=format-truncation on lib/esl --- libs/esl/fs_cli.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 8c1bf24933..3bdadf11d3 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -78,7 +78,7 @@ static int connected = 0; static int allow_ctl_c = 0; static char bare_prompt_str[514] = ""; static int bare_prompt_str_len = 0; -static char prompt_str[512] = ""; +static char prompt_str[1024] = ""; static char prompt_color[12] = {ESL_SEQ_DEFAULT_COLOR}; static char input_text_color[12] = {ESL_SEQ_DEFAULT_COLOR}; static char output_text_color[12] = {ESL_SEQ_DEFAULT_COLOR}; @@ -700,7 +700,7 @@ static void redisplay(void) char s1[12], s2[12] = ""; putchar('\r'); - snprintf(s1, sizeof(s1), "\033[%dC", bare_prompt_str_len); + snprintf(s1, sizeof(s1), "\033[%dC", bare_prompt_str_len); if (pos) snprintf(s2, sizeof(s2), "\033[%dC", pos); printf("%s%s",s1,s2); } @@ -1418,7 +1418,7 @@ int main(int argc, char *argv[]) esl_handle_t handle = {{0}}; int count = 0; const char *line = NULL; - char cmd_str[1024] = ""; + char cmd_str[2048] = ""; cli_profile_t *profile = NULL; int argv_use_history_file = 1; int use_history_file = 0; From 15051696d1467f339a74f6747a8776737dc9210d Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Tue, 11 Dec 2018 00:18:47 -0500 Subject: [PATCH 43/69] FS-11559: check file name null ptr (crashfix CoreSession:recordFile) --- src/switch_cpp.cpp | 1 + src/switch_ivr_play_say.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/switch_cpp.cpp b/src/switch_cpp.cpp index d703bbdc31..d2a7a531f8 100644 --- a/src/switch_cpp.cpp +++ b/src/switch_cpp.cpp @@ -1278,6 +1278,7 @@ SWITCH_DECLARE(int) CoreSession::recordFile(char *file_name, int time_limit, int this_check(-1); sanity_check(-1); + if (!file_name) return 0; memset(&local_fh, 0, sizeof(local_fh)); fhp = &local_fh; local_fh.thresh = silence_threshold; diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c index 911d557796..abc028852d 100644 --- a/src/switch_ivr_play_say.c +++ b/src/switch_ivr_play_say.c @@ -390,6 +390,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *se return SWITCH_STATUS_FALSE; } + if (!file) { + return SWITCH_STATUS_FALSE; + } + prefix = switch_channel_get_variable(channel, "sound_prefix"); if (!prefix) { From e36caa75444c9bdbaa4aafb8bd6c87db2ffe1270 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Mon, 1 Oct 2018 11:06:34 +0800 Subject: [PATCH 44/69] FS-11416 fix build error FCT_FIXTURE_SUITE_BGN undefined --- src/include/test/switch_test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 268f779e3c..85ad2ae91e 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -156,7 +156,7 @@ static void fst_session_park(switch_core_session_t *session) * Define the beginning of a test suite not associated with a module. * @param suite the name of this test suite */ -#define FST_SUITE_BEGIN(suite) FCT_FIXTURE_SUITE_BGN \ +#define FST_SUITE_BEGIN(suite) \ const char *fst_test_module = NULL; \ FCT_FIXTURE_SUITE_BGN(suite) From 3f512c0a745974093b7b8bb1efe3321358fef7d3 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Thu, 4 Oct 2018 20:02:08 +0000 Subject: [PATCH 45/69] FS-11439 [core] Update switch_test.h so unprivileged users can execute tests when basedir is owned by root. --- src/include/test/switch_test.h | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 85ad2ae91e..ae80852e42 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -59,13 +59,41 @@ /** * initialize FS core from optional configuration dir */ -static void fst_init_core_and_modload(const char *confdir) +static void fst_init_core_and_modload(const char *confdir, const char *basedir) { const char *err; + // Let FreeSWITCH core pick these + //SWITCH_GLOBAL_dirs.base_dir = strdup("/usr/local/freeswitch"); + //SWITCH_GLOBAL_dirs.mod_dir = strdup("/usr/local/freeswitch/mod"); + //SWITCH_GLOBAL_dirs.lib_dir = strdup("/usr/local/freeswitch/lib"); + //SWITCH_GLOBAL_dirs.temp_dir = strdup("/tmp"); + + if (zstr(basedir)) { + basedir = "."; + } + + // Allow test to define the runtime dir if (!zstr(confdir)) { SWITCH_GLOBAL_dirs.conf_dir = strdup(confdir); + } else { + SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf("%s%sconf", basedir, SWITCH_PATH_SEPARATOR); } - SWITCH_GLOBAL_dirs.sounds_dir = strdup("./"); + + SWITCH_GLOBAL_dirs.log_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.run_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.recordings_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.sounds_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.cache_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.db_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.script_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.htdocs_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.grammar_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.fonts_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.images_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.storage_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.data_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + SWITCH_GLOBAL_dirs.localstate_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + switch_core_init_and_modload(0, SWITCH_TRUE, &err); switch_sleep(1 * 1000000); switch_core_set_variable("sound_prefix", ""); @@ -122,7 +150,7 @@ static void fst_session_park(switch_core_session_t *session) { \ switch_timer_t fst_timer = { 0 }; \ switch_memory_pool_t *fst_pool = NULL; \ - fst_init_core_and_modload(confdir); + fst_init_core_and_modload(confdir, NULL); /** * Define the end of a freeswitch core test driver. From e95beb8d4f61887f768a2f89adc3418ae6f0eccc Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 5 Oct 2018 18:43:46 +0000 Subject: [PATCH 46/69] FS-11442 [core] added fst_play_and_detect_app_test and fst_sched_recv_dtmf --- src/include/test/switch_test.h | 52 +++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index ae80852e42..2496cf1f5e 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -443,6 +443,7 @@ static void fst_session_park(switch_core_session_t *session) * Test Requires: * switch_ivr_displace_session(input_filename) == SWITCH_STATUS_SUCCESS * switch_core_session_execute_application(play_and_detect_speech) == SWITCH_STATUS_SUCCESS + * mod_dptools is loaded * * Test Checks: * fst_asr_result != NULL after recognition completes @@ -455,9 +456,10 @@ static void fst_session_park(switch_core_session_t *session) * @param prompt_filename name of prompt to play * @param input_filename name of file containing input audio for the recognizer */ -#define fst_play_and_detect_speech_test(recognizer, grammar, prompt_filename, input_filename) \ +#define fst_play_and_detect_speech_app_test(recognizer, grammar, prompt_filename, input_filename) \ { \ char *args = NULL; \ + fst_requires_module("mod_dptools"); \ switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "r") == SWITCH_STATUS_SUCCESS); \ args = switch_core_session_sprintf(fst_session, "%s detect:%s %s", prompt_filename, recognizer, grammar); \ @@ -466,12 +468,60 @@ static void fst_session_park(switch_core_session_t *session) fst_check(fst_asr_result != NULL); \ } +/** + * Use play_and_detect_speech core function to test recognizer + * + * Test Requires: + * switch_ivr_displace_session(input_filename) == SWITCH_STATUS_SUCCESS + * + * Test Checks: + * fst_asr_result != NULL after recognition completes + * + * Test Output: + * fst_asr_result has the result from detect_speech_result channel variable. + * + * @param recognizer name of recognizer + * @param grammar recognizer grammar + * @param prompt_filename name of prompt to play + * @param input_filename name of file containing input audio for the recognizer + * @param input_args input callback args + */ +#define fst_play_and_detect_speech_test(recognizer, grammar, prompt_filename, input_filename, input_args) \ +{ \ + char *args = NULL; \ + fst_asr_result = NULL; \ + fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "r") == SWITCH_STATUS_SUCCESS); \ + switch_status_t status = switch_ivr_play_and_detect_speech(fst_session, prompt_filename, recognizer, grammar, (char **)&fst_asr_result, 0, input_args); \ + fst_check(fst_asr_result != NULL); \ +} + /** * Define end of play_and_detect_speech recognizer test */ #define fst_play_and_detect_speech_test_end() \ } +/** + * Inject DTMF into the session to be detected. + * + * Test Requires: + * switch_api_execute(sched_api) == SWITCH_STATUS_SUCCESS + * mod_commands is loaded + * + * @param when string describing when to send dtmf + * @param digits to send + */ +#define fst_sched_recv_dtmf(when, digits) \ +{ \ + switch_stream_handle_t stream = { 0 }; \ + SWITCH_STANDARD_STREAM(stream); \ + fst_requires_module("mod_commands"); \ + switch_status_t api_result = switch_api_execute("sched_api", switch_core_session_sprintf(fst_session, "%s none uuid_recv_dtmf %s %s", when, switch_core_session_get_uuid(fst_session), digits), NULL, &stream); \ + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fst_session), SWITCH_LOG_INFO, "Injecting DTMF %s at %s\n", digits, when); \ + fst_requires(api_result == SWITCH_STATUS_SUCCESS); \ + switch_safe_free(stream.data); \ +} + /** * Parse JSON file and save to varname * From 3dd0eadcc126e24c2fc6af857ca0e6065d43f771 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Sat, 6 Oct 2018 03:26:04 +0000 Subject: [PATCH 47/69] FS-11442 [core] added test helpers for constructing XML objects --- src/include/test/switch_test.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 2496cf1f5e..4fd2c33e30 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -522,6 +522,40 @@ static void fst_session_park(switch_core_session_t *session) switch_safe_free(stream.data); \ } +#define fst_xml_start() \ + switch_stream_handle_t fst_xml_stream = { 0 }; \ + SWITCH_STANDARD_STREAM(fst_xml_stream); + int fst_tag_children = 0; + int fst_tag_body = 0; + +#define fst_xml_open_tag(tag_name) \ + fst_xml_stream.write_function(&fst_xml_stream, "<%s", #tag_name); \ + fst_tag_children++; + +#define fst_xml_attr(attr) \ + if (!zstr(attr)) fst_xml_stream.write_function(&fst_xml_stream, " %s=\"%s\"", #attr, attr); + +#define fst_xml_close_tag(tag_name) \ + --fst_tag_children; \ + if (fst_tag_children > 0 || fst_tag_body) { \ + fst_xml_stream.write_function(&fst_xml_stream, "", #tag_name); \ + } else { \ + fst_xml_stream.write_function(&fst_xml_stream, "/>"); \ + } \ + fst_tag_body = 0; + +#define fst_xml_body(body) \ + if (fst_tag_body) { \ + fst_xml_stream.write_function(&fst_xml_stream "%s", body); \ + } else { \ + fst_tag_body = 1; \ + fst_xml_stream.write_function(&fst_xml_stream, ">%s", body); \ + } + +#define fst_xml_end() \ + switch_xml_parse_str_dynamic((char *)fst_xml_stream.data, SWITCH_FALSE); + + /** * Parse JSON file and save to varname * From 5014e11eeba676db95dc27a74e6e338ad15d9dea Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Tue, 9 Oct 2018 20:24:55 +0000 Subject: [PATCH 48/69] FS-11442 [core] Add test helpers for wall time measurements and integer/double range checks. Improve simple test log output to identify which test the failure is in. --- src/include/test/switch_fct.h | 37 +++++++++++++------------ src/include/test/switch_test.h | 50 ++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/include/test/switch_fct.h b/src/include/test/switch_fct.h index 24d0c8a59d..e85f7865ef 100644 --- a/src/include/test/switch_fct.h +++ b/src/include/test/switch_fct.h @@ -840,6 +840,9 @@ of "checks". struct _fctchk_t { + /* The name of the test this condition is in */ + char name[FCT_MAX_LOG_LINE]; + /* This string that represents the condition. */ char cndtn[FCT_MAX_LOG_LINE]; @@ -861,10 +864,12 @@ struct _fctchk_t #define fctchk__lineno(_CHK_) ((_CHK_)->lineno) #define fctchk__cndtn(_CHK_) ((_CHK_)->cndtn) #define fctchk__msg(_CHK_) ((_CHK_)->msg) +#define fctchk__name(_CHK_) ((_CHK_)->name) static fctchk_t* fctchk_new(int is_pass, char const *cndtn, + char const *name, char const *file, int lineno, char const *format, @@ -882,6 +887,7 @@ fctchk_new(int is_pass, return NULL; } + fctstr_safe_cpy(chk->name, name ? name : "", FCT_MAX_LOG_LINE); fctstr_safe_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE); fctstr_safe_cpy(chk->file, file, FCT_MAX_LOG_LINE); chk->lineno = lineno; @@ -2693,20 +2699,7 @@ of char*'s that will eventually be free'd by the logger. */ static void fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list) { - /* For now we will truncate the string to some set amount, later - we can work out a dynamic string object. */ - char *str = (char*)malloc(sizeof(char)*FCT_MAX_LOG_LINE); - FCT_ASSERT( str != NULL ); - fct_snprintf( - str, - FCT_MAX_LOG_LINE, - "%s(%d):\n %s", - fctchk__file(chk), - fctchk__lineno(chk), - fctchk__msg(chk) - ); - /* Append it to the listing ... */ - fct_nlist__append(fail_list, (void*)str); + fct_nlist__append(fail_list, (void *)chk); } @@ -2714,13 +2707,21 @@ fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list) static void fct_logger_print_failures(fct_nlist_t const *fail_list) { + const char *last_test = NULL; puts( "\n----------------------------------------------------------------------------\n" ); - puts("FAILED TESTS\n\n"); - FCT_NLIST_FOREACH_BGN(char *, cndtn_str, fail_list) + puts("FAILED TESTS\n"); + FCT_NLIST_FOREACH_BGN(fctchk_t const *, chk, fail_list) { - printf("%s\n", cndtn_str); + if (!last_test || strcmp(last_test, fctchk__name(chk))) { + printf("\n%s\n", fctchk__name(chk)); + } + last_test = fctchk__name(chk); + printf(" %s(%d):\n %s\n", + fctchk__file(chk), + fctchk__lineno(chk), + fctchk__msg(chk)); } FCT_NLIST_FOREACH_END(); @@ -3571,8 +3572,10 @@ _fct_xchk_fn_varg( { fctchk_t *chk =NULL; chk = fctchk_new( + is_pass, condition, + fct_test__name(fct_xchk_test), fct_xchk_file, fct_xchk_lineno, format, diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 4fd2c33e30..fa9c48f48a 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -140,6 +140,50 @@ static void fst_session_park(switch_core_session_t *session) */ #define fst_check_string_not_equals fct_chk_neq_str +/** + * Mark reference for time measure + */ +#define fst_time_mark() \ + fst_time_start = switch_time_now(); + +/** + * Check duration relative to test start, last marked time, or last check. + */ +#define fst_check_duration(duration_ms, precision_ms) \ + { \ + int actual_duration_ms = (int)((switch_time_now() - fst_time_start) / 1000); \ + fct_xchk( \ + abs((actual_duration_ms - duration_ms)) <= precision_ms, \ + "fst_check_duration: %d != %d +/- %d", \ + (actual_duration_ms), \ + (duration_ms), \ + (precision_ms) \ + ); \ + } + +/** + * Check if integer is in range + */ +#define fst_check_int_range(actual, expected, precision) \ + fct_xchk( \ + abs((val - expected)) <= precision, \ + "fst_check_int_range: %d != %d +/- %d", \ + (actual), \ + (expected), \ + (precision) \ + ); + +/** + * Check if double-precision number is in range + */ +#define fst_check_double_range(actual, expected, precision) \ + fct_xchk( \ + fabs((val - expected)) <= precision, \ + "fst_check_double_range: %f != %f +/- %f", \ + (actual), \ + (expected), \ + (precision) \ + ); /** * Define the beginning of a freeswitch core test driver. Only one per test application allowed. @@ -150,7 +194,8 @@ static void fst_session_park(switch_core_session_t *session) { \ switch_timer_t fst_timer = { 0 }; \ switch_memory_pool_t *fst_pool = NULL; \ - fst_init_core_and_modload(confdir, NULL); + fst_init_core_and_modload(confdir, NULL); \ + switch_time_t fst_time_start = 0; /** * Define the end of a freeswitch core test driver. @@ -201,7 +246,8 @@ static void fst_session_park(switch_core_session_t *session) FCT_SETUP_BGN() \ switch_core_new_memory_pool(&fst_pool); \ fst_requires(fst_pool != NULL); \ - fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); + fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \ + fst_time_mark(); /** * Define the end of test suite setup. From a4a0dd81bb257b9b04129d5837fb78fa103c827d Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Tue, 9 Oct 2018 21:35:28 +0000 Subject: [PATCH 49/69] FS-11442 [core] allow multiple test modules to be loaded in the same test program. --- src/include/test/switch_test.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index fa9c48f48a..ec44e97d0c 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -212,17 +212,24 @@ static void fst_session_park(switch_core_session_t *session) * @param suite the name of this test suite */ #define FST_MODULE_BEGIN(modname,suite) \ - const char *fst_test_module = #modname; \ - if (!zstr(fst_test_module)) { \ - const char *err; \ - switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ - } \ - FCT_FIXTURE_SUITE_BGN(suite) + { \ + const char *fst_test_module = #modname; \ + if (!zstr(fst_test_module)) { \ + const char *err; \ + switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ + } \ + FCT_FIXTURE_SUITE_BGN(suite); /** * Define the end of a FreeSWITCH module test suite. */ -#define FST_MODULE_END FCT_FIXTURE_SUITE_END +#define FST_MODULE_END() \ + FCT_FIXTURE_SUITE_END(); \ + if (!zstr(fst_test_module) && switch_loadable_module_exists(fst_test_module) == SWITCH_STATUS_SUCCESS) { \ + const char *err; \ + switch_loadable_module_unload_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ + } \ + } /** From 101512ba3375e8be9bf56c0a1bdf51b8c8310f89 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Wed, 10 Oct 2018 18:40:54 +0000 Subject: [PATCH 50/69] FS-11442 [mod_test] new module, mod_test - mock ASR interface. --- .gitignore | 2 + configure.ac | 2 + src/include/test/switch_test.h | 68 +-- src/mod/applications/mod_test/Makefile.am | 10 + src/mod/applications/mod_test/mod_test.c | 407 ++++++++++++++++++ .../applications/mod_test/test/Makefile.am | 5 + .../applications/mod_test/test/freeswitch.xml | 23 + .../mod_test/test/sounds/agent.wav | Bin 0 -> 89644 bytes .../applications/mod_test/test/sounds/hi.wav | Bin 0 -> 68844 bytes ...state_your_name_and_reason_for_calling.wav | Bin 0 -> 37944 bytes .../mod_test/test/sounds/test.wav | Bin 0 -> 76844 bytes .../mod_test/test/sounds/test_agent.wav | Bin 0 -> 105644 bytes src/mod/applications/mod_test/test/test_asr.c | 292 +++++++++++++ 13 files changed, 781 insertions(+), 28 deletions(-) create mode 100644 src/mod/applications/mod_test/Makefile.am create mode 100644 src/mod/applications/mod_test/mod_test.c create mode 100644 src/mod/applications/mod_test/test/Makefile.am create mode 100644 src/mod/applications/mod_test/test/freeswitch.xml create mode 100644 src/mod/applications/mod_test/test/sounds/agent.wav create mode 100644 src/mod/applications/mod_test/test/sounds/hi.wav create mode 100644 src/mod/applications/mod_test/test/sounds/ivr-please_state_your_name_and_reason_for_calling.wav create mode 100644 src/mod/applications/mod_test/test/sounds/test.wav create mode 100644 src/mod/applications/mod_test/test/sounds/test_agent.wav create mode 100644 src/mod/applications/mod_test/test/test_asr.c diff --git a/.gitignore b/.gitignore index 018c1c0d2d..c004439946 100644 --- a/.gitignore +++ b/.gitignore @@ -155,6 +155,8 @@ Release/ /src/mod/applications/mod_osp/Makefile.in /src/mod/applications/mod_rss/Makefile /src/mod/applications/mod_snipe_hunt/Makefile +/src/mod/applications/mod_test/test/Makefile +/src/mod/applications/mod_test/test/Makefile.in /src/mod/codecs/mod_com_g729/Makefile /src/mod/codecs/mod_com_g729/Makefile.in /src/mod/codecs/mod_dahdi_codec/Makefile diff --git a/configure.ac b/configure.ac index fa802d491f..4106fa0b19 100644 --- a/configure.ac +++ b/configure.ac @@ -1861,6 +1861,8 @@ AC_CONFIG_FILES([Makefile src/mod/applications/mod_spandsp/Makefile src/mod/applications/mod_spy/Makefile src/mod/applications/mod_stress/Makefile + src/mod/applications/mod_test/Makefile + src/mod/applications/mod_test/test/Makefile src/mod/applications/mod_translate/Makefile src/mod/applications/mod_valet_parking/Makefile src/mod/applications/mod_vmd/Makefile diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index ec44e97d0c..cb6ba306de 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -35,26 +35,34 @@ #include +/** + * Get environment variable and save to var + ( ) + */ +static char *fst_getenv_default(const char *env, char *default_value, switch_bool_t required) +{ + char *val = getenv(env); + if (!val) { + if (required) { + fprintf(stderr, "Failed to start test: environment variable \"%s\" is not set!\n", env); + exit(1); + } + return default_value; + } + return val; +} /** * Get environment variable and save to var */ #define fst_getenv(env, default_value) \ - char *env = getenv(#env); \ - if (!env) { \ - env = (char *)default_value; \ - } + char *env = fst_getenv_default(#env, (char *)default_value, SWITCH_FALSE); /** * Get mandatory environment variable and save to var. Exit with error if missing. */ #define fst_getenv_required(env) \ - char *env = getenv(#env); \ - if (!env) { \ - fprintf(stderr, "Failed to start test: environment variable \"%s\" is not set!\n", #env); \ - exit(1); \ - } - + char *env = fst_getenv_default(#env, NULL, SWITCH_TRUE); /** * initialize FS core from optional configuration dir @@ -96,19 +104,16 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) switch_core_init_and_modload(0, SWITCH_TRUE, &err); switch_sleep(1 * 1000000); - switch_core_set_variable("sound_prefix", ""); + switch_core_set_variable("sound_prefix", "." SWITCH_PATH_SEPARATOR); } /** * Park FreeSWITCH session. This is handy when wanting to use switch_core_session_execute_async() on the test session. * @param session to park */ -static void fst_session_park(switch_core_session_t *session) -{ - switch_ivr_park_session(session); +#define fst_session_park(session) \ + switch_ivr_park_session(session); \ switch_channel_wait_for_state(switch_core_session_get_channel(session), NULL, CS_PARK); -} - /** * check for test requirement - execute teardown on failure @@ -192,16 +197,19 @@ static void fst_session_park(switch_core_session_t *session) #define FST_CORE_BEGIN(confdir) \ FCT_BGN() \ { \ + switch_time_t fst_time_start = 0; \ switch_timer_t fst_timer = { 0 }; \ switch_memory_pool_t *fst_pool = NULL; \ + fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ fst_init_core_and_modload(confdir, NULL); \ - switch_time_t fst_time_start = 0; + { \ /** * Define the end of a freeswitch core test driver. */ #define FST_CORE_END() \ /*switch_core_destroy();*/ \ + } \ } \ FCT_END() @@ -348,6 +356,9 @@ static void fst_session_park(switch_core_session_t *session) if (fst_originate_vars) { \ switch_event_destroy(&fst_originate_vars); \ } \ + if (fst_session_pool) { \ + fst_session_pool = NULL; \ + } \ switch_core_session_rwunlock(fst_session); \ switch_sleep(1000000); \ } \ @@ -399,28 +410,29 @@ static void fst_session_park(switch_core_session_t *session) */ #define fst_test_core_asr(grammar, input_filename) \ { \ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \ - fst_asr_result = NULL; \ - fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \ /* feed file into ASR */ \ switch_status_t result; \ switch_file_handle_t file_handle = { 0 }; \ - file_handle.channels = 1; \ - file_handle.native_rate = 8000; \ - fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \ - uint8_t *buf = (uint8_t *)switch_core_alloc(fst_pool, sizeof(uint8_t) * 160 * sizeof(uint16_t) * file_handle.channels); \ + uint8_t *buf; \ size_t len = 160; \ int got_result = 0; \ + fst_asr_result = NULL; \ + file_handle.channels = 1; \ + file_handle.native_rate = 8000; \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \ + fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \ + fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \ + buf = (uint8_t *)switch_core_alloc(fst_pool, sizeof(uint8_t) * 160 * sizeof(uint16_t) * file_handle.channels); \ switch_core_timer_sync(&fst_timer); \ while ((result = switch_core_file_read(&file_handle, buf, &len)) == SWITCH_STATUS_SUCCESS) { \ fst_requires(switch_core_asr_feed(&ah, buf, len * sizeof(int16_t), &flags) == SWITCH_STATUS_SUCCESS); \ switch_core_timer_next(&fst_timer); \ if (switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS) { \ + char *xmlstr = NULL; \ + switch_event_t *headers = NULL; \ flags = SWITCH_ASR_FLAG_NONE; \ /* switch_ivr_detect_speech.. checks one in media bug then again in speech_thread */ \ fst_requires(switch_core_asr_check_results(&ah, &flags) == SWITCH_STATUS_SUCCESS); \ - char *xmlstr = NULL; \ - switch_event_t *headers = NULL; \ result = switch_core_asr_get_results(&ah, &xmlstr, &flags); \ if (result == SWITCH_STATUS_SUCCESS) { \ got_result++; \ @@ -514,7 +526,7 @@ static void fst_session_park(switch_core_session_t *session) char *args = NULL; \ fst_requires_module("mod_dptools"); \ switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \ - fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "r") == SWITCH_STATUS_SUCCESS); \ + fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ args = switch_core_session_sprintf(fst_session, "%s detect:%s %s", prompt_filename, recognizer, grammar); \ fst_requires(switch_core_session_execute_application(fst_session, "play_and_detect_speech", args) == SWITCH_STATUS_SUCCESS); \ fst_asr_result = switch_channel_get_variable(fst_channel, "detect_speech_result"); \ @@ -543,7 +555,7 @@ static void fst_session_park(switch_core_session_t *session) { \ char *args = NULL; \ fst_asr_result = NULL; \ - fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "r") == SWITCH_STATUS_SUCCESS); \ + fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ switch_status_t status = switch_ivr_play_and_detect_speech(fst_session, prompt_filename, recognizer, grammar, (char **)&fst_asr_result, 0, input_args); \ fst_check(fst_asr_result != NULL); \ } diff --git a/src/mod/applications/mod_test/Makefile.am b/src/mod/applications/mod_test/Makefile.am new file mode 100644 index 0000000000..35cf0ed45e --- /dev/null +++ b/src/mod/applications/mod_test/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/build/modmake.rulesam +MODNAME=mod_test + +mod_LTLIBRARIES = mod_test.la +mod_test_la_SOURCES = mod_test.c +mod_test_la_CFLAGS = $(AM_CFLAGS) +mod_test_la_LIBADD = $(switch_builddir)/libfreeswitch.la +mod_test_la_LDFLAGS = -avoid-version -module -no-undefined -shared + +SUBDIRS=. test diff --git a/src/mod/applications/mod_test/mod_test.c b/src/mod/applications/mod_test/mod_test.c new file mode 100644 index 0000000000..d5460ac364 --- /dev/null +++ b/src/mod/applications/mod_test/mod_test.c @@ -0,0 +1,407 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Rienzo + * + * + * mod_test.c -- mock module interfaces for testing + * + */ + +#include + + +SWITCH_MODULE_LOAD_FUNCTION(mod_test_load); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_test_shutdown); +SWITCH_MODULE_RUNTIME_FUNCTION(mod_test_runtime); +SWITCH_MODULE_DEFINITION(mod_test, mod_test_load, mod_test_shutdown, mod_test_runtime); + + +typedef enum { + ASRFLAG_READY = (1 << 0), + ASRFLAG_INPUT_TIMERS = (1 << 1), + ASRFLAG_START_OF_SPEECH = (1 << 2), + ASRFLAG_RETURNED_START_OF_SPEECH = (1 << 3), + ASRFLAG_NOINPUT_TIMEOUT = (1 << 4), + ASRFLAG_RESULT = (1 << 5), + ASRFLAG_RETURNED_RESULT = (1 << 6) +} test_asr_flag_t; + +typedef struct { + uint32_t flags; + const char *result_text; + double result_confidence; + uint32_t thresh; + uint32_t silence_ms; + uint32_t voice_ms; + int no_input_timeout; + int speech_timeout; + switch_bool_t start_input_timers; + switch_time_t no_input_time; + switch_time_t speech_time; + char *grammar; + char *channel_uuid; + switch_vad_t *vad; +} test_asr_t; + + +static void test_asr_reset(test_asr_t *context) +{ + if (context->vad) { + switch_vad_reset(context->vad); + } + context->flags = 0; + context->result_text = "agent"; + context->result_confidence = 87.3; + switch_set_flag(context, ASRFLAG_READY); + context->no_input_time = switch_micro_time_now(); + if (context->start_input_timers) { + switch_set_flag(context, ASRFLAG_INPUT_TIMERS); + } +} + +static switch_status_t test_asr_open(switch_asr_handle_t *ah, const char *codec, int rate, const char *dest, switch_asr_flag_t *flags) +{ + test_asr_t *context; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_open attempt on CLOSED asr handle\n"); + return SWITCH_STATUS_FALSE; + } + + if (!(context = (test_asr_t *) switch_core_alloc(ah->memory_pool, sizeof(*context)))) { + return SWITCH_STATUS_MEMERR; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "codec = %s, rate = %d, dest = %s\n", codec, rate, dest); + + ah->private_info = context; + ah->codec = switch_core_strdup(ah->memory_pool, codec); + + if (rate > 16000) { + ah->native_rate = 16000; + } + + context->thresh = 400; + context->silence_ms = 700; + context->voice_ms = 60; + context->start_input_timers = 1; + context->no_input_timeout = 5000; + context->speech_timeout = 10000; + + context->vad = switch_vad_init(ah->native_rate, 1); + switch_vad_set_mode(context->vad, -1); + switch_vad_set_param(context->vad, "thresh", context->thresh); + switch_vad_set_param(context->vad, "silence_ms", context->silence_ms); + switch_vad_set_param(context->vad, "voice_ms", context->voice_ms); + switch_vad_set_param(context->vad, "debug", 0); + + test_asr_reset(context); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t test_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name) +{ + test_asr_t *context = (test_asr_t *)ah->private_info; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_open attempt on CLOSED asr handle\n"); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "load grammar %s\n", grammar); + context->grammar = switch_core_strdup(ah->memory_pool, grammar); + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t test_asr_unload_grammar(switch_asr_handle_t *ah, const char *name) +{ + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t test_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags) +{ + test_asr_t *context = (test_asr_t *)ah->private_info; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Double ASR close!\n"); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_NOTICE, "ASR closing ...\n"); + + if (context->vad) { + switch_vad_destroy(&context->vad); + } + + switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED); + return status; +} + +static switch_status_t test_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_vad_state_t vad_state; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + return SWITCH_STATUS_BREAK; + } + + if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) && switch_test_flag(ah, SWITCH_ASR_FLAG_AUTO_RESUME)) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Auto Resuming\n"); + test_asr_reset(context); + } + + if (switch_test_flag(context, ASRFLAG_READY)) { + vad_state = switch_vad_process(context->vad, (int16_t *)data, len / sizeof(uint16_t)); + if (vad_state == SWITCH_VAD_STATE_STOP_TALKING) { + switch_set_flag(context, ASRFLAG_RESULT); + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "Talking stopped, have result.\n"); + switch_vad_reset(context->vad); + switch_clear_flag(context, ASRFLAG_READY); + } else if (vad_state == SWITCH_VAD_STATE_START_TALKING) { + switch_set_flag(context, ASRFLAG_START_OF_SPEECH); + context->speech_time = switch_micro_time_now(); + } + } + + return status; +} + +static switch_status_t test_asr_pause(switch_asr_handle_t *ah) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_pause attempt on CLOSED asr handle\n"); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Pausing\n"); + context->flags = 0; + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t test_asr_resume(switch_asr_handle_t *ah) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_resume attempt on CLOSED asr handle\n"); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Resuming\n"); + test_asr_reset(context); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t test_asr_check_results(switch_asr_handle_t *ah, switch_asr_flag_t *flags) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + + if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) || switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + return SWITCH_STATUS_BREAK; + } + + if (!switch_test_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH) && switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) { + return SWITCH_STATUS_SUCCESS; + } + + if ((!switch_test_flag(context, ASRFLAG_RESULT)) && (!switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT))) { + if (switch_test_flag(context, ASRFLAG_INPUT_TIMERS) && !(switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) && + context->no_input_timeout >= 0 && + (switch_micro_time_now() - context->no_input_time) / 1000 >= context->no_input_timeout) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "NO INPUT TIMEOUT %" SWITCH_TIME_T_FMT "ms\n", (switch_micro_time_now() - context->no_input_time) / 1000); + switch_set_flag(context, ASRFLAG_NOINPUT_TIMEOUT); + } else if (switch_test_flag(context, ASRFLAG_START_OF_SPEECH) && context->speech_timeout > 0 && (switch_micro_time_now() - context->speech_time) / 1000 >= context->speech_timeout) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "SPEECH TIMEOUT %" SWITCH_TIME_T_FMT "ms\n", (switch_micro_time_now() - context->speech_time) / 1000); + if (switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) { + switch_set_flag(context, ASRFLAG_RESULT); + } else { + switch_set_flag(context, ASRFLAG_NOINPUT_TIMEOUT); + } + } + } + + return switch_test_flag(context, ASRFLAG_RESULT) || switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_BREAK; +} + +static switch_status_t test_asr_get_results(switch_asr_handle_t *ah, char **resultstr, switch_asr_flag_t *flags) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_stream_handle_t result = { 0 }; + SWITCH_STANDARD_STREAM(result); + + if (switch_test_flag(context, ASRFLAG_RETURNED_RESULT) || switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + return SWITCH_STATUS_FALSE; + } + + if (switch_test_flag(context, ASRFLAG_RESULT)) { + + *resultstr = switch_mprintf("{\"grammar\": \"%s\", \"text\": \"%s\", \"confidence\": %f}", context->grammar, context->result_text, context->result_confidence); + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_ERROR, "Result: %s\n", *resultstr); + + status = SWITCH_STATUS_SUCCESS; + } else if (switch_test_flag(context, ASRFLAG_NOINPUT_TIMEOUT)) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Result: NO INPUT\n"); + + *resultstr = switch_mprintf("{\"grammar\": \"%s\", \"text\": \"\", \"confidence\": 0, \"error\": \"no_input\"}", context->grammar); + + status = SWITCH_STATUS_SUCCESS; + } else if (!switch_test_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH) && switch_test_flag(context, ASRFLAG_START_OF_SPEECH)) { + switch_set_flag(context, ASRFLAG_RETURNED_START_OF_SPEECH); + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "Result: START OF SPEECH\n"); + status = SWITCH_STATUS_BREAK; + } else { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_ERROR, "Unexpected call to asr_get_results - no results to return!\n"); + status = SWITCH_STATUS_FALSE; + } + + if (status == SWITCH_STATUS_SUCCESS) { + switch_set_flag(context, ASRFLAG_RETURNED_RESULT); + switch_clear_flag(context, ASRFLAG_READY); + } + + return status; +} + +static switch_status_t test_asr_start_input_timers(switch_asr_handle_t *ah) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + + if (switch_test_flag(ah, SWITCH_ASR_FLAG_CLOSED)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asr_start_input_timers attempt on CLOSED asr handle\n"); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "start_input_timers\n"); + + if (!switch_test_flag(context, ASRFLAG_INPUT_TIMERS)) { + switch_set_flag(context, ASRFLAG_INPUT_TIMERS); + context->no_input_time = switch_micro_time_now(); + } else { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_INFO, "Input timers already started\n"); + } + + return SWITCH_STATUS_SUCCESS; +} + +static void test_asr_text_param(switch_asr_handle_t *ah, char *param, const char *val) +{ + test_asr_t *context = (test_asr_t *) ah->private_info; + + if (!zstr(param) && !zstr(val)) { + int nval = atoi(val); + double fval = atof(val); + + if (!strcasecmp("no-input-timeout", param) && switch_is_number(val)) { + context->no_input_timeout = nval; + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "no-input-timeout = %d\n", context->no_input_timeout); + } else if (!strcasecmp("speech-timeout", param) && switch_is_number(val)) { + context->speech_timeout = nval; + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "speech-timeout = %d\n", context->speech_timeout); + } else if (!strcasecmp("start-input-timers", param)) { + context->start_input_timers = switch_true(val); + if (context->start_input_timers) { + switch_set_flag(context, ASRFLAG_INPUT_TIMERS); + } else { + switch_clear_flag(context, ASRFLAG_INPUT_TIMERS); + } + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "start-input-timers = %d\n", context->start_input_timers); + } else if (!strcasecmp("vad-mode", param)) { + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "vad-mode = %s\n", val); + if (context->vad) switch_vad_set_mode(context->vad, nval); + } else if (!strcasecmp("vad-voice-ms", param) && nval > 0) { + context->voice_ms = nval; + switch_vad_set_param(context->vad, "voice_ms", nval); + } else if (!strcasecmp("vad-silence-ms", param) && nval > 0) { + context->silence_ms = nval; + switch_vad_set_param(context->vad, "silence_ms", nval); + } else if (!strcasecmp("vad-thresh", param) && nval > 0) { + context->thresh = nval; + switch_vad_set_param(context->vad, "thresh", nval); + } else if (!strcasecmp("channel-uuid", param)) { + context->channel_uuid = switch_core_strdup(ah->memory_pool, val); + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "channel-uuid = %s\n", val); + } else if (!strcasecmp("result", param)) { + context->result_text = switch_core_strdup(ah->memory_pool, val); + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "result = %s\n", val); + } else if (!strcasecmp("confidence", param) && fval >= 0.0) { + context->result_confidence = fval; + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(context->channel_uuid), SWITCH_LOG_DEBUG, "confidence = %f\n", fval); + } + } +} + +SWITCH_MODULE_LOAD_FUNCTION(mod_test_load) +{ + switch_asr_interface_t *asr_interface; + + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + asr_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ASR_INTERFACE); + asr_interface->interface_name = "test"; + asr_interface->asr_open = test_asr_open; + asr_interface->asr_load_grammar = test_asr_load_grammar; + asr_interface->asr_unload_grammar = test_asr_unload_grammar; + asr_interface->asr_close = test_asr_close; + asr_interface->asr_feed = test_asr_feed; + asr_interface->asr_resume = test_asr_resume; + asr_interface->asr_pause = test_asr_pause; + asr_interface->asr_check_results = test_asr_check_results; + asr_interface->asr_get_results = test_asr_get_results; + asr_interface->asr_start_input_timers = test_asr_start_input_timers; + asr_interface->asr_text_param = test_asr_text_param; + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_test_shutdown) +{ + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MODULE_RUNTIME_FUNCTION(mod_test_runtime) +{ + return SWITCH_STATUS_TERM; +} + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: + */ diff --git a/src/mod/applications/mod_test/test/Makefile.am b/src/mod/applications/mod_test/test/Makefile.am new file mode 100644 index 0000000000..ed630acae0 --- /dev/null +++ b/src/mod/applications/mod_test/test/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/build/modmake.rulesam +bin_PROGRAMS = test_asr +test_asr_CFLAGS = $(AM_CFLAGS) -I../ +test_asr_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_test.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) +TESTS = $(bin_PROGRAMS) diff --git a/src/mod/applications/mod_test/test/freeswitch.xml b/src/mod/applications/mod_test/test/freeswitch.xml new file mode 100644 index 0000000000..032569cd24 --- /dev/null +++ b/src/mod/applications/mod_test/test/freeswitch.xml @@ -0,0 +1,23 @@ + + +
+ + + + + + + + +
+ +
+ + + + + + + +
+
diff --git a/src/mod/applications/mod_test/test/sounds/agent.wav b/src/mod/applications/mod_test/test/sounds/agent.wav new file mode 100644 index 0000000000000000000000000000000000000000..dc9c44ebbf5d69e4a07a83c80d2780edd87e065c GIT binary patch literal 89644 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
U@^lo6Sl$5L(0OZilr! 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 literal 0 HcmV?d00001 diff --git a/src/mod/applications/mod_test/test/sounds/test.wav b/src/mod/applications/mod_test/test/sounds/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..3c72ab4ceee7332f063edaf24fb53f2bdb5d23d8 GIT binary patch literal 76844 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 z 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�cYw? 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
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + +
+ diff --git a/tests/fst/originate_test.c b/tests/fst/originate_test.c new file mode 100644 index 0000000000..e7063b80b2 --- /dev/null +++ b/tests/fst/originate_test.c @@ -0,0 +1,139 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Rienzo + * Seven Du + * + * + * originate_test.c -- tests originate + * + */ +#include +#include + +#include + +int reporting = 0; +int destroy = 0; + +static switch_status_t my_on_reporting(switch_core_session_t *session) +{ + switch_assert(session); + reporting++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "session reporting %d\n", reporting); +} + +static switch_status_t my_on_destroy(switch_core_session_t *session) +{ + switch_assert(session); + destroy++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "session destroy %d\n", destroy); +} + +static switch_state_handler_table_t state_handlers = { + /*.on_init */ NULL, + /*.on_routing */ NULL, + /*.on_execute */ NULL, + /*.on_hangup */ NULL, + /*.on_exchange_media */ NULL, + /*.on_soft_execute */ NULL, + /*.on_consume_media */ NULL, + /*.on_hibernate */ NULL, + /*.on_reset */ NULL, + /*.on_park */ NULL, + /*.on_reporting */ my_on_reporting, + /*.on_destroy */ my_on_destroy, + SSH_FLAG_STICKY +}; + +FST_CORE_BEGIN("./conf") +{ + FST_SUITE_BEGIN(originate) + { + FST_SETUP_BEGIN() + { + fst_requires_module("mod_loopback"); + } + FST_SETUP_END() + + FST_TEARDOWN_BEGIN() + { + } + FST_TEARDOWN_END() + + FST_TEST_BEGIN(originate_test_early_state_handler) + { + switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + switch_status_t status; + switch_call_cause_t cause; + + status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, NULL); + fst_requires(session); + fst_check(status == SWITCH_STATUS_SUCCESS); + + channel = switch_core_session_get_channel(session); + fst_requires(channel); + + switch_channel_add_state_handler(channel, &state_handlers); + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + fst_check(!switch_channel_ready(channel)); + + switch_core_session_rwunlock(session); + + switch_sleep(1000000); + fst_check(reporting == 1); + fst_check(destroy == 1); + } + FST_TEST_END() + + FST_TEST_BEGIN(originate_test_late_state_handler) + { + switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + switch_status_t status; + switch_call_cause_t cause; + + status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL, NULL); + fst_requires(session); + fst_check(status == SWITCH_STATUS_SUCCESS); + + channel = switch_core_session_get_channel(session); + fst_requires(channel); + + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + switch_sleep(1000000); + switch_channel_add_state_handler(channel, &state_handlers); + + switch_core_session_rwunlock(session); + + switch_sleep(1000000); + fst_check(reporting == 1); + fst_check(destroy == 2); + } + FST_TEST_END() + } + FST_SUITE_END() +} +FST_CORE_END() From 0c8f5ed60dbfd1db574acc838ccefc146530713e Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Sat, 13 Oct 2018 00:33:08 +0000 Subject: [PATCH 55/69] FS-11453 [core] remove dependency to libtap for unit tests move all core unit tests to tests/unit --- configure.ac | 1 - src/include/test/switch_test.h | 75 ++++++++++++++----- tests/fst/.gitignore | 4 - tests/fst/Makefile.am | 8 -- tests/unit/README | 25 +------ tests/{fst => unit}/conf/freeswitch.xml | 0 tests/unit/switch_event.c | 57 ++++++++------ tests/unit/switch_hash.c | 68 ++++++++--------- .../switch_ivr_originate.c} | 4 +- tests/unit/unit.mk | 11 ++- 10 files changed, 134 insertions(+), 119 deletions(-) delete mode 100644 tests/fst/.gitignore delete mode 100644 tests/fst/Makefile.am rename tests/{fst => unit}/conf/freeswitch.xml (100%) rename tests/{fst/originate_test.c => unit/switch_ivr_originate.c} (97%) diff --git a/configure.ac b/configure.ac index 8ca3d16890..377eea25ec 100644 --- a/configure.ac +++ b/configure.ac @@ -1998,7 +1998,6 @@ AC_CONFIG_FILES([Makefile libs/xmlrpc-c/config.mk libs/xmlrpc-c/srcdir.mk libs/xmlrpc-c/stamp-h - tests/fst/Makefile scripts/gentls_cert]) AM_CONDITIONAL(ISLINUX, [test `uname -s` = Linux]) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 97fb9500d1..366051dbcd 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -66,7 +66,7 @@ static char *fst_getenv_default(const char *env, char *default_value, switch_boo /** * initialize FS core from optional configuration dir */ -static void fst_init_core_and_modload(const char *confdir, const char *basedir) +static void fst_init_core_and_modload(const char *confdir, const char *basedir, int minimal) { const char *err; // Let FreeSWITCH core pick these @@ -101,9 +101,13 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) SWITCH_GLOBAL_dirs.data_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); SWITCH_GLOBAL_dirs.localstate_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); - switch_core_init_and_modload(0, SWITCH_TRUE, &err); - switch_sleep(1 * 1000000); - switch_core_set_variable("sound_prefix", "." SWITCH_PATH_SEPARATOR); + if (!minimal) { + switch_core_init_and_modload(0, SWITCH_TRUE, &err); + switch_sleep(1 * 1000000); + switch_core_set_variable("sound_prefix", "." SWITCH_PATH_SEPARATOR); + } else { + switch_core_init(SCF_MINIMAL, SWITCH_TRUE, &err); + } } /** @@ -150,6 +154,18 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define fst_time_mark() \ fst_time_start = switch_time_now(); +/** + * Check a test /w error message + */ +#define fst_xcheck(expr, error_msg) \ + fct_xchk(expr, error_msg); + +/** + * Fail a test + */ +#define fst_fail(error_msg) \ + fct_xchk(0, error_msg); + /** * Check duration relative to test start, last marked time, or last check. */ @@ -201,7 +217,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) switch_memory_pool_t *fst_pool = NULL; \ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ if (fst_core) { \ - fst_init_core_and_modload(NULL, NULL); /* shuts up compiler */ \ + fst_init_core_and_modload(NULL, NULL, 0); /* shuts up compiler */ \ } \ { \ @@ -222,14 +238,15 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define FST_CORE_BEGIN(confdir) \ FCT_BGN() \ { \ - int fst_core = 1; \ + int fst_core = 2; \ switch_time_t fst_time_start = 0; \ switch_timer_t fst_timer = { 0 }; \ switch_memory_pool_t *fst_pool = NULL; \ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ - fst_init_core_and_modload(confdir, NULL); \ + fst_init_core_and_modload(confdir, NULL, 0); \ { + /** * Define the end of a freeswitch core test driver. */ @@ -243,6 +260,21 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) } \ FCT_END() +/** + * Minimal FS core load + */ +#define FST_MINCORE_BEGIN() \ + FCT_BGN() \ + { \ + int fst_core = 1; \ + switch_time_t fst_time_start = 0; \ + switch_timer_t fst_timer = { 0 }; \ + switch_memory_pool_t *fst_pool = NULL; \ + fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ + fst_init_core_and_modload(".", NULL, 1); /* minimal load */ \ + { + +#define FST_MINCORE_END FST_CORE_END /** * Define the beginning of a FreeSWITCH module test suite. Loads the module for test. @@ -252,8 +284,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define FST_MODULE_BEGIN(modname,suite) \ { \ const char *fst_test_module = #modname; \ - fst_requires(fst_core); \ - if (!zstr(fst_test_module)) { \ + if (fst_core && !zstr(fst_test_module)) { \ const char *err; \ switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ } \ @@ -293,7 +324,9 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) if (fst_core) { \ switch_core_new_memory_pool(&fst_pool); \ fst_requires(fst_pool != NULL); \ - fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \ + if (fst_core > 1) { \ + fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \ + } \ fst_time_mark(); \ } @@ -310,7 +343,9 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) FCT_TEARDOWN_BGN() \ if (fst_core) { \ switch_core_destroy_memory_pool(&fst_pool); \ - switch_core_timer_destroy(&fst_timer); \ + if (fst_core > 1) { \ + switch_core_timer_destroy(&fst_timer); \ + } \ } /** @@ -423,7 +458,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) char *fst_asr_result = NULL; \ switch_asr_handle_t ah = { 0 }; \ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE; \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Open recognizer: %s\n", recognizer); \ /* open ASR interface and feed recorded audio into it and collect result */ \ fst_requires(switch_core_asr_open(&ah, recognizer, "L16", 8000, "", &flags, fst_pool) == SWITCH_STATUS_SUCCESS); \ @@ -456,7 +491,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) fst_asr_result = NULL; \ file_handle.channels = 1; \ file_handle.native_rate = 8000; \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \ fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \ fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \ @@ -499,7 +534,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_pause() \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Pause recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS); @@ -511,7 +546,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_resume() \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Resume recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS); @@ -523,7 +558,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_close(&ah, flags) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_close() \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Close recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_close(&ah, &flags) == SWITCH_STATUS_SUCCESS); \ @@ -542,7 +577,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define fst_play_and_detect_speech_test_begin() \ { \ const char *fst_asr_result = NULL; \ - fst_requires(fst_core); + fst_requires(fst_core > 1); /** * Use play_and_detect_speech APP to test recognizer @@ -566,7 +601,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define fst_play_and_detect_speech_app_test(recognizer, grammar, prompt_filename, input_filename) \ { \ char *args = NULL; \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ fst_requires_module("mod_dptools"); \ switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ @@ -598,7 +633,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) { \ char *args = NULL; \ fst_asr_result = NULL; \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ switch_status_t status = switch_ivr_play_and_detect_speech(fst_session, prompt_filename, recognizer, grammar, (char **)&fst_asr_result, 0, input_args); \ fst_check(fst_asr_result != NULL); \ @@ -624,7 +659,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) { \ switch_stream_handle_t stream = { 0 }; \ SWITCH_STANDARD_STREAM(stream); \ - fst_requires(fst_core); \ + fst_requires(fst_core > 1); \ fst_requires_module("mod_commands"); \ switch_status_t api_result = switch_api_execute("sched_api", switch_core_session_sprintf(fst_session, "%s none uuid_recv_dtmf %s %s", when, switch_core_session_get_uuid(fst_session), digits), NULL, &stream); \ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fst_session), SWITCH_LOG_INFO, "Injecting DTMF %s at %s\n", digits, when); \ diff --git a/tests/fst/.gitignore b/tests/fst/.gitignore deleted file mode 100644 index 18574c0cb5..0000000000 --- a/tests/fst/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -Makefile -Makefile.in -freeswitch.xml.fsxml -originate_test diff --git a/tests/fst/Makefile.am b/tests/fst/Makefile.am deleted file mode 100644 index db33a1913b..0000000000 --- a/tests/fst/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam - -bin_PROGRAMS = originate_test -AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) -AM_CFLAGS = $(SWITCH_AM_CPPFLAGS) -AM_CPPFLAGS = $(SWITCH_AM_CPPFLAGS) - -TESTS = $(bin_PROGRAMS) diff --git a/tests/unit/README b/tests/unit/README index 681d460488..4bdd19c2cf 100644 --- a/tests/unit/README +++ b/tests/unit/README @@ -3,29 +3,6 @@ benchmarks testing functionality exposed through libfreeswitch. Requirements for a new unit tests: -1. Tests must use TAP(Test Anything Protocol) output format, and must -print to stderr the summary statistics of the test before exiting. - -2. Each test must return 0 on successful completion, or a non-zero -result in case of a failure. - -3. Benchmarking stats should be output as a TAP note at the end of the -test in a human and machine(regex) parsable format - -Use libtap from https://github.com/zorgnax/libtap -cd /usr/local/src/ -git clone https://github.com/zorgnax/libtap.git -make PREFIX=/usr install +1. Tests must use switch_test.h framework - -To run a benchmark version of a unit test, update the loops count, and -make sure to uncomment the 'BENCHMARK' define line. Then you can run -the benchmark with: - -perf record ./.libs/switch_hash - -Once that is completed you can view the results with: - -perf report - diff --git a/tests/fst/conf/freeswitch.xml b/tests/unit/conf/freeswitch.xml similarity index 100% rename from tests/fst/conf/freeswitch.xml rename to tests/unit/conf/freeswitch.xml diff --git a/tests/unit/switch_event.c b/tests/unit/switch_event.c index a893d493fb..c11dfc24d3 100644 --- a/tests/unit/switch_event.c +++ b/tests/unit/switch_event.c @@ -1,10 +1,25 @@ #include #include -#include +#include // #define BENCHMARK 1 -int main () { +FST_MINCORE_BEGIN() + +FST_SUITE_BEGIN(switch_event) + +FST_SETUP_BEGIN() +{ +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + +FST_TEST_BEGIN(benchmark) +{ switch_event_t *event = NULL; switch_bool_t verbose = SWITCH_TRUE; const char *err = NULL; @@ -18,18 +33,8 @@ int main () { #ifdef BENCHMARK switch_time_t small_start_ts, small_end_ts; - - plan(2); -#else - plan(2 + ( 2 * loops)); #endif - status = switch_core_init(SCF_MINIMAL, verbose, &err); - - if ( !ok( status == SWITCH_STATUS_SUCCESS, "Initialize FreeSWITCH core\n")) { - bail_out(0, "Bail due to failure to initialize FreeSWITCH[%s]", err); - } - index = calloc(loops, sizeof(char *)); for ( x = 0; x < loops; x++) { index[x] = switch_mprintf("%d", x); @@ -39,18 +44,18 @@ int main () { start_ts = switch_time_now(); status = switch_event_create(&event, SWITCH_EVENT_MESSAGE); - ok( status == SWITCH_STATUS_SUCCESS,"Create Event"); + fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to create event"); #ifndef BENCHMARK for ( x = 0; x < loops; x++) { status = switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, index[x], index[x]); - ok( status == SWITCH_STATUS_SUCCESS,"Add header to event"); + fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to add header to event"); } #else small_start_ts = switch_time_now(); for ( x = 0; x < loops; x++) { if ( switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, index[x], index[x]) != SWITCH_STATUS_SUCCESS) { - fail("Failed to add header to event"); + fst_fail("Failed to add header to event"); } } small_end_ts = switch_time_now(); @@ -58,20 +63,20 @@ int main () { micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - note("switch_event add_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event add_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif #ifndef BENCHMARK for ( x = 0; x < loops; x++) { - is(switch_event_get_header(event, index[x]), index[x], "correct header value returned"); + fst_check_string_equals(switch_event_get_header(event, index[x]), index[x]); } #else small_start_ts = switch_time_now(); for ( x = 0; x < loops; x++) { if ( !switch_event_get_header(event, index[x])) { - fail("Failed to lookup event header value"); + fst_fail("Failed to lookup event header value"); } } small_end_ts = switch_time_now(); @@ -79,11 +84,10 @@ int main () { micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - note("switch_event get_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event get_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif - switch_event_destroy(&event); /* END LOOPS */ @@ -97,10 +101,15 @@ int main () { micro_total = end_ts - start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - diag("switch_event Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); - switch_core_destroy(); - - done_testing(); } +FST_TEST_END() + +FST_SUITE_END() + +FST_MINCORE_END() + + + diff --git a/tests/unit/switch_hash.c b/tests/unit/switch_hash.c index 522ca6ea1c..a8d57c527c 100644 --- a/tests/unit/switch_hash.c +++ b/tests/unit/switch_hash.c @@ -1,11 +1,25 @@ #include #include -#include +#include // #define BENCHMARK 1 -int main () { +FST_MINCORE_BEGIN() +FST_SUITE_BEGIN(switch_hash) + +FST_SETUP_BEGIN() +{ +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + +FST_TEST_BEGIN(benchmark) +{ switch_event_t *event = NULL; switch_bool_t verbose = SWITCH_TRUE; const char *err = NULL; @@ -24,23 +38,7 @@ int main () { char **index = NULL; switch_hash_t *hash = NULL; -#ifndef BENCHMARK - plan(2 + ( 5 * loops)); -#else - plan(2); -#endif - - status = switch_core_init(SCF_MINIMAL, verbose, &err); - - if ( !ok( status == SWITCH_STATUS_SUCCESS, "Initialize FreeSWITCH core\n")) { - bail_out(0, "Bail due to failure to initialize FreeSWITCH[%s]", err); - } - - status = switch_core_hash_init(&hash); - - if ( !ok(status == SWITCH_STATUS_SUCCESS, "Create a new hash")) { - bail_out(0, "Bail due to failure to create hash"); - } + fst_requires(switch_core_hash_init(&hash) == SWITCH_STATUS_SUCCESS); index = calloc(loops, sizeof(char *)); for ( x = 0; x < loops; x++) { @@ -54,7 +52,7 @@ int main () { #ifndef BENCHMARK for ( x = 0; x < loops; x++) { status = switch_core_hash_insert(hash, index[x], (void *) index[x]); - ok(status == SWITCH_STATUS_SUCCESS, "Insert into the hash"); + fst_xcheck(status == SWITCH_STATUS_SUCCESS, "Failed to insert into the hash"); } #else small_start_ts = switch_time_now(); @@ -66,7 +64,7 @@ int main () { micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - note("switch_hash insert: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_hash insert: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif @@ -76,14 +74,14 @@ int main () { for ( x = 0; x < loops; x++) { char *data = NULL; data = switch_core_hash_find(hash, index[x]); - ok(data != NULL, "Successful lookup"); - is( index[x], data, "Returned correct data"); + fst_xcheck(data != NULL, "Lookup failed"); + fst_check_string_equals( index[x], data); } #else small_start_ts = switch_time_now(); for ( x = 0; x < loops; x++) { if ( ! switch_core_hash_find(hash, index[x])) { - fail("Failed to properly locate one of the values"); + fst_fail("Failed to properly locate one of the values"); } } small_end_ts = switch_time_now(); @@ -91,7 +89,7 @@ int main () { micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - note("switch_hash find: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_hash find: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif @@ -101,14 +99,14 @@ int main () { for ( x = 0; x < loops; x++) { char *data = NULL; data = switch_core_hash_delete(hash, index[x]); - ok(data != NULL, "Create a new hash"); - is( index[x], data, "Returned correct data"); + fst_xcheck(data != NULL, "Delete from the hash"); + fst_check_string_equals( index[x], data ); } #else small_start_ts = switch_time_now(); for ( x = 0; x < loops; x++) { if ( !switch_core_hash_delete(hash, index[x])) { - fail("Failed to delete and return the value"); + fst_fail("Failed to delete and return the value"); } } small_end_ts = switch_time_now(); @@ -116,7 +114,7 @@ int main () { micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - note("switch_hash delete: Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_hash delete: Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif @@ -133,10 +131,12 @@ int main () { micro_total = end_ts - start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - diag("switch_hash Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_hash Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); - - switch_core_destroy(); - - done_testing(); } +FST_TEST_END() + +FST_SUITE_END() + +FST_MINCORE_END() + diff --git a/tests/fst/originate_test.c b/tests/unit/switch_ivr_originate.c similarity index 97% rename from tests/fst/originate_test.c rename to tests/unit/switch_ivr_originate.c index e7063b80b2..3b2cb4154b 100644 --- a/tests/fst/originate_test.c +++ b/tests/unit/switch_ivr_originate.c @@ -26,7 +26,7 @@ * Seven Du * * - * originate_test.c -- tests originate + * switch_ivr_originate.c -- tests originate * */ #include @@ -69,7 +69,7 @@ static switch_state_handler_table_t state_handlers = { FST_CORE_BEGIN("./conf") { - FST_SUITE_BEGIN(originate) + FST_SUITE_BEGIN(switch_ivr_originate) { FST_SETUP_BEGIN() { diff --git a/tests/unit/unit.mk b/tests/unit/unit.mk index 68cd2e5d39..dd4ba2c00b 100644 --- a/tests/unit/unit.mk +++ b/tests/unit/unit.mk @@ -6,12 +6,19 @@ check_PROGRAMS += tests/unit/switch_event tests_unit_switch_event_SOURCES = tests/unit/switch_event.c tests_unit_switch_event_CFLAGS = $(SWITCH_AM_CFLAGS) tests_unit_switch_event_LDADD = $(FSLD) -tests_unit_switch_event_LDFLAGS = $(SWITCH_AM_LDFLAGS) -ltap +tests_unit_switch_event_LDFLAGS = $(SWITCH_AM_LDFLAGS) check_PROGRAMS += tests/unit/switch_hash tests_unit_switch_hash_SOURCES = tests/unit/switch_hash.c tests_unit_switch_hash_CFLAGS = $(SWITCH_AM_CFLAGS) tests_unit_switch_hash_LDADD = $(FSLD) -tests_unit_switch_hash_LDFLAGS = $(SWITCH_AM_LDFLAGS) -ltap +tests_unit_switch_hash_LDFLAGS = $(SWITCH_AM_LDFLAGS) + +check_PROGRAMS += tests/unit/switch_ivr_originate + +tests_unit_switch_ivr_originate_SOURCES = tests/unit/switch_ivr_originate.c +tests_unit_switch_ivr_originate_CFLAGS = $(SWITCH_AM_CFLAGS) +tests_unit_switch_ivr_originate_LDADD = $(FSLD) +tests_unit_switch_ivr_originate_LDFLAGS = $(SWITCH_AM_LDFLAGS) From 2ae3b8572172f1cf14e0dd60f2dfcf2f9434d162 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Mon, 15 Oct 2018 18:47:31 +0300 Subject: [PATCH 56/69] FS-11461: [core] Fix mod_av test code on Windows. --- src/include/test/switch_test.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 366051dbcd..c8feb17eb2 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -101,6 +101,8 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, SWITCH_GLOBAL_dirs.data_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); SWITCH_GLOBAL_dirs.localstate_dir = switch_mprintf("%s%s", basedir, SWITCH_PATH_SEPARATOR); + switch_core_set_globals(); + if (!minimal) { switch_core_init_and_modload(0, SWITCH_TRUE, &err); switch_sleep(1 * 1000000); @@ -281,6 +283,16 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, * @param modname name of module to load. * @param suite the name of this test suite */ +#ifdef WIN32 +#define FST_MODULE_BEGIN(modname,suite) \ + { \ + const char *fst_test_module = #modname; \ + if (fst_core && !zstr(fst_test_module)) { \ + const char *err; \ + switch_loadable_module_load_module((char *)"./mod", (char *)fst_test_module, SWITCH_FALSE, &err); \ + } \ + FCT_FIXTURE_SUITE_BGN(suite); +#else #define FST_MODULE_BEGIN(modname,suite) \ { \ const char *fst_test_module = #modname; \ @@ -289,10 +301,20 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ } \ FCT_FIXTURE_SUITE_BGN(suite); +#endif /** * Define the end of a FreeSWITCH module test suite. */ +#ifdef WIN32 +#define FST_MODULE_END() \ + FCT_FIXTURE_SUITE_END(); \ + if (!zstr(fst_test_module) && switch_loadable_module_exists(fst_test_module) == SWITCH_STATUS_SUCCESS) { \ + const char *err; \ + switch_loadable_module_unload_module((char *)"./mod", (char *)fst_test_module, SWITCH_FALSE, &err); \ + } \ + } +#else #define FST_MODULE_END() \ FCT_FIXTURE_SUITE_END(); \ if (!zstr(fst_test_module) && switch_loadable_module_exists(fst_test_module) == SWITCH_STATUS_SUCCESS) { \ @@ -300,7 +322,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, switch_loadable_module_unload_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ } \ } - +#endif /** * Define the beginning of a test suite not associated with a module. From b53d1caea006dd3d63bacc405ad8cb561a83c357 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Mon, 15 Oct 2018 17:22:05 +0300 Subject: [PATCH 57/69] FS-11461: [mod_av] Add test code, improve tests on Windows. --- Freeswitch.2017.sln | 5591 +++++++++-------- configure.ac | 1 + src/include/test/switch_test.h | 10 +- src/mod/applications/mod_av/Makefile.am | 2 + src/mod/applications/mod_av/test/Makefile.am | 4 + .../mod_av/test/conf/freeswitch.xml | 40 + .../mod_av/test/test_mod_av.2017.vcxproj | 203 + .../applications/mod_av/test/test_mod_av.c | 145 + 8 files changed, 3206 insertions(+), 2790 deletions(-) create mode 100644 src/mod/applications/mod_av/test/Makefile.am create mode 100644 src/mod/applications/mod_av/test/conf/freeswitch.xml create mode 100644 src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj create mode 100644 src/mod/applications/mod_av/test/test_mod_av.c diff --git a/Freeswitch.2017.sln b/Freeswitch.2017.sln index 725bb65def..04b06b3539 100644 --- a/Freeswitch.2017.sln +++ b/Freeswitch.2017.sln @@ -1,2789 +1,2802 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Endpoints", "Endpoints", "{9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Applications", "Applications", "{E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dialplans", "Dialplans", "{C5F182F9-754A-4EC5-B50F-76ED02BE13F4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Event Handlers", "Event Handlers", "{9ADF1E48-2F5C-4ED7-A893-596259FABFE0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Formats", "Formats", "{A5A27244-AD24-46E5-B01B-840CD296C91D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{CBD81696-EFB4-4D2F-8451-1B8DAA86155A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Directories", "Directories", "{B8F5B47B-8568-46EB-B320-64C17D2A98BC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Languages", "Languages", "{0C808854-54D1-4230-BFF5-77B5FD905000}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASR-TTS", "ASR-TTS", "{4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loggers", "Loggers", "{A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XML Interfaces", "XML Interfaces", "{F69A4A6B-9360-4EBB-A280-22AA3C455AC5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Libraries", "_Libraries", "{EB910B0D-F27D-4B62-B67B-DE834C99AC5B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "say", "say", "{6CD61A1D-797C-470A-BE08-8C31B68BB336}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Config", "_Config", "{57D119DC-484F-420F-B9E9-8589FD9A8DF8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default", "Default", "{3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\freeswitch.xml = conf\vanilla\freeswitch.xml - conf\vanilla\vars.xml = conf\vanilla\vars.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Build System", "_Build System", "{DB1024A8-41BF-4AD7-9AE6-13202230D1F3}" - ProjectSection(SolutionItems) = preProject - acsite.m4 = acsite.m4 - bootstrap.sh = bootstrap.sh - build\buildlib.sh = build\buildlib.sh - configure.in = configure.in - Makefile.am = Makefile.am - build\modmake.rules.in = build\modmake.rules.in - build\modules.conf.in = build\modules.conf.in - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "m4", "m4", "{CDE9B06A-3C27-4987-8FAE-DF1006BC705D}" - ProjectSection(SolutionItems) = preProject - build\config\ac_cflags_gcc_option.m4 = build\config\ac_cflags_gcc_option.m4 - build\config\ac_cflags_sun_option.m4 = build\config\ac_cflags_sun_option.m4 - build\config\ac_gcc_archflag.m4 = build\config\ac_gcc_archflag.m4 - build\config\ac_gcc_x86_cpuid.m4 = build\config\ac_gcc_x86_cpuid.m4 - build\config\ac_prog_gzip.m4 = build\config\ac_prog_gzip.m4 - build\config\ac_prog_wget.m4 = build\config\ac_prog_wget.m4 - build\config\ax_cc_maxopt.m4 = build\config\ax_cc_maxopt.m4 - build\config\ax_cflags_warn_all_ansi.m4 = build\config\ax_cflags_warn_all_ansi.m4 - build\config\ax_check_compiler_flags.m4 = build\config\ax_check_compiler_flags.m4 - build\config\ax_compiler_vendor.m4 = build\config\ax_compiler_vendor.m4 - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{3C90CCF0-2CDD-4A7A-ACFF-208C1E271692}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\autoload_configs\alsa.conf.xml = conf\vanilla\autoload_configs\alsa.conf.xml - conf\vanilla\autoload_configs\conference.conf.xml = conf\vanilla\autoload_configs\conference.conf.xml - conf\vanilla\autoload_configs\console.conf.xml = conf\vanilla\autoload_configs\console.conf.xml - conf\vanilla\autoload_configs\dialplan_directory.conf.xml = conf\vanilla\autoload_configs\dialplan_directory.conf.xml - conf\vanilla\autoload_configs\dingaling.conf.xml = conf\vanilla\autoload_configs\dingaling.conf.xml - conf\vanilla\autoload_configs\enum.conf.xml = conf\vanilla\autoload_configs\enum.conf.xml - conf\vanilla\autoload_configs\event_multicast.conf.xml = conf\vanilla\autoload_configs\event_multicast.conf.xml - conf\vanilla\autoload_configs\event_socket.conf.xml = conf\vanilla\autoload_configs\event_socket.conf.xml - conf\vanilla\autoload_configs\ivr.conf.xml = conf\vanilla\autoload_configs\ivr.conf.xml - conf\vanilla\autoload_configs\java.conf.xml = conf\vanilla\autoload_configs\java.conf.xml - conf\vanilla\autoload_configs\limit.conf.xml = conf\vanilla\autoload_configs\limit.conf.xml - conf\vanilla\autoload_configs\local_stream.conf.xml = conf\vanilla\autoload_configs\local_stream.conf.xml - conf\vanilla\autoload_configs\logfile.conf.xml = conf\vanilla\autoload_configs\logfile.conf.xml - conf\vanilla\autoload_configs\modules.conf.xml = conf\vanilla\autoload_configs\modules.conf.xml - conf\vanilla\autoload_configs\openmrcp.conf.xml = conf\vanilla\autoload_configs\openmrcp.conf.xml - conf\vanilla\autoload_configs\portaudio.conf.xml = conf\vanilla\autoload_configs\portaudio.conf.xml - conf\vanilla\autoload_configs\rss.conf.xml = conf\vanilla\autoload_configs\rss.conf.xml - conf\vanilla\autoload_configs\sofia.conf.xml = conf\vanilla\autoload_configs\sofia.conf.xml - conf\vanilla\autoload_configs\switch.conf.xml = conf\vanilla\autoload_configs\switch.conf.xml - conf\vanilla\autoload_configs\syslog.conf.xml = conf\vanilla\autoload_configs\syslog.conf.xml - conf\vanilla\autoload_configs\v8.conf.xml = conf\vanilla\autoload_configs\v8.conf.xml - conf\vanilla\autoload_configs\voicemail.conf.xml = conf\vanilla\autoload_configs\voicemail.conf.xml - conf\vanilla\autoload_configs\wanpipe.conf.xml = conf\vanilla\autoload_configs\wanpipe.conf.xml - conf\vanilla\autoload_configs\woomera.conf.xml = conf\vanilla\autoload_configs\woomera.conf.xml - conf\vanilla\autoload_configs\xml_cdr.conf.xml = conf\vanilla\autoload_configs\xml_cdr.conf.xml - conf\vanilla\autoload_configs\xml_curl.conf.xml = conf\vanilla\autoload_configs\xml_curl.conf.xml - conf\vanilla\autoload_configs\xml_rpc.conf.xml = conf\vanilla\autoload_configs\xml_rpc.conf.xml - conf\vanilla\autoload_configs\zeroconf.conf.xml = conf\vanilla\autoload_configs\zeroconf.conf.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\dialplan\default.xml = conf\vanilla\dialplan\default.xml - conf\vanilla\dialplan\public.xml = conf\vanilla\dialplan\public.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{FC71C66E-E268-4EAD-B1F5-F008DC382E83}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\sip_profiles\external.xml = conf\vanilla\sip_profiles\external.xml - conf\vanilla\sip_profiles\internal.xml = conf\vanilla\sip_profiles\internal.xml - conf\vanilla\sip_profiles\nat.xml = conf\vanilla\sip_profiles\nat.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{09455AA9-C243-4F16-A1A1-A016881A2765}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "en", "en", "{57199684-EC63-4A60-9DC6-11815AF6B413}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\en\en.xml = conf\vanilla\lang\en\en.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\de\de.xml = conf\vanilla\lang\de\de.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\fr\fr.xml = conf\vanilla\lang\fr\fr.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\de\demo\demo.xml = conf\vanilla\lang\de\demo\demo.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{CC3E7F48-2590-49CB-AD8B-BE3650F55462}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\de\vm\tts.xml = conf\vanilla\lang\de\vm\tts.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{765EF1B9-5027-4820-BC37-A44466A51631}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\en\demo\demo.xml = conf\vanilla\lang\en\demo\demo.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{713E4747-1126-40B1-BD84-58F9A7745423}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\en\vm\sounds.xml = conf\vanilla\lang\en\vm\sounds.xml - conf\vanilla\lang\en\vm\tts.xml = conf\vanilla\lang\en\vm\tts.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\fr\demo\demo.xml = conf\vanilla\lang\fr\demo\demo.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}" - ProjectSection(SolutionItems) = preProject - conf\vanilla\lang\fr\vm\sounds.xml = conf\vanilla\lang\fr\vm\sounds.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sound Files", "Sound Files", "{4F227C26-768F-46A3-8684-1D08A46FB374}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unimrcp", "unimrcp", "{62F27B1A-C919-4A70-8478-51F178F3B18F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.2017.vcxproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2017.vcxproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g729", "src\mod\codecs\mod_g729\mod_g729.2017.vcxproj", "{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sndfile", "src\mod\formats\mod_sndfile\mod_sndfile.2017.vcxproj", "{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_PortAudio", "src\mod\endpoints\mod_portaudio\mod_PortAudio.2017.vcxproj", "{5FD31A25-5D83-4794-8BEE-904DAD84CE71}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "docs", "docs\docs.2017.vcxproj", "{1A1FF289-4FD6-4285-A422-D31DD67A4723}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_xml", "src\mod\dialplans\mod_dialplan_xml\mod_dialplan_xml.2017.vcxproj", "{07113B25-D3AF-4E04-BA77-4CD1171F022C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ldap", "src\mod\directories\mod_ldap\mod_ldap.2017.vcxproj", "{EC3E5C7F-EE09-47E2-80FE-546363D14A98}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_directory", "src\mod\dialplans\mod_dialplan_directory\mod_dialplan_directory.2017.vcxproj", "{A27CCA23-1541-4337-81A4-F0A6413078A0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_multicast", "src\mod\event_handlers\mod_event_multicast\mod_event_multicast.2017.vcxproj", "{784113EF-44D9-4949-835D-7065D3C7AD08}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libteletone", "libs\libteletone\libteletone.2017.vcxproj", "{89385C74-5860-4174-9CAF-A39E7C48909C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8", "src\mod\languages\mod_v8\mod_v8.2017.vcxproj", "{9B9D2551-D6BD-4F20-8BE5-DE30E154A064}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8_skel", "src\mod\languages\mod_v8\mod_v8_skel.2017.vcxproj", "{8B754330-A434-4791-97E5-1EE67060BAC0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cepstral", "src\mod\asr_tts\mod_cepstral\mod_cepstral.2017.vcxproj", "{692F6330-4D87-4C82-81DF-40DB5892636E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.2017.vcxproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.2017.vcxproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.2017.vcxproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_console", "src\mod\loggers\mod_console\mod_console.2017.vcxproj", "{1C453396-D912-4213-89FD-9B489162B7B5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_rpc", "src\mod\xml_int\mod_xml_rpc\mod_xml_rpc.2017.vcxproj", "{CBEC7225-0C21-4DA8-978E-1F158F8AD950}" - ProjectSection(ProjectDependencies) = postProject - {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rss", "src\mod\applications\mod_rss\mod_rss.2017.vcxproj", "{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_conference", "src\mod\applications\mod_conference\mod_conference.2017.vcxproj", "{C24FB505-05D7-4319-8485-7540B44C8603}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\applications\mod_dptools\mod_dptools.2017.vcxproj", "{B5881A85-FE70-4F64-8607-2CAAE52669C6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.2017.vcxproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.2017.vcxproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.2017.vcxproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2017.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2017.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.2017.vcxproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2017.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2017.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2017.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pthread", "libs\win32\pthread\pthread.2017.vcxproj", "{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g723_1", "src\mod\codecs\mod_g723_1\mod_g723_1.2017.vcxproj", "{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_iSAC", "src\mod\codecs\mod_isac\mod_iSAC.2017.vcxproj", "{7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_native_file", "src\mod\formats\mod_native_file\mod_native_file.2017.vcxproj", "{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2017.vcxproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2017.vcxproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_curl", "src\mod\xml_int\mod_xml_curl\mod_xml_curl.2017.vcxproj", "{AB91A099-7690-4ECF-8994-E458F4EA1ED4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_en", "src\mod\say\mod_say_en\mod_say_en.2017.vcxproj", "{988CACF7-3FCB-4992-BE69-77872AE67DC8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "libs\win32\portaudio\portaudio.2017.vcxproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.2017.vcxproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.2017.vcxproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h26x", "src\mod\codecs\mod_h26x\mod_h26x.2017.vcxproj", "{2C3C2423-234B-4772-8899-D3B137E5CA35}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_esf", "src\mod\applications\mod_esf\mod_esf.2017.vcxproj", "{3850D93A-5F24-4922-BC1C-74D08C37C256}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_local_stream", "src\mod\formats\mod_local_stream\mod_local_stream.2017.vcxproj", "{2CA40887-1622-46A1-A7F9-17FD7E7E545B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_voicemail", "src\mod\applications\mod_voicemail\mod_voicemail.2017.vcxproj", "{D7F1E3F2-A3F4-474C-8555-15122571AF52}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_de", "src\mod\say\mod_say_de\mod_say_de.2017.vcxproj", "{5BC072DB-3826-48EA-AF34-FE32AA01E83B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es", "src\mod\say\mod_say_es\mod_say_es.2017.vcxproj", "{FA429E98-8B03-45E6-A096-A4BC5E821DE4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fr", "src\mod\say\mod_say_fr\mod_say_fr.2017.vcxproj", "{06E3A538-AB32-44F2-B477-755FF9CB5D37}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_it", "src\mod\say\mod_say_it\mod_say_it.2017.vcxproj", "{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_nl", "src\mod\say\mod_say_nl\mod_say_nl.2017.vcxproj", "{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fifo", "src\mod\applications\mod_fifo\mod_fifo.2017.vcxproj", "{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_db", "src\mod\applications\mod_db\mod_db.2017.vcxproj", "{F6A33240-8F29-48BD-98F0-826995911799}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_expr", "src\mod\applications\mod_expr\mod_expr.2017.vcxproj", "{65A6273D-FCAB-4C55-B09E-65100141A5D4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_asterisk", "src\mod\dialplans\mod_dialplan_asterisk\mod_dialplan_asterisk.2017.vcxproj", "{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_logfile", "src\mod\loggers\mod_logfile\mod_logfile.2017.vcxproj", "{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_csv", "src\mod\event_handlers\mod_cdr_csv\mod_cdr_csv.2017.vcxproj", "{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_tone_stream", "src\mod\formats\mod_tone_stream\mod_tone_stream.2017.vcxproj", "{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fsv", "src\mod\applications\mod_fsv\mod_fsv.2017.vcxproj", "{E3246D17-E29B-4AB5-962A-C69B0C5837BB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lua", "src\mod\languages\mod_lua\mod_lua.2017.vcxproj", "{7B077E7F-1BE7-4291-AB86-55E527B25CAC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sphinxbase", "libs\win32\sphinxbase\sphinxbase.2017.vcxproj", "{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "libs\win32\pocketsphinx\pocketsphinx.2017.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_pocketsphinx", "src\mod\asr_tts\mod_pocketsphinx\mod_pocketsphinx.2017.vcxproj", "{2286DA73-9FC5-45BC-A508-85994C3317AB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz", "libs\win32\Sound_Files\8khz.2017.vcxproj", "{7A8D8174-B355-4114-AFC1-04777CB9DE0A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz", "libs\win32\Sound_Files\16khz.2017.vcxproj", "{7EB71250-F002-4ED8-92CA-CA218114537A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz", "libs\win32\Sound_Files\32khz.2017.vcxproj", "{464AAB78-5489-4916-BE51-BF8D61822311}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_flite", "src\mod\asr_tts\mod_flite\mod_flite.2017.vcxproj", "{66444AEE-554C-11DD-A9F0-8C5D56D89593}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp3lame", "libs\win32\libmp3lame\libmp3lame.2017.vcxproj", "{E316772F-5D8F-4F2A-8F71-094C3E859D34}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libshout", "libs\win32\libshout\libshout.2017.vcxproj", "{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shout", "src\mod\formats\mod_shout\mod_shout.2017.vcxproj", "{38FE0559-9910-43A8-9E45-3E5004C27692}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libs\win32\libogg\libogg.2017.vcxproj", "{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_snom", "src\mod\applications\mod_snom\mod_snom.2017.vcxproj", "{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_zh", "src\mod\say\mod_say_zh\mod_say_zh.2017.vcxproj", "{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_managed", "src\mod\languages\mod_managed\mod_managed.2017.vcxproj", "{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSWITCH.Managed.2017", "src\mod\languages\mod_managed\managed\FreeSWITCH.Managed.2017.csproj", "{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpg123", "libs\win32\mpg123\libmpg123.2017.vcxproj", "{419C8F80-D858-4B48-A25C-AF4007608137}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_loopback", "src\mod\endpoints\mod_loopback\mod_loopback.2017.vcxproj", "{B3F424EC-3D8F-417C-B244-3919D5E1A577}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_vmd", "src\mod\applications\mod_vmd\mod_vmd.2017.vcxproj", "{14E4A972-9CFB-436D-B0A5-4943F3F80D47}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg722_1", "libs\win32\libg722_1\libg722_1.2017.vcxproj", "{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_siren", "src\mod\codecs\mod_siren\mod_siren.2017.vcxproj", "{0B6C905B-142E-4999-B39D-92FF7951E921}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libesl", "libs\esl\src\libesl.2017.vcxproj", "{CF405366-9558-4AE8-90EF-5E21B51CCB4E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fs_cli", "libs\esl\fs_cli.2017.vcxproj", "{D2FB8043-D208-4AEE-8F18-3B5857C871B9}" - ProjectSection(ProjectDependencies) = postProject - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_easyroute", "src\mod\applications\mod_easyroute\mod_easyroute.2017.vcxproj", "{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lcr", "src\mod\applications\mod_lcr\mod_lcr.2017.vcxproj", "{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtiff", "libs\spandsp\src\libtiff.2017.vcxproj", "{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libs\spandsp\src\libspandsp.2017.vcxproj", "{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libs\win32\speex\libspeex.2017.vcxproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libs\win32\speex\libspeexdsp.2017.vcxproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc", "libs\win32\ilbc\libilbc.2017.vcxproj", "{9A5DDF08-C88C-4A35-B7F6-D605228446BD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opal", "src\mod\endpoints\mod_opal\mod_opal.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-6338E2526666}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skinny", "src\mod\endpoints\mod_skinny\mod_skinny.2017.vcxproj", "{CC1DD008-9406-448D-A0AD-33C3186CFADB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtmp", "src\mod\endpoints\mod_rtmp\mod_rtmp.2017.vcxproj", "{48414740-C693-4968-9846-EE058020C64F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_at_dictionary", "libs\spandsp\src\msvc\make_at_dictionary.2017.vcxproj", "{DEE932AB-5911-4700-9EEB-8C7090A0A330}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_modem_filter", "libs\spandsp\src\msvc\make_modem_filter.2017.vcxproj", "{329A6FA0-0FCC-4435-A950-E670AEFA9838}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skel", "src\mod\applications\mod_skel\mod_skel.2017.vcxproj", "{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz music", "libs\win32\Sound_Files\8khzmusic.2017.vcxproj", "{D1ABE208-6442-4FB4-9AAD-1677E41BC870}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\Sound_Files\16khzmusic.2017.vcxproj", "{BA599D0A-4310-4505-91DA-6A6447B3E289}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2017.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2017.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2017.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_valet_parking", "src\mod\applications\mod_valet_parking\mod_valet_parking.2017.vcxproj", "{432DB165-1EB2-4781-A9C0-71E62610B20A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbroadvoice", "libs\win32\broadvoice\libbroadvoice.2017.vcxproj", "{CF70F278-3364-4395-A2E1-23501C9B8AD2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_bv", "src\mod\codecs\mod_bv\mod_bv.2017.vcxproj", "{D5C87B19-150D-4EF3-A671-96589BD2D14A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aprtoolkit", "libs\unimrcp\libs\apr-toolkit\aprtoolkit.2017.vcxproj", "{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}" - ProjectSection(ProjectDependencies) = postProject - {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpf", "libs\unimrcp\libs\mpf\mpf.2017.vcxproj", "{B5A00BFA-6083-4FAE-A097-71642D6473B5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcp", "libs\unimrcp\libs\mrcp\mrcp.2017.vcxproj", "{1C320193-46A6-4B34-9C56-8AB584FC1B56}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpclient", "libs\unimrcp\libs\mrcp-client\mrcpclient.2017.vcxproj", "{72782932-37CC-46AE-8C7F-9A7B1A6EE108}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsignaling", "libs\unimrcp\libs\mrcp-signaling\mrcpsignaling.2017.vcxproj", "{12A49562-BAB9-43A3-A21D-15B60BBB4C31}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2transport", "libs\unimrcp\libs\mrcpv2-transport\mrcpv2transport.2017.vcxproj", "{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unirtsp", "libs\unimrcp\libs\uni-rtsp\unirtsp.2017.vcxproj", "{504B3154-7A4F-459D-9877-B951021C3F1F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\unimrcp\modules\mrcp-sofiasip\mrcpsofiasip.2017.vcxproj", "{746F3632-5BB2-4570-9453-31D6D58A7D8E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpunirtsp", "libs\unimrcp\modules\mrcp-unirtsp\mrcpunirtsp.2017.vcxproj", "{DEB01ACB-D65F-4A62-AED9-58C1054499E9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_unimrcp", "src\mod\asr_tts\mod_unimrcp\mod_unimrcp.2017.vcxproj", "{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "libs\win32\celt\libcelt.2017.vcxproj", "{ABB71A76-42B0-47A4-973A-42E3D920C6FD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FSComm", "fscomm\FSComm.2017.vcxproj", "{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_curl", "src\mod\applications\mod_curl\mod_curl.2017.vcxproj", "{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_silk", "src\mod\codecs\mod_silk\mod_silk.2017.vcxproj", "{AFA983D6-4569-4F88-BA94-555ED00FD9A8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\win32\libsilk\Silk_FIX.2017.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_avmd", "src\mod\applications\mod_avmd\mod_avmd.2017.vcxproj", "{990BAA76-89D3-4E38-8479-C7B28784EFC8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spandsp", "src\mod\applications\mod_spandsp\mod_spandsp.2017.vcxproj", "{1E21AFE0-6FDB-41D2-942D-863607C24B91}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_hash", "src\mod\applications\mod_hash\mod_hash.2017.vcxproj", "{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsofia_sip_ua_static", "libs\win32\sofia\libsofia_sip_ua_static.2017.vcxproj", "{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2017.vcxproj", "{B889A18E-70A7-44B5-B2C9-47798D4F43B3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h323", "src\mod\endpoints\mod_h323\mod_h323.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-7338E2514666}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_distributor", "src\mod\applications\mod_distributor\mod_distributor.2017.vcxproj", "{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pt", "src\mod\say\mod_say_pt\mod_say_pt.2017.vcxproj", "{7C22BDFF-CC09-400C-8A09-660733980028}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_sv", "src\mod\say\mod_say_sv\mod_say_sv.2017.vcxproj", "{8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2017.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_callcenter", "src\mod\applications\mod_callcenter\mod_callcenter.2017.vcxproj", "{47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_blacklist", "src\mod\applications\mod_blacklist\mod_blacklist.2017.vcxproj", "{50AAC2CE-BFC9-4912-87CC-C6381850D735}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spy", "src\mod\applications\mod_spy\mod_spy.2017.vcxproj", "{A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_httapi", "src\mod\applications\mod_httapi\mod_httapi.2017.vcxproj", "{4748FF56-CA85-4809-97D6-A94C0FAC1D77}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_abstraction", "src\mod\applications\mod_abstraction\mod_abstraction.2017.vcxproj", "{60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sms", "src\mod\applications\mod_sms\mod_sms.2017.vcxproj", "{2469B306-B027-4FF2-8815-C9C1EA2CAE79}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xmlrpc-c", "xmlrpc-c", "{9DE35039-A8F6-4FBF-B1B6-EB527F802411}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsmlib", "src\mod\endpoints\mod_gsmopen\gsmlib\gsmlib-1.10-patched-13ubuntu\win32\gsmlib.2017.vcxproj", "{26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endpoints\mod_gsmopen\mod_gsmopen.2017.vcxproj", "{74B120FF-6935-4DFE-A142-CDB6BEA99C90}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2017.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_redis", "src\mod\applications\mod_redis\mod_redis.2017.vcxproj", "{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libjpeg", "libs\win32\libjpeg\libjpeg.2017.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abyss", "libs\win32\xmlrpc-c\abyss.2017.vcxproj", "{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}" - ProjectSection(ProjectDependencies) = postProject - {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} - {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192} - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennmtab", "libs\win32\xmlrpc-c\gennmtab.2017.vcxproj", "{BED7539C-0099-4A14-AD5D-30828F15A171}" - ProjectSection(ProjectDependencies) = postProject - {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlparse", "libs\win32\xmlrpc-c\xmlparse.2017.vcxproj", "{0D108721-EAE8-4BAF-8102-D8960EC93647}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlrpc", "libs\win32\xmlrpc-c\xmlrpc.2017.vcxproj", "{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}" - ProjectSection(ProjectDependencies) = postProject - {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} - {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmltok", "libs\win32\xmlrpc-c\xmltok.2017.vcxproj", "{B535402E-38D2-4D54-8360-423ACBD17192}" - ProjectSection(ProjectDependencies) = postProject - {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.2017", "w32\Setup\Setup.2017.wixproj", "{47213370-B933-487D-9F45-BCA26D7E2B6F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_math_fixed_tables", "libs\spandsp\src\msvc\make_math_fixed_tables.2017.vcxproj", "{2386B892-35F5-46CF-A0F0-10394D2FBF9B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt\libcbt.2017.vcxproj", "{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2017.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opus", "opus", "{ED2CA8B5-8E91-4296-A120-02BB0B674652}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "libs\win32\opus\opus.2017.vcxproj", "{FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.celt", "libs\win32\opus\opus.celt.2017.vcxproj", "{245603E3-F580-41A5-9632-B25FE3372CBF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_common", "libs\win32\opus\opus.silk_common.2017.vcxproj", "{C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_fixed", "libs\win32\opus\opus.silk_fixed.2017.vcxproj", "{8484C90D-1561-402F-A91D-2DB10F8C5171}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_float", "libs\win32\opus\opus.silk_float.2017.vcxproj", "{9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opus", "src\mod\codecs\mod_opus\mod_opus.2017.vcxproj", "{64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2017.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winFailToBan", "src\mod\languages\mod_managed\managed\examples\winFailToBan\winFailToBan.csproj", "{5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtc", "src\mod\endpoints\mod_rtc\mod_rtc.2017.vcxproj", "{3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_verto", "src\mod\endpoints\mod_verto\mod_verto.2017.vcxproj", "{5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyuv", "libs\win32\libyuv\libyuv.2017.vcxproj", "{B6E22500-3DB6-4E6E-8CD5-591B781D7D99}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvpx", "libs\win32\libvpx\libvpx.2017.vcxproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libs\win32\libpng\libpng.2017.vcxproj", "{D6973076-9317-4EF2-A0B8-B7A18AC0713E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype.2017", "libs\win32\freetype\freetype.2017.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_png", "src\mod\formats\mod_png\mod_png.2017.vcxproj", "{FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libav", "libs\win32\libav\libav.2017.vcxproj", "{841C345F-FCC7-4F64-8F54-0281CEABEB01}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_av", "src\mod\applications\mod_av\mod_av.2017.vcxproj", "{7AEE504B-23B6-4B05-829E-7CD34855F146}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libx264", "libs\win32\libx264\libx264.2017.vcxproj", "{20179127-853B-4FE9-B7C0-9E817E6A3A72}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_http_cache", "src\mod\applications\mod_http_cache\mod_http_cache.2017.vcxproj", "{87933C2D-0159-46F7-B326-E1B6E982C21E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcodec2", "libs\win32\libcodec2\libcodec2.2017.vcxproj", "{19E934D6-1484-41C8-9305-78DC42FD61F2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_codec2", "src\mod\codecs\mod_codec2\mod_codec2.2017.vcxproj", "{CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amqp", "src\mod\event_handlers\mod_amqp\mod_amqp.2017.vcxproj", "{7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_pg_csv", "src\mod\event_handlers\mod_cdr_pg_csv\mod_cdr_pg_csv.2017.vcxproj", "{411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es_ar", "src\mod\say\mod_say_es_ar\mod_say_es_ar.2017.vcxproj", "{CEEE31E6-8A08-42C7-BEBD-5EC12072C136}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fa", "src\mod\say\mod_say_fa\mod_say_fa.2017.vcxproj", "{0E469F3A-DDD0-43BA-A94F-7D93C02219F3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_he", "src\mod\say\mod_say_he\mod_say_he.2017.vcxproj", "{A3D7C6CF-AEB1-4159-B741-160EB4B37345}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hr", "src\mod\say\mod_say_hr\mod_say_hr.2017.vcxproj", "{DA7ADDF1-DA33-4194-83A5-B48DB714D35B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hu", "src\mod\say\mod_say_hu\mod_say_hu.2017.vcxproj", "{AF675478-995A-4115-90C4-B2B0D6470688}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ja", "src\mod\say\mod_say_ja\mod_say_ja.2017.vcxproj", "{07EA6E5A-D181-4ABB-BECF-67A906867D04}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pl", "src\mod\say\mod_say_pl\mod_say_pl.2017.vcxproj", "{20B15650-F910-4211-8729-AAB0F520C805}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_th", "src\mod\say\mod_say_th\mod_say_th.2017.vcxproj", "{C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_odbc_cdr", "src\mod\event_handlers\mod_odbc_cdr\mod_odbc_cdr.2017.vcxproj", "{096C9A84-55B2-4F9B-97E5-0FDF116FD25F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_sqlite", "src\mod\event_handlers\mod_cdr_sqlite\mod_cdr_sqlite.2017.vcxproj", "{2CA661A7-01DD-4532-BF88-B6629DFB544A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cv", "src\mod\applications\mod_cv\mod_cv.2017.vcxproj", "{40C4E2A2-B49B-496C-96D6-C04B890F7F88}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cidlookup", "src\mod\applications\mod_cidlookup\mod_cidlookup.2017.vcxproj", "{0A130A8B-3076-4619-BADF-9E86F621AEEC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_mongodb", "src\mod\event_handlers\mod_cdr_mongodb\mod_cdr_mongodb.2017.vcxproj", "{4DFF29B4-2976-447D-A8B3-43476451517C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ffmpeg", "libs\win32\ffmpeg\ffmpeg.2017.vcxproj", "{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - All|Win32 = All|Win32 - All|x64 = All|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|Win32.ActiveCfg = Release|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.ActiveCfg = Release|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.Build.0 = Release|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.ActiveCfg = Debug|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.Build.0 = Debug|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.ActiveCfg = Release|x64 - {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.Build.0 = Release|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|Win32.ActiveCfg = Release|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.ActiveCfg = Release|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.Build.0 = Release|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.ActiveCfg = Debug|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.Build.0 = Debug|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.ActiveCfg = Release|x64 - {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.Build.0 = Release|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|Win32.ActiveCfg = Release Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.ActiveCfg = Release Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.Build.0 = Release Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.ActiveCfg = Debug Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.Build.0 = Debug Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.ActiveCfg = Release Passthrough|x64 - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.Build.0 = Release Passthrough|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|Win32.ActiveCfg = Release|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.ActiveCfg = Release|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.Build.0 = Release|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.ActiveCfg = Debug|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.Build.0 = Debug|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.ActiveCfg = Release|x64 - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.Build.0 = Release|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|Win32.ActiveCfg = Release|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.ActiveCfg = Release|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.Build.0 = Release|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.ActiveCfg = Debug|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.Build.0 = Debug|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.ActiveCfg = Release|x64 - {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.Build.0 = Release|x64 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|Win32.ActiveCfg = Release|Win32 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64.ActiveCfg = Release|Win32 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64.ActiveCfg = Debug|Win32 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32 - {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64.ActiveCfg = Release|Win32 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|Win32.ActiveCfg = Release|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.ActiveCfg = Release|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.Build.0 = Release|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.ActiveCfg = Debug|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.Build.0 = Debug|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.ActiveCfg = Release|x64 - {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.Build.0 = Release|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|Win32.ActiveCfg = Release MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.ActiveCfg = Release MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.Build.0 = Release MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.ActiveCfg = Debug MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.Build.0 = Debug MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.ActiveCfg = Release MS-LDAP|x64 - {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.Build.0 = Release MS-LDAP|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|Win32.ActiveCfg = Release|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.ActiveCfg = Release|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.Build.0 = Release|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.ActiveCfg = Debug|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.Build.0 = Debug|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.ActiveCfg = Release|x64 - {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.Build.0 = Release|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.All|Win32.ActiveCfg = Release|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.ActiveCfg = Release|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.Build.0 = Release|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.ActiveCfg = Debug|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.Build.0 = Debug|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.ActiveCfg = Release|x64 - {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.Build.0 = Release|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.All|Win32.ActiveCfg = Release|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.ActiveCfg = Release|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.Build.0 = Release|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.ActiveCfg = Debug|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.Build.0 = Debug|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.ActiveCfg = Release|x64 - {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.Build.0 = Release|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|Win32.ActiveCfg = Release|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.ActiveCfg = Release|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.Build.0 = Release|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.ActiveCfg = Debug|Win32 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.Build.0 = Debug|Win32 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.ActiveCfg = Debug|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.Build.0 = Debug|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.ActiveCfg = Release|Win32 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.Build.0 = Release|Win32 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.ActiveCfg = Release|x64 - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.Build.0 = Release|x64 - {8B754330-A434-4791-97E5-1EE67060BAC0}.All|Win32.ActiveCfg = Release|x64 - {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.ActiveCfg = Release|x64 - {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.Build.0 = Release|x64 - {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|Win32.ActiveCfg = Debug|Win32 - {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|x64.ActiveCfg = Debug|x64 - {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|Win32.ActiveCfg = Release|Win32 - {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|x64.ActiveCfg = Release|x64 - {692F6330-4D87-4C82-81DF-40DB5892636E}.All|Win32.ActiveCfg = Release|x64 - {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.ActiveCfg = Release|x64 - {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.Build.0 = Release|x64 - {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32 - {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64.ActiveCfg = Debug|x64 - {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32 - {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64.ActiveCfg = Release|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|Win32.ActiveCfg = Release|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.ActiveCfg = Release|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.Build.0 = Release|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.ActiveCfg = Debug|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.Build.0 = Debug|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64 - {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64 - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.ActiveCfg = Debug|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.Build.0 = Debug|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.ActiveCfg = Release|x64 - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.Build.0 = Release|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.All|Win32.ActiveCfg = Release|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.ActiveCfg = Release|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.Build.0 = Release|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32 - {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32 - {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.ActiveCfg = Debug|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.Build.0 = Debug|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32 - {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32 - {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.ActiveCfg = Release|x64 - {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.Build.0 = Release|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|Win32.ActiveCfg = Release|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.ActiveCfg = Release|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.Build.0 = Release|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.ActiveCfg = Debug|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.Build.0 = Debug|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.ActiveCfg = Release|x64 - {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.Build.0 = Release|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|Win32.ActiveCfg = Release|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.ActiveCfg = Release|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.Build.0 = Release|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.ActiveCfg = Debug|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.Build.0 = Debug|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.ActiveCfg = Release|x64 - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.Build.0 = Release|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.All|Win32.ActiveCfg = Release|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.ActiveCfg = Release|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.Build.0 = Release|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32 - {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32 - {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.ActiveCfg = Debug|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.Build.0 = Debug|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32 - {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32 - {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.ActiveCfg = Release|x64 - {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.Build.0 = Release|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|Win32.ActiveCfg = Release|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.ActiveCfg = Release|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.Build.0 = Release|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.ActiveCfg = Debug|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.Build.0 = Debug|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.ActiveCfg = Release|x64 - {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.Build.0 = Release|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.All|Win32.ActiveCfg = Release|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.ActiveCfg = Release|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.Build.0 = Release|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.ActiveCfg = Debug|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.Build.0 = Debug|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64 - {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64 - {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.ActiveCfg = Debug|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.Build.0 = Debug|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.ActiveCfg = Release|x64 - {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.Build.0 = Release|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|Win32.ActiveCfg = Release DLL|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.ActiveCfg = Release DLL|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.Build.0 = Release DLL|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug|Win32 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug|Win32 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.ActiveCfg = Debug|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.Build.0 = Debug|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release|Win32 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release|Win32 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.ActiveCfg = Release|x64 - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.Build.0 = Release|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|Win32.ActiveCfg = Release|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.ActiveCfg = Release|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.Build.0 = Release|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.ActiveCfg = Debug|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.Build.0 = Debug|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64 - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64 - {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.ActiveCfg = Debug|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.Build.0 = Debug|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64 - {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64 - {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.ActiveCfg = Debug|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.Build.0 = Debug|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.ActiveCfg = Release|x64 - {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.Build.0 = Release|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|Win32.ActiveCfg = Release DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.ActiveCfg = Release DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.Build.0 = Release DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.ActiveCfg = Debug DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.Build.0 = Debug DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.ActiveCfg = Release DLL|x64 - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.Build.0 = Release DLL|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|Win32.ActiveCfg = Release Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.ActiveCfg = Release Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.Build.0 = Release Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.ActiveCfg = Debug Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.Build.0 = Debug Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.ActiveCfg = Release Passthrough|x64 - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.Build.0 = Release Passthrough|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|Win32.ActiveCfg = Release|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.ActiveCfg = Release|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.Build.0 = Release|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.Build.0 = Debug|Win32 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.ActiveCfg = Debug|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.Build.0 = Debug|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.ActiveCfg = Release|Win32 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.Build.0 = Release|Win32 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.ActiveCfg = Release|x64 - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.Build.0 = Release|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|Win32.ActiveCfg = Release|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.ActiveCfg = Release|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.Build.0 = Release|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.ActiveCfg = Debug|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.Build.0 = Debug|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.ActiveCfg = Release|x64 - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.Build.0 = Release|x64 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32 - {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64 - {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|Win32.ActiveCfg = Release|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.ActiveCfg = Release|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.Build.0 = Release|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.ActiveCfg = Debug|Win32 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.Build.0 = Debug|Win32 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.ActiveCfg = Debug|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.Build.0 = Debug|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.ActiveCfg = Release|Win32 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.Build.0 = Release|Win32 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.ActiveCfg = Release|x64 - {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.Build.0 = Release|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|Win32.ActiveCfg = Release|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.ActiveCfg = Release|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.Build.0 = Release|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.ActiveCfg = Debug|Win32 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.Build.0 = Debug|Win32 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.ActiveCfg = Debug|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.Build.0 = Debug|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.ActiveCfg = Release|Win32 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.Build.0 = Release|Win32 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.ActiveCfg = Release|x64 - {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.Build.0 = Release|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|Win32.ActiveCfg = Release DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.ActiveCfg = Release DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.Build.0 = Release DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug DirectSound|Win32 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug DirectSound|Win32 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release DirectSound|Win32 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release DirectSound|Win32 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release DirectSound|x64 - {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release DirectSound|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.ActiveCfg = Debug|Win32 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.Build.0 = Debug|Win32 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.ActiveCfg = Debug|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.Build.0 = Debug|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.ActiveCfg = Release|Win32 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.Build.0 = Release|Win32 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.ActiveCfg = Release|x64 - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.Build.0 = Release|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|Win32.ActiveCfg = Release Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.ActiveCfg = Release Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.Build.0 = Release Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.Build.0 = Debug Passthrough|Win32 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.ActiveCfg = Debug Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.Build.0 = Debug Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.ActiveCfg = Release Passthrough|Win32 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.Build.0 = Release Passthrough|Win32 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.ActiveCfg = Release Passthrough|x64 - {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.Build.0 = Release Passthrough|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|Win32.ActiveCfg = Release|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.ActiveCfg = Release|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.Build.0 = Release|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.ActiveCfg = Debug|Win32 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.Build.0 = Debug|Win32 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.ActiveCfg = Debug|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.Build.0 = Debug|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.ActiveCfg = Release|Win32 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.Build.0 = Release|Win32 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.ActiveCfg = Release|x64 - {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.Build.0 = Release|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|Win32.ActiveCfg = Release|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.ActiveCfg = Release|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.Build.0 = Release|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.ActiveCfg = Debug|Win32 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.Build.0 = Debug|Win32 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.ActiveCfg = Debug|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.Build.0 = Debug|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|x64 - {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.Build.0 = Release|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|Win32.ActiveCfg = Release|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.ActiveCfg = Release|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.Build.0 = Release|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.Build.0 = Debug|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|x64 - {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.Build.0 = Release|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|Win32.ActiveCfg = Release|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.ActiveCfg = Release|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.Build.0 = Release|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.Build.0 = Debug|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|x64 - {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.Build.0 = Release|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|Win32.ActiveCfg = Release|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.ActiveCfg = Release|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.Build.0 = Release|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.ActiveCfg = Debug|Win32 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.Build.0 = Debug|Win32 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.ActiveCfg = Debug|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.Build.0 = Debug|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.ActiveCfg = Release|Win32 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.Build.0 = Release|Win32 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.ActiveCfg = Release|x64 - {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.Build.0 = Release|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|Win32.ActiveCfg = Release|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.ActiveCfg = Release|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.Build.0 = Release|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.ActiveCfg = Debug|Win32 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.Build.0 = Debug|Win32 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.ActiveCfg = Debug|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.Build.0 = Debug|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.ActiveCfg = Release|Win32 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.Build.0 = Release|Win32 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.ActiveCfg = Release|x64 - {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.Build.0 = Release|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|Win32.ActiveCfg = Release|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.ActiveCfg = Release|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.Build.0 = Release|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.ActiveCfg = Debug|Win32 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.Build.0 = Debug|Win32 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.ActiveCfg = Debug|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.Build.0 = Debug|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.ActiveCfg = Release|Win32 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.Build.0 = Release|Win32 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.ActiveCfg = Release|x64 - {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.Build.0 = Release|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|Win32.ActiveCfg = Release|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.ActiveCfg = Release|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.Build.0 = Release|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.ActiveCfg = Debug|Win32 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.Build.0 = Debug|Win32 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.ActiveCfg = Debug|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.Build.0 = Debug|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.ActiveCfg = Release|Win32 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.Build.0 = Release|Win32 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.ActiveCfg = Release|x64 - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.Build.0 = Release|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|Win32.ActiveCfg = Release|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.ActiveCfg = Release|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.Build.0 = Release|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.ActiveCfg = Debug|Win32 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.Build.0 = Debug|Win32 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.ActiveCfg = Debug|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.Build.0 = Debug|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.ActiveCfg = Release|Win32 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.Build.0 = Release|Win32 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.ActiveCfg = Release|x64 - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.Build.0 = Release|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|Win32.ActiveCfg = Release|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.ActiveCfg = Release|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.Build.0 = Release|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.ActiveCfg = Debug|Win32 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.Build.0 = Debug|Win32 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.ActiveCfg = Debug|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.Build.0 = Debug|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.ActiveCfg = Release|Win32 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.Build.0 = Release|Win32 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.ActiveCfg = Release|x64 - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.Build.0 = Release|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.All|Win32.ActiveCfg = Release|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.ActiveCfg = Release|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.Build.0 = Release|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.ActiveCfg = Debug|Win32 - {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.Build.0 = Debug|Win32 - {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.ActiveCfg = Debug|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.Build.0 = Debug|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.ActiveCfg = Release|Win32 - {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.Build.0 = Release|Win32 - {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.ActiveCfg = Release|x64 - {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.Build.0 = Release|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|Win32.ActiveCfg = Release|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.ActiveCfg = Release|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.Build.0 = Release|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.ActiveCfg = Debug|Win32 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.Build.0 = Debug|Win32 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.ActiveCfg = Debug|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.Build.0 = Debug|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.ActiveCfg = Release|Win32 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.Build.0 = Release|Win32 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.ActiveCfg = Release|x64 - {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.Build.0 = Release|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|Win32.ActiveCfg = Release|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.ActiveCfg = Release|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.Build.0 = Release|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.ActiveCfg = Debug|Win32 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.Build.0 = Debug|Win32 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.ActiveCfg = Debug|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.Build.0 = Debug|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.ActiveCfg = Release|Win32 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.Build.0 = Release|Win32 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.ActiveCfg = Release|x64 - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.Build.0 = Release|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|Win32.ActiveCfg = Release|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.ActiveCfg = Release|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.Build.0 = Release|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.ActiveCfg = Debug|Win32 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.Build.0 = Debug|Win32 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.ActiveCfg = Debug|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.Build.0 = Debug|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.ActiveCfg = Release|Win32 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.Build.0 = Release|Win32 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.ActiveCfg = Release|x64 - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.Build.0 = Release|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|Win32.ActiveCfg = Release|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.ActiveCfg = Release|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.Build.0 = Release|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.ActiveCfg = Debug|Win32 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.Build.0 = Debug|Win32 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.ActiveCfg = Debug|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.Build.0 = Debug|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.ActiveCfg = Release|Win32 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.Build.0 = Release|Win32 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.ActiveCfg = Release|x64 - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.Build.0 = Release|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|Win32.ActiveCfg = Release|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.ActiveCfg = Release|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.Build.0 = Release|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.ActiveCfg = Debug|Win32 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.Build.0 = Debug|Win32 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.ActiveCfg = Debug|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.Build.0 = Debug|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.ActiveCfg = Release|Win32 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.Build.0 = Release|Win32 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.ActiveCfg = Release|x64 - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.Build.0 = Release|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|Win32.ActiveCfg = Release|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.ActiveCfg = Release|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.Build.0 = Release|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.ActiveCfg = Debug|Win32 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.Build.0 = Debug|Win32 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.ActiveCfg = Debug|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.Build.0 = Debug|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.ActiveCfg = Release|Win32 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.Build.0 = Release|Win32 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.ActiveCfg = Release|x64 - {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.Build.0 = Release|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|Win32.ActiveCfg = Release|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.ActiveCfg = Release|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.Build.0 = Release|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.Build.0 = Debug|Win32 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.ActiveCfg = Debug|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.Build.0 = Debug|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.Build.0 = Release|Win32 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.ActiveCfg = Release|x64 - {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.Build.0 = Release|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|Win32.ActiveCfg = Debug|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.ActiveCfg = Debug|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.Build.0 = Debug|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.ActiveCfg = Debug|Win32 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.Build.0 = Debug|Win32 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.ActiveCfg = Debug|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.Build.0 = Debug|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.ActiveCfg = Release|Win32 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.Build.0 = Release|Win32 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.ActiveCfg = Release|x64 - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.Build.0 = Release|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.All|Win32.ActiveCfg = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.ActiveCfg = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.Build.0 = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64 - {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|Win32.ActiveCfg = Release|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.ActiveCfg = Release|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.Build.0 = Release|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.ActiveCfg = Debug|Win32 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.Build.0 = Debug|Win32 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.ActiveCfg = Debug|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.Build.0 = Debug|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.ActiveCfg = Release|Win32 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.Build.0 = Release|Win32 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.ActiveCfg = Release|x64 - {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.Build.0 = Release|x64 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.ActiveCfg = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.Build.0 = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.ActiveCfg = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64 - {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64 - {7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32 - {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32 - {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32 - {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.Build.0 = Debug|Win32 - {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64 - {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32 - {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64 - {464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32 - {464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32 - {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32 - {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.Build.0 = Debug|Win32 - {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64 - {464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32 - {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.Build.0 = Release|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.ActiveCfg = Release|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.Build.0 = Release|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.ActiveCfg = Debug|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.Build.0 = Debug|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.ActiveCfg = Debug|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.Build.0 = Debug|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.ActiveCfg = Release|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.Build.0 = Release|Win32 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.ActiveCfg = Release|x64 - {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.Build.0 = Release|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|Win32.ActiveCfg = Debug|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.ActiveCfg = Debug|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.Build.0 = Debug|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.ActiveCfg = Debug|Win32 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.Build.0 = Debug|Win32 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.ActiveCfg = Debug|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.Build.0 = Debug|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.ActiveCfg = Release|Win32 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.Build.0 = Release|Win32 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.ActiveCfg = Release|x64 - {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.Build.0 = Release|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|Win32.ActiveCfg = Debug|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.ActiveCfg = Debug|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.Build.0 = Debug|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.ActiveCfg = Debug|Win32 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.Build.0 = Debug|Win32 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.ActiveCfg = Debug|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.Build.0 = Debug|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.ActiveCfg = Release|Win32 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.Build.0 = Release|Win32 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.ActiveCfg = Release|x64 - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.Build.0 = Release|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.All|Win32.ActiveCfg = Release|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.ActiveCfg = Release|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.Build.0 = Release|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.ActiveCfg = Debug|Win32 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.Build.0 = Debug|Win32 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.ActiveCfg = Debug|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.Build.0 = Debug|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.ActiveCfg = Release|Win32 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.Build.0 = Release|Win32 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.ActiveCfg = Release|x64 - {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.Build.0 = Release|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|Win32.ActiveCfg = Debug|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.ActiveCfg = Debug|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.Build.0 = Debug|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.ActiveCfg = Debug|Win32 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.Build.0 = Debug|Win32 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.ActiveCfg = Debug|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.Build.0 = Debug|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.ActiveCfg = Release|Win32 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.Build.0 = Release|Win32 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.ActiveCfg = Release|x64 - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.Build.0 = Release|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|Win32.ActiveCfg = Release|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.ActiveCfg = Release|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.Build.0 = Release|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.ActiveCfg = Debug|Win32 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.Build.0 = Debug|Win32 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.ActiveCfg = Debug|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.Build.0 = Debug|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.ActiveCfg = Release|Win32 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.Build.0 = Release|Win32 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.ActiveCfg = Release|x64 - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.Build.0 = Release|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|Win32.ActiveCfg = Release|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.ActiveCfg = Release|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.Build.0 = Release|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.ActiveCfg = Debug|Win32 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.Build.0 = Debug|Win32 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.ActiveCfg = Debug|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.Build.0 = Debug|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.ActiveCfg = Release|Win32 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.Build.0 = Release|Win32 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.ActiveCfg = Release|x64 - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.Build.0 = Release|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|Win32.ActiveCfg = Release_Mono|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.ActiveCfg = Release_Mono|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.Build.0 = Release_Mono|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.ActiveCfg = Debug_CLR|Win32 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.Build.0 = Debug_CLR|Win32 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.ActiveCfg = Debug_CLR|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.Build.0 = Debug_CLR|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.ActiveCfg = Release_CLR|Win32 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.Build.0 = Release_CLR|Win32 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.ActiveCfg = Release_CLR|x64 - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.Build.0 = Release_CLR|x64 - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|Win32.ActiveCfg = Release|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64.ActiveCfg = Release|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.ActiveCfg = Debug|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.Build.0 = Debug|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.ActiveCfg = Debug|x64 - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.Build.0 = Debug|x64 - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.ActiveCfg = Release|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.Build.0 = Release|Any CPU - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.ActiveCfg = Release|x64 - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.Build.0 = Release|x64 - {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.ActiveCfg = Debug_Generic_Dll|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.Build.0 = Debug_Generic_Dll|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.ActiveCfg = Debug_Generic_Dll|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.ActiveCfg = Debug_Generic|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.Build.0 = Debug_Generic|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.ActiveCfg = Debug_Generic|x64 - {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.Build.0 = Debug_Generic|x64 - {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.ActiveCfg = Release_Generic|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.Build.0 = Release_Generic|Win32 - {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.ActiveCfg = Release_Generic|x64 - {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.Build.0 = Release_Generic|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|Win32.ActiveCfg = Release|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.ActiveCfg = Release|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.Build.0 = Release|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.ActiveCfg = Debug|Win32 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.Build.0 = Debug|Win32 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.ActiveCfg = Debug|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.Build.0 = Debug|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|x64 - {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.Build.0 = Release|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|Win32.ActiveCfg = Release|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.ActiveCfg = Release|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.Build.0 = Release|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.Build.0 = Debug|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|x64 - {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.Build.0 = Release|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|Win32.ActiveCfg = Release|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.ActiveCfg = Release|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.Build.0 = Release|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.ActiveCfg = Debug|Win32 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.Build.0 = Debug|Win32 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.ActiveCfg = Debug|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.Build.0 = Debug|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.ActiveCfg = Release|Win32 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.Build.0 = Release|Win32 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.ActiveCfg = Release|x64 - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.Build.0 = Release|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.All|Win32.ActiveCfg = Release|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.ActiveCfg = Release|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.Build.0 = Release|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.ActiveCfg = Debug|Win32 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.Build.0 = Debug|Win32 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.ActiveCfg = Debug|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.Build.0 = Debug|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.ActiveCfg = Release|Win32 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.Build.0 = Release|Win32 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.ActiveCfg = Release|x64 - {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.Build.0 = Release|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|Win32.ActiveCfg = Release|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.ActiveCfg = Release|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.Build.0 = Release|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.ActiveCfg = Debug|Win32 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.Build.0 = Debug|Win32 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.ActiveCfg = Debug|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.Build.0 = Debug|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.ActiveCfg = Release|Win32 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.Build.0 = Release|Win32 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.ActiveCfg = Release|x64 - {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.Build.0 = Release|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|Win32.ActiveCfg = Release|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.ActiveCfg = Release|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.Build.0 = Release|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.ActiveCfg = Debug|Win32 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.Build.0 = Debug|Win32 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.ActiveCfg = Debug|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.Build.0 = Debug|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.ActiveCfg = Release|Win32 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.Build.0 = Release|Win32 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.ActiveCfg = Release|x64 - {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.Build.0 = Release|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|Win32.ActiveCfg = Release|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.ActiveCfg = Release|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.Build.0 = Release|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.ActiveCfg = Debug|Win32 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.Build.0 = Debug|Win32 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.ActiveCfg = Debug|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.Build.0 = Debug|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.ActiveCfg = Release|Win32 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.Build.0 = Release|Win32 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.ActiveCfg = Release|x64 - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.Build.0 = Release|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|Win32.ActiveCfg = Release|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.ActiveCfg = Release|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.Build.0 = Release|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.Build.0 = Debug|Win32 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.ActiveCfg = Debug|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.Build.0 = Debug|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.ActiveCfg = Release|Win32 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.Build.0 = Release|Win32 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.ActiveCfg = Release|x64 - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.Build.0 = Release|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64 - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64 - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.ActiveCfg = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.Build.0 = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.ActiveCfg = Release_Dynamic|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.Build.0 = Release_Dynamic|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.ActiveCfg = Debug|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.Build.0 = Debug|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.ActiveCfg = Release|x64 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.Build.0 = Release|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|Win32.ActiveCfg = Release_Static_SSE|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.ActiveCfg = Release_Static_SSE|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.Build.0 = Release_Static_SSE|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.Build.0 = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.ActiveCfg = Debug|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.Build.0 = Debug|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.Build.0 = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.ActiveCfg = Release|x64 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.Build.0 = Release|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|Win32.ActiveCfg = Release|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.ActiveCfg = Release|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.Build.0 = Release|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.Build.0 = Debug|Win32 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.ActiveCfg = Debug|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.Build.0 = Debug|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.ActiveCfg = Release|Win32 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.Build.0 = Release|Win32 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.ActiveCfg = Release|x64 - {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.Build.0 = Release|x64 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.Build.0 = Release|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|Win32.ActiveCfg = Debug|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64.ActiveCfg = Debug|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|Win32.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64.ActiveCfg = Release|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|Win32.ActiveCfg = Release|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64.ActiveCfg = Release|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.ActiveCfg = Debug|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.Build.0 = Debug|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.ActiveCfg = Debug|x64 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.Build.0 = Debug|x64 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.ActiveCfg = Release|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.Build.0 = Release|Win32 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.ActiveCfg = Release|x64 - {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.Build.0 = Release|x64 - {48414740-C693-4968-9846-EE058020C64F}.All|Win32.ActiveCfg = Release|Win32 - {48414740-C693-4968-9846-EE058020C64F}.All|x64.ActiveCfg = Release|Win32 - {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.ActiveCfg = Debug|Win32 - {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.Build.0 = Debug|Win32 - {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.ActiveCfg = Debug|x64 - {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.Build.0 = Debug|x64 - {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.ActiveCfg = Release|Win32 - {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.Build.0 = Release|Win32 - {48414740-C693-4968-9846-EE058020C64F}.Release|x64.ActiveCfg = Release|x64 - {48414740-C693-4968-9846-EE058020C64F}.Release|x64.Build.0 = Release|x64 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.Build.0 = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.Build.0 = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32 - {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.Build.0 = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.Build.0 = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.Build.0 = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32 - {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.Build.0 = All|Win32 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|Win32.ActiveCfg = Release|x64 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.ActiveCfg = Release|x64 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.Build.0 = Release|x64 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|Win32.ActiveCfg = Debug|Win32 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64.ActiveCfg = Debug|x64 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|Win32.ActiveCfg = Release|Win32 - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64.ActiveCfg = Release|x64 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.ActiveCfg = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.Build.0 = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.ActiveCfg = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64 - {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.Build.0 = Debug|Win32 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32 - {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.Build.0 = Debug|Win32 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32 - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.Build.0 = Debug|Win32 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.ActiveCfg = Debug|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.Build.0 = Debug|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.ActiveCfg = Release|Win32 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.Build.0 = Release|Win32 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.ActiveCfg = Release|x64 - {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.Build.0 = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.ActiveCfg = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.Build.0 = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.ActiveCfg = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.Build.0 = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.ActiveCfg = Debug|Win32 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.Build.0 = Debug|Win32 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.ActiveCfg = Debug|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.Build.0 = Debug|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.ActiveCfg = Release|Win32 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.Build.0 = Release|Win32 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.ActiveCfg = Release|x64 - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.Build.0 = Release|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|Win32.ActiveCfg = Release|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64.ActiveCfg = Release|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.ActiveCfg = Debug|Win32 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.Build.0 = Debug|Win32 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.ActiveCfg = Debug|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.Build.0 = Debug|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.ActiveCfg = Release|Win32 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.Build.0 = Release|Win32 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.ActiveCfg = Release|x64 - {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.Build.0 = Release|x64 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.ActiveCfg = Release|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.Build.0 = Release|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64.ActiveCfg = Release|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.ActiveCfg = Debug|x64 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.Build.0 = Debug|x64 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.ActiveCfg = Release|x64 - {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.Build.0 = Release|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|Win32.ActiveCfg = Release|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.ActiveCfg = Release|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.Build.0 = Release|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.ActiveCfg = Debug|Win32 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.Build.0 = Debug|Win32 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.ActiveCfg = Debug|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.Build.0 = Debug|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.ActiveCfg = Release|Win32 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64 - {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64 - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64 - {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64 - {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64 - {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64 - {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64 - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64 - {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64 - {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64 - {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64 - {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64 - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.ActiveCfg = Debug|Win32 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.Build.0 = Debug|Win32 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.ActiveCfg = Debug|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.Build.0 = Debug|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.ActiveCfg = Release|Win32 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.Build.0 = Release|Win32 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.ActiveCfg = Release|x64 - {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.Build.0 = Release|x64 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.ActiveCfg = Release|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.Build.0 = Release|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64.ActiveCfg = Release|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|Win32.ActiveCfg = Debug|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64.ActiveCfg = Debug|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|Win32.ActiveCfg = Release|Win32 - {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64.ActiveCfg = Release|Win32 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|Win32.ActiveCfg = Release|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.ActiveCfg = Release|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.Build.0 = Release|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.ActiveCfg = Debug|Win32 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.Build.0 = Debug|Win32 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.ActiveCfg = Debug|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.Build.0 = Debug|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.ActiveCfg = Release|Win32 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.Build.0 = Release|Win32 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.ActiveCfg = Release|x64 - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.Build.0 = Release|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|Win32.ActiveCfg = Release|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.ActiveCfg = Release|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.Build.0 = Release|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.ActiveCfg = Debug|Win32 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.Build.0 = Debug|Win32 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.ActiveCfg = Debug|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.Build.0 = Debug|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.ActiveCfg = Release|Win32 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.Build.0 = Release|Win32 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.ActiveCfg = Release|x64 - {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.Build.0 = Release|x64 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.ActiveCfg = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.Build.0 = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64.ActiveCfg = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.ActiveCfg = Debug|x64 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.Build.0 = Debug|x64 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.ActiveCfg = Release|x64 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.Build.0 = Release|x64 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.ActiveCfg = Release|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.Build.0 = Release|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64.ActiveCfg = Release|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.ActiveCfg = Debug|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.Build.0 = Debug|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.ActiveCfg = Debug|x64 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.Build.0 = Debug|x64 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.ActiveCfg = Release|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.Build.0 = Release|Win32 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.ActiveCfg = Release|x64 - {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.Build.0 = Release|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|Win32.ActiveCfg = Release|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.ActiveCfg = Release|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.Build.0 = Release|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.ActiveCfg = Debug|Win32 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.Build.0 = Debug|Win32 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.ActiveCfg = Debug|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.Build.0 = Debug|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.ActiveCfg = Release|Win32 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.Build.0 = Release|Win32 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.ActiveCfg = Release|x64 - {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.Build.0 = Release|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|Win32.ActiveCfg = Release|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.ActiveCfg = Release|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.Build.0 = Release|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.ActiveCfg = Debug|Win32 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.Build.0 = Debug|Win32 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.ActiveCfg = Debug|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.Build.0 = Debug|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.ActiveCfg = Release|Win32 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.Build.0 = Release|Win32 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.ActiveCfg = Release|x64 - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.Build.0 = Release|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|Win32.ActiveCfg = Release|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.ActiveCfg = Release|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.Build.0 = Release|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.ActiveCfg = Debug|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.Build.0 = Debug|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.ActiveCfg = Release|x64 - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.Build.0 = Release|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|Win32.ActiveCfg = Release|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.ActiveCfg = Release|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.Build.0 = Release|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.ActiveCfg = Debug|Win32 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.Build.0 = Debug|Win32 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.Build.0 = Debug|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.Build.0 = Release|Win32 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|x64 - {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.Build.0 = Release|x64 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.Build.0 = Release|Win32 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|Win32.ActiveCfg = Debug|Win32 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64.ActiveCfg = Debug|x64 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|Win32.ActiveCfg = Release|Win32 - {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64.ActiveCfg = Release|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|Win32.ActiveCfg = Release|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.ActiveCfg = Release|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.Build.0 = Release|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.ActiveCfg = Debug|Win32 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.Build.0 = Debug|Win32 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.ActiveCfg = Debug|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.Build.0 = Debug|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.ActiveCfg = Release|Win32 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.Build.0 = Release|Win32 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.ActiveCfg = Release|x64 - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.Build.0 = Release|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.All|Win32.ActiveCfg = Release|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.ActiveCfg = Release|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.Build.0 = Release|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.ActiveCfg = Debug|Win32 - {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.Build.0 = Debug|Win32 - {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.ActiveCfg = Debug|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.Build.0 = Debug|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.ActiveCfg = Release|Win32 - {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.Build.0 = Release|Win32 - {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.ActiveCfg = Release|x64 - {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.Build.0 = Release|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.ActiveCfg = Release|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.Build.0 = Release|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.ActiveCfg = Release|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.Build.0 = Release|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.ActiveCfg = Debug|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.Build.0 = Debug|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.ActiveCfg = Debug|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.Build.0 = Debug|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.ActiveCfg = Release|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.Build.0 = Release|Win32 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.ActiveCfg = Release|x64 - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.Build.0 = Release|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64 - {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|Win32.ActiveCfg = Release|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.ActiveCfg = Release|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.Build.0 = Release|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.ActiveCfg = Debug|Win32 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.Build.0 = Debug|Win32 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.ActiveCfg = Debug|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.Build.0 = Debug|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.ActiveCfg = Release|Win32 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.Build.0 = Release|Win32 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.ActiveCfg = Release|x64 - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.Build.0 = Release|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|Win32.ActiveCfg = Release|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.ActiveCfg = Release|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.Build.0 = Release|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.ActiveCfg = Debug|Win32 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.Build.0 = Debug|Win32 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.ActiveCfg = Debug|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.Build.0 = Debug|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.ActiveCfg = Release|Win32 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.Build.0 = Release|Win32 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.ActiveCfg = Release|x64 - {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.Build.0 = Release|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|Win32.ActiveCfg = Release|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.ActiveCfg = Release|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.Build.0 = Release|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.ActiveCfg = Debug|Win32 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.Build.0 = Debug|Win32 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.ActiveCfg = Debug|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.Build.0 = Debug|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.ActiveCfg = Release|Win32 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.Build.0 = Release|Win32 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.ActiveCfg = Release|x64 - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.Build.0 = Release|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|Win32.ActiveCfg = Release|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.ActiveCfg = Release|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.Build.0 = Release|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.ActiveCfg = Debug|Win32 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.Build.0 = Debug|Win32 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.ActiveCfg = Debug|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.Build.0 = Debug|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.ActiveCfg = Release|Win32 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.Build.0 = Release|Win32 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.ActiveCfg = Release|x64 - {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.Build.0 = Release|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|Win32.ActiveCfg = Release|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.ActiveCfg = Release|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.Build.0 = Release|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.ActiveCfg = Debug|Win32 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.Build.0 = Debug|Win32 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.ActiveCfg = Debug|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.Build.0 = Debug|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.ActiveCfg = Release|Win32 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.Build.0 = Release|Win32 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.ActiveCfg = Release|x64 - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.Build.0 = Release|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|Win32.ActiveCfg = Release|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.ActiveCfg = Release|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.Build.0 = Release|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.ActiveCfg = Debug|Win32 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.Build.0 = Debug|Win32 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.ActiveCfg = Debug|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.Build.0 = Debug|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.ActiveCfg = Release|Win32 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.Build.0 = Release|Win32 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.ActiveCfg = Release|x64 - {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.Build.0 = Release|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|Win32.ActiveCfg = Release|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.ActiveCfg = Release|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.Build.0 = Release|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.ActiveCfg = Debug|Win32 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.Build.0 = Debug|Win32 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.ActiveCfg = Debug|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.Build.0 = Debug|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.ActiveCfg = Release|Win32 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.Build.0 = Release|Win32 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.ActiveCfg = Release|x64 - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.Build.0 = Release|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|Win32.ActiveCfg = Release|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.ActiveCfg = Release|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.Build.0 = Release|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.ActiveCfg = Debug|Win32 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.Build.0 = Debug|Win32 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.ActiveCfg = Debug|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.Build.0 = Debug|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.ActiveCfg = Release|Win32 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.Build.0 = Release|Win32 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.ActiveCfg = Release|x64 - {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.Build.0 = Release|x64 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.Build.0 = Release|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64 - {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|Win32.ActiveCfg = Release|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.ActiveCfg = Release|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.Build.0 = Release|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.ActiveCfg = Debug|Win32 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.Build.0 = Debug|Win32 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.ActiveCfg = Debug|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.Build.0 = Debug|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.ActiveCfg = Release|Win32 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.Build.0 = Release|Win32 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.ActiveCfg = Release|x64 - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.Build.0 = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.ActiveCfg = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.Build.0 = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|x64.ActiveCfg = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.ActiveCfg = Debug|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.Build.0 = Debug|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.ActiveCfg = Debug|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.Build.0 = Debug|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.ActiveCfg = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.Build.0 = Release|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|Win32.ActiveCfg = Release|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.ActiveCfg = Release|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.Build.0 = Release|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.ActiveCfg = Debug|Win32 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.Build.0 = Debug|Win32 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.ActiveCfg = Debug|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.Build.0 = Debug|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.ActiveCfg = Release|Win32 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.Build.0 = Release|Win32 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.ActiveCfg = Release|x64 - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.Build.0 = Release|x64 - {BED7539C-0099-4A14-AD5D-30828F15A171}.All|Win32.ActiveCfg = Release|x64 - {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.ActiveCfg = Release|x64 - {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.Build.0 = Release|x64 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.ActiveCfg = Debug|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.Build.0 = Debug|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.ActiveCfg = Debug|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.Build.0 = Debug|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.ActiveCfg = Release|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.Build.0 = Release|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.ActiveCfg = Release|Win32 - {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.Build.0 = Release|Win32 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|Win32.ActiveCfg = Release|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.ActiveCfg = Release|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.Build.0 = Release|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.ActiveCfg = Debug|Win32 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.Build.0 = Debug|Win32 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.ActiveCfg = Debug|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.Build.0 = Debug|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.ActiveCfg = Release|Win32 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.Build.0 = Release|Win32 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.ActiveCfg = Release|x64 - {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.Build.0 = Release|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|Win32.ActiveCfg = Release|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.ActiveCfg = Release|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.Build.0 = Release|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.ActiveCfg = Debug|Win32 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.Build.0 = Debug|Win32 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.ActiveCfg = Debug|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.Build.0 = Debug|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.ActiveCfg = Release|Win32 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.Build.0 = Release|Win32 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.ActiveCfg = Release|x64 - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.Build.0 = Release|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.All|Win32.ActiveCfg = Release|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.ActiveCfg = Release|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.Build.0 = Release|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.ActiveCfg = Debug|Win32 - {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.Build.0 = Debug|Win32 - {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.ActiveCfg = Debug|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.Build.0 = Debug|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.ActiveCfg = Release|Win32 - {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.Build.0 = Release|Win32 - {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.ActiveCfg = Release|x64 - {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.Build.0 = Release|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.ActiveCfg = Release|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.Build.0 = Release|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.ActiveCfg = Release|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.Build.0 = Release|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.ActiveCfg = Debug|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.Build.0 = Debug|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.ActiveCfg = Debug|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.Build.0 = Debug|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.ActiveCfg = Release|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.Build.0 = Release|x86 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.ActiveCfg = Release|x64 - {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.Build.0 = Release|x64 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.Build.0 = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|x64.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.Build.0 = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.Build.0 = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.Build.0 = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.ActiveCfg = All|Win32 - {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.Build.0 = All|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.ActiveCfg = Release|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.Build.0 = Release|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|x64.ActiveCfg = Release|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.ActiveCfg = Debug|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.Build.0 = Debug|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.ActiveCfg = Debug|x64 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.Build.0 = Debug|x64 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.ActiveCfg = Release|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.Build.0 = Release|Win32 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.ActiveCfg = Release|x64 - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.Build.0 = Release|x64 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.Build.0 = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|x64.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.Build.0 = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.Build.0 = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.Build.0 = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.ActiveCfg = All|Win32 - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.ActiveCfg = Release|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.Build.0 = Release|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.ActiveCfg = Release|x64 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.Build.0 = Release|x64 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.ActiveCfg = Debug|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.Build.0 = Debug|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.ActiveCfg = Debug|x64 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.Build.0 = Debug|x64 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.ActiveCfg = Release|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.Build.0 = Release|Win32 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.ActiveCfg = Release|x64 - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.Build.0 = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.ActiveCfg = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.Build.0 = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.ActiveCfg = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.Build.0 = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.ActiveCfg = Debug|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.Build.0 = Debug|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.ActiveCfg = Debug|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.Build.0 = Debug|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.ActiveCfg = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.Build.0 = Release|Win32 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.ActiveCfg = Release|x64 - {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.Build.0 = Release|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.ActiveCfg = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.Build.0 = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.ActiveCfg = Release|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.Build.0 = Release|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.ActiveCfg = Debug|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.Build.0 = Debug|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.ActiveCfg = Debug|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.Build.0 = Debug|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.ActiveCfg = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.Build.0 = Release|Win32 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.ActiveCfg = Release|x64 - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.Build.0 = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.ActiveCfg = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.Build.0 = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.ActiveCfg = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.Build.0 = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.ActiveCfg = Debug|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.Build.0 = Debug|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.ActiveCfg = Debug|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.Build.0 = Debug|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.ActiveCfg = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.Build.0 = Release|Win32 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.ActiveCfg = Release|x64 - {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.Build.0 = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.ActiveCfg = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.Build.0 = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.ActiveCfg = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.Build.0 = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.ActiveCfg = Debug|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.Build.0 = Debug|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.ActiveCfg = Debug|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.Build.0 = Debug|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.ActiveCfg = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.Build.0 = Release|Win32 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.ActiveCfg = Release|x64 - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.Build.0 = Release|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.ActiveCfg = Release|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.Build.0 = Release|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.ActiveCfg = Release|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.Build.0 = Release|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.ActiveCfg = Debug|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.Build.0 = Debug|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.ActiveCfg = Debug|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.Build.0 = Debug|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.ActiveCfg = Release|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.Build.0 = Release|Win32 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.ActiveCfg = Release|x64 - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.Build.0 = Release|x64 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32 - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32 - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|Win32.ActiveCfg = Release|Any CPU - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|x64.ActiveCfg = Release|Any CPU - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|Win32.ActiveCfg = Debug|Any CPU - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|x64.ActiveCfg = Debug|Any CPU - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|Win32.ActiveCfg = Release|Any CPU - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|x64.ActiveCfg = Release|Any CPU - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|Win32.ActiveCfg = Release|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.ActiveCfg = Release|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.Build.0 = Release|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.Build.0 = Debug|Win32 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.ActiveCfg = Debug|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.Build.0 = Debug|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.ActiveCfg = Release|Win32 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.Build.0 = Release|Win32 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.ActiveCfg = Release|x64 - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.Build.0 = Release|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|Win32.ActiveCfg = Release|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.ActiveCfg = Release|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.Build.0 = Release|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.ActiveCfg = Debug|Win32 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.Build.0 = Debug|Win32 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.ActiveCfg = Debug|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.Build.0 = Debug|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.ActiveCfg = Release|Win32 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.Build.0 = Release|Win32 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.ActiveCfg = Release|x64 - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.Build.0 = Release|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.ActiveCfg = Release|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.Build.0 = Release|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.ActiveCfg = Release|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.Build.0 = Release|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.ActiveCfg = Debug|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.Build.0 = Debug|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.ActiveCfg = Debug|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.Build.0 = Debug|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.ActiveCfg = Release|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.Build.0 = Release|Win32 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.ActiveCfg = Release|x64 - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.Build.0 = Release|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.ActiveCfg = Release|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.Build.0 = Release|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.ActiveCfg = Release|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.Build.0 = Release|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.Build.0 = Debug|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.ActiveCfg = Debug|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.Build.0 = Debug|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.Build.0 = Release|Win32 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.ActiveCfg = Release|x64 - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.Build.0 = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.ActiveCfg = Release|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.Build.0 = Release|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.ActiveCfg = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.Build.0 = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.ActiveCfg = Debug|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.Build.0 = Debug|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.ActiveCfg = Debug|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.Build.0 = Debug|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.ActiveCfg = Release|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.Build.0 = Release|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.ActiveCfg = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.Build.0 = Release|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.ActiveCfg = Release|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.Build.0 = Release|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.ActiveCfg = Release|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.Build.0 = Release|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64 - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.ActiveCfg = Release|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.Build.0 = Release|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.ActiveCfg = Release|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.Build.0 = Release|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.ActiveCfg = Debug|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.Build.0 = Debug|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.ActiveCfg = Debug|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.Build.0 = Debug|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.ActiveCfg = Release|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.Build.0 = Release|Win32 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.ActiveCfg = Release|x64 - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.Build.0 = Release|x64 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.ActiveCfg = Release|Win32 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.Build.0 = Release|Win32 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.ActiveCfg = Release|x64 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.Build.0 = Release|x64 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|Win32.ActiveCfg = Debug|Win32 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|x64.ActiveCfg = Debug|x64 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|Win32.ActiveCfg = Release|Win32 - {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|x64.ActiveCfg = Release|x64 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.ActiveCfg = Release|Win32 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.Build.0 = Release|Win32 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.ActiveCfg = Release|x64 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.Build.0 = Release|x64 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|Win32.ActiveCfg = Debug|Win32 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|x64.ActiveCfg = Debug|x64 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|Win32.ActiveCfg = Release|Win32 - {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|x64.ActiveCfg = Release|x64 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.ActiveCfg = Release|Win32 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.Build.0 = Release|Win32 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.ActiveCfg = Release|x64 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.Build.0 = Release|x64 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|Win32.ActiveCfg = Debug|Win32 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|x64.ActiveCfg = Debug|x64 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|Win32.ActiveCfg = Release|Win32 - {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|x64.ActiveCfg = Release|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.ActiveCfg = Release|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.Build.0 = Release|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.ActiveCfg = Release|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.Build.0 = Release|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.ActiveCfg = Debug|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.Build.0 = Debug|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.ActiveCfg = Debug|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.Build.0 = Debug|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.ActiveCfg = Release|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.Build.0 = Release|Win32 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.ActiveCfg = Release|x64 - {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.Build.0 = Release|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.ActiveCfg = Release|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.Build.0 = Release|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.ActiveCfg = Release|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.Build.0 = Release|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.ActiveCfg = Debug|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.Build.0 = Debug|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.ActiveCfg = Debug|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.Build.0 = Debug|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.ActiveCfg = Release|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.Build.0 = Release|Win32 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.ActiveCfg = Release|x64 - {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.Build.0 = Release|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.ActiveCfg = Release|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.Build.0 = Release|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.ActiveCfg = Release|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.Build.0 = Release|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.Build.0 = Debug|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.ActiveCfg = Debug|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.Build.0 = Debug|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.ActiveCfg = Release|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.Build.0 = Release|Win32 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.ActiveCfg = Release|x64 - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.Build.0 = Release|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.ActiveCfg = Release|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.Build.0 = Release|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.ActiveCfg = Release|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.Build.0 = Release|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.ActiveCfg = Debug|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.Build.0 = Debug|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.ActiveCfg = Debug|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.Build.0 = Debug|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.ActiveCfg = Release|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.Build.0 = Release|Win32 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.ActiveCfg = Release|x64 - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.Build.0 = Release|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.ActiveCfg = Release|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.Build.0 = Release|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.ActiveCfg = Release|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.Build.0 = Release|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.ActiveCfg = Debug|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.Build.0 = Debug|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.ActiveCfg = Debug|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.Build.0 = Debug|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.ActiveCfg = Release|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.Build.0 = Release|Win32 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.ActiveCfg = Release|x64 - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.Build.0 = Release|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.ActiveCfg = Release|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.Build.0 = Release|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.ActiveCfg = Release|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.Build.0 = Release|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.ActiveCfg = Debug|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.Build.0 = Debug|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.ActiveCfg = Debug|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.Build.0 = Debug|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.ActiveCfg = Release|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.Build.0 = Release|Win32 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.ActiveCfg = Release|x64 - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.Build.0 = Release|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.ActiveCfg = Release|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.Build.0 = Release|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.ActiveCfg = Release|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.Build.0 = Release|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.ActiveCfg = Debug|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.Build.0 = Debug|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.ActiveCfg = Debug|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.Build.0 = Debug|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.ActiveCfg = Release|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.Build.0 = Release|Win32 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.ActiveCfg = Release|x64 - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.Build.0 = Release|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.ActiveCfg = Release|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.Build.0 = Release|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.ActiveCfg = Release|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.Build.0 = Release|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.ActiveCfg = Debug|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.Build.0 = Debug|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.ActiveCfg = Debug|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.Build.0 = Debug|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.ActiveCfg = Release|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.Build.0 = Release|Win32 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.ActiveCfg = Release|x64 - {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.Build.0 = Release|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.ActiveCfg = Release|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.Build.0 = Release|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.ActiveCfg = Release|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.Build.0 = Release|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.ActiveCfg = Debug|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.Build.0 = Debug|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.ActiveCfg = Debug|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.Build.0 = Debug|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.ActiveCfg = Release|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.Build.0 = Release|Win32 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.ActiveCfg = Release|x64 - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.Build.0 = Release|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.ActiveCfg = Release|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.Build.0 = Release|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.ActiveCfg = Release|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.Build.0 = Release|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.ActiveCfg = Debug|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.Build.0 = Debug|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.ActiveCfg = Debug|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.Build.0 = Debug|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.ActiveCfg = Release|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.Build.0 = Release|Win32 - {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.ActiveCfg = Release|x64 - {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.Build.0 = Release|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.ActiveCfg = Release|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.Build.0 = Release|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.ActiveCfg = Release|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.Build.0 = Release|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.ActiveCfg = Debug|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.Build.0 = Debug|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.ActiveCfg = Debug|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.Build.0 = Debug|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.ActiveCfg = Release|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.Build.0 = Release|Win32 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.ActiveCfg = Release|x64 - {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.Build.0 = Release|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.ActiveCfg = Release|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.Build.0 = Release|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.ActiveCfg = Release|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.Build.0 = Release|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.ActiveCfg = Debug|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.Build.0 = Debug|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.ActiveCfg = Debug|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.Build.0 = Debug|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.ActiveCfg = Release|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.Build.0 = Release|Win32 - {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.ActiveCfg = Release|x64 - {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.Build.0 = Release|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.ActiveCfg = Release|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.Build.0 = Release|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.ActiveCfg = Release|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.Build.0 = Release|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.ActiveCfg = Debug|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.Build.0 = Debug|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.ActiveCfg = Debug|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.Build.0 = Debug|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.ActiveCfg = Release|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.Build.0 = Release|Win32 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.ActiveCfg = Release|x64 - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.Build.0 = Release|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.ActiveCfg = Release|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.Build.0 = Release|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.ActiveCfg = Release|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.Build.0 = Release|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.ActiveCfg = Debug|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.Build.0 = Debug|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.ActiveCfg = Debug|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.Build.0 = Debug|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.ActiveCfg = Release|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.Build.0 = Release|Win32 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.ActiveCfg = Release|x64 - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.Build.0 = Release|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.ActiveCfg = Release|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.Build.0 = Release|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.ActiveCfg = Release|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.Build.0 = Release|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.ActiveCfg = Debug|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.Build.0 = Debug|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.ActiveCfg = Debug|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.Build.0 = Debug|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.ActiveCfg = Release|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.Build.0 = Release|Win32 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.ActiveCfg = Release|x64 - {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.Build.0 = Release|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.ActiveCfg = Release|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.Build.0 = Release|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.ActiveCfg = Release|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.Build.0 = Release|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.ActiveCfg = Debug|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.Build.0 = Debug|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.ActiveCfg = Debug|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.Build.0 = Debug|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.ActiveCfg = Release|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.Build.0 = Release|Win32 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.ActiveCfg = Release|x64 - {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.Build.0 = Release|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.ActiveCfg = Release|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.Build.0 = Release|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.ActiveCfg = Release|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.Build.0 = Release|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.ActiveCfg = Debug|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.Build.0 = Debug|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.ActiveCfg = Debug|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.Build.0 = Debug|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.ActiveCfg = Release|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.Build.0 = Release|Win32 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.ActiveCfg = Release|x64 - {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.Build.0 = Release|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.ActiveCfg = Release|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.Build.0 = Release|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.ActiveCfg = Release|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.Build.0 = Release|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.ActiveCfg = Debug|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.Build.0 = Debug|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.ActiveCfg = Debug|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.Build.0 = Debug|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.ActiveCfg = Release|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.Build.0 = Release|Win32 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.ActiveCfg = Release|x64 - {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.Build.0 = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.ActiveCfg = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.Build.0 = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.ActiveCfg = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.Build.0 = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|Win32.ActiveCfg = Debug|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|x64.ActiveCfg = Debug|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|Win32.ActiveCfg = Release|x64 - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|x64.ActiveCfg = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} = {57D119DC-484F-420F-B9E9-8589FD9A8DF8} - {CDE9B06A-3C27-4987-8FAE-DF1006BC705D} = {DB1024A8-41BF-4AD7-9AE6-13202230D1F3} - {3C90CCF0-2CDD-4A7A-ACFF-208C1E271692} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} - {C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} - {FC71C66E-E268-4EAD-B1F5-F008DC382E83} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} - {8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} - {09455AA9-C243-4F16-A1A1-A016881A2765} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} - {57199684-EC63-4A60-9DC6-11815AF6B413} = {09455AA9-C243-4F16-A1A1-A016881A2765} - {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} = {09455AA9-C243-4F16-A1A1-A016881A2765} - {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} = {09455AA9-C243-4F16-A1A1-A016881A2765} - {D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} - {CC3E7F48-2590-49CB-AD8B-BE3650F55462} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} - {765EF1B9-5027-4820-BC37-A44466A51631} = {57199684-EC63-4A60-9DC6-11815AF6B413} - {713E4747-1126-40B1-BD84-58F9A7745423} = {57199684-EC63-4A60-9DC6-11815AF6B413} - {F1B71990-EB04-4EB5-B28A-BC3EB6F7E843} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} - {3DAF028C-AB5B-4183-A01B-DCC43F5A87F0} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} - {62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} - {07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} - {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC} - {A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} - {784113EF-44D9-4949-835D-7065D3C7AD08} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {89385C74-5860-4174-9CAF-A39E7C48909C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {9B9D2551-D6BD-4F20-8BE5-DE30E154A064} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {8B754330-A434-4791-97E5-1EE67060BAC0} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {692F6330-4D87-4C82-81DF-40DB5892636E} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} - {D3EC0AFF-76FC-4210-A825-9A17410660A3} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {30A5B29C-983E-4580-9FD0-D647CCDCC7EB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {1C453396-D912-4213-89FD-9B489162B7B5} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A} - {CBEC7225-0C21-4DA8-978E-1F158F8AD950} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} - {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {C24FB505-05D7-4319-8485-7540B44C8603} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {05515420-16DE-4E63-BE73-85BE85BA5142} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {1906D736-08BD-4EE1-924F-B536249B9A54} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {FEA1EEF7-876F-48DE-88BF-C0E3E606D758} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {9254C4B0-6F60-42B6-BB3A-36D63FC001C7} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {71A967D5-0E99-4CEF-A587-98836EE6F2EF} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {AB91A099-7690-4ECF-8994-E458F4EA1ED4} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} - {988CACF7-3FCB-4992-BE69-77872AE67DC8} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} - {8DEB383C-4091-4F42-A56F-C9E46D552D79} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {2C3C2423-234B-4772-8899-D3B137E5CA35} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {3850D93A-5F24-4922-BC1C-74D08C37C256} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {D7F1E3F2-A3F4-474C-8555-15122571AF52} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {5BC072DB-3826-48EA-AF34-FE32AA01E83B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {FA429E98-8B03-45E6-A096-A4BC5E821DE4} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {06E3A538-AB32-44F2-B477-755FF9CB5D37} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {A4B122CF-5196-476B-8C0E-D8BD59AC3C14} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {F6A33240-8F29-48BD-98F0-826995911799} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {65A6273D-FCAB-4C55-B09E-65100141A5D4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} - {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A} - {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {E3246D17-E29B-4AB5-962A-C69B0C5837BB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {7B077E7F-1BE7-4291-AB86-55E527B25CAC} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {94001A0E-A837-445C-8004-F918F10D0226} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {2286DA73-9FC5-45BC-A508-85994C3317AB} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} - {7A8D8174-B355-4114-AFC1-04777CB9DE0A} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {7EB71250-F002-4ED8-92CA-CA218114537A} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {464AAB78-5489-4916-BE51-BF8D61822311} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {66444AEE-554C-11DD-A9F0-8C5D56D89593} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} - {E316772F-5D8F-4F2A-8F71-094C3E859D34} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {D3D8B329-20BE-475E-9E83-653CEA0E0EF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {419C8F80-D858-4B48-A25C-AF4007608137} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {B3F424EC-3D8F-417C-B244-3919D5E1A577} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {14E4A972-9CFB-436D-B0A5-4943F3F80D47} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {0B6C905B-142E-4999-B39D-92FF7951E921} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {CF405366-9558-4AE8-90EF-5E21B51CCB4E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {329FD5B0-EF28-4606-86D0-F6EA21CF8E36} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {9A5DDF08-C88C-4A35-B7F6-D605228446BD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {05C9FB27-480E-4D53-B3B7-6338E2526666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {CC1DD008-9406-448D-A0AD-33C3186CFADB} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {48414740-C693-4968-9846-EE058020C64F} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {DEE932AB-5911-4700-9EEB-8C7090A0A330} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {329A6FA0-0FCC-4435-A950-E670AEFA9838} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {D1ABE208-6442-4FB4-9AAD-1677E41BC870} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {BA599D0A-4310-4505-91DA-6A6447B3E289} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959} = {4F227C26-768F-46A3-8684-1D08A46FB374} - {3C977801-FE88-48F2-83D3-FA2EBFF6688E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {0382E8FD-CFDC-41C0-8B03-792C7C84FC31} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {432DB165-1EB2-4781-A9C0-71E62610B20A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {CF70F278-3364-4395-A2E1-23501C9B8AD2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {D5C87B19-150D-4EF3-A671-96589BD2D14A} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {B5A00BFA-6083-4FAE-A097-71642D6473B5} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {1C320193-46A6-4B34-9C56-8AB584FC1B56} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {72782932-37CC-46AE-8C7F-9A7B1A6EE108} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {12A49562-BAB9-43A3-A21D-15B60BBB4C31} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {504B3154-7A4F-459D-9877-B951021C3F1F} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {746F3632-5BB2-4570-9453-31D6D58A7D8E} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {DEB01ACB-D65F-4A62-AED9-58C1054499E9} = {62F27B1A-C919-4A70-8478-51F178F3B18F} - {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} - {ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {AFA983D6-4569-4F88-BA94-555ED00FD9A8} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {990BAA76-89D3-4E38-8479-C7B28784EFC8} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {1E21AFE0-6FDB-41D2-942D-863607C24B91} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {2E250296-0C08-4342-9C8A-BCBDD0E7DF65} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {B889A18E-70A7-44B5-B2C9-47798D4F43B3} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {05C9FB27-480E-4D53-B3B7-7338E2514666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {7C22BDFF-CC09-400C-8A09-660733980028} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {50AAC2CE-BFC9-4912-87CC-C6381850D735} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {4748FF56-CA85-4809-97D6-A94C0FAC1D77} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {2469B306-B027-4FF2-8815-C9C1EA2CAE79} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {9DE35039-A8F6-4FBF-B1B6-EB527F802411} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {74B120FF-6935-4DFE-A142-CDB6BEA99C90} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} - {BED7539C-0099-4A14-AD5D-30828F15A171} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} - {0D108721-EAE8-4BAF-8102-D8960EC93647} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} - {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} - {B535402E-38D2-4D54-8360-423ACBD17192} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} - {2386B892-35F5-46CF-A0F0-10394D2FBF9B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {ED2CA8B5-8E91-4296-A120-02BB0B674652} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} - {245603E3-F580-41A5-9632-B25FE3372CBF} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} - {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} - {8484C90D-1561-402F-A91D-2DB10F8C5171} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} - {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} - {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0} = {0C808854-54D1-4230-BFF5-77B5FD905000} - {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} - {B6E22500-3DB6-4E6E-8CD5-591B781D7D99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B} = {A5A27244-AD24-46E5-B01B-840CD296C91D} - {841C345F-FCC7-4F64-8F54-0281CEABEB01} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {7AEE504B-23B6-4B05-829E-7CD34855F146} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {20179127-853B-4FE9-B7C0-9E817E6A3A72} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {87933C2D-0159-46F7-B326-E1B6E982C21E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {19E934D6-1484-41C8-9305-78DC42FD61F2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} - {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {CEEE31E6-8A08-42C7-BEBD-5EC12072C136} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {0E469F3A-DDD0-43BA-A94F-7D93C02219F3} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {A3D7C6CF-AEB1-4159-B741-160EB4B37345} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {DA7ADDF1-DA33-4194-83A5-B48DB714D35B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {AF675478-995A-4115-90C4-B2B0D6470688} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {07EA6E5A-D181-4ABB-BECF-67A906867D04} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {20B15650-F910-4211-8729-AAB0F520C805} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} - {096C9A84-55B2-4F9B-97E5-0FDF116FD25F} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {2CA661A7-01DD-4532-BF88-B6629DFB544A} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {40C4E2A2-B49B-496C-96D6-C04B890F7F88} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {0A130A8B-3076-4619-BADF-9E86F621AEEC} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} - {4DFF29B4-2976-447D-A8B3-43476451517C} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} - {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2010 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Endpoints", "Endpoints", "{9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Applications", "Applications", "{E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dialplans", "Dialplans", "{C5F182F9-754A-4EC5-B50F-76ED02BE13F4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Event Handlers", "Event Handlers", "{9ADF1E48-2F5C-4ED7-A893-596259FABFE0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Formats", "Formats", "{A5A27244-AD24-46E5-B01B-840CD296C91D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{CBD81696-EFB4-4D2F-8451-1B8DAA86155A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Directories", "Directories", "{B8F5B47B-8568-46EB-B320-64C17D2A98BC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Languages", "Languages", "{0C808854-54D1-4230-BFF5-77B5FD905000}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASR-TTS", "ASR-TTS", "{4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loggers", "Loggers", "{A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XML Interfaces", "XML Interfaces", "{F69A4A6B-9360-4EBB-A280-22AA3C455AC5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Libraries", "_Libraries", "{EB910B0D-F27D-4B62-B67B-DE834C99AC5B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "say", "say", "{6CD61A1D-797C-470A-BE08-8C31B68BB336}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Config", "_Config", "{57D119DC-484F-420F-B9E9-8589FD9A8DF8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default", "Default", "{3B08FEFD-4D3D-4C16-BA94-EE83509E32A0}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\freeswitch.xml = conf\vanilla\freeswitch.xml + conf\vanilla\vars.xml = conf\vanilla\vars.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Build System", "_Build System", "{DB1024A8-41BF-4AD7-9AE6-13202230D1F3}" + ProjectSection(SolutionItems) = preProject + acsite.m4 = acsite.m4 + bootstrap.sh = bootstrap.sh + build\buildlib.sh = build\buildlib.sh + configure.in = configure.in + Makefile.am = Makefile.am + build\modmake.rules.in = build\modmake.rules.in + build\modules.conf.in = build\modules.conf.in + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "m4", "m4", "{CDE9B06A-3C27-4987-8FAE-DF1006BC705D}" + ProjectSection(SolutionItems) = preProject + build\config\ac_cflags_gcc_option.m4 = build\config\ac_cflags_gcc_option.m4 + build\config\ac_cflags_sun_option.m4 = build\config\ac_cflags_sun_option.m4 + build\config\ac_gcc_archflag.m4 = build\config\ac_gcc_archflag.m4 + build\config\ac_gcc_x86_cpuid.m4 = build\config\ac_gcc_x86_cpuid.m4 + build\config\ac_prog_gzip.m4 = build\config\ac_prog_gzip.m4 + build\config\ac_prog_wget.m4 = build\config\ac_prog_wget.m4 + build\config\ax_cc_maxopt.m4 = build\config\ax_cc_maxopt.m4 + build\config\ax_cflags_warn_all_ansi.m4 = build\config\ax_cflags_warn_all_ansi.m4 + build\config\ax_check_compiler_flags.m4 = build\config\ax_check_compiler_flags.m4 + build\config\ax_compiler_vendor.m4 = build\config\ax_compiler_vendor.m4 + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{3C90CCF0-2CDD-4A7A-ACFF-208C1E271692}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\autoload_configs\alsa.conf.xml = conf\vanilla\autoload_configs\alsa.conf.xml + conf\vanilla\autoload_configs\conference.conf.xml = conf\vanilla\autoload_configs\conference.conf.xml + conf\vanilla\autoload_configs\console.conf.xml = conf\vanilla\autoload_configs\console.conf.xml + conf\vanilla\autoload_configs\dialplan_directory.conf.xml = conf\vanilla\autoload_configs\dialplan_directory.conf.xml + conf\vanilla\autoload_configs\dingaling.conf.xml = conf\vanilla\autoload_configs\dingaling.conf.xml + conf\vanilla\autoload_configs\enum.conf.xml = conf\vanilla\autoload_configs\enum.conf.xml + conf\vanilla\autoload_configs\event_multicast.conf.xml = conf\vanilla\autoload_configs\event_multicast.conf.xml + conf\vanilla\autoload_configs\event_socket.conf.xml = conf\vanilla\autoload_configs\event_socket.conf.xml + conf\vanilla\autoload_configs\ivr.conf.xml = conf\vanilla\autoload_configs\ivr.conf.xml + conf\vanilla\autoload_configs\java.conf.xml = conf\vanilla\autoload_configs\java.conf.xml + conf\vanilla\autoload_configs\limit.conf.xml = conf\vanilla\autoload_configs\limit.conf.xml + conf\vanilla\autoload_configs\local_stream.conf.xml = conf\vanilla\autoload_configs\local_stream.conf.xml + conf\vanilla\autoload_configs\logfile.conf.xml = conf\vanilla\autoload_configs\logfile.conf.xml + conf\vanilla\autoload_configs\modules.conf.xml = conf\vanilla\autoload_configs\modules.conf.xml + conf\vanilla\autoload_configs\openmrcp.conf.xml = conf\vanilla\autoload_configs\openmrcp.conf.xml + conf\vanilla\autoload_configs\portaudio.conf.xml = conf\vanilla\autoload_configs\portaudio.conf.xml + conf\vanilla\autoload_configs\rss.conf.xml = conf\vanilla\autoload_configs\rss.conf.xml + conf\vanilla\autoload_configs\sofia.conf.xml = conf\vanilla\autoload_configs\sofia.conf.xml + conf\vanilla\autoload_configs\switch.conf.xml = conf\vanilla\autoload_configs\switch.conf.xml + conf\vanilla\autoload_configs\syslog.conf.xml = conf\vanilla\autoload_configs\syslog.conf.xml + conf\vanilla\autoload_configs\v8.conf.xml = conf\vanilla\autoload_configs\v8.conf.xml + conf\vanilla\autoload_configs\voicemail.conf.xml = conf\vanilla\autoload_configs\voicemail.conf.xml + conf\vanilla\autoload_configs\wanpipe.conf.xml = conf\vanilla\autoload_configs\wanpipe.conf.xml + conf\vanilla\autoload_configs\woomera.conf.xml = conf\vanilla\autoload_configs\woomera.conf.xml + conf\vanilla\autoload_configs\xml_cdr.conf.xml = conf\vanilla\autoload_configs\xml_cdr.conf.xml + conf\vanilla\autoload_configs\xml_curl.conf.xml = conf\vanilla\autoload_configs\xml_curl.conf.xml + conf\vanilla\autoload_configs\xml_rpc.conf.xml = conf\vanilla\autoload_configs\xml_rpc.conf.xml + conf\vanilla\autoload_configs\zeroconf.conf.xml = conf\vanilla\autoload_configs\zeroconf.conf.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\dialplan\default.xml = conf\vanilla\dialplan\default.xml + conf\vanilla\dialplan\public.xml = conf\vanilla\dialplan\public.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{FC71C66E-E268-4EAD-B1F5-F008DC382E83}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\sip_profiles\external.xml = conf\vanilla\sip_profiles\external.xml + conf\vanilla\sip_profiles\internal.xml = conf\vanilla\sip_profiles\internal.xml + conf\vanilla\sip_profiles\nat.xml = conf\vanilla\sip_profiles\nat.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{09455AA9-C243-4F16-A1A1-A016881A2765}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\directory\default.xml = conf\vanilla\directory\default.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "en", "en", "{57199684-EC63-4A60-9DC6-11815AF6B413}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\en\en.xml = conf\vanilla\lang\en\en.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\de\de.xml = conf\vanilla\lang\de\de.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{D4A12E4C-DBDA-4614-BA26-3425AE9F60F5}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\fr\fr.xml = conf\vanilla\lang\fr\fr.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\de\demo\demo.xml = conf\vanilla\lang\de\demo\demo.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{CC3E7F48-2590-49CB-AD8B-BE3650F55462}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\de\vm\tts.xml = conf\vanilla\lang\de\vm\tts.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{765EF1B9-5027-4820-BC37-A44466A51631}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\en\demo\demo.xml = conf\vanilla\lang\en\demo\demo.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{713E4747-1126-40B1-BD84-58F9A7745423}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\en\vm\sounds.xml = conf\vanilla\lang\en\vm\sounds.xml + conf\vanilla\lang\en\vm\tts.xml = conf\vanilla\lang\en\vm\tts.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\fr\demo\demo.xml = conf\vanilla\lang\fr\demo\demo.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}" + ProjectSection(SolutionItems) = preProject + conf\vanilla\lang\fr\vm\sounds.xml = conf\vanilla\lang\fr\vm\sounds.xml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sound Files", "Sound Files", "{4F227C26-768F-46A3-8684-1D08A46FB374}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unimrcp", "unimrcp", "{62F27B1A-C919-4A70-8478-51F178F3B18F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.2017.vcxproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2017.vcxproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g729", "src\mod\codecs\mod_g729\mod_g729.2017.vcxproj", "{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sndfile", "src\mod\formats\mod_sndfile\mod_sndfile.2017.vcxproj", "{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_PortAudio", "src\mod\endpoints\mod_portaudio\mod_PortAudio.2017.vcxproj", "{5FD31A25-5D83-4794-8BEE-904DAD84CE71}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "docs", "docs\docs.2017.vcxproj", "{1A1FF289-4FD6-4285-A422-D31DD67A4723}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_xml", "src\mod\dialplans\mod_dialplan_xml\mod_dialplan_xml.2017.vcxproj", "{07113B25-D3AF-4E04-BA77-4CD1171F022C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ldap", "src\mod\directories\mod_ldap\mod_ldap.2017.vcxproj", "{EC3E5C7F-EE09-47E2-80FE-546363D14A98}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_directory", "src\mod\dialplans\mod_dialplan_directory\mod_dialplan_directory.2017.vcxproj", "{A27CCA23-1541-4337-81A4-F0A6413078A0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_multicast", "src\mod\event_handlers\mod_event_multicast\mod_event_multicast.2017.vcxproj", "{784113EF-44D9-4949-835D-7065D3C7AD08}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libteletone", "libs\libteletone\libteletone.2017.vcxproj", "{89385C74-5860-4174-9CAF-A39E7C48909C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8", "src\mod\languages\mod_v8\mod_v8.2017.vcxproj", "{9B9D2551-D6BD-4F20-8BE5-DE30E154A064}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_v8_skel", "src\mod\languages\mod_v8\mod_v8_skel.2017.vcxproj", "{8B754330-A434-4791-97E5-1EE67060BAC0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cepstral", "src\mod\asr_tts\mod_cepstral\mod_cepstral.2017.vcxproj", "{692F6330-4D87-4C82-81DF-40DB5892636E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.2017.vcxproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.2017.vcxproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.2017.vcxproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_console", "src\mod\loggers\mod_console\mod_console.2017.vcxproj", "{1C453396-D912-4213-89FD-9B489162B7B5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_rpc", "src\mod\xml_int\mod_xml_rpc\mod_xml_rpc.2017.vcxproj", "{CBEC7225-0C21-4DA8-978E-1F158F8AD950}" + ProjectSection(ProjectDependencies) = postProject + {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rss", "src\mod\applications\mod_rss\mod_rss.2017.vcxproj", "{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_conference", "src\mod\applications\mod_conference\mod_conference.2017.vcxproj", "{C24FB505-05D7-4319-8485-7540B44C8603}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\applications\mod_dptools\mod_dptools.2017.vcxproj", "{B5881A85-FE70-4F64-8607-2CAAE52669C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.2017.vcxproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.2017.vcxproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.2017.vcxproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsqlite", "libs\win32\sqlite\sqlite.2017.vcxproj", "{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libapr", "libs\win32\apr\libapr.2017.vcxproj", "{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.2017.vcxproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iksemel", "libs\win32\iksemel\iksemel.2017.vcxproj", "{E727E8F6-935D-46FE-8B0E-37834748A0E3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xml", "libs\win32\apr-util\xml.2017.vcxproj", "{155844C3-EC5F-407F-97A4-A2DDADED9B2F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.2017.vcxproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pthread", "libs\win32\pthread\pthread.2017.vcxproj", "{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g723_1", "src\mod\codecs\mod_g723_1\mod_g723_1.2017.vcxproj", "{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_iSAC", "src\mod\codecs\mod_isac\mod_iSAC.2017.vcxproj", "{7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_native_file", "src\mod\formats\mod_native_file\mod_native_file.2017.vcxproj", "{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.2017.vcxproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.2017.vcxproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_curl", "src\mod\xml_int\mod_xml_curl\mod_xml_curl.2017.vcxproj", "{AB91A099-7690-4ECF-8994-E458F4EA1ED4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_en", "src\mod\say\mod_say_en\mod_say_en.2017.vcxproj", "{988CACF7-3FCB-4992-BE69-77872AE67DC8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "libs\win32\portaudio\portaudio.2017.vcxproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.2017.vcxproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.2017.vcxproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h26x", "src\mod\codecs\mod_h26x\mod_h26x.2017.vcxproj", "{2C3C2423-234B-4772-8899-D3B137E5CA35}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_esf", "src\mod\applications\mod_esf\mod_esf.2017.vcxproj", "{3850D93A-5F24-4922-BC1C-74D08C37C256}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_local_stream", "src\mod\formats\mod_local_stream\mod_local_stream.2017.vcxproj", "{2CA40887-1622-46A1-A7F9-17FD7E7E545B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_voicemail", "src\mod\applications\mod_voicemail\mod_voicemail.2017.vcxproj", "{D7F1E3F2-A3F4-474C-8555-15122571AF52}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_de", "src\mod\say\mod_say_de\mod_say_de.2017.vcxproj", "{5BC072DB-3826-48EA-AF34-FE32AA01E83B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es", "src\mod\say\mod_say_es\mod_say_es.2017.vcxproj", "{FA429E98-8B03-45E6-A096-A4BC5E821DE4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fr", "src\mod\say\mod_say_fr\mod_say_fr.2017.vcxproj", "{06E3A538-AB32-44F2-B477-755FF9CB5D37}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_it", "src\mod\say\mod_say_it\mod_say_it.2017.vcxproj", "{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_nl", "src\mod\say\mod_say_nl\mod_say_nl.2017.vcxproj", "{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fifo", "src\mod\applications\mod_fifo\mod_fifo.2017.vcxproj", "{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_db", "src\mod\applications\mod_db\mod_db.2017.vcxproj", "{F6A33240-8F29-48BD-98F0-826995911799}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_expr", "src\mod\applications\mod_expr\mod_expr.2017.vcxproj", "{65A6273D-FCAB-4C55-B09E-65100141A5D4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_asterisk", "src\mod\dialplans\mod_dialplan_asterisk\mod_dialplan_asterisk.2017.vcxproj", "{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_logfile", "src\mod\loggers\mod_logfile\mod_logfile.2017.vcxproj", "{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_csv", "src\mod\event_handlers\mod_cdr_csv\mod_cdr_csv.2017.vcxproj", "{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_tone_stream", "src\mod\formats\mod_tone_stream\mod_tone_stream.2017.vcxproj", "{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_fsv", "src\mod\applications\mod_fsv\mod_fsv.2017.vcxproj", "{E3246D17-E29B-4AB5-962A-C69B0C5837BB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lua", "src\mod\languages\mod_lua\mod_lua.2017.vcxproj", "{7B077E7F-1BE7-4291-AB86-55E527B25CAC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sphinxbase", "libs\win32\sphinxbase\sphinxbase.2017.vcxproj", "{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pocketsphinx", "libs\win32\pocketsphinx\pocketsphinx.2017.vcxproj", "{94001A0E-A837-445C-8004-F918F10D0226}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_pocketsphinx", "src\mod\asr_tts\mod_pocketsphinx\mod_pocketsphinx.2017.vcxproj", "{2286DA73-9FC5-45BC-A508-85994C3317AB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz", "libs\win32\Sound_Files\8khz.2017.vcxproj", "{7A8D8174-B355-4114-AFC1-04777CB9DE0A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz", "libs\win32\Sound_Files\16khz.2017.vcxproj", "{7EB71250-F002-4ED8-92CA-CA218114537A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz", "libs\win32\Sound_Files\32khz.2017.vcxproj", "{464AAB78-5489-4916-BE51-BF8D61822311}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_flite", "src\mod\asr_tts\mod_flite\mod_flite.2017.vcxproj", "{66444AEE-554C-11DD-A9F0-8C5D56D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp3lame", "libs\win32\libmp3lame\libmp3lame.2017.vcxproj", "{E316772F-5D8F-4F2A-8F71-094C3E859D34}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libshout", "libs\win32\libshout\libshout.2017.vcxproj", "{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shout", "src\mod\formats\mod_shout\mod_shout.2017.vcxproj", "{38FE0559-9910-43A8-9E45-3E5004C27692}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libs\win32\libogg\libogg.2017.vcxproj", "{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_snom", "src\mod\applications\mod_snom\mod_snom.2017.vcxproj", "{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_zh", "src\mod\say\mod_say_zh\mod_say_zh.2017.vcxproj", "{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_managed", "src\mod\languages\mod_managed\mod_managed.2017.vcxproj", "{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSWITCH.Managed.2017", "src\mod\languages\mod_managed\managed\FreeSWITCH.Managed.2017.csproj", "{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpg123", "libs\win32\mpg123\libmpg123.2017.vcxproj", "{419C8F80-D858-4B48-A25C-AF4007608137}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_loopback", "src\mod\endpoints\mod_loopback\mod_loopback.2017.vcxproj", "{B3F424EC-3D8F-417C-B244-3919D5E1A577}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_vmd", "src\mod\applications\mod_vmd\mod_vmd.2017.vcxproj", "{14E4A972-9CFB-436D-B0A5-4943F3F80D47}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg722_1", "libs\win32\libg722_1\libg722_1.2017.vcxproj", "{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_siren", "src\mod\codecs\mod_siren\mod_siren.2017.vcxproj", "{0B6C905B-142E-4999-B39D-92FF7951E921}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libesl", "libs\esl\src\libesl.2017.vcxproj", "{CF405366-9558-4AE8-90EF-5E21B51CCB4E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fs_cli", "libs\esl\fs_cli.2017.vcxproj", "{D2FB8043-D208-4AEE-8F18-3B5857C871B9}" + ProjectSection(ProjectDependencies) = postProject + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_easyroute", "src\mod\applications\mod_easyroute\mod_easyroute.2017.vcxproj", "{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_lcr", "src\mod\applications\mod_lcr\mod_lcr.2017.vcxproj", "{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtiff", "libs\spandsp\src\libtiff.2017.vcxproj", "{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspandsp", "libs\spandsp\src\libspandsp.2017.vcxproj", "{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libs\win32\speex\libspeex.2017.vcxproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libs\win32\speex\libspeexdsp.2017.vcxproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc", "libs\win32\ilbc\libilbc.2017.vcxproj", "{9A5DDF08-C88C-4A35-B7F6-D605228446BD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opal", "src\mod\endpoints\mod_opal\mod_opal.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-6338E2526666}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skinny", "src\mod\endpoints\mod_skinny\mod_skinny.2017.vcxproj", "{CC1DD008-9406-448D-A0AD-33C3186CFADB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtmp", "src\mod\endpoints\mod_rtmp\mod_rtmp.2017.vcxproj", "{48414740-C693-4968-9846-EE058020C64F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_at_dictionary", "libs\spandsp\src\msvc\make_at_dictionary.2017.vcxproj", "{DEE932AB-5911-4700-9EEB-8C7090A0A330}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_modem_filter", "libs\spandsp\src\msvc\make_modem_filter.2017.vcxproj", "{329A6FA0-0FCC-4435-A950-E670AEFA9838}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skel", "src\mod\applications\mod_skel\mod_skel.2017.vcxproj", "{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "8khz music", "libs\win32\Sound_Files\8khzmusic.2017.vcxproj", "{D1ABE208-6442-4FB4-9AAD-1677E41BC870}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16khz music", "libs\win32\Sound_Files\16khzmusic.2017.vcxproj", "{BA599D0A-4310-4505-91DA-6A6447B3E289}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32khz music", "libs\win32\Sound_Files\32khzmusic.2017.vcxproj", "{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_nibblebill", "src\mod\applications\mod_nibblebill\mod_nibblebill.2017.vcxproj", "{3C977801-FE88-48F2-83D3-FA2EBFF6688E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ru", "src\mod\say\mod_say_ru\mod_say_ru.2017.vcxproj", "{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_valet_parking", "src\mod\applications\mod_valet_parking\mod_valet_parking.2017.vcxproj", "{432DB165-1EB2-4781-A9C0-71E62610B20A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbroadvoice", "libs\win32\broadvoice\libbroadvoice.2017.vcxproj", "{CF70F278-3364-4395-A2E1-23501C9B8AD2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_bv", "src\mod\codecs\mod_bv\mod_bv.2017.vcxproj", "{D5C87B19-150D-4EF3-A671-96589BD2D14A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aprtoolkit", "libs\unimrcp\libs\apr-toolkit\aprtoolkit.2017.vcxproj", "{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}" + ProjectSection(ProjectDependencies) = postProject + {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpf", "libs\unimrcp\libs\mpf\mpf.2017.vcxproj", "{B5A00BFA-6083-4FAE-A097-71642D6473B5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcp", "libs\unimrcp\libs\mrcp\mrcp.2017.vcxproj", "{1C320193-46A6-4B34-9C56-8AB584FC1B56}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpclient", "libs\unimrcp\libs\mrcp-client\mrcpclient.2017.vcxproj", "{72782932-37CC-46AE-8C7F-9A7B1A6EE108}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsignaling", "libs\unimrcp\libs\mrcp-signaling\mrcpsignaling.2017.vcxproj", "{12A49562-BAB9-43A3-A21D-15B60BBB4C31}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2transport", "libs\unimrcp\libs\mrcpv2-transport\mrcpv2transport.2017.vcxproj", "{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unirtsp", "libs\unimrcp\libs\uni-rtsp\unirtsp.2017.vcxproj", "{504B3154-7A4F-459D-9877-B951021C3F1F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\unimrcp\modules\mrcp-sofiasip\mrcpsofiasip.2017.vcxproj", "{746F3632-5BB2-4570-9453-31D6D58A7D8E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpunirtsp", "libs\unimrcp\modules\mrcp-unirtsp\mrcpunirtsp.2017.vcxproj", "{DEB01ACB-D65F-4A62-AED9-58C1054499E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_unimrcp", "src\mod\asr_tts\mod_unimrcp\mod_unimrcp.2017.vcxproj", "{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcelt", "libs\win32\celt\libcelt.2017.vcxproj", "{ABB71A76-42B0-47A4-973A-42E3D920C6FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FSComm", "fscomm\FSComm.2017.vcxproj", "{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_curl", "src\mod\applications\mod_curl\mod_curl.2017.vcxproj", "{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_silk", "src\mod\codecs\mod_silk\mod_silk.2017.vcxproj", "{AFA983D6-4569-4F88-BA94-555ED00FD9A8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\win32\libsilk\Silk_FIX.2017.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_avmd", "src\mod\applications\mod_avmd\mod_avmd.2017.vcxproj", "{990BAA76-89D3-4E38-8479-C7B28784EFC8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spandsp", "src\mod\applications\mod_spandsp\mod_spandsp.2017.vcxproj", "{1E21AFE0-6FDB-41D2-942D-863607C24B91}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_hash", "src\mod\applications\mod_hash\mod_hash.2017.vcxproj", "{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsofia_sip_ua_static", "libs\win32\sofia\libsofia_sip_ua_static.2017.vcxproj", "{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_directory", "src\mod\applications\mod_directory\mod_directory.2017.vcxproj", "{B889A18E-70A7-44B5-B2C9-47798D4F43B3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h323", "src\mod\endpoints\mod_h323\mod_h323.2017.vcxproj", "{05C9FB27-480E-4D53-B3B7-7338E2514666}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_distributor", "src\mod\applications\mod_distributor\mod_distributor.2017.vcxproj", "{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pt", "src\mod\say\mod_say_pt\mod_say_pt.2017.vcxproj", "{7C22BDFF-CC09-400C-8A09-660733980028}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_sv", "src\mod\say\mod_say_sv\mod_say_sv.2017.vcxproj", "{8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldns-lib\ldns-lib.2017.vcxproj", "{23B4D303-79FC-49E0-89E2-2280E7E28940}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_callcenter", "src\mod\applications\mod_callcenter\mod_callcenter.2017.vcxproj", "{47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_blacklist", "src\mod\applications\mod_blacklist\mod_blacklist.2017.vcxproj", "{50AAC2CE-BFC9-4912-87CC-C6381850D735}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spy", "src\mod\applications\mod_spy\mod_spy.2017.vcxproj", "{A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_httapi", "src\mod\applications\mod_httapi\mod_httapi.2017.vcxproj", "{4748FF56-CA85-4809-97D6-A94C0FAC1D77}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_abstraction", "src\mod\applications\mod_abstraction\mod_abstraction.2017.vcxproj", "{60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sms", "src\mod\applications\mod_sms\mod_sms.2017.vcxproj", "{2469B306-B027-4FF2-8815-C9C1EA2CAE79}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xmlrpc-c", "xmlrpc-c", "{9DE35039-A8F6-4FBF-B1B6-EB527F802411}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsmlib", "src\mod\endpoints\mod_gsmopen\gsmlib\gsmlib-1.10-patched-13ubuntu\win32\gsmlib.2017.vcxproj", "{26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endpoints\mod_gsmopen\mod_gsmopen.2017.vcxproj", "{74B120FF-6935-4DFE-A142-CDB6BEA99C90}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2017.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_redis", "src\mod\applications\mod_redis\mod_redis.2017.vcxproj", "{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libjpeg", "libs\win32\libjpeg\libjpeg.2017.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abyss", "libs\win32\xmlrpc-c\abyss.2017.vcxproj", "{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}" + ProjectSection(ProjectDependencies) = postProject + {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} + {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192} + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennmtab", "libs\win32\xmlrpc-c\gennmtab.2017.vcxproj", "{BED7539C-0099-4A14-AD5D-30828F15A171}" + ProjectSection(ProjectDependencies) = postProject + {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlparse", "libs\win32\xmlrpc-c\xmlparse.2017.vcxproj", "{0D108721-EAE8-4BAF-8102-D8960EC93647}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlrpc", "libs\win32\xmlrpc-c\xmlrpc.2017.vcxproj", "{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}" + ProjectSection(ProjectDependencies) = postProject + {0D108721-EAE8-4BAF-8102-D8960EC93647} = {0D108721-EAE8-4BAF-8102-D8960EC93647} + {B535402E-38D2-4D54-8360-423ACBD17192} = {B535402E-38D2-4D54-8360-423ACBD17192} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmltok", "libs\win32\xmlrpc-c\xmltok.2017.vcxproj", "{B535402E-38D2-4D54-8360-423ACBD17192}" + ProjectSection(ProjectDependencies) = postProject + {BED7539C-0099-4A14-AD5D-30828F15A171} = {BED7539C-0099-4A14-AD5D-30828F15A171} + EndProjectSection +EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup.2017", "w32\Setup\Setup.2017.wixproj", "{47213370-B933-487D-9F45-BCA26D7E2B6F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_math_fixed_tables", "libs\spandsp\src\msvc\make_math_fixed_tables.2017.vcxproj", "{2386B892-35F5-46CF-A0F0-10394D2FBF9B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcbt", "libs\win32\libcbt\libcbt.2017.vcxproj", "{77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_cielab_luts", "libs\spandsp\src\msvc\make_cielab_luts.2017.vcxproj", "{85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opus", "opus", "{ED2CA8B5-8E91-4296-A120-02BB0B674652}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "libs\win32\opus\opus.2017.vcxproj", "{FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.celt", "libs\win32\opus\opus.celt.2017.vcxproj", "{245603E3-F580-41A5-9632-B25FE3372CBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_common", "libs\win32\opus\opus.silk_common.2017.vcxproj", "{C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_fixed", "libs\win32\opus\opus.silk_fixed.2017.vcxproj", "{8484C90D-1561-402F-A91D-2DB10F8C5171}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus.silk_float", "libs\win32\opus\opus.silk_float.2017.vcxproj", "{9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_opus", "src\mod\codecs\mod_opus\mod_opus.2017.vcxproj", "{64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_t43_gray_code_tables", "libs\spandsp\src\msvc\make_t43_gray_code_tables.2017.vcxproj", "{EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winFailToBan", "src\mod\languages\mod_managed\managed\examples\winFailToBan\winFailToBan.csproj", "{5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rtc", "src\mod\endpoints\mod_rtc\mod_rtc.2017.vcxproj", "{3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_verto", "src\mod\endpoints\mod_verto\mod_verto.2017.vcxproj", "{5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyuv", "libs\win32\libyuv\libyuv.2017.vcxproj", "{B6E22500-3DB6-4E6E-8CD5-591B781D7D99}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvpx", "libs\win32\libvpx\libvpx.2017.vcxproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libs\win32\libpng\libpng.2017.vcxproj", "{D6973076-9317-4EF2-A0B8-B7A18AC0713E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype.2017", "libs\win32\freetype\freetype.2017.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_png", "src\mod\formats\mod_png\mod_png.2017.vcxproj", "{FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libav", "libs\win32\libav\libav.2017.vcxproj", "{841C345F-FCC7-4F64-8F54-0281CEABEB01}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_av", "src\mod\applications\mod_av\mod_av.2017.vcxproj", "{7AEE504B-23B6-4B05-829E-7CD34855F146}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libx264", "libs\win32\libx264\libx264.2017.vcxproj", "{20179127-853B-4FE9-B7C0-9E817E6A3A72}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_http_cache", "src\mod\applications\mod_http_cache\mod_http_cache.2017.vcxproj", "{87933C2D-0159-46F7-B326-E1B6E982C21E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcodec2", "libs\win32\libcodec2\libcodec2.2017.vcxproj", "{19E934D6-1484-41C8-9305-78DC42FD61F2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_codec2", "src\mod\codecs\mod_codec2\mod_codec2.2017.vcxproj", "{CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amqp", "src\mod\event_handlers\mod_amqp\mod_amqp.2017.vcxproj", "{7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_pg_csv", "src\mod\event_handlers\mod_cdr_pg_csv\mod_cdr_pg_csv.2017.vcxproj", "{411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_es_ar", "src\mod\say\mod_say_es_ar\mod_say_es_ar.2017.vcxproj", "{CEEE31E6-8A08-42C7-BEBD-5EC12072C136}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_fa", "src\mod\say\mod_say_fa\mod_say_fa.2017.vcxproj", "{0E469F3A-DDD0-43BA-A94F-7D93C02219F3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_he", "src\mod\say\mod_say_he\mod_say_he.2017.vcxproj", "{A3D7C6CF-AEB1-4159-B741-160EB4B37345}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hr", "src\mod\say\mod_say_hr\mod_say_hr.2017.vcxproj", "{DA7ADDF1-DA33-4194-83A5-B48DB714D35B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_hu", "src\mod\say\mod_say_hu\mod_say_hu.2017.vcxproj", "{AF675478-995A-4115-90C4-B2B0D6470688}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_ja", "src\mod\say\mod_say_ja\mod_say_ja.2017.vcxproj", "{07EA6E5A-D181-4ABB-BECF-67A906867D04}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_pl", "src\mod\say\mod_say_pl\mod_say_pl.2017.vcxproj", "{20B15650-F910-4211-8729-AAB0F520C805}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_th", "src\mod\say\mod_say_th\mod_say_th.2017.vcxproj", "{C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_odbc_cdr", "src\mod\event_handlers\mod_odbc_cdr\mod_odbc_cdr.2017.vcxproj", "{096C9A84-55B2-4F9B-97E5-0FDF116FD25F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_sqlite", "src\mod\event_handlers\mod_cdr_sqlite\mod_cdr_sqlite.2017.vcxproj", "{2CA661A7-01DD-4532-BF88-B6629DFB544A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cv", "src\mod\applications\mod_cv\mod_cv.2017.vcxproj", "{40C4E2A2-B49B-496C-96D6-C04B890F7F88}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cidlookup", "src\mod\applications\mod_cidlookup\mod_cidlookup.2017.vcxproj", "{0A130A8B-3076-4619-BADF-9E86F621AEEC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr_mongodb", "src\mod\event_handlers\mod_cdr_mongodb\mod_cdr_mongodb.2017.vcxproj", "{4DFF29B4-2976-447D-A8B3-43476451517C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ffmpeg", "libs\win32\ffmpeg\ffmpeg.2017.vcxproj", "{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9388C266-C3FC-468A-92EF-0CBC35941412}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mod_av", "src\mod\applications\mod_av\test\test_mod_av.2017.vcxproj", "{7926CB0D-62CE-4A09-AE94-1DA2BC92D625}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + All|Win32 = All|Win32 + All|x64 = All|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|Win32.ActiveCfg = Release|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.ActiveCfg = Release|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.Build.0 = Release|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.ActiveCfg = Debug|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.Build.0 = Debug|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.ActiveCfg = Release|x64 + {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.Build.0 = Release|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|Win32.ActiveCfg = Release|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.ActiveCfg = Release|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.Build.0 = Release|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.ActiveCfg = Debug|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.Build.0 = Debug|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.ActiveCfg = Release|x64 + {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.Build.0 = Release|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|Win32.ActiveCfg = Release Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.ActiveCfg = Release Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.Build.0 = Release Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.ActiveCfg = Debug Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.Build.0 = Debug Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.ActiveCfg = Release Passthrough|x64 + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.Build.0 = Release Passthrough|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|Win32.ActiveCfg = Release|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.ActiveCfg = Release|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.Build.0 = Release|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.ActiveCfg = Debug|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.Build.0 = Debug|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.ActiveCfg = Release|x64 + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.Build.0 = Release|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|Win32.ActiveCfg = Release|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.ActiveCfg = Release|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.Build.0 = Release|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.ActiveCfg = Debug|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.Build.0 = Debug|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.ActiveCfg = Release|x64 + {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.Build.0 = Release|x64 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|Win32.ActiveCfg = Release|Win32 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64.ActiveCfg = Release|Win32 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64.ActiveCfg = Debug|Win32 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32 + {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64.ActiveCfg = Release|Win32 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|Win32.ActiveCfg = Release|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.ActiveCfg = Release|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.Build.0 = Release|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.ActiveCfg = Debug|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.Build.0 = Debug|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.ActiveCfg = Release|x64 + {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.Build.0 = Release|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|Win32.ActiveCfg = Release MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.ActiveCfg = Release MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.Build.0 = Release MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.ActiveCfg = Debug MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.Build.0 = Debug MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.ActiveCfg = Release MS-LDAP|x64 + {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.Build.0 = Release MS-LDAP|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|Win32.ActiveCfg = Release|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.ActiveCfg = Release|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.Build.0 = Release|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.ActiveCfg = Debug|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.Build.0 = Debug|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.ActiveCfg = Release|x64 + {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.Build.0 = Release|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.All|Win32.ActiveCfg = Release|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.ActiveCfg = Release|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.Build.0 = Release|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.ActiveCfg = Debug|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.Build.0 = Debug|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.ActiveCfg = Release|x64 + {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.Build.0 = Release|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.All|Win32.ActiveCfg = Release|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.ActiveCfg = Release|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.Build.0 = Release|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.ActiveCfg = Debug|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.Build.0 = Debug|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.ActiveCfg = Release|x64 + {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.Build.0 = Release|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|Win32.ActiveCfg = Release|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.ActiveCfg = Release|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.All|x64.Build.0 = Release|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|Win32.Build.0 = Debug|Win32 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.ActiveCfg = Debug|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Debug|x64.Build.0 = Debug|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.ActiveCfg = Release|Win32 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|Win32.Build.0 = Release|Win32 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.ActiveCfg = Release|x64 + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064}.Release|x64.Build.0 = Release|x64 + {8B754330-A434-4791-97E5-1EE67060BAC0}.All|Win32.ActiveCfg = Release|x64 + {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.ActiveCfg = Release|x64 + {8B754330-A434-4791-97E5-1EE67060BAC0}.All|x64.Build.0 = Release|x64 + {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|Win32.ActiveCfg = Debug|Win32 + {8B754330-A434-4791-97E5-1EE67060BAC0}.Debug|x64.ActiveCfg = Debug|x64 + {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|Win32.ActiveCfg = Release|Win32 + {8B754330-A434-4791-97E5-1EE67060BAC0}.Release|x64.ActiveCfg = Release|x64 + {692F6330-4D87-4C82-81DF-40DB5892636E}.All|Win32.ActiveCfg = Release|x64 + {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.ActiveCfg = Release|x64 + {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.Build.0 = Release|x64 + {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32 + {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64.ActiveCfg = Debug|x64 + {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32 + {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64.ActiveCfg = Release|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|Win32.ActiveCfg = Release|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.ActiveCfg = Release|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.Build.0 = Release|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.ActiveCfg = Debug|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.Build.0 = Debug|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64 + {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64 + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.ActiveCfg = Debug|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.Build.0 = Debug|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.ActiveCfg = Release|x64 + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.Build.0 = Release|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.All|Win32.ActiveCfg = Release|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.ActiveCfg = Release|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.Build.0 = Release|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32 + {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.ActiveCfg = Debug|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.Build.0 = Debug|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32 + {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32 + {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.ActiveCfg = Release|x64 + {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.Build.0 = Release|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|Win32.ActiveCfg = Release|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.ActiveCfg = Release|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.Build.0 = Release|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.ActiveCfg = Debug|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.Build.0 = Debug|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.ActiveCfg = Release|x64 + {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.Build.0 = Release|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|Win32.ActiveCfg = Release|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.ActiveCfg = Release|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.Build.0 = Release|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.ActiveCfg = Debug|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.Build.0 = Debug|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.ActiveCfg = Release|x64 + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.Build.0 = Release|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.All|Win32.ActiveCfg = Release|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.ActiveCfg = Release|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.Build.0 = Release|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32 + {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32 + {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.ActiveCfg = Debug|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.Build.0 = Debug|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32 + {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32 + {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.ActiveCfg = Release|x64 + {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.Build.0 = Release|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|Win32.ActiveCfg = Release|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.ActiveCfg = Release|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.Build.0 = Release|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.ActiveCfg = Debug|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.Build.0 = Debug|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.ActiveCfg = Release|x64 + {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.Build.0 = Release|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.All|Win32.ActiveCfg = Release|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.ActiveCfg = Release|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.Build.0 = Release|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.ActiveCfg = Debug|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.Build.0 = Debug|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64 + {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64 + {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.ActiveCfg = Debug|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.Build.0 = Debug|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.ActiveCfg = Release|x64 + {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.Build.0 = Release|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|Win32.ActiveCfg = Release DLL|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.ActiveCfg = Release DLL|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.Build.0 = Release DLL|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug|Win32 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug|Win32 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.ActiveCfg = Debug|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.Build.0 = Debug|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release|Win32 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release|Win32 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.ActiveCfg = Release|x64 + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.Build.0 = Release|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|Win32.ActiveCfg = Release|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.ActiveCfg = Release|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.Build.0 = Release|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.ActiveCfg = Debug|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.Build.0 = Debug|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64 + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64 + {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.ActiveCfg = Debug|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.Build.0 = Debug|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64 + {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64 + {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.ActiveCfg = Debug|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.Build.0 = Debug|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.ActiveCfg = Release|x64 + {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.Build.0 = Release|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|Win32.ActiveCfg = Release DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.ActiveCfg = Release DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.Build.0 = Release DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.ActiveCfg = Debug DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.Build.0 = Debug DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.ActiveCfg = Release DLL|x64 + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.Build.0 = Release DLL|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|Win32.ActiveCfg = Release Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.ActiveCfg = Release Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.Build.0 = Release Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.ActiveCfg = Debug Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.Build.0 = Debug Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.ActiveCfg = Release Passthrough|x64 + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.Build.0 = Release Passthrough|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|Win32.ActiveCfg = Release|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.ActiveCfg = Release|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.All|x64.Build.0 = Release|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.ActiveCfg = Debug|Win32 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|Win32.Build.0 = Debug|Win32 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.ActiveCfg = Debug|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Debug|x64.Build.0 = Debug|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.ActiveCfg = Release|Win32 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|Win32.Build.0 = Release|Win32 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.ActiveCfg = Release|x64 + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD}.Release|x64.Build.0 = Release|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|Win32.ActiveCfg = Release|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.ActiveCfg = Release|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.Build.0 = Release|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.ActiveCfg = Debug|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.Build.0 = Debug|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.ActiveCfg = Release|x64 + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.Build.0 = Release|x64 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32 + {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64 + {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|Win32.ActiveCfg = Release|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.ActiveCfg = Release|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.Build.0 = Release|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.ActiveCfg = Debug|Win32 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.Build.0 = Debug|Win32 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.ActiveCfg = Debug|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.Build.0 = Debug|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.ActiveCfg = Release|Win32 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.Build.0 = Release|Win32 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.ActiveCfg = Release|x64 + {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.Build.0 = Release|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|Win32.ActiveCfg = Release|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.ActiveCfg = Release|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.Build.0 = Release|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.ActiveCfg = Debug|Win32 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.Build.0 = Debug|Win32 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.ActiveCfg = Debug|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.Build.0 = Debug|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.ActiveCfg = Release|Win32 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.Build.0 = Release|Win32 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.ActiveCfg = Release|x64 + {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.Build.0 = Release|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|Win32.ActiveCfg = Release DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.ActiveCfg = Release DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.Build.0 = Release DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug DirectSound|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug DirectSound|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release DirectSound|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release DirectSound|Win32 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release DirectSound|x64 + {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release DirectSound|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.ActiveCfg = Debug|Win32 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.Build.0 = Debug|Win32 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.ActiveCfg = Debug|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.Build.0 = Debug|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.ActiveCfg = Release|Win32 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.Build.0 = Release|Win32 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.ActiveCfg = Release|x64 + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.Build.0 = Release|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|Win32.ActiveCfg = Release Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.ActiveCfg = Release Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.Build.0 = Release Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.Build.0 = Debug Passthrough|Win32 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.ActiveCfg = Debug Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.Build.0 = Debug Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.ActiveCfg = Release Passthrough|Win32 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.Build.0 = Release Passthrough|Win32 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.ActiveCfg = Release Passthrough|x64 + {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.Build.0 = Release Passthrough|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|Win32.ActiveCfg = Release|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.ActiveCfg = Release|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.Build.0 = Release|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.ActiveCfg = Debug|Win32 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.Build.0 = Debug|Win32 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.ActiveCfg = Debug|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.Build.0 = Debug|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.ActiveCfg = Release|Win32 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.Build.0 = Release|Win32 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.ActiveCfg = Release|x64 + {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.Build.0 = Release|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|Win32.ActiveCfg = Release|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.ActiveCfg = Release|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.Build.0 = Release|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.ActiveCfg = Debug|Win32 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.Build.0 = Debug|Win32 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.ActiveCfg = Debug|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.Build.0 = Debug|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|x64 + {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.Build.0 = Release|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|Win32.ActiveCfg = Release|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.ActiveCfg = Release|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.Build.0 = Release|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.Build.0 = Debug|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|x64 + {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.Build.0 = Release|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|Win32.ActiveCfg = Release|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.ActiveCfg = Release|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.Build.0 = Release|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.Build.0 = Debug|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|x64 + {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.Build.0 = Release|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|Win32.ActiveCfg = Release|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.ActiveCfg = Release|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.Build.0 = Release|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.ActiveCfg = Debug|Win32 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.Build.0 = Debug|Win32 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.ActiveCfg = Debug|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.Build.0 = Debug|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.ActiveCfg = Release|Win32 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.Build.0 = Release|Win32 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.ActiveCfg = Release|x64 + {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.Build.0 = Release|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|Win32.ActiveCfg = Release|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.ActiveCfg = Release|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.Build.0 = Release|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.ActiveCfg = Debug|Win32 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.Build.0 = Debug|Win32 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.ActiveCfg = Debug|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.Build.0 = Debug|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.ActiveCfg = Release|Win32 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.Build.0 = Release|Win32 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.ActiveCfg = Release|x64 + {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.Build.0 = Release|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|Win32.ActiveCfg = Release|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.ActiveCfg = Release|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.Build.0 = Release|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.Build.0 = Debug|Win32 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.ActiveCfg = Debug|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.Build.0 = Debug|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.ActiveCfg = Release|Win32 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.Build.0 = Release|Win32 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.ActiveCfg = Release|x64 + {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.Build.0 = Release|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|Win32.ActiveCfg = Release|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.ActiveCfg = Release|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.Build.0 = Release|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.Build.0 = Debug|Win32 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.ActiveCfg = Debug|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.Build.0 = Debug|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.ActiveCfg = Release|Win32 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.Build.0 = Release|Win32 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.ActiveCfg = Release|x64 + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.Build.0 = Release|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|Win32.ActiveCfg = Release|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.ActiveCfg = Release|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.Build.0 = Release|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.ActiveCfg = Debug|Win32 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.Build.0 = Debug|Win32 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.ActiveCfg = Debug|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.Build.0 = Debug|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.ActiveCfg = Release|Win32 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.Build.0 = Release|Win32 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.ActiveCfg = Release|x64 + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.Build.0 = Release|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|Win32.ActiveCfg = Release|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.ActiveCfg = Release|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.Build.0 = Release|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.ActiveCfg = Debug|Win32 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.Build.0 = Debug|Win32 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.ActiveCfg = Debug|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.Build.0 = Debug|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.ActiveCfg = Release|Win32 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.Build.0 = Release|Win32 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.ActiveCfg = Release|x64 + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.Build.0 = Release|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.All|Win32.ActiveCfg = Release|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.ActiveCfg = Release|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.All|x64.Build.0 = Release|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.ActiveCfg = Debug|Win32 + {F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.Build.0 = Debug|Win32 + {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.ActiveCfg = Debug|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.Build.0 = Debug|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.ActiveCfg = Release|Win32 + {F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.Build.0 = Release|Win32 + {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.ActiveCfg = Release|x64 + {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.Build.0 = Release|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|Win32.ActiveCfg = Release|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.ActiveCfg = Release|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.Build.0 = Release|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.ActiveCfg = Debug|Win32 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.Build.0 = Debug|Win32 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.ActiveCfg = Debug|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.Build.0 = Debug|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.ActiveCfg = Release|Win32 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.Build.0 = Release|Win32 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.ActiveCfg = Release|x64 + {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.Build.0 = Release|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|Win32.ActiveCfg = Release|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.ActiveCfg = Release|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.Build.0 = Release|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.ActiveCfg = Debug|Win32 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.Build.0 = Debug|Win32 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.ActiveCfg = Debug|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.Build.0 = Debug|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.ActiveCfg = Release|Win32 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.Build.0 = Release|Win32 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.ActiveCfg = Release|x64 + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.Build.0 = Release|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|Win32.ActiveCfg = Release|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.ActiveCfg = Release|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.Build.0 = Release|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.ActiveCfg = Debug|Win32 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.Build.0 = Debug|Win32 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.ActiveCfg = Debug|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.Build.0 = Debug|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.ActiveCfg = Release|Win32 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.Build.0 = Release|Win32 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.ActiveCfg = Release|x64 + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.Build.0 = Release|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|Win32.ActiveCfg = Release|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.ActiveCfg = Release|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.Build.0 = Release|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.ActiveCfg = Debug|Win32 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.Build.0 = Debug|Win32 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.ActiveCfg = Debug|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.Build.0 = Debug|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.ActiveCfg = Release|Win32 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.Build.0 = Release|Win32 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.ActiveCfg = Release|x64 + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.Build.0 = Release|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|Win32.ActiveCfg = Release|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.ActiveCfg = Release|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.Build.0 = Release|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.ActiveCfg = Debug|Win32 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.Build.0 = Debug|Win32 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.ActiveCfg = Debug|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.Build.0 = Debug|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.ActiveCfg = Release|Win32 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.Build.0 = Release|Win32 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.ActiveCfg = Release|x64 + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.Build.0 = Release|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|Win32.ActiveCfg = Release|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.ActiveCfg = Release|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.Build.0 = Release|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.ActiveCfg = Debug|Win32 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.Build.0 = Debug|Win32 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.ActiveCfg = Debug|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.Build.0 = Debug|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.ActiveCfg = Release|Win32 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.Build.0 = Release|Win32 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.ActiveCfg = Release|x64 + {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.Build.0 = Release|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|Win32.ActiveCfg = Release|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.ActiveCfg = Release|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.Build.0 = Release|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.Build.0 = Debug|Win32 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.ActiveCfg = Debug|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.Build.0 = Debug|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.Build.0 = Release|Win32 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.ActiveCfg = Release|x64 + {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.Build.0 = Release|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|Win32.ActiveCfg = Debug|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.ActiveCfg = Debug|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.Build.0 = Debug|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.ActiveCfg = Debug|Win32 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.Build.0 = Debug|Win32 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.ActiveCfg = Debug|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.Build.0 = Debug|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.ActiveCfg = Release|Win32 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.Build.0 = Release|Win32 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.ActiveCfg = Release|x64 + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.Build.0 = Release|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.All|Win32.ActiveCfg = Debug|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.ActiveCfg = Debug|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.All|x64.Build.0 = Debug|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32 + {94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32 + {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32 + {94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32 + {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64 + {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|Win32.ActiveCfg = Release|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.ActiveCfg = Release|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.Build.0 = Release|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.ActiveCfg = Debug|Win32 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.Build.0 = Debug|Win32 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.ActiveCfg = Debug|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.Build.0 = Debug|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.ActiveCfg = Release|Win32 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.Build.0 = Release|Win32 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.ActiveCfg = Release|x64 + {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.Build.0 = Release|x64 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.ActiveCfg = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.Build.0 = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.ActiveCfg = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64 + {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64 + {7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32 + {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.Build.0 = Debug|Win32 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64 + {464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32 + {464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32 + {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32 + {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.Build.0 = Debug|Win32 + {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64 + {464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32 + {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.Build.0 = Release|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.ActiveCfg = Release|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.Build.0 = Release|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.Build.0 = Debug|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.ActiveCfg = Debug|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.Build.0 = Debug|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.ActiveCfg = Release|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.Build.0 = Release|Win32 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.ActiveCfg = Release|x64 + {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.Build.0 = Release|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|Win32.ActiveCfg = Debug|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.ActiveCfg = Debug|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.Build.0 = Debug|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.ActiveCfg = Debug|Win32 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.Build.0 = Debug|Win32 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.ActiveCfg = Debug|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.Build.0 = Debug|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.ActiveCfg = Release|Win32 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.Build.0 = Release|Win32 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.ActiveCfg = Release|x64 + {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.Build.0 = Release|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|Win32.ActiveCfg = Debug|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.ActiveCfg = Debug|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.Build.0 = Debug|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.Build.0 = Debug|Win32 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.ActiveCfg = Debug|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.Build.0 = Debug|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.ActiveCfg = Release|Win32 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.Build.0 = Release|Win32 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.ActiveCfg = Release|x64 + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.Build.0 = Release|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.All|Win32.ActiveCfg = Release|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.ActiveCfg = Release|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.Build.0 = Release|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.ActiveCfg = Debug|Win32 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.Build.0 = Debug|Win32 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.ActiveCfg = Debug|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.Build.0 = Debug|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.ActiveCfg = Release|Win32 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.Build.0 = Release|Win32 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.ActiveCfg = Release|x64 + {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.Build.0 = Release|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|Win32.ActiveCfg = Debug|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.ActiveCfg = Debug|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.Build.0 = Debug|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.ActiveCfg = Debug|Win32 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.Build.0 = Debug|Win32 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.ActiveCfg = Debug|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.Build.0 = Debug|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.ActiveCfg = Release|Win32 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.Build.0 = Release|Win32 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.ActiveCfg = Release|x64 + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.Build.0 = Release|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|Win32.ActiveCfg = Release|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.ActiveCfg = Release|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.Build.0 = Release|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.ActiveCfg = Debug|Win32 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.Build.0 = Debug|Win32 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.ActiveCfg = Debug|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.Build.0 = Debug|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.ActiveCfg = Release|Win32 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.Build.0 = Release|Win32 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.ActiveCfg = Release|x64 + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.Build.0 = Release|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|Win32.ActiveCfg = Release|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.ActiveCfg = Release|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.Build.0 = Release|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.Build.0 = Debug|Win32 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.ActiveCfg = Debug|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.Build.0 = Debug|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.ActiveCfg = Release|Win32 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.Build.0 = Release|Win32 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.ActiveCfg = Release|x64 + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.Build.0 = Release|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|Win32.ActiveCfg = Release_Mono|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.ActiveCfg = Release_Mono|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.Build.0 = Release_Mono|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.ActiveCfg = Debug_CLR|Win32 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.Build.0 = Debug_CLR|Win32 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.ActiveCfg = Debug_CLR|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.Build.0 = Debug_CLR|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.ActiveCfg = Release_CLR|Win32 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.Build.0 = Release_CLR|Win32 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.ActiveCfg = Release_CLR|x64 + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.Build.0 = Release_CLR|x64 + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|Win32.ActiveCfg = Release|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64.ActiveCfg = Release|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.ActiveCfg = Debug|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.Build.0 = Debug|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.ActiveCfg = Debug|x64 + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.Build.0 = Debug|x64 + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.ActiveCfg = Release|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.Build.0 = Release|Any CPU + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.ActiveCfg = Release|x64 + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.Build.0 = Release|x64 + {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.ActiveCfg = Debug_Generic_Dll|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.Build.0 = Debug_Generic_Dll|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.ActiveCfg = Debug_Generic_Dll|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.ActiveCfg = Debug_Generic|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.Build.0 = Debug_Generic|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.ActiveCfg = Debug_Generic|x64 + {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.Build.0 = Debug_Generic|x64 + {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.ActiveCfg = Release_Generic|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.Build.0 = Release_Generic|Win32 + {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.ActiveCfg = Release_Generic|x64 + {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.Build.0 = Release_Generic|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|Win32.ActiveCfg = Release|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.ActiveCfg = Release|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.Build.0 = Release|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.Build.0 = Debug|Win32 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.ActiveCfg = Debug|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.Build.0 = Debug|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|x64 + {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.Build.0 = Release|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|Win32.ActiveCfg = Release|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.ActiveCfg = Release|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.Build.0 = Release|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.Build.0 = Debug|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|x64 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.Build.0 = Release|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|Win32.ActiveCfg = Release|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.ActiveCfg = Release|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.Build.0 = Release|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.ActiveCfg = Debug|Win32 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.Build.0 = Debug|Win32 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.ActiveCfg = Debug|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.Build.0 = Debug|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.ActiveCfg = Release|Win32 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.Build.0 = Release|Win32 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.ActiveCfg = Release|x64 + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.Build.0 = Release|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.All|Win32.ActiveCfg = Release|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.ActiveCfg = Release|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.Build.0 = Release|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.Build.0 = Debug|Win32 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.ActiveCfg = Debug|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.Build.0 = Debug|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.ActiveCfg = Release|Win32 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.Build.0 = Release|Win32 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.ActiveCfg = Release|x64 + {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.Build.0 = Release|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|Win32.ActiveCfg = Release|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.ActiveCfg = Release|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.Build.0 = Release|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.Build.0 = Debug|Win32 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.ActiveCfg = Debug|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.Build.0 = Debug|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.ActiveCfg = Release|Win32 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.Build.0 = Release|Win32 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.ActiveCfg = Release|x64 + {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.Build.0 = Release|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|Win32.ActiveCfg = Release|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.ActiveCfg = Release|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.Build.0 = Release|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.ActiveCfg = Debug|Win32 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.Build.0 = Debug|Win32 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.ActiveCfg = Debug|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.Build.0 = Debug|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.ActiveCfg = Release|Win32 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.Build.0 = Release|Win32 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.ActiveCfg = Release|x64 + {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.Build.0 = Release|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|Win32.ActiveCfg = Release|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.ActiveCfg = Release|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.Build.0 = Release|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.ActiveCfg = Debug|Win32 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.Build.0 = Debug|Win32 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.ActiveCfg = Debug|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.Build.0 = Debug|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.ActiveCfg = Release|Win32 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.Build.0 = Release|Win32 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.ActiveCfg = Release|x64 + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.Build.0 = Release|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|Win32.ActiveCfg = Release|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.ActiveCfg = Release|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.Build.0 = Release|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.Build.0 = Debug|Win32 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.ActiveCfg = Debug|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.Build.0 = Debug|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.ActiveCfg = Release|Win32 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.Build.0 = Release|Win32 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.ActiveCfg = Release|x64 + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.Build.0 = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64 + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64 + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.ActiveCfg = Release_Dynamic|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.Build.0 = Release_Dynamic|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.ActiveCfg = Release_Dynamic|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.Build.0 = Release_Dynamic|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.ActiveCfg = Debug|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.Build.0 = Debug|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.ActiveCfg = Release|x64 + {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.Build.0 = Release|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|Win32.ActiveCfg = Release_Static_SSE|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.ActiveCfg = Release_Static_SSE|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.Build.0 = Release_Static_SSE|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.Build.0 = Debug|Win32 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.ActiveCfg = Debug|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.Build.0 = Debug|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.Build.0 = Release|Win32 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.ActiveCfg = Release|x64 + {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.Build.0 = Release|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|Win32.ActiveCfg = Release|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.ActiveCfg = Release|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.Build.0 = Release|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.Build.0 = Debug|Win32 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.ActiveCfg = Debug|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.Build.0 = Debug|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.ActiveCfg = Release|Win32 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.Build.0 = Release|Win32 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.ActiveCfg = Release|x64 + {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.Build.0 = Release|x64 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.Build.0 = Release|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|Win32.ActiveCfg = Debug|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64.ActiveCfg = Debug|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|Win32.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64.ActiveCfg = Release|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|Win32.ActiveCfg = Release|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64.ActiveCfg = Release|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.ActiveCfg = Debug|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.Build.0 = Debug|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.ActiveCfg = Debug|x64 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.Build.0 = Debug|x64 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.ActiveCfg = Release|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.Build.0 = Release|Win32 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.ActiveCfg = Release|x64 + {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.Build.0 = Release|x64 + {48414740-C693-4968-9846-EE058020C64F}.All|Win32.ActiveCfg = Release|Win32 + {48414740-C693-4968-9846-EE058020C64F}.All|x64.ActiveCfg = Release|Win32 + {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.ActiveCfg = Debug|Win32 + {48414740-C693-4968-9846-EE058020C64F}.Debug|Win32.Build.0 = Debug|Win32 + {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.ActiveCfg = Debug|x64 + {48414740-C693-4968-9846-EE058020C64F}.Debug|x64.Build.0 = Debug|x64 + {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.ActiveCfg = Release|Win32 + {48414740-C693-4968-9846-EE058020C64F}.Release|Win32.Build.0 = Release|Win32 + {48414740-C693-4968-9846-EE058020C64F}.Release|x64.ActiveCfg = Release|x64 + {48414740-C693-4968-9846-EE058020C64F}.Release|x64.Build.0 = Release|x64 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.Build.0 = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32 + {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.Build.0 = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32 + {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.Build.0 = All|Win32 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|Win32.ActiveCfg = Release|x64 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.ActiveCfg = Release|x64 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.Build.0 = Release|x64 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|Win32.ActiveCfg = Debug|Win32 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64.ActiveCfg = Debug|x64 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|Win32.ActiveCfg = Release|Win32 + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64.ActiveCfg = Release|x64 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.ActiveCfg = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.Build.0 = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.ActiveCfg = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64 + {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.Build.0 = Debug|Win32 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.Build.0 = Debug|Win32 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.ActiveCfg = Debug|Win32 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.Build.0 = Debug|Win32 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.ActiveCfg = Debug|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.Build.0 = Debug|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.ActiveCfg = Release|Win32 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.Build.0 = Release|Win32 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.ActiveCfg = Release|x64 + {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.Build.0 = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.ActiveCfg = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.Build.0 = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.ActiveCfg = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.Build.0 = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.ActiveCfg = Debug|Win32 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.Build.0 = Debug|Win32 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.ActiveCfg = Debug|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.Build.0 = Debug|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.ActiveCfg = Release|Win32 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.Build.0 = Release|Win32 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.ActiveCfg = Release|x64 + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.Build.0 = Release|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|Win32.ActiveCfg = Release|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64.ActiveCfg = Release|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.ActiveCfg = Debug|Win32 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.Build.0 = Debug|Win32 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.ActiveCfg = Debug|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.Build.0 = Debug|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.ActiveCfg = Release|Win32 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.Build.0 = Release|Win32 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.ActiveCfg = Release|x64 + {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.Build.0 = Release|x64 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.ActiveCfg = Release|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.Build.0 = Release|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64.ActiveCfg = Release|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.ActiveCfg = Debug|x64 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.Build.0 = Debug|x64 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.ActiveCfg = Release|x64 + {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.Build.0 = Release|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|Win32.ActiveCfg = Release|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.ActiveCfg = Release|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.Build.0 = Release|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.ActiveCfg = Debug|Win32 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.Build.0 = Debug|Win32 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.ActiveCfg = Debug|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.Build.0 = Debug|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.ActiveCfg = Release|Win32 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64 + {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64 + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64 + {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64 + {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64 + {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64 + {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64 + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64 + {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64 + {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64 + {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64 + {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64 + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.Build.0 = Debug|Win32 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.ActiveCfg = Debug|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.Build.0 = Debug|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.ActiveCfg = Release|Win32 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.Build.0 = Release|Win32 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.ActiveCfg = Release|x64 + {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.Build.0 = Release|x64 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.ActiveCfg = Release|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.Build.0 = Release|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64.ActiveCfg = Release|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64.ActiveCfg = Debug|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|Win32.ActiveCfg = Release|Win32 + {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64.ActiveCfg = Release|Win32 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|Win32.ActiveCfg = Release|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.ActiveCfg = Release|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.Build.0 = Release|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.Build.0 = Debug|Win32 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.ActiveCfg = Debug|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.Build.0 = Debug|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.ActiveCfg = Release|Win32 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.Build.0 = Release|Win32 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.ActiveCfg = Release|x64 + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.Build.0 = Release|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|Win32.ActiveCfg = Release|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.ActiveCfg = Release|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.Build.0 = Release|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.ActiveCfg = Debug|Win32 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.Build.0 = Debug|Win32 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.ActiveCfg = Debug|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.Build.0 = Debug|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.ActiveCfg = Release|Win32 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.Build.0 = Release|Win32 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.ActiveCfg = Release|x64 + {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.Build.0 = Release|x64 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.ActiveCfg = Release|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.Build.0 = Release|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64.ActiveCfg = Release|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.ActiveCfg = Debug|x64 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.Build.0 = Debug|x64 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.ActiveCfg = Release|x64 + {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.Build.0 = Release|x64 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.ActiveCfg = Release|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.Build.0 = Release|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64.ActiveCfg = Release|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.ActiveCfg = Debug|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.Build.0 = Debug|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.ActiveCfg = Debug|x64 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.Build.0 = Debug|x64 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.ActiveCfg = Release|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.Build.0 = Release|Win32 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.ActiveCfg = Release|x64 + {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.Build.0 = Release|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|Win32.ActiveCfg = Release|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.ActiveCfg = Release|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.Build.0 = Release|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.Build.0 = Debug|Win32 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.ActiveCfg = Debug|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.Build.0 = Debug|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.ActiveCfg = Release|Win32 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.Build.0 = Release|Win32 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.ActiveCfg = Release|x64 + {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.Build.0 = Release|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|Win32.ActiveCfg = Release|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.ActiveCfg = Release|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.Build.0 = Release|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.ActiveCfg = Debug|Win32 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.Build.0 = Debug|Win32 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.ActiveCfg = Debug|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.Build.0 = Debug|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.ActiveCfg = Release|Win32 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.Build.0 = Release|Win32 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.ActiveCfg = Release|x64 + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.Build.0 = Release|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|Win32.ActiveCfg = Release|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.ActiveCfg = Release|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.Build.0 = Release|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.ActiveCfg = Debug|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.Build.0 = Debug|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.ActiveCfg = Release|x64 + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.Build.0 = Release|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|Win32.ActiveCfg = Release|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.ActiveCfg = Release|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.Build.0 = Release|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.Build.0 = Debug|Win32 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.Build.0 = Debug|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.Build.0 = Release|Win32 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|x64 + {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.Build.0 = Release|x64 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.Build.0 = Release|Win32 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|Win32.ActiveCfg = Debug|Win32 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64.ActiveCfg = Debug|x64 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|Win32.ActiveCfg = Release|Win32 + {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64.ActiveCfg = Release|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|Win32.ActiveCfg = Release|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.ActiveCfg = Release|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.Build.0 = Release|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.ActiveCfg = Debug|Win32 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.Build.0 = Debug|Win32 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.ActiveCfg = Debug|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.Build.0 = Debug|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.ActiveCfg = Release|Win32 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.Build.0 = Release|Win32 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.ActiveCfg = Release|x64 + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.Build.0 = Release|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.All|Win32.ActiveCfg = Release|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.ActiveCfg = Release|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.All|x64.Build.0 = Release|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|Win32.Build.0 = Debug|Win32 + {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.ActiveCfg = Debug|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.Debug|x64.Build.0 = Debug|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.ActiveCfg = Release|Win32 + {7C22BDFF-CC09-400C-8A09-660733980028}.Release|Win32.Build.0 = Release|Win32 + {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.ActiveCfg = Release|x64 + {7C22BDFF-CC09-400C-8A09-660733980028}.Release|x64.Build.0 = Release|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.ActiveCfg = Release|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|Win32.Build.0 = Release|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.ActiveCfg = Release|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.All|x64.Build.0 = Release|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.ActiveCfg = Debug|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|Win32.Build.0 = Debug|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.ActiveCfg = Debug|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Debug|x64.Build.0 = Debug|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.ActiveCfg = Release|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|Win32.Build.0 = Release|Win32 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.ActiveCfg = Release|x64 + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15}.Release|x64.Build.0 = Release|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|Win32.ActiveCfg = Release|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.ActiveCfg = Release|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.All|x64.Build.0 = Release|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.ActiveCfg = Debug|Win32 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|Win32.Build.0 = Debug|Win32 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.ActiveCfg = Debug|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Debug|x64.Build.0 = Debug|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.ActiveCfg = Release|Win32 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|Win32.Build.0 = Release|Win32 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.ActiveCfg = Release|x64 + {23B4D303-79FC-49E0-89E2-2280E7E28940}.Release|x64.Build.0 = Release|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|Win32.ActiveCfg = Release|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.ActiveCfg = Release|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.All|x64.Build.0 = Release|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.ActiveCfg = Debug|Win32 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|Win32.Build.0 = Debug|Win32 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.ActiveCfg = Debug|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Debug|x64.Build.0 = Debug|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.ActiveCfg = Release|Win32 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|Win32.Build.0 = Release|Win32 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.ActiveCfg = Release|x64 + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A}.Release|x64.Build.0 = Release|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|Win32.ActiveCfg = Release|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.ActiveCfg = Release|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.All|x64.Build.0 = Release|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.ActiveCfg = Debug|Win32 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|Win32.Build.0 = Debug|Win32 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.ActiveCfg = Debug|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Debug|x64.Build.0 = Debug|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.ActiveCfg = Release|Win32 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|Win32.Build.0 = Release|Win32 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.ActiveCfg = Release|x64 + {50AAC2CE-BFC9-4912-87CC-C6381850D735}.Release|x64.Build.0 = Release|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|Win32.ActiveCfg = Release|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.ActiveCfg = Release|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.All|x64.Build.0 = Release|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.ActiveCfg = Debug|Win32 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|Win32.Build.0 = Debug|Win32 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.ActiveCfg = Debug|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Debug|x64.Build.0 = Debug|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.ActiveCfg = Release|Win32 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|Win32.Build.0 = Release|Win32 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.ActiveCfg = Release|x64 + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921}.Release|x64.Build.0 = Release|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|Win32.ActiveCfg = Release|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.ActiveCfg = Release|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.All|x64.Build.0 = Release|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.ActiveCfg = Debug|Win32 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|Win32.Build.0 = Debug|Win32 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.ActiveCfg = Debug|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Debug|x64.Build.0 = Debug|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.ActiveCfg = Release|Win32 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|Win32.Build.0 = Release|Win32 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.ActiveCfg = Release|x64 + {4748FF56-CA85-4809-97D6-A94C0FAC1D77}.Release|x64.Build.0 = Release|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|Win32.ActiveCfg = Release|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.ActiveCfg = Release|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.All|x64.Build.0 = Release|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.ActiveCfg = Debug|Win32 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|Win32.Build.0 = Debug|Win32 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.ActiveCfg = Debug|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Debug|x64.Build.0 = Debug|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.ActiveCfg = Release|Win32 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|Win32.Build.0 = Release|Win32 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.ActiveCfg = Release|x64 + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F}.Release|x64.Build.0 = Release|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|Win32.ActiveCfg = Release|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.ActiveCfg = Release|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.All|x64.Build.0 = Release|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.ActiveCfg = Debug|Win32 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|Win32.Build.0 = Debug|Win32 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.ActiveCfg = Debug|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Debug|x64.Build.0 = Debug|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.ActiveCfg = Release|Win32 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|Win32.Build.0 = Release|Win32 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.ActiveCfg = Release|x64 + {2469B306-B027-4FF2-8815-C9C1EA2CAE79}.Release|x64.Build.0 = Release|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|Win32.ActiveCfg = Release|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.ActiveCfg = Release|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.All|x64.Build.0 = Release|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.ActiveCfg = Debug|Win32 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|Win32.Build.0 = Debug|Win32 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.ActiveCfg = Debug|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Debug|x64.Build.0 = Debug|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.ActiveCfg = Release|Win32 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|Win32.Build.0 = Release|Win32 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.ActiveCfg = Release|x64 + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53}.Release|x64.Build.0 = Release|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|Win32.ActiveCfg = Release|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.ActiveCfg = Release|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.All|x64.Build.0 = Release|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.ActiveCfg = Debug|Win32 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|Win32.Build.0 = Debug|Win32 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.ActiveCfg = Debug|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Debug|x64.Build.0 = Debug|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.ActiveCfg = Release|Win32 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|Win32.Build.0 = Release|Win32 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.ActiveCfg = Release|x64 + {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.Build.0 = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.Build.0 = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|Win32.ActiveCfg = Release|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.ActiveCfg = Release|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.Build.0 = Release|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.ActiveCfg = Debug|Win32 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.Build.0 = Debug|Win32 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.ActiveCfg = Debug|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.Build.0 = Debug|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.ActiveCfg = Release|Win32 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.Build.0 = Release|Win32 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.ActiveCfg = Release|x64 + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.Build.0 = Release|x64 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.ActiveCfg = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|Win32.Build.0 = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.All|x64.ActiveCfg = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.ActiveCfg = Debug|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|Win32.Build.0 = Debug|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.ActiveCfg = Debug|x64 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Debug|x64.Build.0 = Debug|x64 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.ActiveCfg = Release|x64 + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|x64.Build.0 = Release|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|Win32.ActiveCfg = Release|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.ActiveCfg = Release|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.Build.0 = Release|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.ActiveCfg = Debug|Win32 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.Build.0 = Debug|Win32 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.ActiveCfg = Debug|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.Build.0 = Debug|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.ActiveCfg = Release|Win32 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.Build.0 = Release|Win32 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.ActiveCfg = Release|x64 + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.Build.0 = Release|x64 + {BED7539C-0099-4A14-AD5D-30828F15A171}.All|Win32.ActiveCfg = Release|x64 + {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.ActiveCfg = Release|x64 + {BED7539C-0099-4A14-AD5D-30828F15A171}.All|x64.Build.0 = Release|x64 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.ActiveCfg = Debug|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|Win32.Build.0 = Debug|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.ActiveCfg = Debug|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Debug|x64.Build.0 = Debug|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.ActiveCfg = Release|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|Win32.Build.0 = Release|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.ActiveCfg = Release|Win32 + {BED7539C-0099-4A14-AD5D-30828F15A171}.Release|x64.Build.0 = Release|Win32 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|Win32.ActiveCfg = Release|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.ActiveCfg = Release|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.Build.0 = Release|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.Build.0 = Debug|Win32 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.ActiveCfg = Debug|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.Build.0 = Debug|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.ActiveCfg = Release|Win32 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.Build.0 = Release|Win32 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.ActiveCfg = Release|x64 + {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.Build.0 = Release|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|Win32.ActiveCfg = Release|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.ActiveCfg = Release|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.Build.0 = Release|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.Build.0 = Debug|Win32 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.ActiveCfg = Debug|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.Build.0 = Debug|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.ActiveCfg = Release|Win32 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.Build.0 = Release|Win32 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.ActiveCfg = Release|x64 + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.Build.0 = Release|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.All|Win32.ActiveCfg = Release|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.ActiveCfg = Release|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.Build.0 = Release|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.ActiveCfg = Debug|Win32 + {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.Build.0 = Debug|Win32 + {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.ActiveCfg = Debug|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.Build.0 = Debug|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.ActiveCfg = Release|Win32 + {B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.Build.0 = Release|Win32 + {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.ActiveCfg = Release|x64 + {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.Build.0 = Release|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.ActiveCfg = Release|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.Build.0 = Release|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.ActiveCfg = Release|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.Build.0 = Release|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.ActiveCfg = Debug|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.Build.0 = Debug|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.ActiveCfg = Debug|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.Build.0 = Debug|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.ActiveCfg = Release|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.Build.0 = Release|x86 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.ActiveCfg = Release|x64 + {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.Build.0 = Release|x64 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.All|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Debug|x64.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|Win32.Build.0 = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.ActiveCfg = All|Win32 + {2386B892-35F5-46CF-A0F0-10394D2FBF9B}.Release|x64.Build.0 = All|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.ActiveCfg = Release|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|Win32.Build.0 = Release|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.All|x64.ActiveCfg = Release|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|Win32.Build.0 = Debug|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.ActiveCfg = Debug|x64 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Debug|x64.Build.0 = Debug|x64 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.ActiveCfg = Release|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|Win32.Build.0 = Release|Win32 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.ActiveCfg = Release|x64 + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9}.Release|x64.Build.0 = Release|x64 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.All|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Debug|x64.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|Win32.Build.0 = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.ActiveCfg = All|Win32 + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981}.Release|x64.Build.0 = All|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.ActiveCfg = Release|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|Win32.Build.0 = Release|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.ActiveCfg = Release|x64 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.All|x64.Build.0 = Release|x64 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.ActiveCfg = Debug|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|Win32.Build.0 = Debug|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.ActiveCfg = Debug|x64 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Debug|x64.Build.0 = Debug|x64 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.ActiveCfg = Release|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|Win32.Build.0 = Release|Win32 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.ActiveCfg = Release|x64 + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E}.Release|x64.Build.0 = Release|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.ActiveCfg = Release|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.All|Win32.Build.0 = Release|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.ActiveCfg = Release|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.All|x64.Build.0 = Release|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|Win32.Build.0 = Debug|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.ActiveCfg = Debug|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Debug|x64.Build.0 = Debug|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.ActiveCfg = Release|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|Win32.Build.0 = Release|Win32 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.ActiveCfg = Release|x64 + {245603E3-F580-41A5-9632-B25FE3372CBF}.Release|x64.Build.0 = Release|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.ActiveCfg = Release|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|Win32.Build.0 = Release|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.ActiveCfg = Release|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.All|x64.Build.0 = Release|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.ActiveCfg = Debug|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|Win32.Build.0 = Debug|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.ActiveCfg = Debug|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Debug|x64.Build.0 = Debug|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.ActiveCfg = Release|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|Win32.Build.0 = Release|Win32 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.ActiveCfg = Release|x64 + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16}.Release|x64.Build.0 = Release|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.ActiveCfg = Release|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|Win32.Build.0 = Release|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.ActiveCfg = Release|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.All|x64.Build.0 = Release|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.ActiveCfg = Debug|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|Win32.Build.0 = Debug|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.ActiveCfg = Debug|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Debug|x64.Build.0 = Debug|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.ActiveCfg = Release|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|Win32.Build.0 = Release|Win32 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.ActiveCfg = Release|x64 + {8484C90D-1561-402F-A91D-2DB10F8C5171}.Release|x64.Build.0 = Release|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.ActiveCfg = Release|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|Win32.Build.0 = Release|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.ActiveCfg = Release|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.All|x64.Build.0 = Release|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.ActiveCfg = Debug|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|Win32.Build.0 = Debug|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.ActiveCfg = Debug|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Debug|x64.Build.0 = Debug|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.ActiveCfg = Release|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|Win32.Build.0 = Release|Win32 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.ActiveCfg = Release|x64 + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782}.Release|x64.Build.0 = Release|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.ActiveCfg = Release|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|Win32.Build.0 = Release|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.ActiveCfg = Release|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.All|x64.Build.0 = Release|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.ActiveCfg = Debug|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|Win32.Build.0 = Debug|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.ActiveCfg = Debug|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Debug|x64.Build.0 = Debug|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.ActiveCfg = Release|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|Win32.Build.0 = Release|Win32 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.ActiveCfg = Release|x64 + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB}.Release|x64.Build.0 = Release|x64 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.All|x64.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Debug|x64.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|Win32.Build.0 = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.ActiveCfg = All|Win32 + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5}.Release|x64.Build.0 = All|Win32 + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|Win32.ActiveCfg = Release|Any CPU + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.All|x64.ActiveCfg = Release|Any CPU + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|Win32.ActiveCfg = Debug|Any CPU + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|Win32.ActiveCfg = Release|Any CPU + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0}.Release|x64.ActiveCfg = Release|Any CPU + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|Win32.ActiveCfg = Release|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.ActiveCfg = Release|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.All|x64.Build.0 = Release|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.ActiveCfg = Debug|Win32 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|Win32.Build.0 = Debug|Win32 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.ActiveCfg = Debug|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Debug|x64.Build.0 = Debug|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.ActiveCfg = Release|Win32 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|Win32.Build.0 = Release|Win32 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.ActiveCfg = Release|x64 + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E}.Release|x64.Build.0 = Release|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|Win32.ActiveCfg = Release|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.ActiveCfg = Release|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.All|x64.Build.0 = Release|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.ActiveCfg = Debug|Win32 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|Win32.Build.0 = Debug|Win32 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.ActiveCfg = Debug|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Debug|x64.Build.0 = Debug|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.ActiveCfg = Release|Win32 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|Win32.Build.0 = Release|Win32 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.ActiveCfg = Release|x64 + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6}.Release|x64.Build.0 = Release|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.ActiveCfg = Release|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|Win32.Build.0 = Release|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.ActiveCfg = Release|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.All|x64.Build.0 = Release|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|Win32.Build.0 = Debug|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.ActiveCfg = Debug|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Debug|x64.Build.0 = Debug|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.ActiveCfg = Release|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|Win32.Build.0 = Release|Win32 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.ActiveCfg = Release|x64 + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99}.Release|x64.Build.0 = Release|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.ActiveCfg = Release|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|Win32.Build.0 = Release|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.ActiveCfg = Release|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.All|x64.Build.0 = Release|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.Build.0 = Debug|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.ActiveCfg = Debug|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|x64.Build.0 = Debug|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.Build.0 = Release|Win32 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.ActiveCfg = Release|x64 + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|x64.Build.0 = Release|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.ActiveCfg = Release|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|Win32.Build.0 = Release|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.ActiveCfg = Release|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.All|x64.Build.0 = Release|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.ActiveCfg = Debug|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|Win32.Build.0 = Debug|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.ActiveCfg = Debug|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Debug|x64.Build.0 = Debug|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.ActiveCfg = Release|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|Win32.Build.0 = Release|Win32 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.ActiveCfg = Release|x64 + {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release|x64.Build.0 = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|Win32.Build.0 = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.ActiveCfg = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.All|x64.Build.0 = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.ActiveCfg = Release|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|Win32.Build.0 = Release|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.ActiveCfg = Release|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.All|x64.Build.0 = Release|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.ActiveCfg = Debug|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|Win32.Build.0 = Debug|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.ActiveCfg = Debug|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Debug|x64.Build.0 = Debug|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.ActiveCfg = Release|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|Win32.Build.0 = Release|Win32 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.ActiveCfg = Release|x64 + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B}.Release|x64.Build.0 = Release|x64 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.ActiveCfg = Release|Win32 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|Win32.Build.0 = Release|Win32 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.ActiveCfg = Release|x64 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.All|x64.Build.0 = Release|x64 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|Win32.ActiveCfg = Debug|Win32 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Debug|x64.ActiveCfg = Debug|x64 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|Win32.ActiveCfg = Release|Win32 + {841C345F-FCC7-4F64-8F54-0281CEABEB01}.Release|x64.ActiveCfg = Release|x64 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.ActiveCfg = Release|Win32 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|Win32.Build.0 = Release|Win32 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.ActiveCfg = Release|x64 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.All|x64.Build.0 = Release|x64 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|Win32.ActiveCfg = Debug|Win32 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.Debug|x64.ActiveCfg = Debug|x64 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|Win32.ActiveCfg = Release|Win32 + {7AEE504B-23B6-4B05-829E-7CD34855F146}.Release|x64.ActiveCfg = Release|x64 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.ActiveCfg = Release|Win32 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|Win32.Build.0 = Release|Win32 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.ActiveCfg = Release|x64 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.All|x64.Build.0 = Release|x64 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|Win32.ActiveCfg = Debug|Win32 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Debug|x64.ActiveCfg = Debug|x64 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|Win32.ActiveCfg = Release|Win32 + {20179127-853B-4FE9-B7C0-9E817E6A3A72}.Release|x64.ActiveCfg = Release|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.ActiveCfg = Release|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|Win32.Build.0 = Release|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.ActiveCfg = Release|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.All|x64.Build.0 = Release|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.ActiveCfg = Debug|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|Win32.Build.0 = Debug|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.ActiveCfg = Debug|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Debug|x64.Build.0 = Debug|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.ActiveCfg = Release|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|Win32.Build.0 = Release|Win32 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.ActiveCfg = Release|x64 + {87933C2D-0159-46F7-B326-E1B6E982C21E}.Release|x64.Build.0 = Release|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.ActiveCfg = Release|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|Win32.Build.0 = Release|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.ActiveCfg = Release|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.All|x64.Build.0 = Release|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|Win32.Build.0 = Debug|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.ActiveCfg = Debug|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Debug|x64.Build.0 = Debug|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.ActiveCfg = Release|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|Win32.Build.0 = Release|Win32 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.ActiveCfg = Release|x64 + {19E934D6-1484-41C8-9305-78DC42FD61F2}.Release|x64.Build.0 = Release|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.ActiveCfg = Release|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|Win32.Build.0 = Release|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.ActiveCfg = Release|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.All|x64.Build.0 = Release|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|Win32.Build.0 = Debug|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.ActiveCfg = Debug|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Debug|x64.Build.0 = Debug|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.ActiveCfg = Release|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|Win32.Build.0 = Release|Win32 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.ActiveCfg = Release|x64 + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17}.Release|x64.Build.0 = Release|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.ActiveCfg = Release|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|Win32.Build.0 = Release|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.ActiveCfg = Release|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.All|x64.Build.0 = Release|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.ActiveCfg = Debug|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|Win32.Build.0 = Debug|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.ActiveCfg = Debug|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Debug|x64.Build.0 = Debug|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.ActiveCfg = Release|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|Win32.Build.0 = Release|Win32 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.ActiveCfg = Release|x64 + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3}.Release|x64.Build.0 = Release|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.ActiveCfg = Release|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|Win32.Build.0 = Release|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.ActiveCfg = Release|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.All|x64.Build.0 = Release|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|Win32.Build.0 = Debug|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.ActiveCfg = Debug|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Debug|x64.Build.0 = Debug|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.ActiveCfg = Release|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|Win32.Build.0 = Release|Win32 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.ActiveCfg = Release|x64 + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF}.Release|x64.Build.0 = Release|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.ActiveCfg = Release|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|Win32.Build.0 = Release|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.ActiveCfg = Release|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.All|x64.Build.0 = Release|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|Win32.Build.0 = Debug|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.ActiveCfg = Debug|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Debug|x64.Build.0 = Debug|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.ActiveCfg = Release|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|Win32.Build.0 = Release|Win32 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.ActiveCfg = Release|x64 + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136}.Release|x64.Build.0 = Release|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.ActiveCfg = Release|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|Win32.Build.0 = Release|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.ActiveCfg = Release|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.All|x64.Build.0 = Release|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|Win32.Build.0 = Debug|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.ActiveCfg = Debug|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Debug|x64.Build.0 = Debug|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.ActiveCfg = Release|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|Win32.Build.0 = Release|Win32 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.ActiveCfg = Release|x64 + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3}.Release|x64.Build.0 = Release|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.ActiveCfg = Release|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|Win32.Build.0 = Release|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.ActiveCfg = Release|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.All|x64.Build.0 = Release|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.ActiveCfg = Debug|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|Win32.Build.0 = Debug|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.ActiveCfg = Debug|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Debug|x64.Build.0 = Debug|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.ActiveCfg = Release|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|Win32.Build.0 = Release|Win32 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.ActiveCfg = Release|x64 + {A3D7C6CF-AEB1-4159-B741-160EB4B37345}.Release|x64.Build.0 = Release|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.ActiveCfg = Release|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|Win32.Build.0 = Release|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.ActiveCfg = Release|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.All|x64.Build.0 = Release|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|Win32.Build.0 = Debug|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.ActiveCfg = Debug|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Debug|x64.Build.0 = Debug|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.ActiveCfg = Release|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|Win32.Build.0 = Release|Win32 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.ActiveCfg = Release|x64 + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B}.Release|x64.Build.0 = Release|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.ActiveCfg = Release|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.All|Win32.Build.0 = Release|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.ActiveCfg = Release|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.All|x64.Build.0 = Release|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.ActiveCfg = Debug|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|Win32.Build.0 = Debug|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.ActiveCfg = Debug|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.Debug|x64.Build.0 = Debug|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.ActiveCfg = Release|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.Release|Win32.Build.0 = Release|Win32 + {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.ActiveCfg = Release|x64 + {AF675478-995A-4115-90C4-B2B0D6470688}.Release|x64.Build.0 = Release|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.ActiveCfg = Release|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|Win32.Build.0 = Release|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.ActiveCfg = Release|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.All|x64.Build.0 = Release|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.ActiveCfg = Debug|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|Win32.Build.0 = Debug|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.ActiveCfg = Debug|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Debug|x64.Build.0 = Debug|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.ActiveCfg = Release|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|Win32.Build.0 = Release|Win32 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.ActiveCfg = Release|x64 + {07EA6E5A-D181-4ABB-BECF-67A906867D04}.Release|x64.Build.0 = Release|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.ActiveCfg = Release|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.All|Win32.Build.0 = Release|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.ActiveCfg = Release|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.All|x64.Build.0 = Release|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.ActiveCfg = Debug|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.Debug|Win32.Build.0 = Debug|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.ActiveCfg = Debug|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.Debug|x64.Build.0 = Debug|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.ActiveCfg = Release|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.Release|Win32.Build.0 = Release|Win32 + {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.ActiveCfg = Release|x64 + {20B15650-F910-4211-8729-AAB0F520C805}.Release|x64.Build.0 = Release|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.ActiveCfg = Release|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|Win32.Build.0 = Release|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.ActiveCfg = Release|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.All|x64.Build.0 = Release|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.ActiveCfg = Debug|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|Win32.Build.0 = Debug|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.ActiveCfg = Debug|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Debug|x64.Build.0 = Debug|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.ActiveCfg = Release|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|Win32.Build.0 = Release|Win32 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.ActiveCfg = Release|x64 + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7}.Release|x64.Build.0 = Release|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.ActiveCfg = Release|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|Win32.Build.0 = Release|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.ActiveCfg = Release|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.All|x64.Build.0 = Release|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.ActiveCfg = Debug|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|Win32.Build.0 = Debug|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.ActiveCfg = Debug|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Debug|x64.Build.0 = Debug|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.ActiveCfg = Release|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|Win32.Build.0 = Release|Win32 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.ActiveCfg = Release|x64 + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F}.Release|x64.Build.0 = Release|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.ActiveCfg = Release|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|Win32.Build.0 = Release|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.ActiveCfg = Release|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.All|x64.Build.0 = Release|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.ActiveCfg = Debug|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|Win32.Build.0 = Debug|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.ActiveCfg = Debug|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Debug|x64.Build.0 = Debug|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.ActiveCfg = Release|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|Win32.Build.0 = Release|Win32 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.ActiveCfg = Release|x64 + {2CA661A7-01DD-4532-BF88-B6629DFB544A}.Release|x64.Build.0 = Release|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.ActiveCfg = Release|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|Win32.Build.0 = Release|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.ActiveCfg = Release|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.All|x64.Build.0 = Release|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.ActiveCfg = Debug|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|Win32.Build.0 = Debug|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.ActiveCfg = Debug|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Debug|x64.Build.0 = Debug|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.ActiveCfg = Release|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|Win32.Build.0 = Release|Win32 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.ActiveCfg = Release|x64 + {40C4E2A2-B49B-496C-96D6-C04B890F7F88}.Release|x64.Build.0 = Release|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.ActiveCfg = Release|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|Win32.Build.0 = Release|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.ActiveCfg = Release|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.All|x64.Build.0 = Release|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|Win32.Build.0 = Debug|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.ActiveCfg = Debug|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Debug|x64.Build.0 = Debug|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.ActiveCfg = Release|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|Win32.Build.0 = Release|Win32 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.ActiveCfg = Release|x64 + {0A130A8B-3076-4619-BADF-9E86F621AEEC}.Release|x64.Build.0 = Release|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.ActiveCfg = Release|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.All|Win32.Build.0 = Release|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.ActiveCfg = Release|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.All|x64.Build.0 = Release|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.ActiveCfg = Debug|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|Win32.Build.0 = Debug|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.ActiveCfg = Debug|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Debug|x64.Build.0 = Debug|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.ActiveCfg = Release|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|Win32.Build.0 = Release|Win32 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.ActiveCfg = Release|x64 + {4DFF29B4-2976-447D-A8B3-43476451517C}.Release|x64.Build.0 = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.ActiveCfg = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|Win32.Build.0 = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.ActiveCfg = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.All|x64.Build.0 = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|Win32.ActiveCfg = Debug|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Debug|x64.ActiveCfg = Debug|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|Win32.ActiveCfg = Release|x64 + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}.Release|x64.ActiveCfg = Release|x64 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|Win32.ActiveCfg = Release|Win32 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|Win32.Build.0 = Release|Win32 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|x64.ActiveCfg = Release|x64 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.All|x64.Build.0 = Release|x64 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Debug|Win32.ActiveCfg = Debug|Win32 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Debug|x64.ActiveCfg = Debug|x64 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|Win32.ActiveCfg = Release|Win32 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} = {57D119DC-484F-420F-B9E9-8589FD9A8DF8} + {CDE9B06A-3C27-4987-8FAE-DF1006BC705D} = {DB1024A8-41BF-4AD7-9AE6-13202230D1F3} + {3C90CCF0-2CDD-4A7A-ACFF-208C1E271692} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} + {C7E2382E-2C22-4D18-BF93-80C6A1FFA7AC} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} + {FC71C66E-E268-4EAD-B1F5-F008DC382E83} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} + {8E2E8798-8B6F-4A55-8E4F-4E6FDE40ED26} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} + {09455AA9-C243-4F16-A1A1-A016881A2765} = {3B08FEFD-4D3D-4C16-BA94-EE83509E32A0} + {57199684-EC63-4A60-9DC6-11815AF6B413} = {09455AA9-C243-4F16-A1A1-A016881A2765} + {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} = {09455AA9-C243-4F16-A1A1-A016881A2765} + {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} = {09455AA9-C243-4F16-A1A1-A016881A2765} + {D3E5C8ED-3A6A-4FEA-92A2-48A0BA865358} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} + {CC3E7F48-2590-49CB-AD8B-BE3650F55462} = {2DED4BA2-D6B0-4064-BB2A-76DE3AA49E7C} + {765EF1B9-5027-4820-BC37-A44466A51631} = {57199684-EC63-4A60-9DC6-11815AF6B413} + {713E4747-1126-40B1-BD84-58F9A7745423} = {57199684-EC63-4A60-9DC6-11815AF6B413} + {F1B71990-EB04-4EB5-B28A-BC3EB6F7E843} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} + {3DAF028C-AB5B-4183-A01B-DCC43F5A87F0} = {D4A12E4C-DBDA-4614-BA26-3425AE9F60F5} + {62F27B1A-C919-4A70-8478-51F178F3B18F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A} + {07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} + {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC} + {A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} + {784113EF-44D9-4949-835D-7065D3C7AD08} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {89385C74-5860-4174-9CAF-A39E7C48909C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {9B9D2551-D6BD-4F20-8BE5-DE30E154A064} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {8B754330-A434-4791-97E5-1EE67060BAC0} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {692F6330-4D87-4C82-81DF-40DB5892636E} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} + {D3EC0AFF-76FC-4210-A825-9A17410660A3} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {30A5B29C-983E-4580-9FD0-D647CCDCC7EB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {1C453396-D912-4213-89FD-9B489162B7B5} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A} + {CBEC7225-0C21-4DA8-978E-1F158F8AD950} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} + {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {C24FB505-05D7-4319-8485-7540B44C8603} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {05515420-16DE-4E63-BE73-85BE85BA5142} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {1906D736-08BD-4EE1-924F-B536249B9A54} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {0DF3ABD0-DDC0-4265-B778-07C66780979B} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {FEA1EEF7-876F-48DE-88BF-C0E3E606D758} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {7F1610F1-DD5A-4CF7-8610-30AB12C60ADD} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {9254C4B0-6F60-42B6-BB3A-36D63FC001C7} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {71A967D5-0E99-4CEF-A587-98836EE6F2EF} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {AB91A099-7690-4ECF-8994-E458F4EA1ED4} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} + {988CACF7-3FCB-4992-BE69-77872AE67DC8} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836} = {F69A4A6B-9360-4EBB-A280-22AA3C455AC5} + {8DEB383C-4091-4F42-A56F-C9E46D552D79} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {2C3C2423-234B-4772-8899-D3B137E5CA35} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {3850D93A-5F24-4922-BC1C-74D08C37C256} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {D7F1E3F2-A3F4-474C-8555-15122571AF52} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {5BC072DB-3826-48EA-AF34-FE32AA01E83B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {FA429E98-8B03-45E6-A096-A4BC5E821DE4} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {06E3A538-AB32-44F2-B477-755FF9CB5D37} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {A4B122CF-5196-476B-8C0E-D8BD59AC3C14} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {F6A33240-8F29-48BD-98F0-826995911799} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {65A6273D-FCAB-4C55-B09E-65100141A5D4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} + {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909} = {A7AB4405-FDB7-4853-9FBB-1516B1C3D80A} + {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {E3246D17-E29B-4AB5-962A-C69B0C5837BB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {7B077E7F-1BE7-4291-AB86-55E527B25CAC} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {94001A0E-A837-445C-8004-F918F10D0226} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {2286DA73-9FC5-45BC-A508-85994C3317AB} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} + {7A8D8174-B355-4114-AFC1-04777CB9DE0A} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {7EB71250-F002-4ED8-92CA-CA218114537A} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {464AAB78-5489-4916-BE51-BF8D61822311} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {66444AEE-554C-11DD-A9F0-8C5D56D89593} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} + {E316772F-5D8F-4F2A-8F71-094C3E859D34} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {D3D8B329-20BE-475E-9E83-653CEA0E0EF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {38FE0559-9910-43A8-9E45-3E5004C27692} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {419C8F80-D858-4B48-A25C-AF4007608137} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {B3F424EC-3D8F-417C-B244-3919D5E1A577} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {14E4A972-9CFB-436D-B0A5-4943F3F80D47} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {0B6C905B-142E-4999-B39D-92FF7951E921} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {CF405366-9558-4AE8-90EF-5E21B51CCB4E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {329FD5B0-EF28-4606-86D0-F6EA21CF8E36} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {401A40CD-5DB4-4E34-AC68-FA99E9FAC014} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {9A5DDF08-C88C-4A35-B7F6-D605228446BD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {05C9FB27-480E-4D53-B3B7-6338E2526666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {CC1DD008-9406-448D-A0AD-33C3186CFADB} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {48414740-C693-4968-9846-EE058020C64F} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {DEE932AB-5911-4700-9EEB-8C7090A0A330} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {329A6FA0-0FCC-4435-A950-E670AEFA9838} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {D1ABE208-6442-4FB4-9AAD-1677E41BC870} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {BA599D0A-4310-4505-91DA-6A6447B3E289} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {3C977801-FE88-48F2-83D3-FA2EBFF6688E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {0382E8FD-CFDC-41C0-8B03-792C7C84FC31} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {432DB165-1EB2-4781-A9C0-71E62610B20A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {CF70F278-3364-4395-A2E1-23501C9B8AD2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {D5C87B19-150D-4EF3-A671-96589BD2D14A} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {B5A00BFA-6083-4FAE-A097-71642D6473B5} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {1C320193-46A6-4B34-9C56-8AB584FC1B56} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {72782932-37CC-46AE-8C7F-9A7B1A6EE108} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {12A49562-BAB9-43A3-A21D-15B60BBB4C31} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {504B3154-7A4F-459D-9877-B951021C3F1F} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {746F3632-5BB2-4570-9453-31D6D58A7D8E} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {DEB01ACB-D65F-4A62-AED9-58C1054499E9} = {62F27B1A-C919-4A70-8478-51F178F3B18F} + {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD} = {4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0} + {ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {AFA983D6-4569-4F88-BA94-555ED00FD9A8} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {990BAA76-89D3-4E38-8479-C7B28784EFC8} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {1E21AFE0-6FDB-41D2-942D-863607C24B91} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {2E250296-0C08-4342-9C8A-BCBDD0E7DF65} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {B889A18E-70A7-44B5-B2C9-47798D4F43B3} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {05C9FB27-480E-4D53-B3B7-7338E2514666} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {7C22BDFF-CC09-400C-8A09-660733980028} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {8CDA2B34-FA44-49CC-9EC2-B8F35856CD15} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {47886A6C-CCA6-4F9F-A7D4-F97D06FB2B1A} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {50AAC2CE-BFC9-4912-87CC-C6381850D735} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {A61D7CB4-75A5-4A55-8CA1-BE5AF615D921} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {4748FF56-CA85-4809-97D6-A94C0FAC1D77} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {60C542EE-6882-4EA2-8C21-5AB6DB1BA73F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {2469B306-B027-4FF2-8815-C9C1EA2CAE79} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {9DE35039-A8F6-4FBF-B1B6-EB527F802411} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {74B120FF-6935-4DFE-A142-CDB6BEA99C90} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} + {BED7539C-0099-4A14-AD5D-30828F15A171} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} + {0D108721-EAE8-4BAF-8102-D8960EC93647} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} + {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} + {B535402E-38D2-4D54-8360-423ACBD17192} = {9DE35039-A8F6-4FBF-B1B6-EB527F802411} + {2386B892-35F5-46CF-A0F0-10394D2FBF9B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {77BC1DD2-C9A1-44D7-BFFA-1320370CACB9} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {85F0CF8C-C7AB-48F6-BA19-CC94CF87F981} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {ED2CA8B5-8E91-4296-A120-02BB0B674652} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {FD60942F-72D6-4CA1-8B57-EA1D1B95A89E} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} + {245603E3-F580-41A5-9632-B25FE3372CBF} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} + {C303D2FC-FF97-49B8-9DDD-467B4C9A0B16} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} + {8484C90D-1561-402F-A91D-2DB10F8C5171} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} + {9C4961D2-5DDB-40C7-9BE8-CA918DC4E782} = {ED2CA8B5-8E91-4296-A120-02BB0B674652} + {64E99CCA-3C6F-4AEB-9FA3-CFAC711257BB} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {EDDB8AB9-C53E-44C0-A620-0E86C2CBD5D5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {5BA0D5BD-330D-4EE2-B959-CAFEA04E50E0} = {0C808854-54D1-4230-BFF5-77B5FD905000} + {3884ADD2-91D0-4CD6-86D3-D5FB2D4AAB9E} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {5B2BACE4-0F5A-4A21-930D-C0F4B1F58FA6} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C} + {B6E22500-3DB6-4E6E-8CD5-591B781D7D99} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {FBC7E2A4-B989-4289-BA7F-68F440E9EF8B} = {A5A27244-AD24-46E5-B01B-840CD296C91D} + {841C345F-FCC7-4F64-8F54-0281CEABEB01} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {7AEE504B-23B6-4B05-829E-7CD34855F146} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {20179127-853B-4FE9-B7C0-9E817E6A3A72} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {87933C2D-0159-46F7-B326-E1B6E982C21E} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {19E934D6-1484-41C8-9305-78DC42FD61F2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} + {7AC7AB4F-5EF3-40A0-AD2B-CF4D9720FAC3} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {411F6D43-9F09-47D0-8B04-E1EB6B67C5BF} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {CEEE31E6-8A08-42C7-BEBD-5EC12072C136} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {0E469F3A-DDD0-43BA-A94F-7D93C02219F3} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {A3D7C6CF-AEB1-4159-B741-160EB4B37345} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {DA7ADDF1-DA33-4194-83A5-B48DB714D35B} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {AF675478-995A-4115-90C4-B2B0D6470688} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {07EA6E5A-D181-4ABB-BECF-67A906867D04} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {20B15650-F910-4211-8729-AAB0F520C805} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {C955E1A9-C12C-4BAD-AC32-8D53D9268AF7} = {6CD61A1D-797C-470A-BE08-8C31B68BB336} + {096C9A84-55B2-4F9B-97E5-0FDF116FD25F} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {2CA661A7-01DD-4532-BF88-B6629DFB544A} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {40C4E2A2-B49B-496C-96D6-C04B890F7F88} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {0A130A8B-3076-4619-BADF-9E86F621AEEC} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {4DFF29B4-2976-447D-A8B3-43476451517C} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} + {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625} = {9388C266-C3FC-468A-92EF-0CBC35941412} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E} + EndGlobalSection +EndGlobal diff --git a/configure.ac b/configure.ac index 377eea25ec..8a26ff2159 100644 --- a/configure.ac +++ b/configure.ac @@ -1983,6 +1983,7 @@ AC_CONFIG_FILES([Makefile src/mod/xml_int/mod_xml_rpc/Makefile src/mod/xml_int/mod_xml_scgi/Makefile src/mod/applications/mod_av/Makefile + src/mod/applications/mod_av/test/Makefile src/mod/applications/mod_video_filter/Makefile src/include/switch_am_config.h build/getsounds.sh diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index c8feb17eb2..0fdac14bc0 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -81,7 +81,15 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, // Allow test to define the runtime dir if (!zstr(confdir)) { - SWITCH_GLOBAL_dirs.conf_dir = strdup(confdir); +#ifdef SWITCH_TEST_BASE_DIR_FOR_CONF + SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf("%s%s%s", SWITCH_TEST_BASE_DIR_FOR_CONF, SWITCH_PATH_SEPARATOR, confdir); +#else + if (confdir[0] != '/') { + SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf(".%s%s", SWITCH_PATH_SEPARATOR, confdir); + } else { + SWITCH_GLOBAL_dirs.conf_dir = strdup(confdir); + } +#endif } else { SWITCH_GLOBAL_dirs.conf_dir = switch_mprintf("%s%sconf", basedir, SWITCH_PATH_SEPARATOR); } diff --git a/src/mod/applications/mod_av/Makefile.am b/src/mod/applications/mod_av/Makefile.am index 261985c7a9..cefcdcf113 100644 --- a/src/mod/applications/mod_av/Makefile.am +++ b/src/mod/applications/mod_av/Makefile.am @@ -9,6 +9,8 @@ mod_av_la_CFLAGS = $(AM_CFLAGS) $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE mod_av_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) mod_av_la_LDFLAGS = -avoid-version -module -no-undefined -shared -lm -lz +SUBDIRS=. test + else install: error all: error diff --git a/src/mod/applications/mod_av/test/Makefile.am b/src/mod/applications/mod_av/test/Makefile.am new file mode 100644 index 0000000000..4c66bd22f6 --- /dev/null +++ b/src/mod/applications/mod_av/test/Makefile.am @@ -0,0 +1,4 @@ +bin_PROGRAMS = test_mod_av +AM_CFLAGS = $(SWITCH_AM_CFLAGS) -I../ $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(AVRESAMPLE_CFALGS) +AM_LDFLAGS = $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) ../mod_av.la +TESTS = $(bin_PROGRAMS) diff --git a/src/mod/applications/mod_av/test/conf/freeswitch.xml b/src/mod/applications/mod_av/test/conf/freeswitch.xml new file mode 100644 index 0000000000..4c01b81229 --- /dev/null +++ b/src/mod/applications/mod_av/test/conf/freeswitch.xml @@ -0,0 +1,40 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + +
+
diff --git a/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj b/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj new file mode 100644 index 0000000000..b8a036891f --- /dev/null +++ b/src/mod/applications/mod_av/test/test_mod_av.2017.vcxproj @@ -0,0 +1,203 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + test_mod_av + test_mod_av + Win32Proj + 10.0.17134.0 + {7926CB0D-62CE-4A09-AE94-1DA2BC92D625} + + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(PlatformName)\$(Configuration)\ + false + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(PlatformName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + $(SolutionDir)src\include;%(AdditionalIncludeDirectories) + SWITCH_TEST_BASE_DIR_FOR_CONF="..\\..\\src\\mod\\applications\\mod_av\\test\\";%(PreprocessorDefinitions) + + + + + + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + true + Console + true + + + MachineX86 + + + + + + X64 + + + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + true + Console + true + + + MachineX64 + + + + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + false + Console + true + true + true + + + MachineX86 + + + + + + X64 + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + false + Console + true + true + true + + + MachineX64 + + + + + + + + {202d7a4e-760d-4d0e-afa1-d7459ced30ff} + + + + + + \ No newline at end of file diff --git a/src/mod/applications/mod_av/test/test_mod_av.c b/src/mod/applications/mod_av/test/test_mod_av.c new file mode 100644 index 0000000000..51e594f344 --- /dev/null +++ b/src/mod/applications/mod_av/test/test_mod_av.c @@ -0,0 +1,145 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Seven Du + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * + * mod_av_test -- avcodec tests + * + */ + +#include + +int loop = 0; + +/* Add our command line options. */ +static fctcl_init_t my_cl_options[] = { + {"--disable-hw", /* long_opt */ + NULL, /* short_opt (optional) */ + FCTCL_STORE_TRUE , /* action */ + "disable hardware encoder" /* help */ + }, + + {"--loop", /* long_opt */ + NULL, /* short_opt (optional) */ + FCTCL_STORE_VALUE , /* action */ + "loops to encode a picture" /* help */ + }, + FCTCL_INIT_NULL /* Sentinel */ +}; + +FST_CORE_BEGIN("conf") +{ + fctcl_install(my_cl_options); + + const char *loop_ = fctcl_val("--loop"); + if (loop_) loop = atoi(loop_); + + FST_MODULE_BEGIN(mod_av, mod_av_test) + { + FST_SETUP_BEGIN() + { + // fst_requires_module("mod_av"); + } + FST_SETUP_END() + + FST_TEST_BEGIN(encoder_test) + { + switch_status_t status; + switch_codec_t codec = { 0 }; + switch_codec_settings_t codec_settings = { 0 }; + + // switch_set_string(codec_settings.video.config_profile_name, "conference"); + + if (!fctcl_is("--disable-hw")) { + codec_settings.video.try_hardware_encoder = 1; + } + + status = switch_core_codec_init(&codec, + "H264", + NULL, + NULL, + 0, + 0, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + &codec_settings, fst_pool); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1); + fst_requires(img); + + uint8_t buf[SWITCH_DEFAULT_VIDEO_SIZE + 12]; + switch_frame_t frame = { 0 }; + + frame.packet = buf; + frame.packetlen = SWITCH_DEFAULT_VIDEO_SIZE + 12; + frame.data = buf + 12; + frame.datalen = SWITCH_DEFAULT_VIDEO_SIZE; + frame.payload = 96; + frame.m = 0; + frame.seq = 0; + frame.timestamp = 0; + frame.img = img; + + int packets = 0; + switch_status_t encode_status; + + do { + frame.datalen = SWITCH_DEFAULT_VIDEO_SIZE; + encode_status = switch_core_codec_encode_video(&codec, &frame); + + if (encode_status == SWITCH_STATUS_SUCCESS || encode_status == SWITCH_STATUS_MORE_DATA) { + + fst_requires((encode_status == SWITCH_STATUS_SUCCESS && frame.m) || !frame.m); + + if (frame.flags & SFF_PICTURE_RESET) { + frame.flags &= ~SFF_PICTURE_RESET; + fst_check(0); + } + + if (frame.datalen == 0) break; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[%d]: %02x %02x | m=%d | %d\n", loop, buf[12], buf[13], frame.m, frame.datalen); + packets++; + } + + } while(encode_status == SWITCH_STATUS_MORE_DATA || loop-- > 1); + + fst_check(frame.m == 1); + fst_check(packets > 0); + + switch_core_codec_destroy(&codec); + } + FST_TEST_END() + + FST_TEARDOWN_BEGIN() + { + const char *err = NULL; + switch_sleep(1000000); + fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_av", SWITCH_TRUE, &err) == SWITCH_STATUS_SUCCESS); + } + FST_TEARDOWN_END() + } + FST_MODULE_END() +} +FST_CORE_END() From 69252d9911f346e474214f32f888827143b2b8f8 Mon Sep 17 00:00:00 2001 From: Liyang Date: Wed, 17 Oct 2018 23:26:04 +0800 Subject: [PATCH 58/69] missing comma https://freeswitch.org/jira/browse/FS-11465 --- src/include/test/switch_test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 0fdac14bc0..ac3f20fea9 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -721,7 +721,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, #define fst_xml_body(body) \ if (fst_tag_body) { \ - fst_xml_stream.write_function(&fst_xml_stream "%s", body); \ + fst_xml_stream.write_function(&fst_xml_stream, "%s", body); \ } else { \ fst_tag_body = 1; \ fst_xml_stream.write_function(&fst_xml_stream, ">%s", body); \ From 879a4dc7ecacccd42a42a8fa9e63dac0ae45f0b6 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Fri, 26 Oct 2018 22:14:47 +0800 Subject: [PATCH 59/69] FS-11487 #resolve convert to Makefile.am fix regression from 53533118cd7eedf7d25a9c6227558736fa5d0b2f --- configure.ac | 1 + tests/unit/Makefile.am | 9 +++++++++ tests/unit/unit.mk | 24 ------------------------ 3 files changed, 10 insertions(+), 24 deletions(-) create mode 100644 tests/unit/Makefile.am delete mode 100644 tests/unit/unit.mk diff --git a/configure.ac b/configure.ac index 8a26ff2159..1144a5faac 100644 --- a/configure.ac +++ b/configure.ac @@ -1807,6 +1807,7 @@ ac_cv_file_dbd_apr_dbd_mysql_c=no AC_CONFIG_FILES([Makefile build/Makefile + tests/unit/Makefile src/Makefile src/mod/Makefile src/mod/applications/mod_abstraction/Makefile diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am new file mode 100644 index 0000000000..8f4eb4e7cf --- /dev/null +++ b/tests/unit/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/build/modmake.rulesam + +bin_PROGRAMS = switch_event switch_hash switch_ivr_originate +AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) +AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) +AM_CFLAGS = $(SWITCH_AM_CPPFLAGS) +AM_CPPFLAGS = $(SWITCH_AM_CPPFLAGS) + +TESTS = $(bin_PROGRAMS) diff --git a/tests/unit/unit.mk b/tests/unit/unit.mk deleted file mode 100644 index dd4ba2c00b..0000000000 --- a/tests/unit/unit.mk +++ /dev/null @@ -1,24 +0,0 @@ -AUTOMAKE_OPTIONS = foreign -FSLD = $(top_builddir)/libfreeswitch.la $(top_builddir)/libs/apr/libapr-1.la $(top_builddir)/libs/apr-util/libaprutil-1.la - -check_PROGRAMS += tests/unit/switch_event - -tests_unit_switch_event_SOURCES = tests/unit/switch_event.c -tests_unit_switch_event_CFLAGS = $(SWITCH_AM_CFLAGS) -tests_unit_switch_event_LDADD = $(FSLD) -tests_unit_switch_event_LDFLAGS = $(SWITCH_AM_LDFLAGS) - -check_PROGRAMS += tests/unit/switch_hash - -tests_unit_switch_hash_SOURCES = tests/unit/switch_hash.c -tests_unit_switch_hash_CFLAGS = $(SWITCH_AM_CFLAGS) -tests_unit_switch_hash_LDADD = $(FSLD) -tests_unit_switch_hash_LDFLAGS = $(SWITCH_AM_LDFLAGS) - -check_PROGRAMS += tests/unit/switch_ivr_originate - -tests_unit_switch_ivr_originate_SOURCES = tests/unit/switch_ivr_originate.c -tests_unit_switch_ivr_originate_CFLAGS = $(SWITCH_AM_CFLAGS) -tests_unit_switch_ivr_originate_LDADD = $(FSLD) -tests_unit_switch_ivr_originate_LDFLAGS = $(SWITCH_AM_LDFLAGS) - From 19eb5af90d523de6cbe1802c1da46b46e15a5f07 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 26 Oct 2018 13:26:33 -0400 Subject: [PATCH 60/69] FS-11442 [test] Fix double-free on test suite cleanup. --- src/include/test/switch_fct.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/include/test/switch_fct.h b/src/include/test/switch_fct.h index e85f7865ef..8cd01cb77a 100644 --- a/src/include/test/switch_fct.h +++ b/src/include/test/switch_fct.h @@ -2695,11 +2695,13 @@ fct_logger__on_warn(fct_logger_i *logger, char const *msg) /* Common routine to record strings representing failures. The chk should be a failure before we call this, and the list is a list -of char*'s that will eventually be free'd by the logger. */ +of conditions that will eventually be free'd by the logger. */ static void fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list) { - fct_nlist__append(fail_list, (void *)chk); + fctchk_t *dup_chk = (fctchk_t *)malloc(sizeof(*dup_chk)); + memcpy(dup_chk, chk, sizeof(*dup_chk)); + fct_nlist__append(fail_list, (void *)dup_chk); } @@ -2795,7 +2797,7 @@ fct_minimal_logger__on_delete( { fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_; fct_unused(e); - fct_nlist__final(&(self->failed_cndtns_list), free); + fct_nlist__final(&(self->failed_cndtns_list), (fct_nlist_on_del_t)fctchk__del); free(self); } @@ -2966,7 +2968,7 @@ fct_standard_logger__on_delete( { fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_; fct_unused(e); - fct_nlist__final(&(logger->failed_cndtns_list), free); + fct_nlist__final(&(logger->failed_cndtns_list), (fct_nlist_on_del_t)fctchk__del); free(logger); logger_ =NULL; } From d46f4f214978b032ac199f3a716b4f75f970ee82 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Sat, 27 Oct 2018 14:19:33 +0000 Subject: [PATCH 61/69] FS-11442 [test] add fst_check_extension_apps to compare dialplan apps with expected. --- src/include/test/switch_test.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index ac3f20fea9..fb4c06209c 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -675,6 +675,38 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, #define fst_play_and_detect_speech_test_end() \ } + +/** + * Compare extension dialplan apps and args with expected apps and args + * @param expected NULL terminated string array of app arg and names. + * const char *expected[] = { "playback", "https://example.com/foo.wav", "park", "", NULL }; + * @param extension the switch_caller_extension_t to check + */ +#define fst_check_extension_apps(expected, extension) \ + { \ + fst_xcheck(extension != NULL, "Missing extension\n"); \ + if (extension) { \ + int i; \ + switch_caller_application_t *cur_app = extension->applications; \ + for (i = 0; ; i += 2, cur_app = cur_app->next) { \ + int cur_app_num = i / 2 + 1; \ + if (!expected[i]) { \ + if (cur_app != NULL) { \ + fst_fail(switch_core_sprintf(fst_pool, "Unexpected application #%d \"%s\"\n", cur_app_num, cur_app->application_name)); \ + } \ + break; \ + } \ + fst_xcheck(cur_app != NULL, switch_core_sprintf(fst_pool, "Extension application #%d \"%s\" is missing", cur_app_num, expected[i])); \ + if (!cur_app) { \ + break; \ + } \ + fst_xcheck(cur_app->application_name && !strcmp(expected[i], cur_app->application_name), switch_core_sprintf(fst_pool, "Expected application #%d name is \"%s\", but is \"%s\"\n", cur_app_num, expected[i], cur_app->application_name)); \ + fst_xcheck(cur_app->application_data && !strcmp(expected[i + 1], cur_app->application_data), switch_core_sprintf(fst_pool, "Expected application #%d %s data is \"%s\", but is \"%s\"\n", cur_app_num, expected[i], expected[i + 1], cur_app->application_data)); \ + } \ + } \ + } + + /** * Inject DTMF into the session to be detected. * From a754d379baacaaf5e7794e63a61137fec453ba82 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Mon, 29 Oct 2018 14:03:40 +0000 Subject: [PATCH 62/69] FS-11442 [test] enable module runtime when loading it --- src/include/test/switch_test.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index fb4c06209c..7edcacb591 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -297,7 +297,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, const char *fst_test_module = #modname; \ if (fst_core && !zstr(fst_test_module)) { \ const char *err; \ - switch_loadable_module_load_module((char *)"./mod", (char *)fst_test_module, SWITCH_FALSE, &err); \ + switch_loadable_module_load_module((char *)"./mod", (char *)fst_test_module, SWITCH_TRUE, &err); \ } \ FCT_FIXTURE_SUITE_BGN(suite); #else @@ -306,7 +306,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, const char *fst_test_module = #modname; \ if (fst_core && !zstr(fst_test_module)) { \ const char *err; \ - switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ + switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_TRUE, &err); \ } \ FCT_FIXTURE_SUITE_BGN(suite); #endif From 18940d13f1ec93c80312cfcfa611f9703591e18d Mon Sep 17 00:00:00 2001 From: Seven Du Date: Fri, 2 Nov 2018 08:47:24 +0800 Subject: [PATCH 63/69] FS-11455 add switch_utils test --- tests/unit/Makefile.am | 2 +- tests/unit/switch_utils.c | 79 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/unit/switch_utils.c diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index 8f4eb4e7cf..8c25de5114 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/build/modmake.rulesam -bin_PROGRAMS = switch_event switch_hash switch_ivr_originate +bin_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) AM_CFLAGS = $(SWITCH_AM_CPPFLAGS) diff --git a/tests/unit/switch_utils.c b/tests/unit/switch_utils.c new file mode 100644 index 0000000000..177d14c6ba --- /dev/null +++ b/tests/unit/switch_utils.c @@ -0,0 +1,79 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Seven Du + * + * + * switch_utils.c -- tests switch_utils + * + */ + +#include +#include +#include + +FST_MINCORE_BEGIN() + +FST_SUITE_BEGIN(switch_hash) + +FST_SETUP_BEGIN() +{ +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + +FST_TEST_BEGIN(benchmark) +{ + char encoded[1024]; + char *s = "ABCD"; + + switch_url_encode(s, encoded, sizeof(encoded)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "encoded: [%s]\n", encoded); + fst_check_string_equals(encoded, "ABCD"); + + s = "&bryän#!杜金房"; + switch_url_encode(s, encoded, sizeof(encoded)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "encoded: [%s]\n", encoded); + fst_check_string_equals(encoded, "%26bry%C3%A4n%23!%E6%9D%9C%E9%87%91%E6%88%BF"); +} +FST_TEST_END() + +FST_SUITE_END() + +FST_MINCORE_END() + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: + */ From 97f42d429f3efe87b42aa8c6d3a1df72b8261ef1 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 6 Nov 2018 14:52:55 +0400 Subject: [PATCH 64/69] FS-11505: [core] System call with output capture on Linux and Windows without fork. Add switch_core test. --- Freeswitch.2017.sln | 11 ++ src/switch_core.c | 70 +++----- src/switch_xml.c | 2 +- tests/unit/Makefile.am | 2 +- tests/unit/conf/freeswitch.xml | 2 + tests/unit/switch_core.c | 88 ++++++++++ tests/unit/test_switch_core.2017.vcxproj | 203 +++++++++++++++++++++++ 7 files changed, 331 insertions(+), 47 deletions(-) create mode 100644 tests/unit/switch_core.c create mode 100644 tests/unit/test_switch_core.2017.vcxproj diff --git a/Freeswitch.2017.sln b/Freeswitch.2017.sln index 04b06b3539..2845b4af6a 100644 --- a/Freeswitch.2017.sln +++ b/Freeswitch.2017.sln @@ -570,6 +570,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{9388C266 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mod_av", "src\mod\applications\mod_av\test\test_mod_av.2017.vcxproj", "{7926CB0D-62CE-4A09-AE94-1DA2BC92D625}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_switch_core", "tests\unit\test_switch_core.2017.vcxproj", "{EF62B845-A0CE-44FD-B8E6-475FE87D06C3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -2589,6 +2591,14 @@ Global {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Debug|x64.ActiveCfg = Debug|x64 {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|Win32.ActiveCfg = Release|Win32 {7926CB0D-62CE-4A09-AE94-1DA2BC92D625}.Release|x64.ActiveCfg = Release|x64 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|Win32.ActiveCfg = Release|Win32 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|Win32.Build.0 = Release|Win32 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|x64.ActiveCfg = Release|x64 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.All|x64.Build.0 = Release|x64 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Debug|x64.ActiveCfg = Debug|x64 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|Win32.ActiveCfg = Release|Win32 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2795,6 +2805,7 @@ Global {4DFF29B4-2976-447D-A8B3-43476451517C} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0} {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {7926CB0D-62CE-4A09-AE94-1DA2BC92D625} = {9388C266-C3FC-468A-92EF-0CBC35941412} + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3} = {9388C266-C3FC-468A-92EF-0CBC35941412} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E} diff --git a/src/switch_core.c b/src/switch_core.c index 22b35ed63b..ca87b5f8cd 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -58,6 +58,11 @@ #include #endif +#ifdef WIN32 +#define popen _popen +#define pclose _pclose +#endif + SWITCH_DECLARE_DATA switch_directories SWITCH_GLOBAL_dirs = { 0 }; SWITCH_DECLARE_DATA switch_filenames SWITCH_GLOBAL_filenames = { 0 }; @@ -3253,45 +3258,7 @@ SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait) SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_handle_t *stream) { -#ifdef WIN32 - return switch_system(cmd, SWITCH_TRUE); -#else - int fds[2], pid = 0; - - if (pipe(fds)) { - goto end; - } else { /* good to go */ - pid = switch_fork(); - - if (pid < 0) { /* ok maybe not */ - close(fds[0]); - close(fds[1]); - goto end; - } else if (pid) { /* parent */ - char buf[1024] = ""; - int bytes; - close(fds[1]); - while ((bytes = read(fds[0], buf, sizeof(buf))) > 0) { - stream->raw_write_function(stream, (unsigned char *)buf, bytes); - } - close(fds[0]); - waitpid(pid, NULL, 0); - } else { /* child */ - switch_close_extra_files(fds, 2); - close(fds[0]); - dup2(fds[1], STDOUT_FILENO); - switch_system(cmd, SWITCH_TRUE); - close(fds[1]); - exit(0); - } - } - - end: - - return 0; - -#endif - + return switch_stream_system(cmd, stream); } SWITCH_DECLARE(switch_status_t) switch_core_get_stacksizes(switch_size_t *cur, switch_size_t *max) @@ -3320,13 +3287,26 @@ SWITCH_DECLARE(switch_status_t) switch_core_get_stacksizes(switch_size_t *cur, s SWITCH_DECLARE(int) switch_stream_system(const char *cmd, switch_stream_handle_t *stream) { -#ifdef WIN32 - stream->write_function(stream, "Capturing output not supported.\n"); - return switch_system(cmd, SWITCH_TRUE); -#else - return switch_stream_system_fork(cmd, stream); -#endif + char buffer[128]; + size_t bytes; + FILE* pipe = popen(cmd, "r"); + if (!pipe) return 1; + while (!feof(pipe)) { + while ((bytes = fread(buffer, 1, 128, pipe)) > 0) { + if (stream != NULL) { + stream->raw_write_function(stream, (unsigned char *)buffer, bytes); + } + } + } + + if (ferror(pipe)) { + pclose(pipe); + return 1; + } + + pclose(pipe); + return 0; } SWITCH_DECLARE(uint16_t) switch_core_get_rtp_port_range_start_port() diff --git a/src/switch_xml.c b/src/switch_xml.c index a815c92039..37400a13b5 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -124,7 +124,7 @@ static void preprocess_exec_set(char *keyval) if (key && val) { switch_stream_handle_t exec_result = { 0 }; SWITCH_STANDARD_STREAM(exec_result); - if (switch_stream_system_fork(val, &exec_result) == 0) { + if (switch_stream_system(val, &exec_result) == 0) { if (!zstr(exec_result.data)) { char *tmp = (char *) exec_result.data; tmp = &tmp[strlen(tmp)-1]; diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index 8c25de5114..76f757ed82 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/build/modmake.rulesam -bin_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils +bin_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) AM_CFLAGS = $(SWITCH_AM_CPPFLAGS) diff --git a/tests/unit/conf/freeswitch.xml b/tests/unit/conf/freeswitch.xml index 2341258ecd..87e5233600 100644 --- a/tests/unit/conf/freeswitch.xml +++ b/tests/unit/conf/freeswitch.xml @@ -1,5 +1,7 @@ + +
diff --git a/tests/unit/switch_core.c b/tests/unit/switch_core.c new file mode 100644 index 0000000000..05b3b7f60d --- /dev/null +++ b/tests/unit/switch_core.c @@ -0,0 +1,88 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Rienzo + * Seven Du + * + * + * switch_core.c -- tests core functions + * + */ +#include +#include + +#include + +FST_CORE_BEGIN("./conf") +{ + FST_SUITE_BEGIN(switch_ivr_originate) + { + FST_SETUP_BEGIN() + { + } + FST_SETUP_END() + + FST_TEARDOWN_BEGIN() + { + } + FST_TEARDOWN_END() + +#ifndef WIN32 + FST_TEST_BEGIN(test_fork) + { + switch_stream_handle_t exec_result = { 0 }; + SWITCH_STANDARD_STREAM(exec_result); + fst_requires(switch_stream_system_fork("ip ad sh", &exec_result) == 0); + fst_requires(!zstr(exec_result.data)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s\n", (char *)exec_result.data); + + fst_requires(switch_stream_system_fork("ip ad sh | grep link", &exec_result) == 0); + fst_requires(!zstr(exec_result.data)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s\n", (char *)exec_result.data); + + switch_safe_free(exec_result.data); + } + FST_TEST_END() +#endif + + FST_TEST_BEGIN(test_non_fork_exec_set) + { + char *var_test = switch_core_get_variable_dup("test"); + char *var_default_password = switch_core_get_variable_dup("default_password"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "global_getvar test: %s\n", switch_str_nil(var_test)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "global_getvar default_password: %s\n", switch_str_nil(var_default_password)); + + fst_check_string_not_equals(var_test, ""); + fst_check_string_not_equals(var_default_password, ""); + fst_check_string_equals(var_test, var_default_password); + + switch_safe_free(var_test); + switch_safe_free(var_default_password); + } + FST_TEST_END() + } + FST_SUITE_END() +} +FST_CORE_END() diff --git a/tests/unit/test_switch_core.2017.vcxproj b/tests/unit/test_switch_core.2017.vcxproj new file mode 100644 index 0000000000..c12e24a5e7 --- /dev/null +++ b/tests/unit/test_switch_core.2017.vcxproj @@ -0,0 +1,203 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + test_switch_core + test_switch_core + Win32Proj + 10.0.17134.0 + {EF62B845-A0CE-44FD-B8E6-475FE87D06C3} + + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + Application + MultiByte + v141 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(PlatformName)\$(Configuration)\ + false + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(PlatformName)\$(Configuration)\ + $(PlatformName)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + $(SolutionDir)src\include;%(AdditionalIncludeDirectories) + SWITCH_TEST_BASE_DIR_FOR_CONF="..\\..\\tests\\unit\\";%(PreprocessorDefinitions) + + + + + + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + true + Console + true + + + MachineX86 + + + + + + X64 + + + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + true + Console + true + + + MachineX64 + + + + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + false + Console + true + true + true + + + MachineX86 + + + + + + X64 + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + 6031;6340;6246;6011;6387;%(DisableSpecificWarnings) + + + $(OutDir);%(AdditionalLibraryDirectories) + false + Console + true + true + true + + + MachineX64 + + + + + + + + {202d7a4e-760d-4d0e-afa1-d7459ced30ff} + + + + + + \ No newline at end of file From 1ddd4c992bc2f8fb6bf30210496b38ae2f56bdb5 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Fri, 14 Dec 2018 10:52:00 +0800 Subject: [PATCH 65/69] FS-11569 add rate to null endpoint --- src/include/test/switch_test.h | 12 +++++++++- src/mod/endpoints/mod_loopback/mod_loopback.c | 23 +++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index 7edcacb591..18656b3e29 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -416,8 +416,10 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, * switch_channel_t *fst_channel; The outbound null session's channel. * * @param name the name of this test + * @param rate the rate of the channel */ -#define FST_SESSION_BEGIN(name) \ + +#define FST_SESSION_BEGIN_RATE(name, rate) \ FCT_TEST_BGN(name) \ { \ switch_core_session_t *fst_session = NULL; \ @@ -432,6 +434,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, fst_requires(switch_core_running()); \ fst_requires(switch_event_create_plain(&fst_originate_vars, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS); \ switch_event_add_header_string(fst_originate_vars, SWITCH_STACK_BOTTOM, "origination_caller_id_number", "+15551112222"); \ + switch_event_add_header(fst_originate_vars, SWITCH_STACK_BOTTOM, "rate", "%d", rate); \ if (switch_ivr_originate(NULL, &fst_session, &fst_cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, fst_originate_vars, SOF_NONE, NULL, NULL) == SWITCH_STATUS_SUCCESS && fst_session) { \ switch_memory_pool_t *fst_session_pool = switch_core_session_get_pool(fst_session); \ switch_channel_t *fst_channel = switch_core_session_get_channel(fst_session); \ @@ -442,6 +445,13 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir, switch_ivr_record_session(fst_session, (char *)"/tmp/"#name".wav", 0, NULL); \ for(;;) { +/** + * Define a session test in a test suite. This can be used to test IVR functions. + * See FST_SESSION_BEGIN_RATE + */ + +#define FST_SESSION_BEGIN(name) FST_SESSION_BEGIN_RATE(name, 8000) + /* BODY OF TEST CASE HERE */ /** diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index 1ef3690578..242f3c645c 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -1220,6 +1220,7 @@ struct null_private_object { switch_caller_profile_t *caller_profile; switch_frame_t read_frame; int16_t *null_buf; + int rate; }; typedef struct null_private_object null_private_t; @@ -1239,20 +1240,19 @@ static switch_status_t null_channel_kill_channel(switch_core_session_t *session, static switch_status_t null_tech_init(null_private_t *tech_pvt, switch_core_session_t *session) { const char *iananame = "L16"; - uint32_t rate = 8000; uint32_t interval = 20; switch_status_t status = SWITCH_STATUS_SUCCESS; switch_channel_t *channel = switch_core_session_get_channel(session); const switch_codec_implementation_t *read_impl; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s setup codec %s/%d/%d\n", switch_channel_get_name(channel), iananame, rate, - interval); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s setup codec %s/%d/%d\n", + switch_channel_get_name(channel), iananame, tech_pvt->rate, interval); status = switch_core_codec_init(&tech_pvt->read_codec, iananame, NULL, NULL, - rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); + tech_pvt->rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); if (status != SWITCH_STATUS_SUCCESS || !tech_pvt->read_codec.implementation || !switch_core_codec_ready(&tech_pvt->read_codec)) { goto end; @@ -1262,7 +1262,7 @@ static switch_status_t null_tech_init(null_private_t *tech_pvt, switch_core_sess iananame, NULL, NULL, - rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); + tech_pvt->rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); if (status != SWITCH_STATUS_SUCCESS) { @@ -1494,6 +1494,19 @@ static switch_call_cause_t null_channel_outgoing_channel(switch_core_session_t * switch_core_session_add_stream(*new_session, NULL); if ((tech_pvt = (null_private_t *) switch_core_session_alloc(*new_session, sizeof(null_private_t))) != 0) { + const char *rate_ = switch_event_get_header(var_event, "rate"); + int rate = 0; + + if (rate_) { + rate = atoi(rate_); + } + + if (!(rate > 0 && rate % 8000 == 0)) { + rate = 8000; + } + + tech_pvt->rate = rate; + channel = switch_core_session_get_channel(*new_session); switch_snprintf(name, sizeof(name), "null/%s", outbound_profile->destination_number); switch_channel_set_name(channel, name); From ffc4a6e32ac94aa41c65b89cce53154e4f939d5c Mon Sep 17 00:00:00 2001 From: Mike Jerris Date: Fri, 26 Oct 2018 14:43:38 +0000 Subject: [PATCH 66/69] FS-11487 convert tests to Makefile.am --- Makefile.am | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/Makefile.am b/Makefile.am index dcfee8161b..759189ecee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ EXTRA_DIST = -SUBDIRS = . src build +SUBDIRS = . src build tests/unit AUTOMAKE_OPTIONS = foreign subdir-objects NAME = freeswitch @@ -865,16 +865,3 @@ support: @cp support-d/.bashrc ~ @test -f ~/.cc-mode-installed || sh support-d/install-cc-mode.sh && touch ~/.cc-mode-installed -# Using a non-recursive Makefile structure for the automated tests so that the tests have visibility into -# targets in the rest of the FreeSWITCH tree. This greatly simplifies dependency tracking at the expense -# of longer test target names. Since the tests are expected to be run easily and rapidly after minor source -# changes this is the most effective structure. - -check_PROGRAMS = - -include tests/unit/unit.mk - -TESTS = $(check_PROGRAMS) - -tests: $(check_PROGRAMS) - From 82452988e2a5788ed6b8cce70e33c588e8576555 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 4 Dec 2018 00:31:36 +0400 Subject: [PATCH 67/69] FS-11547: [core] Fix broken record_sample_rate variable. --- src/switch_core_file.c | 11 +++++++---- src/switch_ivr_async.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/switch_core_file.c b/src/switch_core_file.c index 4cd4600c48..8fc0008b78 100644 --- a/src/switch_core_file.c +++ b/src/switch_core_file.c @@ -81,10 +81,13 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file, } fh->samples_in = 0; - fh->samplerate = 0; - fh->native_rate = 0; - fh->channels = 0; - fh->real_channels = 0; + + if (!(flags & SWITCH_FILE_FLAG_WRITE)) { + fh->samplerate = 0; + fh->native_rate = 0; + fh->channels = 0; + fh->real_channels = 0; + } if (!fh->samplerate) { if (!(fh->samplerate = rate)) { diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 23d669214f..f318fd9874 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1322,7 +1322,7 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s switch_core_session_get_read_impl(session, &rh->read_impl); if (rh->fh) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->read_impl.actual_samples_per_second); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Record session sample rate: %d -> %d\n", rh->fh->native_rate, rh->fh->samplerate); rh->fh->native_rate = rh->read_impl.actual_samples_per_second; if (switch_core_file_has_video(rh->fh, SWITCH_TRUE)) { switch_core_media_bug_set_media_params(bug, &rh->fh->mm); From c27206e36d420287d6e127adf1834ba3c5fa41ad Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Wed, 12 Dec 2018 18:13:13 +0400 Subject: [PATCH 68/69] FS-11565: [Build-System] Add 48kHz sounds to the Visual Studio solution on Windows. --- Freeswitch.2017.sln | 30 +++++++++ libs/win32/Sound_Files/48khz.2017.vcxproj | 65 +++++++++++++++++++ .../win32/Sound_Files/48khzmusic.2017.vcxproj | 65 +++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 libs/win32/Sound_Files/48khz.2017.vcxproj create mode 100644 libs/win32/Sound_Files/48khzmusic.2017.vcxproj diff --git a/Freeswitch.2017.sln b/Freeswitch.2017.sln index 2845b4af6a..1962a9b283 100644 --- a/Freeswitch.2017.sln +++ b/Freeswitch.2017.sln @@ -572,6 +572,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mod_av", "src\mod\appl EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_switch_core", "tests\unit\test_switch_core.2017.vcxproj", "{EF62B845-A0CE-44FD-B8E6-475FE87D06C3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz", "libs\win32\Sound_Files\48khz.2017.vcxproj", "{8154C82D-58EE-4145-9DEC-A445A5AA3D6B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz music", "libs\win32\Sound_Files\48khzmusic.2017.vcxproj", "{EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -1275,6 +1279,7 @@ Global {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32 {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.Build.0 = Debug|Win32 {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64 + {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.Build.0 = Debug|x64 {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32 {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64 {464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32 @@ -1282,6 +1287,7 @@ Global {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32 {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.Build.0 = Debug|Win32 {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64 + {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.Build.0 = Debug|x64 {464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32 {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64 {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release|Win32 @@ -1611,6 +1617,7 @@ Global {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32 {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.Build.0 = Debug|Win32 {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64 + {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.Build.0 = Debug|x64 {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32 {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64 {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32 @@ -1618,6 +1625,7 @@ Global {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32 {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.Build.0 = Debug|Win32 {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64 + {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.Build.0 = Debug|x64 {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32 {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64 {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64 @@ -2599,6 +2607,26 @@ Global {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Debug|x64.ActiveCfg = Debug|x64 {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|Win32.ActiveCfg = Release|Win32 {EF62B845-A0CE-44FD-B8E6-475FE87D06C3}.Release|x64.ActiveCfg = Release|x64 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|Win32.ActiveCfg = Release|Win32 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|Win32.Build.0 = Release|Win32 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|x64.ActiveCfg = Release|x64 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.All|x64.Build.0 = Release|x64 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|Win32.Build.0 = Debug|Win32 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|x64.ActiveCfg = Debug|x64 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Debug|x64.Build.0 = Debug|x64 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Release|Win32.ActiveCfg = Release|Win32 + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B}.Release|x64.ActiveCfg = Release|x64 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|Win32.ActiveCfg = Release|Win32 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|Win32.Build.0 = Release|Win32 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|x64.ActiveCfg = Release|x64 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.All|x64.Build.0 = Release|x64 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|Win32.ActiveCfg = Debug|Win32 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|Win32.Build.0 = Debug|Win32 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|x64.ActiveCfg = Debug|x64 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|x64.Build.0 = Debug|x64 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|Win32.ActiveCfg = Release|Win32 + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2806,6 +2834,8 @@ Global {BC1FD72E-1CD5-4525-A7F5-17C5740BFDED} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {7926CB0D-62CE-4A09-AE94-1DA2BC92D625} = {9388C266-C3FC-468A-92EF-0CBC35941412} {EF62B845-A0CE-44FD-B8E6-475FE87D06C3} = {9388C266-C3FC-468A-92EF-0CBC35941412} + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31} = {4F227C26-768F-46A3-8684-1D08A46FB374} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E} diff --git a/libs/win32/Sound_Files/48khz.2017.vcxproj b/libs/win32/Sound_Files/48khz.2017.vcxproj new file mode 100644 index 0000000000..66b65f2584 --- /dev/null +++ b/libs/win32/Sound_Files/48khz.2017.vcxproj @@ -0,0 +1,65 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + 48khz + My48khz + {8154C82D-58EE-4145-9DEC-A445A5AA3D6B} + + + + Utility + MultiByte + true + v141 + + + Utility + MultiByte + true + v141 + + + Utility + MultiByte + v141 + + + Utility + MultiByte + v141 + + + en-us-callie + 48000 + en\us\callie\voicemail\$(SoundQuality) + + + $(PlatformName)\$(Configuration)\$(ProjectName)\$(SoundQuality) + + + + + + + + + + diff --git a/libs/win32/Sound_Files/48khzmusic.2017.vcxproj b/libs/win32/Sound_Files/48khzmusic.2017.vcxproj new file mode 100644 index 0000000000..c9eeb07288 --- /dev/null +++ b/libs/win32/Sound_Files/48khzmusic.2017.vcxproj @@ -0,0 +1,65 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + 48khz music + My48khzmusic + {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31} + + + + Utility + MultiByte + true + v141 + + + Utility + MultiByte + true + v141 + + + Utility + MultiByte + v141 + + + Utility + MultiByte + v141 + + + music + 48000 + music\$(SoundQuality) + + + $(PlatformName)\$(Configuration)\$(ProjectName)\$(SoundQuality) + + + + + + + + + + From d0cca7e222cd2b85b900026b0be15bf60e497bfd Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Fri, 7 Dec 2018 14:37:01 +0400 Subject: [PATCH 69/69] FS-11555: [mod_signalwire] Initial commit. --- Freeswitch.2017.sln | 15 + build/modules.conf.in | 1 + build/modules.conf.most | 1 + .../autoload_configs/modules.conf.xml | 1 + .../minimal/autoload_configs/modules.conf.xml | 1 + conf/rayo/autoload_configs/modules.conf.xml | 1 + conf/sbc/autoload_configs/modules.conf.xml | 1 + conf/softphone/freeswitch.xml | 1 + .../vanilla/autoload_configs/modules.conf.xml | 1 + configure.ac | 9 + debian/control-modules | 5 + freeswitch.spec | 18 +- libs/.gitignore | 5 + .../applications/mod_signalwire/Makefile.am | 27 + .../conf/autoload_configs/signalwire.conf.xml | 10 + .../mod_signalwire.2017.vcxproj | 149 ++ .../mod_signalwire/mod_signalwire.c | 1308 +++++++++++++++++ w32/Setup/Setup.2017.wixproj | 8 + w32/libks-version.props | 19 + w32/libks.props | 78 + w32/signalwire-client-c-version.props | 19 + w32/signalwire-client-c.props | 76 + 22 files changed, 1752 insertions(+), 2 deletions(-) create mode 100644 src/mod/applications/mod_signalwire/Makefile.am create mode 100644 src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml create mode 100644 src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj create mode 100644 src/mod/applications/mod_signalwire/mod_signalwire.c create mode 100644 w32/libks-version.props create mode 100644 w32/libks.props create mode 100644 w32/signalwire-client-c-version.props create mode 100644 w32/signalwire-client-c.props diff --git a/Freeswitch.2017.sln b/Freeswitch.2017.sln index 1962a9b283..be107fde3e 100644 --- a/Freeswitch.2017.sln +++ b/Freeswitch.2017.sln @@ -576,6 +576,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz", "libs\win32\Sound_F EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "48khz music", "libs\win32\Sound_Files\48khzmusic.2017.vcxproj", "{EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_signalwire", "src\mod\applications\mod_signalwire\mod_signalwire.2017.vcxproj", "{B19AE6FC-BFFF-428D-B483-3BBEAECCC618}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -2627,6 +2629,18 @@ Global {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Debug|x64.Build.0 = Debug|x64 {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|Win32.ActiveCfg = Release|Win32 {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31}.Release|x64.ActiveCfg = Release|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|Win32.ActiveCfg = Release|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|Win32.Build.0 = Release|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|x64.ActiveCfg = Release|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.All|x64.Build.0 = Release|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|Win32.ActiveCfg = Debug|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|Win32.Build.0 = Debug|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|x64.ActiveCfg = Debug|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Debug|x64.Build.0 = Debug|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|Win32.ActiveCfg = Release|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|Win32.Build.0 = Release|Win32 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|x64.ActiveCfg = Release|x64 + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2836,6 +2850,7 @@ Global {EF62B845-A0CE-44FD-B8E6-475FE87D06C3} = {9388C266-C3FC-468A-92EF-0CBC35941412} {8154C82D-58EE-4145-9DEC-A445A5AA3D6B} = {4F227C26-768F-46A3-8684-1D08A46FB374} {EBD0B6B4-C5CA-46B0-BBC7-DBA71DF05D31} = {4F227C26-768F-46A3-8684-1D08A46FB374} + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {09840DE7-9208-45AA-9667-1A71EE93BD1E} diff --git a/build/modules.conf.in b/build/modules.conf.in index d998e5dba8..a3297e744c 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -39,6 +39,7 @@ applications/mod_httapi #applications/mod_rad_auth #applications/mod_redis #applications/mod_rss +applications/mod_signalwire applications/mod_sms #applications/mod_sms_flowroute #applications/mod_snapshot diff --git a/build/modules.conf.most b/build/modules.conf.most index b442b966e6..a4946004d2 100644 --- a/build/modules.conf.most +++ b/build/modules.conf.most @@ -38,6 +38,7 @@ applications/mod_prefix #applications/mod_rad_auth applications/mod_redis applications/mod_rss +applications/mod_signalwire applications/mod_sms applications/mod_snapshot applications/mod_snom diff --git a/conf/insideout/autoload_configs/modules.conf.xml b/conf/insideout/autoload_configs/modules.conf.xml index 3e2b09cdcb..5078503489 100644 --- a/conf/insideout/autoload_configs/modules.conf.xml +++ b/conf/insideout/autoload_configs/modules.conf.xml @@ -37,6 +37,7 @@ + diff --git a/conf/minimal/autoload_configs/modules.conf.xml b/conf/minimal/autoload_configs/modules.conf.xml index 37ece9d202..a57544f2fe 100644 --- a/conf/minimal/autoload_configs/modules.conf.xml +++ b/conf/minimal/autoload_configs/modules.conf.xml @@ -17,6 +17,7 @@ + diff --git a/conf/rayo/autoload_configs/modules.conf.xml b/conf/rayo/autoload_configs/modules.conf.xml index f6c58680bc..ee44e06c57 100644 --- a/conf/rayo/autoload_configs/modules.conf.xml +++ b/conf/rayo/autoload_configs/modules.conf.xml @@ -14,6 +14,7 @@ + diff --git a/conf/sbc/autoload_configs/modules.conf.xml b/conf/sbc/autoload_configs/modules.conf.xml index 579b1d33be..31f46a4128 100644 --- a/conf/sbc/autoload_configs/modules.conf.xml +++ b/conf/sbc/autoload_configs/modules.conf.xml @@ -26,6 +26,7 @@ + diff --git a/conf/softphone/freeswitch.xml b/conf/softphone/freeswitch.xml index 771efd9544..5fbc0cbd39 100644 --- a/conf/softphone/freeswitch.xml +++ b/conf/softphone/freeswitch.xml @@ -89,6 +89,7 @@ + diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 2c465d1231..0b336a168d 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -50,6 +50,7 @@ + diff --git a/configure.ac b/configure.ac index 1144a5faac..4045e72f62 100644 --- a/configure.ac +++ b/configure.ac @@ -1498,6 +1498,14 @@ PKG_CHECK_MODULES([V8FS_STATIC], [v8-6.1_static >= 6.1.298],[ ]) ]) +PKG_CHECK_MODULES([KS], [libks >= 1.1.0],[ + AM_CONDITIONAL([HAVE_KS],[true])],[ + AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_KS],[false])]) + +PKG_CHECK_MODULES([SIGNALWIRE_CLIENT], [signalwire_client >= 1.0.0],[ + AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[true])],[ + AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SIGNALWIRE_CLIENT],[false])]) + PKG_CHECK_MODULES([AMQP], [librabbitmq >= 0.5.2],[ AM_CONDITIONAL([HAVE_AMQP],[true])],[ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_AMQP],[false])]) @@ -1853,6 +1861,7 @@ AC_CONFIG_FILES([Makefile src/mod/applications/mod_redis/Makefile src/mod/applications/mod_rss/Makefile src/mod/applications/mod_skel/Makefile + src/mod/applications/mod_signalwire/Makefile src/mod/applications/mod_sms/Makefile src/mod/applications/mod_sms_flowroute/Makefile src/mod/applications/mod_snapshot/Makefile diff --git a/debian/control-modules b/debian/control-modules index b19e12e575..d27ebbbc37 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -206,6 +206,11 @@ Module: applications/mod_skel Description: Adds mod_skel Adds mod_skel. +Module: applications/mod_signalwire +Description: mod_signalwire + Adds mod_signalwire. +Build-Depends: libks, signalwire-client-c + Module: applications/mod_sms Description: Astract SMS This module provides an abstract facility for interfacing with SMS diff --git a/freeswitch.spec b/freeswitch.spec index 0cc0462323..f0fee3ca72 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -3,7 +3,7 @@ # spec file for package freeswitch # # includes module(s): freeswitch-devel freeswitch-codec-passthru-amr freeswitch-codec-passthru-amrwb freeswitch-codec-passthru-g729 -# freeswitch-codec-passthru-g7231 freeswitch-lua freeswitch-perl freeswitch-python freeswitch-v8 +# freeswitch-codec-passthru-g7231 freeswitch-lua freeswitch-perl freeswitch-python freeswitch-v8 freeswitch-signalwire # freeswitch-lan-de freeswitch-lang-en freeswitch-lang-fr freeswitch-lang-hu freeswitch-lang-ru freeswitch-freetdm # and others # @@ -536,6 +536,14 @@ Requires: %{name} = %{version}-%{release} Provides FreeSWITCH mod_rss, edisrse and read an XML based RSS feed, then read the entries aloud via a TTS engine +%package application-signalwire +Summary: FreeSWITCH mod_signalwire +Group: System/Libraries +Requires: %{name} = %{version}-%{release} + +%description application-signalwire +Provides FreeSWITCH mod_signalwire + %package application-sms Summary: FreeSWITCH mod_sms Group: System/Libraries @@ -1373,6 +1381,7 @@ Requires: freeswitch-application-memcache Requires: freeswitch-application-nibblebill Requires: freeswitch-application-redis Requires: freeswitch-application-rss +Requires: freeswitch-application-signalwire Requires: freeswitch-application-sms Requires: freeswitch-application-snapshot Requires: freeswitch-application-snom @@ -1458,7 +1467,7 @@ APPLICATION_MODULES_FR="applications/mod_fifo applications/mod_fsk applications/ applications/mod_memcache applications/mod_mongo applications/mod_nibblebill applications/mod_rad_auth \ applications/mod_redis applications/mod_rss " -APPLICATION_MODULES_SZ="applications/mod_sms applications/mod_snapshot applications/mod_snom applications/mod_soundtouch \ +APPLICATION_MODULES_SZ="applications/mod_signalwire applications/mod_sms applications/mod_snapshot applications/mod_snom applications/mod_soundtouch \ applications/mod_spandsp applications/mod_spy applications/mod_stress \ applications/mod_valet_parking applications/mod_translate applications/mod_voicemail \ applications/mod_voicemail_ivr applications/mod_video_filter" @@ -2115,6 +2124,9 @@ fi %files application-rss %{MODINSTDIR}/mod_rss.so* +%files application-signalwire +%{MODINSTDIR}/mod_signalwire.so* + %files application-sms %{MODINSTDIR}/mod_sms.so* @@ -2541,6 +2553,8 @@ fi # ###################################################################################################################### %changelog +* Tue Dec 11 2018 - Andrey Volk +- add mod_signalwire * Sun Mar 13 2016 - Matthew Vale - add perl and python ESL language module packages * Thu Jul 09 2015 - Artur Zaprzała diff --git a/libs/.gitignore b/libs/.gitignore index 8555f1a4f1..10b50dda73 100644 --- a/libs/.gitignore +++ b/libs/.gitignore @@ -858,3 +858,8 @@ libsndfile-*/ libsndfile-* opencv-*/ opencv-* +libks-*/ +libks* +signalwire-client-c-*/ +signalwire-client-c-* + diff --git a/src/mod/applications/mod_signalwire/Makefile.am b/src/mod/applications/mod_signalwire/Makefile.am new file mode 100644 index 0000000000..d46251b832 --- /dev/null +++ b/src/mod/applications/mod_signalwire/Makefile.am @@ -0,0 +1,27 @@ +include $(top_srcdir)/build/modmake.rulesam +MODNAME=mod_signalwire + +if HAVE_KS +if HAVE_SIGNALWIRE_CLIENT + +mod_LTLIBRARIES = mod_signalwire.la +mod_signalwire_la_SOURCES = mod_signalwire.c +mod_signalwire_la_CFLAGS = $(AM_CFLAGS) +mod_signalwire_la_CFLAGS += $(KS_CFLAGS) $(SIGNALWIRE_CLIENT_CFLAGS) +mod_signalwire_la_LIBADD = $(switch_builddir)/libfreeswitch.la +mod_signalwire_la_LDFLAGS = -avoid-version -module -no-undefined -shared $(KS_LIBS) $(SIGNALWIRE_CLIENT_LIBS) + +else +install: error +all: error +error: + $(error You must install signalwire-client-c to build mod_signalwire) +endif + +else +install: error +all: error +error: + $(error You must install libks to build mod_signalwire) +endif + diff --git a/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml b/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml new file mode 100644 index 0000000000..c62ad72ff0 --- /dev/null +++ b/src/mod/applications/mod_signalwire/conf/autoload_configs/signalwire.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj b/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj new file mode 100644 index 0000000000..192c82d51d --- /dev/null +++ b/src/mod/applications/mod_signalwire/mod_signalwire.2017.vcxproj @@ -0,0 +1,149 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + mod_signalwire + mod_signalwire + Win32Proj + {B19AE6FC-BFFF-428D-B483-3BBEAECCC618} + + + + DynamicLibrary + MultiByte + v141 + + + DynamicLibrary + MultiByte + v141 + + + DynamicLibrary + MultiByte + v141 + + + DynamicLibrary + MultiByte + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + .;%(AdditionalIncludeDirectories) + + + + + + + + + _DEBUG;DEBUG;%(PreprocessorDefinitions) + + + false + + + + + + + X64 + + + + + _DEBUG;DEBUG;%(PreprocessorDefinitions) + + + false + + + MachineX64 + + + + + + + NDEBUG;%(PreprocessorDefinitions) + + + false + + + + + + + X64 + + + + + NDEBUG;%(PreprocessorDefinitions) + + + false + + + MachineX64 + + + + + + + + {202d7a4e-760d-4d0e-afa1-d7459ced30ff} + false + + + + + + diff --git a/src/mod/applications/mod_signalwire/mod_signalwire.c b/src/mod/applications/mod_signalwire/mod_signalwire.c new file mode 100644 index 0000000000..5fd2fe828e --- /dev/null +++ b/src/mod/applications/mod_signalwire/mod_signalwire.c @@ -0,0 +1,1308 @@ +/* + * mod_signalwire.c -- SignalWire module + * + * Copyright (c) 2018 SignalWire, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +#define SW_KS_JSON_PRINT(_h, _j) do { \ + char *_json = ks_json_print(_j); \ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ALERT, "--- %s ---\n%s\n---\n", _h, _json); \ + ks_json_free(&_json); \ + } while (0) + +static int debug_level = 7; + +static int signalwire_gateway_exists(void); + +/* Prototypes */ +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_signalwire_shutdown); +SWITCH_MODULE_LOAD_FUNCTION(mod_signalwire_load); +SWITCH_MODULE_RUNTIME_FUNCTION(mod_signalwire_runtime); + +/* SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime) + * Defines a switch_loadable_module_function_table_t and a static const char[] modname + */ +SWITCH_MODULE_DEFINITION(mod_signalwire, mod_signalwire_load, mod_signalwire_shutdown, mod_signalwire_runtime); + +typedef enum { + SW_STATE_ADOPTION, + SW_STATE_OFFLINE, + SW_STATE_ONLINE, + SW_STATE_CONFIGURE, + SW_STATE_START_PROFILE, + SW_STATE_REGISTER, + SW_STATE_READY, +} sw_state_t; + +static struct { + int ssl_verify; + ks_bool_t shutdown; + ks_bool_t restarting; + swclt_config_t *config; + char blade_bootstrap[1024]; + char adoption_service[1024]; + char stun_server[1024]; + char adoption_token[64]; + ks_size_t adoption_backoff; + ks_time_t adoption_next; + + char adoption_data_local_ip[256]; + char adoption_data_external_ip[256]; + char adoption_data_uname[1024]; + + char relay_connector_id[256]; + + swclt_sess_t signalwire_session; + swclt_hmon_t signalwire_session_monitor; + sw_state_t state; + ks_bool_t profile_update; + ks_bool_t profile_reload; + ks_bool_t signalwire_reconnected; + switch_xml_t signalwire_profile; + char signalwire_profile_md5[SWITCH_MD5_DIGEST_STRING_SIZE]; + + ks_bool_t kslog_on; + + switch_mutex_t *mutex; // general mutex for this mod + char gateway_ip[80]; + char gateway_port[10]; +} globals; + +static void mod_signalwire_kslogger(const char *file, const char *func, int line, int level, const char *fmt, ...) +{ + const char *fp; + va_list ap; + char buf[32768]; + + if (level > debug_level) return; + + fp = switch_cut_path(file); + + va_start(ap, fmt); + + vsnprintf(buf, sizeof(buf) - 1, fmt, ap); + buf[sizeof(buf) - 1] = '\0'; + + va_end(ap); + + switch_log_printf(SWITCH_CHANNEL_ID_LOG, fp, func, line, NULL, level, "%s\n", buf); +} + +static switch_status_t switch_find_available_port(switch_port_t *port, const char *ip, int type) +{ + switch_status_t ret = SWITCH_STATUS_SUCCESS; + switch_memory_pool_t *pool = NULL; + switch_sockaddr_t *addr = NULL; + switch_socket_t *sock = NULL; + switch_bool_t found = SWITCH_FALSE; + + if ((ret = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) { + goto done; + } + + while (!found) { + if ((ret = switch_sockaddr_info_get(&addr, ip, SWITCH_UNSPEC, *port, 0, pool)) != SWITCH_STATUS_SUCCESS) { + goto done; + } + + if ((ret = switch_socket_create(&sock, switch_sockaddr_get_family(addr), type, 0, pool)) != SWITCH_STATUS_SUCCESS) { + goto done; + } + + if (!(found = (switch_socket_bind(sock, addr) == SWITCH_STATUS_SUCCESS))) { + *port = *port + 1; + } + + switch_socket_close(sock); + } + +done: + if (pool) switch_core_destroy_memory_pool(&pool); + + return ret; +} + +struct response_data { + char *data; + size_t size; +}; + +static size_t response_data_handler(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t received = size * nmemb; + struct response_data *rd = (struct response_data *)userp; + + if (!rd->data) rd->data = ks_pool_alloc(NULL, received + 1); + else rd->data = ks_pool_resize(rd->data, rd->size + received + 1); + + memcpy(rd->data + rd->size, contents, received); + rd->size += received; + rd->data[rd->size] = 0; + + return received; +} + +static void save_sip_config(const char *config) +{ + char confpath[1024]; + FILE *fp = NULL; + + switch_snprintf(confpath, sizeof(confpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat"); + fp = fopen(confpath, "w"); + if (!fp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire SIP configuration\n", confpath); + return; + } + + fputs(config, fp); + fclose(fp); +} + +static void load_sip_config(void) +{ + char confpath[1024]; + char data[32767] = { 0 }; + FILE *fp = NULL; + + switch_snprintf(confpath, sizeof(confpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat"); + if (!(fp = fopen(confpath, "r"))) return; + + if (!fread(data, 1, sizeof(data), fp)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire SIP configuration from %s\n", confpath); + } + fclose(fp); + if (!zstr_buf(data)) { + switch_md5_string(globals.signalwire_profile_md5, (void *) data, strlen(data)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "saved profile MD5 = \"%s\"\n", globals.signalwire_profile_md5); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "saved profile = \"%s\"\n", (char *)data); + globals.signalwire_profile = switch_xml_parse_str_dynamic((char *)data, SWITCH_TRUE); + } +} + +static ks_status_t load_credentials_from_json(ks_json_t *json) +{ + ks_status_t status = KS_STATUS_SUCCESS; + ks_json_t *authentication = NULL; + const char *authentication_str = NULL; + const char *bootstrap = NULL; + const char *relay_connector_id = NULL; + + if ((bootstrap = ks_json_get_object_cstr(json, "bootstrap")) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing bootstrap URL\n"); + status = KS_STATUS_FAIL; + goto done; + } + + if ((relay_connector_id = ks_json_get_object_cstr(json, "relay_connector_id")) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing relay_connector_id\n"); + status = KS_STATUS_FAIL; + goto done; + } + + if ((authentication = ks_json_get_object_item(json, "authentication")) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Unable to connect to SignalWire: missing authentication\n"); + status = KS_STATUS_FAIL; + goto done; + } + + // update the internal connection target, which is normally assigned in swclt_sess_create() + if (swclt_sess_target_set(globals.signalwire_session, bootstrap) != KS_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to connect to SignalWire at %s\n", bootstrap); + status = KS_STATUS_FAIL; + goto done; + } + + // update the relay_connector_id passed to profile configuration + strncpy(globals.relay_connector_id, relay_connector_id, sizeof(globals.relay_connector_id) - 1); + strncpy(globals.blade_bootstrap, bootstrap, sizeof(globals.blade_bootstrap) - 1); + + // got adopted, update the client config authentication + authentication_str = ks_json_pprint_unformatted(NULL, authentication); + swclt_config_set_authentication(globals.config, authentication_str); + + ks_pool_free(&authentication_str); +done: + + return status; +} + +static ks_status_t mod_signalwire_adoption_post(void) +{ + ks_status_t status = KS_STATUS_SUCCESS; + switch_memory_pool_t *pool = NULL; + switch_CURL *curl = NULL; + switch_curl_slist_t *headers = NULL; + char url[1024]; + char errbuf[CURL_ERROR_SIZE]; + CURLcode res; + long rescode; + ks_json_t *json = ks_json_create_object(); + struct response_data rd = { 0 }; + char *jsonstr = NULL; + + // Determine and cache adoption data values that are heavier to figure out + if (!globals.adoption_data_local_ip[0]) { + switch_find_local_ip(globals.adoption_data_local_ip, sizeof(globals.adoption_data_local_ip), NULL, AF_INET); + } + + if (!globals.adoption_data_external_ip[0]) { + switch_port_t local_port = 6050; + char *error = NULL; + char *external_ip; + switch_port_t external_port; + + if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SignalWire adoption failed: could not allocate memory pool\n"); + status = KS_STATUS_FAIL; + goto done; + } + if (switch_find_available_port(&local_port, globals.adoption_data_local_ip, SOCK_STREAM) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: could not get available local port\n"); + status = KS_STATUS_FAIL; + goto done; + } + + external_ip = globals.adoption_data_local_ip; + external_port = local_port; + if (switch_stun_lookup(&external_ip, &external_port, globals.stun_server, SWITCH_STUN_DEFAULT_PORT, &error, pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: stun [%s] lookup error: %s\n", globals.stun_server, error); + status = KS_STATUS_FAIL; + goto done; + } + strncpy(globals.adoption_data_external_ip, external_ip, sizeof(globals.adoption_data_external_ip)); + } + + if (!globals.adoption_data_uname[0]) { +#ifndef WIN32 + struct utsname buf; + if (uname(&buf)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed: could not get uname\n"); + status = KS_STATUS_FAIL; + goto done; + } + switch_snprintf(globals.adoption_data_uname, + sizeof(globals.adoption_data_uname), + "%s %s %s %s %s", + buf.sysname, + buf.nodename, + buf.release, + buf.version, + buf.machine); +#else + // @todo set globals.adoption_data_uname from GetVersion Win32API +#endif + } + + + ks_json_add_string_to_object(json, "client_uuid", globals.adoption_token); + ks_json_add_string_to_object(json, "hostname", switch_core_get_hostname()); + ks_json_add_string_to_object(json, "ip", globals.adoption_data_local_ip); + ks_json_add_string_to_object(json, "ext_ip", globals.adoption_data_external_ip); + ks_json_add_string_to_object(json, "version", switch_version_full()); + ks_json_add_string_to_object(json, "uname", globals.adoption_data_uname); + + jsonstr = ks_json_print_unformatted(json); + ks_json_delete(&json); + + switch_snprintf(url, sizeof(url), "%s/%s", globals.adoption_service, globals.adoption_token); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Checking %s for SignalWire adoption of this FreeSWITCH\n", url); + + curl = switch_curl_easy_init(); + + headers = switch_curl_slist_append(headers, "Accept: application/json"); + headers = switch_curl_slist_append(headers, "Accept-Charset: utf-8"); + headers = switch_curl_slist_append(headers, "Content-Type: application/json"); + + switch_curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5); + switch_curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5); + + if (!strncasecmp(url, "https", 5)) { + switch_curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, globals.ssl_verify); + switch_curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, globals.ssl_verify); + } + + switch_curl_easy_setopt(curl, CURLOPT_URL, url); + switch_curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + switch_curl_easy_setopt(curl, CURLOPT_USERAGENT, "mod_signalwire/1"); + switch_curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonstr); + switch_curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + switch_curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&rd); + switch_curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, response_data_handler); + + if ((res = switch_curl_easy_perform(curl))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Curl Result %d, Error: %s\n", res, errbuf); + status = KS_STATUS_FAIL; + goto done; + } + + switch_curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rescode); + + if (rescode == 404) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, + "Go to https://signalwire.com to set up your Connector now! Enter connection token %s\n", globals.adoption_token); + status = KS_STATUS_FAIL; + goto done; + } + + if (rescode != 200) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire adoption failed with HTTP code %ld, %s\n", rescode, rd.data); + status = KS_STATUS_FAIL; + goto done; + } + + json = ks_json_parse(rd.data); + if (!json) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received bad SignalWire adoption response\n%s\n", rd.data); + status = KS_STATUS_FAIL; + goto done; + } + + if ((status = load_credentials_from_json(json)) != KS_STATUS_SUCCESS) { + goto done; + } + + ks_json_delete(&json); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire adoption of this FreeSWITCH completed\n"); + + // write out the data to save it for reloading in the future + { + char authpath[1024]; + FILE *fp = NULL; + + switch_snprintf(authpath, sizeof(authpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat"); + fp = fopen(authpath, "w"); + if (!fp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire creds\n", authpath); + status = KS_STATUS_FAIL; + goto done; + } + + fputs(rd.data, fp); + fclose(fp); + } + + globals.state = SW_STATE_OFFLINE; + swclt_sess_connect(globals.signalwire_session); + +done: + if (rd.data) ks_pool_free(&rd.data); + if (jsonstr) ks_json_free_ex((void **)&jsonstr); + if (json) ks_json_delete(&json); + if (curl) { + curl_easy_cleanup(curl); + if (headers) curl_slist_free_all(headers); + } + if (pool) switch_core_destroy_memory_pool(&pool); + return status; +} + +#define SIGNALWIRE_SYNTAX "token | adoption | adopted | reload | update | debug | kslog " +SWITCH_STANDARD_API(mod_signalwire_api_function) +{ + int argc = 0; + char *argv[2] = { 0 }; + char *buf = NULL; + + + if (!cmd || !(buf = strdup(cmd))) { + stream->write_function(stream, "-USAGE: signalwire %s\n", SIGNALWIRE_SYNTAX); + return SWITCH_STATUS_SUCCESS; + } + + if ((argc = switch_separate_string(buf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) { + if (!strcmp(argv[0], "token")) { + if (globals.adoption_token[0]) { + stream->write_function(stream, + " _____ _ ___ ___\n" + " / ___/(_)___ _____ ____ _/ / | / (_)_______\n" + " \\__ \\/ / __ `/ __ \\/ __ `/ /| | /| / / / ___/ _ \\\n" + " ___/ / / /_/ / / / / /_/ / / | |/ |/ / / / / __/\n" + " /____/_/\\__, /_/ /_/\\__,_/_/ |__/|__/_/_/ \\___/\n" + " /____/\n" + "\n /=====================================================================\\\n" + "| Connection Token: %s |\n" + " \\=====================================================================/\n" + " Go to https://signalwire.com to set up your Connector now!\n", globals.adoption_token); + } else { + stream->write_function(stream, "-ERR connection token not available\n"); + } + goto done; + } + else if (!strcmp(argv[0], "adoption")) { + if (globals.state == SW_STATE_ADOPTION) { + globals.adoption_next = ks_time_now(); + stream->write_function(stream, "+OK\n"); + } else { + stream->write_function(stream, "-ERR adoption not currently pending\n"); + } + goto done; + } + else if (!strcmp(argv[0], "adopted")) { + stream->write_function(stream, "+OK %s\n", globals.state == SW_STATE_ADOPTION ? "Not Adopted" : "Adopted"); + goto done; + } + else if (!strcmp(argv[0], "debug")) { + if (argv[1]) { + debug_level = atoi(argv[1]); + } + + stream->write_function(stream, "+OK debug %d\n", debug_level); + goto done; + } else if (!strcmp(argv[0], "kslog")) { + if (argv[1]) { + if (!strcmp(argv[1], "on")) { + ks_global_set_logger(mod_signalwire_kslogger); + } else if (!strcmp(argv[1], "off")) { + ks_global_set_logger(NULL); + } + } + + stream->write_function(stream, "+OK %s\n", argv[1]); + goto done; + } else if (!strcmp(argv[0], "reload")) { + globals.profile_reload = KS_TRUE; + stream->write_function(stream, "+OK\n"); + goto done; + } else if (!strcmp(argv[0], "update")) { + globals.profile_update = KS_TRUE; + stream->write_function(stream, "+OK\n"); + goto done; + } + } + + stream->write_function(stream, "-USAGE: signalwire %s\n", SIGNALWIRE_SYNTAX); + +done: + switch_safe_free(buf); + + return SWITCH_STATUS_SUCCESS; +} + +static void mod_signalwire_session_state_handler(swclt_sess_t sess, swclt_hstate_change_t *state_change_info, const char *cb_data) +{ + SWCLT_HSTATE new_state = state_change_info->new_state; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire Session State Change: %s\n", swclt_hstate_describe_change(state_change_info)); + + if (new_state == SWCLT_HSTATE_ONLINE) { + // Connected with NEW or RESTORED session + globals.signalwire_reconnected = KS_TRUE; + } else if (new_state == SWCLT_HSTATE_OFFLINE) { + // Disconnected + } +} + +static void __on_provisioning_events(swclt_sess_t sess, blade_broadcast_rqu_t *rqu, void *cb_data) +{ + if (!strcmp(rqu->event, "update")) { + globals.profile_update = KS_TRUE; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update requested\n"); + } +} + +static switch_xml_t xml_config_handler(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, + void *user_data) +{ + char *profileName = NULL; + char *reconfigValue = NULL; + switch_xml_t signalwire_profile_dup = NULL; + + if (!section || strcmp(section, "configuration")) return NULL; + if (!key_name || strcmp(key_name, "name")) return NULL; + if (!key_value || strcmp(key_value, "sofia.conf")) return NULL; + if (!params) return NULL; + profileName = switch_event_get_header(params, "profile"); + if (!profileName || strcmp(profileName, "signalwire")) return NULL; + reconfigValue = switch_event_get_header(params, "reconfig"); + if (!reconfigValue || strcmp(reconfigValue, "true")) return NULL; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received XML lookup for SignalWire SIP profile\n"); + + if (globals.signalwire_profile) { + signalwire_profile_dup = switch_xml_dup(globals.signalwire_profile); + } + return signalwire_profile_dup; +} + +static switch_status_t mod_signalwire_load_or_generate_token(void) +{ + switch_status_t status = SWITCH_STATUS_SUCCESS; + char tokenpath[1024]; + + switch_snprintf(tokenpath, sizeof(tokenpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-token.dat"); + if (switch_file_exists(tokenpath, NULL) != SWITCH_STATUS_SUCCESS) { + // generate first time uuid + ks_uuid_t uuid; + const char *token; + FILE *fp = fopen(tokenpath, "w"); + if (!fp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to save SignalWire connection token\n", tokenpath); + status = SWITCH_STATUS_TERM; + goto done; + } + + ks_uuid(&uuid); + token = ks_uuid_str(NULL, &uuid); + + fputs(token, fp); + fclose(fp); + + strncpy(globals.adoption_token, token, sizeof(globals.adoption_token) - 1); + + ks_pool_free(&token); + } else { + char token[64]; + FILE *fp = fopen(tokenpath, "r"); + if (!fp) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to open %s to read SignalWire connection token\n", tokenpath); + status = SWITCH_STATUS_TERM; + goto done; + } + if (!fgets(token, sizeof(token), fp)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire connection token from %s\n", tokenpath); + fclose(fp); + status = SWITCH_STATUS_TERM; + goto done; + } + fclose(fp); + + // trim newline markers in case they exist, only want the token + for (size_t len = strlen(token); len > 0 && (token[len - 1] == '\r' || token[len - 1] == '\n'); --len) { + token[len - 1] = '\0'; + } + + strncpy(globals.adoption_token, token, sizeof(globals.adoption_token) - 1); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "\n /=====================================================================\\\n" + "| Connection Token: %s |\n" + " \\=====================================================================/\n" + " Go to https://signalwire.com to set up your Connector now!\n", globals.adoption_token); + +done: + return status; +} + +static switch_status_t load_config() +{ + char *cf = "signalwire.conf"; + switch_xml_t cfg, xml; + const char *data; + + globals.ssl_verify = 1; + switch_set_string(globals.blade_bootstrap, "edge..signalwire.com/api/relay/wss"); + switch_set_string(globals.adoption_service, "https://adopt.signalwire.com/adoption"); + switch_set_string(globals.stun_server, "stun.freeswitch.org"); + + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "open of %s failed\n", cf); + // don't need the config + } else { + switch_xml_t settings, param, tmp; + if ((settings = switch_xml_child(cfg, "settings"))) { + for (param = switch_xml_child(settings, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + + if (!strcasecmp(var, "kslog") && !ks_zstr(val)) { + if (!strcmp(val, "off")) { + globals.kslog_on = KS_FALSE; + } else if (!strcmp(val, "on")) { + globals.kslog_on = KS_TRUE; + } + } else if (!strcasecmp(var, "blade-bootstrap") && !ks_zstr(val)) { + switch_set_string(globals.blade_bootstrap, val); + } else if (!strcasecmp(var, "adoption-service") && !ks_zstr(val)) { + switch_set_string(globals.adoption_service, val); + } else if (!strcasecmp(var, "stun-server") && !ks_zstr(val)) { + switch_set_string(globals.stun_server, val); + } else if (!strcasecmp(var, "ssl-verify")) { + globals.ssl_verify = switch_true(val) ? 1 : 0; + } + } + if ((tmp = switch_xml_child(settings, "authentication"))) { + const char *txt = switch_xml_txt(tmp); + if (!ks_zstr(txt)) { + swclt_config_set_authentication(globals.config, txt); + } + } + } + switch_xml_free(xml); + } + + if ((data = getenv("SW_BLADE_BOOTSTRAP"))) { + switch_set_string(globals.blade_bootstrap, data); + } + + if ((data = getenv("SW_ADOPTION_SERVICE"))) { + strncpy(globals.adoption_service, data, sizeof(globals.adoption_service)); + } + + swclt_config_load_from_env(globals.config); + + return SWITCH_STATUS_SUCCESS; +} + +static ks_status_t load_credentials(void) +{ + ks_status_t status = KS_STATUS_SUCCESS; + char authpath[1024]; + char data[2048]; + FILE *fp = NULL; + ks_json_t *json = NULL; + + switch_snprintf(authpath, sizeof(authpath), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat"); + if (!(fp = fopen(authpath, "r"))) goto done; + + if (!fgets(data, sizeof(data), fp)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to read SignalWire authentication data from %s\n", authpath); + fclose(fp); + status = KS_STATUS_FAIL; + goto done; + } + fclose(fp); + + json = ks_json_parse(data); + if (!json) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to parse SignalWire authentication data from %s\n", authpath); + status = KS_STATUS_FAIL; + goto done; + } + status = load_credentials_from_json(json); + ks_json_delete(&json); + +done: + return status; +} + +static void mod_signalwire_session_auth_failed_handler(swclt_sess_t sess) +{ + char path[1024]; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire authentication failed\n"); + + switch_snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "adoption-auth.dat"); + unlink(path); + + switch_snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.storage_dir, SWITCH_PATH_SEPARATOR, "signalwire-conf.dat"); + unlink(path); + + globals.restarting = KS_TRUE; + + globals.adoption_backoff = 0; + globals.adoption_next = 0; + + globals.state = SW_STATE_ADOPTION; +} + +/* Dialplan INTERFACE */ +SWITCH_STANDARD_DIALPLAN(dialplan_hunt) +{ + switch_caller_extension_t *extension = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + const char *network_ip = switch_channel_get_variable(channel, "sip_network_ip"); + const char *network_port = switch_channel_get_variable(channel, "sip_network_port"); + + if (!caller_profile) { + if (!(caller_profile = switch_channel_get_caller_profile(channel))) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error obtaining caller profile!\n"); + goto done; + } + } + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Processing %s <%s>->%s in context %s\n", + caller_profile->caller_id_name, caller_profile->caller_id_number, caller_profile->destination_number, caller_profile->context); + + if ((extension = switch_caller_extension_new(session, "signalwire", caller_profile->destination_number)) == NULL) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n"); + goto done; + } + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "call from %s:%s\n", network_ip, network_port); + + switch_mutex_lock(globals.mutex); + + if (network_ip && + !zstr_buf(globals.gateway_ip) && !strcmp(globals.gateway_ip, network_ip)) { + // good to go + char transfer_to[1024]; + + switch_snprintf(transfer_to, sizeof(transfer_to), "%s %s %s", caller_profile->destination_number, "XML", caller_profile->context); + switch_caller_extension_add_application(session, extension, "transfer", transfer_to); + } else { + switch_caller_extension_add_application(session, extension, "respond", "500"); + } + + switch_mutex_unlock(globals.mutex); + +done: + return extension; +} + +/** + * Module load or unload callback from core + * @param event the event + */ +static void on_module_load_unload(switch_event_t *event) +{ + const char *type = switch_event_get_header(event, "type"); + const char *name = switch_event_get_header(event, "name"); + if (!zstr(type) && !zstr(name) && !strcmp(type, "endpoint") && !strcmp(name, "sofia")) { + globals.profile_reload = KS_TRUE; + } +} + +/** + * Sofia sofia::gateway_state change callback + * @param event the event + */ +static void on_sofia_gateway_state(switch_event_t *event) +{ + const char *ip = switch_event_get_header(event, "Register-Network-IP"); + const char *port = switch_event_get_header(event, "Register-Network-Port"); + const char *state = switch_event_get_header(event, "State"); + const char *gateway = switch_event_get_header(event, "Gateway"); + + if (!ip || !port || !state || !gateway) { + return; + } + + if (!strcmp(gateway, "signalwire")) { + switch_mutex_lock(globals.mutex); + + if (!strcmp(state, "REGED")) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP Gateway registered to %s:%s\n", ip, port); + switch_set_string(globals.gateway_ip, ip); + switch_set_string(globals.gateway_port, port); + } else if (!strcmp(state, "NOREG")) { + globals.gateway_ip[0] = '\0'; + globals.gateway_port[0] = '\0'; + } + + switch_mutex_unlock(globals.mutex); + } +} + +/* Macro expands to: switch_status_t mod_signalwire_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */ +SWITCH_MODULE_LOAD_FUNCTION(mod_signalwire_load) +{ + switch_api_interface_t *api_interface = NULL; + switch_dialplan_interface_t *dialplan_interface; + const char *kslog_env = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + + memset(&globals, 0, sizeof(globals)); + + kslog_env = getenv("KSLOG"); + if (kslog_env && kslog_env[0] && kslog_env[0] != '0') globals.kslog_on = KS_TRUE; + + /* connect my internal structure to the blank pointer passed to me */ + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + ks_global_set_logger(mod_signalwire_kslogger); + + SWITCH_ADD_API(api_interface, "signalwire", "SignalWire API", mod_signalwire_api_function, SIGNALWIRE_SYNTAX); + switch_console_set_complete("add signalwire debug"); + switch_console_set_complete("add signalwire debug 1"); + switch_console_set_complete("add signalwire debug 2"); + switch_console_set_complete("add signalwire debug 3"); + switch_console_set_complete("add signalwire debug 4"); + switch_console_set_complete("add signalwire debug 5"); + switch_console_set_complete("add signalwire debug 6"); + switch_console_set_complete("add signalwire debug 7"); + switch_console_set_complete("add signalwire kslog"); + switch_console_set_complete("add signalwire kslog on"); + switch_console_set_complete("add signalwire kslog off"); + switch_console_set_complete("add signalwire token"); + switch_console_set_complete("add signalwire adoption"); + switch_console_set_complete("add signalwire adopted"); + switch_console_set_complete("add signalwire update"); + switch_console_set_complete("add signalwire reload"); + + switch_xml_bind_search_function(xml_config_handler, SWITCH_XML_SECTION_CONFIG, NULL); + + ks_ssl_init_skip(KS_TRUE); + + swclt_init(KS_LOG_LEVEL_DEBUG); + + if (globals.kslog_on == KS_FALSE) { + ks_global_set_logger(NULL); + } else { + ks_global_set_logger(mod_signalwire_kslogger); + } + + // Configuration + swclt_config_create(&globals.config); + load_config(); + + switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, pool); + + switch_event_bind("mod_signalwire", SWITCH_EVENT_MODULE_LOAD, NULL, on_module_load_unload, NULL); + switch_event_bind("mod_signalwire", SWITCH_EVENT_MODULE_UNLOAD, NULL, on_module_load_unload, NULL); + switch_event_bind("mod_signalwire", SWITCH_EVENT_CUSTOM, "sofia::gateway_state", on_sofia_gateway_state, NULL); + + SWITCH_ADD_DIALPLAN(dialplan_interface, "signalwire", dialplan_hunt); + + // Load credentials if they exist from a prior adoption + load_credentials(); + + // SignalWire + swclt_sess_create(&globals.signalwire_session, + globals.blade_bootstrap, + globals.config); + swclt_sess_set_auth_failed_cb(globals.signalwire_session, mod_signalwire_session_auth_failed_handler); + + if (!globals.signalwire_session) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "signalwire_session create error\n"); + switch_goto_status(SWITCH_STATUS_TERM, err); + } + + swclt_hmon_register(&globals.signalwire_session_monitor, globals.signalwire_session, mod_signalwire_session_state_handler, NULL); + + // @todo register nodestore callbacks here if needed + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Welcome to\n" + " _____ _ ___ ___\n" + " / ___/(_)___ _____ ____ _/ / | / (_)_______\n" + " \\__ \\/ / __ `/ __ \\/ __ `/ /| | /| / / / ___/ _ \\\n" + " ___/ / / /_/ / / / / /_/ / / | |/ |/ / / / / __/\n" + " /____/_/\\__, /_/ /_/\\__,_/_/ |__/|__/_/_/ \\___/\n" + " /____/\n"); + + // storage_dir was missing in clean install + switch_dir_make_recursive(SWITCH_GLOBAL_dirs.storage_dir, SWITCH_DEFAULT_DIR_PERMS, pool); + + if ((status = mod_signalwire_load_or_generate_token()) != SWITCH_STATUS_SUCCESS) { + goto err; + } + + if (swclt_sess_has_authentication(globals.signalwire_session)) { + // Load cached profile if we already have one. We'll still connect to SignalWire and + // fetch a new profile in the background. + load_sip_config(); + if (globals.signalwire_profile) { + globals.state = SW_STATE_START_PROFILE; + } else { + globals.state = SW_STATE_OFFLINE; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Connecting to SignalWire\n"); + swclt_sess_connect(globals.signalwire_session); + } else { + globals.state = SW_STATE_ADOPTION; + } + + goto done; + +err: + if (globals.signalwire_session) ks_handle_destroy(&globals.signalwire_session); + swclt_config_destroy(&globals.config); + ks_global_set_logger(NULL); + +done: + + return status; +} + +/* + Called when the system shuts down + Macro expands to: switch_status_t mod_signalwire_shutdown() */ +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_signalwire_shutdown) +{ + /* Cleanup dynamically allocated config settings */ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Disconnecting from SignalWire\n"); + + switch_event_unbind_callback(on_module_load_unload); + switch_event_unbind_callback(on_sofia_gateway_state); + + // stop things that might try to use blade or kafka while they are shutting down + globals.shutdown = KS_TRUE; + + swclt_sess_disconnect(globals.signalwire_session); + while (swclt_hstate_current_get(globals.signalwire_session) == SWCLT_HSTATE_ONLINE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sleeping for pending disconnect\n"); + ks_sleep_ms(1000); + } + + //signalwire_dialplan_shutdown(); + // @todo signalwire profile unbinding and unloading + switch_xml_unbind_search_function_ptr(xml_config_handler); + + // kill signalwire, so nothing more can come into the system + ks_handle_destroy(&globals.signalwire_session); + + // cleanup config + swclt_config_destroy(&globals.config); + + // shutdown libblade (but not libks?) + swclt_shutdown(); + + return SWITCH_STATUS_SUCCESS; +} + +static void mod_signalwire_state_adoption(void) +{ + // keep trying to check adoption token for authentication + if (ks_time_now() >= globals.adoption_next) { + // Use a very very simple backoff algorithm, every time we try, backoff another minute + // so that after first try we wait 1 minute, after next try we wait 2 minutes, at third + // try we are waiting 3 minutes, upto a max backoff of 15 minutes between adoption checks + if (globals.adoption_backoff < 15) globals.adoption_backoff++; + globals.adoption_next = ks_time_now() + (globals.adoption_backoff * 60 * KS_USEC_PER_SEC); + if (mod_signalwire_adoption_post() != KS_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Next SignalWire adoption check in %"SWITCH_SIZE_T_FMT" minutes\n", globals.adoption_backoff); + } + } + if (globals.signalwire_reconnected) { + // OK to continue as is + globals.signalwire_reconnected = KS_FALSE; + } +} + +static void mod_signalwire_state_offline(void) +{ + if (globals.signalwire_reconnected) { + globals.signalwire_reconnected = KS_FALSE; + globals.state = SW_STATE_ONLINE; + } +} + +static void mod_signalwire_state_online(void) +{ + globals.signalwire_reconnected = KS_FALSE; + if (!swclt_sess_provisioning_setup(globals.signalwire_session, __on_provisioning_events, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected to SignalWire\n"); + globals.state = SW_STATE_CONFIGURE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Failed to connect to SignalWire\n"); + ks_sleep_ms(4000); + globals.state = SW_STATE_OFFLINE; + globals.restarting = KS_TRUE; + } +} + +static void mod_signalwire_state_configure(void) +{ + switch_memory_pool_t *pool = NULL; + char local_ip[256]; + switch_port_t local_port = 6050; + char local_endpoint[256]; + char *external_ip; + switch_port_t external_port; + char external_endpoint[256]; + char *error = NULL; + swclt_cmd_t cmd; + + if (globals.signalwire_reconnected) { + globals.signalwire_reconnected = KS_FALSE; + globals.state = SW_STATE_ONLINE; + } + + // already restarting/updating... + globals.profile_reload = KS_FALSE; + globals.profile_update = KS_FALSE; + + if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SignalWire configure failed: could not allocate memory pool\n"); + goto done; + } + + switch_find_local_ip(local_ip, sizeof(local_ip), NULL, AF_INET); + + if (switch_find_available_port(&local_port, local_ip, SOCK_STREAM) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire configure failed: could not get available local port\n"); + ks_sleep_ms(4000); + goto done; + } + + snprintf(local_endpoint, sizeof(local_endpoint), "%s:%u", local_ip, local_port); + + external_ip = local_ip; + external_port = local_port; + + if (switch_stun_lookup(&external_ip, &external_port, globals.stun_server, SWITCH_STUN_DEFAULT_PORT, &error, pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SignalWire configure failed: stun [%s] lookup error: %s\n", globals.stun_server, error); + ks_sleep_ms(4000); + goto done; + } + + snprintf(external_endpoint, sizeof(external_endpoint), "%s:%u", external_ip, external_port); + + if (!swclt_sess_provisioning_configure(globals.signalwire_session, "freeswitch", local_endpoint, external_endpoint, globals.relay_connector_id, &cmd)) { + SWCLT_CMD_TYPE cmd_type; + swclt_cmd_type(cmd, &cmd_type); + if (cmd_type == SWCLT_CMD_TYPE_RESULT) { + const ks_json_t *result; + signalwire_provisioning_configure_response_t *configure_res; + + swclt_cmd_result(cmd, &result); + result = ks_json_get_object_item(result, "result"); + if (!SIGNALWIRE_PROVISIONING_CONFIGURE_RESPONSE_PARSE(ks_handle_pool(cmd), result, &configure_res)) { + const ks_json_t *configuration = configure_res->configuration; + const char *configuration_profile = ks_json_get_object_cstr(configuration, "profile"); + if (globals.signalwire_profile) { + switch_xml_free(globals.signalwire_profile); + globals.signalwire_profile = NULL; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\"%s\"\n", configuration_profile); + globals.signalwire_profile = switch_xml_parse_str_dynamic((char *)configuration_profile, SWITCH_TRUE); + if (!globals.signalwire_profile) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to parse configuration profile\n"); + } else { + char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 }; + switch_md5_string(digest, (void *) configuration_profile, strlen(configuration_profile)); + save_sip_config(configuration_profile); + if (!signalwire_gateway_exists() || zstr_buf(globals.signalwire_profile_md5) || strcmp(globals.signalwire_profile_md5, digest)) { + // not registered or new profile - update md5 and load it + strcpy(globals.signalwire_profile_md5, digest); + globals.state = SW_STATE_START_PROFILE; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "profile MD5 = \"%s\"\n", globals.signalwire_profile_md5); + } else { + // already registered + globals.state = SW_STATE_READY; + } + } + } + } + } + ks_handle_destroy(&cmd); + if (globals.state == SW_STATE_CONFIGURE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Failed to receive valid configuration from SignalWire\n"); + ks_sleep_ms(4000); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Received configuration from SignalWire\n"); + } + +done: + if (pool) switch_core_destroy_memory_pool(&pool); +} + +static int signalwire_gateway_exists(void) +{ + int exists = 0; + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + if (switch_api_execute("sofia", "profile signalwire gwlist", NULL, &stream) == SWITCH_STATUS_SUCCESS && stream.data) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "gwlist = \"%s\"\n", (char *)stream.data); + exists = (strstr((char *)stream.data, "Invalid Profile") == NULL) && + (strstr((char*)stream.data, "signalwire") != NULL); + } + switch_safe_free(stream.data); + return exists; +} + +static int signalwire_profile_is_started(void) +{ + int started = 0; + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + if (switch_api_execute("sofia", "status profile signalwire", NULL, &stream) == SWITCH_STATUS_SUCCESS && stream.data) { + started = (strstr((char *)stream.data, "Invalid Profile") == NULL) && + (strstr((char *)stream.data, "signalwire") != NULL); + } + switch_safe_free(stream.data); + return started; +} + +static int signalwire_profile_rescan(void) +{ + int success = 0; + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + if (switch_api_execute("sofia", "profile signalwire rescan", NULL, &stream) == SWITCH_STATUS_SUCCESS) { + success = signalwire_profile_is_started(); + } + switch_safe_free(stream.data); + return success; +} + +static int signalwire_profile_start(void) +{ + int success = 0; + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + if (switch_api_execute("sofia", "profile signalwire start", NULL, &stream) == SWITCH_STATUS_SUCCESS) { + success = signalwire_profile_is_started(); + } + switch_safe_free(stream.data); + return success; +} + +static void signalwire_profile_killgw(void) +{ + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + switch_api_execute("sofia", "profile signalwire killgw signalwire", NULL, &stream); + switch_safe_free(stream.data); +} + +static void mod_signalwire_state_start_profile(void) +{ + if (globals.profile_update) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update initiated\n"); + globals.state = SW_STATE_CONFIGURE; + globals.profile_update = KS_FALSE; + return; + } + globals.profile_reload = KS_FALSE; // already here + + // ignore SignalWire reconnections until register is attempted + + if (switch_loadable_module_exists("mod_sofia") != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for mod_sofia to load\n"); + } else if (signalwire_profile_is_started()) { + // kill gateway if already up and rescan the profile + if (signalwire_gateway_exists()) { + signalwire_profile_killgw(); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP gateway killed\n"); + } + if (signalwire_profile_rescan()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP profile rescanned\n"); + globals.state = SW_STATE_REGISTER; + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Starting SignalWire SIP profile\n"); + signalwire_profile_start(); // assume success - it gets checked in next state + globals.state = SW_STATE_REGISTER; + } +} + +static void mod_signalwire_state_register(void) +{ + if (globals.profile_update) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile update initiated\n"); + globals.state = SW_STATE_CONFIGURE; + globals.profile_update = KS_FALSE; + return; + } else if (globals.profile_reload) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile reload initiated\n"); + globals.state = SW_STATE_START_PROFILE; + globals.profile_reload = KS_FALSE; + return; + } + // ignore SignalWire reconnections until register is attempted + + if (switch_loadable_module_exists("mod_sofia") != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for mod_sofia to load\n"); + globals.state = SW_STATE_START_PROFILE; + } else if (signalwire_gateway_exists() || signalwire_profile_rescan()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SignalWire SIP gateway started\n"); + globals.state = SW_STATE_READY; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to start SignalWire SIP gateway\n"); + globals.state = SW_STATE_CONFIGURE; + ks_sleep_ms(5000); + } +} + +static void mod_signalwire_state_ready() +{ + if (globals.profile_update) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Signalwire SIP profile update initiated\n"); + globals.state = SW_STATE_CONFIGURE; + globals.profile_update = KS_FALSE; + } else if (globals.profile_reload) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SignalWire SIP profile reload initiated\n"); + globals.state = SW_STATE_START_PROFILE; + globals.profile_reload = KS_FALSE; + } else if (globals.signalwire_reconnected) { + globals.signalwire_reconnected = KS_FALSE; + globals.state = SW_STATE_ONLINE; + } +} + +SWITCH_MODULE_RUNTIME_FUNCTION(mod_signalwire_runtime) +{ + while (!globals.shutdown) { + if (globals.restarting) { + swclt_sess_disconnect(globals.signalwire_session); + while (swclt_hstate_current_get(globals.signalwire_session) == SWCLT_HSTATE_ONLINE) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sleeping for pending disconnect\n"); + ks_sleep_ms(1000); + } + + // kill signalwire, so nothing more can come into the system + ks_handle_destroy(&globals.signalwire_session); + + // Create a new session and start over + swclt_sess_create(&globals.signalwire_session, + globals.blade_bootstrap, + globals.config); + swclt_sess_set_auth_failed_cb(globals.signalwire_session, mod_signalwire_session_auth_failed_handler); + + swclt_hmon_register(&globals.signalwire_session_monitor, globals.signalwire_session, mod_signalwire_session_state_handler, NULL); + + globals.restarting = KS_FALSE; + continue; + } + + switch(globals.state) { + case SW_STATE_ADOPTION: // waiting for adoption to occur + mod_signalwire_state_adoption(); + break; + case SW_STATE_OFFLINE: // waiting for session to go online + mod_signalwire_state_offline(); + break; + case SW_STATE_ONLINE: // provisioning service setup + mod_signalwire_state_online(); + break; + case SW_STATE_CONFIGURE: // provisioning configuration + mod_signalwire_state_configure(); + break; + case SW_STATE_START_PROFILE: + mod_signalwire_state_start_profile(); + break; + case SW_STATE_REGISTER: + mod_signalwire_state_register(); + break; + case SW_STATE_READY: // ready for runtime + mod_signalwire_state_ready(); + break; + default: break; + } + ks_sleep_ms(1000); + } + + return SWITCH_STATUS_TERM; +} + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet + */ diff --git a/w32/Setup/Setup.2017.wixproj b/w32/Setup/Setup.2017.wixproj index 0017c5acef..cb65aa947c 100644 --- a/w32/Setup/Setup.2017.wixproj +++ b/w32/Setup/Setup.2017.wixproj @@ -293,6 +293,14 @@ Binaries;Content;Satellites INSTALLFOLDER + + mod_signalwire + {b19ae6fc-bfff-428d-b483-3bbeaeccc618} + True + True + Binaries;Content;Satellites + INSTALLFOLDER + mod_sms {2469b306-b027-4ff2-8815-c9c1ea2cae79} diff --git a/w32/libks-version.props b/w32/libks-version.props new file mode 100644 index 0000000000..3b9fe4b776 --- /dev/null +++ b/w32/libks-version.props @@ -0,0 +1,19 @@ + + + + + + + 0.1.1 + + + true + + + + + + $(libksVersion) + + + diff --git a/w32/libks.props b/w32/libks.props new file mode 100644 index 0000000000..c2e2565172 --- /dev/null +++ b/w32/libks.props @@ -0,0 +1,78 @@ + + + + + + + + + true + + + + $(BaseDir)libs\libks-$(libksVersion) + + + + + + + + + + + + + + + + + + + + + + + + $(libksDir)\src\include;%(AdditionalIncludeDirectories) + __PRETTY_FUNCTION__=__FUNCSIG__;WIN32;_WINDOWS;SWCLT_VERSION_MAJOR=1;SWCLT_VERSION_MINOR=0;SWCLT_VERSION_REVISION=0;_WIN32_WINNT=0x0600;_WINSOCK_DEPRECATED_NO_WARNINGS=1;WIN32_LEAN_AND_MEAN=1;KS_PLAT_WIN=1;NOMAXMIN=1;_CRT_SECURE_NO_WARNINGS=1;SWCLT_EXPORTS;%(PreprocessorDefinitions) + + + $(libksDir)\binaries\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories) + ks.lib;%(AdditionalDependencies) + + + diff --git a/w32/signalwire-client-c-version.props b/w32/signalwire-client-c-version.props new file mode 100644 index 0000000000..0b0de97606 --- /dev/null +++ b/w32/signalwire-client-c-version.props @@ -0,0 +1,19 @@ + + + + + + + 1.0.0 + + + true + + + + + + $(signalwire-client-cVersion) + + + diff --git a/w32/signalwire-client-c.props b/w32/signalwire-client-c.props new file mode 100644 index 0000000000..e7e40e2c4a --- /dev/null +++ b/w32/signalwire-client-c.props @@ -0,0 +1,76 @@ + + + + + + + + true + + + + $(BaseDir)libs\signalwire-client-c-$(signalwire-client-cVersion) + + + + + + + + + + + + + + + + + + + + + + + $(signalwire-client-cDir)\include;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + $(signalwire-client-cDir)\binaries\$(Platform)\$(Configuration)\;%(AdditionalLibraryDirectories) + signalwire_client.lib;%(AdditionalDependencies) + + +

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 Pa#J+E_74TIe?R;Iao*YK literal 0 HcmV?d00001 diff --git a/src/mod/applications/mod_test/test/sounds/test_agent.wav b/src/mod/applications/mod_test/test/sounds/test_agent.wav new file mode 100644 index 0000000000000000000000000000000000000000..7202f6774a4b109721a7dc2ec140251faff008c3 GIT binary patch literal 105644 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 ?|!#LZ&`K=HMSDF_!O)`$F8uQ`&?IW%EmR3|8 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 E3D~fFF8}}l literal 0 HcmV?d00001 diff --git a/src/mod/applications/mod_test/test/test_asr.c b/src/mod/applications/mod_test/test/test_asr.c new file mode 100644 index 0000000000..3ab3452d27 --- /dev/null +++ b/src/mod/applications/mod_test/test/test_asr.c @@ -0,0 +1,292 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Rienzo + * + * + * test_asr.c -- tests for mock test asr interface + * + */ +#include +#include +#include + + +static const char *get_query_result_text(switch_memory_pool_t *pool, const char *result) +{ + const char *result_text = NULL; + cJSON *result_json = cJSON_Parse(result); + if (result_json) { + const char *text = cJSON_GetObjectCstr(result_json, "text"); + if (!zstr(text)) { + result_text = switch_core_strdup(pool, text); + } else { + text = cJSON_GetObjectCstr(result_json, "error"); + if (!zstr(text)) { + result_text = switch_core_strdup(pool, text); + } + } + cJSON_Delete(result_json); + } + return result_text; +} + + +FST_CORE_BEGIN(".") + +FST_MODULE_BEGIN(mod_test, test_asr) + +FST_SETUP_BEGIN() +{ + fst_requires_module("mod_tone_stream"); + fst_requires_module("mod_sndfile"); + fst_requires_module("mod_dptools"); +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + + +FST_TEST_BEGIN(core_asr) +{ + const char* session_id = "123435"; + char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id); + fst_test_core_asr_open("test"); + fst_test_core_asr( + grammar, + "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "silence_stream://30000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "silence_stream://30000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_pause(); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_close(); + + fst_test_core_asr_open("test"); + fst_test_core_asr( + grammar, + "file_string://silence_stream://1000,0!sounds/ivr-please_state_your_name_and_reason_for_calling.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_close(); +} +FST_TEST_END() + +FST_TEST_BEGIN(core_asr_auto_resume) +{ + const char* session_id = "123435"; + char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id); + fst_test_core_asr_open("test"); + switch_set_flag(&ah, SWITCH_ASR_FLAG_AUTO_RESUME); + fst_test_core_asr( + grammar, + "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr( + grammar, + "silence_stream://30000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input"); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr( + grammar, + "silence_stream://30000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "no_input"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://silence_stream://1000,0!sounds/ivr-please_state_your_name_and_reason_for_calling.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_close(); +} +FST_TEST_END() + +FST_TEST_BEGIN(core_asr_abuse) +{ + const char* session_id = "5351514"; + char *grammar = switch_core_sprintf(fst_pool, "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", session_id); + fst_test_core_asr_open("test"); + fst_test_core_asr( + grammar, + "file_string://silence_stream://3000,0!sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_resume(); + fst_test_core_asr_resume(); + fst_test_core_asr_resume(); + fst_test_core_asr_pause(); + fst_test_core_asr_resume(); + fst_test_core_asr( + grammar, + "file_string://sounds/agent.wav!silence_stream://3000,0"); + fst_check_string_equals(get_query_result_text(fst_pool, fst_asr_result), "agent"); + fst_test_core_asr_resume(); + + // Tested double-close, but FS core will crash... + fst_test_core_asr_close(); +} +FST_TEST_END() + + +FST_SESSION_BEGIN(play_and_detect_1) +{ + const char *result_text = NULL; + char *grammar = switch_core_session_sprintf(fst_session, "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", switch_core_session_get_uuid(fst_session)); + fst_play_and_detect_speech_test_begin(); + + /* initial welcome and request */ + fst_play_and_detect_speech_app_test("test", + grammar, + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "sounds/agent.wav"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "agent"); + + /* follow up request */ + fst_play_and_detect_speech_app_test("test", + grammar, + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "file_string://1000,0!sounds/agent.wav"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "agent"); + + fst_play_and_detect_speech_test_end(); +} +FST_SESSION_END() + +FST_SESSION_BEGIN(play_and_detect_no_input_follow_up) +{ + const char *result_text = NULL; + char *grammar = switch_core_session_sprintf(fst_session, "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}", switch_core_session_get_uuid(fst_session)); + + switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE); + fst_play_and_detect_speech_test_begin(); + fst_play_and_detect_speech_app_test("test", + grammar, + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "file_string://silence_stream://4000,0!sounds/agent.wav"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "agent"); + + /* follow up request - no input */ + fst_play_and_detect_speech_app_test("test", + grammar, + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "silence_stream://10000,0"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "no_input"); + + fst_play_and_detect_speech_test_end(); +} +FST_SESSION_END() + +FST_SESSION_BEGIN(play_and_detect_no_input) +{ + const char *result_text = NULL; + + switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE); + fst_play_and_detect_speech_test_begin(); + fst_play_and_detect_speech_app_test("test", + switch_core_session_sprintf(fst_session, + "{start-input-timers=false,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", + switch_core_session_get_uuid(fst_session)), + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "silence_stream://10000,0"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "no_input"); + + fst_play_and_detect_speech_test_end(); +} +FST_SESSION_END() + +FST_SESSION_BEGIN(play_and_detect_start_input_timers) +{ + const char *result_text = NULL; + + switch_ivr_schedule_hangup(switch_epoch_time_now(NULL) + 60, switch_core_session_get_uuid(fst_session), SWITCH_CAUSE_NORMAL_CLEARING, SWITCH_FALSE); + fst_play_and_detect_speech_test_begin(); + + fst_play_and_detect_speech_app_test("test", + switch_core_session_sprintf(fst_session, + "{start-input-timers=true,no-input-timeout=5000,speech-timeout=10000,channel-uuid=%s}default", + switch_core_session_get_uuid(fst_session)), + "sounds/ivr-please_state_your_name_and_reason_for_calling.wav", + "silence_stream://10000,0"); + result_text = get_query_result_text(fst_pool, fst_asr_result); + fst_requires(result_text != NULL); + fst_check_string_equals(result_text, "no_input"); + + fst_play_and_detect_speech_test_end(); + + fst_check_duration(5000, 500); +} +FST_SESSION_END() + +FST_TEST_BEGIN(unload_test) +{ + const char *err = NULL; + switch_sleep(1000000); + fst_check(switch_loadable_module_unload_module((char *)"../.libs", (char *)"mod_test", SWITCH_FALSE, &err) == SWITCH_STATUS_SUCCESS); +} +FST_TEST_END() + + +FST_MODULE_END() + +FST_CORE_END() From 6eb2276cd642c474d56cd2a2d668c212bc6bbcaa Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Thu, 11 Oct 2018 18:45:11 +0000 Subject: [PATCH 51/69] FS-11453 [mod_rayo] add support for FS JSON ASR result. --- src/mod/event_handlers/mod_rayo/nlsml.c | 83 +++++++++++-------- src/mod/event_handlers/mod_rayo/nlsml.h | 1 + .../mod_rayo/rayo_input_component.c | 69 ++++++++++++++- .../mod_rayo/test_nlsml/Makefile | 6 +- 4 files changed, 120 insertions(+), 39 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/nlsml.c b/src/mod/event_handlers/mod_rayo/nlsml.c index 79f8157e9f..752ddc3efa 100644 --- a/src/mod/event_handlers/mod_rayo/nlsml.c +++ b/src/mod/event_handlers/mod_rayo/nlsml.c @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2014, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -30,6 +30,7 @@ #include #include "nlsml.h" +#include "iks_helpers.h" struct nlsml_parser; @@ -417,48 +418,60 @@ static int isdtmf(const char digit) } /** - * Construct an NLSML result for digit match - * @param digits the matching digits + * Construct an NLSML result for match + * @param match the matching digits or text + * @param interpretation the optional digit interpretation + * @param mode dtmf or speech + * @param confidence 0-100 + * @return the NLSML + */ +iks *nlsml_create_match(const char *match, const char *interpretation, const char *mode, int confidence) +{ + iks *result = iks_new("result"); + iks_insert_attrib(result, "xmlns", NLSML_NS); + iks_insert_attrib(result, "xmlns:xf", "http://www.w3.org/2000/xforms"); + if (!zstr(match)) { + iks *interpretation_node = iks_insert(result, "interpretation"); + iks *input_node = iks_insert(interpretation_node, "input"); + iks *instance_node = iks_insert(interpretation_node, "instance"); + iks_insert_attrib(input_node, "mode", mode); + iks_insert_attrib_printf(input_node, "confidence", "%d", confidence); + iks_insert_cdata(input_node, match, strlen(match)); + if (zstr(interpretation)) { + iks_insert_cdata(instance_node, match, strlen(match)); + } else { + iks_insert_cdata(instance_node, interpretation, strlen(interpretation)); + } + } + return result; +} + +/** + * Construct an NLSML result for match + * @param match the matching digits or text * @param interpretation the optional digit interpretation * @return the NLSML */ iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation) { - iks *result = iks_new("result"); - iks_insert_attrib(result, "xmlns", NLSML_NS); - iks_insert_attrib(result, "xmlns:xf", "http://www.w3.org/2000/xforms"); - if (!zstr(digits)) { - int first = 1; - int i; - int num_digits = strlen(digits); - switch_stream_handle_t stream = { 0 }; - - iks *interpretation_node = iks_insert(result, "interpretation"); - iks *input_node = iks_insert(interpretation_node, "input"); - iks *instance_node = iks_insert(interpretation_node, "instance"); - iks_insert_attrib(input_node, "mode", "dtmf"); - iks_insert_attrib(input_node, "confidence", "100"); - - SWITCH_STANDARD_STREAM(stream); - for (i = 0; i < num_digits; i++) { - if (isdtmf(digits[i])) { - if (first) { - stream.write_function(&stream, "%c", digits[i]); - first = 0; - } else { - stream.write_function(&stream, " %c", digits[i]); - } + iks *result = NULL; + int first = 1; + int i; + int num_digits = strlen(digits); + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + for (i = 0; i < num_digits; i++) { + if (isdtmf(digits[i])) { + if (first) { + stream.write_function(&stream, "%c", digits[i]); + first = 0; + } else { + stream.write_function(&stream, " %c", digits[i]); } } - iks_insert_cdata(input_node, stream.data, strlen(stream.data)); - - if (zstr(interpretation)) { - iks_insert_cdata(instance_node, stream.data, strlen(stream.data)); - } else { - iks_insert_cdata(instance_node, interpretation, strlen(interpretation)); - } - switch_safe_free(stream.data); } + result = nlsml_create_match((const char *)stream.data, interpretation, "dtmf", 100); + switch_safe_free(stream.data); return result; } diff --git a/src/mod/event_handlers/mod_rayo/nlsml.h b/src/mod/event_handlers/mod_rayo/nlsml.h index f5be079ba5..475abd091e 100644 --- a/src/mod/event_handlers/mod_rayo/nlsml.h +++ b/src/mod/event_handlers/mod_rayo/nlsml.h @@ -44,6 +44,7 @@ extern void nlsml_destroy(void); enum nlsml_match_type nlsml_parse(const char *result, const char *uuid); iks *nlsml_normalize(const char *result); extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation); +extern iks *nlsml_create_match(const char *digits, const char *interpretation, const char *mode, int confidence); #endif diff --git a/src/mod/event_handlers/mod_rayo/rayo_input_component.c b/src/mod/event_handlers/mod_rayo/rayo_input_component.c index dc7a71c9d9..13311d5444 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_input_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_input_component.c @@ -876,6 +876,30 @@ static iks *start_timers_call_input_component(struct rayo_actor *component, stru return iks_new_iq_result(iq); } +/** + * Get text / error from result + */ +static const char *get_detected_speech_result_text(cJSON *result_json, double *confidence, const char **error_text) +{ + const char *result_text = NULL; + const char *text = cJSON_GetObjectCstr(result_json, "text"); + if (confidence) { + *confidence = 0.0; + } + if (!zstr(text)) { + cJSON *json_confidence = cJSON_GetObjectItem(result_json, "confidence"); + if (json_confidence && json_confidence->valuedouble > 0.0) { + *confidence = json_confidence->valuedouble; + } else { + *confidence = 100.0; + } + result_text = text; + } else if (error_text) { + *error_text = cJSON_GetObjectCstr(result_json, "error"); + } + return result_text; +} + /** * Handle speech detection event */ @@ -905,7 +929,50 @@ static void on_detected_speech_event(switch_event_t *event) if (zstr(result)) { rayo_component_send_complete(component, INPUT_NOMATCH); } else { - if (strchr(result, '<')) { + if (result[0] == '{') { + // internal FS JSON format + cJSON *json_result = cJSON_Parse(result); + if (json_result) { + // examine result to determine what happened + double confidence = 0.0; + const char *error_text = NULL; + const char *result_text = NULL; + result_text = get_detected_speech_result_text(json_result, &confidence, &error_text); + if (!zstr(result_text)) { + // got result... send as NLSML + iks *result = nlsml_create_match(result_text, NULL, "speech", (int)confidence); + /* notify of match */ + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "MATCH = %s\n", result_text); + send_match_event(RAYO_COMPONENT(component), result); + iks_delete(result); + } else if (zstr(error_text)) { + // unknown error + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_WARNING, "No matching text nor error in result: %s!\n", result); + rayo_component_send_complete(component, INPUT_NOMATCH); + } else if (!strcmp(error_text, "no_input")) { + // no input error + rayo_component_send_complete(component, INPUT_NOINPUT); + } else if (!strcmp(error_text, "no_match")) { + // no match error + rayo_component_send_complete(component, INPUT_NOMATCH); + } else { + // generic error + iks *response = rayo_component_create_complete_event(component, COMPONENT_COMPLETE_ERROR); + iks *error = NULL; + if ((error = iks_find(response, "complete"))) { + if ((error = iks_find(error, "error"))) { + iks_insert_cdata(error, error_text, strlen(error_text)); + } + } + rayo_component_send_complete_event(component, response); + } + cJSON_Delete(json_result); + } else { + // failed to parse JSON result + switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_WARNING, "Failed to parse JSON result: %s!\n", result); + rayo_component_send_complete(component, INPUT_NOMATCH); + } + } else if (strchr(result, '<')) { /* got an XML result */ enum nlsml_match_type match_type = nlsml_parse(result, uuid); switch (match_type) { diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile b/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile index f363f55590..8104690733 100644 --- a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile +++ b/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile @@ -3,7 +3,7 @@ BASE=../../../../.. IKS_DIR=$(BASE)/libs/iksemel IKS_LA=$(IKS_DIR)/src/libiksemel.la LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include -LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../nlsml.o +LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../nlsml.o ../iks_helpers.o LOCAL_SOURCES= main.c include $(BASE)/build/modmake.rules @@ -12,7 +12,7 @@ $(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update @$(TOUCH_TARGET) local_all: - libtool --mode=link gcc main.o ../nlsml.o -o test test_nlsml.la - + libtool --mode=link gcc main.o ../nlsml.o ../iks_helpers.o test_nlsml.la ../../../../../.libs/libfreeswitch.la ../../../../../libs/iksemel/src/.libs/libiksemel.a -lpcre -lssl -lcrypto -g -ggdb -O2 -pthread -o test + local_clean: -rm test From e0b5df10d6b4fbd36446901b7fd9ce9b37da0115 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 12 Oct 2018 00:45:03 +0000 Subject: [PATCH 52/69] FS-11453 [mod_rayo] allow text/plain grammar for non-mrcp speech recognizers. Added direction to output component to assist with testing. Fix confidence conversion to NLSML. --- src/mod/event_handlers/mod_rayo/rayo_elements.c | 4 ++-- src/mod/event_handlers/mod_rayo/rayo_input_component.c | 6 +++--- src/mod/event_handlers/mod_rayo/rayo_output_component.c | 7 +++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/rayo_elements.c b/src/mod/event_handlers/mod_rayo/rayo_elements.c index d0892dca80..14e9c61c55 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_elements.c +++ b/src/mod/event_handlers/mod_rayo/rayo_elements.c @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -42,7 +42,6 @@ ELEMENT(RAYO_INPUT) ATTRIB(sensitivity, 0.5, decimal_between_zero_and_one) ATTRIB(min-confidence, 0, decimal_between_zero_and_one) ATTRIB(max-silence, -1, positive_or_neg_one) - /* for now, only NLSML */ STRING_ATTRIB(match-content-type, application/nlsml+xml, "application/nlsml+xml") /* internal attribs for prompt support */ ATTRIB(barge-event, false, bool) @@ -72,6 +71,7 @@ ELEMENT(RAYO_OUTPUT) ATTRIB(max-time, -1, positive_or_neg_one) ATTRIB(renderer,, any) ATTRIB(voice,, any) + STRING_ATTRIB(direction, out, "out,in") ELEMENT_END /** diff --git a/src/mod/event_handlers/mod_rayo/rayo_input_component.c b/src/mod/event_handlers/mod_rayo/rayo_input_component.c index 13311d5444..84a8e745cc 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_input_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_input_component.c @@ -415,7 +415,7 @@ static int validate_call_input(iks *input, const char **error) if (!zstr(iks_find_attrib(grammar, "url"))) { *error = "url not allowed with content-type"; return 0; - } else if (strcmp("application/srgs+xml", content_type)) { + } else if (strcmp("application/srgs+xml", content_type) && strcmp("text/plain", content_type)) { *error = "Unsupported content type"; return 0; } @@ -891,7 +891,7 @@ static const char *get_detected_speech_result_text(cJSON *result_json, double *c if (json_confidence && json_confidence->valuedouble > 0.0) { *confidence = json_confidence->valuedouble; } else { - *confidence = 100.0; + *confidence = 0.99; } result_text = text; } else if (error_text) { @@ -940,7 +940,7 @@ static void on_detected_speech_event(switch_event_t *event) result_text = get_detected_speech_result_text(json_result, &confidence, &error_text); if (!zstr(result_text)) { // got result... send as NLSML - iks *result = nlsml_create_match(result_text, NULL, "speech", (int)confidence); + iks *result = nlsml_create_match(result_text, NULL, "speech", (int)(confidence * 100.0)); /* notify of match */ switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "MATCH = %s\n", result_text); send_match_event(RAYO_COMPONENT(component), result); diff --git a/src/mod/event_handlers/mod_rayo/rayo_output_component.c b/src/mod/event_handlers/mod_rayo/rayo_output_component.c index f94921fd91..6ea607e33b 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_output_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_output_component.c @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2016, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -53,6 +53,8 @@ struct output_component { const char *renderer; /** optional headers to pass to renderer */ const char *headers; + /** audio direction */ + const char *direction; }; #define OUTPUT_FINISH "finish", RAYO_OUTPUT_COMPLETE_NS @@ -79,6 +81,7 @@ static struct rayo_component *create_output_component(struct rayo_actor *actor, output_component->max_time_ms = iks_find_int_attrib(output, "max-time"); output_component->start_paused = iks_find_bool_attrib(output, "start-paused"); output_component->renderer = switch_core_strdup(RAYO_POOL(output_component), iks_find_attrib_soft(output, "renderer")); + output_component->direction = strcmp(iks_find_attrib_soft(output, "direction"), "in") ? "m" : "mr"; output_component->headers = NULL; /* get custom headers */ { @@ -136,7 +139,7 @@ static iks *start_call_output(struct rayo_component *component, switch_core_sess } stream.write_function(&stream, "}fileman://rayo://%s", RAYO_JID(component)); - if (switch_ivr_displace_session(session, stream.data, 0, "m") == SWITCH_STATUS_SUCCESS) { + if (switch_ivr_displace_session(session, stream.data, 0, OUTPUT_COMPONENT(component)->direction) == SWITCH_STATUS_SUCCESS) { RAYO_RELEASE(component); } else { if (component->complete) { From 2226c3c6218cb329b9a640d6e98f74486b26911c Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Fri, 12 Oct 2018 22:00:31 +0000 Subject: [PATCH 53/69] FS-11453 [mod_rayo] convert to fst testing --- configure.ac | 1 + src/include/test/switch_test.h | 67 +- src/mod/event_handlers/mod_rayo/Makefile.am | 2 + src/mod/event_handlers/mod_rayo/iks_helpers.h | 58 +- src/mod/event_handlers/mod_rayo/mod_rayo.h | 36 +- src/mod/event_handlers/mod_rayo/nlsml.h | 14 +- .../event_handlers/mod_rayo/rayo_components.h | 50 +- .../mod_rayo/rayo_cpa_component.h | 6 +- .../mod_rayo/rayo_cpa_detector.h | 8 +- src/mod/event_handlers/mod_rayo/sasl.h | 4 +- src/mod/event_handlers/mod_rayo/srgs.h | 20 +- src/mod/event_handlers/mod_rayo/test.h | 101 -- .../event_handlers/mod_rayo/test/Makefile.am | 13 + .../event_handlers/mod_rayo/test/test_iks.c | 204 ++++ .../{test_nlsml/main.c => test/test_nlsml.c} | 147 +-- .../{test_srgs/main.c => test/test_srgs.c} | 951 +++++++++--------- .../event_handlers/mod_rayo/test_iks/Makefile | 18 - .../event_handlers/mod_rayo/test_iks/main.c | 185 ---- .../mod_rayo/test_iks/test_iks.c | 6 - .../mod_rayo/test_nlsml/Makefile | 18 - .../mod_rayo/test_nlsml/test_nlsml.c | 6 - .../mod_rayo/test_srgs/Makefile | 18 - .../mod_rayo/test_srgs/test_srgs.c | 6 - .../event_handlers/mod_rayo/xmpp_streams.h | 30 +- 24 files changed, 967 insertions(+), 1002 deletions(-) delete mode 100644 src/mod/event_handlers/mod_rayo/test.h create mode 100644 src/mod/event_handlers/mod_rayo/test/Makefile.am create mode 100644 src/mod/event_handlers/mod_rayo/test/test_iks.c rename src/mod/event_handlers/mod_rayo/{test_nlsml/main.c => test/test_nlsml.c} (86%) rename src/mod/event_handlers/mod_rayo/{test_srgs/main.c => test/test_srgs.c} (57%) delete mode 100644 src/mod/event_handlers/mod_rayo/test_iks/Makefile delete mode 100644 src/mod/event_handlers/mod_rayo/test_iks/main.c delete mode 100644 src/mod/event_handlers/mod_rayo/test_iks/test_iks.c delete mode 100644 src/mod/event_handlers/mod_rayo/test_nlsml/Makefile delete mode 100644 src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c delete mode 100644 src/mod/event_handlers/mod_rayo/test_srgs/Makefile delete mode 100644 src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c diff --git a/configure.ac b/configure.ac index 4106fa0b19..377eea25ec 100644 --- a/configure.ac +++ b/configure.ac @@ -1929,6 +1929,7 @@ AC_CONFIG_FILES([Makefile src/mod/event_handlers/mod_radius_cdr/Makefile src/mod/event_handlers/mod_odbc_cdr/Makefile src/mod/event_handlers/mod_rayo/Makefile + src/mod/event_handlers/mod_rayo/test/Makefile src/mod/event_handlers/mod_smpp/Makefile src/mod/event_handlers/mod_snmp/Makefile src/mod/event_handlers/mod_event_zmq/Makefile diff --git a/src/include/test/switch_test.h b/src/include/test/switch_test.h index cb6ba306de..97fb9500d1 100644 --- a/src/include/test/switch_test.h +++ b/src/include/test/switch_test.h @@ -37,7 +37,6 @@ /** * Get environment variable and save to var - ( ) */ static char *fst_getenv_default(const char *env, char *default_value, switch_bool_t required) { @@ -171,7 +170,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) */ #define fst_check_int_range(actual, expected, precision) \ fct_xchk( \ - abs((val - expected)) <= precision, \ + abs((actual - expected)) <= precision, \ "fst_check_int_range: %d != %d +/- %d", \ (actual), \ (expected), \ @@ -183,13 +182,39 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) */ #define fst_check_double_range(actual, expected, precision) \ fct_xchk( \ - fabs((val - expected)) <= precision, \ + fabs((actual - expected)) <= precision, \ "fst_check_double_range: %f != %f +/- %f", \ (actual), \ (expected), \ (precision) \ ); +/** + * Run test without loading FS core + */ +#define FST_BEGIN() \ + FCT_BGN() \ + { \ + int fst_core = 0; \ + switch_time_t fst_time_start = 0; \ + switch_timer_t fst_timer = { 0 }; \ + switch_memory_pool_t *fst_pool = NULL; \ + fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ + if (fst_core) { \ + fst_init_core_and_modload(NULL, NULL); /* shuts up compiler */ \ + } \ + { \ + + +#define FST_END() \ + } \ + if (fst_time_start) { \ + /* shut up compiler */ \ + fst_time_start = 0; \ + } \ + } \ + FCT_END() + /** * Define the beginning of a freeswitch core test driver. Only one per test application allowed. * @param confdir directory containing freeswitch.xml configuration @@ -197,12 +222,13 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define FST_CORE_BEGIN(confdir) \ FCT_BGN() \ { \ + int fst_core = 1; \ switch_time_t fst_time_start = 0; \ switch_timer_t fst_timer = { 0 }; \ switch_memory_pool_t *fst_pool = NULL; \ fst_getenv_default("FST_SUPPRESS_UNUSED_STATIC_WARNING", NULL, SWITCH_FALSE); \ fst_init_core_and_modload(confdir, NULL); \ - { \ + { /** * Define the end of a freeswitch core test driver. @@ -210,6 +236,10 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define FST_CORE_END() \ /*switch_core_destroy();*/ \ } \ + if (fst_time_start) { \ + /* shut up compiler */ \ + fst_time_start = 0; \ + } \ } \ FCT_END() @@ -222,6 +252,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define FST_MODULE_BEGIN(modname,suite) \ { \ const char *fst_test_module = #modname; \ + fst_requires(fst_core); \ if (!zstr(fst_test_module)) { \ const char *err; \ switch_loadable_module_load_module((char *)"../.libs", (char *)fst_test_module, SWITCH_FALSE, &err); \ @@ -259,10 +290,12 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) */ #define FST_SETUP_BEGIN() \ FCT_SETUP_BGN() \ - switch_core_new_memory_pool(&fst_pool); \ - fst_requires(fst_pool != NULL); \ - fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \ - fst_time_mark(); + if (fst_core) { \ + switch_core_new_memory_pool(&fst_pool); \ + fst_requires(fst_pool != NULL); \ + fst_requires(switch_core_timer_init(&fst_timer, "soft", 20, 160, fst_pool) == SWITCH_STATUS_SUCCESS); \ + fst_time_mark(); \ + } /** * Define the end of test suite setup. @@ -275,8 +308,10 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) */ #define FST_TEARDOWN_BEGIN() \ FCT_TEARDOWN_BGN() \ - switch_core_destroy_memory_pool(&fst_pool); \ - switch_core_timer_destroy(&fst_timer); + if (fst_core) { \ + switch_core_destroy_memory_pool(&fst_pool); \ + switch_core_timer_destroy(&fst_timer); \ + } /** * Define the test suite teardown end. @@ -323,6 +358,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) switch_core_session_t *fst_session = NULL; \ switch_event_t *fst_originate_vars = NULL; \ switch_call_cause_t fst_cause = SWITCH_CAUSE_NORMAL_CLEARING; \ + fst_requires(fst_core); \ if (fst_test_module) { \ fst_requires_module(fst_test_module); \ } \ @@ -387,6 +423,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) char *fst_asr_result = NULL; \ switch_asr_handle_t ah = { 0 }; \ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE; \ + fst_requires(fst_core); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Open recognizer: %s\n", recognizer); \ /* open ASR interface and feed recorded audio into it and collect result */ \ fst_requires(switch_core_asr_open(&ah, recognizer, "L16", 8000, "", &flags, fst_pool) == SWITCH_STATUS_SUCCESS); \ @@ -419,6 +456,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) fst_asr_result = NULL; \ file_handle.channels = 1; \ file_handle.native_rate = 8000; \ + fst_requires(fst_core); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Test recognizer: input = %s\n", input_filename); \ fst_requires(switch_core_asr_load_grammar(&ah, grammar, "") == SWITCH_STATUS_SUCCESS); \ fst_requires(switch_core_file_open(&file_handle, input_filename, file_handle.channels, 8000, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) == SWITCH_STATUS_SUCCESS); \ @@ -461,6 +499,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_pause() \ + fst_requires(fst_core); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Pause recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_pause(&ah) == SWITCH_STATUS_SUCCESS); @@ -472,6 +511,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_resume() \ + fst_requires(fst_core); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Resume recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_resume(&ah) == SWITCH_STATUS_SUCCESS); @@ -483,6 +523,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) * switch_core_asr_close(&ah, flags) == SWITCH_STATUS_SUCCESS */ #define fst_test_core_asr_close() \ + fst_requires(fst_core); \ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Close recognizer\n"); \ flags = SWITCH_ASR_FLAG_NONE; \ fst_requires(switch_core_asr_close(&ah, &flags) == SWITCH_STATUS_SUCCESS); \ @@ -500,7 +541,8 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) */ #define fst_play_and_detect_speech_test_begin() \ { \ - const char *fst_asr_result = NULL; + const char *fst_asr_result = NULL; \ + fst_requires(fst_core); /** * Use play_and_detect_speech APP to test recognizer @@ -524,6 +566,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) #define fst_play_and_detect_speech_app_test(recognizer, grammar, prompt_filename, input_filename) \ { \ char *args = NULL; \ + fst_requires(fst_core); \ fst_requires_module("mod_dptools"); \ switch_channel_set_variable(fst_channel, "detect_speech_result", ""); \ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ @@ -555,6 +598,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) { \ char *args = NULL; \ fst_asr_result = NULL; \ + fst_requires(fst_core); \ fst_requires(switch_ivr_displace_session(fst_session, input_filename, 0, "mr") == SWITCH_STATUS_SUCCESS); \ switch_status_t status = switch_ivr_play_and_detect_speech(fst_session, prompt_filename, recognizer, grammar, (char **)&fst_asr_result, 0, input_args); \ fst_check(fst_asr_result != NULL); \ @@ -580,6 +624,7 @@ static void fst_init_core_and_modload(const char *confdir, const char *basedir) { \ switch_stream_handle_t stream = { 0 }; \ SWITCH_STANDARD_STREAM(stream); \ + fst_requires(fst_core); \ fst_requires_module("mod_commands"); \ switch_status_t api_result = switch_api_execute("sched_api", switch_core_session_sprintf(fst_session, "%s none uuid_recv_dtmf %s %s", when, switch_core_session_get_uuid(fst_session), digits), NULL, &stream); \ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(fst_session), SWITCH_LOG_INFO, "Injecting DTMF %s at %s\n", digits, when); \ diff --git a/src/mod/event_handlers/mod_rayo/Makefile.am b/src/mod/event_handlers/mod_rayo/Makefile.am index 5c0c5b4008..872329fde3 100644 --- a/src/mod/event_handlers/mod_rayo/Makefile.am +++ b/src/mod/event_handlers/mod_rayo/Makefile.am @@ -17,3 +17,5 @@ BUILT_SOURCES=$(IKS_LA) $(IKS_LA): $(IKS_BUILDDIR) $(IKS_DIR) $(IKS_DIR)/.update @cd $(IKS_BUILDDIR) && $(MAKE) @$(TOUCH_TARGET) + +SUBDIRS=. test diff --git a/src/mod/event_handlers/mod_rayo/iks_helpers.h b/src/mod/event_handlers/mod_rayo/iks_helpers.h index 2017134713..e221abe390 100644 --- a/src/mod/event_handlers/mod_rayo/iks_helpers.h +++ b/src/mod/event_handlers/mod_rayo/iks_helpers.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -51,50 +51,50 @@ struct xmpp_error { #undef XMPP_ERROR #define XMPP_ERROR(def_name, name, type) \ - extern const struct xmpp_error def_name##_val; \ - extern const struct xmpp_error *def_name; + SWITCH_DECLARE(const struct xmpp_error) def_name##_val; \ + SWITCH_DECLARE(const struct xmpp_error *) def_name; #include "xmpp_errors.def" /* See RFC-3920 XMPP core for error definitions */ -extern iks *iks_new_presence(const char *name, const char *namespace, const char *from, const char *to); -extern iks *iks_new_error(iks *iq, const struct xmpp_error *err); -extern iks *iks_new_error_detailed(iks *iq, const struct xmpp_error *err, const char *detail_text); -extern iks *iks_new_error_detailed_printf(iks *iq, const struct xmpp_error *err, const char *detail_text_format, ...); -extern iks *iks_new_iq_result(iks *iq); -extern const char *iks_find_attrib_soft(iks *xml, const char *attrib); -extern const char *iks_find_attrib_default(iks *xml, const char *attrib, const char *def); -extern int iks_find_bool_attrib(iks *xml, const char *attrib); -extern int iks_find_int_attrib(iks *xml, const char *attrib); -extern char iks_find_char_attrib(iks *xml, const char *attrib); -extern double iks_find_decimal_attrib(iks *xml, const char *attrib); -extern const char *iks_node_type_to_string(int type); -extern const char *iks_net_error_to_string(int err); -extern iks *iks_insert_attrib_printf(iks *xml, const char *name, const char *fmt, ...); +SWITCH_DECLARE(iks *) iks_new_presence(const char *name, const char *namespace, const char *from, const char *to); +SWITCH_DECLARE(iks *) iks_new_error(iks *iq, const struct xmpp_error *err); +SWITCH_DECLARE(iks *) iks_new_error_detailed(iks *iq, const struct xmpp_error *err, const char *detail_text); +SWITCH_DECLARE(iks *) iks_new_error_detailed_printf(iks *iq, const struct xmpp_error *err, const char *detail_text_format, ...); +SWITCH_DECLARE(iks *) iks_new_iq_result(iks *iq); +SWITCH_DECLARE(const char *) iks_find_attrib_soft(iks *xml, const char *attrib); +SWITCH_DECLARE(const char *) iks_find_attrib_default(iks *xml, const char *attrib, const char *def); +SWITCH_DECLARE(int) iks_find_bool_attrib(iks *xml, const char *attrib); +SWITCH_DECLARE(int) iks_find_int_attrib(iks *xml, const char *attrib); +SWITCH_DECLARE(char) iks_find_char_attrib(iks *xml, const char *attrib); +SWITCH_DECLARE(double) iks_find_decimal_attrib(iks *xml, const char *attrib); +SWITCH_DECLARE(const char *) iks_node_type_to_string(int type); +SWITCH_DECLARE(const char *) iks_net_error_to_string(int err); +SWITCH_DECLARE(iks *) iks_insert_attrib_printf(iks *xml, const char *name, const char *fmt, ...); -extern char *iks_server_dialback_key(const char *secret, const char *receiving_server, const char *originating_server, const char *stream_id); -extern void iks_sha_print_base64(iksha *sha, char *buf); +SWITCH_DECLARE(char *) iks_server_dialback_key(const char *secret, const char *receiving_server, const char *originating_server, const char *stream_id); +SWITCH_DECLARE(void) iks_sha_print_base64(iksha *sha, char *buf); /** A function to validate attribute value */ typedef int (*iks_attrib_validation_function)(const char *); -extern int validate_optional_attrib(iks_attrib_validation_function fn, const char *attrib); +SWITCH_DECLARE(int) validate_optional_attrib(iks_attrib_validation_function fn, const char *attrib); -#define ELEMENT_DECL(name) extern int VALIDATE_##name(iks *node); +#define ELEMENT_DECL(name) SWITCH_DECLARE(int) VALIDATE_##name(iks *node); #define ELEMENT(name) int VALIDATE_##name(iks *node) { int result = 1; if (!node) return 0; #define ATTRIB(name, def, rule) result &= iks_attrib_is_##rule(iks_find_attrib_default(node, #name, #def)); #define OPTIONAL_ATTRIB(name, def, rule) result &= validate_optional_attrib(iks_attrib_is_##rule, iks_find_attrib_default(node, #name, #def)); #define STRING_ATTRIB(name, def, rule) result &= value_matches(iks_find_attrib_default(node, #name, #def), rule); #define ELEMENT_END return result; } -extern int value_matches(const char *value, const char *rule); +SWITCH_DECLARE(int) value_matches(const char *value, const char *rule); -extern int iks_attrib_is_bool(const char *value); -extern int iks_attrib_is_not_negative(const char *value); -extern int iks_attrib_is_positive(const char *value); -extern int iks_attrib_is_positive_or_neg_one(const char *value); -extern int iks_attrib_is_any(const char *value); -extern int iks_attrib_is_decimal_between_zero_and_one(const char *value); -extern int iks_attrib_is_dtmf_digit(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_bool(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_not_negative(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_positive(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_positive_or_neg_one(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_any(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_decimal_between_zero_and_one(const char *value); +SWITCH_DECLARE(int) iks_attrib_is_dtmf_digit(const char *value); #endif diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.h b/src/mod/event_handlers/mod_rayo/mod_rayo.h index cefd4e1782..2d066c4e21 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.h +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -129,20 +129,20 @@ struct rayo_component { #define RAYO_CALL(x) ((struct rayo_call *)x) #define RAYO_MIXER(x) ((struct rayo_mixer *)x) -extern void rayo_message_send(struct rayo_actor *from, const char *to, iks *payload, int dup, int reply, const char *file, int line); -extern void rayo_message_destroy(struct rayo_message *msg); -extern iks *rayo_message_remove_payload(struct rayo_message *msg); +SWITCH_DECLARE(void) rayo_message_send(struct rayo_actor *from, const char *to, iks *payload, int dup, int reply, const char *file, int line); +SWITCH_DECLARE(void) rayo_message_destroy(struct rayo_message *msg); +SWITCH_DECLARE(iks *) rayo_message_remove_payload(struct rayo_message *msg); #define RAYO_SEND_MESSAGE(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 0, 0, __FILE__, __LINE__) #define RAYO_SEND_MESSAGE_DUP(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 1, 0, __FILE__, __LINE__) #define RAYO_SEND_REPLY(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 0, 1, __FILE__, __LINE__) #define RAYO_SEND_REPLY_DUP(from, to, payload) rayo_message_send(RAYO_ACTOR(from), to, payload, 1, 1, __FILE__, __LINE__) -extern struct rayo_actor *rayo_actor_locate(const char *jid, const char *file, int line); -extern struct rayo_actor *rayo_actor_locate_by_id(const char *id, const char *file, int line); -extern int rayo_actor_seq_next(struct rayo_actor *actor); -extern void rayo_actor_retain(struct rayo_actor *actor, const char *file, int line); -extern void rayo_actor_release(struct rayo_actor *actor, const char *file, int line); -extern void rayo_actor_destroy(struct rayo_actor *actor, const char *file, int line); +SWITCH_DECLARE(struct rayo_actor *) rayo_actor_locate(const char *jid, const char *file, int line); +SWITCH_DECLARE(struct rayo_actor *) rayo_actor_locate_by_id(const char *id, const char *file, int line); +SWITCH_DECLARE(int) rayo_actor_seq_next(struct rayo_actor *actor); +SWITCH_DECLARE(void) rayo_actor_retain(struct rayo_actor *actor, const char *file, int line); +SWITCH_DECLARE(void) rayo_actor_release(struct rayo_actor *actor, const char *file, int line); +SWITCH_DECLARE(void) rayo_actor_destroy(struct rayo_actor *actor, const char *file, int line); #define RAYO_LOCATE(jid) rayo_actor_locate(jid, __FILE__, __LINE__) #define RAYO_LOCATE_BY_ID(id) rayo_actor_locate_by_id(id, __FILE__, __LINE__) @@ -156,21 +156,21 @@ extern void rayo_actor_destroy(struct rayo_actor *actor, const char *file, int l #define RAYO_DESTROY(x) rayo_actor_destroy(RAYO_ACTOR(x), __FILE__, __LINE__) #define RAYO_SEQ_NEXT(x) rayo_actor_seq_next(RAYO_ACTOR(x)) -extern int rayo_call_is_joined(struct rayo_call *call); -extern int rayo_call_is_faxing(struct rayo_call *call); -extern void rayo_call_set_faxing(struct rayo_call *call, int faxing); -extern const char *rayo_call_get_dcp_jid(struct rayo_call *call); +SWITCH_DECLARE(int) rayo_call_is_joined(struct rayo_call *call); +SWITCH_DECLARE(int) rayo_call_is_faxing(struct rayo_call *call); +SWITCH_DECLARE(void) rayo_call_set_faxing(struct rayo_call *call, int faxing); +SWITCH_DECLARE(const char *) rayo_call_get_dcp_jid(struct rayo_call *call); #define rayo_mixer_get_name(mixer) RAYO_ID(mixer) #define rayo_component_init(component, pool, type, subtype, id, parent, client_jid) _rayo_component_init(component, pool, type, subtype, id, parent, client_jid, NULL, __FILE__, __LINE__) #define rayo_component_init_cleanup(component, pool, type, subtype, id, parent, client_jid, cleanup) _rayo_component_init(component, pool, type, subtype, id, parent, client_jid, cleanup, __FILE__, __LINE__) -extern struct rayo_component *_rayo_component_init(struct rayo_component *component, switch_memory_pool_t *pool, const char *type, const char *subtype, const char *id, struct rayo_actor *parent, const char *client_jid, rayo_actor_cleanup_fn cleanup, const char *file, int line); -extern switch_bool_t is_component_actor(struct rayo_actor *); +SWITCH_DECLARE(struct rayo_component *) _rayo_component_init(struct rayo_component *component, switch_memory_pool_t *pool, const char *type, const char *subtype, const char *id, struct rayo_actor *parent, const char *client_jid, rayo_actor_cleanup_fn cleanup, const char *file, int line); +SWITCH_DECLARE(switch_bool_t) is_component_actor(struct rayo_actor *); typedef iks *(*rayo_actor_xmpp_handler)(struct rayo_actor *, struct rayo_message *, void *); -extern void rayo_actor_command_handler_add(const char *type, const char *subtype, const char *name, rayo_actor_xmpp_handler fn); -extern void rayo_actor_event_handler_add(const char *from_type, const char *from_subtype, const char *to_type, const char *to_subtype, const char *name, rayo_actor_xmpp_handler fn); +SWITCH_DECLARE(void) rayo_actor_command_handler_add(const char *type, const char *subtype, const char *name, rayo_actor_xmpp_handler fn); +SWITCH_DECLARE(void) rayo_actor_event_handler_add(const char *from_type, const char *from_subtype, const char *to_type, const char *to_subtype, const char *name, rayo_actor_xmpp_handler fn); #endif diff --git a/src/mod/event_handlers/mod_rayo/nlsml.h b/src/mod/event_handlers/mod_rayo/nlsml.h index 475abd091e..35f79adc26 100644 --- a/src/mod/event_handlers/mod_rayo/nlsml.h +++ b/src/mod/event_handlers/mod_rayo/nlsml.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2014, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -39,12 +39,12 @@ enum nlsml_match_type { NMT_NOMATCH }; -extern int nlsml_init(void); -extern void nlsml_destroy(void); -enum nlsml_match_type nlsml_parse(const char *result, const char *uuid); -iks *nlsml_normalize(const char *result); -extern iks *nlsml_create_dtmf_match(const char *digits, const char *interpretation); -extern iks *nlsml_create_match(const char *digits, const char *interpretation, const char *mode, int confidence); +SWITCH_DECLARE(int) nlsml_init(void); +SWITCH_DECLARE(void) nlsml_destroy(void); +SWITCH_DECLARE(enum nlsml_match_type) nlsml_parse(const char *result, const char *uuid); +SWITCH_DECLARE(iks *) nlsml_normalize(const char *result); +SWITCH_DECLARE(iks *) nlsml_create_dtmf_match(const char *digits, const char *interpretation); +SWITCH_DECLARE(iks *) nlsml_create_match(const char *digits, const char *interpretation, const char *mode, int confidence); #endif diff --git a/src/mod/event_handlers/mod_rayo/rayo_components.h b/src/mod/event_handlers/mod_rayo/rayo_components.h index 6cd30757a1..9be7881a4e 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_components.h +++ b/src/mod/event_handlers/mod_rayo/rayo_components.h @@ -60,37 +60,37 @@ #define COMPONENT_COMPLETE_HANGUP "hangup", RAYO_EXT_COMPLETE_NS #define COMPONENT_COMPLETE_DONE "done", RAYO_EXT_COMPLETE_NS -extern switch_status_t rayo_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_input_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_output_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_prompt_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_record_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_fax_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_exec_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_input_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_output_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_prompt_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_record_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_fax_components_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(switch_status_t) rayo_exec_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern switch_status_t rayo_components_shutdown(void); -extern switch_status_t rayo_input_component_shutdown(void); -extern switch_status_t rayo_output_component_shutdown(void); -extern switch_status_t rayo_prompt_component_shutdown(void); -extern switch_status_t rayo_record_component_shutdown(void); -extern switch_status_t rayo_fax_components_shutdown(void); -extern switch_status_t rayo_exec_component_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_components_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_input_component_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_output_component_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_prompt_component_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_record_component_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_fax_components_shutdown(void); +SWITCH_DECLARE(switch_status_t) rayo_exec_component_shutdown(void); -extern void rayo_component_send_start(struct rayo_component *component, iks *iq); -extern void rayo_component_send_iq_error(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type); -extern void rayo_component_send_iq_error_detailed(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type, const char *detail); -extern void rayo_component_send_complete(struct rayo_component *component, const char *reason, const char *reason_namespace); -extern void rayo_component_send_complete_event(struct rayo_component *component, iks *response); -extern void rayo_component_send_complete_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete); -extern void rayo_component_send_complete_with_metadata_string(struct rayo_component *component, const char *reason, const char *reason_namespace, const char *meta, int child_of_complete); +SWITCH_DECLARE(void) rayo_component_send_start(struct rayo_component *component, iks *iq); +SWITCH_DECLARE(void) rayo_component_send_iq_error(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type); +SWITCH_DECLARE(void) rayo_component_send_iq_error_detailed(struct rayo_component *component, iks *iq, const char *error_name, const char *error_type, const char *detail); +SWITCH_DECLARE(void) rayo_component_send_complete(struct rayo_component *component, const char *reason, const char *reason_namespace); +SWITCH_DECLARE(void) rayo_component_send_complete_event(struct rayo_component *component, iks *response); +SWITCH_DECLARE(void) rayo_component_send_complete_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete); +SWITCH_DECLARE(void) rayo_component_send_complete_with_metadata_string(struct rayo_component *component, const char *reason, const char *reason_namespace, const char *meta, int child_of_complete); -extern iks *rayo_component_create_complete_event(struct rayo_component *component, const char *reason, const char *reason_namespace); -extern iks *rayo_component_create_complete_event_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete); +SWITCH_DECLARE(iks *) rayo_component_create_complete_event(struct rayo_component *component, const char *reason, const char *reason_namespace); +SWITCH_DECLARE(iks *) rayo_component_create_complete_event_with_metadata(struct rayo_component *component, const char *reason, const char *reason_namespace, iks *meta, int child_of_complete); -extern void rayo_component_api_execute_async(struct rayo_component *component, const char *cmd, const char *args); +SWITCH_DECLARE(void) rayo_component_api_execute_async(struct rayo_component *component, const char *cmd, const char *args); #define RAYO_COMPONENT_LOCATE(id) rayo_component_locate(id, __FILE__, __LINE__) -extern struct rayo_component *rayo_component_locate(const char *id, const char *file, int line); +SWITCH_DECLARE(struct rayo_component *) rayo_component_locate(const char *id, const char *file, int line); #endif diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h index 36354c9508..442ec1f4c8 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h +++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.h @@ -34,9 +34,9 @@ #include "mod_rayo.h" -extern switch_status_t rayo_cpa_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern void rayo_cpa_component_shutdown(void); -extern iks *rayo_cpa_component_start(struct rayo_actor *call, struct rayo_message *msg, void *session_data); +SWITCH_DECLARE(switch_status_t) rayo_cpa_component_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(void) rayo_cpa_component_shutdown(void); +SWITCH_DECLARE(iks *) rayo_cpa_component_start(struct rayo_actor *call, struct rayo_message *msg, void *session_data); #endif diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h index fcdc35f2f4..fec720dadf 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h +++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_detector.h @@ -33,10 +33,10 @@ #include "mod_rayo.h" -extern switch_status_t rayo_cpa_detector_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); -extern void rayo_cpa_detector_shutdown(void); -extern int rayo_cpa_detector_start(const char *call_uuid, const char *signal_ns, const char **error_detail); -extern void rayo_cpa_detector_stop(const char *call_uuid, const char *signal_ns); +SWITCH_DECLARE(switch_status_t) rayo_cpa_detector_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool, const char *config_file); +SWITCH_DECLARE(void) rayo_cpa_detector_shutdown(void); +SWITCH_DECLARE(int) rayo_cpa_detector_start(const char *call_uuid, const char *signal_ns, const char **error_detail); +SWITCH_DECLARE(void) rayo_cpa_detector_stop(const char *call_uuid, const char *signal_ns); #endif diff --git a/src/mod/event_handlers/mod_rayo/sasl.h b/src/mod/event_handlers/mod_rayo/sasl.h index 17b4a99f66..641bcfa064 100644 --- a/src/mod/event_handlers/mod_rayo/sasl.h +++ b/src/mod/event_handlers/mod_rayo/sasl.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -29,7 +29,7 @@ #ifndef SASL_H #define SASL_H -extern void parse_plain_auth_message(const char *message, char **authzid, char **authcid, char **password); +SWITCH_DECLARE(void) parse_plain_auth_message(const char *message, char **authzid, char **authcid, char **password); #endif diff --git a/src/mod/event_handlers/mod_rayo/srgs.h b/src/mod/event_handlers/mod_rayo/srgs.h index cfe2c6c93a..e32b522d33 100644 --- a/src/mod/event_handlers/mod_rayo/srgs.h +++ b/src/mod/event_handlers/mod_rayo/srgs.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2014, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -45,15 +45,15 @@ enum srgs_match_type { SMT_MATCH_END }; -extern int srgs_init(void); -extern void srgs_destroy(void); -extern struct srgs_parser *srgs_parser_new(const char *uuid); -extern struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document); -extern const char *srgs_grammar_to_regex(struct srgs_grammar *grammar); -extern const char *srgs_grammar_to_jsgf(struct srgs_grammar *grammar); -extern const char *srgs_grammar_to_jsgf_file(struct srgs_grammar *grammar, const char *basedir, const char *ext); -extern enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation); -extern void srgs_parser_destroy(struct srgs_parser *parser); +SWITCH_DECLARE(int) srgs_init(void); +SWITCH_DECLARE(void) srgs_destroy(void); +SWITCH_DECLARE(struct srgs_parser *) srgs_parser_new(const char *uuid); +SWITCH_DECLARE(struct srgs_grammar *) srgs_parse(struct srgs_parser *parser, const char *document); +SWITCH_DECLARE(const char *) srgs_grammar_to_regex(struct srgs_grammar *grammar); +SWITCH_DECLARE(const char *) srgs_grammar_to_jsgf(struct srgs_grammar *grammar); +SWITCH_DECLARE(const char *) srgs_grammar_to_jsgf_file(struct srgs_grammar *grammar, const char *basedir, const char *ext); +SWITCH_DECLARE(enum srgs_match_type) srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation); +SWITCH_DECLARE(void) srgs_parser_destroy(struct srgs_parser *parser); #endif diff --git a/src/mod/event_handlers/mod_rayo/test.h b/src/mod/event_handlers/mod_rayo/test.h deleted file mode 100644 index 4b5d1e0ac1..0000000000 --- a/src/mod/event_handlers/mod_rayo/test.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013, Grasshopper - * - * Version: MPL 1.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * - * The Initial Developer of the Original Code is Grasshopper - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Chris Rienzo - * - * test.h -- simple unit testing macros - * - */ -#ifndef TEST_H -#define TEST_H - -#define assert_equals(test, expected_str, expected, actual, file, line) \ -{ \ - int actual_val = actual; \ - if (expected != actual_val) { \ - printf("TEST\t%s\tFAIL\t%s\t%i\t!=\t%i\t%s:%i\n", test, expected_str, expected, actual_val, file, line); \ - exit(1); \ - } else { \ - printf("TEST\t%s\tPASS\n", test); \ - } \ -} - -#define assert_string_equals(test, expected, actual, file, line) \ -{ \ - const char *actual_str = actual; \ - if (!actual_str || strcmp(expected, actual_str)) { \ - printf("TEST\t%s\tFAIL\t\t%s\t!=\t%s\t%s:%i\n", test, expected, actual_str, file, line); \ - exit(1); \ - } else { \ - printf("TEST\t%s\tPASS\n", test); \ - } \ -} - -#define assert_not_null(test, actual, file, line) \ -{ \ - const void *actual_val = actual; \ - if (!actual_val) { \ - printf("TEST\t%s\tFAIL\t\t\t\t\t%s:%i\n", test, file, line); \ - exit(1); \ - } else { \ - printf("TEST\t%s\tPASS\n", test); \ - } \ -} - -#define assert_null(test, actual, file, line) \ -{ \ - const void *actual_val = actual; \ - if (actual_val) { \ - printf("TEST\t%s\tFAIL\t\t\t\t\t%s:%i\n", test, file, line); \ - exit(1); \ - } else { \ - printf("TEST\t%s\tPASS\n", test); \ - } \ -} - -#define ASSERT_EQUALS(expected, actual) assert_equals(#actual, #expected, expected, actual, __FILE__, __LINE__) -#define ASSERT_STRING_EQUALS(expected, actual) assert_string_equals(#actual, expected, actual, __FILE__, __LINE__) -#define ASSERT_NOT_NULL(actual) assert_not_null(#actual " not null", actual, __FILE__, __LINE__) -#define ASSERT_NULL(actual) assert_null(#actual " is null", actual, __FILE__, __LINE__) - -#define SKIP_ASSERT_EQUALS(expected, actual) if (0) { ASSERT_EQUALS(expected, actual); } - -#define TEST(name) printf("TEST BEGIN\t" #name "\n"); name(); printf("TEST END\t"#name "\tPASS\n"); - -#define SKIP_TEST(name) if (0) { TEST(name) }; - -#define TEST_INIT switch_core_init(0, SWITCH_TRUE, &err); - -#endif - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet - */ - diff --git a/src/mod/event_handlers/mod_rayo/test/Makefile.am b/src/mod/event_handlers/mod_rayo/test/Makefile.am new file mode 100644 index 0000000000..0648275b0e --- /dev/null +++ b/src/mod/event_handlers/mod_rayo/test/Makefile.am @@ -0,0 +1,13 @@ +include $(top_srcdir)/build/modmake.rulesam +bin_PROGRAMS = test_iks test_nlsml test_srgs + +test_iks_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) +test_iks_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) + +test_nlsml_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) +test_nlsml_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) + +test_srgs_CFLAGS = $(AM_CFLAGS) -I../ -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) +test_srgs_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) ../mod_rayo.la $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) + +TESTS = $(bin_PROGRAMS) diff --git a/src/mod/event_handlers/mod_rayo/test/test_iks.c b/src/mod/event_handlers/mod_rayo/test/test_iks.c new file mode 100644 index 0000000000..02a17303d9 --- /dev/null +++ b/src/mod/event_handlers/mod_rayo/test/test_iks.c @@ -0,0 +1,204 @@ + + +#include +#include +#include +#include + +static const char *voxeo_grammar = + ""; + + +static const char *repeating_bracket = + "]]]]]]]]] ]] ]]>"; + + +static const char *normal_cdata = + ""; + + +static const char *empty_cdata = + ""; + +static const char *rayo_test_srgs = + "\n" + " \n" + " \n" + " \n" + " need a\n" + " i need a\n" + " \n" + " clue \n" + " \n" + " out.concept = \"clue\";\n" + " \n" + " \n" + " have an\n" + " i have an\n" + " \n" + " answer \n" + " \n" + " out.concept = \"answer\";\n" + " \n" + " \n" + " \n" + ""; + + +#define MATCH 1 +#define NO_MATCH 0 + + +/** + * main program + */ +FST_BEGIN() + +FST_SUITE_BEGIN(iks) + +FST_SETUP_BEGIN() +{ +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + + +FST_TEST_BEGIN(iks_cdata_bug) +{ + iks *iq = NULL; + iks *input = NULL; + iksparser *p = iks_dom_new(&iq); + const char *cdata; + fst_check(IKS_OK == iks_parse(p, voxeo_grammar, 0, 1)); + iks_parser_delete(p); + fst_check((input = iks_find(iq, "input"))); + fst_check((cdata = iks_find_cdata(input, "grammar"))); + fst_check_string_equals("[1 DIGITS]", cdata); + iks_delete(iq); +} +FST_TEST_END() + +FST_TEST_BEGIN(repeating_bracket) +{ + iks *iq = NULL; + iks *input = NULL; + iksparser *p = iks_dom_new(&iq); + const char *cdata; + fst_check(IKS_OK == iks_parse(p, repeating_bracket, 0, 1)); + iks_parser_delete(p); + fst_check((input = iks_find(iq, "input"))); + fst_check((cdata = iks_find_cdata(input, "grammar"))); + fst_check_string_equals("[1 DIGITS]>]]]]]]]]] ]] ", cdata); + iks_delete(iq); +} +FST_TEST_END() + +FST_TEST_BEGIN(normal_cdata) +{ + iks *iq = NULL; + iks *input = NULL; + iksparser *p = iks_dom_new(&iq); + const char *cdata; + fst_check(IKS_OK == iks_parse(p, normal_cdata, 0, 1)); + iks_parser_delete(p); + fst_check((input = iks_find(iq, "input"))); + fst_check((cdata = iks_find_cdata(input, "grammar"))); + fst_check_string_equals("1 DIGITS", cdata); + iks_delete(iq); +} +FST_TEST_END() + +FST_TEST_BEGIN(empty_cdata) +{ + iks *iq = NULL; + iks *input = NULL; + iksparser *p = iks_dom_new(&iq); + const char *cdata; + fst_check(IKS_OK == iks_parse(p, empty_cdata, 0, 1)); + iks_parser_delete(p); + fst_check((input = iks_find(iq, "input"))); + fst_check(NULL == (cdata = iks_find_cdata(input, "grammar"))); + iks_delete(iq); +} +FST_TEST_END() + + +FST_TEST_BEGIN(rayo_test_srgs) +{ + iks *grammar = NULL; + iksparser *p = iks_dom_new(&grammar); + fst_check(IKS_OK == iks_parse(p, rayo_test_srgs, 0, 1)); + iks_parser_delete(p); + iks_delete(grammar); +} +FST_TEST_END() + +FST_TEST_BEGIN(iks_helper_value_matches) +{ + fst_check(MATCH == value_matches("1", "1,2,3")); + fst_check(MATCH == value_matches("2", "1,2,3")); + fst_check(MATCH == value_matches("3", "1,2,3")); + fst_check(NO_MATCH == value_matches("4", "1,2,3")); + fst_check(NO_MATCH == value_matches("1,2", "1,2,3")); + fst_check(NO_MATCH == value_matches(NULL, "1,2,3")); + fst_check(NO_MATCH == value_matches(NULL, NULL)); + fst_check(NO_MATCH == value_matches("1", NULL)); + fst_check(NO_MATCH == value_matches("", "1,2,3")); + fst_check(NO_MATCH == value_matches("", "")); + fst_check(NO_MATCH == value_matches("1", "")); + fst_check(MATCH == value_matches("duplex", "duplex,send,recv")); + fst_check(MATCH == value_matches("send", "duplex,send,recv")); + fst_check(MATCH == value_matches("recv", "duplex,send,recv")); + fst_check(NO_MATCH == value_matches("sendrecv", "duplex,send,recv")); + fst_check(MATCH == value_matches("duplex1", "duplex1,duplex2,duplex3")); + fst_check(MATCH == value_matches("duplex2", "duplex1,duplex2,duplex3")); + fst_check(MATCH == value_matches("duplex3", "duplex1,duplex2,duplex3")); + fst_check(NO_MATCH == value_matches("duplex4", "duplex1,duplex2,duplex3")); + fst_check(NO_MATCH == value_matches("duplex", "duplex1,duplex2,duplex3")); +} +FST_TEST_END() + +FST_TEST_BEGIN(dialback_key) +{ + fst_check_string_equals("37c69b1cf07a3f67c04a5ef5902fa5114f2c76fe4a2686482ba5b89323075643", iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("", "xmpp.example.com", "example.org", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "", "example.org", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "")); + fst_check(NULL == iks_server_dialback_key(NULL, "xmpp.example.com", "example.org", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", NULL, "example.org", "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", NULL, "D60000229F")); + fst_check(NULL == iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", NULL)); +} +FST_TEST_END() + +FST_TEST_BEGIN(validate_dtmf) +{ + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("1")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("A")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("a")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("D")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("d")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("*")); + fst_check(SWITCH_TRUE == iks_attrib_is_dtmf_digit("#")); + fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit("E")); + fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit(NULL)); + fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit("")); + fst_check(SWITCH_FALSE == iks_attrib_is_dtmf_digit("11")); + fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "A")); + fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "1")); + fst_check(SWITCH_FALSE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "Z")); + fst_check(SWITCH_FALSE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "11")); + fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, NULL)); + fst_check(SWITCH_TRUE == validate_optional_attrib(iks_attrib_is_dtmf_digit, "")); +} +FST_TEST_END() + + +FST_SUITE_END() + +FST_END() diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/main.c b/src/mod/event_handlers/mod_rayo/test/test_nlsml.c similarity index 86% rename from src/mod/event_handlers/mod_rayo/test_nlsml/main.c rename to src/mod/event_handlers/mod_rayo/test/test_nlsml.c index 0577288b7c..df5948f05a 100644 --- a/src/mod/event_handlers/mod_rayo/test_nlsml/main.c +++ b/src/mod/event_handlers/mod_rayo/test/test_nlsml.c @@ -1,8 +1,8 @@ #include -#include "test.h" -#include "nlsml.h" +#include +#include static const char *nlsml_good = "\n"; -/** - * Test parsing NLSML example results - */ -static void test_parse_nlsml_examples(void) -{ - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_good, "1234")); - ASSERT_EQUALS(NMT_BAD_XML, nlsml_parse(nlsml_bad, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_match_with_model_instance, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_multi_input, "1234")); - ASSERT_EQUALS(NMT_NOINPUT, nlsml_parse(nlsml_no_input, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_multi_input_dtmf, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_meta, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_simple_ambiguity, "1234")); - ASSERT_EQUALS(NMT_MATCH, nlsml_parse(nlsml_mixed_initiative, "1234")); - ASSERT_EQUALS(NMT_NOMATCH, nlsml_parse(nlsml_no_match, "1234")); -} static const char *nlsml_dtmf_result = ""; -/** - * Test creating DTMF match result - */ -static void test_create_dtmf_match(void) -{ - iks *result = nlsml_create_dtmf_match("1234", NULL); - char *result_str; - ASSERT_NOT_NULL(result); - result_str = iks_string(NULL, result); - ASSERT_STRING_EQUALS(nlsml_dtmf_result, result_str); - iks_free(result_str); -} - -static const char *nlsml_dtmf_instance_result = - "" - "1" - "foo" - ""; - -/** - * Test creating DTMF match result with instance interpretation - */ -static void test_create_dtmf_instance(void) -{ - iks *result = nlsml_create_dtmf_match("1", "foo"); - char *result_str; - ASSERT_NOT_NULL(result); - result_str = iks_string(NULL, result); - ASSERT_STRING_EQUALS(nlsml_dtmf_instance_result, result_str); - iks_free(result_str); -} static const char *nlsml_good_normalized = ""; + +static const char *nlsml_dtmf_instance_result = + "" + "1" + "foo" + ""; + + +FST_BEGIN() + +FST_SUITE_BEGIN(nlsml) + +FST_SETUP_BEGIN() +{ + fst_requires(nlsml_init()); +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + +/** + * Test parsing NLSML example results + */ +FST_TEST_BEGIN(parse_nlsml_examples) +{ + fst_check(NMT_MATCH == nlsml_parse(nlsml_good, "1234")); + fst_check(NMT_BAD_XML == nlsml_parse(nlsml_bad, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_match_with_model_instance, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_multi_input, "1234")); + fst_check(NMT_NOINPUT == nlsml_parse(nlsml_no_input, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_multi_input_dtmf, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_meta, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_simple_ambiguity, "1234")); + fst_check(NMT_MATCH == nlsml_parse(nlsml_mixed_initiative, "1234")); + fst_check(NMT_NOMATCH == nlsml_parse(nlsml_no_match, "1234")); +} +FST_TEST_END() + +/** + * Test creating DTMF match result + */ +FST_TEST_BEGIN(create_dtmf_match) +{ + iks *result = nlsml_create_dtmf_match("1234", NULL); + char *result_str; + fst_requires(result); + result_str = iks_string(NULL, result); + fst_check_string_equals(nlsml_dtmf_result, result_str); + iks_free(result_str); +} +FST_TEST_END() + + +/** + * Test creating DTMF match result with instance interpretation + */ +FST_TEST_BEGIN(create_dtmf_instance) +{ + iks *result = nlsml_create_dtmf_match("1", "foo"); + char *result_str; + fst_requires(result); + result_str = iks_string(NULL, result); + fst_check_string_equals(nlsml_dtmf_instance_result, result_str); + iks_free(result_str); +} +FST_TEST_END() + /** * Test NLSML normalization */ -static void test_normalize(void) +FST_TEST_BEGIN(normalize) { iks *result = nlsml_normalize(nlsml_good); - ASSERT_NOT_NULL(result); - ASSERT_STRING_EQUALS(nlsml_good_normalized, iks_string(NULL, result)); + fst_requires(result); + fst_check_string_equals(nlsml_good_normalized, iks_string(NULL, result)); } +FST_TEST_END() -/** - * main program - */ -int main(int argc, char **argv) -{ - const char *err; - TEST_INIT - nlsml_init(); - TEST(test_parse_nlsml_examples); - TEST(test_create_dtmf_match); - TEST(test_create_dtmf_instance); - TEST(test_normalize); - return 0; -} +FST_SUITE_END() + +FST_END() diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/main.c b/src/mod/event_handlers/mod_rayo/test/test_srgs.c similarity index 57% rename from src/mod/event_handlers/mod_rayo/test_srgs/main.c rename to src/mod/event_handlers/mod_rayo/test/test_srgs.c index a8f8a944f7..97284639bb 100644 --- a/src/mod/event_handlers/mod_rayo/test_srgs/main.c +++ b/src/mod/event_handlers/mod_rayo/test/test_srgs.c @@ -1,8 +1,8 @@ #include -#include "test.h" -#include "srgs.h" +#include +#include static const char *adhearsion_menu_grammar = @@ -91,108 +91,6 @@ static const char *adhearsion_large_menu_grammar = " \n" "\n"; -/** - * Test matching against adhearsion menu grammar - */ -static void test_match_adhearsion_menu_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_menu_grammar))); - - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_STRING_EQUALS("0", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_STRING_EQUALS("1", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_STRING_EQUALS("7", interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "715", &interpretation)); - ASSERT_STRING_EQUALS("4", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_STRING_EQUALS("3", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - ASSERT_NULL(interpretation); - - srgs_parser_destroy(parser); -} - -/** - * Test matching against adhearsion menu grammar - */ -static void test_match_adhearsion_large_menu_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_large_menu_grammar))); - - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_STRING_EQUALS("0", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_STRING_EQUALS("1", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_STRING_EQUALS("2", interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "715", &interpretation)); - ASSERT_STRING_EQUALS("4", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_STRING_EQUALS("3", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "761", &interpretation)); - ASSERT_STRING_EQUALS("50", interpretation); - - srgs_parser_destroy(parser); -} - static const char *duplicate_tag_grammar = "" " \n" @@ -205,54 +103,6 @@ static const char *duplicate_tag_grammar = " \n" "\n"; -/** - * Test matching with duplicate tags - */ -static void test_match_duplicate_tag_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, duplicate_tag_grammar))); - - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_STRING_EQUALS("2", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_STRING_EQUALS("2", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_STRING_EQUALS("4", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_STRING_EQUALS("4", interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - ASSERT_NULL(interpretation); - - srgs_parser_destroy(parser); -} - static const char *adhearsion_ask_grammar = "" @@ -274,38 +124,6 @@ static const char *adhearsion_ask_grammar = " \n" "\n"; -/** - * Test matching against adhearsion ask grammar - */ -static void test_match_adhearsion_ask_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_ask_grammar))); - - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_NULL(interpretation); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - - srgs_parser_destroy(parser); -} static const char *multi_digit_grammar = "" @@ -328,37 +146,6 @@ static const char *multi_digit_grammar = " \n" "\n"; -/** - * Test matching against grammar with multiple digits per item - */ -static void test_match_multi_digit_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_digit_grammar))); - - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - - srgs_parser_destroy(parser); -} static const char *multi_rule_grammar = "" @@ -385,34 +172,6 @@ static const char *multi_rule_grammar = " \n" "\n"; -static void test_match_multi_rule_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_rule_grammar))); - - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - - srgs_parser_destroy(parser); -} static const char *rayo_example_grammar = "\n"; -static void test_match_rayo_example_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, rayo_example_grammar))); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "0", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "2", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "3", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "4", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "5", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "6", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "7", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "8", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "9", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "*", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "*9", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "2321#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "27", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "223", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "0123456789*#", &interpretation)); - - srgs_parser_destroy(parser); -} - static const char *bad_ref_grammar = "\n"; -static void test_parse_grammar(void) -{ - struct srgs_parser *parser; - - parser = srgs_parser_new("1234"); - - ASSERT_NOT_NULL(srgs_parse(parser, adhearsion_ask_grammar)); - ASSERT_NULL(srgs_parse(parser, adhearsion_ask_grammar_bad)); - ASSERT_NULL(srgs_parse(parser, NULL)); - ASSERT_NULL(srgs_parse(NULL, adhearsion_ask_grammar)); - ASSERT_NULL(srgs_parse(NULL, adhearsion_ask_grammar_bad)); - ASSERT_NULL(srgs_parse(parser, bad_ref_grammar)); - - srgs_parser_destroy(parser); -} static const char *repeat_item_grammar_bad = "\n"; -static void test_repeat_item_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad)); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad2)); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad3)); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad4)); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad5)); - ASSERT_NULL(srgs_parse(parser, repeat_item_grammar_bad6)); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_grammar))); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation)); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_grammar))); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation)); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_optional_grammar))); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1234", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "11115", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "111156", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "1111567", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_plus_grammar))); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_star_grammar))); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1111#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1111", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1234#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1234", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "11115#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "11115", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111156#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111156", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "111157#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "111157", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_PARTIAL, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A#", &interpretation)); - ASSERT_EQUALS(SMT_NO_MATCH, srgs_grammar_match(grammar, "A", &interpretation)); - - srgs_parser_destroy(parser); -} static const char *repeat_item_range_ambiguous_grammar = "\n"; -static void test_repeat_item_range_ambiguous_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_ambiguous_grammar))); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation)); -} static const char *repeat_item_range_optional_pound_grammar = "\n" "\n"; -static void test_repeat_item_range_optional_pound_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *interpretation; - parser = srgs_parser_new("1234"); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, repeat_item_range_optional_pound_grammar))); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "1", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "1#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH, srgs_grammar_match(grammar, "12", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "12#", &interpretation)); - ASSERT_EQUALS(SMT_MATCH_END, srgs_grammar_match(grammar, "123", &interpretation)); -} /* = please | kindly | oh mighty computer; @@ -1045,25 +648,6 @@ static const char *rayo_test_srgs = " \n" ""; -static void test_jsgf(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - const char *jsgf; - parser = srgs_parser_new("1234"); - - ASSERT_NOT_NULL((grammar = srgs_parse(parser, adhearsion_ask_grammar))); - ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar))); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, voice_srgs1))); - ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar))); - ASSERT_STRING_EQUALS(voice_jsgf, jsgf); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, multi_rule_grammar))); - ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar))); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, rayo_test_srgs))); - ASSERT_NOT_NULL((jsgf = srgs_grammar_to_jsgf(grammar))); - ASSERT_NULL(srgs_grammar_to_jsgf(NULL)); - srgs_parser_destroy(parser); -} /* removed the ruleref to URL from example */ static const char *w3c_example_grammar = @@ -1121,15 +705,6 @@ static const char *w3c_example_grammar = "\n" ""; -static void test_w3c_example_grammar(void) -{ - struct srgs_parser *parser; - struct srgs_grammar *grammar; - parser = srgs_parser_new("1234"); - - ASSERT_NOT_NULL((grammar = srgs_parse(parser, w3c_example_grammar))); - ASSERT_NOT_NULL(srgs_grammar_to_jsgf(grammar)); -} static const char *metadata_grammar = "" @@ -1193,38 +768,508 @@ static const char *metadata_grammar = "\n" ""; -static void test_metadata_grammar(void) + +FST_BEGIN() + +FST_SUITE_BEGIN(srgs) + +FST_SETUP_BEGIN() +{ + fst_requires(srgs_init()); +} +FST_SETUP_END() + +FST_TEARDOWN_BEGIN() +{ +} +FST_TEARDOWN_END() + +/** + * Test matching against adhearsion menu grammar + */ +FST_TEST_BEGIN(match_adhearsion_menu_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, adhearsion_menu_grammar))); + + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check_string_equals("0", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check_string_equals("1", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check_string_equals("7", interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "715", &interpretation)); + fst_check_string_equals("4", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check_string_equals("3", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + fst_check(NULL == interpretation); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + +/** + * Test matching against adhearsion menu grammar + */ +FST_TEST_BEGIN(match_adhearsion_large_menu_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, adhearsion_large_menu_grammar))); + + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check_string_equals("0", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check_string_equals("1", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check_string_equals("2", interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "715", &interpretation)); + fst_check_string_equals("4", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check_string_equals("3", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "761", &interpretation)); + fst_check_string_equals("50", interpretation); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +/** + * Test matching with duplicate tags + */ +FST_TEST_BEGIN(match_duplicate_tag_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, duplicate_tag_grammar))); + + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check_string_equals("2", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check_string_equals("2", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check_string_equals("4", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check_string_equals("4", interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + fst_check(NULL == interpretation); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + + +/** + * Test matching against adhearsion ask grammar + */ +FST_TEST_BEGIN(match_adhearsion_ask_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, adhearsion_ask_grammar))); + + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(NULL == interpretation); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +/** + * Test matching against grammar with multiple digits per item + */ +FST_TEST_BEGIN(match_multi_digit_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, multi_digit_grammar))); + + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +FST_TEST_BEGIN(match_multi_rule_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, multi_rule_grammar))); + + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +FST_TEST_BEGIN(match_rayo_example_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, rayo_example_grammar))); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "0", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "2", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "3", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "4", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "5", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "6", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "7", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "8", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "9", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "*", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "*9", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "2321#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "27", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "223", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "0123456789*#", &interpretation)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + + +FST_TEST_BEGIN(parse_grammar) +{ + struct srgs_parser *parser; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + + fst_check(srgs_parse(parser, adhearsion_ask_grammar)); + fst_check(NULL == srgs_parse(parser, adhearsion_ask_grammar_bad)); + fst_check(NULL == srgs_parse(parser, NULL)); + fst_check(NULL == srgs_parse(NULL, adhearsion_ask_grammar)); + fst_check(NULL == srgs_parse(NULL, adhearsion_ask_grammar_bad)); + fst_check(NULL == srgs_parse(parser, bad_ref_grammar)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + +FST_TEST_BEGIN(repeat_item_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad)); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad2)); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad3)); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad4)); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad5)); + fst_check(NULL == srgs_parse(parser, repeat_item_grammar_bad6)); + fst_requires((grammar = srgs_parse(parser, repeat_item_grammar))); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115", &interpretation)); + fst_requires((grammar = srgs_parse(parser, repeat_item_range_grammar))); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567", &interpretation)); + fst_requires((grammar = srgs_parse(parser, repeat_item_optional_grammar))); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1234", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "11115", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "111156#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "111156", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "1111567", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_requires((grammar = srgs_parse(parser, repeat_item_plus_grammar))); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111157#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111157", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + fst_requires((grammar = srgs_parse(parser, repeat_item_star_grammar))); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1111#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1111", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1234#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1234", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "11115#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "11115", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111156#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111156", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "111157#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "111157", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation)); + fst_check(SMT_MATCH_PARTIAL == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A#", &interpretation)); + fst_check(SMT_NO_MATCH == srgs_grammar_match(grammar, "A", &interpretation)); + + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +FST_TEST_BEGIN(repeat_item_range_ambiguous_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, repeat_item_range_ambiguous_grammar))); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "12", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "123", &interpretation)); +} +FST_TEST_END() + +FST_TEST_BEGIN(repeat_item_range_optional_pound_grammar) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *interpretation; + + parser = srgs_parser_new("1234"); + fst_requires(parser); + fst_requires((grammar = srgs_parse(parser, repeat_item_range_optional_pound_grammar))); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "1", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "1#", &interpretation)); + fst_check(SMT_MATCH == srgs_grammar_match(grammar, "12", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "12#", &interpretation)); + fst_check(SMT_MATCH_END == srgs_grammar_match(grammar, "123", &interpretation)); +} +FST_TEST_END() + + +FST_TEST_BEGIN(jsgf) +{ + struct srgs_parser *parser; + struct srgs_grammar *grammar; + const char *jsgf; + parser = srgs_parser_new("1234"); + fst_requires(parser); + + fst_requires((grammar = srgs_parse(parser, adhearsion_ask_grammar))); + fst_check((jsgf = srgs_grammar_to_jsgf(grammar))); + fst_requires((grammar = srgs_parse(parser, voice_srgs1))); + fst_check((jsgf = srgs_grammar_to_jsgf(grammar))); + fst_check_string_equals(voice_jsgf, jsgf); + fst_requires((grammar = srgs_parse(parser, multi_rule_grammar))); + fst_check((jsgf = srgs_grammar_to_jsgf(grammar))); + fst_requires((grammar = srgs_parse(parser, rayo_test_srgs))); + fst_check((jsgf = srgs_grammar_to_jsgf(grammar))); + fst_check(NULL == srgs_grammar_to_jsgf(NULL)); + srgs_parser_destroy(parser); +} +FST_TEST_END() + + +FST_TEST_BEGIN(w3c_example_grammar) { struct srgs_parser *parser; struct srgs_grammar *grammar; parser = srgs_parser_new("1234"); + fst_requires(parser); - ASSERT_NOT_NULL((grammar = srgs_parse(parser, metadata_grammar))); - ASSERT_NOT_NULL(srgs_grammar_to_jsgf(grammar)); + fst_requires((grammar = srgs_parse(parser, w3c_example_grammar))); + fst_check(srgs_grammar_to_jsgf(grammar)); } +FST_TEST_END() -/** - * main program - */ -int main(int argc, char **argv) + +FST_TEST_BEGIN(metadata_grammar) { - const char *err; - TEST_INIT - srgs_init(); - TEST(test_parse_grammar); - TEST(test_match_adhearsion_menu_grammar); - TEST(test_match_adhearsion_large_menu_grammar); - TEST(test_match_duplicate_tag_grammar); - TEST(test_match_adhearsion_ask_grammar); - TEST(test_match_multi_digit_grammar); - TEST(test_match_multi_rule_grammar); - TEST(test_match_rayo_example_grammar); - TEST(test_repeat_item_grammar); - TEST(test_jsgf); - TEST(test_w3c_example_grammar); - TEST(test_metadata_grammar); - TEST(test_repeat_item_range_ambiguous_grammar); - TEST(test_repeat_item_range_optional_pound_grammar); - return 0; -} + struct srgs_parser *parser; + struct srgs_grammar *grammar; + parser = srgs_parser_new("1234"); + fst_requires(parser); + + fst_requires((grammar = srgs_parse(parser, metadata_grammar))); + fst_check(srgs_grammar_to_jsgf(grammar)); +} +FST_TEST_END() + +FST_SUITE_END() + +FST_END() diff --git a/src/mod/event_handlers/mod_rayo/test_iks/Makefile b/src/mod/event_handlers/mod_rayo/test_iks/Makefile deleted file mode 100644 index d75a967feb..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_iks/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -BASE=../../../../.. - -IKS_DIR=$(BASE)/libs/iksemel -IKS_LA=$(IKS_DIR)/src/libiksemel.la -LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include -LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../iks_helpers.o -LOCAL_SOURCES= main.c -include $(BASE)/build/modmake.rules - -$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update - @cd $(IKS_DIR) && $(MAKE) - @$(TOUCH_TARGET) - -local_all: - libtool --mode=link gcc main.o ../iks_helpers.o -o test test_iks.la - -local_clean: - -rm test diff --git a/src/mod/event_handlers/mod_rayo/test_iks/main.c b/src/mod/event_handlers/mod_rayo/test_iks/main.c deleted file mode 100644 index 09a368dc4b..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_iks/main.c +++ /dev/null @@ -1,185 +0,0 @@ - - -#include -#include -#include "test.h" -#include "iks_helpers.h" - -static const char *voxeo_grammar = - ""; - -static void test_iks_cdata_bug(void) -{ - iks *iq = NULL; - iks *input = NULL; - iksparser *p = iks_dom_new(&iq); - const char *cdata; - ASSERT_EQUALS(IKS_OK, iks_parse(p, voxeo_grammar, 0, 1)); - iks_parser_delete(p); - ASSERT_NOT_NULL((input = iks_find(iq, "input"))); - ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar"))); - ASSERT_STRING_EQUALS("[1 DIGITS]", cdata); - iks_delete(iq); -} - -static const char *repeating_bracket = - "]]]]]]]]] ]] ]]>"; - -static void test_repeating_bracket(void) -{ - iks *iq = NULL; - iks *input = NULL; - iksparser *p = iks_dom_new(&iq); - const char *cdata; - ASSERT_EQUALS(IKS_OK, iks_parse(p, repeating_bracket, 0, 1)); - iks_parser_delete(p); - ASSERT_NOT_NULL((input = iks_find(iq, "input"))); - ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar"))); - ASSERT_STRING_EQUALS("[1 DIGITS]>]]]]]]]]] ]] ", cdata); - iks_delete(iq); -} - -static const char *normal_cdata = - ""; - -static void test_normal_cdata(void) -{ - iks *iq = NULL; - iks *input = NULL; - iksparser *p = iks_dom_new(&iq); - const char *cdata; - ASSERT_EQUALS(IKS_OK, iks_parse(p, normal_cdata, 0, 1)); - iks_parser_delete(p); - ASSERT_NOT_NULL((input = iks_find(iq, "input"))); - ASSERT_NOT_NULL((cdata = iks_find_cdata(input, "grammar"))); - ASSERT_STRING_EQUALS("1 DIGITS", cdata); - iks_delete(iq); -} - -static const char *empty_cdata = - ""; - -static void test_empty_cdata(void) -{ - iks *iq = NULL; - iks *input = NULL; - iksparser *p = iks_dom_new(&iq); - const char *cdata; - ASSERT_EQUALS(IKS_OK, iks_parse(p, empty_cdata, 0, 1)); - iks_parser_delete(p); - ASSERT_NOT_NULL((input = iks_find(iq, "input"))); - ASSERT_NULL((cdata = iks_find_cdata(input, "grammar"))); - iks_delete(iq); -} - -static const char *rayo_test_srgs = - "\n" - " \n" - " \n" - " \n" - " need a\n" - " i need a\n" - " \n" - " clue \n" - " \n" - " out.concept = \"clue\";\n" - " \n" - " \n" - " have an\n" - " i have an\n" - " \n" - " answer \n" - " \n" - " out.concept = \"answer\";\n" - " \n" - " \n" - " \n" - ""; - -static void test_rayo_test_srgs(void) -{ - iks *grammar = NULL; - iksparser *p = iks_dom_new(&grammar); - ASSERT_EQUALS(IKS_OK, iks_parse(p, rayo_test_srgs, 0, 1)); - iks_parser_delete(p); - iks_delete(grammar); -} - -#define MATCH 1 -#define NO_MATCH 0 - -static void test_iks_helper_value_matches(void) -{ - ASSERT_EQUALS(MATCH, value_matches("1", "1,2,3")); - ASSERT_EQUALS(MATCH, value_matches("2", "1,2,3")); - ASSERT_EQUALS(MATCH, value_matches("3", "1,2,3")); - ASSERT_EQUALS(NO_MATCH, value_matches("4", "1,2,3")); - ASSERT_EQUALS(NO_MATCH, value_matches("1,2", "1,2,3")); - ASSERT_EQUALS(NO_MATCH, value_matches(NULL, "1,2,3")); - ASSERT_EQUALS(NO_MATCH, value_matches(NULL, NULL)); - ASSERT_EQUALS(NO_MATCH, value_matches("1", NULL)); - ASSERT_EQUALS(NO_MATCH, value_matches("", "1,2,3")); - ASSERT_EQUALS(NO_MATCH, value_matches("", "")); - ASSERT_EQUALS(NO_MATCH, value_matches("1", "")); - ASSERT_EQUALS(MATCH, value_matches("duplex", "duplex,send,recv")); - ASSERT_EQUALS(MATCH, value_matches("send", "duplex,send,recv")); - ASSERT_EQUALS(MATCH, value_matches("recv", "duplex,send,recv")); - ASSERT_EQUALS(NO_MATCH, value_matches("sendrecv", "duplex,send,recv")); - ASSERT_EQUALS(MATCH, value_matches("duplex1", "duplex1,duplex2,duplex3")); - ASSERT_EQUALS(MATCH, value_matches("duplex2", "duplex1,duplex2,duplex3")); - ASSERT_EQUALS(MATCH, value_matches("duplex3", "duplex1,duplex2,duplex3")); - ASSERT_EQUALS(NO_MATCH, value_matches("duplex4", "duplex1,duplex2,duplex3")); - ASSERT_EQUALS(NO_MATCH, value_matches("duplex", "duplex1,duplex2,duplex3")); -} - -static void test_dialback_key(void) -{ - ASSERT_STRING_EQUALS("37c69b1cf07a3f67c04a5ef5902fa5114f2c76fe4a2686482ba5b89323075643", iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("", "xmpp.example.com", "example.org", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "", "example.org", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", "")); - ASSERT_NULL(iks_server_dialback_key(NULL, "xmpp.example.com", "example.org", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", NULL, "example.org", "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", NULL, "D60000229F")); - ASSERT_NULL(iks_server_dialback_key("s3cr3tf0rd14lb4ck", "xmpp.example.com", "example.org", NULL)); -} - -static void test_validate_dtmf(void) -{ - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("1")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("A")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("a")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("D")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("d")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("*")); - ASSERT_EQUALS(SWITCH_TRUE, iks_attrib_is_dtmf_digit("#")); - ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit("E")); - ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit(NULL)); - ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit("")); - ASSERT_EQUALS(SWITCH_FALSE, iks_attrib_is_dtmf_digit("11")); - ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "A")); - ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "1")); - ASSERT_EQUALS(SWITCH_FALSE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "Z")); - ASSERT_EQUALS(SWITCH_FALSE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "11")); - ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, NULL)); - ASSERT_EQUALS(SWITCH_TRUE, validate_optional_attrib(iks_attrib_is_dtmf_digit, "")); -} - -/** - * main program - */ -int main(int argc, char **argv) -{ - const char *err; - TEST_INIT - TEST(test_iks_cdata_bug); - TEST(test_repeating_bracket); - TEST(test_normal_cdata); - TEST(test_empty_cdata); - TEST(test_rayo_test_srgs); - TEST(test_iks_helper_value_matches); - TEST(test_dialback_key); - TEST(test_validate_dtmf); - return 0; -} diff --git a/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c b/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c deleted file mode 100644 index a0953207de..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_iks/test_iks.c +++ /dev/null @@ -1,6 +0,0 @@ -int dummy(int i) -{ - return 0; -} - - diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile b/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile deleted file mode 100644 index 8104690733..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_nlsml/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -BASE=../../../../.. - -IKS_DIR=$(BASE)/libs/iksemel -IKS_LA=$(IKS_DIR)/src/libiksemel.la -LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include -LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../nlsml.o ../iks_helpers.o -LOCAL_SOURCES= main.c -include $(BASE)/build/modmake.rules - -$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update - @cd $(IKS_DIR) && $(MAKE) - @$(TOUCH_TARGET) - -local_all: - libtool --mode=link gcc main.o ../nlsml.o ../iks_helpers.o test_nlsml.la ../../../../../.libs/libfreeswitch.la ../../../../../libs/iksemel/src/.libs/libiksemel.a -lpcre -lssl -lcrypto -g -ggdb -O2 -pthread -o test - -local_clean: - -rm test diff --git a/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c b/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c deleted file mode 100644 index a0953207de..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_nlsml/test_nlsml.c +++ /dev/null @@ -1,6 +0,0 @@ -int dummy(int i) -{ - return 0; -} - - diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/Makefile b/src/mod/event_handlers/mod_rayo/test_srgs/Makefile deleted file mode 100644 index d8f4666c3b..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_srgs/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -BASE=../../../../.. - -IKS_DIR=$(BASE)/libs/iksemel -IKS_LA=$(IKS_DIR)/src/libiksemel.la -LOCAL_CFLAGS += -I../ -I$(BASE)/libs/iksemel/include -LOCAL_OBJS= $(PCRE_LA) $(IKS_LA) main.o ../srgs.o -LOCAL_SOURCES= main.c -include $(BASE)/build/modmake.rules - -$(IKS_LA): $(IKS_DIR) $(IKS_DIR)/.update - @cd $(IKS_DIR) && $(MAKE) - @$(TOUCH_TARGET) - -local_all: - libtool --mode=link gcc main.o ../srgs.o -o test test_srgs.la - -local_clean: - -rm test diff --git a/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c b/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c deleted file mode 100644 index a0953207de..0000000000 --- a/src/mod/event_handlers/mod_rayo/test_srgs/test_srgs.c +++ /dev/null @@ -1,6 +0,0 @@ -int dummy(int i) -{ - return 0; -} - - diff --git a/src/mod/event_handlers/mod_rayo/xmpp_streams.h b/src/mod/event_handlers/mod_rayo/xmpp_streams.h index 242f392543..b7ee04383b 100644 --- a/src/mod/event_handlers/mod_rayo/xmpp_streams.h +++ b/src/mod/event_handlers/mod_rayo/xmpp_streams.h @@ -1,6 +1,6 @@ /* * mod_rayo for FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2013-2015, Grasshopper + * Copyright (C) 2013-2018, Grasshopper * * Version: MPL 1.1 * @@ -37,22 +37,22 @@ typedef int (* xmpp_stream_ready_callback)(struct xmpp_stream *stream); typedef void (* xmpp_stream_recv_callback)(struct xmpp_stream *stream, iks *stanza); typedef void (* xmpp_stream_destroy_callback)(struct xmpp_stream *stream); -extern struct xmpp_stream_context *xmpp_stream_context_create(const char *domain, const char *domain_secret, xmpp_stream_bind_callback bind_cb, xmpp_stream_ready_callback ready, xmpp_stream_recv_callback recv, xmpp_stream_destroy_callback destroy); -extern void xmpp_stream_context_add_cert(struct xmpp_stream_context *context, const char *cert_pem_file); -extern void xmpp_stream_context_add_key(struct xmpp_stream_context *context, const char *key_pem_file); -extern void xmpp_stream_context_add_user(struct xmpp_stream_context *context, const char *user, const char *password); -extern void xmpp_stream_context_dump(struct xmpp_stream_context *context, switch_stream_handle_t *stream); -extern void xmpp_stream_context_destroy(struct xmpp_stream_context *context); -extern void xmpp_stream_context_send(struct xmpp_stream_context *context, const char *jid, iks *stanza); +SWITCH_DECLARE(struct xmpp_stream_context *) xmpp_stream_context_create(const char *domain, const char *domain_secret, xmpp_stream_bind_callback bind_cb, xmpp_stream_ready_callback ready, xmpp_stream_recv_callback recv, xmpp_stream_destroy_callback destroy); +SWITCH_DECLARE(void) xmpp_stream_context_add_cert(struct xmpp_stream_context *context, const char *cert_pem_file); +SWITCH_DECLARE(void) xmpp_stream_context_add_key(struct xmpp_stream_context *context, const char *key_pem_file); +SWITCH_DECLARE(void) xmpp_stream_context_add_user(struct xmpp_stream_context *context, const char *user, const char *password); +SWITCH_DECLARE(void) xmpp_stream_context_dump(struct xmpp_stream_context *context, switch_stream_handle_t *stream); +SWITCH_DECLARE(void) xmpp_stream_context_destroy(struct xmpp_stream_context *context); +SWITCH_DECLARE(void) xmpp_stream_context_send(struct xmpp_stream_context *context, const char *jid, iks *stanza); -extern switch_status_t xmpp_stream_context_listen(struct xmpp_stream_context *context, const char *addr, int port, int is_s2s, const char *acl); -extern switch_status_t xmpp_stream_context_connect(struct xmpp_stream_context *context, const char *peer_domain, const char *peer_address, int peer_port); +SWITCH_DECLARE(switch_status_t) xmpp_stream_context_listen(struct xmpp_stream_context *context, const char *addr, int port, int is_s2s, const char *acl); +SWITCH_DECLARE(switch_status_t) xmpp_stream_context_connect(struct xmpp_stream_context *context, const char *peer_domain, const char *peer_address, int peer_port); -extern int xmpp_stream_is_s2s(struct xmpp_stream *stream); -extern int xmpp_stream_is_incoming(struct xmpp_stream *stream); -extern const char *xmpp_stream_get_jid(struct xmpp_stream *stream); -extern void xmpp_stream_set_private(struct xmpp_stream *stream, void *user_private); -extern void *xmpp_stream_get_private(struct xmpp_stream *stream); +SWITCH_DECLARE(int) xmpp_stream_is_s2s(struct xmpp_stream *stream); +SWITCH_DECLARE(int) xmpp_stream_is_incoming(struct xmpp_stream *stream); +SWITCH_DECLARE(const char *) xmpp_stream_get_jid(struct xmpp_stream *stream); +SWITCH_DECLARE(void) xmpp_stream_set_private(struct xmpp_stream *stream, void *user_private); +SWITCH_DECLARE(void *) xmpp_stream_get_private(struct xmpp_stream *stream); #endif From e604dd15a3f60e73505c61e1242c94461ed72116 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Fri, 12 Oct 2018 09:07:58 +0800 Subject: [PATCH 54/69] FS-11455 #resolve add originate test for state handlers --- configure.ac | 1 + tests/fst/.gitignore | 4 + tests/fst/Makefile.am | 8 ++ tests/fst/conf/freeswitch.xml | 37 +++++++++ tests/fst/originate_test.c | 139 ++++++++++++++++++++++++++++++++++ 5 files changed, 189 insertions(+) create mode 100644 tests/fst/.gitignore create mode 100644 tests/fst/Makefile.am create mode 100644 tests/fst/conf/freeswitch.xml create mode 100644 tests/fst/originate_test.c diff --git a/configure.ac b/configure.ac index 377eea25ec..8ca3d16890 100644 --- a/configure.ac +++ b/configure.ac @@ -1998,6 +1998,7 @@ AC_CONFIG_FILES([Makefile libs/xmlrpc-c/config.mk libs/xmlrpc-c/srcdir.mk libs/xmlrpc-c/stamp-h + tests/fst/Makefile scripts/gentls_cert]) AM_CONDITIONAL(ISLINUX, [test `uname -s` = Linux]) diff --git a/tests/fst/.gitignore b/tests/fst/.gitignore new file mode 100644 index 0000000000..18574c0cb5 --- /dev/null +++ b/tests/fst/.gitignore @@ -0,0 +1,4 @@ +Makefile +Makefile.in +freeswitch.xml.fsxml +originate_test diff --git a/tests/fst/Makefile.am b/tests/fst/Makefile.am new file mode 100644 index 0000000000..db33a1913b --- /dev/null +++ b/tests/fst/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/build/modmake.rulesam + +bin_PROGRAMS = originate_test +AM_LDFLAGS = -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) +AM_CFLAGS = $(SWITCH_AM_CPPFLAGS) +AM_CPPFLAGS = $(SWITCH_AM_CPPFLAGS) + +TESTS = $(bin_PROGRAMS) diff --git a/tests/fst/conf/freeswitch.xml b/tests/fst/conf/freeswitch.xml new file mode 100644 index 0000000000..2341258ecd --- /dev/null +++ b/tests/fst/conf/freeswitch.xml @@ -0,0 +1,37 @@ + + +