# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20140316124459-igg4zpgg98ppddpz # target_branch: ../trunk # testament_sha1: 2d2e28d22c9b8f832ccb6c128be66bfd754be08a # timestamp: 2014-03-16 19:16:45 +0100 # base_revision_id: squid3@treenet.co.nz-20140316035245-\ # 4z0y12zr92i337y6 # # Begin patch === modified file 'compat/xalloc.cc' --- compat/xalloc.cc 2012-07-02 12:14:07 +0000 +++ compat/xalloc.cc 2014-03-16 12:44:59 +0000 @@ -92,9 +92,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz * n); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) fprintf(tracefp, "c:%u:%u:%p\n", (unsigned int) n, (unsigned int) sz, p); @@ -133,9 +130,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) fprintf(tracefp, "m:%d:%p\n", sz, p); @@ -149,9 +143,6 @@ xrealloc(void *s, size_t sz) { PROF_start(xrealloc); -#if XMALLOC_TRACE - xmalloc_show_trace(s, -1); -#endif if (sz < 1) sz = 1; @@ -182,9 +173,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) /* new ptr, old ptr, new size */ fprintf(tracefp, "r:%p:%p:%d\n", p, s, sz); @@ -199,9 +187,6 @@ void *s = const_cast(s_const); PROF_start(free_const); -#if XMALLOC_TRACE - xmalloc_show_trace(s, -1); -#endif #if XMALLOC_DEBUG check_free(s); === modified file 'configure.ac' --- configure.ac 2014-03-16 03:08:55 +0000 +++ configure.ac 2014-03-16 12:44:59 +0000 @@ -459,18 +459,6 @@ dnl fi dnl ]) -dnl This is a developer only option.. developers know how to set defines -dnl -dnl AC_ARG_ENABLE(xmalloc-debug-trace, -dnl [ --enable-xmalloc-debug-trace -dnl Detailed trace of memory allocations], -dnl [ if test "$enableval" = "yes" ; then -dnl AC_MSG_NOTICE([malloc debug trace enabled]) -dnl AC_DEFINE(XMALLOC_TRACE,1,[Define to have a detailed trace of memory allocations]) -dnl AC_DEFINE(XMALLOC_DEBUG,1) -dnl fi -dnl ]) - AH_TEMPLATE(XMALLOC_STATISTICS,[Define to have malloc statistics]) AC_ARG_ENABLE(xmalloc-statistics, AS_HELP_STRING([--enable-xmalloc-statistics], @@ -3055,7 +3043,6 @@ res_init \ __res_init \ rint \ - sbrk \ sched_getaffinity \ sched_setaffinity \ select \ === modified file 'include/squid.h' --- include/squid.h 2012-10-11 07:19:02 +0000 +++ include/squid.h 2014-03-16 12:44:59 +0000 @@ -103,11 +103,7 @@ /* * Determine if this is a leak check build or standard */ -#if PURIFY -#define LEAK_CHECK_MODE 1 -#elif WITH_VALGRIND -#define LEAK_CHECK_MODE 1 -#elif XMALLOC_TRACE +#if PURIFY || WITH_VALGRIND #define LEAK_CHECK_MODE 1 #endif === modified file 'include/util.h' --- include/util.h 2014-02-21 10:46:19 +0000 +++ include/util.h 2014-03-16 12:44:59 +0000 @@ -60,20 +60,6 @@ #include "SquidNew.h" #endif -#if XMALLOC_TRACE -#define xmalloc(size) (xmalloc_func="xmalloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xmalloc(size)) -#define xfree(ptr) (xmalloc_func="xfree",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xfree(ptr)) -#define xrealloc(ptr,size) (xmalloc_func="xrealloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xrealloc(ptr,size)) -#define xcalloc(n,size) (xmalloc_func="xcalloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xcalloc(n,size)) -#define xstrdup(ptr) (xmalloc_func="xstrdup",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xstrdup(ptr)) -extern int xmalloc_line; -extern char *xmalloc_file; -extern char *xmalloc_func; -extern int xmalloc_trace; -extern size_t xmalloc_total; -extern void xmalloc_find_leaks(void); -#endif - SQUIDCEXTERN time_t parse_iso3307_time(const char *buf); SQUIDCEXTERN double xpercent(double part, double whole); === modified file 'lib/malloc_trace.cc' --- lib/malloc_trace.cc 2014-02-21 10:46:19 +0000 +++ lib/malloc_trace.cc 2014-03-16 12:44:59 +0000 @@ -74,30 +74,11 @@ #endif -#if XMALLOC_TRACE -char *xmalloc_file = ""; -int xmalloc_line = 0; -char *xmalloc_func = ""; -static int xmalloc_count = 0; -int xmalloc_trace = 0; /* Enable with -m option */ -size_t xmalloc_total = 0; -#undef xmalloc -#undef xfree -#undef xrealloc -#undef xcalloc -#undef xstrdup -#endif - #if XMALLOC_DEBUG #define DBG_ARRY_SZ (1<<11) #define DBG_ARRY_BKTS (1<<8) static void *(*malloc_ptrs)[DBG_ARRY_SZ]; static int malloc_size[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#if XMALLOC_TRACE -static char *malloc_file[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -static short malloc_line[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -static int malloc_count[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#endif static int dbg_initd = 0; #define DBG_HASH_BUCKET(ptr) (((((int)ptr)>>4)+(((int)ptr)>>12)+(((int)ptr)>>20))&0xFF) @@ -113,13 +94,6 @@ for (I = 0; I < DBG_ARRY_SZ; ++I) { malloc_ptrs[B][I] = NULL; malloc_size[B][I] = 0; -#if XMALLOC_TRACE - - malloc_file[B][I] = NULL; - malloc_line[B][I] = 0; - malloc_count[B][I] = 0; -#endif - } } @@ -137,19 +111,7 @@ continue; malloc_ptrs[B][I] = NULL; - malloc_size[B][I] = 0; - -#if XMALLOC_TRACE - - malloc_file[B][I] = NULL; - - malloc_line[B][I] = 0; - - malloc_count[B][I] = 0; - -#endif - break; } @@ -196,19 +158,7 @@ continue; malloc_ptrs[B][I] = p; - malloc_size[B][I] = (int) sz; - -#if XMALLOC_TRACE - - malloc_file[B][I] = xmalloc_file; - - malloc_line[B][I] = xmalloc_line; - - malloc_count[B][I] = xmalloc_count; - -#endif - break; } @@ -222,189 +172,3 @@ #endif -#if XMALLOC_TRACE && !HAVE_MALLOCBLKSIZE -size_t -xmallocblksize(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_size[B][I]; - } - - return 0; -} - -#endif - -#ifdef XMALLOC_TRACE -static char * -malloc_file_name(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_file[B][I]; - } - - return 0; -} - -int -malloc_line_number(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_line[B][I]; - } - - return 0; -} - -int -malloc_number(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_count[B][I]; - } - - return 0; -} - -static void -xmalloc_show_trace(void *p, int sign) -{ - int statMemoryAccounted(); - static size_t last_total = 0, last_accounted = 0, last_mallinfo = 0; - size_t accounted = statMemoryAccounted(); - size_t mi = 0; - size_t sz; -#if HAVE_MALLINFO - - struct mallinfo mp = mallinfo(); - mi = mp.uordblks + mp.usmblks + mp.hblkhd; -#endif - - sz = xmallocblksize(p) * sign; - xmalloc_total += sz; - xmalloc_count += sign > 0; - - if (xmalloc_trace) { - fprintf(stderr, "%c%8p size=%5d/%d acc=%5d/%d mallinfo=%5d/%d %s:%d %s", - sign > 0 ? '+' : '-', p, - (int) xmalloc_total - last_total, (int) xmalloc_total, - (int) accounted - last_accounted, (int) accounted, - (int) mi - last_mallinfo, (int) mi, - xmalloc_file, xmalloc_line, xmalloc_func); - - if (sign < 0) - fprintf(stderr, " (%d %s:%d)\n", malloc_number(p), malloc_file_name(p), malloc_line_number(p)); - else - fprintf(stderr, " %d\n", xmalloc_count); - } - - last_total = xmalloc_total; - last_accounted = accounted; - last_mallinfo = mi; -} - -short malloc_refs[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#define XMALLOC_LEAK_ALIGN (4) -static void -xmalloc_scan_region(void *start, int size, int depth) -{ - int B, I; - char *ptr = start; - char *end = ptr + size - XMALLOC_LEAK_ALIGN; - static int sum = 0; - - while (ptr <= end) { - void *p = *(void **) ptr; - - if (p && p != start) { - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) { - if (!malloc_refs[B][I]++) { - /* A new reference */ - fprintf(stderr, "%*s%p %s:%d size %d allocation %d\n", - depth, "", - malloc_ptrs[B][I], malloc_file[B][I], - malloc_line[B][I], malloc_size[B][I], - malloc_count[B][I]); - sum += malloc_size[B][I]; - xmalloc_scan_region(malloc_ptrs[B][I], malloc_size[B][I], depth + 1); - - if (depth == 0) { - if (sum != malloc_size[B][I]) - fprintf(stderr, "=== %d bytes\n", sum); - - sum = 0; - } - -#if XMALLOC_SHOW_ALL_REFERENCES - - } else { - /* We have already scanned this pointer... */ - fprintf(stderr, "%*s%p %s:%d size %d allocation %d ... (%d)\n", - depth * 2, "", - malloc_ptrs[B][I], malloc_file[B][I], - malloc_line[B][I], malloc_size[B][I], - malloc_count[B][I], malloc_refs[B][I]); -#endif - - } - } - } - } - - ptr += XMALLOC_LEAK_ALIGN; - } -} - -void -xmalloc_find_leaks(void) -{ - int B, I; - int leak_sum = 0; - - extern void _etext; - fprintf(stderr, "----- Memory map ----\n"); - xmalloc_scan_region(&_etext, (void *) sbrk(0) - (void *) &_etext, 0); - - for (B = 0; B < DBG_ARRY_BKTS; ++B) { - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] && malloc_refs[B][I] == 0) { - /* Found a leak... */ - fprintf(stderr, "Leak found: %p", malloc_ptrs[B][I]); - fprintf(stderr, " %s", malloc_file[B][I]); - fprintf(stderr, ":%d", malloc_line[B][I]); - fprintf(stderr, " size %d", malloc_size[B][I]); - fprintf(stderr, " allocation %d\n", malloc_count[B][I]); - leak_sum += malloc_size[B][I]; - } - } - } - - if (leak_sum) { - fprintf(stderr, "Total leaked memory: %d\n", leak_sum); - } else { - fprintf(stderr, "No memory leaks detected\n"); - } - - fprintf(stderr, "----------------------\n"); -} - -#endif /* XMALLOC_TRACE */ === modified file 'src/globals.h' --- src/globals.h 2014-02-21 10:46:19 +0000 +++ src/globals.h 2014-03-16 12:44:59 +0000 @@ -122,9 +122,6 @@ extern char *WIN32_Service_Command_Line; /* NULL */ extern unsigned int WIN32_run_mode; /* _WIN_SQUID_RUN_MODE_INTERACTIVE */ #endif -#if HAVE_SBRK -extern void *sbrk_start; /* 0 */ -#endif extern int ssl_ex_index_server; /* -1 */ extern int ssl_ctx_ex_index_dont_verify_domain; /* -1 */ === modified file 'src/main.cc' --- src/main.cc 2014-02-21 16:14:05 +0000 +++ src/main.cc 2014-03-16 12:44:59 +0000 @@ -501,13 +501,7 @@ fatal("Need to add -DMALLOC_DBG when compiling to use -mX option"); #endif - } else { -#if XMALLOC_TRACE - xmalloc_trace = !xmalloc_trace; -#else - fatal("Need to configure --enable-xmalloc-debug-trace to use -m option"); -#endif - } + } break; case 'n': @@ -1300,10 +1294,6 @@ { ConfigureCurrentKid(argv[0]); -#if HAVE_SBRK - sbrk_start = sbrk(0); -#endif - Debug::parseOptions(NULL); debug_log = stderr; @@ -1922,15 +1912,6 @@ mimeFreeMemory(); errorClean(); #endif -#if !XMALLOC_TRACE - - if (opt_no_daemon) { - file_close(0); - file_close(1); - file_close(2); - } - -#endif // clear StoreController Store::Root(NULL); @@ -1942,13 +1923,6 @@ RunRegisteredHere(RegisteredRunner::finishShutdown); -#if XMALLOC_TRACE - - xmalloc_find_leaks(); - - debugs(1, DBG_CRITICAL, "Memory used after shutdown: " << xmalloc_total); - -#endif #if MEM_GEN_TRACE log_trace_done(); === modified file 'src/mgr/InfoAction.cc' --- src/mgr/InfoAction.cc 2013-10-25 00:13:46 +0000 +++ src/mgr/InfoAction.cc 2014-03-16 12:44:59 +0000 @@ -81,9 +81,6 @@ cpu_usage += stats.cpu_usage; cpu_usage5 += stats.cpu_usage5; cpu_usage60 += stats.cpu_usage60; -#if HAVE_SBRK - proc_data_seg += stats.proc_data_seg; -#endif maxrss += stats.maxrss; page_faults += stats.page_faults; #if HAVE_MSTATS && HAVE_GNUMALLOC_H @@ -106,8 +103,8 @@ mp_uordbytes += stats.mp_uordbytes; mp_allocated += stats.mp_allocated; mp_treeoverhead += stats.mp_treeoverhead; -#endif -#endif +#endif /* HAVE_STRUCT_MALLINFO_MXFAST */ +#endif /* HAVE_MALLINFO && HAVE_STRUCT_MALLINFO */ total_accounted += stats.total_accounted; #if !(HAVE_MSTATS && HAVE_GNUMALLOC_H) && HAVE_MALLINFO && HAVE_STRUCT_MALLINFO mem_pool_allocated += stats.mem_pool_allocated; === modified file 'src/mgr/InfoAction.h' --- src/mgr/InfoAction.h 2013-09-27 16:06:15 +0000 +++ src/mgr/InfoAction.h 2014-03-16 12:44:59 +0000 @@ -68,9 +68,6 @@ double cpu_usage; double cpu_usage5; double cpu_usage60; -#if HAVE_SBRK - double proc_data_seg; -#endif double maxrss; double page_faults; #if HAVE_MSTATS && HAVE_GNUMALLOC_H @@ -93,8 +90,8 @@ double mp_uordbytes; double mp_allocated; double mp_treeoverhead; -#endif -#endif +#endif /* HAVE_STRUCT_MALLINFO_MXFAST */ +#endif /* HAVE_MALLINFO && HAVE_STRUCT_MALLINFO */ double total_accounted; #if !(HAVE_MSTATS && HAVE_GNUMALLOC_H) && HAVE_MALLINFO && HAVE_STRUCT_MALLINFO double mem_pool_allocated; === modified file 'src/stat.cc' --- src/stat.cc 2014-01-24 01:57:15 +0000 +++ src/stat.cc 2014-03-16 12:44:59 +0000 @@ -588,12 +588,6 @@ stats.cpu_usage5 = statCPUUsage(5); stats.cpu_usage60 = statCPUUsage(60); -#if HAVE_SBRK - - stats.proc_data_seg = ((char *) sbrk(0) - (char *) sbrk_start); - -#endif - stats.maxrss = rusage_maxrss(&rusage); stats.page_faults = rusage_pagefaults(&rusage); @@ -814,13 +808,6 @@ storeAppendPrintf(sentry, "\tCPU Usage, 60 minute avg:\t%.2f%%\n", stats.cpu_usage60); -#if HAVE_SBRK - - storeAppendPrintf(sentry, "\tProcess Data Segment Size via sbrk(): %.0f KB\n", - stats.proc_data_seg / 1024); - -#endif - storeAppendPrintf(sentry, "\tMaximum Resident Size: %.0f KB\n", stats.maxrss); @@ -1461,18 +1448,12 @@ if (Config.warnings.high_memory) { size_t i = 0; #if HAVE_MSTATS && HAVE_GNUMALLOC_H - struct mstats ms = mstats(); i = ms.bytes_total; #elif HAVE_MALLINFO && HAVE_STRUCT_MALLINFO - struct mallinfo mp = mallinfo(); i = mp.arena; -#elif HAVE_SBRK - - i = (size_t) ((char *) sbrk(0) - (char *) sbrk_start); #endif - if (Config.warnings.high_memory < i) debugs(18, DBG_CRITICAL, "WARNING: Memory usage at " << ((unsigned long int)(i >> 20)) << " MB"); } # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWb2ZzjoAB3RfgABQWXP/93/n 3+C////2YArfc9oj60AfQUHoAHHb32BTpyu1jVY0JKUaPSaMp5TGmmpjIepGgB6g0AAANBKQRoxT TySeoBpoAAAAAADIDRGmJKfqR6QY1GQAAaADEAAAEmpJomkjQyPQhpoADQAANNNGTQaCKU9Uwp6F Npppo01MaT1PQxT9RNAA0AAASRCYgJhGink0BU9PSmQ00D1GmgAGI9+oxmcdn6HfRwowP/TYtbny r948WjhChEcGq4SWQSJ2VGdyeaRBzI6Miu6TEHJFglbwM4yMjY2VFMESFA5GRynF2jC2s5wChovX /GI74cxhGMC6IfAhpIMWLCCqqiiixTi4JDpc+/+2uY4MtWT5ubM8ow2arTIVjENpuThB4UKvSDme eVjBNaYF7FJhfG2kqs8sUtk44VLtKrg0rTghe1OdF0vovYuZUZ7m8dgTY5uDg36IcXNhtkOVIcbI c5CH74dvVs0bm1hq3LDiUWxt1zjFRZdJUg794Qj8RHHU/vdbf0rD6wCrCSPVHgex1advuEAeh5Xj u3X8TnYf5yXxGDY6B+TmzOfHzLCAwf6xGYP+MDgLBdjRxd0xew68EhXvk8UJQY9xcOa8ar5QVUY8 UW2wwQSSSJXlwVaZIMRJWahGSF7h1EtkStkIgjXHf2+HJ213jFLu2AIqwaBLJIY5arBdBSWdKBYM yqKL0BctogOIsHUYFIORZICECMikQcSi5sUjAEpg6ctCEal1FuJNOhSTFzyjExsItbefYxG4iwVY tIp2IX0EzCgoEx4EyYxU9itk7i0lE2TGPPRfYjVIyYsbTg498b4ReaXkSULI++h+6mgiDH64HG1O m2J2Hgc98sDMtwq46roMQuGeN5DgZmGLkiedo9bS1Q0ATxG4xlHvfg3vDXo79VcZNcNaJaQiPHf1 H4ykBCxAGdLwUChZoNNB/3k5XW6yKvtuDUj0CjuAqOZrQn6RLLQmQyYzI494jjHtOCwciwwb5DnU AiYiMC86nbQiGnC55OKNapd99DIGBr0pY0rcqXRRIe5KRARgsGLJkh1CIQyKQEpXjFg2D4EgoDCW IOJQKEGHEuZyqrgYBXK3UvqXl8mGiXWFtYsWGKqWTL8BKkitcydhtHEQyFqXXGR1qQqfhqTyXBRL gpo9NJw0sysIM0sWiJUCdGgM4JcVebEdSQOJd7ylxbdupHSmOg+BerRKpfI2HeBdEMiYNIzSwqcR L0NG0fcWkSopoHyMGMe4RKjFeKSRsSmWlx01PFWHoq9eDx6wthbdDXG+dhKFa0nIRNgsGBJxshkL Y3qQDla7PzIGlR+zgKJaRuykoxgMsQFxMMGKKRiXYkJcHepMSvUllyuKGBnySJFpsaGgdND8O3uJ ep8jkvcBZ7tvqYG+Ywz0HCNljOWEWmR12N5y2KHUoQN17CJOJQJQEmoGvI7KGsMSk7zCKo3Ft0UV V0FQoACUXhIe60+BQpkXEA0IGfp5CWJ8S988MuOEC15mE4jPo30FvjSmxUSgF41jMyBXbMQTlpEj gSlvqXsTvLLcaHEsHGVX39r48gVN7jQiaF7D+Rvs1FU2IVzPkaUIYEN2hGmBGx+5HYaAxyGyGNSO V0bDMgUIkC0hZPkWl5YyGak1BTJh4lhQszONwK4kWGw5gMcSA+p4d8uAlJRrCD4ua8SY5O9RnLgM dDpYVLTArUvLJcQb4iW5qQ4MzjGNT1JzO0tjG7EtIHIcwkRV7HA5EyMHfeBaMSuKFpxOgxkTvGJa lpQiOZGq3uAVLytcqWERKQCirTiSiaXlZwmOP4D1TDYX43Sqq+y43ErxjAZWEVOJCOco4WiXTpiW GMhs96Fta/ABX37VgAeHQhxzTl94xn0OhYczWynEUmRg0mri1i2dIi4Rxw0WqQohdhMcnfkNWtrh pYKxNVAlNVUO2QSlYsVV2vIQ2t2+8wJskOPl/MnCcRN8yhsAKJFfbw8ofHVyfjRr65mh/DEnJ4f1 pJ9KxgmPPJMEUiKyCQUPRLgbVNhCBb+VsCyIwMhW+GMQ2DAPvlQWHQbLiYhgOi3p6HNMMebuMiAD r9kgna82wuopBuOk45E7Ss83j7Li4gkg9JTBXfITj5CRrdVjw1KykLr5A6YJCeWYbPAhVLm7NHan lReQjyoWT63JIwq8054n8PgU/eegxDcfYO3byNzxKD8CB4FpA87DwW1TEIjFSm9/U+fqfNIFdNFv j2UBGKhnLM7wOmxuVGND+JZ4/byOnKRgZFwehUzUfgkJjI8fVJeBMidDmtSBqxZ2LLX70BJnJ+Fy Rrt9rDN1/RaMypVcueOAJZnfKUt5jHM+goVETJl8iMT8S8F1UzgYgmORJqIRAaRctNrCEjNACujS MsYDWRA1IisSYQFHjtbZppEZWjp0x6pCkIzqdactqjEDkdiJqdj5PRsXdunrT4+x0LByZiYmxy84 GIiAjoIV6NGWLJ+QjJC3m0iXzTLmjRZtfVJMktUcsQqFWGK2LlR+1jR0ldKvvCQjSCR4pgXCnHHf 0xOdpmIa1C+lVQiEkYHHUNjI8uZA8yw8jQOH9bPq9SPmWnlRIcyiMcEjgT+ibBOwTVeWg2bxHGI2 GEBxQAz1bguaoB74Dx7bopKXrBy8WfDOgU6TBKjveTa5DhFnqeZ6Hou2XPwo/b6hIO3zQh39RCuv D3ZI9SQDDulLQKwc+c53mLUcmiYiRH66c9XLfGAdaL2dzjwjDvmeqVOxlAlcr57ZZN2kQqUK7MTJ DBD8ssDT3LvM0PkcfGxewUQtZQD2kJLxuJZwPD0cUVo0ponk6tOVFRsqCESpH4sLBjKFiMsQjXJj v22b1pO+XYu13G/Nql4tZIYHghTYJrssKjQUUIyFUCQlHvIDLAjWXFSswDD4hPBg2wJjeRvDvoZt OgsK7G1Q20JWUo31G16JDHJTitX1nK3m4hgUbQEyRW8BV+jzs+sBZ1yJALEzaSjIgk6jiJjvNjuo +3qqcL11CZJ5LcCpi11KL0hS+q8grYbU9Z2ePuOEPJYnO7TG6ZNybCMBGhGBK7EM0PL0qPRYpJZL fyxRrioXhcZDSI4WmMjLFkRUCIwf4K8d4EXn5c0K2BwmzEKFEPMjJlgEV4GApbhknJ72a6Ws6SBh ooJHJlxxkoZLkIhLM1XlQhcd/S55NHk8YqyJaS2EWwzPwq2hGAKLVYoDxHPUj1OiFr3G4iICPpUj wNe9BFnyKzxG+AplMQK0fjtf+LuSKcKEhezOcdA=