<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, 5 Dec 2018 at 18:45, Nicolas Cellier <<a href="mailto:nicolas.cellier.aka.nice@gmail.com">nicolas.cellier.aka.nice@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <div dir="ltr"><div dir="ltr"><div>Hi Ben,</div><div>I did not follow all the thread in detail, but a lot of missing definitions like alloca were in platform specific support headers:</div><div><br></div><div><a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/platforms/win32/vm/sqPlatformSpecific.h" target="_blank">https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/platforms/win32/vm/sqPlatformSpecific.h</a></div><div><br></div><div>The fact that minheadless seems a
(better ?)
re-organisation of sources (I guess with a better separation of concerns) does not mean that we have to re-invent everything.</div><div>It's just there under our hands.<br></div></div></div></blockquote><div><br></div><div>I don't think much is being reinvented. Its just minheadless branched before much work on 64-bit Windows. </div><div>sqPlatformSpecific.h is very much reused, as borne out by this diff...</div><div><br></div><div><div><font face="monospace, monospace" color="#9900ff">.../platforms/win32/vm/sqPlatformSpecific.h .../platforms/minheadless/windows/sqPlatformSpecific-Win32.h</font></div><div><font face="monospace, monospace">/* win32 sqPlatformSpecific.h -- Platform-specific prototypes /* win32 sqPlatformSpecific.h -- Platform-specific prototypes</font></div><div><font face="monospace, monospace">/* How to use this file: /* How to use this file:</font></div><div><font face="monospace, monospace"> This file is for general platform-specific macros and decl This file is for general platform-specific macros and decl</font></div><div><font face="monospace, monospace"> The goal is to keep most of the other header files generic The goal is to keep most of the other header files generic</font></div><div><font face="monospace, monospace"> To override a definition or macro from sq.h, you must firs To override a definition or macro from sq.h, you must firs</font></div><div><font face="monospace, monospace"> provide the new definition. provide the new definition.</font></div><div><font face="monospace, monospace">*/ */</font></div><div><font face="monospace, monospace" color="#9900ff">#if _WIN32 || _WIN64 | #ifdef WIN32</font></div><div><font face="monospace, monospace">/* Override necessary definitions */ /* Override necessary definitions */</font></div><div><font face="monospace, monospace">#undef putchar #undef putchar</font></div><div><font face="monospace, monospace">#include "sqWin32Alloc.h" #include "sqWin32Alloc.h"</font></div><div><br></div><div><font face="monospace, monospace">#ifdef _MSC_VER #ifdef _MSC_VER</font></div><div><font face="monospace, monospace">#include <windows.h> #include <windows.h></font></div><div><font face="monospace, monospace">#define HAVE_BOOLEAN 1 /* for jpegReaderWriter plugin compati #define HAVE_BOOLEAN 1 /* for jpegReaderWriter plugin compati</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><br></div><div><font face="monospace, monospace">#ifdef _MSC_VER #ifdef _MSC_VER</font></div><div><font face="monospace, monospace">#define squeakFileOffsetType __int64 #define squeakFileOffsetType __int64</font></div><div><font face="monospace, monospace">#else #else</font></div><div><font face="monospace, monospace">#define squeakFileOffsetType unsigned long long #define squeakFileOffsetType unsigned long long</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#ifdef WIN32_FILE_SUPPORT #ifdef WIN32_FILE_SUPPORT</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#undef sqImageFile #undef sqImageFile</font></div><div><font face="monospace, monospace">#undef sqImageFileClose #undef sqImageFileClose</font></div><div><font face="monospace, monospace">#undef sqImageFileOpen #undef sqImageFileOpen</font></div><div><font face="monospace, monospace">#undef sqImageFilePosition #undef sqImageFilePosition</font></div><div><font face="monospace, monospace">#undef sqImageFileRead #undef sqImageFileRead</font></div><div><font face="monospace, monospace">#undef sqImageFileSeek #undef sqImageFileSeek</font></div><div><font face="monospace, monospace">#undef sqImageFileSeekEnd #undef sqImageFileSeekEnd</font></div><div><font face="monospace, monospace">#undef sqImageFileWrite #undef sqImageFileWrite</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#define sqImageFile usqIntptr_t #define sqImageFile usqIntptr_t</font></div><div><font face="monospace, monospace">sqInt sqImageFileClose(sqImageFile h); sqInt sqImageFileClose(sqImageFile h);</font></div><div><font face="monospace, monospace">sqImageFile sqImageFileOpen(const char *fileName, const char sqImageFile sqImageFileOpen(const char *fileName, const char </font></div><div><font face="monospace, monospace">squeakFileOffsetType sqImageFilePosition(sqImageFile h); squeakFileOffsetType sqImageFilePosition(sqImageFile h);</font></div><div><font face="monospace, monospace">size_t sqImageFileRead(void *ptr, size_t sz, size_t count, sq size_t sqImageFileRead(void *ptr, size_t sz, size_t count, sq</font></div><div><font face="monospace, monospace">squeakFileOffsetType sqImageFileSeek(sqImageFile h, squeakFil squeakFileOffsetType sqImageFileSeek(sqImageFile h, squeakFil</font></div><div><font face="monospace, monospace">squeakFileOffsetType sqImageFileSeekEnd(sqImageFile h, squeak squeakFileOffsetType sqImageFileSeekEnd(sqImageFile h, squeak</font></div><div><font face="monospace, monospace">size_t sqImageFileWrite(const void *ptr, size_t sz, size_t co size_t sqImageFileWrite(const void *ptr, size_t sz, size_t co</font></div><div><font face="monospace, monospace">#else /* when no WIN32_FILE_SUPPORT, add necessary stub for u #else /* when no WIN32_FILE_SUPPORT, add necessary stub for u</font></div><div><font face="monospace, monospace">#include <stdlib.h> #include <stdlib.h></font></div><div><font face="monospace, monospace">#include <io.h> /* _get_osfhandle */ #include <io.h> /* _get_osfhandle */</font></div><div><font face="monospace, monospace"> <font color="#9900ff">> #ifndef PATH_MAX</font></font></div><div><font face="monospace, monospace">#define PATH_MAX _MAX_PATH #define PATH_MAX _MAX_PATH</font></div><div><font face="monospace, monospace"> <font color="#9900ff">> #endif</font></font></div><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">#define fsync(filenumber) FlushFileBuffers((HANDLE)_get_osfha #define fsync(filenumber) FlushFileBuffers((HANDLE)_get_osfha</span><br></div><div><font face="monospace, monospace">#endif /* WIN32_FILE_SUPPORT */ #endif /* WIN32_FILE_SUPPORT */</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/* pluggable primitive support */ /* pluggable primitive support */</font></div><div><font face="monospace, monospace">#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)</font></div><div><font face="monospace, monospace"># undef EXPORT # undef EXPORT</font></div><div><font face="monospace, monospace"># define EXPORT(returnType) __declspec( dllexport ) returnTy # define EXPORT(returnType) __declspec( dllexport ) returnTy</font></div><div><font face="monospace, monospace"># undef VM_EXPORT # undef VM_EXPORT</font></div><div><font face="monospace, monospace"># define VM_EXPORT __declspec( dllexport ) # define VM_EXPORT __declspec( dllexport )</font></div><div><font face="monospace, monospace" color="#9900ff"> > # if defined(BUILD_VM_CORE) && !defined(VM_CORE_STATIC)</font></div><div><font face="monospace, monospace" color="#9900ff"> > # undef VM_FUNCTION_EXPORT</font></div><div><font color="#9900ff" face="monospace, monospace"> > # define VM_FUNCTION_EXPORT(returnType) __declspec( dllexport ) returnType</font></div><div><font face="monospace, monospace" color="#9900ff"> > # else</font></div><div><font face="monospace, monospace" color="#9900ff"> > # undef VM_FUNCTION_EXPORT</font></div><div><font color="#9900ff" face="monospace, monospace"> > # define VM_FUNCTION_EXPORT(returnType) __declspec( dllimport ) returnType</font></div><div><font face="monospace, monospace" color="#9900ff"> > # endif</font></div><div><span style="font-family:monospace,monospace">#endif </span><span style="font-family:monospace,monospace"> </span><font face="monospace, monospace"> #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/* missing functions */ /* missing functions */</font></div><div><font face="monospace, monospace">#ifdef _MSC_VER #ifdef _MSC_VER</font></div><div><font face="monospace, monospace">/* see on msdn the list of functions available /* see on msdn the list of functions available</font></div><div><font face="monospace, monospace"> * CRT Alphabetical Function Reference * CRT Alphabetical Function Reference</font></div><div><font face="monospace, monospace"> * <a href="https://msdn.microsoft.com/en-US/library/634ca0c2.aspx">https://msdn.microsoft.com/en-US/library/634ca0c2.aspx</a> */ * <a href="https://msdn.microsoft.com/en-US/library/634ca0c2.aspx">https://msdn.microsoft.com/en-US/library/634ca0c2.aspx</a> */</font></div><div><font face="monospace, monospace"># include <malloc.h> # include <malloc.h></font></div><div><font face="monospace, monospace"># include <float.h> # include <float.h></font></div><div><font face="monospace, monospace"># ifndef alloca # ifndef alloca</font></div><div><font face="monospace, monospace"># define alloca _alloca # define alloca _alloca</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># if _MSC_VER < 1800 /* not available before MSVC 2013 */ # if _MSC_VER < 1800 /* not available before MSVC 2013 */</font></div><div><font face="monospace, monospace"># define atoll(x) _atoi64(x) # define atoll(x) _atoi64(x)</font></div><div><font face="monospace, monospace"># define strtoll(beg,end,base) _strtoi64(beg,end,base) # define strtoll(beg,end,base) _strtoi64(beg,end,base)</font></div><div><font face="monospace, monospace"> double round(double); double round(double);</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># if _MSC_VER < 1900 /* not available before MSVC 2015 */ # if _MSC_VER < 1900 /* not available before MSVC 2015 */</font></div><div><font face="monospace, monospace"># define snprintf _snprintf # define snprintf _snprintf</font></div><div><font face="monospace, monospace"># ifndef isnan # ifndef isnan</font></div><div><font face="monospace, monospace"># define isnan _isnan # define isnan _isnan</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># if _MSC_VER < 1300 /* maybe not available before MSVC 7.0 # if _MSC_VER < 1300 /* maybe not available before MSVC 7.0 </font></div><div><font face="monospace, monospace"># define fabsf(x) ((float)fabs((double)(x))) # define fabsf(x) ((float)fabs((double)(x)))</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># define bzero(pointer,size) ZeroMemory(pointer,size) # define bzero(pointer,size) ZeroMemory(pointer,size)</font></div><div><font face="monospace, monospace" color="#9900ff"> > #else</font></div><div><font face="monospace, monospace" color="#9900ff"> > # include <string.h></font></div><div><font face="monospace, monospace" color="#9900ff"> > # define bzero(pointer,size) memset(pointer, 0, size)</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#ifdef __GNUC__ #ifdef __GNUC__</font></div><div><font face="monospace, monospace"># if __GNUC__ < 3 # if __GNUC__ < 3</font></div><div><font face="monospace, monospace"># define fabsf(x) ((float)fabs((double)(x))) /* not sur # define fabsf(x) ((float)fabs((double)(x))) /* not sur</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#else #else</font></div><div><font face="monospace, monospace" color="#9900ff">error "Not Win32 or Win64!" | error "Not Win32!"</font></div><div><font face="monospace, monospace" color="#9900ff">#endif /* _WIN32 || _WIN64 */ | #endif /* WIN32 */</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int ioSetCursorARGB(sqInt bitsIndex, sqInt w, sqInt h, sqInt int ioSetCursorARGB(sqInt bitsIndex, sqInt w, sqInt h, sqInt </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/* poll and profile thread priorities. The stack vm uses a t /* poll and profile thread priorities. The stack vm uses a t</font></div><div><font face="monospace, monospace"> * VM to poll for I/O, check for delay expiry et al at regula * VM to poll for I/O, check for delay expiry et al at regula</font></div><div><font face="monospace, monospace"> * VMs use a thread to sample the pc for VM profiling. The p * VMs use a thread to sample the pc for VM profiling. The p</font></div><div><font face="monospace, monospace"> * to have a priority higher than the main VM thread and the * to have a priority higher than the main VM thread and the </font></div><div><font face="monospace, monospace"> * to have a priority higher than the poll thread to be able * to have a priority higher than the poll thread to be able </font></div><div><font face="monospace, monospace"> * We would like POLL_THREAD_PRIORITY to be THREAD_PRIORITY_T * We would like POLL_THREAD_PRIORITY to be THREAD_PRIORITY_T</font></div><div><font face="monospace, monospace"> * but SetThreadPriority fails with this value on Windows XP. * but SetThreadPriority fails with this value on Windows XP.</font></div><div><font face="monospace, monospace"> * *</font></div><div><font face="monospace, monospace"> * N.B. THREAD_PRIORITY_TIME_CRITICAL a.k.a. THREAD_BASE_PRIO * N.B. THREAD_PRIORITY_TIME_CRITICAL a.k.a. THREAD_BASE_PRIO</font></div><div><font face="monospace, monospace"> * THREAD_PRIORITY_MAX a.k.a. THREAD_BASE_PRIORITY_MAX * THREAD_PRIORITY_MAX a.k.a. THREAD_BASE_PRIORITY_MAX</font></div><div><font face="monospace, monospace"> * See WinBase.h & WinNT.h. * See WinBase.h & WinNT.h.</font></div><div><font face="monospace, monospace"> */ */</font></div><div><font face="monospace, monospace">#if STACKVM #if STACKVM</font></div><div><font face="monospace, monospace"># define POLL_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST # define POLL_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST</font></div><div><font face="monospace, monospace">#endif /* STACKVM */ #endif /* STACKVM */</font></div><div><font face="monospace, monospace">#define PROF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL #define PROF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#if COGVM #if COGVM</font></div><div><font face="monospace, monospace">extern void sqMakeMemoryExecutableFromTo(usqIntptr_t, usqIntp extern void sqMakeMemoryExecutableFromTo(usqIntptr_t, usqIntp</font></div><div><font face="monospace, monospace">extern void sqMakeMemoryNotExecutableFromTo(usqIntptr_t, usqI extern void sqMakeMemoryNotExecutableFromTo(usqIntptr_t, usqI</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">extern int isCFramePointerInUse(void); extern int isCFramePointerInUse(void);</font></div><div><font face="monospace, monospace">extern int osCogStackPageHeadroom(void); extern int osCogStackPageHeadroom(void);</font></div><div><font face="monospace, monospace">extern void reportMinimumUnusedHeadroom(void); extern void reportMinimumUnusedHeadroom(void);</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">/* Thread support for thread-safe signalSemaphoreWithIndex an /* Thread support for thread-safe signalSemaphoreWithIndex an</font></div><div><font face="monospace, monospace">#if STACKVM || NewspeakVM #if STACKVM || NewspeakVM</font></div><div><font face="monospace, monospace"># define sqLowLevelYield() Sleep(0) # define sqLowLevelYield() Sleep(0)</font></div><div><font face="monospace, monospace">/* these are used both in the STACKVM & the COGMTVM */ /* these are used both in the STACKVM & the COGMTVM */</font></div><div><font face="monospace, monospace"># define sqOSThread void * # define sqOSThread void *</font></div><div><font face="monospace, monospace"># define ioOSThreadsEqual(a,b) ((a) == (b)) # define ioOSThreadsEqual(a,b) ((a) == (b))</font></div><div><font face="monospace, monospace"># if COGMTVM # if COGMTVM</font></div><div><font face="monospace, monospace">/* Please read the comment for CogThreadManager in the VMMake /* Please read the comment for CogThreadManager in the VMMake</font></div><div><font face="monospace, monospace"> * documentation of this API. * documentation of this API.</font></div><div><font face="monospace, monospace"> */ */</font></div><div><font face="monospace, monospace"># define sqOSSemaphore void * # define sqOSSemaphore void *</font></div><div><font face="monospace, monospace"># if !ForCOGMTVMImplementation /* this is a read-only export # if !ForCOGMTVMImplementation /* this is a read-only export</font></div><div><font face="monospace, monospace">extern const unsigned long tltiIndex; extern const unsigned long tltiIndex;</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace"># define ioGetThreadLocalThreadIndex() ((long)TlsGetValue(tl # define ioGetThreadLocalThreadIndex() ((long)TlsGetValue(tl</font></div><div><font face="monospace, monospace"># define ioSetThreadLocalThreadIndex(v) (TlsSetValue(tltiInd # define ioSetThreadLocalThreadIndex(v) (TlsSetValue(tltiInd</font></div><div><font face="monospace, monospace"># define ioTransferTimeslice() Sleep(0) # define ioTransferTimeslice() Sleep(0)</font></div><div><font face="monospace, monospace"># define ioMilliSleep(ms) Sleep(ms) # define ioMilliSleep(ms) Sleep(ms)</font></div><div><font face="monospace, monospace"># endif /* COGMTVM */ # endif /* COGMTVM */</font></div><div><font face="monospace, monospace">#endif /* STACKVM || NewspeakVM */ #endif /* STACKVM || NewspeakVM */</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">#if defined(__GNUC__) #if defined(__GNUC__)</font></div><div><font face="monospace, monospace"># if !defined(VM_LABEL) # if !defined(VM_LABEL)</font></div><div><font face="monospace, monospace"># define VM_LABEL(foo) asm("\n.globl L" #foo "\nL" #foo # define VM_LABEL(foo) asm("\n.globl L" #foo "\nL" #foo</font></div><div><font face="monospace, monospace"># endif # endif</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace">#if !defined(VM_LABEL) || COGVM #if !defined(VM_LABEL) || COGVM</font></div><div><font face="monospace, monospace"># undef VM_LABEL # undef VM_LABEL</font></div><div><font face="monospace, monospace" color="#9900ff"># define VM_LABEL(foo) ((void)0) | # define VM_LABEL(foo) 0</font></div><div><font face="monospace, monospace">#endif #endif</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><div><font color="#9900ff">/* Define the fields in a struct _CONTEXT as returned by GetThreadContext that</font></div><div><font color="#9900ff"> * represent the program counter and frame pointer on the current architecture.</font></div><div><font color="#9900ff"> */</font></div><div><font color="#9900ff">#if defined(_M_IX86) || defined(_M_I386) || defined(_X86_) || defined(i386) || defined(__i386__)</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_PC Eip</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_FP Ebp</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_SP Esp</font></div><div><font color="#9900ff">#elif defined(x86_64) || defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(__amd64__) || defined(x64) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64)</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_PC Rip</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_FP Rbp</font></div><div><font color="#9900ff">#<span style="white-space:pre"> </span>define CONTEXT_SP Rsp</font></div><div><font color="#9900ff">#else</font></div><div><font color="#9900ff"># error "unknown architecture, program counter field undefined"</font></div><div><font color="#9900ff">#endif</font></div><div><div><font color="#9900ff"> > #ifdef _MSC_VER</font></div><div><font color="#9900ff"> > /* disable "function XXXX: no return value" */</font></div><div><font color="#9900ff"> > #pragma warning(disable:4035)</font></div><div><font color="#9900ff"> > /* optional C SEH macros */</font></div><div><font color="#9900ff"> > #define TRY __try</font></div><div><font color="#9900ff"> > #define EXCEPT(filter) __except(filter)</font></div><div><font color="#9900ff"> > #define FINALLY __finally</font></div><div><font color="#9900ff"> > #else</font></div><div><font color="#9900ff"> > /* optional C SEH macros */</font></div><div><font color="#9900ff"> > #define TRY</font></div><div><font color="#9900ff"> > #define EXCEPT(filter) if (0)</font></div><div><font color="#9900ff"> > #define FINALLY</font></div><div><font color="#9900ff"> > #endif</font></div></div><div><br></div><div><br></div></font></div></div><div>But perhaps instead of my change to "platforms/Cross/plugins/IA32ABI/x64win64abicc.c" here... </div><div> <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/313/files#diff-00b8ad306e9c6bb4c8dab2e5b65a1ff8R41">https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/313/files#diff-00b8ad306e9c6bb4c8dab2e5b65a1ff8R41</a></div><div>it would have been better to include "sqPlatformSpecific.h" ? Or would that be heavy handed? I don't know.</div><div>At the time it seemed reasonable to echo the similar define here...</div><div> platforms/Cross/plugins/IA32ABI/ia32abicc.c: # define alloca _alloca</div><div><br></div><div>cheers -ben</div><div><br></div><div>P.S. It might be good to reconcile the two files, but I don't know enough about all the changes myself.</div><div>And to avoid divergence maybe(??) one file should #include the other instead of being a copy. </div><div>Or would that be a bad??</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote></div>
</blockquote></div></div></div></div></div></div></div></div></div></div></div></div>