aboutsummaryrefslogtreecommitdiff
path: root/samples/DX_APIUsage/DXUT/Optional
diff options
context:
space:
mode:
authorDave Clark <[email protected]>2018-02-28 17:22:22 -0500
committerDave Clark <[email protected]>2018-02-28 17:22:22 -0500
commit25528fd230f5f4298c35123a833cdb112675808e (patch)
treef5aca3f5ee5a7734df41e7b974a04c37ddff528e /samples/DX_APIUsage/DXUT/Optional
parentPush GfeSDK #173 (diff)
downloadgfesdk-25528fd230f5f4298c35123a833cdb112675808e.tar.xz
gfesdk-25528fd230f5f4298c35123a833cdb112675808e.zip
Push SDK # 1.1.186
Documentation updates.
Diffstat (limited to 'samples/DX_APIUsage/DXUT/Optional')
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTLockFreePipe.h227
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTcamera.cpp1532
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTcamera.h517
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTgui.cpp7293
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTgui.h1385
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.cpp990
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.h141
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTres.cpp8339
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTres.h18
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.cpp2853
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.h248
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/ImeUi.cpp3662
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/ImeUi.h124
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKmesh.cpp2349
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKmesh.h589
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKmisc.cpp1713
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKmisc.h368
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKsound.cpp1053
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKsound.h124
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKwavefile.cpp546
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/SDKwavefile.h59
-rw-r--r--samples/DX_APIUsage/DXUT/Optional/directx.icobin0 -> 25214 bytes
22 files changed, 34130 insertions, 0 deletions
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTLockFreePipe.h b/samples/DX_APIUsage/DXUT/Optional/DXUTLockFreePipe.h
new file mode 100644
index 0000000..7dfe14d
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTLockFreePipe.h
@@ -0,0 +1,227 @@
+//--------------------------------------------------------------------------------------
+// DXUTLockFreePipe.h
+//
+// See the "Lockless Programming Considerations for Xbox 360 and Microsoft Windows"
+// article in the DirectX SDK for more details.
+//
+// http://msdn2.microsoft.com/en-us/library/bb310595.aspx
+//
+// XNA Developer Connection
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#pragma once
+
+#include <sal.h>
+
+#ifdef _XBOX_VER
+ // Prevent the CPU from rearranging loads
+ // and stores, sufficiently for read-acquire
+ // and write-release.
+ #define DXUTImportBarrier __lwsync
+ #define DXUTExportBarrier __lwsync
+#else
+ #pragma pack(push)
+ #pragma pack(8)
+ #include <windows.h>
+ #pragma pack (pop)
+
+ extern "C"
+ void _ReadWriteBarrier();
+ #pragma intrinsic(_ReadWriteBarrier)
+
+ // Prevent the compiler from rearranging loads
+ // and stores, sufficiently for read-acquire
+ // and write-release. This is sufficient on
+ // x86 and x64.
+ #define DXUTImportBarrier _ReadWriteBarrier
+ #define DXUTExportBarrier _ReadWriteBarrier
+#endif
+
+//
+// Pipe class designed for use by at most two threads: one reader, one writer.
+// Access by more than two threads isn't guaranteed to be safe.
+//
+// In order to provide efficient access the size of the buffer is passed
+// as a template parameter and restricted to powers of two less than 31.
+//
+
+template <BYTE cbBufferSizeLog2> class DXUTLockFreePipe
+{
+public:
+ DXUTLockFreePipe() : m_readOffset( 0 ),
+ m_writeOffset( 0 )
+ {
+ }
+
+ DWORD GetBufferSize() const
+ {
+ return c_cbBufferSize;
+ }
+
+ __forceinline unsigned long BytesAvailable() const
+ {
+ return m_writeOffset - m_readOffset;
+ }
+
+ bool __forceinline Read( void* pvDest, unsigned long cbDest )
+ {
+ // Store the read and write offsets into local variables--this is
+ // essentially a snapshot of their values so that they stay constant
+ // for the duration of the function (and so we don't end up with cache
+ // misses due to false sharing).
+ DWORD readOffset = m_readOffset;
+ DWORD writeOffset = m_writeOffset;
+
+ // Compare the two offsets to see if we have anything to read.
+ // Note that we don't do anything to synchronize the offsets here.
+ // Really there's not much we *can* do unless we're willing to completely
+ // synchronize access to the entire object. We have to assume that as we
+ // read, someone else may be writing, and the write offset we have now
+ // may be out of date by the time we read it. Fortunately that's not a
+ // very big deal. We might miss reading some data that was just written.
+ // But the assumption is that we'll be back before long to grab more data
+ // anyway.
+ //
+ // Note that this comparison works because we're careful to constrain
+ // the total buffer size to be a power of 2, which means it will divide
+ // evenly into ULONG_MAX+1. That, and the fact that the offsets are
+ // unsigned, means that the calculation returns correct results even
+ // when the values wrap around.
+ DWORD cbAvailable = writeOffset - readOffset;
+ if( cbDest > cbAvailable )
+ {
+ return false;
+ }
+
+ // The data has been made available, but we need to make sure
+ // that our view on the data is up to date -- at least as up to
+ // date as the control values we just read. We need to prevent
+ // the compiler or CPU from moving any of the data reads before
+ // the control value reads. This import barrier serves this
+ // purpose, on Xbox 360 and on Windows.
+
+ // Reading a control value and then having a barrier is known
+ // as a "read-acquire."
+ DXUTImportBarrier();
+
+ unsigned char* pbDest = ( unsigned char* )pvDest;
+
+ unsigned long actualReadOffset = readOffset & c_sizeMask;
+ unsigned long bytesLeft = cbDest;
+
+ //
+ // Copy from the tail, then the head. Note that there's no explicit
+ // check to see if the write offset comes between the read offset
+ // and the end of the buffer--that particular condition is implicitly
+ // checked by the comparison with AvailableToRead(), above. If copying
+ // cbDest bytes off the tail would cause us to cross the write offset,
+ // then the previous comparison would have failed since that would imply
+ // that there were less than cbDest bytes available to read.
+ //
+ unsigned long cbTailBytes = min( bytesLeft, c_cbBufferSize - actualReadOffset );
+ memcpy( pbDest, m_pbBuffer + actualReadOffset, cbTailBytes );
+ bytesLeft -= cbTailBytes;
+
+ if( bytesLeft )
+ {
+ memcpy( pbDest + cbTailBytes, m_pbBuffer, bytesLeft );
+ }
+
+ // When we update the read offset we are, effectively, 'freeing' buffer
+ // memory so that the writing thread can use it. We need to make sure that
+ // we don't free the memory before we have finished reading it. That is,
+ // we need to make sure that the write to m_readOffset can't get reordered
+ // above the reads of the buffer data. The only way to guarantee this is to
+ // have an export barrier to prevent both compiler and CPU rearrangements.
+ DXUTExportBarrier();
+
+ // Advance the read offset. From the CPUs point of view this is several
+ // operations--read, modify, store--and we'd normally want to make sure that
+ // all of the operations happened atomically. But in the case of a single
+ // reader, only one thread updates this value and so the only operation that
+ // must be atomic is the store. That's lucky, because 32-bit aligned stores are
+ // atomic on all modern processors.
+ //
+ readOffset += cbDest;
+ m_readOffset = readOffset;
+
+ return true;
+ }
+
+ bool __forceinline Write( const void* pvSrc, unsigned long cbSrc )
+ {
+ // Reading the read offset here has the same caveats as reading
+ // the write offset had in the Read() function above.
+ DWORD readOffset = m_readOffset;
+ DWORD writeOffset = m_writeOffset;
+
+ // Compute the available write size. This comparison relies on
+ // the fact that the buffer size is always a power of 2, and the
+ // offsets are unsigned integers, so that when the write pointer
+ // wraps around the subtraction still yields a value (assuming
+ // we haven't messed up somewhere else) between 0 and c_cbBufferSize - 1.
+ DWORD cbAvailable = c_cbBufferSize - ( writeOffset - readOffset );
+ if( cbSrc > cbAvailable )
+ {
+ return false;
+ }
+
+ // It is theoretically possible for writes of the data to be reordered
+ // above the reads to see if the data is available. Improbable perhaps,
+ // but possible. This barrier guarantees that the reordering will not
+ // happen.
+ DXUTImportBarrier();
+
+ // Write the data
+ const unsigned char* pbSrc = ( const unsigned char* )pvSrc;
+ unsigned long actualWriteOffset = writeOffset & c_sizeMask;
+ unsigned long bytesLeft = cbSrc;
+
+ // See the explanation in the Read() function as to why we don't
+ // explicitly check against the read offset here.
+ unsigned long cbTailBytes = min( bytesLeft, c_cbBufferSize - actualWriteOffset );
+ memcpy( m_pbBuffer + actualWriteOffset, pbSrc, cbTailBytes );
+ bytesLeft -= cbTailBytes;
+
+ if( bytesLeft )
+ {
+ memcpy( m_pbBuffer, pbSrc + cbTailBytes, bytesLeft );
+ }
+
+ // Now it's time to update the write offset, but since the updated position
+ // of the write offset will imply that there's data to be read, we need to
+ // make sure that the data all actually gets written before the update to
+ // the write offset. The writes could be reordered by the compiler (on any
+ // platform) or by the CPU (on Xbox 360). We need a barrier which prevents
+ // the writes from being reordered past each other.
+ //
+ // Having a barrier and then writing a control value is called "write-release."
+ DXUTExportBarrier();
+
+ // See comments in Read() as to why this operation isn't interlocked.
+ writeOffset += cbSrc;
+ m_writeOffset = writeOffset;
+
+ return true;
+ }
+
+private:
+ // Values derived from the buffer size template parameter
+ //
+ const static BYTE c_cbBufferSizeLog2 = min( cbBufferSizeLog2, 31 );
+ const static DWORD c_cbBufferSize = ( 1 << c_cbBufferSizeLog2 );
+ const static DWORD c_sizeMask = c_cbBufferSize - 1;
+
+ // Leave these private and undefined to prevent their use
+ DXUTLockFreePipe( const DXUTLockFreePipe& );
+ DXUTLockFreePipe& operator =( const DXUTLockFreePipe& );
+
+ // Member data
+ //
+ BYTE m_pbBuffer[c_cbBufferSize];
+ // Note that these offsets are not clamped to the buffer size.
+ // Instead the calculations rely on wrapping at ULONG_MAX+1.
+ // See the comments in Read() for details.
+ volatile DWORD __declspec( align( 4 ) ) m_readOffset;
+ volatile DWORD __declspec( align( 4 ) ) m_writeOffset;
+}; \ No newline at end of file
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.cpp b/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.cpp
new file mode 100644
index 0000000..42e8ea4
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.cpp
@@ -0,0 +1,1532 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTcamera.cpp
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#include "DXUT.h"
+#include "DXUTcamera.h"
+#include "DXUTres.h"
+#undef min // use __min instead
+#undef max // use __max instead
+
+//--------------------------------------------------------------------------------------
+CD3DArcBall::CD3DArcBall()
+{
+ Reset();
+ m_vDownPt = D3DXVECTOR3( 0, 0, 0 );
+ m_vCurrentPt = D3DXVECTOR3( 0, 0, 0 );
+ m_Offset.x = m_Offset.y = 0;
+
+ RECT rc;
+ GetClientRect( GetForegroundWindow(), &rc );
+ SetWindow( rc.right, rc.bottom );
+}
+
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CD3DArcBall::Reset()
+{
+ D3DXQuaternionIdentity( &m_qDown );
+ D3DXQuaternionIdentity( &m_qNow );
+ D3DXMatrixIdentity( &m_mRotation );
+ D3DXMatrixIdentity( &m_mTranslation );
+ D3DXMatrixIdentity( &m_mTranslationDelta );
+ m_bDrag = FALSE;
+ m_fRadiusTranslation = 1.0f;
+ m_fRadius = 1.0f;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+D3DXVECTOR3 CD3DArcBall::ScreenToVector( float fScreenPtX, float fScreenPtY )
+{
+ // Scale to screen
+ FLOAT x = -( fScreenPtX - m_Offset.x - m_nWidth / 2 ) / ( m_fRadius * m_nWidth / 2 );
+ FLOAT y = ( fScreenPtY - m_Offset.y - m_nHeight / 2 ) / ( m_fRadius * m_nHeight / 2 );
+
+ FLOAT z = 0.0f;
+ FLOAT mag = x * x + y * y;
+
+ if( mag > 1.0f )
+ {
+ FLOAT scale = 1.0f / sqrtf( mag );
+ x *= scale;
+ y *= scale;
+ }
+ else
+ z = sqrtf( 1.0f - mag );
+
+ // Return vector
+ return D3DXVECTOR3( x, y, z );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+D3DXQUATERNION CD3DArcBall::QuatFromBallPoints( const D3DXVECTOR3& vFrom, const D3DXVECTOR3& vTo )
+{
+ D3DXVECTOR3 vPart;
+ float fDot = D3DXVec3Dot( &vFrom, &vTo );
+ D3DXVec3Cross( &vPart, &vFrom, &vTo );
+
+ return D3DXQUATERNION( vPart.x, vPart.y, vPart.z, fDot );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CD3DArcBall::OnBegin( int nX, int nY )
+{
+ // Only enter the drag state if the click falls
+ // inside the click rectangle.
+ if( nX >= m_Offset.x &&
+ nX < m_Offset.x + m_nWidth &&
+ nY >= m_Offset.y &&
+ nY < m_Offset.y + m_nHeight )
+ {
+ m_bDrag = true;
+ m_qDown = m_qNow;
+ m_vDownPt = ScreenToVector( ( float )nX, ( float )nY );
+ }
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CD3DArcBall::OnMove( int nX, int nY )
+{
+ if( m_bDrag )
+ {
+ m_vCurrentPt = ScreenToVector( ( float )nX, ( float )nY );
+ m_qNow = m_qDown * QuatFromBallPoints( m_vDownPt, m_vCurrentPt );
+ }
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CD3DArcBall::OnEnd()
+{
+ m_bDrag = false;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Desc:
+//--------------------------------------------------------------------------------------
+LRESULT CD3DArcBall::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ // Current mouse position
+ int iMouseX = ( short )LOWORD( lParam );
+ int iMouseY = ( short )HIWORD( lParam );
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ SetCapture( hWnd );
+ OnBegin( iMouseX, iMouseY );
+ return TRUE;
+
+ case WM_LBUTTONUP:
+ ReleaseCapture();
+ OnEnd();
+ return TRUE;
+ case WM_CAPTURECHANGED:
+ if( ( HWND )lParam != hWnd )
+ {
+ ReleaseCapture();
+ OnEnd();
+ }
+ return TRUE;
+
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONDBLCLK:
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONDBLCLK:
+ SetCapture( hWnd );
+ // Store off the position of the cursor when the button is pressed
+ m_ptLastMouse.x = iMouseX;
+ m_ptLastMouse.y = iMouseY;
+ return TRUE;
+
+ case WM_RBUTTONUP:
+ case WM_MBUTTONUP:
+ ReleaseCapture();
+ return TRUE;
+
+ case WM_MOUSEMOVE:
+ if( MK_LBUTTON & wParam )
+ {
+ OnMove( iMouseX, iMouseY );
+ }
+ else if( ( MK_RBUTTON & wParam ) || ( MK_MBUTTON & wParam ) )
+ {
+ // Normalize based on size of window and bounding sphere radius
+ FLOAT fDeltaX = ( m_ptLastMouse.x - iMouseX ) * m_fRadiusTranslation / m_nWidth;
+ FLOAT fDeltaY = ( m_ptLastMouse.y - iMouseY ) * m_fRadiusTranslation / m_nHeight;
+
+ if( wParam & MK_RBUTTON )
+ {
+ D3DXMatrixTranslation( &m_mTranslationDelta, -2 * fDeltaX, 2 * fDeltaY, 0.0f );
+ D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta );
+ }
+ else // wParam & MK_MBUTTON
+ {
+ D3DXMatrixTranslation( &m_mTranslationDelta, 0.0f, 0.0f, 5 * fDeltaY );
+ D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta );
+ }
+
+ // Store mouse coordinate
+ m_ptLastMouse.x = iMouseX;
+ m_ptLastMouse.y = iMouseY;
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------------
+CBaseCamera::CBaseCamera()
+{
+ m_cKeysDown = 0;
+ ZeroMemory( m_aKeys, sizeof( BYTE ) * CAM_MAX_KEYS );
+ ZeroMemory( m_GamePad, sizeof( DXUT_GAMEPAD ) * DXUT_MAX_CONTROLLERS );
+
+ // Set attributes for the view matrix
+ D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
+ D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
+
+ // Setup the view matrix
+ SetViewParams( &vEyePt, &vLookatPt );
+
+ // Setup the projection matrix
+ SetProjParams( D3DX_PI / 4, 1.0f, 1.0f, 1000.0f );
+
+ GetCursorPos( &m_ptLastMousePosition );
+ m_bMouseLButtonDown = false;
+ m_bMouseMButtonDown = false;
+ m_bMouseRButtonDown = false;
+ m_nCurrentButtonMask = 0;
+ m_nMouseWheelDelta = 0;
+
+ m_fCameraYawAngle = 0.0f;
+ m_fCameraPitchAngle = 0.0f;
+
+ SetRect( &m_rcDrag, LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX );
+ m_vVelocity = D3DXVECTOR3( 0, 0, 0 );
+ m_bMovementDrag = false;
+ m_vVelocityDrag = D3DXVECTOR3( 0, 0, 0 );
+ m_fDragTimer = 0.0f;
+ m_fTotalDragTimeToZero = 0.25;
+ m_vRotVelocity = D3DXVECTOR2( 0, 0 );
+
+ m_fRotationScaler = 0.01f;
+ m_fMoveScaler = 5.0f;
+
+ m_bInvertPitch = false;
+ m_bEnableYAxisMovement = true;
+ m_bEnablePositionMovement = true;
+
+ m_vMouseDelta = D3DXVECTOR2( 0, 0 );
+ m_fFramesToSmoothMouseData = 2.0f;
+
+ m_bClipToBoundary = false;
+ m_vMinBoundary = D3DXVECTOR3( -1, -1, -1 );
+ m_vMaxBoundary = D3DXVECTOR3( 1, 1, 1 );
+
+ m_bResetCursorAfterMove = false;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Client can call this to change the position and direction of camera
+//--------------------------------------------------------------------------------------
+VOID CBaseCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt )
+{
+ if( NULL == pvEyePt || NULL == pvLookatPt )
+ return;
+
+ m_vDefaultEye = m_vEye = *pvEyePt;
+ m_vDefaultLookAt = m_vLookAt = *pvLookatPt;
+
+ // Calc the view matrix
+ D3DXVECTOR3 vUp( 0,1,0 );
+ D3DXMatrixLookAtLH( &m_mView, pvEyePt, pvLookatPt, &vUp );
+
+ D3DXMATRIX mInvView;
+ D3DXMatrixInverse( &mInvView, NULL, &m_mView );
+
+ // The axis basis vectors and camera position are stored inside the
+ // position matrix in the 4 rows of the camera's world matrix.
+ // To figure out the yaw/pitch of the camera, we just need the Z basis vector
+ D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&mInvView._31;
+
+ m_fCameraYawAngle = atan2f( pZBasis->x, pZBasis->z );
+ float fLen = sqrtf( pZBasis->z * pZBasis->z + pZBasis->x * pZBasis->x );
+ m_fCameraPitchAngle = -atan2f( pZBasis->y, fLen );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Calculates the projection matrix based on input params
+//--------------------------------------------------------------------------------------
+VOID CBaseCamera::SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane,
+ FLOAT fFarPlane )
+{
+ // Set attributes for the projection matrix
+ m_fFOV = fFOV;
+ m_fAspect = fAspect;
+ m_fNearPlane = fNearPlane;
+ m_fFarPlane = fFarPlane;
+
+ D3DXMatrixPerspectiveFovLH( &m_mProj, fFOV, fAspect, fNearPlane, fFarPlane );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Call this from your message proc so this class can handle window messages
+//--------------------------------------------------------------------------------------
+LRESULT CBaseCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ UNREFERENCED_PARAMETER( hWnd );
+ UNREFERENCED_PARAMETER( lParam );
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ // Map this key to a D3DUtil_CameraKeys enum and update the
+ // state of m_aKeys[] by adding the KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK mask
+ // only if the key is not down
+ D3DUtil_CameraKeys mappedKey = MapKey( ( UINT )wParam );
+ if( mappedKey != CAM_UNKNOWN )
+ {
+ if( FALSE == IsKeyDown( m_aKeys[mappedKey] ) )
+ {
+ m_aKeys[ mappedKey ] = KEY_WAS_DOWN_MASK | KEY_IS_DOWN_MASK;
+ ++m_cKeysDown;
+ }
+ }
+ break;
+ }
+
+ case WM_KEYUP:
+ {
+ // Map this key to a D3DUtil_CameraKeys enum and update the
+ // state of m_aKeys[] by removing the KEY_IS_DOWN_MASK mask.
+ D3DUtil_CameraKeys mappedKey = MapKey( ( UINT )wParam );
+ if( mappedKey != CAM_UNKNOWN && ( DWORD )mappedKey < 8 )
+ {
+ m_aKeys[ mappedKey ] &= ~KEY_IS_DOWN_MASK;
+ --m_cKeysDown;
+ }
+ break;
+ }
+
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_LBUTTONDOWN:
+ case WM_RBUTTONDBLCLK:
+ case WM_MBUTTONDBLCLK:
+ case WM_LBUTTONDBLCLK:
+ {
+ // Compute the drag rectangle in screen coord.
+ POINT ptCursor =
+ {
+ ( short )LOWORD( lParam ), ( short )HIWORD( lParam )
+ };
+
+ // Update member var state
+ if( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) )
+ {
+ m_bMouseLButtonDown = true; m_nCurrentButtonMask |= MOUSE_LEFT_BUTTON;
+ }
+ if( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) )
+ {
+ m_bMouseMButtonDown = true; m_nCurrentButtonMask |= MOUSE_MIDDLE_BUTTON;
+ }
+ if( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) )
+ {
+ m_bMouseRButtonDown = true; m_nCurrentButtonMask |= MOUSE_RIGHT_BUTTON;
+ }
+
+ // Capture the mouse, so if the mouse button is
+ // released outside the window, we'll get the WM_LBUTTONUP message
+ SetCapture( hWnd );
+ GetCursorPos( &m_ptLastMousePosition );
+ return TRUE;
+ }
+
+ case WM_RBUTTONUP:
+ case WM_MBUTTONUP:
+ case WM_LBUTTONUP:
+ {
+ // Update member var state
+ if( uMsg == WM_LBUTTONUP )
+ {
+ m_bMouseLButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_LEFT_BUTTON;
+ }
+ if( uMsg == WM_MBUTTONUP )
+ {
+ m_bMouseMButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_MIDDLE_BUTTON;
+ }
+ if( uMsg == WM_RBUTTONUP )
+ {
+ m_bMouseRButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_RIGHT_BUTTON;
+ }
+
+ // Release the capture if no mouse buttons down
+ if( !m_bMouseLButtonDown &&
+ !m_bMouseRButtonDown &&
+ !m_bMouseMButtonDown )
+ {
+ ReleaseCapture();
+ }
+ break;
+ }
+
+ case WM_CAPTURECHANGED:
+ {
+ if( ( HWND )lParam != hWnd )
+ {
+ if( ( m_nCurrentButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( m_nCurrentButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( m_nCurrentButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_bMouseLButtonDown = false;
+ m_bMouseMButtonDown = false;
+ m_bMouseRButtonDown = false;
+ m_nCurrentButtonMask &= ~MOUSE_LEFT_BUTTON;
+ m_nCurrentButtonMask &= ~MOUSE_MIDDLE_BUTTON;
+ m_nCurrentButtonMask &= ~MOUSE_RIGHT_BUTTON;
+ ReleaseCapture();
+ }
+ }
+ break;
+ }
+
+ case WM_MOUSEWHEEL:
+ // Update member var state
+ m_nMouseWheelDelta += ( short )HIWORD( wParam );
+ break;
+ }
+
+ return FALSE;
+}
+
+//--------------------------------------------------------------------------------------
+// Figure out the velocity based on keyboard input & drag if any
+//--------------------------------------------------------------------------------------
+void CBaseCamera::GetInput( bool bGetKeyboardInput, bool bGetMouseInput, bool bGetGamepadInput,
+ bool bResetCursorAfterMove )
+{
+ m_vKeyboardDirection = D3DXVECTOR3( 0, 0, 0 );
+ if( bGetKeyboardInput )
+ {
+ // Update acceleration vector based on keyboard state
+ if( IsKeyDown( m_aKeys[CAM_MOVE_FORWARD] ) )
+ m_vKeyboardDirection.z += 1.0f;
+ if( IsKeyDown( m_aKeys[CAM_MOVE_BACKWARD] ) )
+ m_vKeyboardDirection.z -= 1.0f;
+ if( m_bEnableYAxisMovement )
+ {
+ if( IsKeyDown( m_aKeys[CAM_MOVE_UP] ) )
+ m_vKeyboardDirection.y += 1.0f;
+ if( IsKeyDown( m_aKeys[CAM_MOVE_DOWN] ) )
+ m_vKeyboardDirection.y -= 1.0f;
+ }
+ if( IsKeyDown( m_aKeys[CAM_STRAFE_RIGHT] ) )
+ m_vKeyboardDirection.x += 1.0f;
+ if( IsKeyDown( m_aKeys[CAM_STRAFE_LEFT] ) )
+ m_vKeyboardDirection.x -= 1.0f;
+ }
+
+ if( bGetMouseInput )
+ {
+ UpdateMouseDelta();
+ }
+
+ if( bGetGamepadInput )
+ {
+ m_vGamePadLeftThumb = D3DXVECTOR3( 0, 0, 0 );
+ m_vGamePadRightThumb = D3DXVECTOR3( 0, 0, 0 );
+
+ // Get controller state
+ for( DWORD iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ )
+ {
+ DXUTGetGamepadState( iUserIndex, &m_GamePad[iUserIndex], true, true );
+
+ // Mark time if the controller is in a non-zero state
+ if( m_GamePad[iUserIndex].wButtons ||
+ m_GamePad[iUserIndex].sThumbLX || m_GamePad[iUserIndex].sThumbLX ||
+ m_GamePad[iUserIndex].sThumbRX || m_GamePad[iUserIndex].sThumbRY ||
+ m_GamePad[iUserIndex].bLeftTrigger || m_GamePad[iUserIndex].bRightTrigger )
+ {
+ m_GamePadLastActive[iUserIndex] = DXUTGetTime();
+ }
+ }
+
+ // Find out which controller was non-zero last
+ int iMostRecentlyActive = -1;
+ double fMostRecentlyActiveTime = 0.0f;
+ for( DWORD iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ )
+ {
+ if( m_GamePadLastActive[iUserIndex] > fMostRecentlyActiveTime )
+ {
+ fMostRecentlyActiveTime = m_GamePadLastActive[iUserIndex];
+ iMostRecentlyActive = iUserIndex;
+ }
+ }
+
+ // Use the most recent non-zero controller if its connected
+ if( iMostRecentlyActive >= 0 && m_GamePad[iMostRecentlyActive].bConnected )
+ {
+ m_vGamePadLeftThumb.x = m_GamePad[iMostRecentlyActive].fThumbLX;
+ m_vGamePadLeftThumb.y = 0.0f;
+ m_vGamePadLeftThumb.z = m_GamePad[iMostRecentlyActive].fThumbLY;
+
+ m_vGamePadRightThumb.x = m_GamePad[iMostRecentlyActive].fThumbRX;
+ m_vGamePadRightThumb.y = 0.0f;
+ m_vGamePadRightThumb.z = m_GamePad[iMostRecentlyActive].fThumbRY;
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Figure out the mouse delta based on mouse movement
+//--------------------------------------------------------------------------------------
+void CBaseCamera::UpdateMouseDelta()
+{
+ POINT ptCurMouseDelta;
+ POINT ptCurMousePos;
+
+ // Get current position of mouse
+ GetCursorPos( &ptCurMousePos );
+
+ // Calc how far it's moved since last frame
+ ptCurMouseDelta.x = ptCurMousePos.x - m_ptLastMousePosition.x;
+ ptCurMouseDelta.y = ptCurMousePos.y - m_ptLastMousePosition.y;
+
+ // Record current position for next time
+ m_ptLastMousePosition = ptCurMousePos;
+
+ if( m_bResetCursorAfterMove && DXUTIsActive() )
+ {
+ // Set position of camera to center of desktop,
+ // so it always has room to move. This is very useful
+ // if the cursor is hidden. If this isn't done and cursor is hidden,
+ // then invisible cursor will hit the edge of the screen
+ // and the user can't tell what happened
+ POINT ptCenter;
+
+ // Get the center of the current monitor
+ MONITORINFO mi;
+ mi.cbSize = sizeof( MONITORINFO );
+ DXUTGetMonitorInfo( DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTONEAREST ), &mi );
+ ptCenter.x = ( mi.rcMonitor.left + mi.rcMonitor.right ) / 2;
+ ptCenter.y = ( mi.rcMonitor.top + mi.rcMonitor.bottom ) / 2;
+ SetCursorPos( ptCenter.x, ptCenter.y );
+ m_ptLastMousePosition = ptCenter;
+ }
+
+ // Smooth the relative mouse data over a few frames so it isn't
+ // jerky when moving slowly at low frame rates.
+ float fPercentOfNew = 1.0f / m_fFramesToSmoothMouseData;
+ float fPercentOfOld = 1.0f - fPercentOfNew;
+ m_vMouseDelta.x = m_vMouseDelta.x * fPercentOfOld + ptCurMouseDelta.x * fPercentOfNew;
+ m_vMouseDelta.y = m_vMouseDelta.y * fPercentOfOld + ptCurMouseDelta.y * fPercentOfNew;
+
+ m_vRotVelocity = m_vMouseDelta * m_fRotationScaler;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Figure out the velocity based on keyboard input & drag if any
+//--------------------------------------------------------------------------------------
+void CBaseCamera::UpdateVelocity( float fElapsedTime )
+{
+ D3DXMATRIX mRotDelta;
+ D3DXVECTOR2 vGamePadRightThumb = D3DXVECTOR2( m_vGamePadRightThumb.x, -m_vGamePadRightThumb.z );
+ m_vRotVelocity = m_vMouseDelta * m_fRotationScaler + vGamePadRightThumb * 0.02f;
+
+ D3DXVECTOR3 vAccel = m_vKeyboardDirection + m_vGamePadLeftThumb;
+
+ // Normalize vector so if moving 2 dirs (left & forward),
+ // the camera doesn't move faster than if moving in 1 dir
+ D3DXVec3Normalize( &vAccel, &vAccel );
+
+ // Scale the acceleration vector
+ vAccel *= m_fMoveScaler;
+
+ if( m_bMovementDrag )
+ {
+ // Is there any acceleration this frame?
+ if( D3DXVec3LengthSq( &vAccel ) > 0 )
+ {
+ // If so, then this means the user has pressed a movement key\
+ // so change the velocity immediately to acceleration
+ // upon keyboard input. This isn't normal physics
+ // but it will give a quick response to keyboard input
+ m_vVelocity = vAccel;
+ m_fDragTimer = m_fTotalDragTimeToZero;
+ m_vVelocityDrag = vAccel / m_fDragTimer;
+ }
+ else
+ {
+ // If no key being pressed, then slowly decrease velocity to 0
+ if( m_fDragTimer > 0 )
+ {
+ // Drag until timer is <= 0
+ m_vVelocity -= m_vVelocityDrag * fElapsedTime;
+ m_fDragTimer -= fElapsedTime;
+ }
+ else
+ {
+ // Zero velocity
+ m_vVelocity = D3DXVECTOR3( 0, 0, 0 );
+ }
+ }
+ }
+ else
+ {
+ // No drag, so immediately change the velocity
+ m_vVelocity = vAccel;
+ }
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Clamps pV to lie inside m_vMinBoundary & m_vMaxBoundary
+//--------------------------------------------------------------------------------------
+void CBaseCamera::ConstrainToBoundary( D3DXVECTOR3* pV )
+{
+ // Constrain vector to a bounding box
+ pV->x = __max( pV->x, m_vMinBoundary.x );
+ pV->y = __max( pV->y, m_vMinBoundary.y );
+ pV->z = __max( pV->z, m_vMinBoundary.z );
+
+ pV->x = __min( pV->x, m_vMaxBoundary.x );
+ pV->y = __min( pV->y, m_vMaxBoundary.y );
+ pV->z = __min( pV->z, m_vMaxBoundary.z );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Maps a windows virtual key to an enum
+//--------------------------------------------------------------------------------------
+D3DUtil_CameraKeys CBaseCamera::MapKey( UINT nKey )
+{
+ // This could be upgraded to a method that's user-definable but for
+ // simplicity, we'll use a hardcoded mapping.
+ switch( nKey )
+ {
+ case VK_CONTROL:
+ return CAM_CONTROLDOWN;
+ case VK_LEFT:
+ return CAM_STRAFE_LEFT;
+ case VK_RIGHT:
+ return CAM_STRAFE_RIGHT;
+ case VK_UP:
+ return CAM_MOVE_FORWARD;
+ case VK_DOWN:
+ return CAM_MOVE_BACKWARD;
+ case VK_PRIOR:
+ return CAM_MOVE_UP; // pgup
+ case VK_NEXT:
+ return CAM_MOVE_DOWN; // pgdn
+
+ case 'A':
+ return CAM_STRAFE_LEFT;
+ case 'D':
+ return CAM_STRAFE_RIGHT;
+ case 'W':
+ return CAM_MOVE_FORWARD;
+ case 'S':
+ return CAM_MOVE_BACKWARD;
+ case 'Q':
+ return CAM_MOVE_DOWN;
+ case 'E':
+ return CAM_MOVE_UP;
+
+ case VK_NUMPAD4:
+ return CAM_STRAFE_LEFT;
+ case VK_NUMPAD6:
+ return CAM_STRAFE_RIGHT;
+ case VK_NUMPAD8:
+ return CAM_MOVE_FORWARD;
+ case VK_NUMPAD2:
+ return CAM_MOVE_BACKWARD;
+ case VK_NUMPAD9:
+ return CAM_MOVE_UP;
+ case VK_NUMPAD3:
+ return CAM_MOVE_DOWN;
+
+ case VK_HOME:
+ return CAM_RESET;
+ }
+
+ return CAM_UNKNOWN;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Reset the camera's position back to the default
+//--------------------------------------------------------------------------------------
+VOID CBaseCamera::Reset()
+{
+ SetViewParams( &m_vDefaultEye, &m_vDefaultLookAt );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------------
+CFirstPersonCamera::CFirstPersonCamera() : m_nActiveButtonMask( 0x07 )
+{
+ m_bRotateWithoutButtonDown = false;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Update the view matrix based on user input & elapsed time
+//--------------------------------------------------------------------------------------
+VOID CFirstPersonCamera::FrameMove( FLOAT fElapsedTime )
+{
+ if( DXUTGetGlobalTimer()->IsStopped() ) {
+ if (DXUTGetFPS() == 0.0f) fElapsedTime = 0;
+ else fElapsedTime = 1.0f / DXUTGetFPS();
+ }
+
+ if( IsKeyDown( m_aKeys[CAM_RESET] ) )
+ Reset();
+
+ // Get keyboard/mouse/gamepad input
+ GetInput( m_bEnablePositionMovement, ( m_nActiveButtonMask & m_nCurrentButtonMask ) || m_bRotateWithoutButtonDown,
+ true, m_bResetCursorAfterMove );
+
+ //// Get the mouse movement (if any) if the mouse button are down
+ //if( (m_nActiveButtonMask & m_nCurrentButtonMask) || m_bRotateWithoutButtonDown )
+ // UpdateMouseDelta( fElapsedTime );
+
+ // Get amount of velocity based on the keyboard input and drag (if any)
+ UpdateVelocity( fElapsedTime );
+
+ // Simple euler method to calculate position delta
+ D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime;
+
+ // If rotating the camera
+ if( ( m_nActiveButtonMask & m_nCurrentButtonMask ) ||
+ m_bRotateWithoutButtonDown ||
+ m_vGamePadRightThumb.x != 0 ||
+ m_vGamePadRightThumb.z != 0 )
+ {
+ // Update the pitch & yaw angle based on mouse movement
+ float fYawDelta = m_vRotVelocity.x;
+ float fPitchDelta = m_vRotVelocity.y;
+
+ // Invert pitch if requested
+ if( m_bInvertPitch )
+ fPitchDelta = -fPitchDelta;
+
+ m_fCameraPitchAngle += fPitchDelta;
+ m_fCameraYawAngle += fYawDelta;
+
+ // Limit pitch to straight up or straight down
+ m_fCameraPitchAngle = __max( -D3DX_PI / 2.0f, m_fCameraPitchAngle );
+ m_fCameraPitchAngle = __min( +D3DX_PI / 2.0f, m_fCameraPitchAngle );
+ }
+
+ // Make a rotation matrix based on the camera's yaw & pitch
+ D3DXMATRIX mCameraRot;
+ D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, m_fCameraPitchAngle, 0 );
+
+ // Transform vectors based on camera's rotation matrix
+ D3DXVECTOR3 vWorldUp, vWorldAhead;
+ D3DXVECTOR3 vLocalUp = D3DXVECTOR3( 0, 1, 0 );
+ D3DXVECTOR3 vLocalAhead = D3DXVECTOR3( 0, 0, 1 );
+ D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot );
+ D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot );
+
+ // Transform the position delta by the camera's rotation
+ D3DXVECTOR3 vPosDeltaWorld;
+ if( !m_bEnableYAxisMovement )
+ {
+ // If restricting Y movement, do not include pitch
+ // when transforming position delta vector.
+ D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, 0.0f, 0.0f );
+ }
+ D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot );
+
+ // Move the eye position
+ m_vEye += vPosDeltaWorld;
+ if( m_bClipToBoundary )
+ ConstrainToBoundary( &m_vEye );
+
+ // Update the lookAt position based on the eye position
+ m_vLookAt = m_vEye + vWorldAhead;
+
+ // Update the view matrix
+ D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp );
+
+ D3DXMatrixInverse( &m_mCameraWorld, NULL, &m_mView );
+}
+
+
+//--------------------------------------------------------------------------------------
+// Enable or disable each of the mouse buttons for rotation drag.
+//--------------------------------------------------------------------------------------
+void CFirstPersonCamera::SetRotateButtons( bool bLeft, bool bMiddle, bool bRight, bool bRotateWithoutButtonDown )
+{
+ m_nActiveButtonMask = ( bLeft ? MOUSE_LEFT_BUTTON : 0 ) |
+ ( bMiddle ? MOUSE_MIDDLE_BUTTON : 0 ) |
+ ( bRight ? MOUSE_RIGHT_BUTTON : 0 );
+ m_bRotateWithoutButtonDown = bRotateWithoutButtonDown;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Constructor
+//--------------------------------------------------------------------------------------
+CModelViewerCamera::CModelViewerCamera()
+{
+ D3DXMatrixIdentity( &m_mWorld );
+ D3DXMatrixIdentity( &m_mModelRot );
+ D3DXMatrixIdentity( &m_mModelLastRot );
+ D3DXMatrixIdentity( &m_mCameraRotLast );
+ m_vModelCenter = D3DXVECTOR3( 0, 0, 0 );
+ m_fRadius = 5.0f;
+ m_fDefaultRadius = 5.0f;
+ m_fMinRadius = 1.0f;
+ m_fMaxRadius = FLT_MAX;
+ m_bLimitPitch = false;
+ m_bEnablePositionMovement = false;
+ m_bAttachCameraToModel = false;
+
+ m_nRotateModelButtonMask = MOUSE_LEFT_BUTTON;
+ m_nZoomButtonMask = MOUSE_WHEEL;
+ m_nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON;
+ m_bDragSinceLastUpdate = true;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Update the view matrix & the model's world matrix based
+// on user input & elapsed time
+//--------------------------------------------------------------------------------------
+VOID CModelViewerCamera::FrameMove( FLOAT fElapsedTime )
+{
+ if( IsKeyDown( m_aKeys[CAM_RESET] ) )
+ Reset();
+
+ if (0 == m_cKeysDown)
+ {
+ // Simulate motion for the video
+ m_WorldArcBall.OnBegin(0, 0);
+ m_WorldArcBall.OnMove(1, 1);
+ m_WorldArcBall.OnEnd();
+ }
+
+ m_bDragSinceLastUpdate = false;
+
+ //// If no mouse button is held down,
+ //// Get the mouse movement (if any) if the mouse button are down
+ //if( m_nCurrentButtonMask != 0 )
+ // UpdateMouseDelta( fElapsedTime );
+
+ GetInput( m_bEnablePositionMovement, m_nCurrentButtonMask != 0, true, false );
+
+ // Get amount of velocity based on the keyboard input and drag (if any)
+ UpdateVelocity( fElapsedTime );
+
+ // Simple euler method to calculate position delta
+ D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime;
+
+ // Change the radius from the camera to the model based on wheel scrolling
+ if( m_nMouseWheelDelta && m_nZoomButtonMask == MOUSE_WHEEL )
+ m_fRadius -= m_nMouseWheelDelta * m_fRadius * 0.1f / 120.0f;
+ m_fRadius = __min( m_fMaxRadius, m_fRadius );
+ m_fRadius = __max( m_fMinRadius, m_fRadius );
+ m_nMouseWheelDelta = 0;
+
+ // Get the inverse of the arcball's rotation matrix
+ D3DXMATRIX mCameraRot;
+ D3DXMatrixInverse( &mCameraRot, NULL, m_ViewArcBall.GetRotationMatrix() );
+
+ // Transform vectors based on camera's rotation matrix
+ D3DXVECTOR3 vWorldUp, vWorldAhead;
+ D3DXVECTOR3 vLocalUp = D3DXVECTOR3( 0, 1, 0 );
+ D3DXVECTOR3 vLocalAhead = D3DXVECTOR3( 0, 0, 1 );
+ D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot );
+ D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot );
+
+ // Transform the position delta by the camera's rotation
+ D3DXVECTOR3 vPosDeltaWorld;
+ D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot );
+
+ // Move the lookAt position
+ m_vLookAt += vPosDeltaWorld;
+ if( m_bClipToBoundary )
+ ConstrainToBoundary( &m_vLookAt );
+
+ // Update the eye point based on a radius away from the lookAt position
+ m_vEye = m_vLookAt - vWorldAhead * m_fRadius;
+
+ // Update the view matrix
+ D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp );
+
+ D3DXMATRIX mInvView;
+ D3DXMatrixInverse( &mInvView, NULL, &m_mView );
+ mInvView._41 = mInvView._42 = mInvView._43 = 0;
+
+ D3DXMATRIX mModelLastRotInv;
+ D3DXMatrixInverse( &mModelLastRotInv, NULL, &m_mModelLastRot );
+
+ // Accumulate the delta of the arcball's rotation in view space.
+ // Note that per-frame delta rotations could be problematic over long periods of time.
+ D3DXMATRIX mModelRot;
+ mModelRot = *m_WorldArcBall.GetRotationMatrix();
+ m_mModelRot *= m_mView * mModelLastRotInv * mModelRot * mInvView;
+
+ if( m_ViewArcBall.IsBeingDragged() && m_bAttachCameraToModel && !IsKeyDown( m_aKeys[CAM_CONTROLDOWN] ) )
+ {
+ // Attach camera to model by inverse of the model rotation
+ D3DXMATRIX mCameraLastRotInv;
+ D3DXMatrixInverse( &mCameraLastRotInv, NULL, &m_mCameraRotLast );
+ D3DXMATRIX mCameraRotDelta = mCameraLastRotInv * mCameraRot; // local to world matrix
+ m_mModelRot *= mCameraRotDelta;
+ }
+ m_mCameraRotLast = mCameraRot;
+
+ m_mModelLastRot = mModelRot;
+
+ // Since we're accumulating delta rotations, we need to orthonormalize
+ // the matrix to prevent eventual matrix skew
+ D3DXVECTOR3* pXBasis = ( D3DXVECTOR3* )&m_mModelRot._11;
+ D3DXVECTOR3* pYBasis = ( D3DXVECTOR3* )&m_mModelRot._21;
+ D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&m_mModelRot._31;
+ D3DXVec3Normalize( pXBasis, pXBasis );
+ D3DXVec3Cross( pYBasis, pZBasis, pXBasis );
+ D3DXVec3Normalize( pYBasis, pYBasis );
+ D3DXVec3Cross( pZBasis, pXBasis, pYBasis );
+
+ // Translate the rotation matrix to the same position as the lookAt position
+ m_mModelRot._41 = m_vLookAt.x;
+ m_mModelRot._42 = m_vLookAt.y;
+ m_mModelRot._43 = m_vLookAt.z;
+
+ // Translate world matrix so its at the center of the model
+ D3DXMATRIX mTrans;
+ D3DXMatrixTranslation( &mTrans, -m_vModelCenter.x, -m_vModelCenter.y, -m_vModelCenter.z );
+ m_mWorld = mTrans * m_mModelRot;
+}
+
+
+void CModelViewerCamera::SetDragRect( RECT& rc )
+{
+ CBaseCamera::SetDragRect( rc );
+
+ m_WorldArcBall.SetOffset( rc.left, rc.top );
+ m_ViewArcBall.SetOffset( rc.left, rc.top );
+ SetWindow( rc.right - rc.left, rc.bottom - rc.top );
+}
+
+
+//--------------------------------------------------------------------------------------
+// Reset the camera's position back to the default
+//--------------------------------------------------------------------------------------
+VOID CModelViewerCamera::Reset()
+{
+ CBaseCamera::Reset();
+
+ D3DXMatrixIdentity( &m_mWorld );
+ D3DXMatrixIdentity( &m_mModelRot );
+ D3DXMatrixIdentity( &m_mModelLastRot );
+ D3DXMatrixIdentity( &m_mCameraRotLast );
+
+ m_fRadius = m_fDefaultRadius;
+ m_WorldArcBall.Reset();
+ m_ViewArcBall.Reset();
+}
+
+
+//--------------------------------------------------------------------------------------
+// Override for setting the view parameters
+//--------------------------------------------------------------------------------------
+void CModelViewerCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt )
+{
+ CBaseCamera::SetViewParams( pvEyePt, pvLookatPt );
+
+ // Propogate changes to the member arcball
+ D3DXQUATERNION quat;
+ D3DXMATRIXA16 mRotation;
+ D3DXVECTOR3 vUp( 0,1,0 );
+ D3DXMatrixLookAtLH( &mRotation, pvEyePt, pvLookatPt, &vUp );
+ D3DXQuaternionRotationMatrix( &quat, &mRotation );
+ m_ViewArcBall.SetQuatNow( quat );
+
+ // Set the radius according to the distance
+ D3DXVECTOR3 vEyeToPoint;
+ D3DXVec3Subtract( &vEyeToPoint, pvLookatPt, pvEyePt );
+ SetRadius( D3DXVec3Length( &vEyeToPoint ) );
+
+ // View information changed. FrameMove should be called.
+ m_bDragSinceLastUpdate = true;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+// Call this from your message proc so this class can handle window messages
+//--------------------------------------------------------------------------------------
+LRESULT CModelViewerCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ CBaseCamera::HandleMessages( hWnd, uMsg, wParam, lParam );
+
+ if( ( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ int iMouseX = ( short )LOWORD( lParam );
+ int iMouseY = ( short )HIWORD( lParam );
+ m_WorldArcBall.OnBegin( iMouseX, iMouseY );
+ }
+
+ if( ( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) &&
+ m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ int iMouseX = ( short )LOWORD( lParam );
+ int iMouseY = ( short )HIWORD( lParam );
+ m_ViewArcBall.OnBegin( iMouseX, iMouseY );
+ }
+
+ if( uMsg == WM_MOUSEMOVE )
+ {
+ int iMouseX = ( short )LOWORD( lParam );
+ int iMouseY = ( short )HIWORD( lParam );
+ m_WorldArcBall.OnMove( iMouseX, iMouseY );
+ m_ViewArcBall.OnMove( iMouseX, iMouseY );
+ }
+
+ if( ( uMsg == WM_LBUTTONUP && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( uMsg == WM_MBUTTONUP && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( uMsg == WM_RBUTTONUP && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_WorldArcBall.OnEnd();
+ }
+
+ if( ( uMsg == WM_LBUTTONUP && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( uMsg == WM_MBUTTONUP && m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( uMsg == WM_RBUTTONUP && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_ViewArcBall.OnEnd();
+ }
+
+ if( uMsg == WM_CAPTURECHANGED )
+ {
+ if( ( HWND )lParam != hWnd )
+ {
+ if( ( m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_WorldArcBall.OnEnd();
+ }
+
+ if( ( m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) ||
+ ( m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_ViewArcBall.OnEnd();
+ }
+ }
+ }
+
+ if( uMsg == WM_LBUTTONDOWN ||
+ uMsg == WM_LBUTTONDBLCLK ||
+ uMsg == WM_MBUTTONDOWN ||
+ uMsg == WM_MBUTTONDBLCLK ||
+ uMsg == WM_RBUTTONDOWN ||
+ uMsg == WM_RBUTTONDBLCLK ||
+ uMsg == WM_LBUTTONUP ||
+ uMsg == WM_MBUTTONUP ||
+ uMsg == WM_RBUTTONUP ||
+ uMsg == WM_MOUSEWHEEL ||
+ uMsg == WM_MOUSEMOVE )
+ {
+ m_bDragSinceLastUpdate = true;
+ }
+
+ return FALSE;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+// D3D9
+IDirect3DDevice9* CDXUTDirectionWidget::s_pd3d9Device = NULL;
+ID3DXEffect* CDXUTDirectionWidget::s_pD3D9Effect = NULL;
+ID3DXMesh* CDXUTDirectionWidget::s_pD3D9Mesh = NULL;
+D3DXHANDLE CDXUTDirectionWidget::s_hRenderWith1LightNoTexture = NULL;
+D3DXHANDLE CDXUTDirectionWidget::s_hMaterialDiffuseColor = NULL;
+D3DXHANDLE CDXUTDirectionWidget::s_hLightDir = NULL;
+D3DXHANDLE CDXUTDirectionWidget::s_hWorldViewProjection = NULL;
+D3DXHANDLE CDXUTDirectionWidget::s_hWorld = NULL;
+
+
+//--------------------------------------------------------------------------------------
+CDXUTDirectionWidget::CDXUTDirectionWidget()
+{
+ m_fRadius = 1.0f;
+ m_vDefaultDir = D3DXVECTOR3( 0, 1, 0 );
+ m_vCurrentDir = m_vDefaultDir;
+ m_nRotateMask = MOUSE_RIGHT_BUTTON;
+
+ D3DXMatrixIdentity( &m_mView );
+ D3DXMatrixIdentity( &m_mRot );
+ D3DXMatrixIdentity( &m_mRotSnapshot );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::StaticOnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice )
+{
+ HRESULT hr;
+
+ s_pd3d9Device = pd3dDevice;
+
+ const char* g_strBuffer =
+ "float4 g_MaterialDiffuseColor; // Material's diffuse color\r\n"
+ "float3 g_LightDir; // Light's direction in world space\r\n"
+ "float4x4 g_mWorld; // World matrix for object\r\n"
+ "float4x4 g_mWorldViewProjection; // World * View * Projection matrix\r\n"
+ "\r\n"
+ "struct VS_OUTPUT\r\n"
+ "{\r\n"
+ " float4 Position : POSITION; // vertex position\r\n"
+ " float4 Diffuse : COLOR0; // vertex diffuse color\r\n"
+ "};\r\n"
+ "\r\n"
+ "VS_OUTPUT RenderWith1LightNoTextureVS( float4 vPos : POSITION,\r\n"
+ " float3 vNormal : NORMAL )\r\n"
+ "{\r\n"
+ " VS_OUTPUT Output;\r\n"
+ "\r\n"
+ " // Transform the position from object space to homogeneous projection space\r\n"
+ " Output.Position = mul(vPos, g_mWorldViewProjection);\r\n"
+ "\r\n"
+ " // Transform the normal from object space to world space\r\n"
+ " float3 vNormalWorldSpace;\r\n"
+ " vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space)\r\n"
+ "\r\n"
+ " // Compute simple directional lighting equation\r\n"
+ " Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir));\r\n"
+ " Output.Diffuse.a = 1.0f;\r\n"
+ "\r\n"
+ " return Output;\r\n"
+ "}\r\n"
+ "\r\n"
+ "float4 RenderWith1LightNoTexturePS( float4 Diffuse : COLOR0 ) : COLOR0\r\n"
+ "{\r\n"
+ " return Diffuse;\r\n"
+ "}\r\n"
+ "\r\n"
+ "technique RenderWith1LightNoTexture\r\n"
+ "{\r\n"
+ " pass P0\r\n"
+ " {\r\n"
+ " VertexShader = compile vs_2_0 RenderWith1LightNoTextureVS();\r\n"
+ " PixelShader = compile ps_2_0 RenderWith1LightNoTexturePS();\r\n"
+ " }\r\n"
+ "}\r\n"
+ "";
+
+ UINT dwBufferSize = ( UINT )strlen( g_strBuffer ) + 1;
+
+ DWORD Flags = D3DXFX_NOT_CLONEABLE;
+#ifdef D3DXFX_LARGEADDRESS_HANDLE
+ Flags |= D3DXFX_LARGEADDRESSAWARE;
+#endif
+
+ V_RETURN( D3DXCreateEffect( s_pd3d9Device, g_strBuffer, dwBufferSize, NULL, NULL, Flags,
+ NULL, &s_pD3D9Effect, NULL ) );
+
+ // Save technique handles for use when rendering
+ s_hRenderWith1LightNoTexture = s_pD3D9Effect->GetTechniqueByName( "RenderWith1LightNoTexture" );
+ s_hMaterialDiffuseColor = s_pD3D9Effect->GetParameterByName( NULL, "g_MaterialDiffuseColor" );
+ s_hLightDir = s_pD3D9Effect->GetParameterByName( NULL, "g_LightDir" );
+ s_hWorld = s_pD3D9Effect->GetParameterByName( NULL, "g_mWorld" );
+ s_hWorldViewProjection = s_pD3D9Effect->GetParameterByName( NULL, "g_mWorldViewProjection" );
+
+ // Load the mesh with D3DX and get back a ID3DXMesh*. For this
+ // sample we'll ignore the X file's embedded materials since we know
+ // exactly the model we're loading. See the mesh samples such as
+ // "OptimizedMesh" for a more generic mesh loading example.
+ V_RETURN( DXUTCreateArrowMeshFromInternalArray( s_pd3d9Device, &s_pD3D9Mesh ) );
+
+ // Optimize the mesh for this graphics card's vertex cache
+ // so when rendering the mesh's triangle list the vertices will
+ // cache hit more often so it won't have to re-execute the vertex shader
+ // on those vertices so it will improve perf.
+ DWORD* rgdwAdjacency = new DWORD[s_pD3D9Mesh->GetNumFaces() * 3];
+ if( rgdwAdjacency == NULL )
+ return E_OUTOFMEMORY;
+ V( s_pD3D9Mesh->GenerateAdjacency( 1e-6f, rgdwAdjacency ) );
+ V( s_pD3D9Mesh->OptimizeInplace( D3DXMESHOPT_VERTEXCACHE, rgdwAdjacency, NULL, NULL, NULL ) );
+ delete []rgdwAdjacency;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::OnD3D9ResetDevice( const D3DSURFACE_DESC* pBackBufferSurfaceDesc )
+{
+ m_ArcBall.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDirectionWidget::StaticOnD3D9LostDevice()
+{
+ if( s_pD3D9Effect )
+ s_pD3D9Effect->OnLostDevice();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDirectionWidget::StaticOnD3D9DestroyDevice()
+{
+ SAFE_RELEASE( s_pD3D9Effect );
+ SAFE_RELEASE( s_pD3D9Mesh );
+}
+
+
+//--------------------------------------------------------------------------------------
+LRESULT CDXUTDirectionWidget::HandleMessages( HWND hWnd, UINT uMsg,
+ WPARAM wParam, LPARAM lParam )
+{
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ {
+ if( ( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) != 0 && uMsg == WM_LBUTTONDOWN ) ||
+ ( ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) != 0 && uMsg == WM_MBUTTONDOWN ) ||
+ ( ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) != 0 && uMsg == WM_RBUTTONDOWN ) )
+ {
+ int iMouseX = ( int )( short )LOWORD( lParam );
+ int iMouseY = ( int )( short )HIWORD( lParam );
+ m_ArcBall.OnBegin( iMouseX, iMouseY );
+ SetCapture( hWnd );
+ }
+ return TRUE;
+ }
+
+ case WM_MOUSEMOVE:
+ {
+ if( m_ArcBall.IsBeingDragged() )
+ {
+ int iMouseX = ( int )( short )LOWORD( lParam );
+ int iMouseY = ( int )( short )HIWORD( lParam );
+ m_ArcBall.OnMove( iMouseX, iMouseY );
+ UpdateLightDir();
+ }
+ return TRUE;
+ }
+
+ case WM_LBUTTONUP:
+ case WM_MBUTTONUP:
+ case WM_RBUTTONUP:
+ {
+ if( ( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) != 0 && uMsg == WM_LBUTTONUP ) ||
+ ( ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) != 0 && uMsg == WM_MBUTTONUP ) ||
+ ( ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) != 0 && uMsg == WM_RBUTTONUP ) )
+ {
+ m_ArcBall.OnEnd();
+ ReleaseCapture();
+ }
+
+ UpdateLightDir();
+ return TRUE;
+ }
+
+ case WM_CAPTURECHANGED:
+ {
+ if( ( HWND )lParam != hWnd )
+ {
+ if( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) ||
+ ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) ||
+ ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) )
+ {
+ m_ArcBall.OnEnd();
+ ReleaseCapture();
+ }
+ }
+ return TRUE;
+ }
+ }
+
+ return 0;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::OnRender9( D3DXCOLOR color, const D3DXMATRIX* pmView,
+ const D3DXMATRIX* pmProj, const D3DXVECTOR3* pEyePt )
+{
+ m_mView = *pmView;
+
+ // Render the light spheres so the user can visually see the light dir
+ UINT iPass, cPasses;
+ D3DXMATRIX mRotate;
+ D3DXMATRIX mScale;
+ D3DXMATRIX mTrans;
+ D3DXMATRIXA16 mWorldViewProj;
+ HRESULT hr;
+
+ V( s_pD3D9Effect->SetTechnique( s_hRenderWith1LightNoTexture ) );
+ V( s_pD3D9Effect->SetVector( s_hMaterialDiffuseColor, ( D3DXVECTOR4* )&color ) );
+
+ D3DXVECTOR3 vEyePt;
+ D3DXVec3Normalize( &vEyePt, pEyePt );
+ V( s_pD3D9Effect->SetValue( s_hLightDir, &vEyePt, sizeof( D3DXVECTOR3 ) ) );
+
+ // Rotate arrow model to point towards origin
+ D3DXMATRIX mRotateA, mRotateB;
+ D3DXVECTOR3 vAt = D3DXVECTOR3( 0, 0, 0 );
+ D3DXVECTOR3 vUp = D3DXVECTOR3( 0, 1, 0 );
+ D3DXMatrixRotationX( &mRotateB, D3DX_PI );
+ D3DXMatrixLookAtLH( &mRotateA, &m_vCurrentDir, &vAt, &vUp );
+ D3DXMatrixInverse( &mRotateA, NULL, &mRotateA );
+ mRotate = mRotateB * mRotateA;
+
+ D3DXVECTOR3 vL = m_vCurrentDir * m_fRadius * 1.0f;
+ D3DXMatrixTranslation( &mTrans, vL.x, vL.y, vL.z );
+ D3DXMatrixScaling( &mScale, m_fRadius * 0.2f, m_fRadius * 0.2f, m_fRadius * 0.2f );
+
+ D3DXMATRIX mWorld = mRotate * mScale * mTrans;
+ mWorldViewProj = mWorld * ( m_mView )*( *pmProj );
+
+ V( s_pD3D9Effect->SetMatrix( s_hWorldViewProjection, &mWorldViewProj ) );
+ V( s_pD3D9Effect->SetMatrix( s_hWorld, &mWorld ) );
+
+ for( int iSubset = 0; iSubset < 2; iSubset++ )
+ {
+ V( s_pD3D9Effect->Begin( &cPasses, 0 ) );
+ for( iPass = 0; iPass < cPasses; iPass++ )
+ {
+ V( s_pD3D9Effect->BeginPass( iPass ) );
+ V( s_pD3D9Mesh->DrawSubset( iSubset ) );
+ V( s_pD3D9Effect->EndPass() );
+ }
+ V( s_pD3D9Effect->End() );
+ }
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::UpdateLightDir()
+{
+ D3DXMATRIX mInvView;
+ D3DXMatrixInverse( &mInvView, NULL, &m_mView );
+ mInvView._41 = mInvView._42 = mInvView._43 = 0;
+
+ D3DXMATRIX mLastRotInv;
+ D3DXMatrixInverse( &mLastRotInv, NULL, &m_mRotSnapshot );
+
+ D3DXMATRIX mRot = *m_ArcBall.GetRotationMatrix();
+ m_mRotSnapshot = mRot;
+
+ // Accumulate the delta of the arcball's rotation in view space.
+ // Note that per-frame delta rotations could be problematic over long periods of time.
+ m_mRot *= m_mView * mLastRotInv * mRot * mInvView;
+
+ // Since we're accumulating delta rotations, we need to orthonormalize
+ // the matrix to prevent eventual matrix skew
+ D3DXVECTOR3* pXBasis = ( D3DXVECTOR3* )&m_mRot._11;
+ D3DXVECTOR3* pYBasis = ( D3DXVECTOR3* )&m_mRot._21;
+ D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&m_mRot._31;
+ D3DXVec3Normalize( pXBasis, pXBasis );
+ D3DXVec3Cross( pYBasis, pZBasis, pXBasis );
+ D3DXVec3Normalize( pYBasis, pYBasis );
+ D3DXVec3Cross( pZBasis, pXBasis, pYBasis );
+
+ // Transform the default direction vector by the light's rotation matrix
+ D3DXVec3TransformNormal( &m_vCurrentDir, &m_vDefaultDir, &m_mRot );
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::StaticOnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext )
+{
+
+
+ //s_pd3d10Device = pd3dDevice;
+
+ //const char* g_strBuffer =
+ // "float4 g_MaterialDiffuseColor; // Material's diffuse color\r\n"
+ // "float4 g_LightDir; // Light's direction in world space\r\n"
+ // "float4x4 g_mWorld; // World matrix for object\r\n"
+ // "float4x4 g_mWorldViewProjection; // World * View * Projection matrix\r\n"
+ // "\r\n"
+ // "struct VS_OUTPUT\r\n"
+ // "{\r\n"
+ // " float4 Position : SV_POSITION; // vertex position\r\n"
+ // " float4 Diffuse : COLOR0; // vertex diffuse color\r\n"
+ // "};\r\n"
+ // "\r\n"
+ // "VS_OUTPUT RenderWith1LightNoTextureVS( float3 vPos : POSITION,\r\n"
+ // " float3 vNormal : NORMAL )\r\n"
+ // "{\r\n"
+ // " VS_OUTPUT Output;\r\n"
+ // "\r\n"
+ // " // Transform the position from object space to homogeneous projection space\r\n"
+ // " Output.Position = mul( float4(vPos,1), g_mWorldViewProjection);\r\n"
+ // "\r\n"
+ // " // Transform the normal from object space to world space\r\n"
+ // " float3 vNormalWorldSpace;\r\n"
+ // " vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space)\r\n"
+ // "\r\n"
+ // " // Compute simple directional lighting equation\r\n"
+ // " Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir));\r\n"
+ // " Output.Diffuse.a = 1.0f;\r\n"
+ // "\r\n"
+ // " return Output;\r\n"
+ // "}\r\n"
+ // "\r\n"
+ // "float4 RenderWith1LightNoTexturePS( VS_OUTPUT Input ) : SV_TARGET\r\n"
+ // "{\r\n"
+ // " return Input.Diffuse;\r\n"
+ // "}\r\n"
+ // "\r\n"
+ // "technique10 RenderWith1LightNoTexture\r\n"
+ // "{\r\n"
+ // " pass p0\r\n"
+ // " {\r\n"
+ // " SetVertexShader( CompileShader( vs_4_0, RenderWith1LightNoTextureVS() ) );\r\n"
+ // " SetGeometryShader( NULL );\r\n"
+ // " SetPixelShader( CompileShader( ps_4_0, RenderWith1LightNoTexturePS() ) );\r\n"
+ // " }\r\n"
+ // "}\r\n"
+ // "";
+
+ //UINT dwBufferSize = ( UINT )strlen( g_strBuffer ) + 1;
+
+ //HRESULT hr = D3DX10CreateEffectFromMemory( g_strBuffer, dwBufferSize, "None", NULL, NULL, "fx_4_0",
+ // D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL,
+ // NULL, &s_pD3D10Effect, NULL, NULL );
+ //if( FAILED( hr ) )
+ // return hr;
+
+ //s_pRenderTech = s_pD3D10Effect->GetTechniqueByName( "RenderWith1LightNoTexture" );
+ //g_pMaterialDiffuseColor = s_pD3D10Effect->GetVariableByName( "g_MaterialDiffuseColor" )->AsVector();
+ //g_pLightDir = s_pD3D10Effect->GetVariableByName( "g_LightDir" )->AsVector();
+ //g_pmWorld = s_pD3D10Effect->GetVariableByName( "g_mWorld" )->AsMatrix();
+ //g_pmWorldViewProjection = s_pD3D10Effect->GetVariableByName( "g_mWorldViewProjection" )->AsMatrix();
+
+ //const D3D10_INPUT_ELEMENT_DESC layout[] =
+ //{
+ // { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
+ // { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
+ //};
+ //D3D10_PASS_DESC PassDesc;
+ //V_RETURN( s_pRenderTech->GetPassByIndex( 0 )->GetDesc( &PassDesc ) );
+ //V_RETURN( pd3dDevice->CreateInputLayout( layout, 2, PassDesc.pIAInputSignature,
+ // PassDesc.IAInputSignatureSize, &s_pVertexLayout ) );
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDirectionWidget::OnRender11( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj,
+ const D3DXVECTOR3* pEyePt )
+{
+ // NO 11 version of D3DX11Mesh YET
+ // m_mView = *pmView;
+
+ // // Render the light spheres so the user can visually see the light dir
+ // D3DXMATRIX mRotate;
+ // D3DXMATRIX mScale;
+ // D3DXMATRIX mTrans;
+ // D3DXMATRIXA16 mWorldViewProj;
+
+ // g_pMaterialDiffuseColor->SetFloatVector( ( float* )&color );
+ // D3DXVECTOR3 vEyePt;
+ // D3DXVec3Normalize( &vEyePt, pEyePt );
+ // g_pLightDir->SetFloatVector( ( float* )&vEyePt );
+
+ // // Rotate arrow model to point towards origin
+ // D3DXMATRIX mRotateA, mRotateB;
+ // D3DXVECTOR3 vAt = D3DXVECTOR3( 0, 0, 0 );
+ // D3DXVECTOR3 vUp = D3DXVECTOR3( 0, 1, 0 );
+ // D3DXMatrixRotationX( &mRotateB, D3DX_PI );
+ // D3DXMatrixLookAtLH( &mRotateA, &m_vCurrentDir, &vAt, &vUp );
+ // D3DXMatrixInverse( &mRotateA, NULL, &mRotateA );
+ // mRotate = mRotateB * mRotateA;
+
+ // D3DXVECTOR3 vL = m_vCurrentDir * m_fRadius * 1.0f;
+ // D3DXMatrixTranslation( &mTrans, vL.x, vL.y, vL.z );
+ // D3DXMatrixScaling( &mScale, m_fRadius * 0.2f, m_fRadius * 0.2f, m_fRadius * 0.2f );
+
+ // D3DXMATRIX mWorld = mRotate * mScale * mTrans;
+ // mWorldViewProj = mWorld * ( m_mView )*( *pmProj );
+
+ // g_pmWorldViewProjection->SetMatrix( ( float* )&mWorldViewProj );
+ // g_pmWorld->SetMatrix( ( float* )&mWorld );
+
+ // s_pd3d10Device->IASetInputLayout( s_pVertexLayout );
+
+ // Add rendering code here
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDirectionWidget::StaticOnD3D11DestroyDevice()
+{
+// SAFE_RELEASE( s_pVertexLayout );
+// SAFE_RELEASE( s_pD3D11Effect );
+}
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.h b/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.h
new file mode 100644
index 0000000..c29b104
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTcamera.h
@@ -0,0 +1,517 @@
+//--------------------------------------------------------------------------------------
+// File: Camera.h
+//
+// Helper functions for Direct3D programming.
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef CAMERA_H
+#define CAMERA_H
+
+//--------------------------------------------------------------------------------------
+class CD3DArcBall
+{
+public:
+ CD3DArcBall();
+
+ // Functions to change behavior
+ void Reset();
+ void SetTranslationRadius( FLOAT fRadiusTranslation )
+ {
+ m_fRadiusTranslation = fRadiusTranslation;
+ }
+ void SetWindow( INT nWidth, INT nHeight, FLOAT fRadius = 0.9f )
+ {
+ m_nWidth = nWidth; m_nHeight = nHeight; m_fRadius = fRadius;
+ m_vCenter = D3DXVECTOR2( m_nWidth / 2.0f, m_nHeight / 2.0f );
+ }
+ void SetOffset( INT nX, INT nY )
+ {
+ m_Offset.x = nX; m_Offset.y = nY;
+ }
+
+ // Call these from client and use GetRotationMatrix() to read new rotation matrix
+ void OnBegin( int nX, int nY ); // start the rotation (pass current mouse position)
+ void OnMove( int nX, int nY ); // continue the rotation (pass current mouse position)
+ void OnEnd(); // end the rotation
+
+ // Or call this to automatically handle left, middle, right buttons
+ LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ // Functions to get/set state
+ const D3DXMATRIX* GetRotationMatrix()
+ {
+ return D3DXMatrixRotationQuaternion( &m_mRotation, &m_qNow );
+ };
+ const D3DXMATRIX* GetTranslationMatrix() const
+ {
+ return &m_mTranslation;
+ }
+ const D3DXMATRIX* GetTranslationDeltaMatrix() const
+ {
+ return &m_mTranslationDelta;
+ }
+ bool IsBeingDragged() const
+ {
+ return m_bDrag;
+ }
+ D3DXQUATERNION GetQuatNow() const
+ {
+ return m_qNow;
+ }
+ void SetQuatNow( D3DXQUATERNION q )
+ {
+ m_qNow = q;
+ }
+
+ static D3DXQUATERNION WINAPI QuatFromBallPoints( const D3DXVECTOR3& vFrom, const D3DXVECTOR3& vTo );
+
+
+protected:
+ D3DXMATRIXA16 m_mRotation; // Matrix for arc ball's orientation
+ D3DXMATRIXA16 m_mTranslation; // Matrix for arc ball's position
+ D3DXMATRIXA16 m_mTranslationDelta; // Matrix for arc ball's position
+
+ POINT m_Offset; // window offset, or upper-left corner of window
+ INT m_nWidth; // arc ball's window width
+ INT m_nHeight; // arc ball's window height
+ D3DXVECTOR2 m_vCenter; // center of arc ball
+ FLOAT m_fRadius; // arc ball's radius in screen coords
+ FLOAT m_fRadiusTranslation; // arc ball's radius for translating the target
+
+ D3DXQUATERNION m_qDown; // Quaternion before button down
+ D3DXQUATERNION m_qNow; // Composite quaternion for current drag
+ bool m_bDrag; // Whether user is dragging arc ball
+
+ POINT m_ptLastMouse; // position of last mouse point
+ D3DXVECTOR3 m_vDownPt; // starting point of rotation arc
+ D3DXVECTOR3 m_vCurrentPt; // current point of rotation arc
+
+ D3DXVECTOR3 ScreenToVector( float fScreenPtX, float fScreenPtY );
+};
+
+
+//--------------------------------------------------------------------------------------
+// used by CCamera to map WM_KEYDOWN keys
+//--------------------------------------------------------------------------------------
+enum D3DUtil_CameraKeys
+{
+ CAM_STRAFE_LEFT = 0,
+ CAM_STRAFE_RIGHT,
+ CAM_MOVE_FORWARD,
+ CAM_MOVE_BACKWARD,
+ CAM_MOVE_UP,
+ CAM_MOVE_DOWN,
+ CAM_RESET,
+ CAM_CONTROLDOWN,
+ CAM_MAX_KEYS,
+ CAM_UNKNOWN = 0xFF
+};
+
+#define KEY_WAS_DOWN_MASK 0x80
+#define KEY_IS_DOWN_MASK 0x01
+
+#define MOUSE_LEFT_BUTTON 0x01
+#define MOUSE_MIDDLE_BUTTON 0x02
+#define MOUSE_RIGHT_BUTTON 0x04
+#define MOUSE_WHEEL 0x08
+
+
+//--------------------------------------------------------------------------------------
+// Simple base camera class that moves and rotates. The base class
+// records mouse and keyboard input for use by a derived class, and
+// keeps common state.
+//--------------------------------------------------------------------------------------
+class CBaseCamera
+{
+public:
+ CBaseCamera();
+
+ // Call these from client and use Get*Matrix() to read new matrices
+ virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual void FrameMove( FLOAT fElapsedTime ) = 0;
+
+ // Functions to change camera matrices
+ virtual void Reset();
+ virtual void SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt );
+ virtual void SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane, FLOAT fFarPlane );
+
+ // Functions to change behavior
+ virtual void SetDragRect( RECT& rc )
+ {
+ m_rcDrag = rc;
+ }
+ void SetInvertPitch( bool bInvertPitch )
+ {
+ m_bInvertPitch = bInvertPitch;
+ }
+ void SetDrag( bool bMovementDrag, FLOAT fTotalDragTimeToZero = 0.25f )
+ {
+ m_bMovementDrag = bMovementDrag; m_fTotalDragTimeToZero = fTotalDragTimeToZero;
+ }
+ void SetEnableYAxisMovement( bool bEnableYAxisMovement )
+ {
+ m_bEnableYAxisMovement = bEnableYAxisMovement;
+ }
+ void SetEnablePositionMovement( bool bEnablePositionMovement )
+ {
+ m_bEnablePositionMovement = bEnablePositionMovement;
+ }
+ void SetClipToBoundary( bool bClipToBoundary, D3DXVECTOR3* pvMinBoundary,
+ D3DXVECTOR3* pvMaxBoundary )
+ {
+ m_bClipToBoundary = bClipToBoundary; if( pvMinBoundary ) m_vMinBoundary = *pvMinBoundary;
+ if( pvMaxBoundary ) m_vMaxBoundary = *pvMaxBoundary;
+ }
+ void SetScalers( FLOAT fRotationScaler = 0.01f, FLOAT fMoveScaler = 5.0f )
+ {
+ m_fRotationScaler = fRotationScaler; m_fMoveScaler = fMoveScaler;
+ }
+ void SetNumberOfFramesToSmoothMouseData( int nFrames )
+ {
+ if( nFrames > 0 ) m_fFramesToSmoothMouseData = ( float )nFrames;
+ }
+ void SetResetCursorAfterMove( bool bResetCursorAfterMove )
+ {
+ m_bResetCursorAfterMove = bResetCursorAfterMove;
+ }
+
+ // Functions to get state
+ const D3DXMATRIX* GetViewMatrix() const
+ {
+ return &m_mView;
+ }
+ const D3DXMATRIX* GetProjMatrix() const
+ {
+ return &m_mProj;
+ }
+ const D3DXVECTOR3* GetEyePt() const
+ {
+ return &m_vEye;
+ }
+ const D3DXVECTOR3* GetLookAtPt() const
+ {
+ return &m_vLookAt;
+ }
+ float GetNearClip() const
+ {
+ return m_fNearPlane;
+ }
+ float GetFarClip() const
+ {
+ return m_fFarPlane;
+ }
+
+ bool IsBeingDragged() const
+ {
+ return ( m_bMouseLButtonDown || m_bMouseMButtonDown || m_bMouseRButtonDown );
+ }
+ bool IsMouseLButtonDown() const
+ {
+ return m_bMouseLButtonDown;
+ }
+ bool IsMouseMButtonDown() const
+ {
+ return m_bMouseMButtonDown;
+ }
+ bool IsMouseRButtonDown() const
+ {
+ return m_bMouseRButtonDown;
+ }
+
+protected:
+ // Functions to map a WM_KEYDOWN key to a D3DUtil_CameraKeys enum
+ virtual D3DUtil_CameraKeys MapKey( UINT nKey );
+ bool IsKeyDown( BYTE key ) const
+ {
+ return( ( key & KEY_IS_DOWN_MASK ) == KEY_IS_DOWN_MASK );
+ }
+ bool WasKeyDown( BYTE key ) const
+ {
+ return( ( key & KEY_WAS_DOWN_MASK ) == KEY_WAS_DOWN_MASK );
+ }
+
+ void ConstrainToBoundary( D3DXVECTOR3* pV );
+ void UpdateMouseDelta();
+ void UpdateVelocity( float fElapsedTime );
+ void GetInput( bool bGetKeyboardInput, bool bGetMouseInput, bool bGetGamepadInput,
+ bool bResetCursorAfterMove );
+
+ D3DXMATRIX m_mView; // View matrix
+ D3DXMATRIX m_mProj; // Projection matrix
+
+ DXUT_GAMEPAD m_GamePad[DXUT_MAX_CONTROLLERS]; // XInput controller state
+ D3DXVECTOR3 m_vGamePadLeftThumb;
+ D3DXVECTOR3 m_vGamePadRightThumb;
+ double m_GamePadLastActive[DXUT_MAX_CONTROLLERS];
+
+ int m_cKeysDown; // Number of camera keys that are down.
+ BYTE m_aKeys[CAM_MAX_KEYS]; // State of input - KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK
+ D3DXVECTOR3 m_vKeyboardDirection; // Direction vector of keyboard input
+ POINT m_ptLastMousePosition; // Last absolute position of mouse cursor
+ bool m_bMouseLButtonDown; // True if left button is down
+ bool m_bMouseMButtonDown; // True if middle button is down
+ bool m_bMouseRButtonDown; // True if right button is down
+ int m_nCurrentButtonMask; // mask of which buttons are down
+ int m_nMouseWheelDelta; // Amount of middle wheel scroll (+/-)
+ D3DXVECTOR2 m_vMouseDelta; // Mouse relative delta smoothed over a few frames
+ float m_fFramesToSmoothMouseData; // Number of frames to smooth mouse data over
+
+ D3DXVECTOR3 m_vDefaultEye; // Default camera eye position
+ D3DXVECTOR3 m_vDefaultLookAt; // Default LookAt position
+ D3DXVECTOR3 m_vEye; // Camera eye position
+ D3DXVECTOR3 m_vLookAt; // LookAt position
+ float m_fCameraYawAngle; // Yaw angle of camera
+ float m_fCameraPitchAngle; // Pitch angle of camera
+
+ RECT m_rcDrag; // Rectangle within which a drag can be initiated.
+ D3DXVECTOR3 m_vVelocity; // Velocity of camera
+ bool m_bMovementDrag; // If true, then camera movement will slow to a stop otherwise movement is instant
+ D3DXVECTOR3 m_vVelocityDrag; // Velocity drag force
+ FLOAT m_fDragTimer; // Countdown timer to apply drag
+ FLOAT m_fTotalDragTimeToZero; // Time it takes for velocity to go from full to 0
+ D3DXVECTOR2 m_vRotVelocity; // Velocity of camera
+
+ float m_fFOV; // Field of view
+ float m_fAspect; // Aspect ratio
+ float m_fNearPlane; // Near plane
+ float m_fFarPlane; // Far plane
+
+ float m_fRotationScaler; // Scaler for rotation
+ float m_fMoveScaler; // Scaler for movement
+
+ bool m_bInvertPitch; // Invert the pitch axis
+ bool m_bEnablePositionMovement; // If true, then the user can translate the camera/model
+ bool m_bEnableYAxisMovement; // If true, then camera can move in the y-axis
+
+ bool m_bClipToBoundary; // If true, then the camera will be clipped to the boundary
+ D3DXVECTOR3 m_vMinBoundary; // Min point in clip boundary
+ D3DXVECTOR3 m_vMaxBoundary; // Max point in clip boundary
+
+ bool m_bResetCursorAfterMove;// If true, the class will reset the cursor position so that the cursor always has space to move
+};
+
+
+//--------------------------------------------------------------------------------------
+// Simple first person camera class that moves and rotates.
+// It allows yaw and pitch but not roll. It uses WM_KEYDOWN and
+// GetCursorPos() to respond to keyboard and mouse input and updates the
+// view matrix based on input.
+//--------------------------------------------------------------------------------------
+class CFirstPersonCamera : public CBaseCamera
+{
+public:
+ CFirstPersonCamera();
+
+ // Call these from client and use Get*Matrix() to read new matrices
+ virtual void FrameMove( FLOAT fElapsedTime );
+
+ // Functions to change behavior
+ void SetRotateButtons( bool bLeft, bool bMiddle, bool bRight, bool bRotateWithoutButtonDown = false );
+
+ // Functions to get state
+ D3DXMATRIX* GetWorldMatrix()
+ {
+ return &m_mCameraWorld;
+ }
+
+ const D3DXVECTOR3* GetWorldRight() const
+ {
+ return ( D3DXVECTOR3* )&m_mCameraWorld._11;
+ }
+ const D3DXVECTOR3* GetWorldUp() const
+ {
+ return ( D3DXVECTOR3* )&m_mCameraWorld._21;
+ }
+ const D3DXVECTOR3* GetWorldAhead() const
+ {
+ return ( D3DXVECTOR3* )&m_mCameraWorld._31;
+ }
+ const D3DXVECTOR3* GetEyePt() const
+ {
+ return ( D3DXVECTOR3* )&m_mCameraWorld._41;
+ }
+
+protected:
+ D3DXMATRIX m_mCameraWorld; // World matrix of the camera (inverse of the view matrix)
+
+ int m_nActiveButtonMask; // Mask to determine which button to enable for rotation
+ bool m_bRotateWithoutButtonDown;
+};
+
+
+//--------------------------------------------------------------------------------------
+// Simple model viewing camera class that rotates around the object.
+//--------------------------------------------------------------------------------------
+class CModelViewerCamera : public CBaseCamera
+{
+public:
+ CModelViewerCamera();
+
+ // Call these from client and use Get*Matrix() to read new matrices
+ virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual void FrameMove( FLOAT fElapsedTime );
+
+
+ // Functions to change behavior
+ virtual void SetDragRect( RECT& rc );
+ void Reset();
+ void SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt );
+ void SetButtonMasks( int nRotateModelButtonMask = MOUSE_LEFT_BUTTON, int nZoomButtonMask = MOUSE_WHEEL,
+ int nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON )
+ {
+ m_nRotateModelButtonMask = nRotateModelButtonMask, m_nZoomButtonMask = nZoomButtonMask;
+ m_nRotateCameraButtonMask = nRotateCameraButtonMask;
+ }
+ void SetAttachCameraToModel( bool bEnable = false )
+ {
+ m_bAttachCameraToModel = bEnable;
+ }
+ void SetWindow( int nWidth, int nHeight, float fArcballRadius=0.9f )
+ {
+ m_WorldArcBall.SetWindow( nWidth, nHeight, fArcballRadius );
+ m_ViewArcBall.SetWindow( nWidth, nHeight, fArcballRadius );
+ }
+ void SetRadius( float fDefaultRadius=5.0f, float fMinRadius=1.0f, float fMaxRadius=FLT_MAX )
+ {
+ m_fDefaultRadius = m_fRadius = fDefaultRadius; m_fMinRadius = fMinRadius; m_fMaxRadius = fMaxRadius;
+ m_bDragSinceLastUpdate = true;
+ }
+ void SetModelCenter( D3DXVECTOR3 vModelCenter )
+ {
+ m_vModelCenter = vModelCenter;
+ }
+ void SetLimitPitch( bool bLimitPitch )
+ {
+ m_bLimitPitch = bLimitPitch;
+ }
+ void SetViewQuat( D3DXQUATERNION q )
+ {
+ m_ViewArcBall.SetQuatNow( q ); m_bDragSinceLastUpdate = true;
+ }
+ void SetWorldQuat( D3DXQUATERNION q )
+ {
+ m_WorldArcBall.SetQuatNow( q ); m_bDragSinceLastUpdate = true;
+ }
+
+ // Functions to get state
+ const D3DXMATRIX* GetWorldMatrix() const
+ {
+ return &m_mWorld;
+ }
+ void SetWorldMatrix( D3DXMATRIX& mWorld )
+ {
+ m_mWorld = mWorld; m_bDragSinceLastUpdate = true;
+ }
+
+protected:
+ CD3DArcBall m_WorldArcBall;
+ CD3DArcBall m_ViewArcBall;
+ D3DXVECTOR3 m_vModelCenter;
+ D3DXMATRIX m_mModelLastRot; // Last arcball rotation matrix for model
+ D3DXMATRIX m_mModelRot; // Rotation matrix of model
+ D3DXMATRIX m_mWorld; // World matrix of model
+
+ int m_nRotateModelButtonMask;
+ int m_nZoomButtonMask;
+ int m_nRotateCameraButtonMask;
+
+ bool m_bAttachCameraToModel;
+ bool m_bLimitPitch;
+ float m_fRadius; // Distance from the camera to model
+ float m_fDefaultRadius; // Distance from the camera to model
+ float m_fMinRadius; // Min radius
+ float m_fMaxRadius; // Max radius
+ bool m_bDragSinceLastUpdate; // True if mouse drag has happened since last time FrameMove is called.
+
+ D3DXMATRIX m_mCameraRotLast;
+
+};
+
+//--------------------------------------------------------------------------------------
+// Manages the mesh, direction, mouse events of a directional arrow that
+// rotates around a radius controlled by an arcball
+//--------------------------------------------------------------------------------------
+class CDXUTDirectionWidget
+{
+public:
+ CDXUTDirectionWidget();
+
+ static HRESULT WINAPI StaticOnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice );
+ HRESULT OnD3D9ResetDevice( const D3DSURFACE_DESC* pBackBufferSurfaceDesc );
+ HRESULT OnRender9( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj,
+ const D3DXVECTOR3* pEyePt );
+ LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+ static void WINAPI StaticOnD3D9LostDevice();
+ static void WINAPI StaticOnD3D9DestroyDevice();
+
+ static HRESULT WINAPI StaticOnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext );
+ HRESULT OnRender11( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj,
+ const D3DXVECTOR3* pEyePt );
+ static void WINAPI StaticOnD3D11DestroyDevice();
+
+ D3DXVECTOR3 GetLightDirection()
+ {
+ return m_vCurrentDir;
+ };
+ void SetLightDirection( D3DXVECTOR3 vDir )
+ {
+ m_vDefaultDir = m_vCurrentDir = vDir;
+ };
+ void SetButtonMask( int nRotate = MOUSE_RIGHT_BUTTON )
+ {
+ m_nRotateMask = nRotate;
+ }
+
+ float GetRadius()
+ {
+ return m_fRadius;
+ };
+ void SetRadius( float fRadius )
+ {
+ m_fRadius = fRadius;
+ };
+
+ bool IsBeingDragged()
+ {
+ return m_ArcBall.IsBeingDragged();
+ };
+
+protected:
+ HRESULT UpdateLightDir();
+
+ // D3D9 objects
+ static IDirect3DDevice9* s_pd3d9Device;
+ static ID3DXEffect* s_pD3D9Effect;
+ static ID3DXMesh* s_pD3D9Mesh;
+ static D3DXHANDLE s_hRenderWith1LightNoTexture;
+ static D3DXHANDLE s_hMaterialDiffuseColor;
+ static D3DXHANDLE s_hLightDir;
+ static D3DXHANDLE s_hWorldViewProjection;
+ static D3DXHANDLE s_hWorld;
+
+ // D3D10 objects
+ //static ID3D10Device* s_pd3d10Device;
+ //static ID3D10Effect* s_pD3D10Effect;
+ //TODO: add some sort of d3d10 mesh object here
+ //static ID3D10InputLayout* s_pVertexLayout;
+ //static ID3D10EffectTechnique* s_pRenderTech;
+ //static ID3D10EffectVectorVariable* g_pMaterialDiffuseColor;
+ //static ID3D10EffectVectorVariable* g_pLightDir;
+ //static ID3D10EffectMatrixVariable* g_pmWorld;
+ //static ID3D10EffectMatrixVariable* g_pmWorldViewProjection;
+
+ D3DXMATRIXA16 m_mRot;
+ D3DXMATRIXA16 m_mRotSnapshot;
+ float m_fRadius;
+ int m_nRotateMask;
+ CD3DArcBall m_ArcBall;
+ D3DXVECTOR3 m_vDefaultDir;
+ D3DXVECTOR3 m_vCurrentDir;
+ D3DXMATRIX m_mView;
+};
+
+
+
+#endif
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTgui.cpp b/samples/DX_APIUsage/DXUT/Optional/DXUTgui.cpp
new file mode 100644
index 0000000..cb83fff
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTgui.cpp
@@ -0,0 +1,7293 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTgui.cpp
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#include "DXUT.h"
+#include "DXUTgui.h"
+#include "DXUTsettingsDlg.h"
+#include "DXUTres.h"
+
+#include "SDKMisc.h"
+
+#undef min // use __min instead
+#undef max // use __max instead
+
+#ifndef WM_XBUTTONDOWN
+#define WM_XBUTTONDOWN 0x020B // (not always defined)
+#endif
+#ifndef WM_XBUTTONUP
+#define WM_XBUTTONUP 0x020C // (not always defined)
+#endif
+#ifndef WM_MOUSEWHEEL
+#define WM_MOUSEWHEEL 0x020A // (not always defined)
+#endif
+#ifndef WHEEL_DELTA
+#define WHEEL_DELTA 120 // (not always defined)
+#endif
+
+// Minimum scroll bar thumb size
+#define SCROLLBAR_MINTHUMBSIZE 8
+
+// Delay and repeat period when clicking on the scroll bar arrows
+#define SCROLLBAR_ARROWCLICK_DELAY 0.33
+#define SCROLLBAR_ARROWCLICK_REPEAT 0.05
+
+#define DXUT_NEAR_BUTTON_DEPTH 0.6f
+#define DXUT_FAR_BUTTON_DEPTH 0.8f
+
+#define DXUT_MAX_GUI_SPRITES 500
+
+D3DCOLORVALUE D3DCOLOR_TO_D3DCOLORVALUE( D3DCOLOR c )
+{
+ D3DCOLORVALUE cv =
+ {
+ ( ( c >> 16 ) & 0xFF ) / 255.0f,
+ ( ( c >> 8 ) & 0xFF ) / 255.0f,
+ ( c & 0xFF ) / 255.0f,
+ ( ( c >> 24 ) & 0xFF ) / 255.0f
+ };
+ return cv;
+}
+
+#define UNISCRIBE_DLLNAME L"usp10.dll"
+
+#define GETPROCADDRESS( Module, APIName, Temp ) \
+ Temp = GetProcAddress( Module, #APIName ); \
+ if( Temp ) \
+ *(FARPROC*)&_##APIName = Temp
+
+#define PLACEHOLDERPROC( APIName ) \
+ _##APIName = Dummy_##APIName
+
+#define IMM32_DLLNAME L"imm32.dll"
+#define VER_DLLNAME L"version.dll"
+
+CHAR g_strUIEffectFile[] = \
+ "Texture2D g_Texture;"\
+ ""\
+ "SamplerState Sampler"\
+ "{"\
+ " Filter = MIN_MAG_MIP_LINEAR;"\
+ " AddressU = Wrap;"\
+ " AddressV = Wrap;"\
+ "};"\
+ ""\
+ "BlendState UIBlend"\
+ "{"\
+ " AlphaToCoverageEnable = FALSE;"\
+ " BlendEnable[0] = TRUE;"\
+ " SrcBlend = SRC_ALPHA;"\
+ " DestBlend = INV_SRC_ALPHA;"\
+ " BlendOp = ADD;"\
+ " SrcBlendAlpha = ONE;"\
+ " DestBlendAlpha = ZERO;"\
+ " BlendOpAlpha = ADD;"\
+ " RenderTargetWriteMask[0] = 0x0F;"\
+ "};"\
+ ""\
+ "BlendState NoBlending"\
+ "{"\
+ " BlendEnable[0] = FALSE;"\
+ " RenderTargetWriteMask[0] = 0x0F;"\
+ "};"\
+ ""\
+ "DepthStencilState DisableDepth"\
+ "{"\
+ " DepthEnable = false;"\
+ "};"\
+ "DepthStencilState EnableDepth"\
+ "{"\
+ " DepthEnable = true;"\
+ "};"\
+ "struct VS_OUTPUT"\
+ "{"\
+ " float4 Pos : POSITION;"\
+ " float4 Dif : COLOR;"\
+ " float2 Tex : TEXCOORD;"\
+ "};"\
+ ""\
+ "VS_OUTPUT VS( float3 vPos : POSITION,"\
+ " float4 Dif : COLOR,"\
+ " float2 vTexCoord0 : TEXCOORD )"\
+ "{"\
+ " VS_OUTPUT Output;"\
+ ""\
+ " Output.Pos = float4( vPos, 1.0f );"\
+ " Output.Dif = Dif;"\
+ " Output.Tex = vTexCoord0;"\
+ ""\
+ " return Output;"\
+ "}"\
+ ""\
+ "float4 PS( VS_OUTPUT In ) : SV_Target"\
+ "{"\
+ " return g_Texture.Sample( Sampler, In.Tex ) * In.Dif;"\
+ "}"\
+ ""\
+ "float4 PSUntex( VS_OUTPUT In ) : SV_Target"\
+ "{"\
+ " return In.Dif;"\
+ "}"\
+ ""\
+ "technique10 RenderUI"\
+ "{"\
+ " pass P0"\
+ " {"\
+ " SetVertexShader( CompileShader( vs_4_0, VS() ) );"\
+ " SetGeometryShader( NULL );"\
+ " SetPixelShader( CompileShader( ps_4_0, PS() ) );"\
+ " SetDepthStencilState( DisableDepth, 0 );"\
+ " SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
+ " }"\
+ "}"\
+ "technique10 RenderUIUntex"\
+ "{"\
+ " pass P0"\
+ " {"\
+ " SetVertexShader( CompileShader( vs_4_0, VS() ) );"\
+ " SetGeometryShader( NULL );"\
+ " SetPixelShader( CompileShader( ps_4_0, PSUntex() ) );"\
+ " SetDepthStencilState( DisableDepth, 0 );"\
+ " SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
+ " }"\
+ "}"\
+ "technique10 RestoreState"\
+ "{"\
+ " pass P0"\
+ " {"\
+ " SetDepthStencilState( EnableDepth, 0 );"\
+ " SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\
+ " }"\
+ "}";
+const UINT g_uUIEffectFileSize = sizeof( g_strUIEffectFile );
+
+
+// DXUT_MAX_EDITBOXLENGTH is the maximum string length allowed in edit boxes,
+// including the NULL terminator.
+//
+// Uniscribe does not support strings having bigger-than-16-bits length.
+// This means that the string must be less than 65536 characters long,
+// including the NULL terminator.
+#define DXUT_MAX_EDITBOXLENGTH 0xFFFF
+
+
+double CDXUTDialog::s_fTimeRefresh = 0.0f;
+CDXUTControl* CDXUTDialog::s_pControlFocus = NULL; // The control which has focus
+CDXUTControl* CDXUTDialog::s_pControlPressed = NULL; // The control currently pressed
+
+
+struct DXUT_SCREEN_VERTEX
+{
+ float x, y, z, h;
+ D3DCOLOR color;
+ float tu, tv;
+
+ static DWORD FVF;
+};
+DWORD DXUT_SCREEN_VERTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1;
+
+
+struct DXUT_SCREEN_VERTEX_UNTEX
+{
+ float x, y, z, h;
+ D3DCOLOR color;
+
+ static DWORD FVF;
+};
+DWORD DXUT_SCREEN_VERTEX_UNTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;
+
+
+struct DXUT_SCREEN_VERTEX_10
+{
+ float x, y, z;
+ D3DCOLORVALUE color;
+ float tu, tv;
+};
+
+
+inline int RectWidth( RECT& rc )
+{
+ return ( ( rc ).right - ( rc ).left );
+}
+inline int RectHeight( RECT& rc )
+{
+ return ( ( rc ).bottom - ( rc ).top );
+}
+
+
+HRESULT InitFont11( ID3D11Device* pd3d11Device, ID3D11InputLayout* pInputLayout );
+void EndFont11();
+
+//--------------------------------------------------------------------------------------
+// CDXUTDialog class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTDialog::CDXUTDialog()
+{
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+
+ m_pManager = NULL;
+ m_bVisible = true;
+ m_bCaption = false;
+ m_bMinimized = false;
+ m_bDrag = false;
+ m_wszCaption[0] = L'\0';
+ m_nCaptionHeight = 18;
+
+ m_colorTopLeft = 0;
+ m_colorTopRight = 0;
+ m_colorBottomLeft = 0;
+ m_colorBottomRight = 0;
+
+ m_pCallbackEvent = NULL;
+ m_pCallbackEventUserContext = NULL;
+
+ m_fTimeLastRefresh = 0;
+
+ m_pControlMouseOver = NULL;
+
+ m_pNextDialog = this;
+ m_pPrevDialog = this;
+
+ m_nDefaultControlID = 0xffff;
+ m_bNonUserEvents = false;
+ m_bKeyboardInput = false;
+ m_bMouseInput = true;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTDialog::~CDXUTDialog()
+{
+ int i = 0;
+
+ RemoveAllControls();
+
+ m_Fonts.RemoveAll();
+ m_Textures.RemoveAll();
+
+ for( i = 0; i < m_DefaultElements.GetSize(); i++ )
+ {
+ DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
+ SAFE_DELETE( pElementHolder );
+ }
+
+ m_DefaultElements.RemoveAll();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog )
+{
+ m_pManager = pManager;
+ if( bRegisterDialog )
+ pManager->RegisterDialog( this );
+
+ SetTexture( 0, MAKEINTRESOURCE( 0xFFFF ), ( HMODULE )0xFFFF );
+ InitDefaultElements();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR pszControlTextureFilename )
+{
+ m_pManager = pManager;
+ if( bRegisterDialog )
+ pManager->RegisterDialog( this );
+ SetTexture( 0, pszControlTextureFilename );
+ InitDefaultElements();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog,
+ LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule )
+{
+ m_pManager = pManager;
+ if( bRegisterDialog )
+ pManager->RegisterDialog( this );
+
+ SetTexture( 0, szControlTextureResourceName, hControlTextureResourceModule );
+ InitDefaultElements();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext )
+{
+ // If this assert triggers, you need to call CDXUTDialog::Init() first. This change
+ // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The
+ // creation and interfacing with CDXUTDialogResourceManager is now the responsibility
+ // of the application if it wishes to use DXUT's GUI.
+ assert( m_pManager != NULL && L"To fix call CDXUTDialog::Init() first. See comments for details." );
+
+ m_pCallbackEvent = pCallback;
+ m_pCallbackEventUserContext = pUserContext;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::RemoveControl( int ID )
+{
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+ if( pControl->GetID() == ID )
+ {
+ // Clean focus first
+ ClearFocus();
+
+ // Clear references to this control
+ if( s_pControlFocus == pControl )
+ s_pControlFocus = NULL;
+ if( s_pControlPressed == pControl )
+ s_pControlPressed = NULL;
+ if( m_pControlMouseOver == pControl )
+ m_pControlMouseOver = NULL;
+
+ SAFE_DELETE( pControl );
+ m_Controls.Remove( i );
+
+ return;
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::RemoveAllControls()
+{
+ if( s_pControlFocus && s_pControlFocus->m_pDialog == this )
+ s_pControlFocus = NULL;
+ if( s_pControlPressed && s_pControlPressed->m_pDialog == this )
+ s_pControlPressed = NULL;
+ m_pControlMouseOver = NULL;
+
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+ SAFE_DELETE( pControl );
+ }
+
+ m_Controls.RemoveAll();
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTDialogResourceManager::CDXUTDialogResourceManager()
+{
+ // Begin D3D9-specific
+ m_pd3d9Device = NULL;
+ m_pStateBlock = NULL;
+ m_pSprite = NULL;
+
+ // Begin D3D11-specific
+ // Shaders
+ m_pVSRenderUI11 = NULL;
+ m_pPSRenderUI11 = NULL;
+ m_pPSRenderUIUntex11 = NULL;
+
+ // States
+ m_pDepthStencilStateUI11 = NULL;
+ m_pRasterizerStateUI11 = NULL;
+ m_pBlendStateUI11 = NULL;
+ m_pSamplerStateUI11 = NULL;
+ m_pDepthStencilStateStored11 = NULL;
+ m_pRasterizerStateStored11 = NULL;
+ m_pBlendStateStored11 = NULL;
+ m_pSamplerStateStored11 = NULL;
+
+ m_pInputLayout11 = NULL;
+ m_pVBScreenQuad11 = NULL;
+ m_pSpriteBuffer11 = NULL;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTDialogResourceManager::~CDXUTDialogResourceManager()
+{
+ int i;
+ for( i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
+ SAFE_DELETE( pFontNode );
+ }
+ m_FontCache.RemoveAll();
+
+ for( i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
+ SAFE_DELETE( pTextureNode );
+ }
+ m_TextureCache.RemoveAll();
+
+ CUniBuffer::Uninitialize();
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::OnD3D9CreateDevice( LPDIRECT3DDEVICE9 pd3dDevice )
+{
+ HRESULT hr = S_OK;
+ int i = 0;
+
+ m_pd3d9Device = pd3dDevice;
+
+ for( i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ hr = CreateFont9( i );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ for( i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ hr = CreateTexture9( i );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ hr = D3DXCreateSprite( pd3dDevice, &m_pSprite );
+ if( FAILED( hr ) )
+ return DXUT_ERR( L"D3DXCreateSprite", hr );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::OnD3D9ResetDevice()
+{
+ HRESULT hr = S_OK;
+
+ for( int i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
+
+ if( pFontNode->pFont9 )
+ pFontNode->pFont9->OnResetDevice();
+ }
+
+ if( m_pSprite )
+ m_pSprite->OnResetDevice();
+
+ V_RETURN( m_pd3d9Device->CreateStateBlock( D3DSBT_ALL, &m_pStateBlock ) );
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTDialogResourceManager::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::OnD3D9LostDevice()
+{
+ for( int i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
+
+ if( pFontNode->pFont9 )
+ pFontNode->pFont9->OnLostDevice();
+ }
+
+ if( m_pSprite )
+ m_pSprite->OnLostDevice();
+
+ SAFE_RELEASE( m_pStateBlock );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::OnD3D9DestroyDevice()
+{
+ int i = 0;
+
+ m_pd3d9Device = NULL;
+
+ // Release the resources but don't clear the cache, as these will need to be
+ // recreated if the device is recreated
+ for( i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
+ SAFE_RELEASE( pFontNode->pFont9 );
+ }
+
+ for( i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
+ SAFE_RELEASE( pTextureNode->pTexture9 );
+ }
+
+ SAFE_RELEASE( m_pSprite );
+}
+
+
+
+HRESULT CDXUTDialogResourceManager::OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext )
+{
+ m_pd3d11Device = pd3dDevice;
+ m_pd3d11DeviceContext = pd3d11DeviceContext;
+
+ HRESULT hr = S_OK;
+
+ // Compile Shaders
+ ID3DBlob* pVSBlob = NULL;
+ ID3DBlob* pPSBlob = NULL;
+ ID3DBlob* pPSUntexBlob = NULL;
+ V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "VS", "vs_4_0_level_9_1",
+ D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pVSBlob, NULL ) );
+ V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "PS", "ps_4_0_level_9_1",
+ D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSBlob, NULL ) );
+ V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "PSUntex", "ps_4_0_level_9_1",
+ D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSUntexBlob, NULL ) );
+
+ // Create Shaders
+ V_RETURN( pd3dDevice->CreateVertexShader( pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &m_pVSRenderUI11 ) );
+ DXUT_SetDebugName( m_pVSRenderUI11, "CDXUTDialogResourceManager" );
+
+ V_RETURN( pd3dDevice->CreatePixelShader( pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), NULL, &m_pPSRenderUI11 ) );
+ DXUT_SetDebugName( m_pPSRenderUI11, "CDXUTDialogResourceManager" );
+
+ V_RETURN( pd3dDevice->CreatePixelShader( pPSUntexBlob->GetBufferPointer(), pPSUntexBlob->GetBufferSize(), NULL, &m_pPSRenderUIUntex11 ) );
+ DXUT_SetDebugName( m_pPSRenderUIUntex11, "CDXUTDialogResourceManager" );
+
+ // States
+ D3D11_DEPTH_STENCIL_DESC DSDesc;
+ ZeroMemory( &DSDesc, sizeof( D3D11_DEPTH_STENCIL_DESC ) );
+ DSDesc.DepthEnable = FALSE;
+ DSDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+ DSDesc.DepthFunc = D3D11_COMPARISON_LESS;
+ DSDesc.StencilEnable = FALSE;
+ V_RETURN( pd3dDevice->CreateDepthStencilState( &DSDesc, &m_pDepthStencilStateUI11 ) );
+ DXUT_SetDebugName( m_pDepthStencilStateUI11, "CDXUTDialogResourceManager" );
+
+ D3D11_RASTERIZER_DESC RSDesc;
+ RSDesc.AntialiasedLineEnable = FALSE;
+ RSDesc.CullMode = D3D11_CULL_BACK;
+ RSDesc.DepthBias = 0;
+ RSDesc.DepthBiasClamp = 0.0f;
+ RSDesc.DepthClipEnable = TRUE;
+ RSDesc.FillMode = D3D11_FILL_SOLID;
+ RSDesc.FrontCounterClockwise = FALSE;
+ RSDesc.MultisampleEnable = TRUE;
+ RSDesc.ScissorEnable = FALSE;
+ RSDesc.SlopeScaledDepthBias = 0.0f;
+ V_RETURN( pd3dDevice->CreateRasterizerState( &RSDesc, &m_pRasterizerStateUI11 ) );
+ DXUT_SetDebugName( m_pRasterizerStateUI11, "CDXUTDialogResourceManager" );
+
+ D3D11_BLEND_DESC BSDesc;
+ ZeroMemory( &BSDesc, sizeof( D3D11_BLEND_DESC ) );
+
+ BSDesc.RenderTarget[0].BlendEnable = TRUE;
+ BSDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
+ BSDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
+ BSDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
+ BSDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
+ BSDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
+ BSDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
+ BSDesc.RenderTarget[0].RenderTargetWriteMask = 0x0F;
+
+ V_RETURN( pd3dDevice->CreateBlendState( &BSDesc, &m_pBlendStateUI11 ) );
+ DXUT_SetDebugName( m_pBlendStateUI11, "CDXUTDialogResourceManager" );
+
+ D3D11_SAMPLER_DESC SSDesc;
+ ZeroMemory( &SSDesc, sizeof( D3D11_SAMPLER_DESC ) );
+ SSDesc.Filter = D3D11_FILTER_ANISOTROPIC ;
+ SSDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
+ SSDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
+ SSDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+ SSDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
+ SSDesc.MaxAnisotropy = 16;
+ SSDesc.MinLOD = 0;
+ SSDesc.MaxLOD = D3D11_FLOAT32_MAX;
+ if ( pd3dDevice->GetFeatureLevel() < D3D_FEATURE_LEVEL_9_3 ) {
+ SSDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+ SSDesc.MaxAnisotropy = 0;
+ }
+ V_RETURN( pd3dDevice->CreateSamplerState( &SSDesc, &m_pSamplerStateUI11 ) );
+ DXUT_SetDebugName( m_pSamplerStateUI11, "CDXUTDialogResourceManager" );
+
+ // Create the font and texture objects in the cache arrays.
+ int i = 0;
+ for( i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ hr = CreateFont11( i );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ for( i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ hr = CreateTexture11( i );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ // Create input layout
+ const D3D11_INPUT_ELEMENT_DESC layout[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ };
+
+ V_RETURN( pd3dDevice->CreateInputLayout( layout, ARRAYSIZE( layout ), pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), &m_pInputLayout11 ) );
+ DXUT_SetDebugName( m_pInputLayout11, "CDXUTDialogResourceManager" );
+
+ // Release the blobs
+ SAFE_RELEASE( pVSBlob );
+ SAFE_RELEASE( pPSBlob );
+ SAFE_RELEASE( pPSUntexBlob );
+
+ // Create a vertex buffer quad for rendering later
+ D3D11_BUFFER_DESC BufDesc;
+ BufDesc.ByteWidth = sizeof( DXUT_SCREEN_VERTEX_10 ) * 4;
+ BufDesc.Usage = D3D11_USAGE_DYNAMIC;
+ BufDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ BufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ BufDesc.MiscFlags = 0;
+ V_RETURN( pd3dDevice->CreateBuffer( &BufDesc, NULL, &m_pVBScreenQuad11 ) );
+ DXUT_SetDebugName( m_pVBScreenQuad11, "CDXUTDialogResourceManager" );
+
+ // Init the D3D11 font
+ InitFont11( pd3dDevice, m_pInputLayout11 );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice,
+ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc )
+{
+ HRESULT hr = S_OK;
+
+ m_nBackBufferWidth = pBackBufferSurfaceDesc->Width;
+ m_nBackBufferHeight = pBackBufferSurfaceDesc->Height;
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::OnD3D11ReleasingSwapChain()
+{
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::OnD3D11DestroyDevice()
+{
+ int i;
+
+ // Release the resources but don't clear the cache, as these will need to be
+ // recreated if the device is recreated
+
+ for( i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
+ SAFE_RELEASE( pTextureNode->pTexResView11 );
+ SAFE_RELEASE( pTextureNode->pTexture11 );
+ }
+
+ // D3D11
+ SAFE_RELEASE( m_pVBScreenQuad11 );
+ SAFE_RELEASE( m_pSpriteBuffer11 );
+ m_SpriteBufferBytes11 = 0;
+ SAFE_RELEASE( m_pInputLayout11 );
+
+ // Shaders
+ SAFE_RELEASE( m_pVSRenderUI11 );
+ SAFE_RELEASE( m_pPSRenderUI11 );
+ SAFE_RELEASE( m_pPSRenderUIUntex11 );
+
+ // States
+ SAFE_RELEASE( m_pDepthStencilStateUI11 );
+ SAFE_RELEASE( m_pRasterizerStateUI11 );
+ SAFE_RELEASE( m_pBlendStateUI11 );
+ SAFE_RELEASE( m_pSamplerStateUI11 );
+
+ SAFE_RELEASE( m_pDepthStencilStateStored11 );
+ SAFE_RELEASE( m_pRasterizerStateStored11 );
+ SAFE_RELEASE( m_pBlendStateStored11 );
+ SAFE_RELEASE( m_pSamplerStateStored11 );
+
+ EndFont11();
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::StoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext )
+{
+ pd3dImmediateContext->OMGetDepthStencilState( &m_pDepthStencilStateStored11, &m_StencilRefStored11 );
+ pd3dImmediateContext->RSGetState( &m_pRasterizerStateStored11 );
+ pd3dImmediateContext->OMGetBlendState( &m_pBlendStateStored11, m_BlendFactorStored11, &m_SampleMaskStored11 );
+ pd3dImmediateContext->PSGetSamplers( 0, 1, &m_pSamplerStateStored11 );
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::RestoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext )
+{
+ pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateStored11, m_StencilRefStored11 );
+ pd3dImmediateContext->RSSetState( m_pRasterizerStateStored11 );
+ pd3dImmediateContext->OMSetBlendState( m_pBlendStateStored11, m_BlendFactorStored11, m_SampleMaskStored11 );
+ pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateStored11 );
+
+ SAFE_RELEASE( m_pDepthStencilStateStored11 );
+ SAFE_RELEASE( m_pRasterizerStateStored11 );
+ SAFE_RELEASE( m_pBlendStateStored11 );
+ SAFE_RELEASE( m_pSamplerStateStored11 );
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::ApplyRenderUI11( ID3D11DeviceContext* pd3dImmediateContext )
+{
+ // Shaders
+ pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, NULL, 0 );
+ pd3dImmediateContext->HSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->DSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->GSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->PSSetShader( m_pPSRenderUI11, NULL, 0 );
+
+ // States
+ pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateUI11, 0 );
+ pd3dImmediateContext->RSSetState( m_pRasterizerStateUI11 );
+ float BlendFactor[4] = { 0, 0, 0, 0 };
+ pd3dImmediateContext->OMSetBlendState( m_pBlendStateUI11, BlendFactor, 0xFFFFFFFF );
+ pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateUI11 );
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::ApplyRenderUIUntex11( ID3D11DeviceContext* pd3dImmediateContext )
+{
+ // Shaders
+ pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, NULL, 0 );
+ pd3dImmediateContext->HSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->DSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->GSSetShader( NULL, NULL, 0 );
+ pd3dImmediateContext->PSSetShader( m_pPSRenderUIUntex11, NULL, 0 );
+
+ // States
+ pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateUI11, 0 );
+ pd3dImmediateContext->RSSetState( m_pRasterizerStateUI11 );
+ float BlendFactor[4] = { 0, 0, 0, 0 };
+ pd3dImmediateContext->OMSetBlendState( m_pBlendStateUI11, BlendFactor, 0xFFFFFFFF );
+ pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateUI11 );
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::BeginSprites11( )
+{
+ m_SpriteVertices.Reset();
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext )
+{
+
+ // ensure our buffer size can hold our sprites
+ UINT SpriteDataBytes = m_SpriteVertices.GetSize() * sizeof( DXUTSpriteVertex );
+ if( m_SpriteBufferBytes11 < SpriteDataBytes )
+ {
+ SAFE_RELEASE( m_pSpriteBuffer11 );
+ m_SpriteBufferBytes11 = SpriteDataBytes;
+
+ D3D11_BUFFER_DESC BufferDesc;
+ BufferDesc.ByteWidth = m_SpriteBufferBytes11;
+ BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ BufferDesc.MiscFlags = 0;
+
+ pd3dDevice->CreateBuffer( &BufferDesc, NULL, &m_pSpriteBuffer11 );
+ DXUT_SetDebugName( m_pSpriteBuffer11, "CDXUTDialogResourceManager" );
+ }
+
+ // Copy the sprites over
+ D3D11_BOX destRegion;
+ destRegion.left = 0;
+ destRegion.right = SpriteDataBytes;
+ destRegion.top = 0;
+ destRegion.bottom = 1;
+ destRegion.front = 0;
+ destRegion.back = 1;
+ D3D11_MAPPED_SUBRESOURCE MappedResource;
+ if ( S_OK == pd3dImmediateContext->Map( m_pSpriteBuffer11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ) {
+ CopyMemory( MappedResource.pData, (void*)m_SpriteVertices.GetData(), SpriteDataBytes );
+ pd3dImmediateContext->Unmap(m_pSpriteBuffer11, 0);
+ }
+
+ // Draw
+ UINT Stride = sizeof( DXUTSpriteVertex );
+ UINT Offset = 0;
+ pd3dImmediateContext->IASetVertexBuffers( 0, 1, &m_pSpriteBuffer11, &Stride, &Offset );
+ pd3dImmediateContext->IASetInputLayout( m_pInputLayout11 );
+ pd3dImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
+ pd3dImmediateContext->Draw( m_SpriteVertices.GetSize(), 0 );
+
+ m_SpriteVertices.Reset();
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTDialogResourceManager::RegisterDialog( CDXUTDialog* pDialog )
+{
+ // Check that the dialog isn't already registered.
+ for( int i = 0; i < m_Dialogs.GetSize(); ++i )
+ if( m_Dialogs.GetAt( i ) == pDialog )
+ return true;
+
+ // Add to the list.
+ if( FAILED( m_Dialogs.Add( pDialog ) ) )
+ return false;
+
+ // Set up next and prev pointers.
+ if( m_Dialogs.GetSize() > 1 )
+ m_Dialogs[m_Dialogs.GetSize() - 2]->SetNextDialog( pDialog );
+ m_Dialogs[m_Dialogs.GetSize() - 1]->SetNextDialog( m_Dialogs[0] );
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::UnregisterDialog( CDXUTDialog* pDialog )
+{
+ // Search for the dialog in the list.
+ for( int i = 0; i < m_Dialogs.GetSize(); ++i )
+ if( m_Dialogs.GetAt( i ) == pDialog )
+ {
+ m_Dialogs.Remove( i );
+ if( m_Dialogs.GetSize() > 0 )
+ {
+ int l, r;
+
+ if( 0 == i )
+ l = m_Dialogs.GetSize() - 1;
+ else
+ l = i - 1;
+
+ if( m_Dialogs.GetSize() == i )
+ r = 0;
+ else
+ r = i;
+
+ m_Dialogs[l]->SetNextDialog( m_Dialogs[r] );
+ }
+ return;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialogResourceManager::EnableKeyboardInputForAllDialogs()
+{
+ // Enable keyboard input for all registered dialogs
+ for( int i = 0; i < m_Dialogs.GetSize(); ++i )
+ m_Dialogs[i]->EnableKeyboardInput( true );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::Refresh()
+{
+ if( s_pControlFocus )
+ s_pControlFocus->OnFocusOut();
+
+ if( m_pControlMouseOver )
+ m_pControlMouseOver->OnMouseLeave();
+
+ s_pControlFocus = NULL;
+ s_pControlPressed = NULL;
+ m_pControlMouseOver = NULL;
+
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+ pControl->Refresh();
+ }
+
+ if( m_bKeyboardInput )
+ FocusDefaultControl();
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::OnRender( float fElapsedTime )
+{
+ if( m_pManager->GetD3D9Device() )
+ return OnRender9( fElapsedTime );
+ else
+ return OnRender11( fElapsedTime );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::OnRender9( float fElapsedTime )
+{
+ // If this assert triggers, you need to call CDXUTDialogResourceManager::On*Device() from inside
+ // the application's device callbacks. See the SDK samples for an example of how to do this.
+ assert( m_pManager->GetD3D9Device() && m_pManager->m_pStateBlock &&
+ L"To fix hook up CDXUTDialogResourceManager to device callbacks. See comments for details" );
+
+ // See if the dialog needs to be refreshed
+ if( m_fTimeLastRefresh < s_fTimeRefresh )
+ {
+ m_fTimeLastRefresh = DXUTGetTime();
+ Refresh();
+ }
+
+ // For invisible dialog, out now.
+ if( !m_bVisible ||
+ ( m_bMinimized && !m_bCaption ) )
+ return S_OK;
+
+ IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device();
+
+ // Set up a state block here and restore it when finished drawing all the controls
+ m_pManager->m_pStateBlock->Capture();
+
+ //pd3dDevice->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, TRUE);
+ //pd3dDevice->SetRenderState( D3DRS_SRGBWRITEENABLE, TRUE );
+
+ pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
+ pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
+ pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
+ pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
+ pd3dDevice->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, FALSE );
+ pd3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
+ pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE |
+ D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED );
+ pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
+ pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
+ pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
+ pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
+ pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_RESULTARG, D3DTA_CURRENT );
+ pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
+ pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
+
+ BOOL bBackgroundIsVisible = ( m_colorTopLeft | m_colorTopRight | m_colorBottomRight | m_colorBottomLeft ) &
+ 0xff000000;
+ if( !m_bMinimized && bBackgroundIsVisible )
+ {
+ DXUT_SCREEN_VERTEX_UNTEX vertices[4] =
+ {
+ ( float )m_x, ( float )m_y, 0.5f, 1.0f, m_colorTopLeft,
+ ( float )m_x + m_width, ( float )m_y, 0.5f, 1.0f, m_colorTopRight,
+ ( float )m_x + m_width, ( float )m_y + m_height, 0.5f, 1.0f, m_colorBottomRight,
+ ( float )m_x, ( float )m_y + m_height, 0.5f, 1.0f, m_colorBottomLeft,
+ };
+
+ pd3dDevice->SetVertexShader( NULL );
+ pd3dDevice->SetPixelShader( NULL );
+
+ pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
+
+ pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX_UNTEX::FVF );
+ pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertices, sizeof( DXUT_SCREEN_VERTEX_UNTEX ) );
+ }
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
+
+ pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
+
+ DXUTTextureNode* pTextureNode = GetTexture( 0 );
+ pd3dDevice->SetTexture( 0, pTextureNode->pTexture9 );
+
+ m_pManager->m_pSprite->Begin( D3DXSPRITE_DONOTSAVESTATE );
+
+ // Render the caption if it's enabled.
+ if( m_bCaption )
+ {
+ // DrawSprite will offset the rect down by
+ // m_nCaptionHeight, so adjust the rect higher
+ // here to negate the effect.
+ RECT rc =
+ {
+ 0, -m_nCaptionHeight, m_width, 0
+ };
+ DrawSprite9( &m_CapElement, &rc );
+ rc.left += 5; // Make a left margin
+ WCHAR wszOutput[256];
+ wcscpy_s( wszOutput, 256, m_wszCaption );
+ if( m_bMinimized )
+ wcscat_s( wszOutput, 256, L" (Minimized)" );
+ DrawText9( wszOutput, &m_CapElement, &rc, true );
+ }
+
+ // If the dialog is minimized, skip rendering
+ // its controls.
+ if( !m_bMinimized )
+ {
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ // Focused control is drawn last
+ if( pControl == s_pControlFocus )
+ continue;
+
+ pControl->Render( fElapsedTime );
+ }
+
+ if( s_pControlFocus != NULL && s_pControlFocus->m_pDialog == this )
+ s_pControlFocus->Render( fElapsedTime );
+ }
+
+ m_pManager->m_pSprite->End();
+
+ m_pManager->m_pStateBlock->Apply();
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::OnRender11( float fElapsedTime )
+{
+ // If this assert triggers, you need to call CDXUTDialogResourceManager::On*Device() from inside
+ // the application's device callbacks. See the SDK samples for an example of how to do this.
+ assert( m_pManager->GetD3D11Device() &&
+ L"To fix hook up CDXUTDialogResourceManager to device callbacks. See comments for details" );
+
+ // See if the dialog needs to be refreshed
+ if( m_fTimeLastRefresh < s_fTimeRefresh )
+ {
+ m_fTimeLastRefresh = DXUTGetTime();
+ Refresh();
+ }
+
+ // For invisible dialog, out now.
+ if( !m_bVisible ||
+ ( m_bMinimized && !m_bCaption ) )
+ return S_OK;
+
+ ID3D11Device* pd3dDevice = m_pManager->GetD3D11Device();
+ ID3D11DeviceContext* pd3dDeviceContext = m_pManager->GetD3D11DeviceContext();
+
+ // Set up a state block here and restore it when finished drawing all the controls
+ m_pManager->StoreD3D11State( pd3dDeviceContext );
+
+ BOOL bBackgroundIsVisible = ( m_colorTopLeft | m_colorTopRight | m_colorBottomRight | m_colorBottomLeft ) &
+ 0xff000000;
+ if( !m_bMinimized && bBackgroundIsVisible )
+ {
+ // Convert the draw rectangle from screen coordinates to clip space coordinates.
+ float Left, Right, Top, Bottom;
+ Left = m_x * 2.0f / m_pManager->m_nBackBufferWidth - 1.0f;
+ Right = ( m_x + m_width ) * 2.0f / m_pManager->m_nBackBufferWidth - 1.0f;
+ Top = 1.0f - m_y * 2.0f / m_pManager->m_nBackBufferHeight;
+ Bottom = 1.0f - ( m_y + m_height ) * 2.0f / m_pManager->m_nBackBufferHeight;
+
+ DXUT_SCREEN_VERTEX_10 vertices[4] =
+ {
+ Left, Top, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorTopLeft ), 0.0f, 0.0f,
+ Right, Top, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorTopRight ), 1.0f, 0.0f,
+ Left, Bottom, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorBottomLeft ), 0.0f, 1.0f,
+ Right, Bottom, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorBottomRight ), 1.0f, 1.0f,
+ };
+
+ //DXUT_SCREEN_VERTEX_10 *pVB;
+ D3D11_MAPPED_SUBRESOURCE MappedData;
+ if( SUCCEEDED( pd3dDeviceContext->Map( m_pManager->m_pVBScreenQuad11, 0, D3D11_MAP_WRITE_DISCARD,
+ 0, &MappedData ) ) )
+ {
+ CopyMemory( MappedData.pData, vertices, sizeof( vertices ) );
+ pd3dDeviceContext->Unmap( m_pManager->m_pVBScreenQuad11, 0 );
+ }
+
+ // Set the quad VB as current
+ UINT stride = sizeof( DXUT_SCREEN_VERTEX_10 );
+ UINT offset = 0;
+ pd3dDeviceContext->IASetVertexBuffers( 0, 1, &m_pManager->m_pVBScreenQuad11, &stride, &offset );
+ pd3dDeviceContext->IASetInputLayout( m_pManager->m_pInputLayout11 );
+ pd3dDeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP );
+
+ // Setup for rendering
+ m_pManager->ApplyRenderUIUntex11( pd3dDeviceContext );
+ pd3dDeviceContext->Draw( 4, 0 );
+ }
+
+ DXUTTextureNode* pTextureNode = GetTexture( 0 );
+ pd3dDeviceContext->PSSetShaderResources( 0, 1, &pTextureNode->pTexResView11 );
+
+ // Sort depth back to front
+ m_pManager->BeginSprites11();
+ BeginText11();
+
+ m_pManager->ApplyRenderUI11( pd3dDeviceContext );
+
+ // Render the caption if it's enabled.
+ if( m_bCaption )
+ {
+ // DrawSprite will offset the rect down by
+ // m_nCaptionHeight, so adjust the rect higher
+ // here to negate the effect.
+ RECT rc = { 0, -m_nCaptionHeight, m_width, 0 };
+ DrawSprite11( &m_CapElement, &rc, 0.99f );
+ rc.left += 5; // Make a left margin
+ WCHAR wszOutput[256];
+ wcscpy_s( wszOutput, 256, m_wszCaption );
+ if( m_bMinimized )
+ wcscat_s( wszOutput, 256, L" (Minimized)" );
+ DrawText11( pd3dDevice, pd3dDeviceContext, wszOutput, &m_CapElement, &rc, true );
+ }
+
+ // If the dialog is minimized, skip rendering
+ // its controls.
+ if( !m_bMinimized )
+ {
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ // Focused control is drawn last
+ if( pControl == s_pControlFocus )
+ continue;
+
+ pControl->Render( fElapsedTime );
+ }
+
+ if( s_pControlFocus != NULL && s_pControlFocus->m_pDialog == this )
+ s_pControlFocus->Render( fElapsedTime );
+ }
+
+ // End sprites
+ if( m_bCaption )
+ {
+ m_pManager->EndSprites11( pd3dDevice, pd3dDeviceContext );
+ EndText11( pd3dDevice, pd3dDeviceContext );
+ }
+ m_pManager->RestoreD3D11State( pd3dDeviceContext );
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+VOID CDXUTDialog::SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl )
+{
+ // If no callback has been registered there's nowhere to send the event to
+ if( m_pCallbackEvent == NULL )
+ return;
+
+ // Discard events triggered programatically if these types of events haven't been
+ // enabled
+ if( !bTriggeredByUser && !m_bNonUserEvents )
+ return;
+
+ m_pCallbackEvent( nEvent, pControl->GetID(), pControl, m_pCallbackEventUserContext );
+}
+
+
+//--------------------------------------------------------------------------------------
+int CDXUTDialogResourceManager::AddFont( LPCWSTR strFaceName, LONG height, LONG weight )
+{
+ // See if this font already exists
+ for( int i = 0; i < m_FontCache.GetSize(); i++ )
+ {
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( i );
+ size_t nLen = 0;
+ nLen = wcsnlen( strFaceName, MAX_PATH);
+ if( 0 == _wcsnicmp( pFontNode->strFace, strFaceName, nLen ) &&
+ pFontNode->nHeight == height &&
+ pFontNode->nWeight == weight )
+ {
+ return i;
+ }
+ }
+
+ // Add a new font and try to create it
+ DXUTFontNode* pNewFontNode = new DXUTFontNode;
+ if( pNewFontNode == NULL )
+ return -1;
+
+ ZeroMemory( pNewFontNode, sizeof( DXUTFontNode ) );
+ wcscpy_s( pNewFontNode->strFace, MAX_PATH, strFaceName );
+ pNewFontNode->nHeight = height;
+ pNewFontNode->nWeight = weight;
+ m_FontCache.Add( pNewFontNode );
+
+ int iFont = m_FontCache.GetSize() - 1;
+
+ // If a device is available, try to create immediately
+ if( m_pd3d9Device )
+ CreateFont9( iFont );
+
+ return iFont;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight )
+{
+ // If this assert triggers, you need to call CDXUTDialog::Init() first. This change
+ // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The
+ // creation and interfacing with CDXUTDialogResourceManager is now the responsibility
+ // of the application if it wishes to use DXUT's GUI.
+ assert( m_pManager != NULL && L"To fix call CDXUTDialog::Init() first. See comments for details." );
+
+ // Make sure the list is at least as large as the index being set
+ UINT i;
+ for( i = m_Fonts.GetSize(); i <= index; i++ )
+ {
+ m_Fonts.Add( -1 );
+ }
+
+ int iFont = m_pManager->AddFont( strFaceName, height, weight );
+ m_Fonts.SetAt( index, iFont );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+DXUTFontNode* CDXUTDialog::GetFont( UINT index )
+{
+ if( NULL == m_pManager )
+ return NULL;
+ return m_pManager->GetFontNode( m_Fonts.GetAt( index ) );
+}
+
+
+//--------------------------------------------------------------------------------------
+int CDXUTDialogResourceManager::AddTexture( LPCWSTR strFilename )
+{
+ // See if this texture already exists
+ for( int i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
+ size_t nLen = 0;
+ nLen = wcsnlen( strFilename, MAX_PATH);
+ if( pTextureNode->bFileSource && // Sources must match
+ 0 == _wcsnicmp( pTextureNode->strFilename, strFilename, nLen ) )
+ {
+ return i;
+ }
+ }
+
+ // Add a new texture and try to create it
+ DXUTTextureNode* pNewTextureNode = new DXUTTextureNode;
+ if( pNewTextureNode == NULL )
+ return -1;
+
+ ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) );
+ pNewTextureNode->bFileSource = true;
+ wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strFilename );
+
+ m_TextureCache.Add( pNewTextureNode );
+
+ int iTexture = m_TextureCache.GetSize() - 1;
+
+ // If a device is available, try to create immediately
+ if( m_pd3d9Device )
+ CreateTexture9( iTexture );
+
+ return iTexture;
+}
+
+
+//--------------------------------------------------------------------------------------
+int CDXUTDialogResourceManager::AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule )
+{
+ // See if this texture already exists
+ for( int i = 0; i < m_TextureCache.GetSize(); i++ )
+ {
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i );
+ if( !pTextureNode->bFileSource && // Sources must match
+ pTextureNode->hResourceModule == hResourceModule ) // Module handles must match
+ {
+ if( IS_INTRESOURCE( strResourceName ) )
+ {
+ // Integer-based ID
+ if( ( INT_PTR )strResourceName == pTextureNode->nResourceID )
+ return i;
+ }
+ else
+ {
+ // String-based ID
+ size_t nLen = 0;
+ nLen = wcsnlen ( strResourceName, MAX_PATH );
+ if( 0 == _wcsnicmp( pTextureNode->strFilename, strResourceName, nLen ) )
+ return i;
+ }
+ }
+ }
+
+ // Add a new texture and try to create it
+ DXUTTextureNode* pNewTextureNode = new DXUTTextureNode;
+ if( pNewTextureNode == NULL )
+ return -1;
+
+ ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) );
+ pNewTextureNode->hResourceModule = hResourceModule;
+ if( IS_INTRESOURCE( strResourceName ) )
+ {
+ pNewTextureNode->nResourceID = ( int )( size_t )strResourceName;
+ }
+ else
+ {
+ pNewTextureNode->nResourceID = 0;
+ wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strResourceName );
+ }
+
+ m_TextureCache.Add( pNewTextureNode );
+
+ int iTexture = m_TextureCache.GetSize() - 1;
+
+ // If a device is available, try to create immediately
+ if( m_pd3d9Device )
+ CreateTexture9( iTexture );
+
+ return iTexture;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::SetTexture( UINT index, LPCWSTR strFilename )
+{
+ // If this assert triggers, you need to call CDXUTDialog::Init() first. This change
+ // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The
+ // creation and interfacing with CDXUTDialogResourceManager is now the responsibility
+ // of the application if it wishes to use DXUT's GUI.
+ assert( m_pManager != NULL && L"To fix this, call CDXUTDialog::Init() first. See comments for details." );
+
+ // Make sure the list is at least as large as the index being set
+ for( UINT i = m_Textures.GetSize(); i <= index; i++ )
+ {
+ m_Textures.Add( -1 );
+ }
+
+ int iTexture = m_pManager->AddTexture( strFilename );
+
+ m_Textures.SetAt( index, iTexture );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule )
+{
+ // If this assert triggers, you need to call CDXUTDialog::Init() first. This change
+ // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The
+ // creation and interfacing with CDXUTDialogResourceManager is now the responsibility
+ // of the application if it wishes to use DXUT's GUI.
+ assert( m_pManager != NULL && L"To fix this, call CDXUTDialog::Init() first. See comments for details." );
+
+ // Make sure the list is at least as large as the index being set
+ for( UINT i = m_Textures.GetSize(); i <= index; i++ )
+ {
+ m_Textures.Add( -1 );
+ }
+
+ int iTexture = m_pManager->AddTexture( strResourceName, hResourceModule );
+
+ m_Textures.SetAt( index, iTexture );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+DXUTTextureNode* CDXUTDialog::GetTexture( UINT index )
+{
+ if( NULL == m_pManager )
+ return NULL;
+ return m_pManager->GetTextureNode( m_Textures.GetAt( index ) );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ bool bHandled = false;
+
+ // For invisible dialog, do not handle anything.
+ if( !m_bVisible )
+ return false;
+
+ // If automation command-line switch is on, enable this dialog's keyboard input
+ // upon any key press or mouse click.
+ if( DXUTGetAutomation() &&
+ ( WM_LBUTTONDOWN == uMsg || WM_LBUTTONDBLCLK == uMsg || WM_KEYDOWN == uMsg ) )
+ {
+ m_pManager->EnableKeyboardInputForAllDialogs();
+ }
+
+ // If caption is enable, check for clicks in the caption area.
+ if( m_bCaption )
+ {
+ if( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK )
+ {
+ POINT mousePoint =
+ {
+ short( LOWORD( lParam ) ), short( HIWORD( lParam ) )
+ };
+
+ if( mousePoint.x >= m_x && mousePoint.x < m_x + m_width &&
+ mousePoint.y >= m_y && mousePoint.y < m_y + m_nCaptionHeight )
+ {
+ m_bDrag = true;
+ SetCapture( DXUTGetHWND() );
+ return true;
+ }
+ }
+ else if( uMsg == WM_LBUTTONUP && m_bDrag )
+ {
+ POINT mousePoint =
+ {
+ short( LOWORD( lParam ) ), short( HIWORD( lParam ) )
+ };
+
+ if( mousePoint.x >= m_x && mousePoint.x < m_x + m_width &&
+ mousePoint.y >= m_y && mousePoint.y < m_y + m_nCaptionHeight )
+ {
+ ReleaseCapture();
+ m_bDrag = false;
+ m_bMinimized = !m_bMinimized;
+ return true;
+ }
+ }
+ }
+
+ // If the dialog is minimized, don't send any messages to controls.
+ if( m_bMinimized )
+ return false;
+
+ // If a control is in focus, it belongs to this dialog, and it's enabled, then give
+ // it the first chance at handling the message.
+ if( s_pControlFocus &&
+ s_pControlFocus->m_pDialog == this &&
+ s_pControlFocus->GetEnabled() )
+ {
+ // If the control MsgProc handles it, then we don't.
+ if( s_pControlFocus->MsgProc( uMsg, wParam, lParam ) )
+ return true;
+ }
+
+ switch( uMsg )
+ {
+ case WM_SIZE:
+ case WM_MOVE:
+ {
+ // Handle sizing and moving messages so that in case the mouse cursor is moved out
+ // of an UI control because of the window adjustment, we can properly
+ // unhighlight the highlighted control.
+ POINT pt =
+ {
+ -1, -1
+ };
+ OnMouseMove( pt );
+ break;
+ }
+
+ case WM_ACTIVATEAPP:
+ // Call OnFocusIn()/OnFocusOut() of the control that currently has the focus
+ // as the application is activated/deactivated. This matches the Windows
+ // behavior.
+ if( s_pControlFocus &&
+ s_pControlFocus->m_pDialog == this &&
+ s_pControlFocus->GetEnabled() )
+ {
+ if( wParam )
+ s_pControlFocus->OnFocusIn();
+ else
+ s_pControlFocus->OnFocusOut();
+ }
+ break;
+
+ // Keyboard messages
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ {
+ // If a control is in focus, it belongs to this dialog, and it's enabled, then give
+ // it the first chance at handling the message.
+ if( s_pControlFocus &&
+ s_pControlFocus->m_pDialog == this &&
+ s_pControlFocus->GetEnabled() )
+ {
+ if( s_pControlFocus->HandleKeyboard( uMsg, wParam, lParam ) )
+ return true;
+ }
+
+ // Not yet handled, see if this matches a control's hotkey
+ // Activate the hotkey if the focus doesn't belong to an
+ // edit box.
+ if( uMsg == WM_KEYDOWN && ( !s_pControlFocus ||
+ ( s_pControlFocus->GetType() != DXUT_CONTROL_EDITBOX
+ && s_pControlFocus->GetType() != DXUT_CONTROL_IMEEDITBOX ) ) )
+ {
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+ if( pControl->GetHotkey() == wParam )
+ {
+ pControl->OnHotkey();
+ return true;
+ }
+ }
+ }
+
+ // Not yet handled, check for focus messages
+ if( uMsg == WM_KEYDOWN )
+ {
+ // If keyboard input is not enabled, this message should be ignored
+ if( !m_bKeyboardInput )
+ return false;
+
+ switch( wParam )
+ {
+ case VK_RIGHT:
+ case VK_DOWN:
+ if( s_pControlFocus != NULL )
+ {
+ return OnCycleFocus( true );
+ }
+ break;
+
+ case VK_LEFT:
+ case VK_UP:
+ if( s_pControlFocus != NULL )
+ {
+ return OnCycleFocus( false );
+ }
+ break;
+
+ case VK_TAB:
+ {
+ bool bShiftDown = ( ( GetKeyState( VK_SHIFT ) & 0x8000 ) != 0 );
+ return OnCycleFocus( !bShiftDown );
+ }
+ }
+ }
+
+ break;
+ }
+
+
+ // Mouse messages
+ case WM_MOUSEMOVE:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONUP:
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ case WM_XBUTTONDOWN:
+ case WM_XBUTTONUP:
+ case WM_LBUTTONDBLCLK:
+ case WM_MBUTTONDBLCLK:
+ case WM_RBUTTONDBLCLK:
+ case WM_XBUTTONDBLCLK:
+ case WM_MOUSEWHEEL:
+ {
+ // If not accepting mouse input, return false to indicate the message should still
+ // be handled by the application (usually to move the camera).
+ if( !m_bMouseInput )
+ return false;
+
+ POINT mousePoint =
+ {
+ short( LOWORD( lParam ) ), short( HIWORD( lParam ) )
+ };
+ mousePoint.x -= m_x;
+ mousePoint.y -= m_y;
+
+ // If caption is enabled, offset the Y coordinate by the negative of its height.
+ if( m_bCaption )
+ mousePoint.y -= m_nCaptionHeight;
+
+ // If a control is in focus, it belongs to this dialog, and it's enabled, then give
+ // it the first chance at handling the message.
+ if( s_pControlFocus &&
+ s_pControlFocus->m_pDialog == this &&
+ s_pControlFocus->GetEnabled() )
+ {
+ if( s_pControlFocus->HandleMouse( uMsg, mousePoint, wParam, lParam ) )
+ return true;
+ }
+
+ // Not yet handled, see if the mouse is over any controls
+ CDXUTControl* pControl = GetControlAtPoint( mousePoint );
+ if( pControl != NULL && pControl->GetEnabled() )
+ {
+ bHandled = pControl->HandleMouse( uMsg, mousePoint, wParam, lParam );
+ if( bHandled )
+ return true;
+ }
+ else
+ {
+ // Mouse not over any controls in this dialog, if there was a control
+ // which had focus it just lost it
+ if( uMsg == WM_LBUTTONDOWN &&
+ s_pControlFocus &&
+ s_pControlFocus->m_pDialog == this )
+ {
+ s_pControlFocus->OnFocusOut();
+ s_pControlFocus = NULL;
+ }
+ }
+
+ // Still not handled, hand this off to the dialog. Return false to indicate the
+ // message should still be handled by the application (usually to move the camera).
+ switch( uMsg )
+ {
+ case WM_MOUSEMOVE:
+ OnMouseMove( mousePoint );
+ return false;
+ }
+
+ break;
+ }
+
+ case WM_CAPTURECHANGED:
+ {
+ // The application has lost mouse capture.
+ // The dialog object may not have received
+ // a WM_MOUSEUP when capture changed. Reset
+ // m_bDrag so that the dialog does not mistakenly
+ // think the mouse button is still held down.
+ if( ( HWND )lParam != hWnd )
+ m_bDrag = false;
+ }
+ }
+
+ return false;
+}
+
+//--------------------------------------------------------------------------------------
+CDXUTControl* CDXUTDialog::GetControlAtPoint( POINT pt )
+{
+ // Search through all child controls for the first one which
+ // contains the mouse point
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ if( pControl == NULL )
+ {
+ continue;
+ }
+
+ // We only return the current control if it is visible
+ // and enabled. Because GetControlAtPoint() is used to do mouse
+ // hittest, it makes sense to perform this filtering.
+ if( pControl->ContainsPoint( pt ) && pControl->GetEnabled() && pControl->GetVisible() )
+ {
+ return pControl;
+ }
+ }
+
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTDialog::GetControlEnabled( int ID )
+{
+ CDXUTControl* pControl = GetControl( ID );
+ if( pControl == NULL )
+ return false;
+
+ return pControl->GetEnabled();
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::SetControlEnabled( int ID, bool bEnabled )
+{
+ CDXUTControl* pControl = GetControl( ID );
+ if( pControl == NULL )
+ return;
+
+ pControl->SetEnabled( bEnabled );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::OnMouseUp( POINT pt )
+{
+ s_pControlPressed = NULL;
+ m_pControlMouseOver = NULL;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::OnMouseMove( POINT pt )
+{
+ // Figure out which control the mouse is over now
+ CDXUTControl* pControl = GetControlAtPoint( pt );
+
+ // If the mouse is still over the same control, nothing needs to be done
+ if( pControl == m_pControlMouseOver )
+ return;
+
+ // Handle mouse leaving the old control
+ if( m_pControlMouseOver )
+ m_pControlMouseOver->OnMouseLeave();
+
+ // Handle mouse entering the new control
+ m_pControlMouseOver = pControl;
+ if( pControl != NULL )
+ m_pControlMouseOver->OnMouseEnter();
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement )
+{
+ // If this Element type already exist in the list, simply update the stored Element
+ for( int i = 0; i < m_DefaultElements.GetSize(); i++ )
+ {
+ DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
+
+ if( pElementHolder->nControlType == nControlType &&
+ pElementHolder->iElement == iElement )
+ {
+ pElementHolder->Element = *pElement;
+ return S_OK;
+ }
+ }
+
+ // Otherwise, add a new entry
+ DXUTElementHolder* pNewHolder;
+ pNewHolder = new DXUTElementHolder;
+ if( pNewHolder == NULL )
+ return E_OUTOFMEMORY;
+
+ pNewHolder->nControlType = nControlType;
+ pNewHolder->iElement = iElement;
+ pNewHolder->Element = *pElement;
+
+ HRESULT hr = m_DefaultElements.Add( pNewHolder );
+ if( FAILED( hr ) )
+ {
+ delete pNewHolder;
+ }
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTElement* CDXUTDialog::GetDefaultElement( UINT nControlType, UINT iElement )
+{
+ for( int i = 0; i < m_DefaultElements.GetSize(); i++ )
+ {
+ DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
+
+ if( pElementHolder->nControlType == nControlType &&
+ pElementHolder->iElement == iElement )
+ {
+ return &pElementHolder->Element;
+ }
+ }
+
+ return NULL;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault,
+ CDXUTStatic** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTStatic* pStatic = new CDXUTStatic( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pStatic;
+
+ if( pStatic == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pStatic );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pStatic->SetID( ID );
+ pStatic->SetText( strText );
+ pStatic->SetLocation( x, y );
+ pStatic->SetSize( width, height );
+ pStatic->m_bIsDefault = bIsDefault;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey,
+ bool bIsDefault, CDXUTButton** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTButton* pButton = new CDXUTButton( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pButton;
+
+ if( pButton == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pButton );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pButton->SetID( ID );
+ pButton->SetText( strText );
+ pButton->SetLocation( x, y );
+ pButton->SetSize( width, height );
+ pButton->SetHotkey( nHotkey );
+ pButton->m_bIsDefault = bIsDefault;
+
+ return S_OK;
+}
+
+HRESULT CDXUTDialog::AddButtonCallback(std::function<void()> cb, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey,
+ bool bIsDefault, CDXUTButton** ppCreated)
+{
+ HRESULT hr = S_OK;
+
+ CDXUTButton* pButton = new CDXUTButton(this);
+
+ if (ppCreated != NULL)
+ *ppCreated = pButton;
+
+ if (pButton == NULL)
+ return E_OUTOFMEMORY;
+
+ hr = AddControl(pButton);
+ if (FAILED(hr))
+ return hr;
+
+ // Set the ID and list index
+ pButton->SetID(-1);
+ pButton->SetText(strText);
+ pButton->SetLocation(x, y);
+ pButton->SetSize(width, height);
+ pButton->SetHotkey(nHotkey);
+ pButton->m_bIsDefault = bIsDefault;
+ pButton->SetUserData(new std::function<void()>(cb));
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked,
+ UINT nHotkey, bool bIsDefault, CDXUTCheckBox** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTCheckBox* pCheckBox = new CDXUTCheckBox( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pCheckBox;
+
+ if( pCheckBox == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pCheckBox );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pCheckBox->SetID( ID );
+ pCheckBox->SetText( strText );
+ pCheckBox->SetLocation( x, y );
+ pCheckBox->SetSize( width, height );
+ pCheckBox->SetHotkey( nHotkey );
+ pCheckBox->m_bIsDefault = bIsDefault;
+ pCheckBox->SetChecked( bChecked );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, int height,
+ bool bChecked, UINT nHotkey, bool bIsDefault, CDXUTRadioButton** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTRadioButton* pRadioButton = new CDXUTRadioButton( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pRadioButton;
+
+ if( pRadioButton == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pRadioButton );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pRadioButton->SetID( ID );
+ pRadioButton->SetText( strText );
+ pRadioButton->SetButtonGroup( nButtonGroup );
+ pRadioButton->SetLocation( x, y );
+ pRadioButton->SetSize( width, height );
+ pRadioButton->SetHotkey( nHotkey );
+ pRadioButton->SetChecked( bChecked );
+ pRadioButton->m_bIsDefault = bIsDefault;
+ pRadioButton->SetChecked( bChecked );
+
+ return S_OK;
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddComboBox( int ID, int x, int y, int width, int height, UINT nHotkey, bool bIsDefault,
+ CDXUTComboBox** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTComboBox* pComboBox = new CDXUTComboBox( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pComboBox;
+
+ if( pComboBox == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pComboBox );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pComboBox->SetID( ID );
+ pComboBox->SetLocation( x, y );
+ pComboBox->SetSize( width, height );
+ pComboBox->SetHotkey( nHotkey );
+ pComboBox->m_bIsDefault = bIsDefault;
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddSlider( int ID, int x, int y, int width, int height, int min, int max, int value,
+ bool bIsDefault, CDXUTSlider** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTSlider* pSlider = new CDXUTSlider( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pSlider;
+
+ if( pSlider == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pSlider );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and list index
+ pSlider->SetID( ID );
+ pSlider->SetLocation( x, y );
+ pSlider->SetSize( width, height );
+ pSlider->m_bIsDefault = bIsDefault;
+ pSlider->SetRange( min, max );
+ pSlider->SetValue( value );
+ pSlider->UpdateRects();
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault,
+ CDXUTEditBox** ppCreated )
+{
+ HRESULT hr = S_OK;
+
+ CDXUTEditBox* pEditBox = new CDXUTEditBox( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pEditBox;
+
+ if( pEditBox == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pEditBox );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and position
+ pEditBox->SetID( ID );
+ pEditBox->SetLocation( x, y );
+ pEditBox->SetSize( width, height );
+ pEditBox->m_bIsDefault = bIsDefault;
+
+ if( strText )
+ pEditBox->SetText( strText );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle, CDXUTListBox** ppCreated )
+{
+ HRESULT hr = S_OK;
+ CDXUTListBox* pListBox = new CDXUTListBox( this );
+
+ if( ppCreated != NULL )
+ *ppCreated = pListBox;
+
+ if( pListBox == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = AddControl( pListBox );
+ if( FAILED( hr ) )
+ return hr;
+
+ // Set the ID and position
+ pListBox->SetID( ID );
+ pListBox->SetLocation( x, y );
+ pListBox->SetSize( width, height );
+ pListBox->SetStyle( dwStyle );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::InitControl( CDXUTControl* pControl )
+{
+ HRESULT hr;
+
+ if( pControl == NULL )
+ return E_INVALIDARG;
+
+ pControl->m_Index = m_Controls.GetSize();
+
+ // Look for a default Element entries
+ for( int i = 0; i < m_DefaultElements.GetSize(); i++ )
+ {
+ DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
+ if( pElementHolder->nControlType == pControl->GetType() )
+ pControl->SetElement( pElementHolder->iElement, &pElementHolder->Element );
+ }
+
+ V_RETURN( pControl->OnInit() );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::AddControl( CDXUTControl* pControl )
+{
+ HRESULT hr = S_OK;
+
+ hr = InitControl( pControl );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"CDXUTDialog::InitControl", hr );
+
+ // Add to the list
+ hr = m_Controls.Add( pControl );
+ if( FAILED( hr ) )
+ {
+ return DXTRACE_ERR( L"CGrowableArray::Add", hr );
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTControl* CDXUTDialog::GetControl( int ID )
+{
+ // Try to find the control with the given ID
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ if( pControl->GetID() == ID )
+ {
+ return pControl;
+ }
+ }
+
+ // Not found
+ return NULL;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+CDXUTControl* CDXUTDialog::GetControl( int ID, UINT nControlType )
+{
+ // Try to find the control with the given ID
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ if( pControl->GetID() == ID && pControl->GetType() == nControlType )
+ {
+ return pControl;
+ }
+ }
+
+ // Not found
+ return NULL;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+CDXUTControl* CDXUTDialog::GetNextControl( CDXUTControl* pControl )
+{
+ int index = pControl->m_Index + 1;
+
+ CDXUTDialog* pDialog = pControl->m_pDialog;
+
+ // Cycle through dialogs in the loop to find the next control. Note
+ // that if only one control exists in all looped dialogs it will
+ // be the returned 'next' control.
+ while( index >= ( int )pDialog->m_Controls.GetSize() )
+ {
+ pDialog = pDialog->m_pNextDialog;
+ index = 0;
+ }
+
+ return pDialog->m_Controls.GetAt( index );
+}
+
+//--------------------------------------------------------------------------------------
+CDXUTControl* CDXUTDialog::GetPrevControl( CDXUTControl* pControl )
+{
+ int index = pControl->m_Index - 1;
+
+ CDXUTDialog* pDialog = pControl->m_pDialog;
+
+ // Cycle through dialogs in the loop to find the next control. Note
+ // that if only one control exists in all looped dialogs it will
+ // be the returned 'previous' control.
+ while( index < 0 )
+ {
+ pDialog = pDialog->m_pPrevDialog;
+ if( pDialog == NULL )
+ pDialog = pControl->m_pDialog;
+
+ index = pDialog->m_Controls.GetSize() - 1;
+ }
+
+ return pDialog->m_Controls.GetAt( index );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::ClearRadioButtonGroup( UINT nButtonGroup )
+{
+ // Find all radio buttons with the given group number
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+
+ if( pControl->GetType() == DXUT_CONTROL_RADIOBUTTON )
+ {
+ CDXUTRadioButton* pRadioButton = ( CDXUTRadioButton* )pControl;
+
+ if( pRadioButton->GetButtonGroup() == nButtonGroup )
+ pRadioButton->SetChecked( false, false );
+ }
+ }
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::ClearComboBox( int ID )
+{
+ CDXUTComboBox* pComboBox = GetComboBox( ID );
+ if( pComboBox == NULL )
+ return;
+
+ pComboBox->RemoveAllItems();
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::RequestFocus( CDXUTControl* pControl )
+{
+ if( s_pControlFocus == pControl )
+ return;
+
+ if( !pControl->CanHaveFocus() )
+ return;
+
+ if( s_pControlFocus )
+ s_pControlFocus->OnFocusOut();
+
+ pControl->OnFocusIn();
+ s_pControlFocus = pControl;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawRect( RECT* pRect, D3DCOLOR color )
+{
+ if( m_pManager->GetD3D9Device() )
+ return DrawRect9( pRect, color );
+ return E_FAIL;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawRect9( RECT* pRect, D3DCOLOR color )
+{
+ RECT rcScreen = *pRect;
+ OffsetRect( &rcScreen, m_x, m_y );
+
+ // If caption is enabled, offset the Y position by its height.
+ if( m_bCaption )
+ OffsetRect( &rcScreen, 0, m_nCaptionHeight );
+
+ DXUT_SCREEN_VERTEX vertices[4] =
+ {
+ ( float )rcScreen.left - 0.5f, ( float )rcScreen.top - 0.5f, 0.5f, 1.0f, color, 0, 0,
+ ( float )rcScreen.right - 0.5f, ( float )rcScreen.top - 0.5f, 0.5f, 1.0f, color, 0, 0,
+ ( float )rcScreen.right - 0.5f, ( float )rcScreen.bottom - 0.5f, 0.5f, 1.0f, color, 0, 0,
+ ( float )rcScreen.left - 0.5f, ( float )rcScreen.bottom - 0.5f, 0.5f, 1.0f, color, 0, 0,
+ };
+
+ IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device();
+
+ // Since we're doing our own drawing here we need to flush the sprites
+ m_pManager->m_pSprite->Flush();
+ IDirect3DVertexDeclaration9* pDecl = NULL;
+ pd3dDevice->GetVertexDeclaration( &pDecl ); // Preserve the sprite's current vertex decl
+ pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX::FVF );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
+
+ pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertices, sizeof( DXUT_SCREEN_VERTEX ) );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
+
+ // Restore the vertex decl
+ pd3dDevice->SetVertexDeclaration( pDecl );
+ pDecl->Release();
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color )
+{
+ DXUT_SCREEN_VERTEX* vertices = new DXUT_SCREEN_VERTEX[ nNumPoints ];
+ if( vertices == NULL )
+ return E_OUTOFMEMORY;
+
+ DXUT_SCREEN_VERTEX* pVertex = vertices;
+ POINT* pt = apPoints;
+ for( UINT i = 0; i < nNumPoints; i++ )
+ {
+ pVertex->x = m_x + ( float )pt->x;
+ pVertex->y = m_y + ( float )pt->y;
+ pVertex->z = 0.5f;
+ pVertex->h = 1.0f;
+ pVertex->color = color;
+ pVertex->tu = 0.0f;
+ pVertex->tv = 0.0f;
+
+ pVertex++;
+ pt++;
+ }
+
+ IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device();
+
+ // Since we're doing our own drawing here we need to flush the sprites
+ m_pManager->m_pSprite->Flush();
+ IDirect3DVertexDeclaration9* pDecl = NULL;
+ pd3dDevice->GetVertexDeclaration( &pDecl ); // Preserve the sprite's current vertex decl
+ pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX::FVF );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
+
+ pd3dDevice->DrawPrimitiveUP( D3DPT_LINESTRIP, nNumPoints - 1, vertices, sizeof( DXUT_SCREEN_VERTEX ) );
+
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
+ pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
+
+ // Restore the vertex decl
+ pd3dDevice->SetVertexDeclaration( pDecl );
+ pDecl->Release();
+
+ SAFE_DELETE_ARRAY( vertices );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawSprite( CDXUTElement* pElement, RECT* prcDest, float fDepth )
+{
+ if( m_pManager->GetD3D9Device() )
+ return DrawSprite9( pElement, prcDest );
+ else
+ return DrawSprite11( pElement, prcDest, fDepth );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawSprite9( CDXUTElement* pElement, RECT* prcDest )
+{
+ // No need to draw fully transparent layers
+ if( pElement->TextureColor.Current.a == 0 )
+ return S_OK;
+
+ RECT rcTexture = pElement->rcTexture;
+
+ RECT rcScreen = *prcDest;
+ OffsetRect( &rcScreen, m_x, m_y );
+
+ // If caption is enabled, offset the Y position by its height.
+ if( m_bCaption )
+ OffsetRect( &rcScreen, 0, m_nCaptionHeight );
+
+ DXUTTextureNode* pTextureNode = GetTexture( pElement->iTexture );
+ if( pTextureNode == NULL )
+ return E_FAIL;
+
+ float fScaleX = ( float )RectWidth( rcScreen ) / RectWidth( rcTexture );
+ float fScaleY = ( float )RectHeight( rcScreen ) / RectHeight( rcTexture );
+
+ D3DXMATRIXA16 matTransform;
+ D3DXMatrixScaling( &matTransform, fScaleX, fScaleY, 1.0f );
+
+ m_pManager->m_pSprite->SetTransform( &matTransform );
+
+ D3DXVECTOR3 vPos( ( float )rcScreen.left, ( float )rcScreen.top, 0.0f );
+
+ vPos.x /= fScaleX;
+ vPos.y /= fScaleY;
+
+ return m_pManager->m_pSprite->Draw( pTextureNode->pTexture9, &rcTexture, NULL, &vPos,
+ pElement->TextureColor.Current );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawSprite11( CDXUTElement* pElement, RECT* prcDest, float fDepth )
+{
+ // No need to draw fully transparent layers
+ if( pElement->TextureColor.Current.a == 0 )
+ return S_OK;
+
+ RECT rcTexture = pElement->rcTexture;
+
+ RECT rcScreen = *prcDest;
+ OffsetRect( &rcScreen, m_x, m_y );
+
+ // If caption is enabled, offset the Y position by its height.
+ if( m_bCaption )
+ OffsetRect( &rcScreen, 0, m_nCaptionHeight );
+
+ DXUTTextureNode* pTextureNode = GetTexture( pElement->iTexture );
+ if( pTextureNode == NULL )
+ return E_FAIL;
+
+ float fBBWidth = ( float )m_pManager->m_nBackBufferWidth;
+ float fBBHeight = ( float )m_pManager->m_nBackBufferHeight;
+ float fTexWidth = ( float )pTextureNode->dwWidth;
+ float fTexHeight = ( float )pTextureNode->dwHeight;
+
+ float fRectLeft = rcScreen.left / fBBWidth;
+ float fRectTop = 1.0f - rcScreen.top / fBBHeight;
+ float fRectRight = rcScreen.right / fBBWidth;
+ float fRectBottom = 1.0f - rcScreen.bottom / fBBHeight;
+
+ fRectLeft = fRectLeft * 2.0f - 1.0f;
+ fRectTop = fRectTop * 2.0f - 1.0f;
+ fRectRight = fRectRight * 2.0f - 1.0f;
+ fRectBottom = fRectBottom * 2.0f - 1.0f;
+
+ float fTexLeft = rcTexture.left / fTexWidth;
+ float fTexTop = rcTexture.top / fTexHeight;
+ float fTexRight = rcTexture.right / fTexWidth;
+ float fTexBottom = rcTexture.bottom / fTexHeight;
+
+ // Add 6 sprite vertices
+ DXUTSpriteVertex SpriteVertex;
+
+ // tri1
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexTop );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ // tri2
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexBottom );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom );
+ SpriteVertex.vColor = pElement->TextureColor.Current;
+ m_pManager->m_SpriteVertices.Add( SpriteVertex );
+
+ // Why are we drawing the sprite every time? This is very inefficient, but the sprite workaround doesn't have support for sorting now, so we have to
+ // draw a sprite every time to keep the order correct between sprites and text.
+ m_pManager->EndSprites11( DXUTGetD3D11Device(), DXUTGetD3D11DeviceContext() );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount )
+{
+ HRESULT hr = S_OK;
+
+ DXUTFontNode* pFontNode = GetFont( pElement->iFont );
+ if( pFontNode == NULL )
+ return E_FAIL;
+
+ DWORD dwTextFormat = pElement->dwTextFormat | DT_CALCRECT;
+ // Since we are only computing the rectangle, we don't need a sprite.
+ if( pFontNode->pFont9 )
+ {
+ hr = pFontNode->pFont9->DrawText( NULL, strText, nCount, prcDest, dwTextFormat, pElement->FontColor.Current );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount, bool bCenter )
+{
+ if( m_pManager->GetD3D9Device() )
+ return DrawText9( strText, pElement, prcDest, bShadow, nCount );
+ else
+ return DrawText11( m_pManager->GetD3D11Device(), m_pManager->GetD3D11DeviceContext(), strText, pElement, prcDest, bShadow, nCount, bCenter );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawText9( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount )
+{
+ HRESULT hr = S_OK;
+
+ // No need to draw fully transparent layers
+ if( pElement->FontColor.Current.a == 0 )
+ return S_OK;
+
+ RECT rcScreen = *prcDest;
+ OffsetRect( &rcScreen, m_x, m_y );
+
+ // If caption is enabled, offset the Y position by its height.
+ if( m_bCaption )
+ OffsetRect( &rcScreen, 0, m_nCaptionHeight );
+
+ D3DXMATRIX matTransform;
+ D3DXMatrixIdentity( &matTransform );
+ m_pManager->m_pSprite->SetTransform( &matTransform );
+
+ DXUTFontNode* pFontNode = GetFont( pElement->iFont );
+
+ if( bShadow )
+ {
+ RECT rcShadow = rcScreen;
+ OffsetRect( &rcShadow, 1, 1 );
+ hr = pFontNode->pFont9->DrawText( m_pManager->m_pSprite, strText, nCount, &rcShadow, pElement->dwTextFormat,
+ D3DCOLOR_ARGB( DWORD( pElement->FontColor.Current.a * 255 ), 0, 0, 0 ) );
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ hr = pFontNode->pFont9->DrawText( m_pManager->m_pSprite, strText, nCount, &rcScreen, pElement->dwTextFormat,
+ pElement->FontColor.Current );
+ if( FAILED( hr ) )
+ return hr;
+
+ return S_OK;
+}
+
+ID3D11Buffer* g_pFontBuffer11 = NULL;
+UINT g_FontBufferBytes11 = 0;
+CGrowableArray<DXUTSpriteVertex> g_FontVertices;
+ID3D11ShaderResourceView* g_pFont11 = NULL;
+ID3D11InputLayout* g_pInputLayout11 = NULL;
+HRESULT InitFont11( ID3D11Device* pd3d11Device, ID3D11InputLayout* pInputLayout )
+{
+ HRESULT hr = S_OK;
+ WCHAR str[MAX_PATH];
+ V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"UI\\Font.dds" ) );
+
+ if (pd3d11Device->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0 ) {
+
+ D3DX11_IMAGE_INFO dii;
+ D3DX11GetImageInfoFromFile( str, NULL, &dii, NULL );
+
+ D3DX11_IMAGE_LOAD_INFO dili;
+ dili.BindFlags = D3DX11_DEFAULT;
+ dili.CpuAccessFlags = D3DX11_DEFAULT;
+ dili.Depth = D3DX11_DEFAULT;
+ dili.Filter = D3DX11_DEFAULT;
+ dili.FirstMipLevel = 0;
+ dili.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ dili.Height = D3DX11_DEFAULT;
+ dili.MipFilter = D3DX11_DEFAULT;
+ dili.MipLevels = 1;
+ dili.MiscFlags = D3DX11_DEFAULT;
+ dili.pSrcInfo = &dii;
+ dili.Usage = D3D11_USAGE_DEFAULT ;
+ dili.Width = D3DX11_DEFAULT;
+
+ V_RETURN( D3DX11CreateShaderResourceViewFromFile( pd3d11Device, str, &dili, NULL, &g_pFont11, &hr) );
+ }
+ else
+ {
+ V_RETURN( D3DX11CreateShaderResourceViewFromFile( pd3d11Device, str, NULL, NULL, &g_pFont11, &hr) );
+ }
+
+#if defined(PROFILE) || defined(DEBUG)
+ if (g_pFont11)
+ {
+ ID3D11Resource *pRes = NULL;
+ g_pFont11->GetResource( &pRes );
+ DXUT_SetDebugName( pRes, "DXUT Text11" );
+ SAFE_RELEASE( pRes );
+ }
+
+ DXUT_SetDebugName( g_pFont11, "DXUT Text11" );
+#endif
+
+ g_pInputLayout11 = pInputLayout;
+ return hr;
+}
+
+void EndFont11()
+{
+ SAFE_RELEASE( g_pFontBuffer11 );
+ g_FontBufferBytes11 = 0;
+ SAFE_RELEASE( g_pFont11 );
+}
+
+void BeginText11()
+{
+ g_FontVertices.Reset();
+}
+
+void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext,
+ LPCWSTR strText, RECT rcScreen, D3DXCOLOR vFontColor,
+ float fBBWidth, float fBBHeight, bool bCenter )
+{
+ float fCharTexSizeX = 0.010526315f;
+ //float fGlyphSizeX = 14.0f / fBBWidth;
+ //float fGlyphSizeY = 32.0f / fBBHeight;
+ float fGlyphSizeX = 15.0f / fBBWidth;
+ float fGlyphSizeY = 42.0f / fBBHeight;
+
+
+ float fRectLeft = rcScreen.left / fBBWidth;
+ float fRectTop = 1.0f - rcScreen.top / fBBHeight;
+
+ fRectLeft = fRectLeft * 2.0f - 1.0f;
+ fRectTop = fRectTop * 2.0f - 1.0f;
+
+ int NumChars = (int)wcslen( strText );
+ if (bCenter) {
+ float fRectRight = rcScreen.right / fBBWidth;
+ fRectRight = fRectRight * 2.0f - 1.0f;
+ float fRectBottom = 1.0f - rcScreen.bottom / fBBHeight;
+ fRectBottom = fRectBottom * 2.0f - 1.0f;
+ float fcenterx = ((fRectRight - fRectLeft) - (float)NumChars*fGlyphSizeX) *0.5f;
+ float fcentery = ((fRectTop - fRectBottom) - (float)1*fGlyphSizeY) *0.5f;
+ fRectLeft += fcenterx ;
+ fRectTop -= fcentery;
+ }
+ float fOriginalLeft = fRectLeft;
+ float fTexTop = 0.0f;
+ float fTexBottom = 1.0f;
+
+ float fDepth = 0.5f;
+ for( int i=0; i<NumChars; i++ )
+ {
+ if( strText[i] == '\n' )
+ {
+ fRectLeft = fOriginalLeft;
+ fRectTop -= fGlyphSizeY;
+
+ continue;
+ }
+ else if( strText[i] < 32 || strText[i] > 126 )
+ {
+ continue;
+ }
+
+ // Add 6 sprite vertices
+ DXUTSpriteVertex SpriteVertex;
+ float fRectRight = fRectLeft + fGlyphSizeX;
+ float fRectBottom = fRectTop - fGlyphSizeY;
+ float fTexLeft = ( strText[i] - 32 ) * fCharTexSizeX;
+ float fTexRight = fTexLeft + fCharTexSizeX;
+
+ // tri1
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexTop );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ // tri2
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexBottom );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth );
+ SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom );
+ SpriteVertex.vColor = vFontColor;
+ g_FontVertices.Add( SpriteVertex );
+
+ fRectLeft += fGlyphSizeX;
+
+ }
+
+ // We have to end text after every line so that rendering order between sprites and fonts is preserved
+ EndText11( pd3dDevice, pd3d11DeviceContext );
+}
+
+void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext )
+{
+
+ // ensure our buffer size can hold our sprites
+ UINT FontDataBytes = g_FontVertices.GetSize() * sizeof( DXUTSpriteVertex );
+ if( g_FontBufferBytes11 < FontDataBytes )
+ {
+ SAFE_RELEASE( g_pFontBuffer11 );
+ g_FontBufferBytes11 = FontDataBytes;
+
+ D3D11_BUFFER_DESC BufferDesc;
+ BufferDesc.ByteWidth = g_FontBufferBytes11;
+ BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
+ BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ BufferDesc.MiscFlags = 0;
+
+ pd3dDevice->CreateBuffer( &BufferDesc, NULL, &g_pFontBuffer11 );
+ DXUT_SetDebugName( g_pFontBuffer11, "DXUT Text11" );
+ }
+
+ // Copy the sprites over
+ D3D11_BOX destRegion;
+ destRegion.left = 0;
+ destRegion.right = FontDataBytes;
+ destRegion.top = 0;
+ destRegion.bottom = 1;
+ destRegion.front = 0;
+ destRegion.back = 1;
+ D3D11_MAPPED_SUBRESOURCE MappedResource;
+ if ( S_OK == pd3d11DeviceContext->Map( g_pFontBuffer11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ) {
+ CopyMemory( MappedResource.pData, (void*)g_FontVertices.GetData(), FontDataBytes );
+ pd3d11DeviceContext->Unmap(g_pFontBuffer11, 0);
+ }
+
+ ID3D11ShaderResourceView* pOldTexture = NULL;
+ pd3d11DeviceContext->PSGetShaderResources( 0, 1, &pOldTexture );
+ pd3d11DeviceContext->PSSetShaderResources( 0, 1, &g_pFont11 );
+
+ // Draw
+ UINT Stride = sizeof( DXUTSpriteVertex );
+ UINT Offset = 0;
+ pd3d11DeviceContext->IASetVertexBuffers( 0, 1, &g_pFontBuffer11, &Stride, &Offset );
+ pd3d11DeviceContext->IASetInputLayout( g_pInputLayout11 );
+ pd3d11DeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
+ pd3d11DeviceContext->Draw( g_FontVertices.GetSize(), 0 );
+
+ pd3d11DeviceContext->PSSetShaderResources( 0, 1, &pOldTexture );
+ SAFE_RELEASE( pOldTexture );
+
+ g_FontVertices.Reset();
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialog::DrawText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext,
+ LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount, bool bCenter )
+{
+ //HRESULT hr = S_OK;
+
+ // No need to draw fully transparent layers
+ if( pElement->FontColor.Current.a == 0 )
+ return S_OK;
+
+ RECT rcScreen = *prcDest;
+ OffsetRect( &rcScreen, m_x, m_y);
+
+ // If caption is enabled, offset the Y position by its height.
+ if( m_bCaption )
+ OffsetRect( &rcScreen, 0, m_nCaptionHeight );
+
+ float fBBWidth = ( float )m_pManager->m_nBackBufferWidth;
+ float fBBHeight = ( float )m_pManager->m_nBackBufferHeight;
+
+ if( bShadow )
+ {
+ RECT rcShadow = rcScreen;
+ OffsetRect( &rcShadow, 1, 1 );
+
+ D3DXCOLOR vShadowColor( 0,0,0, 1.0f );
+ DrawText11DXUT( pd3dDevice, pd3d11DeviceContext,
+ strText, rcShadow, vShadowColor,
+ fBBWidth, fBBHeight, bCenter );
+
+ }
+
+ D3DXCOLOR vFontColor( pElement->FontColor.Current.r, pElement->FontColor.Current.g, pElement->FontColor.Current.b, 1.0f );
+ DrawText11DXUT( pd3dDevice, pd3d11DeviceContext,
+ strText, rcScreen, vFontColor,
+ fBBWidth, fBBHeight, bCenter );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft,
+ D3DCOLOR colorBottomRight )
+{
+ m_colorTopLeft = colorTopLeft;
+ m_colorTopRight = colorTopRight;
+ m_colorBottomLeft = colorBottomLeft;
+ m_colorBottomRight = colorBottomRight;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::SetNextDialog( CDXUTDialog* pNextDialog )
+{
+ if( pNextDialog == NULL )
+ pNextDialog = this;
+
+ m_pNextDialog = pNextDialog;
+ if( pNextDialog )
+ m_pNextDialog->m_pPrevDialog = this;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::ClearFocus()
+{
+ if( s_pControlFocus )
+ {
+ s_pControlFocus->OnFocusOut();
+ s_pControlFocus = NULL;
+ }
+
+ ReleaseCapture();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::FocusDefaultControl()
+{
+ // Check for default control in this dialog
+ for( int i = 0; i < m_Controls.GetSize(); i++ )
+ {
+ CDXUTControl* pControl = m_Controls.GetAt( i );
+ if( pControl->m_bIsDefault )
+ {
+ // Remove focus from the current control
+ ClearFocus();
+
+ // Give focus to the default control
+ s_pControlFocus = pControl;
+ s_pControlFocus->OnFocusIn();
+ return;
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTDialog::OnCycleFocus( bool bForward )
+{
+ CDXUTControl* pControl = NULL;
+ CDXUTDialog* pDialog = NULL; // pDialog and pLastDialog are used to track wrapping of
+ CDXUTDialog* pLastDialog; // focus from first control to last or vice versa.
+
+ if( s_pControlFocus == NULL )
+ {
+ // If s_pControlFocus is NULL, we focus the first control of first dialog in
+ // the case that bForward is true, and focus the last control of last dialog when
+ // bForward is false.
+ //
+ if( bForward )
+ {
+ // Search for the first control from the start of the dialog
+ // array.
+ for( int d = 0; d < m_pManager->m_Dialogs.GetSize(); ++d )
+ {
+ pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt( d );
+ if( pDialog && pDialog->m_Controls.GetSize() > 0 )
+ {
+ pControl = pDialog->m_Controls.GetAt( 0 );
+ break;
+ }
+ }
+
+ if( !pDialog || !pControl )
+ {
+ // No dialog has been registered yet or no controls have been
+ // added to the dialogs. Cannot proceed.
+ return true;
+ }
+ }
+ else
+ {
+ // Search for the first control from the end of the dialog
+ // array.
+ for( int d = m_pManager->m_Dialogs.GetSize() - 1; d >= 0; --d )
+ {
+ pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt( d );
+ if( pDialog && pDialog->m_Controls.GetSize() > 0 )
+ {
+ pControl = pDialog->m_Controls.GetAt( pDialog->m_Controls.GetSize() - 1 );
+ break;
+ }
+ }
+
+ if( !pDialog || !pControl )
+ {
+ // No dialog has been registered yet or no controls have been
+ // added to the dialogs. Cannot proceed.
+ return true;
+ }
+ }
+ }
+ else if( s_pControlFocus->m_pDialog != this )
+ {
+ // If a control belonging to another dialog has focus, let that other
+ // dialog handle this event by returning false.
+ //
+ return false;
+ }
+ else
+ {
+ // Focused control belongs to this dialog. Cycle to the
+ // next/previous control.
+ pLastDialog = s_pControlFocus->m_pDialog;
+ pControl = ( bForward ) ? GetNextControl( s_pControlFocus ) : GetPrevControl( s_pControlFocus );
+ pDialog = pControl->m_pDialog;
+ }
+
+ for( int i = 0; i < 0xffff; i++ )
+ {
+ // If we just wrapped from last control to first or vice versa,
+ // set the focused control to NULL. This state, where no control
+ // has focus, allows the camera to work.
+ int nLastDialogIndex = m_pManager->m_Dialogs.IndexOf( pLastDialog );
+ int nDialogIndex = m_pManager->m_Dialogs.IndexOf( pDialog );
+ if( ( !bForward && nLastDialogIndex < nDialogIndex ) ||
+ ( bForward && nDialogIndex < nLastDialogIndex ) )
+ {
+ if( s_pControlFocus )
+ s_pControlFocus->OnFocusOut();
+ s_pControlFocus = NULL;
+ return true;
+ }
+
+ // If we've gone in a full circle then focus doesn't change
+ if( pControl == s_pControlFocus )
+ return true;
+
+ // If the dialog accepts keybord input and the control can have focus then
+ // move focus
+ if( pControl->m_pDialog->m_bKeyboardInput && pControl->CanHaveFocus() )
+ {
+ if( s_pControlFocus )
+ s_pControlFocus->OnFocusOut();
+ s_pControlFocus = pControl;
+ s_pControlFocus->OnFocusIn();
+ return true;
+ }
+
+ pLastDialog = pDialog;
+ pControl = ( bForward ) ? GetNextControl( pControl ) : GetPrevControl( pControl );
+ pDialog = pControl->m_pDialog;
+ }
+
+ // If we reached this point, the chain of dialogs didn't form a complete loop
+ DXTRACE_ERR( L"CDXUTDialog: Multiple dialogs are improperly chained together", E_FAIL );
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::CreateFont9( UINT iFont )
+{
+ HRESULT hr = S_OK;
+
+ DXUTFontNode* pFontNode = m_FontCache.GetAt( iFont );
+
+ SAFE_RELEASE( pFontNode->pFont9 );
+
+ V_RETURN( D3DXCreateFont( m_pd3d9Device, pFontNode->nHeight, 0, pFontNode->nWeight, 1, FALSE, DEFAULT_CHARSET,
+ OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
+ pFontNode->strFace, &pFontNode->pFont9 ) );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::CreateFont11( UINT iFont )
+{
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::CreateTexture9( UINT iTexture )
+{
+ HRESULT hr = S_OK;
+
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( iTexture );
+
+
+ D3DXIMAGE_INFO info;
+
+ if( !pTextureNode->bFileSource )
+ {
+ if( pTextureNode->nResourceID == 0xFFFF && pTextureNode->hResourceModule == ( HMODULE )0xFFFF )
+ {
+ hr = DXUTCreateGUITextureFromInternalArray9( m_pd3d9Device, &pTextureNode->pTexture9, &info );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"D3DXCreateTextureFromFileInMemoryEx", hr );
+ DXUT_SetDebugName( pTextureNode->pTexture9, "DXUT GUI Texture" );
+ }
+ else
+ {
+ LPCWSTR pID = pTextureNode->nResourceID ? ( LPCWSTR )( size_t )pTextureNode->nResourceID :
+ pTextureNode->strFilename;
+
+ // Create texture from resource
+ hr = D3DXCreateTextureFromResourceEx( m_pd3d9Device, pTextureNode->hResourceModule, pID, D3DX_DEFAULT,
+ D3DX_DEFAULT,
+ 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
+ D3DX_DEFAULT, D3DX_DEFAULT, 0,
+ &info, NULL, &pTextureNode->pTexture9 );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"D3DXCreateTextureFromResourceEx", hr );
+ }
+ }
+ else
+ {
+ // Make sure there's a texture to create
+ if( pTextureNode->strFilename[0] == 0 )
+ return S_OK;
+
+ // Create texture from file
+ hr = D3DXCreateTextureFromFileEx( m_pd3d9Device, pTextureNode->strFilename, D3DX_DEFAULT, D3DX_DEFAULT,
+ 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
+ D3DX_DEFAULT, D3DX_DEFAULT, 0,
+ &info, NULL, &pTextureNode->pTexture9 );
+ if( FAILED( hr ) )
+ {
+ return DXTRACE_ERR( L"D3DXCreateTextureFromFileEx", hr );
+ }
+ }
+
+ // Store dimensions
+ pTextureNode->dwWidth = info.Width;
+ pTextureNode->dwHeight = info.Height;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTDialogResourceManager::CreateTexture11( UINT iTexture )
+{
+ HRESULT hr = S_OK;
+
+ DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( iTexture );
+
+ if( !pTextureNode->bFileSource )
+ {
+ if( pTextureNode->nResourceID == 0xFFFF && pTextureNode->hResourceModule == ( HMODULE )0xFFFF )
+ {
+ hr = DXUTCreateGUITextureFromInternalArray11( m_pd3d11Device, &pTextureNode->pTexture11, NULL );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"D3DX11CreateResourceFromFileInMemory", hr );
+ DXUT_SetDebugName( pTextureNode->pTexture11, "DXUT GUI Texture" );
+ }
+ //else
+ //{
+ // LPCWSTR pID = pTextureNode->nResourceID ? ( LPCWSTR )( size_t )pTextureNode->nResourceID :
+ // pTextureNode->strFilename;
+
+ // D3DX10_IMAGE_INFO SrcInfo;
+ // D3DX10GetImageInfoFromResource( NULL, pID, NULL, &SrcInfo, NULL );
+
+ // // Create texture from resource
+ // ID3D10Resource* pRes;
+ // D3DX10_IMAGE_LOAD_INFO loadInfo;
+ // loadInfo.Width = D3DX10_DEFAULT;
+ // loadInfo.Height = D3DX10_DEFAULT;
+ // loadInfo.Depth = D3DX10_DEFAULT;
+ // loadInfo.FirstMipLevel = 0;
+ // loadInfo.MipLevels = 1;
+ // loadInfo.Usage = D3D10_USAGE_DEFAULT;
+ // loadInfo.BindFlags = D3D10_BIND_SHADER_RESOURCE;
+ // loadInfo.CpuAccessFlags = 0;
+ // loadInfo.MiscFlags = 0;
+ // loadInfo.Format = MAKE_TYPELESS( SrcInfo.Format );
+ // loadInfo.Filter = D3DX10_FILTER_NONE;
+ // loadInfo.MipFilter = D3DX10_FILTER_NONE;
+ // loadInfo.pSrcInfo = &SrcInfo;
+
+ // hr = D3DX10CreateTextureFromResource( m_pd3d10Device, pTextureNode->hResourceModule, pID, &loadInfo,
+ // NULL, &pRes, NULL );
+ // if( FAILED( hr ) )
+ // return DXTRACE_ERR( L"D3DX10CreateResourceFromResource", hr );
+ // hr = pRes->QueryInterface( __uuidof( ID3D10Texture2D ), ( LPVOID* )&pTextureNode->pTexture10 );
+ // SAFE_RELEASE( pRes );
+ // if( FAILED( hr ) )
+ // return hr;
+ //}
+ }
+ else
+ {
+ //
+ //// Make sure there's a texture to create
+ //if( pTextureNode->strFilename[0] == 0 )
+ // return S_OK;
+
+ //D3DX10_IMAGE_INFO SrcInfo;
+ //D3DX10GetImageInfoFromFile( pTextureNode->strFilename, NULL, &SrcInfo, NULL );
+
+ //// Create texture from file
+ //ID3D10Resource* pRes;
+ //D3DX10_IMAGE_LOAD_INFO loadInfo;
+ //loadInfo.Width = D3DX10_DEFAULT;
+ //loadInfo.Height = D3DX10_DEFAULT;
+ //loadInfo.Depth = D3DX10_DEFAULT;
+ //loadInfo.FirstMipLevel = 0;
+ //loadInfo.MipLevels = 1;
+ //loadInfo.Usage = D3D10_USAGE_DEFAULT;
+ //loadInfo.BindFlags = D3D10_BIND_SHADER_RESOURCE;
+ //loadInfo.CpuAccessFlags = 0;
+ //loadInfo.MiscFlags = 0;
+ //loadInfo.Format = MAKE_TYPELESS( SrcInfo.Format );
+ //loadInfo.Filter = D3DX10_FILTER_NONE;
+ //loadInfo.MipFilter = D3DX10_FILTER_NONE;
+ //loadInfo.pSrcInfo = &SrcInfo;
+ //hr = D3DX10CreateTextureFromFile( m_pd3d10Device, pTextureNode->strFilename, &loadInfo, NULL, &pRes, NULL );
+ //if( FAILED( hr ) )
+ //{
+ // return DXTRACE_ERR( L"D3DX10CreateResourceFromFileEx", hr );
+ //}
+ //hr = pRes->QueryInterface( __uuidof( ID3D10Texture2D ), ( LPVOID* )&pTextureNode->pTexture10 );
+ //SAFE_RELEASE( pRes );
+ //if( FAILED( hr ) )
+ // return hr;
+ //
+ }
+
+ // Store dimensions
+ D3D11_TEXTURE2D_DESC desc;
+ pTextureNode->pTexture11->GetDesc( &desc );
+ pTextureNode->dwWidth = desc.Width;
+ pTextureNode->dwHeight = desc.Height;
+
+ // Create resource view
+ D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
+ SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
+ SRVDesc.Format = MAKE_SRGB( desc.Format );
+ SRVDesc.Texture2D.MipLevels = 1;
+ SRVDesc.Texture2D.MostDetailedMip = 0;
+ hr = m_pd3d11Device->CreateShaderResourceView( pTextureNode->pTexture11, &SRVDesc, &pTextureNode->pTexResView11 );
+ DXUT_SetDebugName( pTextureNode->pTexResView11, "DXUT GUI Texture" );
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTDialog::InitDefaultElements()
+{
+ SetFont( 0, L"Arial", 14, FW_NORMAL );
+
+ CDXUTElement Element;
+ RECT rcTexture;
+
+ //-------------------------------------
+ // Element for the caption
+ //-------------------------------------
+ m_CapElement.SetFont( 0 );
+ SetRect( &rcTexture, 17, 269, 241, 287 );
+ m_CapElement.SetTexture( 0, &rcTexture );
+ m_CapElement.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_CapElement.FontColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_CapElement.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER );
+ // Pre-blend as we don't need to transition the state
+ m_CapElement.TextureColor.Blend( DXUT_STATE_NORMAL, 10.0f );
+ m_CapElement.FontColor.Blend( DXUT_STATE_NORMAL, 10.0f );
+
+ //-------------------------------------
+ // CDXUTStatic
+ //-------------------------------------
+ Element.SetFont( 0 );
+ Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_STATIC, 0, &Element );
+
+
+ //-------------------------------------
+ // CDXUTButton - Button
+ //-------------------------------------
+ SetRect( &rcTexture, 0, 0, 136, 54 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0 );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
+ Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 255, 0, 0, 0 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_BUTTON, 0, &Element );
+
+
+ //-------------------------------------
+ // CDXUTButton - Fill layer
+ //-------------------------------------
+ SetRect( &rcTexture, 136, 0, 252, 54 );
+ Element.SetTexture( 0, &rcTexture, D3DCOLOR_ARGB( 0, 255, 255, 255 ) );
+ Element.TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 160, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 60, 0, 0, 0 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 30, 255, 255, 255 );
+
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_BUTTON, 1, &Element );
+
+
+ //-------------------------------------
+ // CDXUTCheckBox - Box
+ //-------------------------------------
+ SetRect( &rcTexture, 0, 54, 27, 81 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER );
+ Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_CHECKBOX, 0, &Element );
+
+
+ //-------------------------------------
+ // CDXUTCheckBox - Check
+ //-------------------------------------
+ SetRect( &rcTexture, 27, 54, 54, 81 );
+ Element.SetTexture( 0, &rcTexture );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_CHECKBOX, 1, &Element );
+
+
+ //-------------------------------------
+ // CDXUTRadioButton - Box
+ //-------------------------------------
+ SetRect( &rcTexture, 54, 54, 81, 81 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER );
+ Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_RADIOBUTTON, 0, &Element );
+
+
+ //-------------------------------------
+ // CDXUTRadioButton - Check
+ //-------------------------------------
+ SetRect( &rcTexture, 81, 54, 108, 81 );
+ Element.SetTexture( 0, &rcTexture );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_RADIOBUTTON, 1, &Element );
+
+
+ //-------------------------------------
+ // CDXUTComboBox - Main
+ //-------------------------------------
+ SetRect( &rcTexture, 7, 81, 247, 123 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0 );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 200, 200, 200 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 170, 230, 230, 230 );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 200, 200, 200 );
+ Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 255, 0, 0, 0 );
+ Element.FontColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 0, 0, 0 );
+ Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 );
+
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_COMBOBOX, 0, &Element );
+
+
+ //-------------------------------------
+ // CDXUTComboBox - Button
+ //-------------------------------------
+ SetRect( &rcTexture, 98, 189, 151, 238 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 150, 150, 150 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 255, 255, 255 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_COMBOBOX, 1, &Element );
+
+
+ //-------------------------------------
+ // CDXUTComboBox - Dropdown
+ //-------------------------------------
+ SetRect( &rcTexture, 13, 123, 241, 160 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_COMBOBOX, 2, &Element );
+
+
+ //-------------------------------------
+ // CDXUTComboBox - Selection
+ //-------------------------------------
+ SetRect( &rcTexture, 12, 163, 239, 183 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_TOP );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_COMBOBOX, 3, &Element );
+
+
+ //-------------------------------------
+ // CDXUTSlider - Track
+ //-------------------------------------
+ SetRect( &rcTexture, 1, 187, 93, 228 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 255, 255, 255 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SLIDER, 0, &Element );
+
+ //-------------------------------------
+ // CDXUTSlider - Button
+ //-------------------------------------
+ SetRect( &rcTexture, 151, 193, 192, 234 );
+ Element.SetTexture( 0, &rcTexture );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SLIDER, 1, &Element );
+
+ //-------------------------------------
+ // CDXUTScrollBar - Track
+ //-------------------------------------
+ int nScrollBarStartX = 196;
+ int nScrollBarStartY = 191;
+ SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 21, nScrollBarStartX + 22, nScrollBarStartY + 32 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 0, &Element );
+
+ //-------------------------------------
+ // CDXUTScrollBar - Up Arrow
+ //-------------------------------------
+ SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 1, nScrollBarStartX + 22, nScrollBarStartY + 21 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 );
+
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 1, &Element );
+
+ //-------------------------------------
+ // CDXUTScrollBar - Down Arrow
+ //-------------------------------------
+ SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 32, nScrollBarStartX + 22, nScrollBarStartY + 53 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 );
+
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 2, &Element );
+
+ //-------------------------------------
+ // CDXUTScrollBar - Button
+ //-------------------------------------
+ SetRect( &rcTexture, 220, 192, 238, 234 );
+ Element.SetTexture( 0, &rcTexture );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 3, &Element );
+
+
+ //-------------------------------------
+ // CDXUTEditBox
+ //-------------------------------------
+ // Element assignment:
+ // 0 - text area
+ // 1 - top left border
+ // 2 - top border
+ // 3 - top right border
+ // 4 - left border
+ // 5 - right border
+ // 6 - lower left border
+ // 7 - lower border
+ // 8 - lower right border
+
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP );
+
+ // Assign the style
+ SetRect( &rcTexture, 14, 90, 241, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 0, &Element );
+ SetRect( &rcTexture, 8, 82, 14, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 1, &Element );
+ SetRect( &rcTexture, 14, 82, 241, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 2, &Element );
+ SetRect( &rcTexture, 241, 82, 246, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 3, &Element );
+ SetRect( &rcTexture, 8, 90, 14, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 4, &Element );
+ SetRect( &rcTexture, 241, 90, 246, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 5, &Element );
+ SetRect( &rcTexture, 8, 113, 14, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 6, &Element );
+ SetRect( &rcTexture, 14, 113, 241, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 7, &Element );
+ SetRect( &rcTexture, 241, 113, 246, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ SetDefaultElement( DXUT_CONTROL_EDITBOX, 8, &Element );
+
+ //-------------------------------------
+ // CDXUTListBox - Main
+ //-------------------------------------
+ SetRect( &rcTexture, 13, 123, 241, 160 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_LISTBOX, 0, &Element );
+
+ //-------------------------------------
+ // CDXUTListBox - Selection
+ //-------------------------------------
+
+ SetRect( &rcTexture, 16, 166, 240, 183 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_TOP );
+
+ // Assign the Element
+ SetDefaultElement( DXUT_CONTROL_LISTBOX, 1, &Element );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTControl class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTControl::CDXUTControl( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_BUTTON;
+ m_pDialog = pDialog;
+ m_ID = 0;
+ m_Index = 0;
+ m_pUserData = NULL;
+
+ m_bEnabled = true;
+ m_bVisible = true;
+ m_bMouseOver = false;
+ m_bHasFocus = false;
+ m_bIsDefault = false;
+
+ m_pDialog = NULL;
+
+ m_x = 0;
+ m_y = 0;
+ m_width = 0;
+ m_height = 0;
+
+ ZeroMemory( &m_rcBoundingBox, sizeof( m_rcBoundingBox ) );
+}
+
+
+CDXUTControl::~CDXUTControl()
+{
+ for( int i = 0; i < m_Elements.GetSize(); ++i )
+ {
+ delete m_Elements[i];
+ }
+ m_Elements.RemoveAll();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTControl::SetTextColor( D3DCOLOR Color )
+{
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ if( pElement )
+ pElement->FontColor.States[DXUT_STATE_NORMAL] = Color;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTControl::SetElement( UINT iElement, CDXUTElement* pElement )
+{
+ HRESULT hr = S_OK;
+
+ if( pElement == NULL )
+ return E_INVALIDARG;
+
+ // Make certain the array is this large
+ for( UINT i = m_Elements.GetSize(); i <= iElement; i++ )
+ {
+ CDXUTElement* pNewElement = new CDXUTElement();
+ if( pNewElement == NULL )
+ return E_OUTOFMEMORY;
+
+ hr = m_Elements.Add( pNewElement );
+ if( FAILED( hr ) )
+ {
+ SAFE_DELETE( pNewElement );
+ return hr;
+ }
+ }
+
+ // Update the data
+ CDXUTElement* pCurElement = m_Elements.GetAt( iElement );
+ *pCurElement = *pElement;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTControl::Refresh()
+{
+ m_bMouseOver = false;
+ m_bHasFocus = false;
+
+ for( int i = 0; i < m_Elements.GetSize(); i++ )
+ {
+ CDXUTElement* pElement = m_Elements.GetAt( i );
+ pElement->Refresh();
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTControl::UpdateRects()
+{
+ SetRect( &m_rcBoundingBox, m_x, m_y, m_x + m_width, m_y + m_height );
+}
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTStatic class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTStatic::CDXUTStatic( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_STATIC;
+ m_pDialog = pDialog;
+
+ ZeroMemory( &m_strText, sizeof( m_strText ) );
+
+ for( int i = 0; i < m_Elements.GetSize(); i++ )
+ {
+ CDXUTElement* pElement = m_Elements.GetAt( i );
+ SAFE_DELETE( pElement );
+ }
+
+ m_Elements.RemoveAll();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTStatic::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( m_bEnabled == false )
+ iState = DXUT_STATE_DISABLED;
+
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ pElement->FontColor.Blend( iState, fElapsedTime );
+
+ m_pDialog->DrawText( m_strText, pElement, &m_rcBoundingBox, false, -1, false);
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTStatic::GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest,
+ UINT bufferCount )
+{
+ // Validate incoming parameters
+ if( strDest == NULL || bufferCount == 0 )
+ {
+ return E_INVALIDARG;
+ }
+
+ // Copy the window text
+ wcscpy_s( strDest, bufferCount, m_strText );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTStatic::SetText( LPCWSTR strText )
+{
+ if( strText == NULL )
+ {
+ m_strText[0] = 0;
+ return S_OK;
+ }
+
+ wcscpy_s( m_strText, MAX_PATH, strText );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTButton class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTButton::CDXUTButton( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_BUTTON;
+ m_pDialog = pDialog;
+
+ m_bPressed = false;
+ m_nHotkey = 0;
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ m_bPressed = true;
+ return true;
+ }
+ }
+
+ case WM_KEYUP:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ if( m_bPressed == true )
+ {
+ m_bPressed = false;
+ m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTButton::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( ContainsPoint( pt ) )
+ {
+ // Pressed while inside the control
+ m_bPressed = true;
+ SetCapture( DXUTGetHWND() );
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ if( m_bPressed )
+ {
+ m_bPressed = false;
+ ReleaseCapture();
+
+ if( !m_pDialog->m_bKeyboardInput )
+ m_pDialog->ClearFocus();
+
+ // Button click
+ if( ContainsPoint( pt ) )
+ m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );
+
+ return true;
+ }
+
+ break;
+ }
+ };
+
+ return false;
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTButton::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ int nOffsetX = 0;
+ int nOffsetY = 0;
+
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( m_bVisible == false )
+ {
+ iState = DXUT_STATE_HIDDEN;
+ }
+ else if( m_bEnabled == false )
+ {
+ iState = DXUT_STATE_DISABLED;
+ }
+ else if( m_bPressed )
+ {
+ iState = DXUT_STATE_PRESSED;
+
+ nOffsetX = 1;
+ nOffsetY = 2;
+ }
+ else if( m_bMouseOver )
+ {
+ iState = DXUT_STATE_MOUSEOVER;
+
+ nOffsetX = -1;
+ nOffsetY = -2;
+ }
+ else if( m_bHasFocus )
+ {
+ iState = DXUT_STATE_FOCUS;
+ }
+
+ // Background fill layer
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;
+
+ RECT rcWindow = m_rcBoundingBox;
+ OffsetRect( &rcWindow, nOffsetX, nOffsetY );
+
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );
+
+ m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_FAR_BUTTON_DEPTH );
+ m_pDialog->DrawText( m_strText, pElement, &rcWindow, false, -1, true );
+
+ // Main button
+ pElement = m_Elements.GetAt( 1 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );
+
+ m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_NEAR_BUTTON_DEPTH );
+ m_pDialog->DrawText( m_strText, pElement, &rcWindow, false, -1, true );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTCheckBox class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTCheckBox::CDXUTCheckBox( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_CHECKBOX;
+ m_pDialog = pDialog;
+
+ m_bChecked = false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTCheckBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ m_bPressed = true;
+ return true;
+ }
+ }
+
+ case WM_KEYUP:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ if( m_bPressed == true )
+ {
+ m_bPressed = false;
+ SetCheckedInternal( !m_bChecked, true );
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTCheckBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( ContainsPoint( pt ) )
+ {
+ // Pressed while inside the control
+ m_bPressed = true;
+ SetCapture( DXUTGetHWND() );
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ if( m_bPressed )
+ {
+ m_bPressed = false;
+ ReleaseCapture();
+
+ // Button click
+ if( ContainsPoint( pt ) )
+ SetCheckedInternal( !m_bChecked, true );
+
+ return true;
+ }
+
+ break;
+ }
+ };
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTCheckBox::SetCheckedInternal( bool bChecked, bool bFromInput )
+{
+ m_bChecked = bChecked;
+
+ m_pDialog->SendEvent( EVENT_CHECKBOX_CHANGED, bFromInput, this );
+}
+
+
+//--------------------------------------------------------------------------------------
+BOOL CDXUTCheckBox::ContainsPoint( POINT pt )
+{
+ return ( PtInRect( &m_rcBoundingBox, pt ) ||
+ PtInRect( &m_rcButton, pt ) );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTCheckBox::UpdateRects()
+{
+ CDXUTButton::UpdateRects();
+
+ m_rcButton = m_rcBoundingBox;
+ m_rcButton.right = m_rcButton.left + RectHeight( m_rcButton );
+
+ m_rcText = m_rcBoundingBox;
+ m_rcText.left += ( int )( 1.25f * RectWidth( m_rcButton ) );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTCheckBox::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( m_bVisible == false )
+ iState = DXUT_STATE_HIDDEN;
+ else if( m_bEnabled == false )
+ iState = DXUT_STATE_DISABLED;
+ else if( m_bPressed )
+ iState = DXUT_STATE_PRESSED;
+ else if( m_bMouseOver )
+ iState = DXUT_STATE_MOUSEOVER;
+ else if( m_bHasFocus )
+ iState = DXUT_STATE_FOCUS;
+
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;
+
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );
+
+ m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_NEAR_BUTTON_DEPTH );
+ m_pDialog->DrawText( m_strText, pElement, &m_rcText, false, -1, false );
+
+ if( !m_bChecked )
+ iState = DXUT_STATE_HIDDEN;
+
+ pElement = m_Elements.GetAt( 1 );
+
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_FAR_BUTTON_DEPTH );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTRadioButton class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTRadioButton::CDXUTRadioButton( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_RADIOBUTTON;
+ m_pDialog = pDialog;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTRadioButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ m_bPressed = true;
+ return true;
+ }
+ }
+
+ case WM_KEYUP:
+ {
+ switch( wParam )
+ {
+ case VK_SPACE:
+ if( m_bPressed == true )
+ {
+ m_bPressed = false;
+
+ m_pDialog->ClearRadioButtonGroup( m_nButtonGroup );
+ m_bChecked = !m_bChecked;
+
+ m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, true, this );
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTRadioButton::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( ContainsPoint( pt ) )
+ {
+ // Pressed while inside the control
+ m_bPressed = true;
+ SetCapture( DXUTGetHWND() );
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ if( m_bPressed )
+ {
+ m_bPressed = false;
+ ReleaseCapture();
+
+ // Button click
+ if( ContainsPoint( pt ) )
+ {
+ m_pDialog->ClearRadioButtonGroup( m_nButtonGroup );
+ m_bChecked = !m_bChecked;
+
+ m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, true, this );
+ }
+
+ return true;
+ }
+
+ break;
+ }
+ };
+
+ return false;
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTRadioButton::SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput )
+{
+ if( bChecked && bClearGroup )
+ m_pDialog->ClearRadioButtonGroup( m_nButtonGroup );
+
+ m_bChecked = bChecked;
+ m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, bFromInput, this );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTComboBox class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTComboBox::CDXUTComboBox( CDXUTDialog* pDialog ) : m_ScrollBar( pDialog )
+{
+ m_Type = DXUT_CONTROL_COMBOBOX;
+ m_pDialog = pDialog;
+
+ m_nDropHeight = 100;
+
+ m_nSBWidth = 16;
+ m_bOpened = false;
+ m_iSelected = -1;
+ m_iFocused = -1;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTComboBox::~CDXUTComboBox()
+{
+ RemoveAllItems();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::SetTextColor( D3DCOLOR Color )
+{
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ if( pElement )
+ pElement->FontColor.States[DXUT_STATE_NORMAL] = Color;
+
+ pElement = m_Elements.GetAt( 2 );
+
+ if( pElement )
+ pElement->FontColor.States[DXUT_STATE_NORMAL] = Color;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::UpdateRects()
+{
+
+ CDXUTButton::UpdateRects();
+
+ m_rcButton = m_rcBoundingBox;
+ m_rcButton.left = m_rcButton.right - RectHeight( m_rcButton );
+
+ m_rcText = m_rcBoundingBox;
+ m_rcText.right = m_rcButton.left;
+
+ m_rcDropdown = m_rcText;
+ OffsetRect( &m_rcDropdown, 0, ( int )( 0.90f * RectHeight( m_rcText ) ) );
+ m_rcDropdown.bottom += m_nDropHeight;
+ m_rcDropdown.right -= m_nSBWidth;
+
+ m_rcDropdownText = m_rcDropdown;
+ m_rcDropdownText.left += ( int )( 0.1f * RectWidth( m_rcDropdown ) );
+ m_rcDropdownText.right -= ( int )( 0.1f * RectWidth( m_rcDropdown ) );
+ m_rcDropdownText.top += ( int )( 0.1f * RectHeight( m_rcDropdown ) );
+ m_rcDropdownText.bottom -= ( int )( 0.1f * RectHeight( m_rcDropdown ) );
+
+ // Update the scrollbar's rects
+ m_ScrollBar.SetLocation( m_rcDropdown.right, m_rcDropdown.top + 2 );
+ m_ScrollBar.SetSize( m_nSBWidth, RectHeight( m_rcDropdown ) - 2 );
+ DXUTFontNode* pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements.GetAt( 2 )->iFont );
+ if( pFontNode && pFontNode->nHeight )
+ {
+ m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) / pFontNode->nHeight );
+
+ // The selected item may have been scrolled off the page.
+ // Ensure that it is in page again.
+ m_ScrollBar.ShowItem( m_iSelected );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::OnFocusOut()
+{
+ CDXUTButton::OnFocusOut();
+
+ m_bOpened = false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTComboBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ const DWORD REPEAT_MASK = ( 0x40000000 );
+
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ // Let the scroll bar have a chance to handle it first
+ if( m_ScrollBar.HandleKeyboard( uMsg, wParam, lParam ) )
+ return true;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_RETURN:
+ if( m_bOpened )
+ {
+ if( m_iSelected != m_iFocused )
+ {
+ m_iSelected = m_iFocused;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ }
+ m_bOpened = false;
+
+ if( !m_pDialog->m_bKeyboardInput )
+ m_pDialog->ClearFocus();
+
+ return true;
+ }
+ break;
+
+ case VK_F4:
+ // Filter out auto-repeats
+ if( lParam & REPEAT_MASK )
+ return true;
+
+ m_bOpened = !m_bOpened;
+
+ if( !m_bOpened )
+ {
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+
+ if( !m_pDialog->m_bKeyboardInput )
+ m_pDialog->ClearFocus();
+ }
+
+ return true;
+
+ case VK_LEFT:
+ case VK_UP:
+ if( m_iFocused > 0 )
+ {
+ m_iFocused--;
+ m_iSelected = m_iFocused;
+
+ if( !m_bOpened )
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ }
+
+ return true;
+
+ case VK_RIGHT:
+ case VK_DOWN:
+ if( m_iFocused + 1 < ( int )GetNumItems() )
+ {
+ m_iFocused++;
+ m_iSelected = m_iFocused;
+
+ if( !m_bOpened )
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ }
+
+ return true;
+ }
+ break;
+ }
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTComboBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ // Let the scroll bar handle it first.
+ if( m_ScrollBar.HandleMouse( uMsg, pt, wParam, lParam ) )
+ return true;
+
+ switch( uMsg )
+ {
+ case WM_MOUSEMOVE:
+ {
+ if( m_bOpened && PtInRect( &m_rcDropdown, pt ) )
+ {
+ // Determine which item has been selected
+ for( int i = 0; i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+ if( pItem->bVisible &&
+ PtInRect( &pItem->rcActive, pt ) )
+ {
+ m_iFocused = i;
+ }
+ }
+ return true;
+ }
+ break;
+ }
+
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( ContainsPoint( pt ) )
+ {
+ // Pressed while inside the control
+ m_bPressed = true;
+ SetCapture( DXUTGetHWND() );
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ // Toggle dropdown
+ if( m_bHasFocus )
+ {
+ m_bOpened = !m_bOpened;
+
+ if( !m_bOpened )
+ {
+ if( !m_pDialog->m_bKeyboardInput )
+ m_pDialog->ClearFocus();
+ }
+ }
+
+ return true;
+ }
+
+ // Perhaps this click is within the dropdown
+ if( m_bOpened && PtInRect( &m_rcDropdown, pt ) )
+ {
+ // Determine which item has been selected
+ for( int i = m_ScrollBar.GetTrackPos(); i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+ if( pItem->bVisible &&
+ PtInRect( &pItem->rcActive, pt ) )
+ {
+ m_iFocused = m_iSelected = i;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ m_bOpened = false;
+
+ if( !m_pDialog->m_bKeyboardInput )
+ m_pDialog->ClearFocus();
+
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ // Mouse click not on main control or in dropdown, fire an event if needed
+ if( m_bOpened )
+ {
+ m_iFocused = m_iSelected;
+
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ m_bOpened = false;
+ }
+
+ // Make sure the control is no longer in a pressed state
+ m_bPressed = false;
+
+ // Release focus if appropriate
+ if( !m_pDialog->m_bKeyboardInput )
+ {
+ m_pDialog->ClearFocus();
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ if( m_bPressed && ContainsPoint( pt ) )
+ {
+ // Button click
+ m_bPressed = false;
+ ReleaseCapture();
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_MOUSEWHEEL:
+ {
+ int zDelta = ( short )HIWORD( wParam ) / WHEEL_DELTA;
+ if( m_bOpened )
+ {
+ UINT uLines;
+ SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &uLines, 0 );
+ m_ScrollBar.Scroll( -zDelta * uLines );
+ }
+ else
+ {
+ if( zDelta > 0 )
+ {
+ if( m_iFocused > 0 )
+ {
+ m_iFocused--;
+ m_iSelected = m_iFocused;
+
+ if( !m_bOpened )
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ }
+ }
+ else
+ {
+ if( m_iFocused + 1 < ( int )GetNumItems() )
+ {
+ m_iFocused++;
+ m_iSelected = m_iFocused;
+
+ if( !m_bOpened )
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+ }
+ }
+ }
+ return true;
+ }
+ };
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::OnHotkey()
+{
+ if( m_bOpened )
+ return;
+
+ if( m_iSelected == -1 )
+ return;
+
+ if( m_pDialog->IsKeyboardInputEnabled() )
+ m_pDialog->RequestFocus( this );
+
+ m_iSelected++;
+
+ if( m_iSelected >= ( int )m_Items.GetSize() )
+ m_iSelected = 0;
+
+ m_iFocused = m_iSelected;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( !m_bOpened )
+ iState = DXUT_STATE_HIDDEN;
+
+ // Dropdown box
+ CDXUTElement* pElement = m_Elements.GetAt( 2 );
+
+ // If we have not initialized the scroll bar page size,
+ // do that now.
+ static bool bSBInit;
+ if( !bSBInit )
+ {
+ // Update the page size of the scroll bar
+ if( m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight )
+ m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) /
+ m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight );
+ else
+ m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) );
+ bSBInit = true;
+ }
+
+ // Scroll bar
+ if( m_bOpened )
+ m_ScrollBar.Render( fElapsedTime );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime );
+ pElement->FontColor.Blend( iState, fElapsedTime );
+
+ m_pDialog->DrawSprite( pElement, &m_rcDropdown, DXUT_NEAR_BUTTON_DEPTH );
+
+ // Selection outline
+ CDXUTElement* pSelectionElement = m_Elements.GetAt( 3 );
+ pSelectionElement->TextureColor.Current = pElement->TextureColor.Current;
+ pSelectionElement->FontColor.Current = pSelectionElement->FontColor.States[ DXUT_STATE_NORMAL ];
+
+ DXUTFontNode* pFont = m_pDialog->GetFont( pElement->iFont );
+ if( pFont )
+ {
+ int curY = m_rcDropdownText.top;
+ int nRemainingHeight = RectHeight( m_rcDropdownText );
+ //WCHAR strDropdown[4096] = {0};
+
+ for( int i = m_ScrollBar.GetTrackPos(); i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+
+ // Make sure there's room left in the dropdown
+ nRemainingHeight -= pFont->nHeight;
+ if( nRemainingHeight < 0 )
+ {
+ pItem->bVisible = false;
+ continue;
+ }
+
+ SetRect( &pItem->rcActive, m_rcDropdownText.left, curY, m_rcDropdownText.right, curY + pFont->nHeight );
+ curY += pFont->nHeight;
+
+ //debug
+ //int blue = 50 * i;
+ //m_pDialog->DrawRect( &pItem->rcActive, 0xFFFF0000 | blue );
+
+ pItem->bVisible = true;
+
+ if( m_bOpened )
+ {
+ if( ( int )i == m_iFocused )
+ {
+ RECT rc;
+ SetRect( &rc, m_rcDropdown.left, pItem->rcActive.top - 2, m_rcDropdown.right,
+ pItem->rcActive.bottom + 2 );
+ m_pDialog->DrawSprite( pSelectionElement, &rc, DXUT_NEAR_BUTTON_DEPTH );
+ m_pDialog->DrawText( pItem->strText, pSelectionElement, &pItem->rcActive );
+ }
+ else
+ {
+ m_pDialog->DrawText( pItem->strText, pElement, &pItem->rcActive );
+ }
+ }
+ }
+ }
+
+ int nOffsetX = 0;
+ int nOffsetY = 0;
+
+ iState = DXUT_STATE_NORMAL;
+
+ if( m_bVisible == false )
+ iState = DXUT_STATE_HIDDEN;
+ else if( m_bEnabled == false )
+ iState = DXUT_STATE_DISABLED;
+ else if( m_bPressed )
+ {
+ iState = DXUT_STATE_PRESSED;
+
+ nOffsetX = 1;
+ nOffsetY = 2;
+ }
+ else if( m_bMouseOver )
+ {
+ iState = DXUT_STATE_MOUSEOVER;
+
+ nOffsetX = -1;
+ nOffsetY = -2;
+ }
+ else if( m_bHasFocus )
+ iState = DXUT_STATE_FOCUS;
+
+ float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;
+
+ // Button
+ pElement = m_Elements.GetAt( 1 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+
+ RECT rcWindow = m_rcButton;
+ OffsetRect( &rcWindow, nOffsetX, nOffsetY );
+ m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_FAR_BUTTON_DEPTH );
+
+ if( m_bOpened )
+ iState = DXUT_STATE_PRESSED;
+
+ // Main text box
+ pElement = m_Elements.GetAt( 0 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate );
+
+ m_pDialog->DrawSprite( pElement, &m_rcText, DXUT_NEAR_BUTTON_DEPTH );
+
+ if( m_iSelected >= 0 && m_iSelected < ( int )m_Items.GetSize() )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( m_iSelected );
+ if( pItem != NULL )
+ {
+ m_pDialog->DrawText( pItem->strText, pElement, &m_rcText, false, -1, true );
+
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTComboBox::AddItem( const WCHAR* strText, void* pData )
+{
+ // Validate parameters
+ if( strText == NULL )
+ {
+ return E_INVALIDARG;
+ }
+
+ // Create a new item and set the data
+ DXUTComboBoxItem* pItem = new DXUTComboBoxItem;
+ if( pItem == NULL )
+ {
+ return DXTRACE_ERR_MSGBOX( L"new", E_OUTOFMEMORY );
+ }
+
+ ZeroMemory( pItem, sizeof( DXUTComboBoxItem ) );
+ wcscpy_s( pItem->strText, 256, strText );
+ pItem->pData = pData;
+
+ m_Items.Add( pItem );
+
+ // Update the scroll bar with new range
+ m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() );
+
+ // If this is the only item in the list, it's selected
+ if( GetNumItems() == 1 )
+ {
+ m_iSelected = 0;
+ m_iFocused = 0;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this );
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::RemoveItem( UINT index )
+{
+ DXUTComboBoxItem* pItem = m_Items.GetAt( index );
+ SAFE_DELETE( pItem );
+ m_Items.Remove( index );
+ m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() );
+ if( m_iSelected >= m_Items.GetSize() )
+ m_iSelected = m_Items.GetSize() - 1;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTComboBox::RemoveAllItems()
+{
+ for( int i = 0; i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+ SAFE_DELETE( pItem );
+ }
+
+ m_Items.RemoveAll();
+ m_ScrollBar.SetTrackRange( 0, 1 );
+ m_iFocused = m_iSelected = -1;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTComboBox::ContainsItem( const WCHAR* strText, UINT iStart )
+{
+ return ( -1 != FindItem( strText, iStart ) );
+}
+
+
+//--------------------------------------------------------------------------------------
+int CDXUTComboBox::FindItem( const WCHAR* strText, UINT iStart )
+{
+ if( strText == NULL )
+ return -1;
+
+ for( int i = iStart; i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+
+ if( 0 == wcscmp( pItem->strText, strText ) )
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+
+//--------------------------------------------------------------------------------------
+void* CDXUTComboBox::GetSelectedData()
+{
+ if( m_iSelected < 0 )
+ return NULL;
+
+ DXUTComboBoxItem* pItem = m_Items.GetAt( m_iSelected );
+ return pItem->pData;
+}
+
+
+//--------------------------------------------------------------------------------------
+DXUTComboBoxItem* CDXUTComboBox::GetSelectedItem()
+{
+ if( m_iSelected < 0 )
+ return NULL;
+
+ return m_Items.GetAt( m_iSelected );
+}
+
+
+//--------------------------------------------------------------------------------------
+void* CDXUTComboBox::GetItemData( const WCHAR* strText )
+{
+ int index = FindItem( strText );
+ if( index == -1 )
+ {
+ return NULL;
+ }
+
+ DXUTComboBoxItem* pItem = m_Items.GetAt( index );
+ if( pItem == NULL )
+ {
+ DXTRACE_ERR( L"CGrowableArray::GetAt", E_FAIL );
+ return NULL;
+ }
+
+ return pItem->pData;
+}
+
+
+//--------------------------------------------------------------------------------------
+void* CDXUTComboBox::GetItemData( int nIndex )
+{
+ if( nIndex < 0 || nIndex >= m_Items.GetSize() )
+ return NULL;
+
+ return m_Items.GetAt( nIndex )->pData;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTComboBox::SetSelectedByIndex( UINT index )
+{
+ if( index >= GetNumItems() )
+ return E_INVALIDARG;
+
+ m_iFocused = m_iSelected = index;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTComboBox::SetSelectedByText( const WCHAR* strText )
+{
+ if( strText == NULL )
+ return E_INVALIDARG;
+
+ int index = FindItem( strText );
+ if( index == -1 )
+ return E_FAIL;
+
+ m_iFocused = m_iSelected = index;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this );
+
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTComboBox::SetSelectedByData( void* pData )
+{
+ for( int i = 0; i < m_Items.GetSize(); i++ )
+ {
+ DXUTComboBoxItem* pItem = m_Items.GetAt( i );
+
+ if( pItem->pData == pData )
+ {
+ m_iFocused = m_iSelected = i;
+ m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this );
+ return S_OK;
+ }
+ }
+
+ return E_FAIL;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+CDXUTSlider::CDXUTSlider( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_SLIDER;
+ m_pDialog = pDialog;
+
+ m_nMin = 0;
+ m_nMax = 100;
+ m_nValue = 50;
+
+ m_bPressed = false;
+}
+
+
+//--------------------------------------------------------------------------------------
+BOOL CDXUTSlider::ContainsPoint( POINT pt )
+{
+ return ( PtInRect( &m_rcBoundingBox, pt ) ||
+ PtInRect( &m_rcButton, pt ) );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSlider::UpdateRects()
+{
+ CDXUTControl::UpdateRects();
+
+ m_rcButton = m_rcBoundingBox;
+ m_rcButton.right = m_rcButton.left + RectHeight( m_rcButton );
+ OffsetRect( &m_rcButton, -RectWidth( m_rcButton ) / 2, 0 );
+
+ m_nButtonX = ( int )( ( m_nValue - m_nMin ) * ( float )RectWidth( m_rcBoundingBox ) / ( m_nMax - m_nMin ) );
+ OffsetRect( &m_rcButton, m_nButtonX, 0 );
+}
+
+int CDXUTSlider::ValueFromPos( int x )
+{
+ float fValuePerPixel = ( float )( m_nMax - m_nMin ) / RectWidth( m_rcBoundingBox );
+ return ( int )( 0.5f + m_nMin + fValuePerPixel * ( x - m_rcBoundingBox.left ) );
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTSlider::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_HOME:
+ SetValueInternal( m_nMin, true );
+ return true;
+
+ case VK_END:
+ SetValueInternal( m_nMax, true );
+ return true;
+
+ case VK_LEFT:
+ case VK_DOWN:
+ SetValueInternal( m_nValue - 1, true );
+ return true;
+
+ case VK_RIGHT:
+ case VK_UP:
+ SetValueInternal( m_nValue + 1, true );
+ return true;
+
+ case VK_NEXT:
+ SetValueInternal( m_nValue - ( 10 > ( m_nMax - m_nMin ) / 10 ? 10 : ( m_nMax - m_nMin ) / 10 ),
+ true );
+ return true;
+
+ case VK_PRIOR:
+ SetValueInternal( m_nValue + ( 10 > ( m_nMax - m_nMin ) / 10 ? 10 : ( m_nMax - m_nMin ) / 10 ),
+ true );
+ return true;
+ }
+ break;
+ }
+ }
+
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTSlider::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( PtInRect( &m_rcButton, pt ) )
+ {
+ // Pressed while inside the control
+ m_bPressed = true;
+ SetCapture( DXUTGetHWND() );
+
+ m_nDragX = pt.x;
+ //m_nDragY = pt.y;
+ m_nDragOffset = m_nButtonX - m_nDragX;
+
+ //m_nDragValue = m_nValue;
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ return true;
+ }
+
+ if( PtInRect( &m_rcBoundingBox, pt ) )
+ {
+ m_nDragX = pt.x;
+ m_nDragOffset = 0;
+ m_bPressed = true;
+
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ if( pt.x > m_nButtonX + m_x )
+ {
+ SetValueInternal( m_nValue + 1, true );
+ return true;
+ }
+
+ if( pt.x < m_nButtonX + m_x )
+ {
+ SetValueInternal( m_nValue - 1, true );
+ return true;
+ }
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ if( m_bPressed )
+ {
+ m_bPressed = false;
+ ReleaseCapture();
+ m_pDialog->SendEvent( EVENT_SLIDER_VALUE_CHANGED_UP, true, this );
+
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_MOUSEMOVE:
+ {
+ if( m_bPressed )
+ {
+ SetValueInternal( ValueFromPos( m_x + pt.x + m_nDragOffset ), true );
+ return true;
+ }
+
+ break;
+ }
+
+ case WM_MOUSEWHEEL:
+ {
+ int nScrollAmount = int( ( short )HIWORD( wParam ) ) / WHEEL_DELTA;
+ SetValueInternal( m_nValue - nScrollAmount, true );
+ return true;
+ }
+ };
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSlider::SetRange( int nMin, int nMax )
+{
+ m_nMin = nMin;
+ m_nMax = nMax;
+
+ SetValueInternal( m_nValue, false );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSlider::SetValueInternal( int nValue, bool bFromInput )
+{
+ // Clamp to range
+ nValue = __max( m_nMin, nValue );
+ nValue = __min( m_nMax, nValue );
+
+ if( nValue == m_nValue )
+ return;
+
+ m_nValue = nValue;
+ UpdateRects();
+
+ m_pDialog->SendEvent( EVENT_SLIDER_VALUE_CHANGED, bFromInput, this );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSlider::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ int nOffsetX = 0;
+ int nOffsetY = 0;
+
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( m_bVisible == false )
+ {
+ iState = DXUT_STATE_HIDDEN;
+ }
+ else if( m_bEnabled == false )
+ {
+ iState = DXUT_STATE_DISABLED;
+ }
+ else if( m_bPressed )
+ {
+ iState = DXUT_STATE_PRESSED;
+
+ nOffsetX = 1;
+ nOffsetY = 2;
+ }
+ else if( m_bMouseOver )
+ {
+ iState = DXUT_STATE_MOUSEOVER;
+
+ nOffsetX = -1;
+ nOffsetY = -2;
+ }
+ else if( m_bHasFocus )
+ {
+ iState = DXUT_STATE_FOCUS;
+ }
+
+ float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;
+
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcBoundingBox, DXUT_FAR_BUTTON_DEPTH );
+
+ pElement = m_Elements.GetAt( 1 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_NEAR_BUTTON_DEPTH );
+}
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTScrollBar class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTScrollBar::CDXUTScrollBar( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_SCROLLBAR;
+ m_pDialog = pDialog;
+
+ m_bShowThumb = true;
+ m_bDrag = false;
+
+ SetRect( &m_rcUpButton, 0, 0, 0, 0 );
+ SetRect( &m_rcDownButton, 0, 0, 0, 0 );
+ SetRect( &m_rcTrack, 0, 0, 0, 0 );
+ SetRect( &m_rcThumb, 0, 0, 0, 0 );
+ m_nPosition = 0;
+ m_nPageSize = 1;
+ m_nStart = 0;
+ m_nEnd = 1;
+ m_Arrow = CLEAR;
+ m_dArrowTS = 0.0;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTScrollBar::~CDXUTScrollBar()
+{
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTScrollBar::UpdateRects()
+{
+ CDXUTControl::UpdateRects();
+
+ // Make the buttons square
+
+ SetRect( &m_rcUpButton, m_rcBoundingBox.left, m_rcBoundingBox.top,
+ m_rcBoundingBox.right, m_rcBoundingBox.top + RectWidth( m_rcBoundingBox ) );
+ SetRect( &m_rcDownButton, m_rcBoundingBox.left, m_rcBoundingBox.bottom - RectWidth( m_rcBoundingBox ),
+ m_rcBoundingBox.right, m_rcBoundingBox.bottom );
+ SetRect( &m_rcTrack, m_rcUpButton.left, m_rcUpButton.bottom,
+ m_rcDownButton.right, m_rcDownButton.top );
+ m_rcThumb.left = m_rcUpButton.left;
+ m_rcThumb.right = m_rcUpButton.right;
+
+ UpdateThumbRect();
+}
+
+
+//--------------------------------------------------------------------------------------
+// Compute the dimension of the scroll thumb
+void CDXUTScrollBar::UpdateThumbRect()
+{
+ if( m_nEnd - m_nStart > m_nPageSize )
+ {
+ int nThumbHeight = __max( RectHeight( m_rcTrack ) * m_nPageSize / ( m_nEnd - m_nStart ),
+ SCROLLBAR_MINTHUMBSIZE );
+ int nMaxPosition = m_nEnd - m_nStart - m_nPageSize;
+ m_rcThumb.top = m_rcTrack.top + ( m_nPosition - m_nStart ) * ( RectHeight( m_rcTrack ) - nThumbHeight )
+ / nMaxPosition;
+ m_rcThumb.bottom = m_rcThumb.top + nThumbHeight;
+ m_bShowThumb = true;
+
+ }
+ else
+ {
+ // No content to scroll
+ m_rcThumb.bottom = m_rcThumb.top;
+ m_bShowThumb = false;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Scroll() scrolls by nDelta items. A positive value scrolls down, while a negative
+// value scrolls up.
+void CDXUTScrollBar::Scroll( int nDelta )
+{
+ // Perform scroll
+ m_nPosition += nDelta;
+
+ // Cap position
+ Cap();
+
+ // Update thumb position
+ UpdateThumbRect();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTScrollBar::ShowItem( int nIndex )
+{
+ // Cap the index
+
+ if( nIndex < 0 )
+ nIndex = 0;
+
+ if( nIndex >= m_nEnd )
+ nIndex = m_nEnd - 1;
+
+ // Adjust position
+
+ if( m_nPosition > nIndex )
+ m_nPosition = nIndex;
+ else if( m_nPosition + m_nPageSize <= nIndex )
+ m_nPosition = nIndex - m_nPageSize + 1;
+
+ UpdateThumbRect();
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTScrollBar::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTScrollBar::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ static int ThumbOffsetY;
+
+ m_LastMouse = pt;
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ // Check for click on up button
+
+ if( PtInRect( &m_rcUpButton, pt ) )
+ {
+ SetCapture( DXUTGetHWND() );
+ if( m_nPosition > m_nStart )
+ --m_nPosition;
+ UpdateThumbRect();
+ m_Arrow = CLICKED_UP;
+ m_dArrowTS = DXUTGetTime();
+ return true;
+ }
+
+ // Check for click on down button
+
+ if( PtInRect( &m_rcDownButton, pt ) )
+ {
+ SetCapture( DXUTGetHWND() );
+ if( m_nPosition + m_nPageSize <= m_nEnd )
+ ++m_nPosition;
+ UpdateThumbRect();
+ m_Arrow = CLICKED_DOWN;
+ m_dArrowTS = DXUTGetTime();
+ return true;
+ }
+
+ // Check for click on thumb
+
+ if( PtInRect( &m_rcThumb, pt ) )
+ {
+ SetCapture( DXUTGetHWND() );
+ m_bDrag = true;
+ ThumbOffsetY = pt.y - m_rcThumb.top;
+ return true;
+ }
+
+ // Check for click on track
+
+ if( m_rcThumb.left <= pt.x &&
+ m_rcThumb.right > pt.x )
+ {
+ SetCapture( DXUTGetHWND() );
+ if( m_rcThumb.top > pt.y &&
+ m_rcTrack.top <= pt.y )
+ {
+ Scroll( -( m_nPageSize - 1 ) );
+ return true;
+ }
+ else if( m_rcThumb.bottom <= pt.y &&
+ m_rcTrack.bottom > pt.y )
+ {
+ Scroll( m_nPageSize - 1 );
+ return true;
+ }
+ }
+
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ {
+ m_bDrag = false;
+ ReleaseCapture();
+ UpdateThumbRect();
+ m_Arrow = CLEAR;
+ break;
+ }
+
+ case WM_MOUSEMOVE:
+ {
+ if( m_bDrag )
+ {
+ m_rcThumb.bottom += pt.y - ThumbOffsetY - m_rcThumb.top;
+ m_rcThumb.top = pt.y - ThumbOffsetY;
+ if( m_rcThumb.top < m_rcTrack.top )
+ OffsetRect( &m_rcThumb, 0, m_rcTrack.top - m_rcThumb.top );
+ else if( m_rcThumb.bottom > m_rcTrack.bottom )
+ OffsetRect( &m_rcThumb, 0, m_rcTrack.bottom - m_rcThumb.bottom );
+
+ // Compute first item index based on thumb position
+
+ int nMaxFirstItem = m_nEnd - m_nStart - m_nPageSize + 1; // Largest possible index for first item
+ int nMaxThumb = RectHeight( m_rcTrack ) - RectHeight( m_rcThumb ); // Largest possible thumb position from the top
+
+ m_nPosition = m_nStart +
+ ( m_rcThumb.top - m_rcTrack.top +
+ nMaxThumb / ( nMaxFirstItem * 2 ) ) * // Shift by half a row to avoid last row covered by only one pixel
+ nMaxFirstItem / nMaxThumb;
+
+ return true;
+ }
+
+ break;
+ }
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTScrollBar::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( WM_CAPTURECHANGED == uMsg )
+ {
+ // The application just lost mouse capture. We may not have gotten
+ // the WM_MOUSEUP message, so reset m_bDrag here.
+ if( ( HWND )lParam != DXUTGetHWND() )
+ m_bDrag = false;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTScrollBar::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ // Check if the arrow button has been held for a while.
+ // If so, update the thumb position to simulate repeated
+ // scroll.
+ if( m_Arrow != CLEAR )
+ {
+ double dCurrTime = DXUTGetTime();
+ if( PtInRect( &m_rcUpButton, m_LastMouse ) )
+ {
+ switch( m_Arrow )
+ {
+ case CLICKED_UP:
+ if( SCROLLBAR_ARROWCLICK_DELAY < dCurrTime - m_dArrowTS )
+ {
+ Scroll( -1 );
+ m_Arrow = HELD_UP;
+ m_dArrowTS = dCurrTime;
+ }
+ break;
+ case HELD_UP:
+ if( SCROLLBAR_ARROWCLICK_REPEAT < dCurrTime - m_dArrowTS )
+ {
+ Scroll( -1 );
+ m_dArrowTS = dCurrTime;
+ }
+ break;
+ }
+ }
+ else if( PtInRect( &m_rcDownButton, m_LastMouse ) )
+ {
+ switch( m_Arrow )
+ {
+ case CLICKED_DOWN:
+ if( SCROLLBAR_ARROWCLICK_DELAY < dCurrTime - m_dArrowTS )
+ {
+ Scroll( 1 );
+ m_Arrow = HELD_DOWN;
+ m_dArrowTS = dCurrTime;
+ }
+ break;
+ case HELD_DOWN:
+ if( SCROLLBAR_ARROWCLICK_REPEAT < dCurrTime - m_dArrowTS )
+ {
+ Scroll( 1 );
+ m_dArrowTS = dCurrTime;
+ }
+ break;
+ }
+ }
+ }
+
+ DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL;
+
+ if( m_bVisible == false )
+ iState = DXUT_STATE_HIDDEN;
+ else if( m_bEnabled == false || m_bShowThumb == false )
+ iState = DXUT_STATE_DISABLED;
+ else if( m_bMouseOver )
+ iState = DXUT_STATE_MOUSEOVER;
+ else if( m_bHasFocus )
+ iState = DXUT_STATE_FOCUS;
+
+
+ float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f;
+
+ // Background track layer
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcTrack, DXUT_FAR_BUTTON_DEPTH );
+
+ // Up Arrow
+ pElement = m_Elements.GetAt( 1 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcUpButton, DXUT_NEAR_BUTTON_DEPTH );
+
+ // Down Arrow
+ pElement = m_Elements.GetAt( 2 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcDownButton, DXUT_NEAR_BUTTON_DEPTH );
+
+ // Thumb button
+ pElement = m_Elements.GetAt( 3 );
+
+ // Blend current color
+ pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate );
+ m_pDialog->DrawSprite( pElement, &m_rcThumb, DXUT_NEAR_BUTTON_DEPTH );
+
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTScrollBar::SetTrackRange( int nStart, int nEnd )
+{
+ m_nStart = nStart; m_nEnd = nEnd;
+ Cap();
+ UpdateThumbRect();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTScrollBar::Cap() // Clips position at boundaries. Ensures it stays within legal range.
+{
+ if( m_nPosition < m_nStart ||
+ m_nEnd - m_nStart <= m_nPageSize )
+ {
+ m_nPosition = m_nStart;
+ }
+ else if( m_nPosition + m_nPageSize > m_nEnd )
+ m_nPosition = m_nEnd - m_nPageSize + 1;
+}
+
+//--------------------------------------------------------------------------------------
+// CDXUTListBox class
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTListBox::CDXUTListBox( CDXUTDialog* pDialog ) : m_ScrollBar( pDialog )
+{
+ m_Type = DXUT_CONTROL_LISTBOX;
+ m_pDialog = pDialog;
+
+ m_dwStyle = 0;
+ m_nSBWidth = 16;
+ m_nSelected = -1;
+ m_nSelStart = 0;
+ m_bDrag = false;
+ m_nBorder = 6;
+ m_nMargin = 5;
+ m_nTextHeight = 0;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTListBox::~CDXUTListBox()
+{
+ RemoveAllItems();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTListBox::UpdateRects()
+{
+ CDXUTControl::UpdateRects();
+
+ m_rcSelection = m_rcBoundingBox;
+ m_rcSelection.right -= m_nSBWidth;
+ InflateRect( &m_rcSelection, -m_nBorder, -m_nBorder );
+ m_rcText = m_rcSelection;
+ InflateRect( &m_rcText, -m_nMargin, 0 );
+
+ // Update the scrollbar's rects
+ m_ScrollBar.SetLocation( m_rcBoundingBox.right - m_nSBWidth, m_rcBoundingBox.top );
+ m_ScrollBar.SetSize( m_nSBWidth, m_height );
+ DXUTFontNode* pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements.GetAt( 0 )->iFont );
+ if( pFontNode && pFontNode->nHeight )
+ {
+ m_ScrollBar.SetPageSize( RectHeight( m_rcText ) / pFontNode->nHeight );
+
+ // The selected item may have been scrolled off the page.
+ // Ensure that it is in page again.
+ m_ScrollBar.ShowItem( m_nSelected );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTListBox::AddItem( const WCHAR* wszText, void* pData )
+{
+ DXUTListBoxItem* pNewItem = new DXUTListBoxItem;
+ if( !pNewItem )
+ return E_OUTOFMEMORY;
+
+ wcscpy_s( pNewItem->strText, 256, wszText );
+ pNewItem->pData = pData;
+ SetRect( &pNewItem->rcActive, 0, 0, 0, 0 );
+ pNewItem->bSelected = false;
+
+ HRESULT hr = m_Items.Add( pNewItem );
+ if( FAILED( hr ) )
+ {
+ SAFE_DELETE( pNewItem );
+ }
+ else
+ {
+ m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() );
+ }
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTListBox::InsertItem( int nIndex, const WCHAR* wszText, void* pData )
+{
+ DXUTListBoxItem* pNewItem = new DXUTListBoxItem;
+ if( !pNewItem )
+ return E_OUTOFMEMORY;
+
+ wcscpy_s( pNewItem->strText, 256, wszText );
+ pNewItem->pData = pData;
+ SetRect( &pNewItem->rcActive, 0, 0, 0, 0 );
+ pNewItem->bSelected = false;
+
+ HRESULT hr = m_Items.Insert( nIndex, pNewItem );
+ if( SUCCEEDED( hr ) )
+ m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() );
+ else
+ SAFE_DELETE( pNewItem );
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTListBox::RemoveItem( int nIndex )
+{
+ if( nIndex < 0 || nIndex >= ( int )m_Items.GetSize() )
+ return;
+
+ DXUTListBoxItem* pItem = m_Items.GetAt( nIndex );
+
+ delete pItem;
+ m_Items.Remove( nIndex );
+ m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() );
+ if( m_nSelected >= ( int )m_Items.GetSize() )
+ m_nSelected = m_Items.GetSize() - 1;
+
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+}
+
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTListBox::RemoveAllItems()
+{
+ for( int i = 0; i < m_Items.GetSize(); ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ delete pItem;
+ }
+
+ m_Items.RemoveAll();
+ m_ScrollBar.SetTrackRange( 0, 1 );
+}
+
+
+//--------------------------------------------------------------------------------------
+DXUTListBoxItem* CDXUTListBox::GetItem( int nIndex )
+{
+ if( nIndex < 0 || nIndex >= ( int )m_Items.GetSize() )
+ return NULL;
+
+ return m_Items[nIndex];
+}
+
+
+//--------------------------------------------------------------------------------------
+// For single-selection listbox, returns the index of the selected item.
+// For multi-selection, returns the first selected item after the nPreviousSelected position.
+// To search for the first selected item, the app passes -1 for nPreviousSelected. For
+// subsequent searches, the app passes the returned index back to GetSelectedIndex as.
+// nPreviousSelected.
+// Returns -1 on error or if no item is selected.
+int CDXUTListBox::GetSelectedIndex( int nPreviousSelected )
+{
+ if( nPreviousSelected < -1 )
+ return -1;
+
+ if( m_dwStyle & MULTISELECTION )
+ {
+ // Multiple selection enabled. Search for the next item with the selected flag.
+ for( int i = nPreviousSelected + 1; i < ( int )m_Items.GetSize(); ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+
+ if( pItem->bSelected )
+ return i;
+ }
+
+ return -1;
+ }
+ else
+ {
+ // Single selection
+ return m_nSelected;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTListBox::SelectItem( int nNewIndex )
+{
+ // If no item exists, do nothing.
+ if( m_Items.GetSize() == 0 )
+ return;
+
+ int nOldSelected = m_nSelected;
+
+ // Adjust m_nSelected
+ m_nSelected = nNewIndex;
+
+ // Perform capping
+ if( m_nSelected < 0 )
+ m_nSelected = 0;
+ if( m_nSelected >= ( int )m_Items.GetSize() )
+ m_nSelected = m_Items.GetSize() - 1;
+
+ if( nOldSelected != m_nSelected )
+ {
+ if( m_dwStyle & MULTISELECTION )
+ {
+ m_Items[m_nSelected]->bSelected = true;
+ }
+
+ // Update selection start
+ m_nSelStart = m_nSelected;
+
+ // Adjust scroll bar
+ m_ScrollBar.ShowItem( m_nSelected );
+ }
+
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTListBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ // Let the scroll bar have a chance to handle it first
+ if( m_ScrollBar.HandleKeyboard( uMsg, wParam, lParam ) )
+ return true;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ switch( wParam )
+ {
+ case VK_UP:
+ case VK_DOWN:
+ case VK_NEXT:
+ case VK_PRIOR:
+ case VK_HOME:
+ case VK_END:
+ {
+ // If no item exists, do nothing.
+ if( m_Items.GetSize() == 0 )
+ return true;
+
+ int nOldSelected = m_nSelected;
+
+ // Adjust m_nSelected
+ switch( wParam )
+ {
+ case VK_UP:
+ --m_nSelected; break;
+ case VK_DOWN:
+ ++m_nSelected; break;
+ case VK_NEXT:
+ m_nSelected += m_ScrollBar.GetPageSize() - 1; break;
+ case VK_PRIOR:
+ m_nSelected -= m_ScrollBar.GetPageSize() - 1; break;
+ case VK_HOME:
+ m_nSelected = 0; break;
+ case VK_END:
+ m_nSelected = m_Items.GetSize() - 1; break;
+ }
+
+ // Perform capping
+ if( m_nSelected < 0 )
+ m_nSelected = 0;
+ if( m_nSelected >= ( int )m_Items.GetSize() )
+ m_nSelected = m_Items.GetSize() - 1;
+
+ if( nOldSelected != m_nSelected )
+ {
+ if( m_dwStyle & MULTISELECTION )
+ {
+ // Multiple selection
+
+ // Clear all selection
+ for( int i = 0; i < ( int )m_Items.GetSize(); ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items[i];
+ pItem->bSelected = false;
+ }
+
+ if( GetKeyState( VK_SHIFT ) < 0 )
+ {
+ // Select all items from m_nSelStart to
+ // m_nSelected
+ int nEnd = __max( m_nSelStart, m_nSelected );
+
+ for( int n = __min( m_nSelStart, m_nSelected ); n <= nEnd; ++n )
+ m_Items[n]->bSelected = true;
+ }
+ else
+ {
+ m_Items[m_nSelected]->bSelected = true;
+
+ // Update selection start
+ m_nSelStart = m_nSelected;
+ }
+ }
+ else
+ m_nSelStart = m_nSelected;
+
+ // Adjust scroll bar
+
+ m_ScrollBar.ShowItem( m_nSelected );
+
+ // Send notification
+
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+ }
+ return true;
+ }
+
+ // Space is the hotkey for double-clicking an item.
+ //
+ case VK_SPACE:
+ m_pDialog->SendEvent( EVENT_LISTBOX_ITEM_DBLCLK, true, this );
+ return true;
+ }
+ break;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTListBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ // First acquire focus
+ if( WM_LBUTTONDOWN == uMsg )
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ // Let the scroll bar handle it first.
+ if( m_ScrollBar.HandleMouse( uMsg, pt, wParam, lParam ) )
+ return true;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ // Check for clicks in the text area
+ if( m_Items.GetSize() > 0 && PtInRect( &m_rcSelection, pt ) )
+ {
+ // Compute the index of the clicked item
+
+ int nClicked;
+ if( m_nTextHeight )
+ nClicked = m_ScrollBar.GetTrackPos() + ( pt.y - m_rcText.top ) / m_nTextHeight;
+ else
+ nClicked = -1;
+
+ // Only proceed if the click falls on top of an item.
+
+ if( nClicked >= m_ScrollBar.GetTrackPos() &&
+ nClicked < ( int )m_Items.GetSize() &&
+ nClicked < m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() )
+ {
+ SetCapture( DXUTGetHWND() );
+ m_bDrag = true;
+
+ // If this is a double click, fire off an event and exit
+ // since the first click would have taken care of the selection
+ // updating.
+ if( uMsg == WM_LBUTTONDBLCLK )
+ {
+ m_pDialog->SendEvent( EVENT_LISTBOX_ITEM_DBLCLK, true, this );
+ return true;
+ }
+
+ m_nSelected = nClicked;
+ if( !( wParam & MK_SHIFT ) )
+ m_nSelStart = m_nSelected;
+
+ // If this is a multi-selection listbox, update per-item
+ // selection data.
+
+ if( m_dwStyle & MULTISELECTION )
+ {
+ // Determine behavior based on the state of Shift and Ctrl
+
+ DXUTListBoxItem* pSelItem = m_Items.GetAt( m_nSelected );
+ if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == MK_CONTROL )
+ {
+ // Control click. Reverse the selection of this item.
+
+ pSelItem->bSelected = !pSelItem->bSelected;
+ }
+ else if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == MK_SHIFT )
+ {
+ // Shift click. Set the selection for all items
+ // from last selected item to the current item.
+ // Clear everything else.
+
+ int nBegin = __min( m_nSelStart, m_nSelected );
+ int nEnd = __max( m_nSelStart, m_nSelected );
+
+ for( int i = 0; i < nBegin; ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ pItem->bSelected = false;
+ }
+
+ for( int i = nEnd + 1; i < ( int )m_Items.GetSize(); ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ pItem->bSelected = false;
+ }
+
+ for( int i = nBegin; i <= nEnd; ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ pItem->bSelected = true;
+ }
+ }
+ else if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == ( MK_SHIFT | MK_CONTROL ) )
+ {
+ // Control-Shift-click.
+
+ // The behavior is:
+ // Set all items from m_nSelStart to m_nSelected to
+ // the same state as m_nSelStart, not including m_nSelected.
+ // Set m_nSelected to selected.
+
+ int nBegin = __min( m_nSelStart, m_nSelected );
+ int nEnd = __max( m_nSelStart, m_nSelected );
+
+ // The two ends do not need to be set here.
+
+ bool bLastSelected = m_Items.GetAt( m_nSelStart )->bSelected;
+ for( int i = nBegin + 1; i < nEnd; ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ pItem->bSelected = bLastSelected;
+ }
+
+ pSelItem->bSelected = true;
+
+ // Restore m_nSelected to the previous value
+ // This matches the Windows behavior
+
+ m_nSelected = m_nSelStart;
+ }
+ else
+ {
+ // Simple click. Clear all items and select the clicked
+ // item.
+
+
+ for( int i = 0; i < ( int )m_Items.GetSize(); ++i )
+ {
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+ pItem->bSelected = false;
+ }
+
+ pSelItem->bSelected = true;
+ }
+ } // End of multi-selection case
+
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+ }
+
+ return true;
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ {
+ ReleaseCapture();
+ m_bDrag = false;
+
+ if( m_nSelected != -1 )
+ {
+ // Set all items between m_nSelStart and m_nSelected to
+ // the same state as m_nSelStart
+ int nEnd = __max( m_nSelStart, m_nSelected );
+
+ for( int n = __min( m_nSelStart, m_nSelected ) + 1; n < nEnd; ++n )
+ m_Items[n]->bSelected = m_Items[m_nSelStart]->bSelected;
+ m_Items[m_nSelected]->bSelected = m_Items[m_nSelStart]->bSelected;
+
+ // If m_nSelStart and m_nSelected are not the same,
+ // the user has dragged the mouse to make a selection.
+ // Notify the application of this.
+ if( m_nSelStart != m_nSelected )
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION_END, true, this );
+ }
+ return false;
+ }
+
+ case WM_MOUSEMOVE:
+ if( m_bDrag )
+ {
+ // Compute the index of the item below cursor
+
+ int nItem;
+ if( m_nTextHeight )
+ nItem = m_ScrollBar.GetTrackPos() + ( pt.y - m_rcText.top ) / m_nTextHeight;
+ else
+ nItem = -1;
+
+ // Only proceed if the cursor is on top of an item.
+
+ if( nItem >= ( int )m_ScrollBar.GetTrackPos() &&
+ nItem < ( int )m_Items.GetSize() &&
+ nItem < m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() )
+ {
+ m_nSelected = nItem;
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+ }
+ else if( nItem < ( int )m_ScrollBar.GetTrackPos() )
+ {
+ // User drags the mouse above window top
+ m_ScrollBar.Scroll( -1 );
+ m_nSelected = m_ScrollBar.GetTrackPos();
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+ }
+ else if( nItem >= m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() )
+ {
+ // User drags the mouse below window bottom
+ m_ScrollBar.Scroll( 1 );
+ m_nSelected = __min( ( int )m_Items.GetSize(), m_ScrollBar.GetTrackPos() +
+ m_ScrollBar.GetPageSize() ) - 1;
+ m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this );
+ }
+ }
+ break;
+
+ case WM_MOUSEWHEEL:
+ {
+ UINT uLines;
+ SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &uLines, 0 );
+ int nScrollAmount = int( ( short )HIWORD( wParam ) ) / WHEEL_DELTA * uLines;
+ m_ScrollBar.Scroll( -nScrollAmount );
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTListBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( WM_CAPTURECHANGED == uMsg )
+ {
+ // The application just lost mouse capture. We may not have gotten
+ // the WM_MOUSEUP message, so reset m_bDrag here.
+ if( ( HWND )lParam != DXUTGetHWND() )
+ m_bDrag = false;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTListBox::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ CDXUTElement* pElement = m_Elements.GetAt( 0 );
+ pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+ pElement->FontColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+
+ CDXUTElement* pSelElement = m_Elements.GetAt( 1 );
+ pSelElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+ pSelElement->FontColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+
+ m_pDialog->DrawSprite( pElement, &m_rcBoundingBox, DXUT_FAR_BUTTON_DEPTH );
+
+ // Render the text
+ if( m_Items.GetSize() > 0 )
+ {
+ // Find out the height of a single line of text
+ RECT rc = m_rcText;
+ RECT rcSel = m_rcSelection;
+ rc.bottom = rc.top + m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight;
+
+ // Update the line height formation
+ m_nTextHeight = rc.bottom - rc.top;
+
+ static bool bSBInit;
+ if( !bSBInit )
+ {
+ // Update the page size of the scroll bar
+ if( m_nTextHeight )
+ m_ScrollBar.SetPageSize( RectHeight( m_rcText ) / m_nTextHeight );
+ else
+ m_ScrollBar.SetPageSize( RectHeight( m_rcText ) );
+ bSBInit = true;
+ }
+
+ rc.right = m_rcText.right;
+ for( int i = m_ScrollBar.GetTrackPos(); i < ( int )m_Items.GetSize(); ++i )
+ {
+ if( rc.bottom > m_rcText.bottom )
+ break;
+
+ DXUTListBoxItem* pItem = m_Items.GetAt( i );
+
+ // Determine if we need to render this item with the
+ // selected element.
+ bool bSelectedStyle = false;
+
+ if( !( m_dwStyle & MULTISELECTION ) && i == m_nSelected )
+ bSelectedStyle = true;
+ else if( m_dwStyle & MULTISELECTION )
+ {
+ if( m_bDrag &&
+ ( ( i >= m_nSelected && i < m_nSelStart ) ||
+ ( i <= m_nSelected && i > m_nSelStart ) ) )
+ bSelectedStyle = m_Items[m_nSelStart]->bSelected;
+ else if( pItem->bSelected )
+ bSelectedStyle = true;
+ }
+
+ if( bSelectedStyle )
+ {
+ rcSel.top = rc.top; rcSel.bottom = rc.bottom;
+ m_pDialog->DrawSprite( pSelElement, &rcSel, DXUT_NEAR_BUTTON_DEPTH );
+ m_pDialog->DrawText( pItem->strText, pSelElement, &rc );
+ }
+ else
+ m_pDialog->DrawText( pItem->strText, pElement, &rc );
+
+ OffsetRect( &rc, 0, m_nTextHeight );
+ }
+ }
+
+ // Render the scroll bar
+
+ m_ScrollBar.Render( fElapsedTime );
+}
+
+
+// Static member initialization
+HINSTANCE CUniBuffer::s_hDll = NULL;
+HRESULT ( WINAPI*CUniBuffer::_ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*,
+ SCRIPT_STATE* ) = Dummy_ScriptApplyDigitSubstitution;
+HRESULT ( WINAPI*CUniBuffer::_ScriptStringAnalyse )( HDC, const void*, int, int, int, DWORD, int, SCRIPT_CONTROL*,
+ SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*,
+ SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringAnalyse;
+HRESULT ( WINAPI*CUniBuffer::_ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) = Dummy_ScriptStringCPtoX;
+HRESULT ( WINAPI*CUniBuffer::_ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* ) = Dummy_ScriptStringXtoCP;
+HRESULT ( WINAPI*CUniBuffer::_ScriptStringFree )( SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringFree;
+const SCRIPT_LOGATTR* ( WINAPI*CUniBuffer::_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS ) =
+ Dummy_ScriptString_pLogAttr;
+const int* ( WINAPI*CUniBuffer::_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS ) =
+ Dummy_ScriptString_pcOutChars;
+bool CDXUTEditBox::s_bHideCaret; // If true, we don't render the caret.
+
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTEditBox class
+//--------------------------------------------------------------------------------------
+
+// When scrolling, EDITBOX_SCROLLEXTENT is reciprocal of the amount to scroll.
+// If EDITBOX_SCROLLEXTENT = 4, then we scroll 1/4 of the control each time.
+#define EDITBOX_SCROLLEXTENT 4
+
+//--------------------------------------------------------------------------------------
+CDXUTEditBox::CDXUTEditBox( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_EDITBOX;
+ m_pDialog = pDialog;
+
+ m_nBorder = 5; // Default border width
+ m_nSpacing = 4; // Default spacing
+
+ m_bCaretOn = true;
+ m_dfBlink = GetCaretBlinkTime() * 0.001f;
+ m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime();
+ s_bHideCaret = false;
+ m_nFirstVisible = 0;
+ m_TextColor = D3DCOLOR_ARGB( 255, 16, 16, 16 );
+ m_SelTextColor = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_SelBkColor = D3DCOLOR_ARGB( 255, 40, 50, 92 );
+ m_CaretColor = D3DCOLOR_ARGB( 255, 0, 0, 0 );
+ m_nCaret = m_nSelStart = 0;
+ m_bInsertMode = true;
+
+ m_bMouseDrag = false;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTEditBox::~CDXUTEditBox()
+{
+}
+
+
+//--------------------------------------------------------------------------------------
+// PlaceCaret: Set the caret to a character position, and adjust the scrolling if
+// necessary.
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::PlaceCaret( int nCP )
+{
+ assert( nCP >= 0 && nCP <= m_Buffer.GetTextSize() );
+ m_nCaret = nCP;
+
+ // Obtain the X offset of the character.
+ int nX1st, nX, nX2;
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // 1st visible char
+ m_Buffer.CPtoX( nCP, FALSE, &nX ); // LEAD
+ // If nCP is the NULL terminator, get the leading edge instead of trailing.
+ if( nCP == m_Buffer.GetTextSize() )
+ nX2 = nX;
+ else
+ m_Buffer.CPtoX( nCP, TRUE, &nX2 ); // TRAIL
+
+ // If the left edge of the char is smaller than the left edge of the 1st visible char,
+ // we need to scroll left until this char is visible.
+ if( nX < nX1st )
+ {
+ // Simply make the first visible character the char at the new caret position.
+ m_nFirstVisible = nCP;
+ }
+ else // If the right of the character is bigger than the offset of the control's
+ // right edge, we need to scroll right to this character.
+ if( nX2 > nX1st + RectWidth( m_rcText ) )
+ {
+ // Compute the X of the new left-most pixel
+ int nXNewLeft = nX2 - RectWidth( m_rcText );
+
+ // Compute the char position of this character
+ int nCPNew1st, nNewTrail;
+ m_Buffer.XtoCP( nXNewLeft, &nCPNew1st, &nNewTrail );
+
+ // If this coordinate is not on a character border,
+ // start from the next character so that the caret
+ // position does not fall outside the text rectangle.
+ int nXNew1st;
+ m_Buffer.CPtoX( nCPNew1st, FALSE, &nXNew1st );
+ if( nXNew1st < nXNewLeft )
+ ++nCPNew1st;
+
+ m_nFirstVisible = nCPNew1st;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::ClearText()
+{
+ m_Buffer.Clear();
+ m_nFirstVisible = 0;
+ PlaceCaret( 0 );
+ m_nSelStart = 0;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::SetText( LPCWSTR wszText, bool bSelected )
+{
+ assert( wszText != NULL );
+
+ m_Buffer.SetText( wszText );
+ m_nFirstVisible = 0;
+ // Move the caret to the end of the text
+ PlaceCaret( m_Buffer.GetTextSize() );
+ m_nSelStart = bSelected ? 0 : m_nCaret;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTEditBox::GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest,
+ UINT bufferCount )
+{
+ assert( strDest );
+
+ wcscpy_s( strDest, bufferCount, m_Buffer.GetBuffer() );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::DeleteSelectionText()
+{
+ int nFirst = __min( m_nCaret, m_nSelStart );
+ int nLast = __max( m_nCaret, m_nSelStart );
+ // Update caret and selection
+ PlaceCaret( nFirst );
+ m_nSelStart = m_nCaret;
+ // Remove the characters
+ for( int i = nFirst; i < nLast; ++i )
+ m_Buffer.RemoveChar( nFirst );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::UpdateRects()
+{
+ CDXUTControl::UpdateRects();
+
+ // Update the text rectangle
+ m_rcText = m_rcBoundingBox;
+ // First inflate by m_nBorder to compute render rects
+ InflateRect( &m_rcText, -m_nBorder, -m_nBorder );
+
+ // Update the render rectangles
+ m_rcRender[0] = m_rcText;
+ SetRect( &m_rcRender[1], m_rcBoundingBox.left, m_rcBoundingBox.top, m_rcText.left, m_rcText.top );
+ SetRect( &m_rcRender[2], m_rcText.left, m_rcBoundingBox.top, m_rcText.right, m_rcText.top );
+ SetRect( &m_rcRender[3], m_rcText.right, m_rcBoundingBox.top, m_rcBoundingBox.right, m_rcText.top );
+ SetRect( &m_rcRender[4], m_rcBoundingBox.left, m_rcText.top, m_rcText.left, m_rcText.bottom );
+ SetRect( &m_rcRender[5], m_rcText.right, m_rcText.top, m_rcBoundingBox.right, m_rcText.bottom );
+ SetRect( &m_rcRender[6], m_rcBoundingBox.left, m_rcText.bottom, m_rcText.left, m_rcBoundingBox.bottom );
+ SetRect( &m_rcRender[7], m_rcText.left, m_rcText.bottom, m_rcText.right, m_rcBoundingBox.bottom );
+ SetRect( &m_rcRender[8], m_rcText.right, m_rcText.bottom, m_rcBoundingBox.right, m_rcBoundingBox.bottom );
+
+ // Inflate further by m_nSpacing
+ InflateRect( &m_rcText, -m_nSpacing, -m_nSpacing );
+}
+
+
+void CDXUTEditBox::CopyToClipboard()
+{
+ // Copy the selection text to the clipboard
+ if( m_nCaret != m_nSelStart && OpenClipboard( NULL ) )
+ {
+ EmptyClipboard();
+
+ HGLOBAL hBlock = GlobalAlloc( GMEM_MOVEABLE, sizeof( WCHAR ) * ( m_Buffer.GetTextSize() + 1 ) );
+ if( hBlock )
+ {
+ WCHAR* pwszText = ( WCHAR* )GlobalLock( hBlock );
+ if( pwszText )
+ {
+ int nFirst = __min( m_nCaret, m_nSelStart );
+ int nLast = __max( m_nCaret, m_nSelStart );
+ if( nLast - nFirst > 0 )
+ CopyMemory( pwszText, m_Buffer.GetBuffer() + nFirst, ( nLast - nFirst ) * sizeof( WCHAR ) );
+ pwszText[nLast - nFirst] = L'\0'; // Terminate it
+ GlobalUnlock( hBlock );
+ }
+ SetClipboardData( CF_UNICODETEXT, hBlock );
+ }
+ CloseClipboard();
+ // We must not free the object until CloseClipboard is called.
+ if( hBlock )
+ GlobalFree( hBlock );
+ }
+}
+
+
+void CDXUTEditBox::PasteFromClipboard()
+{
+ DeleteSelectionText();
+
+ if( OpenClipboard( NULL ) )
+ {
+ HANDLE handle = GetClipboardData( CF_UNICODETEXT );
+ if( handle )
+ {
+ // Convert the ANSI string to Unicode, then
+ // insert to our buffer.
+ WCHAR* pwszText = ( WCHAR* )GlobalLock( handle );
+ if( pwszText )
+ {
+ // Copy all characters up to null.
+ if( m_Buffer.InsertString( m_nCaret, pwszText ) )
+ PlaceCaret( m_nCaret + lstrlenW( pwszText ) );
+ m_nSelStart = m_nCaret;
+ GlobalUnlock( handle );
+ }
+ }
+ CloseClipboard();
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTEditBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ bool bHandled = false;
+
+ switch( uMsg )
+ {
+ case WM_KEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_TAB:
+ // We don't process Tab in case keyboard input is enabled and the user
+ // wishes to Tab to other controls.
+ break;
+
+ case VK_HOME:
+ PlaceCaret( 0 );
+ if( GetKeyState( VK_SHIFT ) >= 0 )
+ // Shift is not down. Update selection
+ // start along with the caret.
+ m_nSelStart = m_nCaret;
+ ResetCaretBlink();
+ bHandled = true;
+ break;
+
+ case VK_END:
+ PlaceCaret( m_Buffer.GetTextSize() );
+ if( GetKeyState( VK_SHIFT ) >= 0 )
+ // Shift is not down. Update selection
+ // start along with the caret.
+ m_nSelStart = m_nCaret;
+ ResetCaretBlink();
+ bHandled = true;
+ break;
+
+ case VK_INSERT:
+ if( GetKeyState( VK_CONTROL ) < 0 )
+ {
+ // Control Insert. Copy to clipboard
+ CopyToClipboard();
+ }
+ else if( GetKeyState( VK_SHIFT ) < 0 )
+ {
+ // Shift Insert. Paste from clipboard
+ PasteFromClipboard();
+ }
+ else
+ {
+ // Toggle caret insert mode
+ m_bInsertMode = !m_bInsertMode;
+ }
+ break;
+
+ case VK_DELETE:
+ // Check if there is a text selection.
+ if( m_nCaret != m_nSelStart )
+ {
+ DeleteSelectionText();
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+ else
+ {
+ // Deleting one character
+ if( m_Buffer.RemoveChar( m_nCaret ) )
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+ ResetCaretBlink();
+ bHandled = true;
+ break;
+
+ case VK_LEFT:
+ if( GetKeyState( VK_CONTROL ) < 0 )
+ {
+ // Control is down. Move the caret to a new item
+ // instead of a character.
+ m_Buffer.GetPriorItemPos( m_nCaret, &m_nCaret );
+ PlaceCaret( m_nCaret );
+ }
+ else if( m_nCaret > 0 )
+ PlaceCaret( m_nCaret - 1 );
+ if( GetKeyState( VK_SHIFT ) >= 0 )
+ // Shift is not down. Update selection
+ // start along with the caret.
+ m_nSelStart = m_nCaret;
+ ResetCaretBlink();
+ bHandled = true;
+ break;
+
+ case VK_RIGHT:
+ if( GetKeyState( VK_CONTROL ) < 0 )
+ {
+ // Control is down. Move the caret to a new item
+ // instead of a character.
+ m_Buffer.GetNextItemPos( m_nCaret, &m_nCaret );
+ PlaceCaret( m_nCaret );
+ }
+ else if( m_nCaret < m_Buffer.GetTextSize() )
+ PlaceCaret( m_nCaret + 1 );
+ if( GetKeyState( VK_SHIFT ) >= 0 )
+ // Shift is not down. Update selection
+ // start along with the caret.
+ m_nSelStart = m_nCaret;
+ ResetCaretBlink();
+ bHandled = true;
+ break;
+
+ case VK_UP:
+ case VK_DOWN:
+ // Trap up and down arrows so that the dialog
+ // does not switch focus to another control.
+ bHandled = true;
+ break;
+
+ default:
+ bHandled = wParam != VK_ESCAPE; // Let the application handle Esc.
+ }
+ }
+ }
+ return bHandled;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTEditBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ if( !m_bHasFocus )
+ m_pDialog->RequestFocus( this );
+
+ if( !ContainsPoint( pt ) )
+ return false;
+
+ m_bMouseDrag = true;
+ SetCapture( DXUTGetHWND() );
+ // Determine the character corresponding to the coordinates.
+ int nCP, nTrail, nX1st;
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // X offset of the 1st visible char
+ if( SUCCEEDED( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) )
+ {
+ // Cap at the NULL character.
+ if( nTrail && nCP < m_Buffer.GetTextSize() )
+ PlaceCaret( nCP + 1 );
+ else
+ PlaceCaret( nCP );
+ m_nSelStart = m_nCaret;
+ ResetCaretBlink();
+ }
+ return true;
+ }
+
+ case WM_LBUTTONUP:
+ ReleaseCapture();
+ m_bMouseDrag = false;
+ break;
+
+ case WM_MOUSEMOVE:
+ if( m_bMouseDrag )
+ {
+ // Determine the character corresponding to the coordinates.
+ int nCP, nTrail, nX1st;
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // X offset of the 1st visible char
+ if( SUCCEEDED( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) )
+ {
+ // Cap at the NULL character.
+ if( nTrail && nCP < m_Buffer.GetTextSize() )
+ PlaceCaret( nCP + 1 );
+ else
+ PlaceCaret( nCP );
+ }
+ }
+ break;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::OnFocusIn()
+{
+ CDXUTControl::OnFocusIn();
+
+ ResetCaretBlink();
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ // Make sure that while editing, the keyup and keydown messages associated with
+ // WM_CHAR messages don't go to any non-focused controls or cameras
+ case WM_KEYUP:
+ case WM_KEYDOWN:
+ return true;
+
+ case WM_CHAR:
+ {
+ switch( ( WCHAR )wParam )
+ {
+ // Backspace
+ case VK_BACK:
+ {
+ // If there's a selection, treat this
+ // like a delete key.
+ if( m_nCaret != m_nSelStart )
+ {
+ DeleteSelectionText();
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+ else if( m_nCaret > 0 )
+ {
+ // Move the caret, then delete the char.
+ PlaceCaret( m_nCaret - 1 );
+ m_nSelStart = m_nCaret;
+ m_Buffer.RemoveChar( m_nCaret );
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+ ResetCaretBlink();
+ break;
+ }
+
+ case 24: // Ctrl-X Cut
+ case VK_CANCEL: // Ctrl-C Copy
+ {
+ CopyToClipboard();
+
+ // If the key is Ctrl-X, delete the selection too.
+ if( ( WCHAR )wParam == 24 )
+ {
+ DeleteSelectionText();
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+
+ break;
+ }
+
+ // Ctrl-V Paste
+ case 22:
+ {
+ PasteFromClipboard();
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ break;
+ }
+
+ // Ctrl-A Select All
+ case 1:
+ if( m_nSelStart == m_nCaret )
+ {
+ m_nSelStart = 0;
+ PlaceCaret( m_Buffer.GetTextSize() );
+ }
+ break;
+
+ case VK_RETURN:
+ // Invoke the callback when the user presses Enter.
+ m_pDialog->SendEvent( EVENT_EDITBOX_STRING, true, this );
+ break;
+
+ // Junk characters we don't want in the string
+ case 26: // Ctrl Z
+ case 2: // Ctrl B
+ case 14: // Ctrl N
+ case 19: // Ctrl S
+ case 4: // Ctrl D
+ case 6: // Ctrl F
+ case 7: // Ctrl G
+ case 10: // Ctrl J
+ case 11: // Ctrl K
+ case 12: // Ctrl L
+ case 17: // Ctrl Q
+ case 23: // Ctrl W
+ case 5: // Ctrl E
+ case 18: // Ctrl R
+ case 20: // Ctrl T
+ case 25: // Ctrl Y
+ case 21: // Ctrl U
+ case 9: // Ctrl I
+ case 15: // Ctrl O
+ case 16: // Ctrl P
+ case 27: // Ctrl [
+ case 29: // Ctrl ]
+ case 28: // Ctrl \
+ break;
+
+ default:
+ {
+ // If there's a selection and the user
+ // starts to type, the selection should
+ // be deleted.
+ if( m_nCaret != m_nSelStart )
+ DeleteSelectionText();
+
+ // If we are in overwrite mode and there is already
+ // a char at the caret's position, simply replace it.
+ // Otherwise, we insert the char as normal.
+ if( !m_bInsertMode && m_nCaret < m_Buffer.GetTextSize() )
+ {
+ m_Buffer[m_nCaret] = ( WCHAR )wParam;
+ PlaceCaret( m_nCaret + 1 );
+ m_nSelStart = m_nCaret;
+ }
+ else
+ {
+ // Insert the char
+ if( m_Buffer.InsertChar( m_nCaret, ( WCHAR )wParam ) )
+ {
+ PlaceCaret( m_nCaret + 1 );
+ m_nSelStart = m_nCaret;
+ }
+ }
+ ResetCaretBlink();
+ m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this );
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ HRESULT hr;
+ int nSelStartX = 0, nCaretX = 0; // Left and right X cordinates of the selection region
+
+ CDXUTElement* pElement = GetElement( 0 );
+ if( pElement )
+ {
+ m_Buffer.SetFontNode( m_pDialog->GetFont( pElement->iFont ) );
+ PlaceCaret( m_nCaret ); // Call PlaceCaret now that we have the font info (node),
+ // so that scrolling can be handled.
+ }
+
+ // Render the control graphics
+ for( int e = 0; e < 9; ++e )
+ {
+ pElement = m_Elements.GetAt( e );
+ pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+
+ m_pDialog->DrawSprite( pElement, &m_rcRender[e], DXUT_FAR_BUTTON_DEPTH );
+ }
+
+ //
+ // Compute the X coordinates of the first visible character.
+ //
+ int nXFirst;
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst );
+
+ //
+ // Compute the X coordinates of the selection rectangle
+ //
+ hr = m_Buffer.CPtoX( m_nCaret, FALSE, &nCaretX );
+ if( m_nCaret != m_nSelStart )
+ hr = m_Buffer.CPtoX( m_nSelStart, FALSE, &nSelStartX );
+ else
+ nSelStartX = nCaretX;
+
+ //
+ // Render the selection rectangle
+ //
+ RECT rcSelection; // Make this available for rendering selected text
+ if( m_nCaret != m_nSelStart )
+ {
+ int nSelLeftX = nCaretX, nSelRightX = nSelStartX;
+ // Swap if left is bigger than right
+ if( nSelLeftX > nSelRightX )
+ {
+ int nTemp = nSelLeftX; nSelLeftX = nSelRightX; nSelRightX = nTemp;
+ }
+
+ SetRect( &rcSelection, nSelLeftX, m_rcText.top, nSelRightX, m_rcText.bottom );
+ OffsetRect( &rcSelection, m_rcText.left - nXFirst, 0 );
+ IntersectRect( &rcSelection, &m_rcText, &rcSelection );
+
+ IDirect3DDevice9* pd3dDevice = m_pDialog->GetManager()->GetD3D9Device();
+ if( pd3dDevice )
+ pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
+ m_pDialog->DrawRect( &rcSelection, m_SelBkColor );
+ if( pd3dDevice )
+ pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
+ }
+
+ //
+ // Render the text
+ //
+ // Element 0 for text
+ m_Elements.GetAt( 0 )->FontColor.Current = m_TextColor;
+ m_pDialog->DrawText( m_Buffer.GetBuffer() + m_nFirstVisible, m_Elements.GetAt( 0 ), &m_rcText );
+
+ // Render the selected text
+ if( m_nCaret != m_nSelStart )
+ {
+ int nFirstToRender = __max( m_nFirstVisible, __min( m_nSelStart, m_nCaret ) );
+ int nNumChatToRender = __max( m_nSelStart, m_nCaret ) - nFirstToRender;
+ m_Elements.GetAt( 0 )->FontColor.Current = m_SelTextColor;
+ m_pDialog->DrawText( m_Buffer.GetBuffer() + nFirstToRender,
+ m_Elements.GetAt( 0 ), &rcSelection, false, nNumChatToRender );
+ }
+
+ //
+ // Blink the caret
+ //
+ if( DXUTGetGlobalTimer()->GetAbsoluteTime() - m_dfLastBlink >= m_dfBlink )
+ {
+ m_bCaretOn = !m_bCaretOn;
+ m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime();
+ }
+
+ //
+ // Render the caret if this control has the focus
+ //
+ if( m_bHasFocus && m_bCaretOn && !s_bHideCaret )
+ {
+ // Start the rectangle with insert mode caret
+ RECT rcCaret =
+ {
+ m_rcText.left - nXFirst + nCaretX - 1, m_rcText.top,
+ m_rcText.left - nXFirst + nCaretX + 1, m_rcText.bottom
+ };
+
+ // If we are in overwrite mode, adjust the caret rectangle
+ // to fill the entire character.
+ if( !m_bInsertMode )
+ {
+ // Obtain the right edge X coord of the current character
+ int nRightEdgeX;
+ m_Buffer.CPtoX( m_nCaret, TRUE, &nRightEdgeX );
+ rcCaret.right = m_rcText.left - nXFirst + nRightEdgeX;
+ }
+
+ m_pDialog->DrawRect( &rcCaret, m_CaretColor );
+ }
+}
+
+
+#define IN_FLOAT_CHARSET( c ) \
+ ( (c) == L'-' || (c) == L'.' || ( (c) >= L'0' && (c) <= L'9' ) )
+
+void CDXUTEditBox::ParseFloatArray( float* pNumbers, int nCount )
+{
+ int nWritten = 0; // Number of floats written
+ const WCHAR* pToken, *pEnd;
+ WCHAR wszToken[60];
+
+ pToken = m_Buffer.GetBuffer();
+ while( nWritten < nCount && *pToken != L'\0' )
+ {
+ // Skip leading spaces
+ while( *pToken == L' ' )
+ ++pToken;
+
+ if( *pToken == L'\0' )
+ break;
+
+ // Locate the end of number
+ pEnd = pToken;
+ while( IN_FLOAT_CHARSET( *pEnd ) )
+ ++pEnd;
+
+ // Copy the token to our buffer
+ int nTokenLen = __min( sizeof( wszToken ) / sizeof( wszToken[0] ) - 1, int( pEnd - pToken ) );
+ wcscpy_s( wszToken, nTokenLen, pToken );
+ *pNumbers = ( float )wcstod( wszToken, NULL );
+ ++nWritten;
+ ++pNumbers;
+ pToken = pEnd;
+ }
+}
+
+
+void CDXUTEditBox::SetTextFloatArray( const float* pNumbers, int nCount )
+{
+ WCHAR wszBuffer[512] =
+ {
+ 0
+ };
+ WCHAR wszTmp[64];
+
+ if( pNumbers == NULL )
+ return;
+
+ for( int i = 0; i < nCount; ++i )
+ {
+ swprintf_s( wszTmp, 64, L"%.4f ", pNumbers[i] );
+ wcscat_s( wszBuffer, 512, wszTmp );
+ }
+
+ // Don't want the last space
+ if( nCount > 0 && wcslen( wszBuffer ) > 0 )
+ wszBuffer[wcslen( wszBuffer ) - 1] = 0;
+
+ SetText( wszBuffer );
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+void CUniBuffer::Initialize()
+{
+ if( s_hDll ) // Only need to do once
+ return;
+
+ s_hDll = LoadLibrary( UNISCRIBE_DLLNAME );
+ if( s_hDll )
+ {
+ FARPROC Temp;
+ GETPROCADDRESS( s_hDll, ScriptApplyDigitSubstitution, Temp );
+ GETPROCADDRESS( s_hDll, ScriptStringAnalyse, Temp );
+ GETPROCADDRESS( s_hDll, ScriptStringCPtoX, Temp );
+ GETPROCADDRESS( s_hDll, ScriptStringXtoCP, Temp );
+ GETPROCADDRESS( s_hDll, ScriptStringFree, Temp );
+ GETPROCADDRESS( s_hDll, ScriptString_pLogAttr, Temp );
+ GETPROCADDRESS( s_hDll, ScriptString_pcOutChars, Temp );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CUniBuffer::Uninitialize()
+{
+ if( s_hDll )
+ {
+ PLACEHOLDERPROC( ScriptApplyDigitSubstitution );
+ PLACEHOLDERPROC( ScriptStringAnalyse );
+ PLACEHOLDERPROC( ScriptStringCPtoX );
+ PLACEHOLDERPROC( ScriptStringXtoCP );
+ PLACEHOLDERPROC( ScriptStringFree );
+ PLACEHOLDERPROC( ScriptString_pLogAttr );
+ PLACEHOLDERPROC( ScriptString_pcOutChars );
+
+ FreeLibrary( s_hDll );
+ s_hDll = NULL;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CUniBuffer::SetBufferSize( int nNewSize )
+{
+ // If the current size is already the maximum allowed,
+ // we can't possibly allocate more.
+ if( m_nBufferSize == DXUT_MAX_EDITBOXLENGTH )
+ return false;
+
+ int nAllocateSize = ( nNewSize == -1 || nNewSize < m_nBufferSize * 2 ) ? ( m_nBufferSize ? m_nBufferSize *
+ 2 : 256 ) : nNewSize * 2;
+
+ // Cap the buffer size at the maximum allowed.
+ if( nAllocateSize > DXUT_MAX_EDITBOXLENGTH )
+ nAllocateSize = DXUT_MAX_EDITBOXLENGTH;
+
+ WCHAR* pTempBuffer = new WCHAR[nAllocateSize];
+ if( !pTempBuffer )
+ return false;
+
+ ZeroMemory( pTempBuffer, sizeof( WCHAR ) * nAllocateSize );
+
+ if( m_pwszBuffer )
+ {
+ CopyMemory( pTempBuffer, m_pwszBuffer, m_nBufferSize * sizeof( WCHAR ) );
+ delete[] m_pwszBuffer;
+ }
+
+ m_pwszBuffer = pTempBuffer;
+ m_nBufferSize = nAllocateSize;
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Uniscribe -- Analyse() analyses the string in the buffer
+//--------------------------------------------------------------------------------------
+HRESULT CUniBuffer::Analyse()
+{
+ if( m_Analysis )
+ _ScriptStringFree( &m_Analysis );
+
+ SCRIPT_CONTROL ScriptControl; // For uniscribe
+ SCRIPT_STATE ScriptState; // For uniscribe
+ ZeroMemory( &ScriptControl, sizeof( ScriptControl ) );
+ ZeroMemory( &ScriptState, sizeof( ScriptState ) );
+ _ScriptApplyDigitSubstitution( NULL, &ScriptControl, &ScriptState );
+
+ if( !m_pFontNode )
+ return E_FAIL;
+
+ HDC hDC =
+ ( m_pFontNode->pFont9 ? m_pFontNode->pFont9->GetDC() : NULL );
+ HRESULT hr = _ScriptStringAnalyse( hDC,
+ m_pwszBuffer,
+ lstrlenW( m_pwszBuffer ) + 1, // NULL is also analyzed.
+ lstrlenW( m_pwszBuffer ) * 3 / 2 + 16,
+ -1,
+ SSA_BREAK | SSA_GLYPHS | SSA_FALLBACK | SSA_LINK,
+ 0,
+ &ScriptControl,
+ &ScriptState,
+ NULL,
+ NULL,
+ NULL,
+ &m_Analysis );
+ if( SUCCEEDED( hr ) )
+ m_bAnalyseRequired = false; // Analysis is up-to-date
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+CUniBuffer::CUniBuffer( int nInitialSize )
+{
+ CUniBuffer::Initialize(); // ensure static vars are properly init'ed first
+
+ m_nBufferSize = 0;
+ m_pwszBuffer = NULL;
+ m_bAnalyseRequired = true;
+ m_Analysis = NULL;
+ m_pFontNode = NULL;
+
+ if( nInitialSize > 0 )
+ SetBufferSize( nInitialSize );
+}
+
+
+//--------------------------------------------------------------------------------------
+CUniBuffer::~CUniBuffer()
+{
+ delete[] m_pwszBuffer;
+ if( m_Analysis )
+ _ScriptStringFree( &m_Analysis );
+}
+
+
+//--------------------------------------------------------------------------------------
+WCHAR& CUniBuffer::operator[]( int n ) // No param checking
+{
+ // This version of operator[] is called only
+ // if we are asking for write access, so
+ // re-analysis is required.
+ m_bAnalyseRequired = true;
+ return m_pwszBuffer[n];
+}
+
+
+//--------------------------------------------------------------------------------------
+void CUniBuffer::Clear()
+{
+ *m_pwszBuffer = L'\0';
+ m_bAnalyseRequired = true;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Inserts the char at specified index.
+// If nIndex == -1, insert to the end.
+//--------------------------------------------------------------------------------------
+bool CUniBuffer::InsertChar( int nIndex, WCHAR wChar )
+{
+ assert( nIndex >= 0 );
+
+ if( nIndex < 0 || nIndex > lstrlenW( m_pwszBuffer ) )
+ return false; // invalid index
+
+ // Check for maximum length allowed
+ if( GetTextSize() + 1 >= DXUT_MAX_EDITBOXLENGTH )
+ return false;
+
+ if( lstrlenW( m_pwszBuffer ) + 1 >= m_nBufferSize )
+ {
+ if( !SetBufferSize( -1 ) )
+ return false; // out of memory
+ }
+
+ assert( m_nBufferSize >= 2 );
+
+ // Shift the characters after the index, start by copying the null terminator
+ WCHAR* dest = m_pwszBuffer + lstrlenW( m_pwszBuffer ) + 1;
+ WCHAR* stop = m_pwszBuffer + nIndex;
+ WCHAR* src = dest - 1;
+
+ while( dest > stop )
+ {
+ *dest-- = *src--;
+ }
+
+ // Set new character
+ m_pwszBuffer[ nIndex ] = wChar;
+ m_bAnalyseRequired = true;
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Removes the char at specified index.
+// If nIndex == -1, remove the last char.
+//--------------------------------------------------------------------------------------
+bool CUniBuffer::RemoveChar( int nIndex )
+{
+ if( !lstrlenW( m_pwszBuffer ) || nIndex < 0 || nIndex >= lstrlenW( m_pwszBuffer ) )
+ return false; // Invalid index
+
+ MoveMemory( m_pwszBuffer + nIndex, m_pwszBuffer + nIndex + 1, sizeof( WCHAR ) *
+ ( lstrlenW( m_pwszBuffer ) - nIndex ) );
+ m_bAnalyseRequired = true;
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Inserts the first nCount characters of the string pStr at specified index.
+// If nCount == -1, the entire string is inserted.
+// If nIndex == -1, insert to the end.
+//--------------------------------------------------------------------------------------
+bool CUniBuffer::InsertString( int nIndex, const WCHAR* pStr, int nCount )
+{
+ assert( nIndex >= 0 );
+ if( nIndex < 0 )
+ return false;
+
+ if( nIndex > lstrlenW( m_pwszBuffer ) )
+ return false; // invalid index
+
+ if( -1 == nCount )
+ nCount = lstrlenW( pStr );
+
+ // Check for maximum length allowed
+ if( GetTextSize() + nCount >= DXUT_MAX_EDITBOXLENGTH )
+ return false;
+
+ if( lstrlenW( m_pwszBuffer ) + nCount >= m_nBufferSize )
+ {
+ if( !SetBufferSize( lstrlenW( m_pwszBuffer ) + nCount + 1 ) )
+ return false; // out of memory
+ }
+
+ MoveMemory( m_pwszBuffer + nIndex + nCount, m_pwszBuffer + nIndex, sizeof( WCHAR ) *
+ ( lstrlenW( m_pwszBuffer ) - nIndex + 1 ) );
+ CopyMemory( m_pwszBuffer + nIndex, pStr, nCount * sizeof( WCHAR ) );
+ m_bAnalyseRequired = true;
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CUniBuffer::SetText( LPCWSTR wszText )
+{
+ assert( wszText != NULL );
+
+ int nRequired = int( wcslen( wszText ) + 1 );
+
+ // Check for maximum length allowed
+ if( nRequired >= DXUT_MAX_EDITBOXLENGTH )
+ return false;
+
+ while( GetBufferSize() < nRequired )
+ if( !SetBufferSize( -1 ) )
+ break;
+ // Check again in case out of memory occurred inside while loop.
+ if( GetBufferSize() >= nRequired )
+ {
+ wcscpy_s( m_pwszBuffer, GetBufferSize(), wszText );
+ m_bAnalyseRequired = true;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CUniBuffer::CPtoX( int nCP, BOOL bTrail, int* pX )
+{
+ assert( pX );
+ *pX = 0; // Default
+
+ HRESULT hr = S_OK;
+ if( m_bAnalyseRequired )
+ hr = Analyse();
+
+ if( SUCCEEDED( hr ) )
+ hr = _ScriptStringCPtoX( m_Analysis, nCP, bTrail, pX );
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CUniBuffer::XtoCP( int nX, int* pCP, int* pnTrail )
+{
+ assert( pCP && pnTrail );
+ *pCP = 0; *pnTrail = FALSE; // Default
+
+ HRESULT hr = S_OK;
+ if( m_bAnalyseRequired )
+ hr = Analyse();
+
+ if( SUCCEEDED( hr ) )
+ hr = _ScriptStringXtoCP( m_Analysis, nX, pCP, pnTrail );
+
+ // If the coordinate falls outside the text region, we
+ // can get character positions that don't exist. We must
+ // filter them here and convert them to those that do exist.
+ if( *pCP == -1 && *pnTrail == TRUE )
+ {
+ *pCP = 0; *pnTrail = FALSE;
+ }
+ else if( *pCP > lstrlenW( m_pwszBuffer ) && *pnTrail == FALSE )
+ {
+ *pCP = lstrlenW( m_pwszBuffer ); *pnTrail = TRUE;
+ }
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CUniBuffer::GetPriorItemPos( int nCP, int* pPrior )
+{
+ *pPrior = nCP; // Default is the char itself
+
+ if( m_bAnalyseRequired )
+ if( FAILED( Analyse() ) )
+ return;
+
+ const SCRIPT_LOGATTR* pLogAttr = _ScriptString_pLogAttr( m_Analysis );
+ if( !pLogAttr )
+ return;
+
+ if( !_ScriptString_pcOutChars( m_Analysis ) )
+ return;
+ int nInitial = *_ScriptString_pcOutChars( m_Analysis );
+ if( nCP - 1 < nInitial )
+ nInitial = nCP - 1;
+ for( int i = nInitial; i > 0; --i )
+ if( pLogAttr[i].fWordStop || // Either the fWordStop flag is set
+ ( !pLogAttr[i].fWhiteSpace && // Or the previous char is whitespace but this isn't.
+ pLogAttr[i - 1].fWhiteSpace ) )
+ {
+ *pPrior = i;
+ return;
+ }
+ // We have reached index 0. 0 is always a break point, so simply return it.
+ *pPrior = 0;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CUniBuffer::GetNextItemPos( int nCP, int* pPrior )
+{
+ *pPrior = nCP; // Default is the char itself
+
+ HRESULT hr = S_OK;
+ if( m_bAnalyseRequired )
+ hr = Analyse();
+ if( FAILED( hr ) )
+ return;
+
+ const SCRIPT_LOGATTR* pLogAttr = _ScriptString_pLogAttr( m_Analysis );
+ if( !pLogAttr )
+ return;
+
+ if( !_ScriptString_pcOutChars( m_Analysis ) )
+ return;
+ int nInitial = *_ScriptString_pcOutChars( m_Analysis );
+ if( nCP + 1 < nInitial )
+ nInitial = nCP + 1;
+
+ int i = nInitial;
+ int limit = *_ScriptString_pcOutChars( m_Analysis );
+ while( limit > 0 && i < limit - 1 )
+ {
+ if( pLogAttr[i].fWordStop ) // Either the fWordStop flag is set
+ {
+ *pPrior = i;
+ return;
+ }
+ else if( pLogAttr[i].fWhiteSpace && // Or this whitespace but the next char isn't.
+ !pLogAttr[i + 1].fWhiteSpace )
+ {
+ *pPrior = i + 1; // The next char is a word stop
+ return;
+ }
+
+ ++i;
+ limit = *_ScriptString_pcOutChars( m_Analysis );
+ }
+ // We have reached the end. It's always a word stop, so simply return it.
+ *pPrior = *_ScriptString_pcOutChars( m_Analysis ) - 1;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTEditBox::ResetCaretBlink()
+{
+ m_bCaretOn = true;
+ m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime();
+}
+
+
+//--------------------------------------------------------------------------------------
+void DXUTBlendColor::Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor, D3DCOLOR hiddenColor )
+{
+ for( int i = 0; i < MAX_CONTROL_STATES; i++ )
+ {
+ States[ i ] = defaultColor;
+ }
+
+ States[ DXUT_STATE_DISABLED ] = disabledColor;
+ States[ DXUT_STATE_HIDDEN ] = hiddenColor;
+ Current = hiddenColor;
+}
+
+
+//--------------------------------------------------------------------------------------
+void DXUTBlendColor::Blend( UINT iState, float fElapsedTime, float fRate )
+{
+ D3DXCOLOR destColor = States[ iState ];
+ D3DXColorLerp( &Current, &Current, &destColor, 1.0f - powf( fRate, 30 * fElapsedTime ) );
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTElement::SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor )
+{
+ this->iTexture = iTexture;
+
+ if( prcTexture )
+ rcTexture = *prcTexture;
+ else
+ SetRectEmpty( &rcTexture );
+
+ TextureColor.Init( defaultTextureColor );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTElement::SetFont( UINT iFont, D3DCOLOR defaultFontColor, DWORD dwTextFormat )
+{
+ this->iFont = iFont;
+ this->dwTextFormat = dwTextFormat;
+
+ FontColor.Init( defaultFontColor );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTElement::Refresh()
+{
+ TextureColor.Current = TextureColor.States[ DXUT_STATE_HIDDEN ];
+ FontColor.Current = FontColor.States[ DXUT_STATE_HIDDEN ];
+}
+
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTgui.h b/samples/DX_APIUsage/DXUT/Optional/DXUTgui.h
new file mode 100644
index 0000000..cae713c
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTgui.h
@@ -0,0 +1,1385 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTgui.h
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef DXUT_GUI_H
+#define DXUT_GUI_H
+
+#include <usp10.h>
+#include <dimm.h>
+#include <functional>
+
+//--------------------------------------------------------------------------------------
+// Defines and macros
+//--------------------------------------------------------------------------------------
+#define EVENT_BUTTON_CLICKED 0x0101
+#define EVENT_COMBOBOX_SELECTION_CHANGED 0x0201
+#define EVENT_RADIOBUTTON_CHANGED 0x0301
+#define EVENT_CHECKBOX_CHANGED 0x0401
+#define EVENT_SLIDER_VALUE_CHANGED 0x0501
+#define EVENT_SLIDER_VALUE_CHANGED_UP 0x0502
+
+#define EVENT_EDITBOX_STRING 0x0601
+// EVENT_EDITBOX_CHANGE is sent when the listbox content changes
+// due to user input.
+#define EVENT_EDITBOX_CHANGE 0x0602
+#define EVENT_LISTBOX_ITEM_DBLCLK 0x0701
+// EVENT_LISTBOX_SELECTION is fired off when the selection changes in
+// a single selection list box.
+#define EVENT_LISTBOX_SELECTION 0x0702
+#define EVENT_LISTBOX_SELECTION_END 0x0703
+
+
+//--------------------------------------------------------------------------------------
+// Forward declarations
+//--------------------------------------------------------------------------------------
+class CDXUTDialogResourceManager;
+class CDXUTControl;
+class CDXUTButton;
+class CDXUTStatic;
+class CDXUTCheckBox;
+class CDXUTRadioButton;
+class CDXUTComboBox;
+class CDXUTSlider;
+class CDXUTEditBox;
+class CDXUTListBox;
+class CDXUTScrollBar;
+class CDXUTElement;
+struct DXUTElementHolder;
+struct DXUTTextureNode;
+struct DXUTFontNode;
+typedef VOID ( CALLBACK*PCALLBACKDXUTGUIEVENT )( UINT nEvent, int nControlID, CDXUTControl* pControl,
+ void* pUserContext );
+
+
+//--------------------------------------------------------------------------------------
+// Enums for pre-defined control types
+//--------------------------------------------------------------------------------------
+enum DXUT_CONTROL_TYPE
+{
+ DXUT_CONTROL_BUTTON,
+ DXUT_CONTROL_STATIC,
+ DXUT_CONTROL_CHECKBOX,
+ DXUT_CONTROL_RADIOBUTTON,
+ DXUT_CONTROL_COMBOBOX,
+ DXUT_CONTROL_SLIDER,
+ DXUT_CONTROL_EDITBOX,
+ DXUT_CONTROL_IMEEDITBOX,
+ DXUT_CONTROL_LISTBOX,
+ DXUT_CONTROL_SCROLLBAR,
+};
+
+enum DXUT_CONTROL_STATE
+{
+ DXUT_STATE_NORMAL = 0,
+ DXUT_STATE_DISABLED,
+ DXUT_STATE_HIDDEN,
+ DXUT_STATE_FOCUS,
+ DXUT_STATE_MOUSEOVER,
+ DXUT_STATE_PRESSED,
+};
+
+#define MAX_CONTROL_STATES 6
+
+struct DXUTBlendColor
+{
+ void Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor = D3DCOLOR_ARGB( 200, 128, 128, 128 ),
+ D3DCOLOR hiddenColor = 0 );
+ void Blend( UINT iState, float fElapsedTime, float fRate = 0.7f );
+
+ D3DCOLOR States[ MAX_CONTROL_STATES ]; // Modulate colors for all possible control states
+ D3DXCOLOR Current;
+};
+
+
+//-----------------------------------------------------------------------------
+// Contains all the display tweakables for a sub-control
+//-----------------------------------------------------------------------------
+class CDXUTElement
+{
+public:
+ void SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor = D3DCOLOR_ARGB( 255, 255, 255,
+ 255 ) );
+ void SetFont( UINT iFont, D3DCOLOR defaultFontColor = D3DCOLOR_ARGB( 255, 255, 255,
+ 255 ), DWORD dwTextFormat = DT_CENTER |
+ DT_VCENTER );
+
+ void Refresh();
+
+ UINT iTexture; // Index of the texture for this Element
+ UINT iFont; // Index of the font for this Element
+ DWORD dwTextFormat; // The format argument to DrawText
+
+ RECT rcTexture; // Bounding rect of this element on the composite texture
+
+ DXUTBlendColor TextureColor;
+ DXUTBlendColor FontColor;
+};
+
+
+//-----------------------------------------------------------------------------
+// All controls must be assigned to a dialog, which handles
+// input and rendering for the controls.
+//-----------------------------------------------------------------------------
+class CDXUTDialog
+{
+ friend class CDXUTDialogResourceManager;
+
+public:
+ CDXUTDialog();
+ ~CDXUTDialog();
+
+ // Need to call this now
+ void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog = true );
+ void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog,
+ LPCWSTR pszControlTextureFilename );
+ void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog,
+ LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule );
+
+ // Windows message handler
+ bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ // Control creation
+ HRESULT AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false,
+ CDXUTStatic** ppCreated=NULL );
+ HRESULT AddButton(int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey = 0,
+ bool bIsDefault = false, CDXUTButton** ppCreated = NULL);
+ HRESULT AddButtonCallback(std::function<void()> cb, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey = 0,
+ bool bIsDefault = false, CDXUTButton** ppCreated = NULL);
+ HRESULT AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false,
+ UINT nHotkey=0, bool bIsDefault=false, CDXUTCheckBox** ppCreated=NULL );
+ HRESULT AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width,
+ int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false,
+ CDXUTRadioButton** ppCreated=NULL );
+ HRESULT AddComboBox( int ID, int x, int y, int width, int height, UINT nHotKey=0, bool bIsDefault=
+ false, CDXUTComboBox** ppCreated=NULL );
+ HRESULT AddSlider( int ID, int x, int y, int width, int height, int min=0, int max=100, int value=50,
+ bool bIsDefault=false, CDXUTSlider** ppCreated=NULL );
+ // AddIMEEditBox has been renamed into DXUTguiIME.cpp as CDXUTIMEEditBox::CreateIMEEditBox
+ HRESULT AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=
+ false, CDXUTEditBox** ppCreated=NULL );
+ HRESULT AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle=0,
+ CDXUTListBox** ppCreated=NULL );
+ HRESULT AddControl( CDXUTControl* pControl );
+ HRESULT InitControl( CDXUTControl* pControl );
+
+ // Control retrieval
+ CDXUTStatic* GetStatic( int ID )
+ {
+ return ( CDXUTStatic* )GetControl( ID, DXUT_CONTROL_STATIC );
+ }
+ CDXUTButton* GetButton( int ID )
+ {
+ return ( CDXUTButton* )GetControl( ID, DXUT_CONTROL_BUTTON );
+ }
+ CDXUTCheckBox* GetCheckBox( int ID )
+ {
+ return ( CDXUTCheckBox* )GetControl( ID, DXUT_CONTROL_CHECKBOX );
+ }
+ CDXUTRadioButton* GetRadioButton( int ID )
+ {
+ return ( CDXUTRadioButton* )GetControl( ID, DXUT_CONTROL_RADIOBUTTON );
+ }
+ CDXUTComboBox* GetComboBox( int ID )
+ {
+ return ( CDXUTComboBox* )GetControl( ID, DXUT_CONTROL_COMBOBOX );
+ }
+ CDXUTSlider* GetSlider( int ID )
+ {
+ return ( CDXUTSlider* )GetControl( ID, DXUT_CONTROL_SLIDER );
+ }
+ CDXUTEditBox* GetEditBox( int ID )
+ {
+ return ( CDXUTEditBox* )GetControl( ID, DXUT_CONTROL_EDITBOX );
+ }
+ CDXUTListBox* GetListBox( int ID )
+ {
+ return ( CDXUTListBox* )GetControl( ID, DXUT_CONTROL_LISTBOX );
+ }
+
+ CDXUTControl* GetControl( int ID );
+ CDXUTControl* GetControl( int ID, UINT nControlType );
+ CDXUTControl* GetControlAtPoint( POINT pt );
+
+ bool GetControlEnabled( int ID );
+ void SetControlEnabled( int ID, bool bEnabled );
+
+ void ClearRadioButtonGroup( UINT nGroup );
+ void ClearComboBox( int ID );
+
+ // Access the default display Elements used when adding new controls
+ HRESULT SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement );
+ CDXUTElement* GetDefaultElement( UINT nControlType, UINT iElement );
+
+ // Methods called by controls
+ void SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl );
+ void RequestFocus( CDXUTControl* pControl );
+
+ // Render helpers
+ HRESULT DrawRect( RECT* pRect, D3DCOLOR color );
+ HRESULT DrawRect9( RECT* pRect, D3DCOLOR color );
+ HRESULT DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color );
+ HRESULT DrawSprite( CDXUTElement* pElement, RECT* prcDest, float fDepth );
+ HRESULT DrawSprite9( CDXUTElement* pElement, RECT* prcDest );
+ HRESULT DrawSprite11( CDXUTElement* pElement, RECT* prcDest, float fDepth );
+ HRESULT CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount = -1 );
+ HRESULT DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false,
+ int nCount = -1, bool bCenter = false );
+ HRESULT DrawText9( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false,
+ int nCount = -1 );
+ HRESULT DrawText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext,
+ LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false,
+ int nCount = -1, bool bCenter = false );
+
+ // Attributes
+ bool GetVisible()
+ {
+ return m_bVisible;
+ }
+ void SetVisible( bool bVisible )
+ {
+ m_bVisible = bVisible;
+ }
+ bool GetMinimized()
+ {
+ return m_bMinimized;
+ }
+ void SetMinimized( bool bMinimized )
+ {
+ m_bMinimized = bMinimized;
+ }
+ void SetBackgroundColors( D3DCOLOR colorAllCorners )
+ {
+ SetBackgroundColors( colorAllCorners, colorAllCorners, colorAllCorners, colorAllCorners );
+ }
+ void SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft,
+ D3DCOLOR colorBottomRight );
+ void EnableCaption( bool bEnable )
+ {
+ m_bCaption = bEnable;
+ }
+ int GetCaptionHeight() const
+ {
+ return m_nCaptionHeight;
+ }
+ void SetCaptionHeight( int nHeight )
+ {
+ m_nCaptionHeight = nHeight;
+ }
+ void SetCaptionText( const WCHAR* pwszText )
+ {
+ wcscpy_s( m_wszCaption, sizeof( m_wszCaption ) / sizeof( m_wszCaption[0] ), pwszText );
+ }
+ void GetLocation( POINT& Pt ) const
+ {
+ Pt.x = m_x; Pt.y = m_y;
+ }
+ void SetLocation( int x, int y )
+ {
+ m_x = x; m_y = y;
+ }
+ void SetSize( int width, int height )
+ {
+ m_width = width; m_height = height;
+ }
+ int GetWidth()
+ {
+ return m_width;
+ }
+ int GetHeight()
+ {
+ return m_height;
+ }
+
+ static void WINAPI SetRefreshTime( float fTime )
+ {
+ s_fTimeRefresh = fTime;
+ }
+
+ static CDXUTControl* WINAPI GetNextControl( CDXUTControl* pControl );
+ static CDXUTControl* WINAPI GetPrevControl( CDXUTControl* pControl );
+
+ void RemoveControl( int ID );
+ void RemoveAllControls();
+
+ // Sets the callback used to notify the app of control events
+ void SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext = NULL );
+ void EnableNonUserEvents( bool bEnable )
+ {
+ m_bNonUserEvents = bEnable;
+ }
+ void EnableKeyboardInput( bool bEnable )
+ {
+ m_bKeyboardInput = bEnable;
+ }
+ void EnableMouseInput( bool bEnable )
+ {
+ m_bMouseInput = bEnable;
+ }
+ bool IsKeyboardInputEnabled() const
+ {
+ return m_bKeyboardInput;
+ }
+
+ // Device state notification
+ void Refresh();
+ HRESULT OnRender( float fElapsedTime );
+
+ // Shared resource access. Indexed fonts and textures are shared among
+ // all the controls.
+ HRESULT SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight );
+ DXUTFontNode* GetFont( UINT index );
+
+ HRESULT SetTexture( UINT index, LPCWSTR strFilename );
+ HRESULT SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule );
+ DXUTTextureNode* GetTexture( UINT index );
+
+ CDXUTDialogResourceManager* GetManager()
+ {
+ return m_pManager;
+ }
+
+ static void WINAPI ClearFocus();
+ void FocusDefaultControl();
+
+ bool m_bNonUserEvents;
+ bool m_bKeyboardInput;
+ bool m_bMouseInput;
+
+private:
+ int m_nDefaultControlID;
+
+ HRESULT OnRender9( float fElapsedTime );
+ HRESULT OnRender10( float fElapsedTime );
+ HRESULT OnRender11( float fElapsedTime );
+
+ static double s_fTimeRefresh;
+ double m_fTimeLastRefresh;
+
+ // Initialize default Elements
+ void InitDefaultElements();
+
+ // Windows message handlers
+ void OnMouseMove( POINT pt );
+ void OnMouseUp( POINT pt );
+
+ void SetNextDialog( CDXUTDialog* pNextDialog );
+
+ // Control events
+ bool OnCycleFocus( bool bForward );
+
+ static CDXUTControl* s_pControlFocus; // The control which has focus
+ static CDXUTControl* s_pControlPressed; // The control currently pressed
+
+ CDXUTControl* m_pControlMouseOver; // The control which is hovered over
+
+ bool m_bVisible;
+ bool m_bCaption;
+ bool m_bMinimized;
+ bool m_bDrag;
+ WCHAR m_wszCaption[256];
+
+ int m_x;
+ int m_y;
+ int m_width;
+ int m_height;
+ int m_nCaptionHeight;
+
+ D3DCOLOR m_colorTopLeft;
+ D3DCOLOR m_colorTopRight;
+ D3DCOLOR m_colorBottomLeft;
+ D3DCOLOR m_colorBottomRight;
+
+ CDXUTDialogResourceManager* m_pManager;
+ PCALLBACKDXUTGUIEVENT m_pCallbackEvent;
+ void* m_pCallbackEventUserContext;
+
+ CGrowableArray <int> m_Textures; // Index into m_TextureCache;
+ CGrowableArray <int> m_Fonts; // Index into m_FontCache;
+
+ CGrowableArray <CDXUTControl*> m_Controls;
+ CGrowableArray <DXUTElementHolder*> m_DefaultElements;
+
+ CDXUTElement m_CapElement; // Element for the caption
+
+ CDXUTDialog* m_pNextDialog;
+ CDXUTDialog* m_pPrevDialog;
+};
+
+
+//--------------------------------------------------------------------------------------
+// Structs for shared resources
+//--------------------------------------------------------------------------------------
+struct DXUTTextureNode
+{
+ bool bFileSource; // True if this texture is loaded from a file. False if from resource.
+ HMODULE hResourceModule;
+ int nResourceID; // Resource ID. If 0, string-based ID is used and stored in strFilename.
+ WCHAR strFilename[MAX_PATH];
+ DWORD dwWidth;
+ DWORD dwHeight;
+ IDirect3DTexture9* pTexture9;
+ ID3D11Texture2D* pTexture11;
+ ID3D11ShaderResourceView* pTexResView11;
+};
+
+struct DXUTFontNode
+{
+ WCHAR strFace[MAX_PATH];
+ LONG nHeight;
+ LONG nWeight;
+ ID3DXFont* pFont9;
+};
+
+struct DXUTSpriteVertex
+{
+ D3DXVECTOR3 vPos;
+ D3DXCOLOR vColor;
+ D3DXVECTOR2 vTex;
+};
+
+//-----------------------------------------------------------------------------
+// Manages shared resources of dialogs
+//-----------------------------------------------------------------------------
+class CDXUTDialogResourceManager
+{
+public:
+ CDXUTDialogResourceManager();
+ ~CDXUTDialogResourceManager();
+
+ bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ // D3D9 specific
+ HRESULT OnD3D9CreateDevice( LPDIRECT3DDEVICE9 pd3dDevice );
+ HRESULT OnD3D9ResetDevice();
+ void OnD3D9LostDevice();
+ void OnD3D9DestroyDevice();
+ IDirect3DDevice9* GetD3D9Device()
+ {
+ return m_pd3d9Device;
+ }
+
+ // D3D11 specific
+ HRESULT OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext );
+ HRESULT OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc );
+ void OnD3D11ReleasingSwapChain();
+ void OnD3D11DestroyDevice();
+ void StoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext );
+ void RestoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext );
+ void ApplyRenderUI11( ID3D11DeviceContext* pd3dImmediateContext );
+ void ApplyRenderUIUntex11( ID3D11DeviceContext* pd3dImmediateContext );
+ void BeginSprites11( );
+ void EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext );
+ ID3D11Device* GetD3D11Device()
+ {
+ return m_pd3d11Device;
+ }
+ ID3D11DeviceContext* GetD3D11DeviceContext()
+ {
+ return m_pd3d11DeviceContext;
+ }
+
+ DXUTFontNode* GetFontNode( int iIndex )
+ {
+ return m_FontCache.GetAt( iIndex );
+ };
+ DXUTTextureNode* GetTextureNode( int iIndex )
+ {
+ return m_TextureCache.GetAt( iIndex );
+ };
+
+ int AddFont( LPCWSTR strFaceName, LONG height, LONG weight );
+ int AddTexture( LPCWSTR strFilename );
+ int AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule );
+
+ bool RegisterDialog( CDXUTDialog* pDialog );
+ void UnregisterDialog( CDXUTDialog* pDialog );
+ void EnableKeyboardInputForAllDialogs();
+
+ // Shared between all dialogs
+
+ // D3D9
+ IDirect3DStateBlock9* m_pStateBlock;
+ ID3DXSprite* m_pSprite; // Sprite used for drawing
+
+ // D3D11
+ // Shaders
+ ID3D11VertexShader* m_pVSRenderUI11;
+ ID3D11PixelShader* m_pPSRenderUI11;
+ ID3D11PixelShader* m_pPSRenderUIUntex11;
+
+ // States
+ ID3D11DepthStencilState* m_pDepthStencilStateUI11;
+ ID3D11RasterizerState* m_pRasterizerStateUI11;
+ ID3D11BlendState* m_pBlendStateUI11;
+ ID3D11SamplerState* m_pSamplerStateUI11;
+
+ // Stored states
+ ID3D11DepthStencilState* m_pDepthStencilStateStored11;
+ UINT m_StencilRefStored11;
+ ID3D11RasterizerState* m_pRasterizerStateStored11;
+ ID3D11BlendState* m_pBlendStateStored11;
+ float m_BlendFactorStored11[4];
+ UINT m_SampleMaskStored11;
+ ID3D11SamplerState* m_pSamplerStateStored11;
+
+ ID3D11InputLayout* m_pInputLayout11;
+ ID3D11Buffer* m_pVBScreenQuad11;
+
+ // Sprite workaround
+ ID3D11Buffer* m_pSpriteBuffer11;
+ UINT m_SpriteBufferBytes11;
+ CGrowableArray<DXUTSpriteVertex> m_SpriteVertices;
+
+ UINT m_nBackBufferWidth;
+ UINT m_nBackBufferHeight;
+
+ CGrowableArray <CDXUTDialog*> m_Dialogs; // Dialogs registered
+
+protected:
+ // D3D9 specific
+ IDirect3DDevice9* m_pd3d9Device;
+ HRESULT CreateFont9( UINT index );
+ HRESULT CreateTexture9( UINT index );
+
+ // D3D11 specific
+ ID3D11Device* m_pd3d11Device;
+ ID3D11DeviceContext* m_pd3d11DeviceContext;
+ HRESULT CreateFont11( UINT index );
+ HRESULT CreateTexture11( UINT index );
+
+ CGrowableArray <DXUTTextureNode*> m_TextureCache; // Shared textures
+ CGrowableArray <DXUTFontNode*> m_FontCache; // Shared fonts
+};
+
+void BeginText11();
+void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext,
+ LPCWSTR strText, RECT rcScreen, D3DXCOLOR vFontColor,
+ float fBBWidth, float fBBHeight, bool bCenter );
+void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext );
+
+//-----------------------------------------------------------------------------
+// Base class for controls
+//-----------------------------------------------------------------------------
+class CDXUTControl
+{
+public:
+ CDXUTControl( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTControl();
+
+ virtual HRESULT OnInit()
+ {
+ return S_OK;
+ }
+ virtual void Refresh();
+ virtual void Render( float fElapsedTime )
+ {
+ };
+
+ // Windows message handler
+ virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
+ {
+ return false;
+ }
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
+ {
+ return false;
+ }
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+ {
+ return false;
+ }
+
+ virtual bool CanHaveFocus()
+ {
+ return false;
+ }
+ virtual void OnFocusIn()
+ {
+ m_bHasFocus = true;
+ }
+ virtual void OnFocusOut()
+ {
+ m_bHasFocus = false;
+ }
+ virtual void OnMouseEnter()
+ {
+ m_bMouseOver = true;
+ }
+ virtual void OnMouseLeave()
+ {
+ m_bMouseOver = false;
+ }
+ virtual void OnHotkey()
+ {
+ }
+
+ virtual BOOL ContainsPoint( POINT pt )
+ {
+ return PtInRect( &m_rcBoundingBox, pt );
+ }
+
+ virtual void SetEnabled( bool bEnabled )
+ {
+ m_bEnabled = bEnabled;
+ }
+ virtual bool GetEnabled()
+ {
+ return m_bEnabled;
+ }
+ virtual void SetVisible( bool bVisible )
+ {
+ m_bVisible = bVisible;
+ }
+ virtual bool GetVisible()
+ {
+ return m_bVisible;
+ }
+
+ UINT GetType() const
+ {
+ return m_Type;
+ }
+
+ int GetID() const
+ {
+ return m_ID;
+ }
+ void SetID( int ID )
+ {
+ m_ID = ID;
+ }
+
+ void SetLocation( int x, int y )
+ {
+ m_x = x; m_y = y; UpdateRects();
+ }
+ void SetSize( int width, int height )
+ {
+ m_width = width; m_height = height; UpdateRects();
+ }
+
+ void SetHotkey( UINT nHotkey )
+ {
+ m_nHotkey = nHotkey;
+ }
+ UINT GetHotkey()
+ {
+ return m_nHotkey;
+ }
+
+ void SetUserData( void* pUserData )
+ {
+ m_pUserData = pUserData;
+ }
+ void* GetUserData() const
+ {
+ return m_pUserData;
+ }
+
+ virtual void SetTextColor( D3DCOLOR Color );
+ CDXUTElement* GetElement( UINT iElement )
+ {
+ return m_Elements.GetAt( iElement );
+ }
+ HRESULT SetElement( UINT iElement, CDXUTElement* pElement );
+
+ bool m_bVisible; // Shown/hidden flag
+ bool m_bMouseOver; // Mouse pointer is above control
+ bool m_bHasFocus; // Control has input focus
+ bool m_bIsDefault; // Is the default control
+
+ // Size, scale, and positioning members
+ int m_x, m_y;
+ int m_width, m_height;
+
+ // These members are set by the container
+ CDXUTDialog* m_pDialog; // Parent container
+ UINT m_Index; // Index within the control list
+
+ CGrowableArray <CDXUTElement*> m_Elements; // All display elements
+
+protected:
+ virtual void UpdateRects();
+
+ int m_ID; // ID number
+ DXUT_CONTROL_TYPE m_Type; // Control type, set once in constructor
+ UINT m_nHotkey; // Virtual key code for this control's hotkey
+ void* m_pUserData; // Data associated with this control that is set by user.
+
+ bool m_bEnabled; // Enabled/disabled flag
+
+ RECT m_rcBoundingBox; // Rectangle defining the active region of the control
+};
+
+
+//-----------------------------------------------------------------------------
+// Contains all the display information for a given control type
+//-----------------------------------------------------------------------------
+struct DXUTElementHolder
+{
+ UINT nControlType;
+ UINT iElement;
+
+ CDXUTElement Element;
+};
+
+
+//-----------------------------------------------------------------------------
+// Static control
+//-----------------------------------------------------------------------------
+class CDXUTStatic : public CDXUTControl
+{
+public:
+ CDXUTStatic( CDXUTDialog* pDialog = NULL );
+
+ virtual void Render( float fElapsedTime );
+ virtual BOOL ContainsPoint( POINT pt )
+ {
+ return false;
+ }
+
+ HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest,
+ UINT bufferCount );
+ LPCWSTR GetText()
+ {
+ return m_strText;
+ }
+ HRESULT SetText( LPCWSTR strText );
+
+
+protected:
+ WCHAR m_strText[MAX_PATH]; // Window text
+};
+
+
+//-----------------------------------------------------------------------------
+// Button control
+//-----------------------------------------------------------------------------
+class CDXUTButton : public CDXUTStatic
+{
+public:
+ CDXUTButton( CDXUTDialog* pDialog = NULL );
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual void OnHotkey()
+ {
+ if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this );
+ m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );
+ }
+
+ virtual BOOL ContainsPoint( POINT pt )
+ {
+ return PtInRect( &m_rcBoundingBox, pt );
+ }
+ virtual bool CanHaveFocus()
+ {
+ return ( m_bVisible && m_bEnabled );
+ }
+
+ virtual void Render( float fElapsedTime );
+
+protected:
+ bool m_bPressed;
+};
+
+
+//-----------------------------------------------------------------------------
+// CheckBox control
+//-----------------------------------------------------------------------------
+class CDXUTCheckBox : public CDXUTButton
+{
+public:
+ CDXUTCheckBox( CDXUTDialog* pDialog = NULL );
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual void OnHotkey()
+ {
+ if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this );
+ SetCheckedInternal( !m_bChecked, true );
+ }
+
+ virtual BOOL ContainsPoint( POINT pt );
+ virtual void UpdateRects();
+
+ virtual void Render( float fElapsedTime );
+
+ bool GetChecked()
+ {
+ return m_bChecked;
+ }
+ void SetChecked( bool bChecked )
+ {
+ SetCheckedInternal( bChecked, false );
+ }
+
+protected:
+ virtual void SetCheckedInternal( bool bChecked, bool bFromInput );
+
+ bool m_bChecked;
+ RECT m_rcButton;
+ RECT m_rcText;
+};
+
+
+//-----------------------------------------------------------------------------
+// RadioButton control
+//-----------------------------------------------------------------------------
+class CDXUTRadioButton : public CDXUTCheckBox
+{
+public:
+ CDXUTRadioButton( CDXUTDialog* pDialog = NULL );
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual void OnHotkey()
+ {
+ if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this );
+ SetCheckedInternal( true, true, true );
+ }
+
+ void SetChecked( bool bChecked, bool bClearGroup=true )
+ {
+ SetCheckedInternal( bChecked, bClearGroup, false );
+ }
+ void SetButtonGroup( UINT nButtonGroup )
+ {
+ m_nButtonGroup = nButtonGroup;
+ }
+ UINT GetButtonGroup()
+ {
+ return m_nButtonGroup;
+ }
+
+protected:
+ virtual void SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput );
+ UINT m_nButtonGroup;
+};
+
+
+//-----------------------------------------------------------------------------
+// Scrollbar control
+//-----------------------------------------------------------------------------
+class CDXUTScrollBar : public CDXUTControl
+{
+public:
+ CDXUTScrollBar( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTScrollBar();
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ virtual void Render( float fElapsedTime );
+ virtual void UpdateRects();
+
+ void SetTrackRange( int nStart, int nEnd );
+ int GetTrackPos()
+ {
+ return m_nPosition;
+ }
+ void SetTrackPos( int nPosition )
+ {
+ m_nPosition = nPosition; Cap(); UpdateThumbRect();
+ }
+ int GetPageSize()
+ {
+ return m_nPageSize;
+ }
+ void SetPageSize( int nPageSize )
+ {
+ m_nPageSize = nPageSize; Cap(); UpdateThumbRect();
+ }
+
+ void Scroll( int nDelta ); // Scroll by nDelta items (plus or minus)
+ void ShowItem( int nIndex ); // Ensure that item nIndex is displayed, scroll if necessary
+
+protected:
+ // ARROWSTATE indicates the state of the arrow buttons.
+ // CLEAR No arrow is down.
+ // CLICKED_UP Up arrow is clicked.
+ // CLICKED_DOWN Down arrow is clicked.
+ // HELD_UP Up arrow is held down for sustained period.
+ // HELD_DOWN Down arrow is held down for sustained period.
+ enum ARROWSTATE
+ {
+ CLEAR,
+ CLICKED_UP,
+ CLICKED_DOWN,
+ HELD_UP,
+ HELD_DOWN
+ };
+
+ void UpdateThumbRect();
+ void Cap(); // Clips position at boundaries. Ensures it stays within legal range.
+
+ bool m_bShowThumb;
+ bool m_bDrag;
+ RECT m_rcUpButton;
+ RECT m_rcDownButton;
+ RECT m_rcTrack;
+ RECT m_rcThumb;
+ int m_nPosition; // Position of the first displayed item
+ int m_nPageSize; // How many items are displayable in one page
+ int m_nStart; // First item
+ int m_nEnd; // The index after the last item
+ POINT m_LastMouse;// Last mouse position
+ ARROWSTATE m_Arrow; // State of the arrows
+ double m_dArrowTS; // Timestamp of last arrow event.
+};
+
+
+//-----------------------------------------------------------------------------
+// ListBox control
+//-----------------------------------------------------------------------------
+struct DXUTListBoxItem
+{
+ WCHAR strText[256];
+ void* pData;
+
+ RECT rcActive;
+ bool bSelected;
+};
+
+class CDXUTListBox : public CDXUTControl
+{
+public:
+ CDXUTListBox( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTListBox();
+
+ virtual HRESULT OnInit()
+ {
+ return m_pDialog->InitControl( &m_ScrollBar );
+ }
+ virtual bool CanHaveFocus()
+ {
+ return ( m_bVisible && m_bEnabled );
+ }
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ virtual void Render( float fElapsedTime );
+ virtual void UpdateRects();
+
+ DWORD GetStyle() const
+ {
+ return m_dwStyle;
+ }
+ int GetSize() const
+ {
+ return m_Items.GetSize();
+ }
+ void SetStyle( DWORD dwStyle )
+ {
+ m_dwStyle = dwStyle;
+ }
+ int GetScrollBarWidth() const
+ {
+ return m_nSBWidth;
+ }
+ void SetScrollBarWidth( int nWidth )
+ {
+ m_nSBWidth = nWidth; UpdateRects();
+ }
+ void SetBorder( int nBorder, int nMargin )
+ {
+ m_nBorder = nBorder; m_nMargin = nMargin;
+ }
+ HRESULT AddItem( const WCHAR* wszText, void* pData );
+ HRESULT InsertItem( int nIndex, const WCHAR* wszText, void* pData );
+ void RemoveItem( int nIndex );
+ void RemoveAllItems();
+
+ DXUTListBoxItem* GetItem( int nIndex );
+ int GetSelectedIndex( int nPreviousSelected = -1 );
+ DXUTListBoxItem* GetSelectedItem( int nPreviousSelected = -1 )
+ {
+ return GetItem( GetSelectedIndex( nPreviousSelected ) );
+ }
+ void SelectItem( int nNewIndex );
+
+ enum STYLE
+ {
+ MULTISELECTION = 1
+ };
+
+protected:
+ RECT m_rcText; // Text rendering bound
+ RECT m_rcSelection; // Selection box bound
+ CDXUTScrollBar m_ScrollBar;
+ int m_nSBWidth;
+ int m_nBorder;
+ int m_nMargin;
+ int m_nTextHeight; // Height of a single line of text
+ DWORD m_dwStyle; // List box style
+ int m_nSelected; // Index of the selected item for single selection list box
+ int m_nSelStart; // Index of the item where selection starts (for handling multi-selection)
+ bool m_bDrag; // Whether the user is dragging the mouse to select
+
+ CGrowableArray <DXUTListBoxItem*> m_Items;
+};
+
+
+//-----------------------------------------------------------------------------
+// ComboBox control
+//-----------------------------------------------------------------------------
+struct DXUTComboBoxItem
+{
+ WCHAR strText[256];
+ void* pData;
+
+ RECT rcActive;
+ bool bVisible;
+};
+
+
+class CDXUTComboBox : public CDXUTButton
+{
+public:
+ CDXUTComboBox( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTComboBox();
+
+ virtual void SetTextColor( D3DCOLOR Color );
+ virtual HRESULT OnInit()
+ {
+ return m_pDialog->InitControl( &m_ScrollBar );
+ }
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual void OnHotkey();
+
+ virtual bool CanHaveFocus()
+ {
+ return ( m_bVisible && m_bEnabled );
+ }
+ virtual void OnFocusOut();
+ virtual void Render( float fElapsedTime );
+
+ virtual void UpdateRects();
+
+ HRESULT AddItem( const WCHAR* strText, void* pData );
+ void RemoveAllItems();
+ void RemoveItem( UINT index );
+ bool ContainsItem( const WCHAR* strText, UINT iStart=0 );
+ int FindItem( const WCHAR* strText, UINT iStart=0 );
+ void* GetItemData( const WCHAR* strText );
+ void* GetItemData( int nIndex );
+ void SetDropHeight( UINT nHeight )
+ {
+ m_nDropHeight = nHeight; UpdateRects();
+ }
+ int GetScrollBarWidth() const
+ {
+ return m_nSBWidth;
+ }
+ void SetScrollBarWidth( int nWidth )
+ {
+ m_nSBWidth = nWidth; UpdateRects();
+ }
+
+ int GetSelectedIndex() const
+ {
+ return m_iSelected;
+ }
+ void* GetSelectedData();
+ DXUTComboBoxItem* GetSelectedItem();
+
+ UINT GetNumItems()
+ {
+ return m_Items.GetSize();
+ }
+ DXUTComboBoxItem* GetItem( UINT index )
+ {
+ return m_Items.GetAt( index );
+ }
+
+ HRESULT SetSelectedByIndex( UINT index );
+ HRESULT SetSelectedByText( const WCHAR* strText );
+ HRESULT SetSelectedByData( void* pData );
+
+protected:
+ int m_iSelected;
+ int m_iFocused;
+ int m_nDropHeight;
+ CDXUTScrollBar m_ScrollBar;
+ int m_nSBWidth;
+
+ bool m_bOpened;
+
+ RECT m_rcText;
+ RECT m_rcButton;
+ RECT m_rcDropdown;
+ RECT m_rcDropdownText;
+
+
+ CGrowableArray <DXUTComboBoxItem*> m_Items;
+};
+
+
+//-----------------------------------------------------------------------------
+// Slider control
+//-----------------------------------------------------------------------------
+class CDXUTSlider : public CDXUTControl
+{
+public:
+ CDXUTSlider( CDXUTDialog* pDialog = NULL );
+
+ virtual BOOL ContainsPoint( POINT pt );
+ virtual bool CanHaveFocus()
+ {
+ return ( m_bVisible && m_bEnabled );
+ }
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+
+ virtual void UpdateRects();
+
+ virtual void Render( float fElapsedTime );
+
+ void SetValue( int nValue )
+ {
+ SetValueInternal( nValue, false );
+ }
+ int GetValue() const
+ {
+ return m_nValue;
+ };
+
+ void GetRange( int& nMin, int& nMax ) const
+ {
+ nMin = m_nMin; nMax = m_nMax;
+ }
+ void SetRange( int nMin, int nMax );
+
+protected:
+ void SetValueInternal( int nValue, bool bFromInput );
+ int ValueFromPos( int x );
+
+ int m_nValue;
+
+ int m_nMin;
+ int m_nMax;
+
+ int m_nDragX; // Mouse position at start of drag
+ int m_nDragOffset; // Drag offset from the center of the button
+ int m_nButtonX;
+
+ bool m_bPressed;
+ RECT m_rcButton;
+};
+
+
+//-----------------------------------------------------------------------------
+// CUniBuffer class for the edit control
+//-----------------------------------------------------------------------------
+class CUniBuffer
+{
+public:
+ CUniBuffer( int nInitialSize = 1 );
+ ~CUniBuffer();
+
+ static void WINAPI Initialize();
+ static void WINAPI Uninitialize();
+
+ int GetBufferSize()
+ {
+ return m_nBufferSize;
+ }
+ bool SetBufferSize( int nSize );
+ int GetTextSize()
+ {
+ return lstrlenW( m_pwszBuffer );
+ }
+ const WCHAR* GetBuffer()
+ {
+ return m_pwszBuffer;
+ }
+ const WCHAR& operator[]( int n ) const
+ {
+ return m_pwszBuffer[n];
+ }
+ WCHAR& operator[]( int n );
+ DXUTFontNode* GetFontNode()
+ {
+ return m_pFontNode;
+ }
+ void SetFontNode( DXUTFontNode* pFontNode )
+ {
+ m_pFontNode = pFontNode;
+ }
+ void Clear();
+
+ bool InsertChar( int nIndex, WCHAR wChar ); // Inserts the char at specified index. If nIndex == -1, insert to the end.
+ bool RemoveChar( int nIndex ); // Removes the char at specified index. If nIndex == -1, remove the last char.
+ bool InsertString( int nIndex, const WCHAR* pStr, int nCount = -1 ); // Inserts the first nCount characters of the string pStr at specified index. If nCount == -1, the entire string is inserted. If nIndex == -1, insert to the end.
+ bool SetText( LPCWSTR wszText );
+
+ // Uniscribe
+ HRESULT CPtoX( int nCP, BOOL bTrail, int* pX );
+ HRESULT XtoCP( int nX, int* pCP, int* pnTrail );
+ void GetPriorItemPos( int nCP, int* pPrior );
+ void GetNextItemPos( int nCP, int* pPrior );
+
+private:
+ HRESULT Analyse(); // Uniscribe -- Analyse() analyses the string in the buffer
+
+ WCHAR* m_pwszBuffer; // Buffer to hold text
+ int m_nBufferSize; // Size of the buffer allocated, in characters
+
+ // Uniscribe-specific
+ DXUTFontNode* m_pFontNode; // Font node for the font that this buffer uses
+ bool m_bAnalyseRequired; // True if the string has changed since last analysis.
+ SCRIPT_STRING_ANALYSIS m_Analysis; // Analysis for the current string
+
+private:
+ // Empty implementation of the Uniscribe API
+ static HRESULT WINAPI Dummy_ScriptApplyDigitSubstitution( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*,
+ SCRIPT_STATE* )
+ {
+ return E_NOTIMPL;
+ }
+ static HRESULT WINAPI Dummy_ScriptStringAnalyse( HDC, const void*, int, int, int, DWORD, int, SCRIPT_CONTROL*,
+ SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*,
+ SCRIPT_STRING_ANALYSIS* )
+ {
+ return E_NOTIMPL;
+ }
+ static HRESULT WINAPI Dummy_ScriptStringCPtoX( SCRIPT_STRING_ANALYSIS, int, BOOL, int* )
+ {
+ return E_NOTIMPL;
+ }
+ static HRESULT WINAPI Dummy_ScriptStringXtoCP( SCRIPT_STRING_ANALYSIS, int, int*, int* )
+ {
+ return E_NOTIMPL;
+ }
+ static HRESULT WINAPI Dummy_ScriptStringFree( SCRIPT_STRING_ANALYSIS* )
+ {
+ return E_NOTIMPL;
+ }
+ static const SCRIPT_LOGATTR* WINAPI Dummy_ScriptString_pLogAttr( SCRIPT_STRING_ANALYSIS )
+ {
+ return NULL;
+ }
+ static const int* WINAPI Dummy_ScriptString_pcOutChars( SCRIPT_STRING_ANALYSIS )
+ {
+ return NULL;
+ }
+
+ // Function pointers
+ static HRESULT( WINAPI* _ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*,
+ SCRIPT_CONTROL*, SCRIPT_STATE* );
+ static HRESULT( WINAPI* _ScriptStringAnalyse )( HDC, const void*, int, int, int, DWORD, int,
+ SCRIPT_CONTROL*, SCRIPT_STATE*, const int*,
+ SCRIPT_TABDEF*, const BYTE*,
+ SCRIPT_STRING_ANALYSIS* );
+ static HRESULT( WINAPI* _ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* );
+ static HRESULT( WINAPI* _ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* );
+ static HRESULT( WINAPI* _ScriptStringFree )( SCRIPT_STRING_ANALYSIS* );
+ static const SCRIPT_LOGATTR* ( WINAPI*_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS );
+ static const int* ( WINAPI*_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS );
+
+ static HINSTANCE s_hDll; // Uniscribe DLL handle
+
+};
+
+//-----------------------------------------------------------------------------
+// EditBox control
+//-----------------------------------------------------------------------------
+class CDXUTEditBox : public CDXUTControl
+{
+public:
+ CDXUTEditBox( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTEditBox();
+
+ virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual void UpdateRects();
+ virtual bool CanHaveFocus()
+ {
+ return ( m_bVisible && m_bEnabled );
+ }
+ virtual void Render( float fElapsedTime );
+ virtual void OnFocusIn();
+
+ void SetText( LPCWSTR wszText, bool bSelected = false );
+ LPCWSTR GetText()
+ {
+ return m_Buffer.GetBuffer();
+ }
+ int GetTextLength()
+ {
+ return m_Buffer.GetTextSize();
+ } // Returns text length in chars excluding NULL.
+ HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest,
+ UINT bufferCount );
+ void ClearText();
+ virtual void SetTextColor( D3DCOLOR Color )
+ {
+ m_TextColor = Color;
+ } // Text color
+ void SetSelectedTextColor( D3DCOLOR Color )
+ {
+ m_SelTextColor = Color;
+ } // Selected text color
+ void SetSelectedBackColor( D3DCOLOR Color )
+ {
+ m_SelBkColor = Color;
+ } // Selected background color
+ void SetCaretColor( D3DCOLOR Color )
+ {
+ m_CaretColor = Color;
+ } // Caret color
+ void SetBorderWidth( int nBorder )
+ {
+ m_nBorder = nBorder; UpdateRects();
+ } // Border of the window
+ void SetSpacing( int nSpacing )
+ {
+ m_nSpacing = nSpacing; UpdateRects();
+ }
+ void ParseFloatArray( float* pNumbers, int nCount );
+ void SetTextFloatArray( const float* pNumbers, int nCount );
+
+protected:
+ void PlaceCaret( int nCP );
+ void DeleteSelectionText();
+ void ResetCaretBlink();
+ void CopyToClipboard();
+ void PasteFromClipboard();
+
+ CUniBuffer m_Buffer; // Buffer to hold text
+ int m_nBorder; // Border of the window
+ int m_nSpacing; // Spacing between the text and the edge of border
+ RECT m_rcText; // Bounding rectangle for the text
+ RECT m_rcRender[9]; // Convenient rectangles for rendering elements
+ double m_dfBlink; // Caret blink time in milliseconds
+ double m_dfLastBlink; // Last timestamp of caret blink
+ bool m_bCaretOn; // Flag to indicate whether caret is currently visible
+ int m_nCaret; // Caret position, in characters
+ bool m_bInsertMode; // If true, control is in insert mode. Else, overwrite mode.
+ int m_nSelStart; // Starting position of the selection. The caret marks the end.
+ int m_nFirstVisible;// First visible character in the edit control
+ D3DCOLOR m_TextColor; // Text color
+ D3DCOLOR m_SelTextColor; // Selected text color
+ D3DCOLOR m_SelBkColor; // Selected background color
+ D3DCOLOR m_CaretColor; // Caret color
+
+ // Mouse-specific
+ bool m_bMouseDrag; // True to indicate drag in progress
+
+ // Static
+ static bool s_bHideCaret; // If true, we don't render the caret.
+};
+
+
+
+
+#endif // DXUT_GUI_H
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.cpp b/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.cpp
new file mode 100644
index 0000000..4bb0596
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.cpp
@@ -0,0 +1,990 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTguiIME.cpp
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#include "DXUT.h"
+#include "DXUTgui.h"
+#include "DXUTsettingsDlg.h"
+#include "DXUTres.h"
+#include "DXUTgui.h"
+#include "DXUTguiIME.h"
+
+#undef min // use __min instead
+#undef max // use __max instead
+#define DXUT_NEAR_BUTTON_DEPTH 0.6f
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTIMEEditBox class
+//--------------------------------------------------------------------------------------
+// IME constants
+
+POINT CDXUTIMEEditBox::s_ptCompString; // Composition string position. Updated every frame.
+int CDXUTIMEEditBox::s_nFirstTargetConv; // Index of the first target converted char in comp string. If none, -1.
+CUniBuffer CDXUTIMEEditBox::s_CompString = CUniBuffer( 0 );
+DWORD CDXUTIMEEditBox::s_adwCompStringClause[MAX_COMPSTRING_SIZE];
+WCHAR CDXUTIMEEditBox::s_wszReadingString[32];
+CDXUTIMEEditBox::CCandList CDXUTIMEEditBox::s_CandList; // Data relevant to the candidate list
+bool CDXUTIMEEditBox::s_bImeFlag = true;
+
+
+#if defined(DEBUG) || defined(_DEBUG)
+bool CDXUTIMEEditBox::m_bIMEStaticMsgProcCalled = false;
+#endif
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTIMEEditBox::CreateIMEEditBox( CDXUTDialog* pDialog, int ID, LPCWSTR strText, int x, int y, int width,
+ int height, bool bIsDefault, CDXUTIMEEditBox** ppCreated )
+{
+ CDXUTIMEEditBox* pEditBox = new CDXUTIMEEditBox( pDialog );
+
+ if( ppCreated != NULL )
+ *ppCreated = pEditBox;
+
+ if( pEditBox == NULL )
+ return E_OUTOFMEMORY;
+
+ // Set the ID and position
+ pEditBox->SetID( ID );
+ pEditBox->SetLocation( x, y );
+ pEditBox->SetSize( width, height );
+ pEditBox->m_bIsDefault = bIsDefault;
+
+ if( strText )
+ pEditBox->SetText( strText );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::InitDefaultElements( CDXUTDialog* pDialog )
+{
+ //-------------------------------------
+ // CDXUTIMEEditBox
+ //-------------------------------------
+
+ CDXUTElement Element;
+ RECT rcTexture;
+
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP );
+
+ // Assign the style
+ SetRect( &rcTexture, 14, 90, 241, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 0, &Element );
+ SetRect( &rcTexture, 8, 82, 14, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 1, &Element );
+ SetRect( &rcTexture, 14, 82, 241, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 2, &Element );
+ SetRect( &rcTexture, 241, 82, 246, 90 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 3, &Element );
+ SetRect( &rcTexture, 8, 90, 14, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 4, &Element );
+ SetRect( &rcTexture, 241, 90, 246, 113 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 5, &Element );
+ SetRect( &rcTexture, 8, 113, 14, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 6, &Element );
+ SetRect( &rcTexture, 14, 113, 241, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 7, &Element );
+ SetRect( &rcTexture, 241, 113, 246, 121 );
+ Element.SetTexture( 0, &rcTexture );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 8, &Element );
+ // Element 9 for IME text, and indicator button
+ SetRect( &rcTexture, 0, 0, 136, 54 );
+ Element.SetTexture( 0, &rcTexture );
+ Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_CENTER | DT_VCENTER );
+ pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 9, &Element );
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTIMEEditBox::CDXUTIMEEditBox( CDXUTDialog* pDialog )
+{
+ m_Type = DXUT_CONTROL_IMEEDITBOX;
+ m_pDialog = pDialog;
+
+ m_nIndicatorWidth = 0;
+ m_ReadingColor = D3DCOLOR_ARGB( 188, 255, 255, 255 );
+ m_ReadingWinColor = D3DCOLOR_ARGB( 128, 0, 0, 0 );
+ m_ReadingSelColor = D3DCOLOR_ARGB( 255, 255, 0, 0 );
+ m_ReadingSelBkColor = D3DCOLOR_ARGB( 128, 80, 80, 80 );
+ m_CandidateColor = D3DCOLOR_ARGB( 255, 200, 200, 200 );
+ m_CandidateWinColor = D3DCOLOR_ARGB( 128, 0, 0, 0 );
+ m_CandidateSelColor = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_CandidateSelBkColor = D3DCOLOR_ARGB( 128, 158, 158, 158 );
+ m_CompColor = D3DCOLOR_ARGB( 255, 200, 200, 255 );
+ m_CompWinColor = D3DCOLOR_ARGB( 198, 0, 0, 0 );
+ m_CompCaretColor = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_CompTargetColor = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_CompTargetBkColor = D3DCOLOR_ARGB( 255, 150, 150, 150 );
+ m_CompTargetNonColor = D3DCOLOR_ARGB( 255, 255, 255, 0 );
+ m_CompTargetNonBkColor = D3DCOLOR_ARGB( 255, 150, 150, 150 );
+ m_IndicatorImeColor = D3DCOLOR_ARGB( 255, 255, 255, 255 );
+ m_IndicatorEngColor = D3DCOLOR_ARGB( 255, 0, 0, 0 );
+ m_IndicatorBkColor = D3DCOLOR_ARGB( 255, 128, 128, 128 );
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTIMEEditBox::~CDXUTIMEEditBox()
+{
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::SendKey( BYTE nVirtKey )
+{
+ keybd_event( nVirtKey, 0, 0, 0 );
+ keybd_event( nVirtKey, 0, KEYEVENTF_KEYUP, 0 );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::UpdateRects()
+{
+ // Temporary adjust m_width so that CDXUTEditBox can compute
+ // the correct rects for its rendering since we need to make space
+ // for the indicator button
+ int nWidth = m_width;
+ m_width -= m_nIndicatorWidth + m_nBorder * 2; // Make room for the indicator button
+ CDXUTEditBox::UpdateRects();
+ m_width = nWidth; // Restore
+
+ // Compute the indicator button rectangle
+ SetRect( &m_rcIndicator, m_rcBoundingBox.right, m_rcBoundingBox.top, m_x + m_width, m_rcBoundingBox.bottom );
+ // InflateRect( &m_rcIndicator, -m_nBorder, -m_nBorder );
+ m_rcBoundingBox.right = m_rcBoundingBox.left + m_width;
+}
+
+
+//--------------------------------------------------------------------------------------
+// GetImeId( UINT uIndex )
+// returns
+// returned value:
+// 0: In the following cases
+// - Non Chinese IME input locale
+// - Older Chinese IME
+// - Other error cases
+//
+// Othewise:
+// When uIndex is 0 (default)
+// bit 31-24: Major version
+// bit 23-16: Minor version
+// bit 15-0: Language ID
+// When uIndex is 1
+// pVerFixedInfo->dwFileVersionLS
+//
+// Use IMEID_VER and IMEID_LANG macro to extract version and language information.
+//
+
+// We define the locale-invariant ID ourselves since it doesn't exist prior to WinXP
+// For more information, see the CompareString() reference.
+#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
+//--------------------------------------------------------------------------------------
+// Enable/disable the entire IME system. When disabled, the default IME handling
+// kicks in.
+void CDXUTIMEEditBox::EnableImeSystem( bool bEnable )
+{
+ ImeUi_EnableIme( bEnable );
+}
+
+
+//--------------------------------------------------------------------------------------
+// Resets the composition string.
+void CDXUTIMEEditBox::ResetCompositionString()
+{
+ s_CompString.SetText( L"" );
+}
+
+
+//--------------------------------------------------------------------------------------
+// This function is used only briefly in CHT IME handling,
+// so accelerator isn't processed.
+void CDXUTIMEEditBox::PumpMessage()
+{
+ MSG msg;
+
+ while( PeekMessageW( &msg, NULL, 0, 0, PM_NOREMOVE ) )
+ {
+ if( !GetMessageW( &msg, NULL, 0, 0 ) )
+ {
+ PostQuitMessage( ( int )msg.wParam );
+ return;
+ }
+ TranslateMessage( &msg );
+ DispatchMessageA( &msg );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::OnFocusIn()
+{
+ ImeUi_EnableIme( s_bImeFlag );
+ CDXUTEditBox::OnFocusIn();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::OnFocusOut()
+{
+ ImeUi_FinalizeString();
+ ImeUi_EnableIme( false );
+ CDXUTEditBox::OnFocusOut();
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTIMEEditBox::StaticMsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+
+ if( !ImeUi_IsEnabled() )
+ return false;
+
+#if defined(DEBUG) || defined(_DEBUG)
+ m_bIMEStaticMsgProcCalled = true;
+#endif
+
+ switch( uMsg )
+ {
+ case WM_INPUTLANGCHANGE:
+ DXUTTRACE( L"WM_INPUTLANGCHANGE\n" );
+ {
+ }
+ return true;
+
+ case WM_IME_SETCONTEXT:
+ DXUTTRACE( L"WM_IME_SETCONTEXT\n" );
+ //
+ // We don't want anything to display, so we have to clear this
+ //
+ lParam = 0;
+ return false;
+
+ // Handle WM_IME_STARTCOMPOSITION here since
+ // we do not want the default IME handler to see
+ // this when our fullscreen app is running.
+ case WM_IME_STARTCOMPOSITION:
+ DXUTTRACE( L"WM_IME_STARTCOMPOSITION\n" );
+ ResetCompositionString();
+ // Since the composition string has its own caret, we don't render
+ // the edit control's own caret to avoid double carets on screen.
+ s_bHideCaret = true;
+ return true;
+ case WM_IME_ENDCOMPOSITION:
+ DXUTTRACE( L"WM_IME_ENDCOMPOSITION\n" );
+ s_bHideCaret = false;
+ return false;
+ case WM_IME_COMPOSITION:
+ DXUTTRACE( L"WM_IME_COMPOSITION\n" );
+ return false;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTIMEEditBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ {
+ DXUTFontNode* pFont = m_pDialog->GetFont( m_Elements.GetAt( 9 )->iFont );
+
+ // Check if this click is on top of the composition string
+ int nCompStrWidth;
+ s_CompString.CPtoX( s_CompString.GetTextSize(), FALSE, &nCompStrWidth );
+
+ if( s_ptCompString.x <= pt.x &&
+ s_ptCompString.y <= pt.y &&
+ s_ptCompString.x + nCompStrWidth > pt.x &&
+ s_ptCompString.y + pFont->nHeight > pt.y )
+ {
+ int nCharBodyHit, nCharHit;
+ int nTrail;
+
+ // Determine the character clicked on.
+ s_CompString.XtoCP( pt.x - s_ptCompString.x, &nCharBodyHit, &nTrail );
+ if( nTrail && nCharBodyHit < s_CompString.GetTextSize() )
+ nCharHit = nCharBodyHit + 1;
+ else
+ nCharHit = nCharBodyHit;
+
+
+ switch( GetPrimaryLanguage() )
+ {
+ case LANG_JAPANESE:
+ // For Japanese, there are two cases. If s_nFirstTargetConv is
+ // -1, the comp string hasn't been converted yet, and we use
+ // s_nCompCaret. For any other value of s_nFirstTargetConv,
+ // the string has been converted, so we use clause information.
+
+ if( s_nFirstTargetConv != -1 )
+ {
+ int nClauseClicked = 0;
+ while( ( int )s_adwCompStringClause[nClauseClicked + 1] <= nCharBodyHit )
+ ++nClauseClicked;
+
+ int nClauseSelected = 0;
+ while( ( int )s_adwCompStringClause[nClauseSelected + 1] <= s_nFirstTargetConv )
+ ++nClauseSelected;
+
+ BYTE nVirtKey = nClauseClicked > nClauseSelected ? VK_RIGHT : VK_LEFT;
+ int nSendCount = abs( nClauseClicked - nClauseSelected );
+ while( nSendCount-- > 0 )
+ SendKey( nVirtKey );
+
+ return true;
+ }
+
+ // Not converted case. Fall thru to Chinese case.
+
+ case LANG_CHINESE:
+ {
+ // For Chinese, use s_nCompCaret.
+ BYTE nVirtKey = nCharHit > ( int )ImeUi_GetImeCursorChars() ? VK_RIGHT : VK_LEFT;
+ int nSendCount = abs( nCharHit - ( int )ImeUi_GetImeCursorChars() );
+ while( nSendCount-- > 0 )
+ SendKey( nVirtKey );
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ // Check if the click is on top of the candidate window
+ if( ImeUi_IsShowCandListWindow() && PtInRect( &s_CandList.rcCandidate, pt ) )
+ {
+ if( ImeUi_IsVerticalCand() )
+ {
+ // Vertical candidate window
+
+ // Compute the row the click is on
+ int nRow = ( pt.y - s_CandList.rcCandidate.top ) / pFont->nHeight;
+
+ if( nRow < ( int )ImeUi_GetCandidateCount() )
+ {
+ // nRow is a valid entry.
+ // Now emulate keystrokes to select the candidate at this row.
+ switch( GetPrimaryLanguage() )
+ {
+ case LANG_CHINESE:
+ case LANG_KOREAN:
+ // For Chinese and Korean, simply send the number keystroke.
+ SendKey( ( BYTE )( '0' + nRow + 1 ) );
+ break;
+
+ case LANG_JAPANESE:
+ // For Japanese, move the selection to the target row,
+ // then send Right, then send Left.
+
+ BYTE nVirtKey;
+ if( nRow > ( int )ImeUi_GetCandidateSelection() )
+ nVirtKey = VK_DOWN;
+ else
+ nVirtKey = VK_UP;
+ int nNumToHit = abs( int( nRow - ImeUi_GetCandidateSelection() ) );
+ for( int nStrike = 0; nStrike < nNumToHit; ++nStrike )
+ SendKey( nVirtKey );
+
+ // Do this to close the candidate window without ending composition.
+ SendKey( VK_RIGHT );
+ SendKey( VK_LEFT );
+
+ break;
+ }
+ }
+ }
+ else
+ {
+ // Horizontal candidate window
+
+ // Determine which the character the click has hit.
+ int nCharHit;
+ int nTrail;
+ s_CandList.HoriCand.XtoCP( pt.x - s_CandList.rcCandidate.left, &nCharHit, &nTrail );
+
+ // Determine which candidate string the character belongs to.
+ int nCandidate = ImeUi_GetCandidateCount() - 1;
+
+ int nEntryStart = 0;
+ for( UINT i = 0; i < ImeUi_GetCandidateCount(); ++i )
+ {
+ if( nCharHit >= nEntryStart )
+ {
+ // Haven't found it.
+ nEntryStart += lstrlenW( ImeUi_GetCandidate( i ) ) + 1; // plus space separator
+ }
+ else
+ {
+ // Found it. This entry starts at the right side of the click point,
+ // so the char belongs to the previous entry.
+ nCandidate = i - 1;
+ break;
+ }
+ }
+
+ // Now emulate keystrokes to select the candidate entry.
+ switch( GetPrimaryLanguage() )
+ {
+ case LANG_CHINESE:
+ case LANG_KOREAN:
+ // For Chinese and Korean, simply send the number keystroke.
+ SendKey( ( BYTE )( '0' + nCandidate + 1 ) );
+ break;
+ }
+ }
+
+ return true;
+ }
+ }
+ }
+
+ // If we didn't care for the msg, let the parent process it.
+ return CDXUTEditBox::HandleMouse( uMsg, pt, wParam, lParam );
+}
+
+
+//--------------------------------------------------------------------------------------
+bool CDXUTIMEEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ if( !m_bEnabled || !m_bVisible )
+ return false;
+
+#if defined(DEBUG) || defined(_DEBUG)
+ // DXUT.cpp used to call CDXUTIMEEditBox::StaticMsgProc() so that, but now
+ // this is the application's responsiblity. To do this, call
+ // CDXUTDialogResourceManager::MsgProc() before calling this function.
+ assert( m_bIMEStaticMsgProcCalled && L"To fix, call CDXUTDialogResourceManager::MsgProc() first" );
+#endif
+ switch( uMsg )
+ {
+ case WM_DESTROY:
+ ImeUi_Uninitialize();
+ break;
+ }
+
+ bool trappedData;
+ bool* trapped = &trappedData;
+
+ *trapped = false;
+ if( !ImeUi_IsEnabled() )
+ return CDXUTEditBox::MsgProc( uMsg, wParam, lParam );
+
+ ImeUi_ProcessMessage( DXUTGetHWND(), uMsg, wParam, lParam, trapped );
+ if( *trapped == false )
+ CDXUTEditBox::MsgProc( uMsg, wParam, lParam );
+
+ return *trapped;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::RenderCandidateReadingWindow( float fElapsedTime, bool bReading )
+{
+ RECT rc;
+ UINT nNumEntries = bReading ? 4 : MAX_CANDLIST;
+ D3DCOLOR TextColor, TextBkColor, SelTextColor, SelBkColor;
+ int nX, nXFirst, nXComp;
+ m_Buffer.CPtoX( m_nCaret, FALSE, &nX );
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst );
+
+ if( bReading )
+ {
+ TextColor = m_ReadingColor;
+ TextBkColor = m_ReadingWinColor;
+ SelTextColor = m_ReadingSelColor;
+ SelBkColor = m_ReadingSelBkColor;
+ }
+ else
+ {
+ TextColor = m_CandidateColor;
+ TextBkColor = m_CandidateWinColor;
+ SelTextColor = m_CandidateSelColor;
+ SelBkColor = m_CandidateSelBkColor;
+ }
+
+ // For Japanese IME, align the window with the first target converted character.
+ // For all other IMEs, align with the caret. This is because the caret
+ // does not move for Japanese IME.
+ if( GetLanguage() == MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL ) && !GetImeId() )
+ nXComp = 0;
+ else if( GetPrimaryLanguage() == LANG_JAPANESE )
+ s_CompString.CPtoX( s_nFirstTargetConv, FALSE, &nXComp );
+ else
+ s_CompString.CPtoX( ImeUi_GetImeCursorChars(), FALSE, &nXComp );
+
+ // Compute the size of the candidate window
+ int nWidthRequired = 0;
+ int nHeightRequired = 0;
+ int nSingleLineHeight = 0;
+
+ if( ( ImeUi_IsVerticalCand() && !bReading ) ||
+ ( !ImeUi_IsHorizontalReading() && bReading ) )
+ {
+ // Vertical window
+ for( UINT i = 0; i < nNumEntries; ++i )
+ {
+ if( *( ImeUi_GetCandidate( i ) ) == L'\0' )
+ break;
+ SetRect( &rc, 0, 0, 0, 0 );
+ m_pDialog->CalcTextRect( ImeUi_GetCandidate( i ), m_Elements.GetAt( 1 ), &rc );
+ nWidthRequired = __max( nWidthRequired, rc.right - rc.left );
+ nSingleLineHeight = __max( nSingleLineHeight, rc.bottom - rc.top );
+ }
+ nHeightRequired = nSingleLineHeight * nNumEntries;
+ }
+ else
+ {
+ // Horizontal window
+ SetRect( &rc, 0, 0, 0, 0 );
+ if( bReading )
+ m_pDialog->CalcTextRect( s_wszReadingString, m_Elements.GetAt( 1 ), &rc );
+ else
+ {
+
+ WCHAR wszCand[256] = L"";
+
+ s_CandList.nFirstSelected = 0;
+ s_CandList.nHoriSelectedLen = 0;
+ for( UINT i = 0; i < MAX_CANDLIST; ++i )
+ {
+ if( *ImeUi_GetCandidate( i ) == L'\0' )
+ break;
+
+ WCHAR wszEntry[32];
+ swprintf_s( wszEntry, 32, L"%s ", ImeUi_GetCandidate( i ) );
+ // If this is the selected entry, mark its char position.
+ if( ImeUi_GetCandidateSelection() == i )
+ {
+ s_CandList.nFirstSelected = lstrlen( wszCand );
+ s_CandList.nHoriSelectedLen = lstrlen( wszEntry ) - 1; // Minus space
+ }
+ wcscat_s( wszCand, 256, wszEntry );
+ }
+ wszCand[lstrlen( wszCand ) - 1] = L'\0'; // Remove the last space
+ s_CandList.HoriCand.SetText( wszCand );
+
+ m_pDialog->CalcTextRect( s_CandList.HoriCand.GetBuffer(), m_Elements.GetAt( 1 ), &rc );
+ }
+ nWidthRequired = rc.right - rc.left;
+ nSingleLineHeight = nHeightRequired = rc.bottom - rc.top;
+ }
+
+ // Now that we have the dimension, calculate the location for the candidate window.
+ // We attempt to fit the window in this order:
+ // bottom, top, right, left.
+
+ bool bHasPosition = false;
+
+ // Bottom
+ SetRect( &rc, s_ptCompString.x + nXComp, s_ptCompString.y + m_rcText.bottom - m_rcText.top,
+ s_ptCompString.x + nXComp + nWidthRequired, s_ptCompString.y + m_rcText.bottom - m_rcText.top +
+ nHeightRequired );
+ // if the right edge is cut off, move it left.
+ if( rc.right > m_pDialog->GetWidth() )
+ {
+ rc.left -= rc.right - m_pDialog->GetWidth();
+ rc.right = m_pDialog->GetWidth();
+ }
+ if( rc.bottom <= m_pDialog->GetHeight() )
+ bHasPosition = true;
+
+ // Top
+ if( !bHasPosition )
+ {
+ SetRect( &rc, s_ptCompString.x + nXComp, s_ptCompString.y - nHeightRequired,
+ s_ptCompString.x + nXComp + nWidthRequired, s_ptCompString.y );
+ // if the right edge is cut off, move it left.
+ if( rc.right > m_pDialog->GetWidth() )
+ {
+ rc.left -= rc.right - m_pDialog->GetWidth();
+ rc.right = m_pDialog->GetWidth();
+ }
+ if( rc.top >= 0 )
+ bHasPosition = true;
+ }
+
+ // Right
+ if( !bHasPosition )
+ {
+ int nXCompTrail;
+ s_CompString.CPtoX( ImeUi_GetImeCursorChars(), TRUE, &nXCompTrail );
+ SetRect( &rc, s_ptCompString.x + nXCompTrail, 0,
+ s_ptCompString.x + nXCompTrail + nWidthRequired, nHeightRequired );
+ if( rc.right <= m_pDialog->GetWidth() )
+ bHasPosition = true;
+ }
+
+ // Left
+ if( !bHasPosition )
+ {
+ SetRect( &rc, s_ptCompString.x + nXComp - nWidthRequired, 0,
+ s_ptCompString.x + nXComp, nHeightRequired );
+ if( rc.right >= 0 )
+ bHasPosition = true;
+ }
+
+ if( !bHasPosition )
+ {
+ // The dialog is too small for the candidate window.
+ // Fall back to render at 0, 0. Some part of the window
+ // will be cut off.
+ rc.left = 0;
+ rc.right = nWidthRequired;
+ }
+
+ // If we are rendering the candidate window, save the position
+ // so that mouse clicks are checked properly.
+ if( !bReading )
+ s_CandList.rcCandidate = rc;
+
+ // Render the elements
+ m_pDialog->DrawRect( &rc, TextBkColor );
+ if( ( ImeUi_IsVerticalCand() && !bReading ) ||
+ ( !ImeUi_IsHorizontalReading() && bReading ) )
+ {
+ // Vertical candidate window
+ for( UINT i = 0; i < nNumEntries; ++i )
+ {
+ // Here we are rendering one line at a time
+ rc.bottom = rc.top + nSingleLineHeight;
+ // Use a different color for the selected string
+ if( ImeUi_GetCandidateSelection() == i )
+ {
+ m_pDialog->DrawRect( &rc, SelBkColor );
+ m_Elements.GetAt( 1 )->FontColor.Current = SelTextColor;
+ }
+ else
+ m_Elements.GetAt( 1 )->FontColor.Current = TextColor;
+
+ m_pDialog->DrawText( ImeUi_GetCandidate( i ), m_Elements.GetAt( 1 ), &rc );
+
+ rc.top += nSingleLineHeight;
+ }
+ }
+ else
+ {
+ // Horizontal candidate window
+ m_Elements.GetAt( 1 )->FontColor.Current = TextColor;
+ if( bReading )
+ m_pDialog->DrawText( s_wszReadingString, m_Elements.GetAt( 1 ), &rc );
+ else
+ m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer(), m_Elements.GetAt( 1 ), &rc );
+
+ // Render the selected entry differently
+ if( !bReading )
+ {
+ int nXLeft, nXRight;
+ s_CandList.HoriCand.CPtoX( s_CandList.nFirstSelected, FALSE, &nXLeft );
+ s_CandList.HoriCand.CPtoX( s_CandList.nFirstSelected + s_CandList.nHoriSelectedLen, FALSE, &nXRight );
+
+ rc.right = rc.left + nXRight;
+ rc.left += nXLeft;
+ m_pDialog->DrawRect( &rc, SelBkColor );
+ m_Elements.GetAt( 1 )->FontColor.Current = SelTextColor;
+ m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer() + s_CandList.nFirstSelected,
+ m_Elements.GetAt( 1 ), &rc, false, s_CandList.nHoriSelectedLen );
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::RenderComposition( float fElapsedTime )
+{
+
+ s_CompString.SetText( ImeUi_GetCompositionString() );
+
+ RECT rcCaret =
+ {
+ 0, 0, 0, 0
+ };
+ int nX, nXFirst;
+ m_Buffer.CPtoX( m_nCaret, FALSE, &nX );
+ m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst );
+ CDXUTElement* pElement = m_Elements.GetAt( 1 );
+
+ // Get the required width
+ RECT rc =
+ {
+ m_rcText.left + nX - nXFirst, m_rcText.top,
+ m_rcText.left + nX - nXFirst, m_rcText.bottom
+ };
+ m_pDialog->CalcTextRect( s_CompString.GetBuffer(), pElement, &rc );
+
+ // If the composition string is too long to fit within
+ // the text area, move it to below the current line.
+ // This matches the behavior of the default IME.
+ if( rc.right > m_rcText.right )
+ OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top );
+
+ // Save the rectangle position for processing highlighted text.
+ RECT rcFirst = rc;
+
+ // Update s_ptCompString for RenderCandidateReadingWindow().
+ s_ptCompString.x = rc.left; s_ptCompString.y = rc.top;
+
+
+ D3DCOLOR TextColor = m_CompColor;
+ // Render the window and string.
+ // If the string is too long, we must wrap the line.
+ pElement->FontColor.Current = TextColor;
+ const WCHAR* pwszComp = s_CompString.GetBuffer();
+ int nCharLeft = s_CompString.GetTextSize();
+ for(; ; )
+ {
+ // Find the last character that can be drawn on the same line.
+ int nLastInLine;
+ int bTrail;
+ s_CompString.XtoCP( m_rcText.right - rc.left, &nLastInLine, &bTrail );
+ int nNumCharToDraw = __min( nCharLeft, nLastInLine );
+ m_pDialog->CalcTextRect( pwszComp, pElement, &rc, nNumCharToDraw );
+
+ // Draw the background
+ // For Korean IME, blink the composition window background as if it
+ // is a cursor.
+ if( GetPrimaryLanguage() == LANG_KOREAN )
+ {
+ if( m_bCaretOn )
+ {
+ m_pDialog->DrawRect( &rc, m_CompWinColor );
+ }
+ else
+ {
+ // Not drawing composition string background. We
+ // use the editbox's text color for composition
+ // string text.
+ TextColor = m_Elements.GetAt( 0 )->FontColor.States[DXUT_STATE_NORMAL];
+ }
+ }
+ else
+ {
+ // Non-Korean IME. Always draw composition background.
+ m_pDialog->DrawRect( &rc, m_CompWinColor );
+ }
+
+ // Draw the text
+ pElement->FontColor.Current = TextColor;
+ m_pDialog->DrawText( pwszComp, pElement, &rc, false, nNumCharToDraw );
+
+ // Advance pointer and counter
+ nCharLeft -= nNumCharToDraw;
+ pwszComp += nNumCharToDraw;
+ if( nCharLeft <= 0 )
+ break;
+
+ // Advance rectangle coordinates to beginning of next line
+ OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top );
+ }
+
+ // Load the rect for the first line again.
+ rc = rcFirst;
+
+ // Inspect each character in the comp string.
+ // For target-converted and target-non-converted characters,
+ // we display a different background color so they appear highlighted.
+ int nCharFirst = 0;
+ nXFirst = 0;
+ s_nFirstTargetConv = -1;
+ BYTE* pAttr;
+ const WCHAR* pcComp;
+ for( pcComp = s_CompString.GetBuffer(), pAttr = ImeUi_GetCompStringAttr();
+ *pcComp != L'\0'; ++pcComp, ++pAttr )
+ {
+ D3DCOLOR bkColor;
+
+ // Render a different background for this character
+ int nXLeft, nXRight;
+ s_CompString.CPtoX( int( pcComp - s_CompString.GetBuffer() ), FALSE, &nXLeft );
+ s_CompString.CPtoX( int( pcComp - s_CompString.GetBuffer() ), TRUE, &nXRight );
+
+ // Check if this character is off the right edge and should
+ // be wrapped to the next line.
+ if( nXRight - nXFirst > m_rcText.right - rc.left )
+ {
+ // Advance rectangle coordinates to beginning of next line
+ OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top );
+
+ // Update the line's first character information
+ nCharFirst = int( pcComp - s_CompString.GetBuffer() );
+ s_CompString.CPtoX( nCharFirst, FALSE, &nXFirst );
+ }
+
+ // If the caret is on this character, save the coordinates
+ // for drawing the caret later.
+ if( ImeUi_GetImeCursorChars() == ( DWORD )( pcComp - s_CompString.GetBuffer() ) )
+ {
+ rcCaret = rc;
+ rcCaret.left += nXLeft - nXFirst - 1;
+ rcCaret.right = rcCaret.left + 2;
+ }
+
+ // Set up color based on the character attribute
+ if( *pAttr == ATTR_TARGET_CONVERTED )
+ {
+ pElement->FontColor.Current = m_CompTargetColor;
+ bkColor = m_CompTargetBkColor;
+ }
+ else if( *pAttr == ATTR_TARGET_NOTCONVERTED )
+ {
+ pElement->FontColor.Current = m_CompTargetNonColor;
+ bkColor = m_CompTargetNonBkColor;
+ }
+ else
+ {
+ continue;
+ }
+
+ RECT rcTarget =
+ {
+ rc.left + nXLeft - nXFirst, rc.top, rc.left + nXRight - nXFirst, rc.bottom
+ };
+ m_pDialog->DrawRect( &rcTarget, bkColor );
+ m_pDialog->DrawText( pcComp, pElement, &rcTarget, false, 1 );
+
+ // Record the first target converted character's index
+ if( -1 == s_nFirstTargetConv )
+ s_nFirstTargetConv = int( pAttr - ImeUi_GetCompStringAttr() );
+ }
+
+ // Render the composition caret
+ if( m_bCaretOn )
+ {
+ // If the caret is at the very end, its position would not have
+ // been computed in the above loop. We compute it here.
+ if( ImeUi_GetImeCursorChars() == ( DWORD )s_CompString.GetTextSize() )
+ {
+ s_CompString.CPtoX( ImeUi_GetImeCursorChars(), FALSE, &nX );
+ rcCaret = rc;
+ rcCaret.left += nX - nXFirst - 1;
+ rcCaret.right = rcCaret.left + 2;
+ }
+
+ m_pDialog->DrawRect( &rcCaret, m_CompCaretColor );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::RenderIndicator( float fElapsedTime )
+{
+ CDXUTElement* pElement = m_Elements.GetAt( 9 );
+ pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime );
+
+ m_pDialog->DrawSprite( pElement, &m_rcIndicator, DXUT_NEAR_BUTTON_DEPTH );
+ RECT rc = m_rcIndicator;
+ InflateRect( &rc, -m_nSpacing, -m_nSpacing );
+
+ pElement->FontColor.Current = m_IndicatorImeColor;
+ RECT rcCalc =
+ {
+ 0, 0, 0, 0
+ };
+ // If IME system is off, draw English indicator.
+ WCHAR* pwszIndicator = ImeUi_IsEnabled() ? ImeUi_GetIndicatior() : L"En";
+
+ m_pDialog->CalcTextRect( pwszIndicator, pElement, &rcCalc );
+ m_pDialog->DrawText( pwszIndicator, pElement, &rc );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::Render( float fElapsedTime )
+{
+ if( m_bVisible == false )
+ return;
+
+ // If we have not computed the indicator symbol width,
+ // do it.
+ if( !m_nIndicatorWidth )
+ {
+ RECT rc =
+ {
+ 0, 0, 0, 0
+ };
+ m_pDialog->CalcTextRect( L"En", m_Elements.GetAt( 9 ), &rc );
+ m_nIndicatorWidth = rc.right - rc.left;
+
+ // Update the rectangles now that we have the indicator's width
+ UpdateRects();
+ }
+
+ // Let the parent render first (edit control)
+ CDXUTEditBox::Render( fElapsedTime );
+
+ CDXUTElement* pElement = GetElement( 1 );
+ if( pElement )
+ {
+ s_CompString.SetFontNode( m_pDialog->GetFont( pElement->iFont ) );
+ s_CandList.HoriCand.SetFontNode( m_pDialog->GetFont( pElement->iFont ) );
+ }
+
+ //
+ // Now render the IME elements
+ //
+
+ ImeUi_RenderUI();
+
+ if( m_bHasFocus )
+ {
+ // Render the input locale indicator
+ RenderIndicator( fElapsedTime );
+
+ // Display the composition string.
+ // This method should also update s_ptCompString
+ // for RenderCandidateReadingWindow.
+ RenderComposition( fElapsedTime );
+
+ // Display the reading/candidate window. RenderCandidateReadingWindow()
+ // uses s_ptCompString to position itself. s_ptCompString must have
+ // been filled in by RenderComposition().
+ if( ImeUi_IsShowReadingWindow() )
+ // Reading window
+ RenderCandidateReadingWindow( fElapsedTime, true );
+ else if( ImeUi_IsShowCandListWindow() )
+ // Candidate list window
+ RenderCandidateReadingWindow( fElapsedTime, false );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::SetImeEnableFlag( bool bFlag )
+{
+ s_bImeFlag = bFlag;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTIMEEditBox::Initialize( HWND hWnd )
+{
+ ImeUiCallback_DrawRect = NULL;
+ ImeUiCallback_Malloc = malloc;
+ ImeUiCallback_Free = free;
+ ImeUiCallback_DrawFans = NULL;
+
+ ImeUi_Initialize( hWnd );
+
+ s_CompString.SetBufferSize( MAX_COMPSTRING_SIZE );
+ ImeUi_EnableIme( true );
+}
+
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.h b/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.h
new file mode 100644
index 0000000..0fd177a
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTguiIME.h
@@ -0,0 +1,141 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTguiIME.h
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef DXUT_IME_H
+#define DXUT_IME_H
+
+#include <usp10.h>
+#include <dimm.h>
+#include "ImeUi.h"
+
+
+//--------------------------------------------------------------------------------------
+// Forward declarations
+//--------------------------------------------------------------------------------------
+class CDXUTIMEEditBox;
+
+
+//-----------------------------------------------------------------------------
+// IME-enabled EditBox control
+//-----------------------------------------------------------------------------
+#define MAX_COMPSTRING_SIZE 256
+
+
+class CDXUTIMEEditBox : public CDXUTEditBox
+{
+public:
+
+ static HRESULT CreateIMEEditBox( CDXUTDialog* pDialog, int ID, LPCWSTR strText, int x, int y, int width,
+ int height, bool bIsDefault=false, CDXUTIMEEditBox** ppCreated=NULL );
+
+ CDXUTIMEEditBox( CDXUTDialog* pDialog = NULL );
+ virtual ~CDXUTIMEEditBox();
+
+ static void InitDefaultElements( CDXUTDialog* pDialog );
+
+ static void WINAPI Initialize( HWND hWnd );
+ static void WINAPI Uninitialize();
+
+ static HRESULT WINAPI StaticOnCreateDevice();
+ static bool WINAPI StaticMsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+ static void WINAPI SetImeEnableFlag( bool bFlag );
+
+ virtual void Render( float fElapsedTime );
+ virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
+ virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
+ virtual void UpdateRects();
+ virtual void OnFocusIn();
+ virtual void OnFocusOut();
+
+ void PumpMessage();
+
+ virtual void RenderCandidateReadingWindow( float fElapsedTime, bool bReading );
+ virtual void RenderComposition( float fElapsedTime );
+ virtual void RenderIndicator( float fElapsedTime );
+
+protected:
+ static void WINAPI EnableImeSystem( bool bEnable );
+
+ static WORD WINAPI GetLanguage()
+ {
+ return ImeUi_GetLanguage();
+ }
+ static WORD WINAPI GetPrimaryLanguage()
+ {
+ return ImeUi_GetPrimaryLanguage();
+ }
+ static void WINAPI SendKey( BYTE nVirtKey );
+ static DWORD WINAPI GetImeId( UINT uIndex = 0 )
+ {
+ return ImeUi_GetImeId( uIndex );
+ };
+ static void WINAPI CheckInputLocale();
+ static void WINAPI CheckToggleState();
+ static void WINAPI SetupImeApi();
+ static void WINAPI ResetCompositionString();
+
+
+ static void SetupImeUiCallback();
+
+protected:
+ enum
+ {
+ INDICATOR_NON_IME,
+ INDICATOR_CHS,
+ INDICATOR_CHT,
+ INDICATOR_KOREAN,
+ INDICATOR_JAPANESE
+ };
+
+ struct CCandList
+ {
+ CUniBuffer HoriCand; // Candidate list string (for horizontal candidate window)
+ int nFirstSelected; // First character position of the selected string in HoriCand
+ int nHoriSelectedLen; // Length of the selected string in HoriCand
+ RECT rcCandidate; // Candidate rectangle computed and filled each time before rendered
+ };
+
+ static POINT s_ptCompString; // Composition string position. Updated every frame.
+ static int s_nFirstTargetConv; // Index of the first target converted char in comp string. If none, -1.
+ static CUniBuffer s_CompString; // Buffer to hold the composition string (we fix its length)
+ static DWORD s_adwCompStringClause[MAX_COMPSTRING_SIZE];
+ static CCandList s_CandList; // Data relevant to the candidate list
+ static WCHAR s_wszReadingString[32];// Used only with horizontal reading window (why?)
+ static bool s_bImeFlag; // Is ime enabled
+
+ // Color of various IME elements
+ D3DCOLOR m_ReadingColor; // Reading string color
+ D3DCOLOR m_ReadingWinColor; // Reading window color
+ D3DCOLOR m_ReadingSelColor; // Selected character in reading string
+ D3DCOLOR m_ReadingSelBkColor; // Background color for selected char in reading str
+ D3DCOLOR m_CandidateColor; // Candidate string color
+ D3DCOLOR m_CandidateWinColor; // Candidate window color
+ D3DCOLOR m_CandidateSelColor; // Selected candidate string color
+ D3DCOLOR m_CandidateSelBkColor; // Selected candidate background color
+ D3DCOLOR m_CompColor; // Composition string color
+ D3DCOLOR m_CompWinColor; // Composition string window color
+ D3DCOLOR m_CompCaretColor; // Composition string caret color
+ D3DCOLOR m_CompTargetColor; // Composition string target converted color
+ D3DCOLOR m_CompTargetBkColor; // Composition string target converted background
+ D3DCOLOR m_CompTargetNonColor; // Composition string target non-converted color
+ D3DCOLOR m_CompTargetNonBkColor;// Composition string target non-converted background
+ D3DCOLOR m_IndicatorImeColor; // Indicator text color for IME
+ D3DCOLOR m_IndicatorEngColor; // Indicator text color for English
+ D3DCOLOR m_IndicatorBkColor; // Indicator text background color
+
+ // Edit-control-specific data
+ int m_nIndicatorWidth; // Width of the indicator symbol
+ RECT m_rcIndicator; // Rectangle for drawing the indicator button
+
+#if defined(DEBUG) || defined(_DEBUG)
+ static bool m_bIMEStaticMsgProcCalled;
+#endif
+};
+
+
+
+#endif // DXUT_IME_H
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTres.cpp b/samples/DX_APIUsage/DXUT/Optional/DXUTres.cpp
new file mode 100644
index 0000000..080091b
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTres.cpp
@@ -0,0 +1,8339 @@
+//----------------------------------------------------------------------------
+// File: DXUTRes.cpp
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#include "DXUT.h"
+#include "DXUTres.h"
+
+static const DWORD g_DXUTGUITextureSrcData[] =
+{
+ 0x20534444, 0x0000007c, 0x00001007, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000041, 0x00000000, 0x00000020, 0x000000ff,
+ 0x0000ff00, 0x00ff0000, 0xff000000, 0x00001002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000400, 0x11000400, 0x11000400, 0x11000400,
+ 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400,
+ 0x11000000, 0x00000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000400, 0x22000400, 0x22000400, 0x22000400,
+ 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000,
+ 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000,
+ 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000000, 0x66000000, 0x661e1e1e, 0x771e1e1e,
+ 0x771e1c1e, 0x771e1c1e, 0x771e1c1e, 0x771e1c1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e,
+ 0x771e1c1e, 0x881e1c1e, 0x881e1c1e, 0x881e1c1e, 0x88373937, 0x88373937, 0x881b1c1b, 0x881b1c1b,
+ 0x881e201e, 0x881e201e, 0x881e201e, 0x881e201e, 0x88313631, 0x88313631, 0x88313631, 0x88191b19,
+ 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1e1b, 0x881b1e1b, 0x881b1e1b, 0x88373737,
+ 0x88313331, 0x88313331, 0x88313331, 0x88313331, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b,
+ 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x88191e19, 0x88191e19, 0x88191e19, 0x77191e19,
+ 0x77191a19, 0x77191a19, 0x77191a19, 0x77191a19, 0x77191719, 0x77191719, 0x77191719, 0x66191719,
+ 0x66161616, 0x66161616, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x22000400, 0x22000400, 0x333c413c, 0x443c3d3f, 0x443c3d3f, 0x443c3d3f, 0x553c3d3f,
+ 0x66454145, 0x77454145, 0x77454145, 0x88817d81, 0x99797779, 0x99797779, 0x99797779, 0x99797779,
+ 0x99797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xbb7e7c7e, 0xcc7e7c7e, 0xbb7e7c7e, 0xbb7e7c7e,
+ 0xbb7e7f7e, 0xbb7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e,
+ 0xbb7e7c7e, 0xcc7c7b7d, 0xcc7a7879, 0xbb707071, 0xbb686869, 0xbb5d6060, 0xbb565858, 0xbb4d4f4c,
+ 0xcc454745, 0xcc3c3b3e, 0x77383838, 0x55393837, 0x55373737, 0x44373737, 0x33373737, 0x33373937,
+ 0x22000400, 0x22000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55030303, 0x66030303, 0x66050505, 0x66080808,
+ 0x66101010, 0x77212021, 0x77212021, 0x77313131, 0x88373637, 0x88373637, 0x99525152, 0x99525152,
+ 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a,
+ 0x995a555a, 0x995a555a, 0x995a555a, 0x995a555a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a,
+ 0x995a555a, 0x995a555a, 0x995a555a, 0x995a555a, 0x99525552, 0x99525552, 0x99525552, 0x99525552,
+ 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x994a514a, 0x994a514a, 0x994a514a, 0x994a514a,
+ 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x99525152, 0x99525152, 0x99525152, 0x99525152,
+ 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x99525552, 0x99525552, 0x99525552, 0x99525552,
+ 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x994a514a, 0x994a514a, 0x994a514a, 0x994a514a,
+ 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a454a, 0x994a454a, 0x994a454a, 0x994a454a,
+ 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x992c2b2c,
+ 0x88293129, 0x881b201b, 0x771b201b, 0x771b201b, 0x66101010, 0x66101010, 0x660b0b0b, 0x66050505,
+ 0x66000400, 0x66000100, 0x55000100, 0x55000000, 0x55000000, 0x44000000, 0x33000000, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080708, 0x11100d10, 0x11100d10, 0x22191419,
+ 0x33212324, 0x55424647, 0x66424647, 0x8863696b, 0x99737473, 0xbb737473, 0xccadaead, 0xeeadaead,
+ 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5b6bd, 0xffb5b6bd, 0xffb5b6bd, 0xffb5b6bd,
+ 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffbdbabd, 0xffbcbabd, 0xffbcb8bc, 0xffb6b2b6, 0xffb3afb3, 0xffb0aeaf, 0xffadabaa, 0xffaaa9aa,
+ 0xffa9a7a8, 0xffa7a7a7, 0xffa6a6a6, 0xffa6a6a5, 0xffa6a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a2a5,
+ 0xffa5a2a5, 0xffa5a2a5, 0xeea5a2a5, 0xdd9c9a9c, 0xcc9c9a9c, 0xaa686768, 0x99686768, 0x885a5d5a,
+ 0x553c3e3c, 0x443c3e3c, 0x331e1f1e, 0x11101010, 0x11101010, 0x110b0b0b, 0x00050505, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000400, 0x33000400, 0x44000400, 0x55000400,
+ 0x66080808, 0x66080808, 0x663a3a3a, 0x773a3a3a, 0x885a5d5a, 0x886b6f6e, 0x996b6f6e, 0x997b8081,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99797879, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x996b716b, 0x99737773, 0x996b716b, 0x996b716b,
+ 0x99737173, 0x99797779, 0x99737173, 0x99737173, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99636563, 0x99636563, 0x99636563, 0x99636563,
+ 0x99636163, 0x99636163, 0x99636163, 0x99636163, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a,
+ 0x995a5552, 0x995a5552, 0x995a5552, 0x995a5552, 0x994a4d50, 0x994a4d50, 0x994a4d50, 0x9931353a,
+ 0x88313331, 0x88313331, 0x77101010, 0x66101010, 0x66080408, 0x66080408, 0x66080408, 0x55080408,
+ 0x55000000, 0x44000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11191819, 0x22191819, 0x33191819, 0x66656465, 0x887b7d7b, 0xbba2a5a5, 0xddc8ccce, 0xffc8ccce,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd9d8d9, 0xffd6d2d6, 0xffd6d2d6, 0xffd6cece, 0xffcfcccc, 0xffc8c7c8, 0xffc6c2c3,
+ 0xffc4c0c2, 0xffc2c0c2, 0xffc5c2c4, 0xffc4c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffbdbebd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffa5a6a5,
+ 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xee868a86, 0xdd868a86, 0xaa868a86, 0x885a615a, 0x55505250,
+ 0x33101410, 0x11101410, 0x11101410, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x44000000, 0x55000400, 0x66000400, 0x77343634, 0x77686868,
+ 0x886b6c6b, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294,
+ 0x998c8e8c, 0x99868786, 0x99868786, 0x99868786, 0x99848384, 0x99848384, 0x99848384, 0x99848384,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x997e7f7e,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997e7c7e, 0x99848284,
+ 0x9984827b, 0x9984827b, 0x9984827b, 0x9984827b, 0x99848284, 0x99848284, 0x99848284, 0x997e7c7e,
+ 0x99848284, 0x997e7c7e, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7c7b,
+ 0x997e7c7e, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7b7b, 0x99848284, 0x99848284,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99767776,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737373, 0x997b797b,
+ 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x997b797b, 0x997b797b, 0x997b797b, 0x99707070,
+ 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99636565, 0x99636565, 0x99636565, 0x99636565,
+ 0x99525652, 0x99525652, 0x99525652, 0x99525652, 0x99504d50, 0x882c282c, 0x772c282c, 0x77080408,
+ 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x44000000, 0x22000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x11000000, 0x33525452, 0x77525452,
+ 0xaab2afb2, 0xddfffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7,
+ 0xffefefef, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6,
+ 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe1e1e1,
+ 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6,
+ 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe1dde1,
+ 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de,
+ 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3dd, 0xffdee3dd, 0xffdee1de, 0xffdee0db,
+ 0xffdedbd9, 0xffe2dddc, 0xffdbd9db, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd3d4d3,
+ 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcbc9cb,
+ 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffb2b2b2, 0xffb2b2b2, 0xffb2b2b2, 0xffb2b2b2, 0xff8f908f,
+ 0xff8f908f, 0xbb8f908f, 0x88505250, 0x663c3d3c, 0x333c3d3c, 0x11000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x44000000, 0x55000000, 0x77343234, 0x77686868, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c,
+ 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x997e7f7e, 0x99848684,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x9984827b, 0x9984827b, 0x9984827b, 0x9984827b, 0x99848284, 0x99848284, 0x997e7c7e, 0x997e7c7e,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7c7b, 0x997b7c7b,
+ 0x99848284, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x99848284, 0x99848284, 0x997b7b7b, 0x997b7b7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x99737973, 0x99737973, 0x99737973, 0x99737973, 0x99737173, 0x99737173, 0x99504d50, 0x99504d50,
+ 0x88424142, 0x88212021, 0x77212021, 0x66000000, 0x55000000, 0x55000000, 0x44000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x22000400, 0x66525452, 0xaaa5a7a5, 0xeef7fbf7, 0xfff7fbf7,
+ 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe1e4e1, 0xffe1e4e1, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffefe7ef, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6,
+ 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3e6, 0xffe6e3e6, 0xffe1dde1, 0xffe6e3e6,
+ 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de,
+ 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de,
+ 0xffe5e2df, 0xffe1e0dd, 0xffdcdbdc, 0xffdddfe0, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffb5b6b5, 0xdd797979, 0xaa797979, 0x663c3d3c, 0x22000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x55000000, 0x77343234, 0x88686468, 0x999c969c, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c,
+ 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294,
+ 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99848384, 0x99848384, 0x99848384, 0x99848384,
+ 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e,
+ 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e,
+ 0x997e7c79, 0x997e7c79, 0x997e7c79, 0x99797776, 0x99797779, 0x99797779, 0x997e7c7e, 0x997e7c7e,
+ 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997b7c7b, 0x997b7c7b, 0x99737773, 0x997b7c7b,
+ 0x99797779, 0x997e7c7e, 0x99797779, 0x997e7c7e, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b,
+ 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x99767776, 0x997b7d7b, 0x997b7d7b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x99737973, 0x99737973, 0x99737973, 0x99737973, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99636163, 0x99636163, 0x99424142, 0x88212021, 0x77191419, 0x66000000, 0x55000000, 0x55000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x11000400, 0x66797b79, 0xccb5b6b5, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7,
+ 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6,
+ 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffdbdddb, 0xffe1e1e1, 0xffe1e1e1, 0xffdbdcdb, 0xffe1e1e1,
+ 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1,
+ 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1,
+ 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb,
+ 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdcd9, 0xffdbdcd9, 0xffdcdcda, 0xffdcdbda,
+ 0xffdddadb, 0xffddd9dc, 0xffdad8d9, 0xffd7dadb, 0xffdbdddc, 0xffdddfdd, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xbb737973,
+ 0x664d524d, 0x11000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x33080808, 0x66080808,
+ 0x8852555a, 0x99848686, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c,
+ 0x99949294, 0x99949294, 0x99949294, 0x99898889, 0x998c8684, 0x998c8684, 0x998c8684, 0x9984807e,
+ 0x99848284, 0x99848284, 0x99848284, 0x997b7b7e, 0x997b7d7b, 0x997b7d7b, 0x99767876, 0x99767876,
+ 0x997b797b, 0x997b797b, 0x99767576, 0x99767576, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99767570, 0x99767570, 0x997b7973, 0x99767570, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767576, 0x99767576, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7973, 0x9973706e, 0x996b6768, 0x99635d63, 0x994a4a4a, 0x77292b29, 0x66080c08, 0x66080c08,
+ 0x66000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x333a393a, 0xbbb2b2b2, 0xeeefefef, 0xffefefef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xfff7f7f7, 0xfff7f7f7, 0xffececec, 0xffececec, 0xffefebe6, 0xffefebe6, 0xffe6e4e1, 0xffe6e4e1,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdedce1, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd3d7d3, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd3d7d3,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d6d6, 0xffd8d7d6,
+ 0xffd8d6d7, 0xffd8d3d6, 0xffd8d3d7, 0xffd9d4d8, 0xffd9d6d9, 0xffd8d7d7, 0xffd6d7d6, 0xffd3d7d3,
+ 0xffd3d7d3, 0xffd3d7d3, 0xffd6dbd6, 0xffd3d7d3, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbde,
+ 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd0d1ce, 0xffd0d1ce, 0xffc5bebd, 0xffc5c6c5,
+ 0xee9a9797, 0xaa6e6868, 0x3342393a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x33080808, 0x66080808, 0x885a595a,
+ 0x99848686, 0x99848686, 0x999c9e9c, 0x999c9e9c, 0x99919291, 0x99919291, 0x99919291, 0x99919291,
+ 0x99898889, 0x99898889, 0x99898889, 0x997e7f7e, 0x9984807e, 0x997b7b79, 0x997b7b79, 0x997b7b79,
+ 0x997b7b7e, 0x997b7b7e, 0x997b7b7e, 0x99737479, 0x99767876, 0x99767876, 0x99707370, 0x99707370,
+ 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99737573, 0x99737573, 0x99737573, 0x99707370,
+ 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370,
+ 0x996e706e, 0x99707370, 0x99707370, 0x996e706e, 0x99707370, 0x99707370, 0x99707370, 0x996e706e,
+ 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, 0x99707370, 0x996e706e, 0x99707370, 0x99707370,
+ 0x99737173, 0x99737473, 0x99737373, 0x99737173, 0x99737370, 0x99737370, 0x99737370, 0x99737370,
+ 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373,
+ 0x9970716e, 0x99767570, 0x99767570, 0x99767570, 0x99737573, 0x99737370, 0x99737370, 0x99737370,
+ 0x99737370, 0x99737573, 0x99737370, 0x99737370, 0x99707370, 0x99707370, 0x99707370, 0x99707370,
+ 0x99707373, 0x99707373, 0x99707373, 0x99707373, 0x99707370, 0x99707370, 0x99707370, 0x99707370,
+ 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99767576, 0x99767576, 0x99767576, 0x99767576,
+ 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x997b7973, 0x997b7973, 0x997b7973, 0x9973706e, 0x996b696b, 0x994a4a4a, 0x88292b29, 0x77080c08,
+ 0x66000000, 0x66000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x55474847,
+ 0xddb2b2b2, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f3f4,
+ 0xffececec, 0xffececec, 0xffe1e1e1, 0xffe1e1e1, 0xffe6e4e1, 0xffdedddb, 0xffdedddb, 0xffdedddb,
+ 0xffdedce1, 0xffdedce1, 0xffdedce1, 0xffd6d5db, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd3d4d3,
+ 0xffd9d7d9, 0xffd9d7d9, 0xffd9d7d9, 0xffd9d7d9, 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3,
+ 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d3, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0,
+ 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd3d4d3, 0xffd0d1d0, 0xffd3d4d3, 0xffd0d1d0, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd0d4d0, 0xffd3d5d3, 0xffd0d4d0, 0xffd3d5d3, 0xffd6d4d3, 0xffd6d4d3, 0xffd6d4d3, 0xffd7d4d4,
+ 0xffd6d2d3, 0xffd5cfd3, 0xffd5d0d4, 0xffd5d3d4, 0xffd5d5d4, 0xffd2d5d3, 0xffd3d4d3, 0xffd3d7d3,
+ 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d9,
+ 0xffd3d7d9, 0xffd3d7d9, 0xffd3d7d9, 0xffd3d4d3, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd0d1ce, 0xffc5c6c5,
+ 0xffc5c6c5, 0xff9a9797, 0xcc9a9797, 0x55313231, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080808, 0x66080808, 0x995a595a, 0x99848284,
+ 0x99848686, 0x99848686, 0x99848686, 0x99848686, 0x99919291, 0x99868686, 0x99868686, 0x99868686,
+ 0x997e7f7e, 0x997e7f7e, 0x99737573, 0x99737573, 0x997b7b79, 0x997b7b79, 0x99737573, 0x99737573,
+ 0x99737479, 0x99737479, 0x99737479, 0x99737479, 0x99707370, 0x99707370, 0x99707370, 0x99707370,
+ 0x99707170, 0x99707170, 0x99707170, 0x996b6d6b, 0x996e706e, 0x996e706e, 0x996e706e, 0x996b6d6b,
+ 0x996e706e, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996e706e, 0x996e706e, 0x996e706e, 0x996b6d6b, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x9973706e, 0x9973706e, 0x9973706e, 0x9973706e,
+ 0x99737073, 0x99737073, 0x99737073, 0x99737373, 0x99737373, 0x99737073, 0x99737073, 0x99737073,
+ 0x9970716e, 0x9970716e, 0x9970716e, 0x9970716e, 0x9973706e, 0x99737370, 0x9973706e, 0x9973706e,
+ 0x9973706e, 0x9973706e, 0x99737370, 0x99737370, 0x99707370, 0x99707370, 0x996e706e, 0x996e706e,
+ 0x996e7073, 0x996e7073, 0x996e7073, 0x996e7073, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e,
+ 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, 0x99707170, 0x99707170, 0x99707170, 0x99707170,
+ 0x99707170, 0x99707170, 0x99707170, 0x99707170, 0x99707370, 0x99707370, 0x99707370, 0x99707370,
+ 0x997b7973, 0x9973706e, 0x9973706e, 0x9973706e, 0x996b696b, 0x996b696b, 0x994a4a4a, 0x99292b29,
+ 0x66101010, 0x66000000, 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66474847, 0xeed6d7d6,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff4f3f4, 0xffe9e7e9, 0xffe9e7e9, 0xffe9e7e9,
+ 0xffe1e1e1, 0xffe1e1e1, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d5db, 0xffd6d5db, 0xffd6d5db, 0xffd6d5db, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffcecece, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffcecece,
+ 0xffd0d2d0, 0xffd0d2d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffced2ce, 0xffd0d4d0, 0xffd0d4d0, 0xffced2ce, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d2d2,
+ 0xffd6d2d3, 0xffd4d0d2, 0xffd4d0d3, 0xffd5d2d5, 0xffd6d3d6, 0xffd5d4d5, 0xffd3d4d3, 0xffd0d2d0,
+ 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d3,
+ 0xffd0d2d3, 0xffd0d2d3, 0xffd0d2d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd3d4d3, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xff9a9797, 0xdd949694, 0x44313231, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x66080808, 0x995a595a, 0x99848284, 0x99848284,
+ 0x99848686, 0x99848686, 0x99848686, 0x99848686, 0x99868686, 0x99868686, 0x99868686, 0x997b797b,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d6b, 0x996b6d6b, 0x99707370, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99736d6b, 0x9973706e, 0x9973706e, 0x9973706e,
+ 0x99737073, 0x99736d73, 0x99737073, 0x99737073, 0x99736d73, 0x99736d73, 0x99736d73, 0x99737073,
+ 0x996b6d6b, 0x9970716e, 0x9970716e, 0x996b6d6b, 0x99736d6b, 0x99736d6b, 0x99736d6b, 0x99736d6b,
+ 0x9973706e, 0x9973706e, 0x99736d6b, 0x9973706e, 0x996e706e, 0x99707370, 0x99707370, 0x996b6d6b,
+ 0x996e7073, 0x996b6d73, 0x996b6d73, 0x996e7073, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x99707170, 0x996b6d6b, 0x99707170, 0x996b6d6b, 0x99707370, 0x99707370, 0x996b6d6b, 0x996b6d6b,
+ 0x9973706e, 0x9973706e, 0x9973706e, 0x9973706e, 0x996b696b, 0x996b696b, 0x996b696b, 0x994a4a4a,
+ 0x88313131, 0x66101010, 0x66000000, 0x55000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x44474847, 0xeed6d7d6, 0xffd6d7d6,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffe9e7e9, 0xffe9e7e9, 0xffe9e7e9, 0xffdedbde,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d5db, 0xffceced6, 0xffceced6, 0xffceced6, 0xffcecece, 0xffcecece, 0xffd3d4d3, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d1d0, 0xffd7d2d2,
+ 0xffd7d3d5, 0xffd6d1d5, 0xffd6d1d4, 0xffd6d3d5, 0xffd5d4d5, 0xffd1d2d1, 0xffd0d1d0, 0xffd0d2d0,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffd3d4d3, 0xffcecece, 0xffd3d4d3, 0xffcecece, 0xffd3d4d3,
+ 0xffd3d4d3, 0xffcecece, 0xffcecece, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xff949694, 0xcc949694, 0x33313231, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x44000000, 0x884a4542, 0x99737173, 0x99737173, 0x99737173,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737373,
+ 0x99737173, 0x99737173, 0x99706f70, 0x99706f70, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x99706d70, 0x99737173, 0x99706d70, 0x99706d70, 0x996b6b6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b,
+ 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996e6c6e, 0x99706f70, 0x996e6c6e, 0x99706f70,
+ 0x996b6f6b, 0x996b6d6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e,
+ 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x99736f6e, 0x99737070, 0x99737070, 0x99737070, 0x996e6f6e, 0x99737173, 0x99707070, 0x996e6f6e,
+ 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e,
+ 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e,
+ 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b,
+ 0x996b6f70, 0x996b6f70, 0x996b6c6e, 0x996b6c6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x99686b6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x9963656b, 0x9963656b, 0x995d6065, 0x9952555a,
+ 0x994a4d4a, 0x881e1f1e, 0x66080808, 0x66080808, 0x44000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11101010, 0xccc5cac5, 0xffc5cac5, 0xffc5cac5,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbd6, 0xffdedbd6, 0xffdedbd6, 0xffd6d5d3,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d0d3, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecdce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffcecdce, 0xffcecece, 0xffcecdce, 0xffcecdce,
+ 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffced0d0,
+ 0xffced0ce, 0xffcecece, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0,
+ 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0,
+ 0xffd6d0d0, 0xffd6d1d3, 0xffd6d1d3, 0xffd6d1d3, 0xffd0d0d0, 0xffd6d2d6, 0xffd3d1d3, 0xffd1d0d1,
+ 0xffd5d2d4, 0xffd7d3d6, 0xffd7d3d6, 0xffd6d3d5, 0xffd1d2d3, 0xffcecfce, 0xffcdcece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcbcccb, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcbcacb, 0xffc5cac5,
+ 0xffc0c4c0, 0xffc0c4c0, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xaa737473, 0x11101010, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x22000000, 0x661e1e1e, 0x99656263, 0x99737173, 0x99737173, 0x99737173,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737373, 0x99737373, 0x99737373, 0x996b6c6b,
+ 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x99706f70, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x99706d70, 0x99706d70, 0x99706d70, 0x996e696e, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b6b6b,
+ 0x996b696b, 0x996b6b6b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6d6b,
+ 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6b6b, 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x996e6c6e,
+ 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e,
+ 0x996b6f6e, 0x996b7070, 0x996b7070, 0x996b6f6e, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e,
+ 0x99737070, 0x99737070, 0x99736f6e, 0x99736f6e, 0x996e6f6e, 0x99707070, 0x99737173, 0x996e6f6e,
+ 0x996e6f68, 0x996e6f68, 0x9970706e, 0x9970706e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996b706e, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e,
+ 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b,
+ 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b,
+ 0x996b6f70, 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x99686b6b, 0x99686b6b, 0x9965686b, 0x99686b6b,
+ 0x996b696b, 0x99686768, 0x99686768, 0x99686768, 0x9963656b, 0x995d6065, 0x995d6065, 0x9952555a,
+ 0x994a4d4a, 0x99343634, 0x77080808, 0x66080808, 0x66000000, 0x22000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x664d4e4d, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d5d3, 0xffd6d5d3, 0xffced0d0, 0xffced0d0,
+ 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffcbcdcb, 0xffcbcdcb, 0xffcbcdcb, 0xffcbcdcb,
+ 0xffcecdce, 0xffced0ce, 0xffced0ce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecace, 0xffcecdce,
+ 0xffcecace, 0xffcecdce, 0xffcecace, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece,
+ 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0,
+ 0xffced0d0, 0xffced1d3, 0xffced1d3, 0xffced0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0,
+ 0xffd6d1d3, 0xffd6d1d3, 0xffd6d0d0, 0xffd6d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0,
+ 0xffd5d2d3, 0xffd6d3d6, 0xffd7d2d5, 0xffd6d1d5, 0xffd6d1d5, 0xffd4cfd3, 0xffd0ced0, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffced2ce, 0xffcecace, 0xffcecece, 0xffcecece, 0xffcbcccb,
+ 0xffcbcccb, 0xffcbcccb, 0xffcbcccb, 0xffcbcacb, 0xffcbcacb, 0xffcbcacb, 0xffcbcacb, 0xffc5cac5,
+ 0xffc0c4c0, 0xffc0c4c0, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0x66424242, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x44000000, 0x883c3b3c, 0x99656263, 0x99656263, 0x99656263, 0x99737173,
+ 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b,
+ 0x996b696b, 0x996b696b, 0x996e6c6e, 0x996e6c6e, 0x996b6b6b, 0x996b6b6b, 0x996b686b, 0x996b6b6b,
+ 0x996e696e, 0x996e696e, 0x996e696e, 0x996e696e, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b696b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x99706f70, 0x99706f70, 0x99706f70, 0x99706f70,
+ 0x996b6d6b, 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e,
+ 0x996b6f6e, 0x996b6f6e, 0x996b7070, 0x996b7070, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070,
+ 0x99736f6e, 0x99737070, 0x99736f6e, 0x99737070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99707070,
+ 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e,
+ 0x996b706e, 0x996b706e, 0x996b6f70, 0x996b6f70, 0x996e6f6e, 0x99737173, 0x99707070, 0x99707070,
+ 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b,
+ 0x996b6c6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x9965686b, 0x9965686b, 0x9965686b, 0x9965686b,
+ 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x9963656b, 0x995d6065, 0x99585a60, 0x9952555a,
+ 0x994a4d4a, 0x994a4d4a, 0x881e1f1e, 0x66080808, 0x66000000, 0x44000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xddc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5,
+ 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffc5cace,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbcdcb, 0xffcbcdcb, 0xffc8ccc8, 0xffcbcdcb,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecace,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced1d3,
+ 0xffcecece, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0,
+ 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd0d0d0, 0xffd3d1d3,
+ 0xffd6d0d0, 0xffd6d1d3, 0xffd6d0d0, 0xffd6d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3,
+ 0xffd4d2d2, 0xffd6d2d6, 0xffd6d1d5, 0xffd5d1d5, 0xffd5d2d4, 0xffd2d1d2, 0xffcfcfcf, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcbcccb,
+ 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcacb, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc0c4c0,
+ 0xffc0c4c0, 0xffbabdba, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xbb737473, 0x110e0d0e,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x55000000, 0x995a595a, 0x99656263, 0x99656263, 0x99656263, 0x99656263,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6c6b, 0x996b6c6b, 0x99636563, 0x99636563,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b686b, 0x996b686b, 0x996b686b, 0x996b686b,
+ 0x996b656b, 0x996e696e, 0x996e696e, 0x996e696e, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b,
+ 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99706f70, 0x99737173, 0x99706f70, 0x99737173,
+ 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996b706b, 0x99706d70, 0x996e6d6e, 0x996e6d6e, 0x99706d70,
+ 0x996b7070, 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x99707070, 0x99707070, 0x99737173, 0x99707070,
+ 0x99737070, 0x99737070, 0x99737173, 0x99737173, 0x99707070, 0x99737173, 0x99707070, 0x99707070,
+ 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99707070, 0x99707070, 0x99707070, 0x99707070,
+ 0x996b706e, 0x996b706e, 0x996b706e, 0x996b706e, 0x99707070, 0x99707070, 0x99737173, 0x99737173,
+ 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6d6b,
+ 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x996b6c6e, 0x996b696b, 0x996b696b, 0x996b696b, 0x9965686b, 0x9965686b, 0x9963656b, 0x9963656b,
+ 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x995d6065, 0x995d6065, 0x99585a60, 0x9952555a,
+ 0x994a4d4a, 0x994a4d4a, 0x99343634, 0x66080808, 0x66000000, 0x55000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x44313131, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffc5cace, 0xffc5cace, 0xffc5cace, 0xffc5cace,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced0d0, 0xffced1d3,
+ 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced2ce, 0xffd3ced3, 0xffd0ced0, 0xffd0ced0, 0xffd3ced3,
+ 0xffced1d3, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3,
+ 0xffd6d1d3, 0xffd6d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd7d2d6, 0xffd5d3d5, 0xffd5d1d5, 0xffd3d1d2, 0xffd0d0d0, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc8c9c8,
+ 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc5c2c5, 0xffc0c4c0,
+ 0xffbabdba, 0xffbabdba, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xeea5a6a5, 0x44292829,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x22000400, 0x771e201e, 0x995a595a, 0x99525452, 0x995a5a5a, 0x99636163, 0x99636163,
+ 0x996b696b, 0x99656568, 0x99656568, 0x99656568, 0x99636563, 0x99636563, 0x99636563, 0x99636563,
+ 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6765, 0x996b6868, 0x996b6765,
+ 0x996b676b, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b696b,
+ 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b,
+ 0x996e6f6e, 0x996b6d6b, 0x996b6d6b, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x99737173, 0x99737173, 0x99737173, 0x996e746e, 0x99737173, 0x99737373, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x996e7173, 0x99707173, 0x99707173,
+ 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99736f6e, 0x99737070, 0x99736f6e, 0x99737070,
+ 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, 0x996b6d6b,
+ 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99686868, 0x99656765, 0x99656765, 0x99636563,
+ 0x99636463, 0x99636463, 0x99636263, 0x99636163, 0x99636163, 0x995d5c5d, 0x995d5c5d, 0x995a595a,
+ 0x99525552, 0x993f423f, 0x993f423f, 0x77191c19, 0x77000000, 0x66000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x88737173, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffc5cac5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5, 0xffc5cac5, 0xffc5c9c5,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecace,
+ 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffcecece, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d0, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d3d6, 0xffd7d1d5, 0xffd5d1d4, 0xffd2d0d2, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0,
+ 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffc5cac5,
+ 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c2bd,
+ 0xffc0bdbd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xff9c9a9c, 0x77585a58,
+ 0x00000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x33000400, 0x883c3d3c, 0x995a595a, 0x99525452, 0x99525452, 0x995a5a5a, 0x99636163,
+ 0x99656568, 0x99656568, 0x99656568, 0x99656568, 0x99636563, 0x99636463, 0x99636463, 0x99636463,
+ 0x99656565, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6765, 0x996b6765, 0x996b6765,
+ 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b,
+ 0x996e6f6e, 0x996b6d6b, 0x99707070, 0x99737173, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737473, 0x99737373, 0x99737373,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x99737173, 0x99737173, 0x99707173,
+ 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737070, 0x99737070, 0x99737070, 0x99737070,
+ 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99686868, 0x99656765, 0x99656765, 0x99656765,
+ 0x99636263, 0x99636263, 0x99636263, 0x99636163, 0x99605e60, 0x99605e60, 0x995d5c5d, 0x995a595a,
+ 0x99525552, 0x993f423f, 0x993f423f, 0x88191c19, 0x77030303, 0x66000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xddadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbccc8, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6,
+ 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6,
+ 0xffd6d5d6, 0xffd6d4d6, 0xffd6d1d3, 0xffd1d1d1, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5cac5,
+ 0xffc5c8c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c4c5, 0xffc5c2bd,
+ 0xffc3c0bd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xaa585a58,
+ 0x11000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x44000400, 0x993c3d3c, 0x995a595a, 0x994a4d4a, 0x99525452, 0x995a5a5a, 0x99636163,
+ 0x99606165, 0x99606165, 0x99656568, 0x99656568, 0x99636563, 0x99636263, 0x99636263, 0x99636263,
+ 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6563, 0x996b6765, 0x996b6868,
+ 0x996b686b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070, 0x99707070, 0x99707070, 0x99707070,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737573, 0x99737373, 0x99737573,
+ 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737173, 0x99737473,
+ 0x99737173, 0x99737473, 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737173, 0x99737173,
+ 0x99737373, 0x99737373, 0x99737473, 0x99737473, 0x99737173, 0x99737373, 0x99737373, 0x99737373,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x99707173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99707070, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e,
+ 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99656765, 0x99686868, 0x99656765, 0x99656765,
+ 0x99636463, 0x99636263, 0x99636263, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995d5c5d, 0x995a595a,
+ 0x99525552, 0x99525552, 0x993f423f, 0x882c2f2c, 0x77050505, 0x66000000, 0x33000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0xffadaaad, 0xffb5b2b5, 0xffb5b2b5, 0xffbdbabd, 0xffc5c2c5,
+ 0xffc5c2c5, 0xffc5c2c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5,
+ 0xffc5c8c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c9c5, 0xffc5cac5,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbccc8, 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3,
+ 0xffd6d4d3, 0xffd6d2d6, 0xffd6d4d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6,
+ 0xffd6d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6,
+ 0xffd6d4d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6,
+ 0xffd6d5d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3,
+ 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5c9c5,
+ 0xffc5cac5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c5c5, 0xffc5c4c5, 0xffc5c2c5, 0xffc5c2bd,
+ 0xffc0bdbd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xcc848684,
+ 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x55000400, 0x993c3d3c, 0x993c3d3c, 0x994a4d4a, 0x99525452, 0x995a5a5a, 0x995a5a5a,
+ 0x995a5d63, 0x99606165, 0x99606165, 0x99606165, 0x99636163, 0x99636263, 0x99636463, 0x99636263,
+ 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6563, 0x996b6868, 0x996b6765, 0x996b6868,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6c6b, 0x996b6c6b,
+ 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99707370, 0x99707370, 0x99737173, 0x99707370, 0x99737373, 0x99737473, 0x99737173, 0x99737473,
+ 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737473,
+ 0x99737573, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737373,
+ 0x99737573, 0x99737373, 0x99737473, 0x99737473, 0x99737373, 0x99737573, 0x99737473, 0x99737473,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99707070,
+ 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b,
+ 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99656765, 0x99686868, 0x99656765,
+ 0x99636463, 0x99636463, 0x99636263, 0x99636163, 0x99605e60, 0x99605e60, 0x995d5c5d, 0x995d5c5d,
+ 0x99525552, 0x99525552, 0x993f423f, 0x992c2f2c, 0x77080808, 0x77000000, 0x44000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x443a393a, 0xffadaaad, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd,
+ 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5, 0xffc5c4c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5cac5, 0xffc5c9c5, 0xffc5cac5,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d4d3, 0xffd6d4d3, 0xffd6d2d6, 0xffd6d4d3, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d5,
+ 0xffd6d7d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffceccce, 0xffc5cac5,
+ 0xffc5c9c5, 0xffc5cac5, 0xffc5c9c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c2bd,
+ 0xffc3c0bd, 0xffc0bdbd, 0xffc0bdbd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xdd848684,
+ 0x222c2f2c, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55161716, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, 0x995a595a,
+ 0x995d5e5d, 0x995d5e5d, 0x99606060, 0x99606060, 0x99636263, 0x99636263, 0x99636263, 0x99636463,
+ 0x99636563, 0x99636563, 0x99656765, 0x99636563, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b,
+ 0x996b696b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996e6c6e, 0x996e6c6e, 0x996e6c6e, 0x99706f70,
+ 0x996b6d6b, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x99707070,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737373, 0x99737173,
+ 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737473, 0x99737473, 0x99737373, 0x99737573, 0x99737473, 0x99737473, 0x99737373,
+ 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737173, 0x99737173, 0x99737373,
+ 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b6868, 0x996b6765, 0x996b6765,
+ 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995a595a,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x770b0b0b, 0x77000000, 0x55000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x44373737, 0xffa5a6a5, 0xffadaaad, 0xffb2b5b8, 0xffb5babd, 0xffb5babd,
+ 0xffbdc0c0, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb,
+ 0xffcecace, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d9, 0xffd7d7d7, 0xffd8d7d8, 0xffd6d6d6, 0xffd7d6d6,
+ 0xffd5d8d9, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd3d1d3,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffceccce, 0xffcecccb,
+ 0xffcec9c8, 0xffcec9c8, 0xffcec9c8, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc8c5c8, 0xffc5c2c5,
+ 0xffc3c0c3, 0xffc0bdc0, 0xffbdbabd, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x44343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995a5d5a, 0x995d5e5d, 0x99636163, 0x99606060, 0x99636263, 0x99636263, 0x99636263, 0x99636463,
+ 0x99636563, 0x99636563, 0x99636563, 0x99656765, 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x99706f70,
+ 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373,
+ 0x99737373, 0x99737373, 0x99737573, 0x99737473, 0x99737473, 0x99737573, 0x99737473, 0x99737473,
+ 0x99737573, 0x99737573, 0x99767776, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776,
+ 0x99767776, 0x997b797b, 0x99797879, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737473, 0x99737473, 0x99737473,
+ 0x99737573, 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737473, 0x99737373, 0x99737473,
+ 0x99737373, 0x99737473, 0x99737473, 0x99737173, 0x99737373, 0x99737373, 0x99737173, 0x99737173,
+ 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b,
+ 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6765,
+ 0x99686768, 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995a595a,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x55373737, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb2b5b8, 0xffb5babd,
+ 0xffbdbebd, 0xffbdc0c0, 0xffbdc2c5, 0xffbdc1c3, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c5c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c9c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced0d0,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6,
+ 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd9d8d9, 0xffd6d7d6, 0xffd6d7d6, 0xffd9d8d6, 0xffdbd9d6, 0xffd9d8d6,
+ 0xffd6d7d6, 0xffd6dbde, 0xffd6d9db, 0xffd7d9dc, 0xffd9d9d9, 0xffdbd8dc, 0xffdcd8dd, 0xffd9d7da,
+ 0xffd5d7da, 0xffd5d7d6, 0xffd5d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d5d6,
+ 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d1d6, 0xffd0d0d0,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecccb,
+ 0xffcecccb, 0xffcecccb, 0xffcec9c8, 0xffcbc8cb, 0xffc8c5c8, 0xffc8c5c8, 0xffc8c5c8, 0xffc5c2c5,
+ 0xffc3c0c3, 0xffc0bdc0, 0xffbdbabd, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995a5d5a, 0x995d5e5d, 0x995d5e5d, 0x99636163, 0x99636163, 0x99636263, 0x99636463, 0x99636463,
+ 0x99636563, 0x99656765, 0x99656765, 0x99656765, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996e6c6e, 0x99706f70, 0x99737173, 0x99706f70,
+ 0x996e6f6e, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737173, 0x99737173,
+ 0x99737473, 0x99737573, 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737473, 0x99737573,
+ 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99767776, 0x997b797b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x997b797b,
+ 0x99797879, 0x99767776, 0x99767776, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776,
+ 0x99737773, 0x99737573, 0x99737773, 0x99737773, 0x99767773, 0x99767773, 0x99767773, 0x99767773,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737373, 0x99737573, 0x99737373, 0x99737573, 0x99737373, 0x99737473, 0x99737373, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6868,
+ 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995d5c5d,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x66373737, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb5babd, 0xffb5babd,
+ 0xffbdbebd, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced0d0,
+ 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6,
+ 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffdbd9db, 0xffdbd9d6, 0xffdbd9d6, 0xffdbd9d6, 0xffdedbd6,
+ 0xffd6d9db, 0xffd6d8d9, 0xffd6d9db, 0xffd7d8dc, 0xffd9dadb, 0xffdbdadc, 0xffdcd8dc, 0xffdcd8dc,
+ 0xffdcd7dc, 0xffdad7da, 0xffd8d8d7, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6,
+ 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd3d1d3,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecccb,
+ 0xffcecccb, 0xffcecccb, 0xffcec9c8, 0xffcecace, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc5c2c5,
+ 0xffc5c2c5, 0xffc0bdc0, 0xffc0bdc0, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995a5d5a, 0x995d5e5d, 0x995d5e5d, 0x99606060, 0x99636163, 0x99636263, 0x99636263, 0x99636463,
+ 0x99636563, 0x99656765, 0x99686868, 0x99686868, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b,
+ 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99706f70, 0x99706f70, 0x99706f70, 0x99706f70,
+ 0x99707070, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737473, 0x99737573, 0x99737473, 0x99737373, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99797879, 0x997b797b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99797879, 0x99767776,
+ 0x99767776, 0x99767776, 0x99767776, 0x997b797b, 0x99737776, 0x99737879, 0x99737776, 0x99737776,
+ 0x99737973, 0x99737773, 0x99737973, 0x99737973, 0x997b7973, 0x99767773, 0x99767773, 0x997b7973,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737573, 0x99737573, 0x99737373, 0x99737373,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b,
+ 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x99636163, 0x99636163, 0x995d5c5d, 0x995d5c5d,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x776e6f6e, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb2b5b8, 0xffb5babd,
+ 0xffbdbebd, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc1c3, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c5c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c8c5, 0xffc5cac5, 0xffc5cac5, 0xffcecace, 0xffcecace, 0xffcecccb, 0xffcecccb,
+ 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3,
+ 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6,
+ 0xffdbd9db, 0xffdedbde, 0xffdbd9db, 0xffdbd9db, 0xffdbd9d6, 0xffdbd9d6, 0xffdedbd6, 0xffdbd9d6,
+ 0xffd6d9db, 0xffd6d9db, 0xffd6dadb, 0xffd7dade, 0xffdadbdb, 0xffdbdadc, 0xffdbd8dc, 0xffdcd8dc,
+ 0xffdcdadc, 0xffd9dad9, 0xffd7d8d7, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6,
+ 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecccb,
+ 0xffcecccb, 0xffcecccb, 0xffcecccb, 0xffcecace, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc5c2c5,
+ 0xffc5c2c5, 0xffc0bdc0, 0xffc0bdc0, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x66343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a,
+ 0x995d5c5d, 0x99605e60, 0x99605e60, 0x99605e60, 0x99636163, 0x99636263, 0x99636463, 0x99636563,
+ 0x996b656b, 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b,
+ 0x996e6c6b, 0x996e6c6b, 0x99706f6b, 0x996e6c6b, 0x996e7070, 0x996e7070, 0x99686f6e, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737473, 0x99737473, 0x99737473,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x997b7979, 0x997b7d7b, 0x997b7576, 0x997b7979, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99797b79, 0x99767876, 0x99767876,
+ 0x997b787b, 0x997b787b, 0x997b787b, 0x997b787b, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737776, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b,
+ 0x99656865, 0x99656865, 0x99636563, 0x99636563, 0x99606160, 0x99606160, 0x995d5d5d, 0x995d5d5d,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x77686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffb5b7b5,
+ 0xffbdbebd, 0xffc0c0c0, 0xffc3c1c3, 0xffc3c1c3, 0xffc5c2c5, 0xffc8c5c5, 0xffc8c5c5, 0xffcbc8c5,
+ 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce,
+ 0xffcecece, 0xffcecece, 0xffd0d0d0, 0xffcecece, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3,
+ 0xffd6d4d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d8d6,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dcd9, 0xffd6dbd6,
+ 0xffdedbde, 0xffdeddde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedade, 0xffdcdcdd, 0xffdbdbdc, 0xffdbdbdc, 0xffdbdbdc, 0xffdcdadc,
+ 0xffdcdadd, 0xffdcdadc, 0xffd9d9d9, 0xffd8d9db, 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffd6d9d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecdd0, 0xffceccd3, 0xffcbcccb, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc0bec0, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a,
+ 0x995d5c5d, 0x99605e60, 0x99605e60, 0x99636163, 0x99636263, 0x99636263, 0x99636563, 0x99636563,
+ 0x996b676b, 0x996b686b, 0x996b676b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b,
+ 0x99706f6b, 0x996e6c6b, 0x99706f6b, 0x99706f6b, 0x996e7070, 0x996e7070, 0x996e7070, 0x996e7070,
+ 0x99737173, 0x99737373, 0x99737173, 0x99737473, 0x99737373, 0x99737373, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767876, 0x99767876, 0x99767876, 0x99797b79,
+ 0x997b7979, 0x997b7979, 0x997b7979, 0x997b7979, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7b7b,
+ 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7c7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x997b787b, 0x997b787b, 0x997b787b, 0x997b787b, 0x99797b79, 0x99767876, 0x99767876, 0x99797b79,
+ 0x99797b79, 0x99767876, 0x99767876, 0x99767876, 0x997b797b, 0x99797879, 0x997b797b, 0x99797879,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737473, 0x99737373, 0x99737173, 0x99737373, 0x99737173, 0x99737173,
+ 0x99707070, 0x99737173, 0x99707070, 0x996e6f6e, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b,
+ 0x99686b68, 0x99656865, 0x99656865, 0x99636563, 0x99636563, 0x99606160, 0x99606160, 0x995a595a,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x88686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffb5b7b5,
+ 0xffbdbebd, 0xffc0c0c0, 0xffc0c0c0, 0xffc5c2c5, 0xffc8c5c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5,
+ 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce,
+ 0xffd0d0d0, 0xffcecece, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffd6d2d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd9dcd9, 0xffd9dcd9, 0xffd9dcd9,
+ 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedbde, 0xffdeddde,
+ 0xffdedcde, 0xffdedcde, 0xffdddddd, 0xffdbdddd, 0xffdbdddc, 0xffdbdddc, 0xffdddbdd, 0xffdedbde,
+ 0xffdfdbdf, 0xffe0dbdf, 0xffdcdadc, 0xffd7dadc, 0xffd8d9d9, 0xffdad9da, 0xffdbd9db, 0xffd6d9d6,
+ 0xffd6d9d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6,
+ 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd0d0d0, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcbcccb, 0xffcbcccb, 0xffc8c9c8, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffbdbabd, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x77161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a,
+ 0x995d5c5d, 0x99605e60, 0x99636163, 0x99636163, 0x99636463, 0x99636563, 0x99636563, 0x99636563,
+ 0x996b676b, 0x996b676b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b,
+ 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x996e7070, 0x996e7070, 0x99737173, 0x99737173,
+ 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737473, 0x99737573, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737773, 0x99737773, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x997b7979, 0x997b7979, 0x997b7979, 0x997b7979, 0x997b797b, 0x997b7c7b, 0x997b7c7b, 0x997b7b7b,
+ 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7b7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997e7c7b, 0x997e7c7b, 0x99817f7b, 0x997e7c7b, 0x99797b79, 0x99797b79, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x99797b79, 0x99767876, 0x99797b79, 0x99797b79, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737473, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b,
+ 0x99686b68, 0x99656865, 0x99656865, 0x99656865, 0x99636563, 0x99606160, 0x995d5d5d, 0x995d5d5d,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x99686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffbdbebd, 0xffc0c0c0, 0xffc5c2c5, 0xffc5c2c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5, 0xffcbc8c5,
+ 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6,
+ 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9dcd9, 0xffd9dcd9, 0xffd9dcd9, 0xffdbdddb,
+ 0xffdedcde, 0xffdeddde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedfde, 0xffdedfde, 0xffdeddde,
+ 0xffdeddde, 0xffdeddde, 0xffe1dee1, 0xffdfdedf, 0xffdddfdd, 0xffdddddc, 0xffdddcdd, 0xffdddfe0,
+ 0xffdfdedf, 0xffdfdcdf, 0xffdfdcdf, 0xffdfdbdf, 0xffdfdbde, 0xffdfdbdf, 0xffdcd9dc, 0xffd6d9d6,
+ 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6,
+ 0xffd6d7d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcbcccb, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x77161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a,
+ 0x99605e60, 0x99605e60, 0x99636163, 0x99636163, 0x99636563, 0x99636563, 0x99636563, 0x99636563,
+ 0x996b676b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b,
+ 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x9973716b, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99737173, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737773, 0x99737773, 0x99737773, 0x99737973, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99797b79, 0x997b7d7b,
+ 0x997b7979, 0x997b7d7b, 0x997b7979, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997e7c7b, 0x99817f7b, 0x99817f7b, 0x997e7c7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79,
+ 0x997b7d7b, 0x997b7b7b, 0x997b7d7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x997b7d7b, 0x99797b79, 0x997b7d7b, 0x99797b79, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x9973797b, 0x99737776, 0x99737776, 0x99737776,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737373, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b,
+ 0x996b6d6b, 0x99686b68, 0x99656865, 0x99656865, 0x99636563, 0x99606160, 0x99606160, 0x995d5d5d,
+ 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x88686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffc0c0c0, 0xffc0c0c0, 0xffc3c1c3, 0xffc5c2c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5, 0xffcbc8c5,
+ 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, 0xffcecece, 0xffcecdce, 0xffcecece, 0xffcecece,
+ 0xffd0d0d0, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3,
+ 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6,
+ 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9dcd9, 0xffd9dcd9, 0xffdbdddb, 0xffdedfde,
+ 0xffdeddde, 0xffdedfde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdfdee0, 0xffe1dfe1, 0xffe2dfe2, 0xffe2dfe2, 0xffe4dfe4, 0xffe2dee1, 0xffdddee2,
+ 0xffdedddf, 0xffdedcdf, 0xffdedcdf, 0xffdfdedf, 0xffdfdede, 0xffdedede, 0xffdedbde, 0xffd5dbd5,
+ 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcecece, 0xffcbcccb, 0xffcbcccb, 0xffc8c9c8, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c,
+ 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a,
+ 0x995a5d5a, 0x995d605d, 0x99606260, 0x99606260, 0x99656465, 0x99686768, 0x99686768, 0x99686768,
+ 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996e6f6e, 0x996b6d6b, 0x996e6f6e,
+ 0x99737173, 0x996e6f73, 0x99707073, 0x99707073, 0x99737373, 0x99737173, 0x99737473, 0x99737473,
+ 0x99737573, 0x99737573, 0x99737776, 0x99737776, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x997b7876, 0x997b7876, 0x997b7876, 0x997b7876, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b797b,
+ 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e,
+ 0x997e807e, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7c7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99767876, 0x99767876, 0x99767876,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737373,
+ 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x99636563, 0x99606160, 0x995d5d5d, 0x995d5d5d,
+ 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000400, 0x00000400, 0x886e6d6e, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc3c4c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8,
+ 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0,
+ 0xffd0d1d6, 0xffd0d1d6, 0xffd0d1d6, 0xffd0d1d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9,
+ 0xffdedbd6, 0xffdedbd6, 0xffdedcd9, 0xffdedcd9, 0xffdedcde, 0xffdedbde, 0xffdeddde, 0xffdedcde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffe1e0e1, 0xffe6e3e6, 0xffe1e0e1, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffdddfdd,
+ 0xffe1dfe1, 0xffe3e0e3, 0xffe4e1e4, 0xffe3e0e3, 0xffe4e1e4, 0xffe4dfe4, 0xffe5dfe4, 0xffe5dee5,
+ 0xffe6dfe5, 0xffe6dfe5, 0xffe4dfe3, 0xffe0dee0, 0xffdfdedf, 0xffdfdede, 0xffdededf, 0xffdedcdb,
+ 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffd9d8d9, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd0d1d0,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c,
+ 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a,
+ 0x995a5d5a, 0x995d605d, 0x99606260, 0x99636563, 0x99656465, 0x99656465, 0x99686768, 0x996b696b,
+ 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99737173, 0x99707070, 0x99707070, 0x99737173,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737373, 0x99737473, 0x99737473,
+ 0x99737573, 0x99737573, 0x99737776, 0x99737879, 0x99797879, 0x99767776, 0x99767776, 0x99767776,
+ 0x997b7b79, 0x997b7876, 0x997b7876, 0x997b7876, 0x997b797b, 0x997b797b, 0x997b7c7b, 0x997b7c7b,
+ 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99817f81, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e,
+ 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x997e7f7e,
+ 0x99818081, 0x99818081, 0x99848284, 0x99848284, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e,
+ 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7c7b, 0x997b7b7b, 0x997b797b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99767876, 0x99767876,
+ 0x99797879, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e,
+ 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99636563, 0x99606160, 0x995d5d5d,
+ 0x995a5552, 0x99524e4d, 0x994a4847, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000400, 0x00000400, 0x776e6d6e, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb,
+ 0xffceccce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced1d3, 0xffced1d3, 0xffced2d6,
+ 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6dbd6, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9,
+ 0xffdedcd9, 0xffdedcd9, 0xffdedcd9, 0xffdedcd9, 0xffdedcde, 0xffdedcde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffe4e1e4, 0xffe4e1e4, 0xffe1e0e1, 0xffe1e0e1, 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe0e0e0,
+ 0xffe3e0e3, 0xffe3e0e3, 0xffe4e1e4, 0xffe5e2e5, 0xffe4e1e4, 0xffe4dfe4, 0xffe5e0e5, 0xffe5e2e5,
+ 0xffe6e2e5, 0xffe6e2e5, 0xffe6dfe6, 0xffe0dedf, 0xffdfdedf, 0xffdfdedf, 0xffdfdede, 0xffdfdcdd,
+ 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffdedbde, 0xffdbd9db, 0xffd9d8d9, 0xffd9d8d9, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd0d1d0,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c,
+ 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a,
+ 0x995d605d, 0x99606260, 0x99606260, 0x99606260, 0x99656465, 0x99686768, 0x99686768, 0x996b696b,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6c6b, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737776, 0x99737776, 0x99737776, 0x9973797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7b79, 0x997b7b79, 0x997b7b79, 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99817f81,
+ 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e, 0x99818081, 0x99818081, 0x99818081, 0x997e7f7e,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818381, 0x997e807e, 0x99818381, 0x997e807e,
+ 0x99848284, 0x99818081, 0x99818081, 0x99818081, 0x99848284, 0x997e7f7e, 0x99818081, 0x99818081,
+ 0x99818081, 0x997e7f7e, 0x99818081, 0x99818081, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x99797879, 0x99767776, 0x99797879, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e,
+ 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99636563, 0x995d5d5d, 0x995d5d5d,
+ 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000,
+ 0x00000400, 0x00000400, 0x66373937, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffc0c1c0, 0xffc3c4c3, 0xffc3c4c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb,
+ 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3,
+ 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d5d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6,
+ 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb,
+ 0xffdedcd9, 0xffdedddb, 0xffdedcd9, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee1de, 0xffdee1de, 0xffdee0de, 0xffdee1de,
+ 0xffe1e0e1, 0xffe6e3e6, 0xffe6e3e6, 0xffe4e1e4, 0xffe4e4e4, 0xffe3e3e4, 0xffe3e3e3, 0xffe2e3e2,
+ 0xffe3e3e3, 0xffe4e2e4, 0xffe4e2e4, 0xffe4e2e4, 0xffe5e2e5, 0xffe5e3e5, 0xffe5e2e5, 0xffe5e2e5,
+ 0xffe5e2e5, 0xffe6e2e5, 0xffe6e3e5, 0xffe3e0e3, 0xffe0dfe0, 0xffe0dfdf, 0xffe0dfdf, 0xffe0dede,
+ 0xffdfdddd, 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffdbd9db, 0xffdedbde, 0xffdbd9db, 0xffd6d9d6,
+ 0xffd6d8d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd3d4d3,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffa5a2a5, 0xffa5a2a5, 0xff9c9a9c,
+ 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a,
+ 0x995a5d5a, 0x995d605d, 0x99606260, 0x99606260, 0x99686768, 0x99656465, 0x99686768, 0x996b696b,
+ 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6d6b, 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737776, 0x99737776, 0x99737776, 0x99737776, 0x99797879, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b7b79, 0x997b7b79, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b827b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99848284,
+ 0x99818381, 0x99818381, 0x997e807e, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818381, 0x99818381, 0x99818381, 0x99818381,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848684, 0x99818381, 0x99848684, 0x99818381,
+ 0x99848684, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7f7b, 0x997b827b, 0x997b7f7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x99797b79, 0x997b7d7b, 0x99797b79, 0x99767876,
+ 0x997b797b, 0x997b797b, 0x99797879, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x99737473, 0x99737473, 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99707070, 0x99707070,
+ 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99606160, 0x995d5d5d, 0x995a595a,
+ 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000,
+ 0x00000400, 0x00000400, 0x66373937, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd,
+ 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb,
+ 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced1d3, 0xffced2d6, 0xffced2d6,
+ 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6,
+ 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb,
+ 0xffdedddb, 0xffdedddb, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdee0de, 0xffdee1de, 0xffdee0de, 0xffdee3de, 0xffdee1de, 0xffdee1de, 0xffdee1de, 0xffdee3de,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe3e4e3, 0xffe3e4e3, 0xffe2e4e2, 0xffe3e4e3,
+ 0xffe4e4e3, 0xffe4e3e4, 0xffe4e3e4, 0xffe4e4e5, 0xffe5e5e4, 0xffe5e3e5, 0xffe5e3e5, 0xffe5e2e5,
+ 0xffe6e2e5, 0xffe6e3e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe3e0e3, 0xffe2dfe2, 0xffe0dfdf, 0xffe0dedf,
+ 0xffe0dfdc, 0xffdedcdc, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdbd9db, 0xffd6d9d6,
+ 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd3d4d3,
+ 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c,
+ 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995d5d5d, 0x99606160, 0x99606160, 0x99636563, 0x99656765, 0x99656765, 0x996b696b, 0x996b696b,
+ 0x996b6b6b, 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d73, 0x996e7073, 0x99707373, 0x996e7073,
+ 0x99737373, 0x99737373, 0x99737473, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x99767776, 0x99767776, 0x997b797b, 0x99797879, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7b7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x997b7d7b, 0x997e807e,
+ 0x997e8084, 0x997e8084, 0x997e8084, 0x997e8084, 0x99848284, 0x99848284, 0x99848284, 0x99848384,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848384, 0x99848484, 0x99848484,
+ 0x99898484, 0x99898484, 0x99898484, 0x99898484, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99898789, 0x99868486, 0x99868486, 0x99868486, 0x99868486, 0x99868486, 0x99848284, 0x99868486,
+ 0x99848484, 0x99848384, 0x99848384, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848384,
+ 0x99848384, 0x99848384, 0x99848284, 0x99848284, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x99818081,
+ 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7b7b, 0x997b7c7b,
+ 0x997b7b7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99767876, 0x99767876, 0x99737573,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737073, 0x99736d73,
+ 0x99737173, 0x99706d6e, 0x996e6968, 0x996e6968, 0x99636563, 0x99606060, 0x99606060, 0x995d5a5d,
+ 0x99525152, 0x99525152, 0x99454345, 0x99454345, 0x77080c08, 0x77000000, 0x55000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x66373637, 0xffa5a2a5, 0xffadaaad, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd,
+ 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd0ced0, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdeddde, 0xffdeddde,
+ 0xffdedfde, 0xffdedfde, 0xffdee0e1, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe5e3e5, 0xffe4e5e4, 0xffe3e5e3, 0xffe4e5e3,
+ 0xffe4e6e4, 0xffe5e5e4, 0xffe5e6e5, 0xffe5e7e5, 0xffe5e6e4, 0xffe6e6e5, 0xffe6e6e6, 0xffe6e4e6,
+ 0xffe6e4e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e3e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe5e2e4, 0xffdfdfde,
+ 0xffdfe1df, 0xffdfdede, 0xffdedfde, 0xffdeddde, 0xffdedcde, 0xffdedcde, 0xffdedbde, 0xffd9d9d9,
+ 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d1d6, 0xffd6d1d6, 0xffced2d6, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xff8c8e8c,
+ 0x442f322f, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55000000, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99636563, 0x99636563, 0x99656765, 0x99686868, 0x996b696b,
+ 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x996e7073, 0x99707373,
+ 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776,
+ 0x997b797b, 0x99767776, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997e7f7e, 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x99818381,
+ 0x997e8084, 0x997e8084, 0x99818384, 0x99818384, 0x99848384, 0x99848384, 0x99848384, 0x99848484,
+ 0x99868686, 0x99898a89, 0x99848284, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848484,
+ 0x99898484, 0x99898484, 0x99898484, 0x99868784, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99898789, 0x99898789, 0x99868486, 0x99898789, 0x99898789, 0x99868486, 0x99868486, 0x99868486,
+ 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848484, 0x99848384, 0x99848484, 0x99848384,
+ 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818081, 0x99818081, 0x99818081,
+ 0x99818081, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737073,
+ 0x99706d6e, 0x99706d6e, 0x996e6968, 0x996e6968, 0x99636563, 0x99606060, 0x99606060, 0x995d5a5d,
+ 0x99525152, 0x99525152, 0x99454345, 0x99373637, 0x77050805, 0x77000000, 0x55000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x33373637, 0xffa5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd,
+ 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb,
+ 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd3ced3, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde,
+ 0xffdee0e1, 0xffdedfde, 0xffdee0e1, 0xffdee0e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6,
+ 0xffe6e5e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe5e8e5, 0xffe4e7e4, 0xffe3e7e4, 0xffe4e5e4,
+ 0xffe5e6e5, 0xffe5e6e5, 0xffe5e7e5, 0xffe5e8e6, 0xffe6e7e5, 0xffe6e7e6, 0xffe6e6e6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e3e6, 0xffe6e4e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe4e2e3,
+ 0xffe1e1e1, 0xffdfdfde, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdedbde, 0xffdbdcdb,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d4d6, 0xffd6d1d6, 0xffceced0, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xee8c8e8c,
+ 0x332f322f, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x44000000, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a,
+ 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99606160, 0x99636563, 0x99656765, 0x99686868, 0x996b696b,
+ 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x996e7073, 0x99707373,
+ 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99797879, 0x99797879,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x997b7d7b,
+ 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e807e, 0x99818381, 0x99818381, 0x99818381,
+ 0x99818384, 0x99818384, 0x99818384, 0x99818384, 0x99848384, 0x99848684, 0x99848684, 0x99848484,
+ 0x99868686, 0x99868686, 0x99868686, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99868784, 0x99868784, 0x99868784, 0x99868784, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99898789, 0x99898789, 0x99898789, 0x99898789, 0x998c8a8c, 0x99898789, 0x99898789, 0x99898789,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848484, 0x99848684, 0x99848484, 0x99848484, 0x99848384,
+ 0x99848484, 0x99848384, 0x99848384, 0x99848484, 0x99848284, 0x99848284, 0x99818081, 0x99848284,
+ 0x99818081, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b,
+ 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99767876, 0x99767876,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737073,
+ 0x99706d6e, 0x99706d6e, 0x996e6968, 0x996b6563, 0x99636563, 0x99606060, 0x995d5a5d, 0x995a555a,
+ 0x99525152, 0x99454345, 0x99454345, 0x88292829, 0x77030403, 0x77000000, 0x44000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0xffa5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd,
+ 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb,
+ 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd3ced3, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffdedbde, 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdee0e1, 0xffdee0e1, 0xffdee1e4, 0xffdee1e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4,
+ 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6,
+ 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe8e9e7, 0xffebeae9, 0xffeeeaed,
+ 0xffe9e7e8, 0xffe9e8ea, 0xffe6e8e8, 0xffe6e8e6, 0xffe6e9e6, 0xffe6e8e6, 0xffe7e9e7, 0xffe7e7e5,
+ 0xffe6e6e5, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e4e6, 0xffe6e6e6, 0xffe6e3e5, 0xffe5e3e5, 0xffe5e1e4,
+ 0xffe1e1e1, 0xffdfe1df, 0xffdee0de, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdedcde, 0xffdbdcdb,
+ 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d7d6, 0xffd6d4d6,
+ 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffceced0, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5,
+ 0xffc3c2c3, 0xffc0bec0, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xdd8c8e8c,
+ 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x44000000, 0x882c2b2c, 0x99424142, 0x99424542, 0x99424542, 0x994a4c4a, 0x995a595a,
+ 0x995a595a, 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99636563, 0x99656765, 0x996b696b, 0x996b696b,
+ 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x99707373, 0x99707373,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x99848284, 0x99818381, 0x99818381, 0x99818381, 0x99818381,
+ 0x99818384, 0x99818384, 0x99818384, 0x99818384, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99868686, 0x99868686, 0x99868686, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99848a84, 0x99868784, 0x99868784, 0x99848a84, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x998c8a8c, 0x99898789, 0x99898789, 0x998c8a8c, 0x998c8a8c, 0x99898789, 0x99898789, 0x99898789,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99767876,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737073,
+ 0x99706d6e, 0x996e6968, 0x996e6968, 0x996b6563, 0x99606060, 0x99606060, 0x995d5a5d, 0x995a555a,
+ 0x99525152, 0x99454345, 0x99454345, 0x88292829, 0x77030403, 0x77000000, 0x33000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xdda5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd,
+ 0xffbdbabd, 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb,
+ 0xffcecece, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdee0e1, 0xffdee1e4, 0xffdee3e6, 0xffdee3e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e7e6,
+ 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe7e9e7, 0xffe8e8e8,
+ 0xffeaece9, 0xffe7e9e6, 0xffe6e9e6, 0xffe6ebe6, 0xffe6e9e6, 0xffe7e9e7, 0xffe9e9e9, 0xffe7e7e6,
+ 0xffe6e6e6, 0xffe6e7e7, 0xffe7e4e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e4e5, 0xffe5e3e5, 0xffe4e1e4,
+ 0xffe2e1e2, 0xffdfe0df, 0xffdee0de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdeddde, 0xffdedfde,
+ 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d4d6, 0xffd6d1d6, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffcec6c5, 0xffc3c2c3,
+ 0xffc3c2c3, 0xffc0bec0, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xff9c9e9c, 0xff9c9e9c, 0xbb5d605d,
+ 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x22000000, 0x77262826, 0x993a3d3a, 0x99424142, 0x99424142, 0x994d4c4d, 0x99525152,
+ 0x99525452, 0x995a5a5a, 0x99636163, 0x99636163, 0x99656565, 0x99656565, 0x996b696b, 0x996b696b,
+ 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737173, 0x99737473,
+ 0x99737576, 0x99737576, 0x99737576, 0x99737576, 0x99767876, 0x99797b79, 0x99797b79, 0x99797b79,
+ 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x997e807e,
+ 0x99848084, 0x99848084, 0x99848384, 0x99848384, 0x99868486, 0x99868486, 0x99868486, 0x99868486,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99868786, 0x99868786, 0x99868786, 0x99848684,
+ 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886,
+ 0x998c888c, 0x998c888c, 0x998c888c, 0x998c888c, 0x99898a89, 0x99868686, 0x99898a89, 0x99898a89,
+ 0x998c888c, 0x998c888c, 0x998c888c, 0x998c8b8c, 0x99898b89, 0x99868886, 0x99868886, 0x99868886,
+ 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99868786,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848284, 0x99868686, 0x99848284, 0x99848284,
+ 0x99848384, 0x99848384, 0x99848284, 0x99848284, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b,
+ 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x997b797b,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x99707370, 0x996e706e,
+ 0x996b6d6b, 0x99686968, 0x99656565, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658,
+ 0x994a494a, 0x994a494a, 0x994a494a, 0x77191b19, 0x77000000, 0x77000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xaa736d73, 0xff9fa29f, 0xff9fa29f, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc5c2c5, 0xffc8c6c8, 0xffc8c6c8, 0xffcecace, 0xffcecace,
+ 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdedcde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e8e9, 0xffe6e8e9, 0xffe6e7e6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e7e6,
+ 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffedeaed, 0xffede9ed,
+ 0xffeae8e9, 0xffe5e7e9, 0xffe8e7e9, 0xffe7e7e6, 0xffe6e6e6, 0xffe6e6e5, 0xffe5e6e5, 0xffe3e4e3,
+ 0xffe3e3e3, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e0e1, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedddb,
+ 0xffdedddb, 0xffdedcd9, 0xffdedcd9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc5c2c5,
+ 0xffc5c2c5, 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x774a4d4a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x66131413, 0x993a3d3a, 0x99424142, 0x99424142, 0x99474647, 0x994d4c4d,
+ 0x99525452, 0x995a5a5a, 0x995a5a5a, 0x99636163, 0x99656565, 0x99656565, 0x99656565, 0x996b696b,
+ 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737173, 0x99737373,
+ 0x99737573, 0x99737576, 0x99737576, 0x99737576, 0x99767876, 0x99767876, 0x99767876, 0x99797b79,
+ 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x99817f81, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x99868486, 0x99868486, 0x99868486, 0x99868486,
+ 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99898889, 0x99868786, 0x99868786,
+ 0x99868886, 0x99868886, 0x99898b89, 0x99898b89, 0x99868886, 0x99898b89, 0x99898b89, 0x99898b89,
+ 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898a89, 0x99898a89, 0x99898a89, 0x99898a89,
+ 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99868886, 0x99898b89, 0x99868886, 0x99868886,
+ 0x99898889, 0x99898889, 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99868786,
+ 0x99848684, 0x99868786, 0x99898889, 0x99848684, 0x99868686, 0x99848284, 0x99868686, 0x99868686,
+ 0x99848384, 0x99848484, 0x99848284, 0x99848384, 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7b7b, 0x997b7b7b,
+ 0x997b797b, 0x99797879, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x99707370, 0x996b6d6b,
+ 0x99686968, 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99585658,
+ 0x994a494a, 0x994a494a, 0x99313231, 0x77000400, 0x77000000, 0x66000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x554d494d, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f, 0xffb5b6b5,
+ 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffcecace,
+ 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d5d6,
+ 0xffd6d7d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde,
+ 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffdee0de, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1,
+ 0xffe6e5e6, 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e9ec, 0xffe6e8e9, 0xffe6e9ec, 0xffe6e9ec, 0xffe9e9e9, 0xffececec, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffefece9, 0xffefebe6, 0xffefece9, 0xffefece9, 0xffefebef, 0xffefecef, 0xffefecef, 0xffefecef,
+ 0xffefecef, 0xffefecef, 0xffefecef, 0xffefecef, 0xffefebef, 0xffeeecef, 0xffeeeced, 0xffede9ed,
+ 0xffede9ed, 0xffede7ec, 0xffece7ec, 0xffeae7ea, 0xffe7e7e7, 0xffe6e6e6, 0xffe5e6e5, 0xffe3e5e3,
+ 0xffe3e4e3, 0xffe4e4e4, 0xffe1e1e1, 0xffe1e0e1, 0xffe1e0e1, 0xffe1e0e1, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedddb, 0xffdedddb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6,
+ 0xffd3d4d3, 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc5c2c5,
+ 0xffbdbcbd, 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x44313331,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55000000, 0x993a3d3a, 0x99424142, 0x99424142, 0x99424142, 0x994d4c4d,
+ 0x99525452, 0x995a5a5a, 0x995a5a5a, 0x995a5a5a, 0x99606160, 0x99606160, 0x99656565, 0x996b696b,
+ 0x996b696b, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737373, 0x99737373,
+ 0x99737573, 0x99737576, 0x99737576, 0x99737579, 0x99767876, 0x99767876, 0x99797b79, 0x997b7d7b,
+ 0x99817f81, 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x997e807e, 0x997e807e, 0x99818381, 0x99818381,
+ 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x99868486, 0x99898789, 0x99868486, 0x99898789,
+ 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99898889, 0x99898889, 0x998c8a8c, 0x99898889,
+ 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89,
+ 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8e8c, 0x998c8e8c, 0x99898a89, 0x998c8e8c, 0x99898a89,
+ 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898b89, 0x99898b89, 0x99898b89, 0x99868886,
+ 0x998c8a8c, 0x998c8a8c, 0x99898889, 0x99868786, 0x998c8a8c, 0x99898889, 0x99868786, 0x99868786,
+ 0x99868786, 0x99898889, 0x998c8a8c, 0x99868786, 0x99868686, 0x99868686, 0x99868686, 0x99868686,
+ 0x99848484, 0x99848484, 0x99848484, 0x99848384, 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e,
+ 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7b7b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x996e706e, 0x996b6d6b,
+ 0x99686968, 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99525152,
+ 0x994a494a, 0x994a494a, 0x88313231, 0x77000400, 0x77000000, 0x55000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22262426, 0xee9fa29f, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f,
+ 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffc3c2c3, 0xffc3c2c3, 0xffc8c6c8, 0xffcecace,
+ 0xffcecace, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d6, 0xffd6d5d6,
+ 0xffd6d8d6, 0xffd6d7d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4,
+ 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e7e6, 0xffe9e8e9, 0xffe6e7e6, 0xffe9e8e9,
+ 0xffe6e9ec, 0xffe6e9ec, 0xffe6e9ec, 0xffe6e9ec, 0xffececec, 0xffececec, 0xffececec, 0xffececec,
+ 0xffefedec, 0xffefece9, 0xffefece9, 0xffefece9, 0xffefecef, 0xffefecef, 0xffefedef, 0xffefecef,
+ 0xffefedef, 0xffefedef, 0xffefedef, 0xffefefef, 0xffefedef, 0xffefedef, 0xffeeecee, 0xffeee9ee,
+ 0xffede9ed, 0xffedeaec, 0xffeceaec, 0xffe9eae9, 0xffe8e7e8, 0xffe7e7e7, 0xffe7e5e7, 0xffe4e4e4,
+ 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e1e4, 0xffe4e1e4, 0xffe1e0e1, 0xffe1e0e1, 0xffdedfde,
+ 0xffdedfde, 0xffdedddb, 0xffdedcd9, 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6,
+ 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffbdc2c5, 0xffc5c2c5,
+ 0xffbdbcbd, 0xffb5b5b5, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xff8f908f, 0xbb707370, 0x11191a19,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x33000000, 0x77131413, 0x99424142, 0x99424142, 0x99424142, 0x99424142,
+ 0x994a4d4a, 0x99525452, 0x99525452, 0x995a5a5a, 0x995a5d5a, 0x99606160, 0x99656565, 0x99656565,
+ 0x996b696b, 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x99737173, 0x99737173, 0x99737373, 0x99737573,
+ 0x99737576, 0x99737576, 0x99737576, 0x99737579, 0x99767876, 0x99797b79, 0x997b7d7b, 0x997b7d7b,
+ 0x99817f81, 0x997e7c7e, 0x99817f81, 0x99848284, 0x997e807e, 0x99818381, 0x99818381, 0x99818381,
+ 0x99848384, 0x99848684, 0x99848684, 0x99848684, 0x99898789, 0x99898789, 0x99898789, 0x998c8a8c,
+ 0x99898889, 0x99868786, 0x99898889, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x99898b89, 0x99898b89, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x998c8e8c,
+ 0x998c8b8c, 0x998c8e8c, 0x998c8b8c, 0x998c8b8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x99898b89,
+ 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99898889, 0x99898889,
+ 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99898a89, 0x99868686, 0x99868686, 0x99868686,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99818381, 0x99818381, 0x99818381, 0x997e807e,
+ 0x99848284, 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997b797b, 0x99797879, 0x99767776, 0x99767776, 0x99737573, 0x996e706e, 0x996b6d6b, 0x996b6d6b,
+ 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99585658, 0x99525152,
+ 0x994a494a, 0x994a494a, 0x77191b19, 0x77000400, 0x77000000, 0x33000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x99737973, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f,
+ 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbebd, 0xffc3c2c3, 0xffc8c6c8, 0xffc8c6c8,
+ 0xffcecace, 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdeddde, 0xffdedfde, 0xffdedfde,
+ 0xffdee1de, 0xffdedfde, 0xffdee0de, 0xffdee3de, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e7e6,
+ 0xffe6e5e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe9e8e9, 0xffe9e8e9, 0xffe9e8e9, 0xffefebef,
+ 0xffe6ebef, 0xffe6e9ec, 0xffe6ebef, 0xffe6ebef, 0xffececec, 0xffececec, 0xffececec, 0xffececec,
+ 0xffefedec, 0xffefedec, 0xffefefef, 0xffefefef, 0xffefedef, 0xffefefef, 0xffefedef, 0xffefefef,
+ 0xffefedef, 0xffefefef, 0xffefedef, 0xffefedef, 0xffefedef, 0xffefedef, 0xffeeedef, 0xffeeeded,
+ 0xffeeebed, 0xffece9eb, 0xffeaeaea, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe6e7e7, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e3e6, 0xffe4e1e4, 0xffe6e3e6, 0xffe1e0e1, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6,
+ 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc3c6c8, 0xffbdc2c5, 0xffbdbcbd,
+ 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x66525552, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x55080408, 0x882c2b2c, 0x99424142, 0x99424142, 0x99424142,
+ 0x99424142, 0x994d4e4d, 0x99525552, 0x99525552, 0x995a5a5d, 0x99636163, 0x99636163, 0x99636163,
+ 0x9968686e, 0x9968686e, 0x996b6d73, 0x996b6d73, 0x99736d6b, 0x9973706e, 0x99737370, 0x99737573,
+ 0x99737573, 0x99767776, 0x99767776, 0x997b797b, 0x997b797b, 0x997b797b, 0x997e7c7e, 0x997e7c7e,
+ 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x99848684, 0x99848684, 0x99848684, 0x99868786, 0x998c8886, 0x998c8886, 0x998c8886, 0x998c8b89,
+ 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998f8c8f, 0x998f8c8f, 0x998c8a8c, 0x998c8a8c,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998f908f, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998f8c8f, 0x998c8a8c, 0x998f8c8f, 0x998c8a8c, 0x998c8e8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x9986888c, 0x9986888c, 0x9986888c, 0x9986888c, 0x998c8886, 0x998c8886, 0x998c8886, 0x998c8886,
+ 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848384,
+ 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79,
+ 0x9973797b, 0x9973797b, 0x99737779, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968,
+ 0x9963656b, 0x9963656b, 0x99606065, 0x99606065, 0x995a5d5a, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a,
+ 0x994a494a, 0x88343234, 0x77080408, 0x77080408, 0x66000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000400, 0xdda5a2a5, 0xffa5a2a5, 0xffa5a2a5,
+ 0xffaaa9aa, 0xffafafaf, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffc8cacb, 0xffcbced0, 0xffcbced0, 0xffcbced0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d4d3, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdeddde,
+ 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6, 0xffe6e5e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe9e9e9, 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefece9,
+ 0xffefebef, 0xffefebef, 0xffefebef, 0xffefedf1, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xfff1f2f1, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xfff3f2f2, 0xfff1efef,
+ 0xfff1eeef, 0xffeeebec, 0xffeeebee, 0xffebe9ea, 0xffe9e9e9, 0xffe6e7e7, 0xffe6e7e6, 0xffe6e8e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe1e1e1, 0xffe1e1e1, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdbdddb, 0xffd6dbde, 0xffd6dbde, 0xffd6d8db, 0xffd6d5d9, 0xffd6d7de,
+ 0xffd0d1d6, 0xffd0d1d6, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffc0c2c0, 0xffbdbebd,
+ 0xffb5b5b5, 0xffb5b5b5, 0xffadabad, 0xffa5a6a5, 0xffa5a6a5, 0xcc707170, 0x11080808, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x33000000, 0x66161616, 0x99424142, 0x99424142, 0x99424142,
+ 0x99424142, 0x99474847, 0x994d4e4d, 0x99525552, 0x995a5a5d, 0x995a5a5d, 0x99636163, 0x99636163,
+ 0x9968686e, 0x9968686e, 0x9968686e, 0x996b6d73, 0x99736d6b, 0x99737370, 0x99737573, 0x99737573,
+ 0x99767776, 0x99767776, 0x99767776, 0x997b797b, 0x997e7c7e, 0x99817f81, 0x997e7c7e, 0x99817f81,
+ 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, 0x99848284, 0x99848686, 0x99848686, 0x99848686,
+ 0x99848684, 0x99868786, 0x99868786, 0x99868786, 0x998c8886, 0x998c8886, 0x998c8b89, 0x998c8b89,
+ 0x998c8c8f, 0x998c8c8f, 0x998c8a8c, 0x998c8c8f, 0x998f8c8f, 0x99918f91, 0x998f8c8f, 0x99918f91,
+ 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f,
+ 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f,
+ 0x998f908f, 0x998f908f, 0x998c8e8c, 0x998f908f, 0x998c8e8c, 0x998f908f, 0x998f908f, 0x998c8e8c,
+ 0x99918f91, 0x998f8c8f, 0x998f8c8f, 0x998f8c8f, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8a8c,
+ 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x998c8b89, 0x998c8886, 0x998c8b89, 0x998c8886,
+ 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99818381, 0x99818381, 0x99818381, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79,
+ 0x9973797b, 0x99737779, 0x99737779, 0x99737476, 0x99737173, 0x996e6d6e, 0x99686968, 0x99686968,
+ 0x9963656b, 0x9963656b, 0x99606065, 0x995d5a60, 0x995a5d5a, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a,
+ 0x99343234, 0x771e1b1e, 0x77080408, 0x77080408, 0x33000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x55373937, 0xeea5a2a5, 0xffa5a2a5,
+ 0xffa5a2a5, 0xffaaa9aa, 0xffafafaf, 0xffb5b6b5, 0xffbdbcbd, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffc8cacb, 0xffc8cacb, 0xffc8cacb, 0xffced2d6, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdeddde, 0xffdee0de, 0xffdeddde, 0xffdee0de,
+ 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e7e6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffefebe6, 0xffefebe6, 0xffefece9, 0xffefece9,
+ 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffefefef, 0xfff1f0f1, 0xffefefef, 0xfff1f0f1,
+ 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1,
+ 0xfff4f4f4, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff4f4f4, 0xfff1f2f1, 0xfff2f2f1, 0xfff1f0f0,
+ 0xfff1efef, 0xffefeded, 0xffede9ed, 0xffece9ec, 0xffeae9ea, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdbdddb, 0xffd6dbde, 0xffd6d8db, 0xffd6d8db, 0xffd6d5d9, 0xffd0d1d6,
+ 0xffd0d1d6, 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffbabeba, 0xffbdbebd,
+ 0xffb5b5b5, 0xffb5b5b5, 0xffadabad, 0xffa5a6a5, 0xdda5a6a5, 0x443c3d3c, 0x00080808, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x55000000, 0x77161616, 0x99424142, 0x99424142,
+ 0x99424142, 0x99424142, 0x99474847, 0x994d4e4d, 0x99525458, 0x995a5a5d, 0x99636163, 0x99636163,
+ 0x99656268, 0x9968686e, 0x9968686e, 0x996b6d73, 0x9973706e, 0x99737370, 0x99737573, 0x99737573,
+ 0x99767776, 0x99767776, 0x997b797b, 0x997b797b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99817f81,
+ 0x997e807e, 0x997e807e, 0x99818381, 0x99818381, 0x99848686, 0x99848686, 0x99848686, 0x99848686,
+ 0x99868786, 0x99868786, 0x998c8a8c, 0x998c8a8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8b89,
+ 0x998c8c8f, 0x998c8c8f, 0x998c8c8f, 0x998c8f91, 0x99918f91, 0x99918f91, 0x99949294, 0x99949294,
+ 0x99919091, 0x99919091, 0x998f8f8f, 0x99919091, 0x998f908f, 0x99919391, 0x998f908f, 0x99919391,
+ 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f, 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f,
+ 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f,
+ 0x99918f91, 0x99918f91, 0x99918f91, 0x99918f91, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8886,
+ 0x998c8a8c, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848484,
+ 0x99818381, 0x99818381, 0x99818381, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x99797b79, 0x99797b79,
+ 0x99737779, 0x99737779, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968, 0x99636563,
+ 0x9963656b, 0x99606065, 0x99606065, 0x995d5a60, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a, 0x994a4c4a,
+ 0x771e1b1e, 0x77080408, 0x77080408, 0x55080408, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x886e6d6e, 0xffa5a2a5,
+ 0xffa5a2a5, 0xffa5a2a5, 0xffaaa9aa, 0xffafafaf, 0xffb5b5b5, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffc5c6c5, 0xffc8cacb, 0xffc8cacb, 0xffcbced0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdee0de, 0xffdee0de, 0xffdee0de, 0xffdee0de,
+ 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffececec, 0xffececec, 0xffefedec, 0xffefece9, 0xffefedec, 0xffefedec,
+ 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffeff0f4, 0xfff1f0f1, 0xfff1f0f1, 0xfff4f2f4, 0xfff4f2f4,
+ 0xfff1f2f1, 0xfff4f4f4, 0xfff1f2f1, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4,
+ 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff2f1f1,
+ 0xfff0edee, 0xffeceae9, 0xffeae8e7, 0xffeae7ea, 0xffe8e6e8, 0xffeae9ea, 0xffe9e9e9, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffdedfde,
+ 0xffdedfde, 0xffdbdddb, 0xffdbdddb, 0xffd6d8db, 0xffd6d8db, 0xffd6d5d9, 0xffd6d2d6, 0xffd0d1d6,
+ 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffbabeba, 0xffbabeba, 0xffb5b5b5,
+ 0xffb5b5b5, 0xffadabad, 0xffadabad, 0xeea5a6a5, 0x773c3d3c, 0x00080808, 0x00080808, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x55000000, 0x77161616, 0x99424142,
+ 0x99424142, 0x99424142, 0x99424142, 0x99474847, 0x994a4d52, 0x99525458, 0x995a5a5d, 0x99636163,
+ 0x99656268, 0x99656268, 0x9968686e, 0x9968686e, 0x99736d6b, 0x9973706e, 0x99737370, 0x99737573,
+ 0x99737573, 0x99767776, 0x99797879, 0x997b797b, 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x99848284,
+ 0x99818381, 0x99818381, 0x99818381, 0x99848684, 0x99848686, 0x99848686, 0x99848686, 0x99848a89,
+ 0x99898889, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8b89, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998c8f91, 0x998c8f91, 0x998c8f91, 0x998c9294, 0x99949294, 0x99949294, 0x99949294, 0x99949294,
+ 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99919391, 0x99919391, 0x99919391, 0x99919391,
+ 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391,
+ 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x998f908f,
+ 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998c928c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8b89,
+ 0x998c8a8c, 0x998c8a8c, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99818381, 0x99818381, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79, 0x99767876,
+ 0x99737476, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968, 0x99686968, 0x99636563,
+ 0x99606065, 0x99606065, 0x995d5a60, 0x995a555a, 0x994a4c4a, 0x994a4c4a, 0x994a4c4a, 0x77292829,
+ 0x77080408, 0x77080408, 0x66080408, 0x11080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x996e6d6e,
+ 0xeea5a2a5, 0xffa5a2a5, 0xffa5a2a5, 0xffaaa9aa, 0xffadaead, 0xffb5b5b5, 0xffbdbcbd, 0xffc5c2c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc8cacb, 0xffcbced0, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdeddde, 0xffdeddde, 0xffdee0de, 0xffdee3de,
+ 0xffe4e4e4, 0xffe6e7e6, 0xffe4e4e4, 0xffe6e7e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6ebe6,
+ 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffeff0f4, 0xffeff0f4, 0xffeff0f4, 0xffeff3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7,
+ 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff7f7f7, 0xfff4f4f4, 0xfff4f4f4, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff5f5f4,
+ 0xffefeeeb, 0xffebe8e8, 0xffe8e5e8, 0xffe7e4e8, 0xffe8e5e8, 0xffeae8ea, 0xffe9e9e9, 0xffe6e9e6,
+ 0xffe6e9e6, 0xffe6e7e6, 0xffe6e8e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe1e1e1, 0xffdedfde,
+ 0xffdedfde, 0xffdbdddb, 0xffd6dbd6, 0xffd6d8db, 0xffd6d5d9, 0xffd6d2d6, 0xffd6d2d6, 0xffcbccce,
+ 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc0c2c0, 0xffc0c2c0, 0xffbabeba, 0xffb5bab5, 0xffb5b5b5,
+ 0xffb5b5b5, 0xffadabad, 0xeea5a2a5, 0x773c3d3c, 0x11080808, 0x00080808, 0x00080808, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x55000000, 0x77191419,
+ 0x882f2d2f, 0x99424142, 0x99424142, 0x99424142, 0x993c3b3c, 0x99525152, 0x99525152, 0x99525152,
+ 0x99636163, 0x99636163, 0x99636163, 0x99636163, 0x99636565, 0x996b7173, 0x996b7173, 0x996b7173,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x99868886, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f,
+ 0x99949094, 0x99949094, 0x99949094, 0x999c969c, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x998f9091,
+ 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998f8c8f, 0x99949294, 0x99949294, 0x99949294,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c,
+ 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7973, 0x997b7973, 0x997b7973, 0x997b7973,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99636563, 0x99636563, 0x99636563, 0x99636563,
+ 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x99525152, 0x88373637, 0x771b1b1b, 0x77000000,
+ 0x77000305, 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x77686968, 0xdd9c9e9c, 0xff9c9e9c, 0xff9c9e9c, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad,
+ 0xffb8b9b8, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbde, 0xffdee3e6, 0xffdee3e6, 0xffdee3e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffe9e9e9, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef,
+ 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff6f6f6,
+ 0xffefefef, 0xffeaeae9, 0xffe6e7e7, 0xffe5e4e5, 0xffe5e3e6, 0xffece9ed, 0xffefebef, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffc8c9c8, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xff9c9e9c,
+ 0xff9c9e9c, 0xcc9c9e9c, 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x55000000,
+ 0x66080408, 0x771b181b, 0x99424142, 0x99424142, 0x993c3b3c, 0x993c3b3c, 0x99525152, 0x99525152,
+ 0x99555555, 0x99555555, 0x99636163, 0x99636163, 0x99636565, 0x99636565, 0x996b7173, 0x996b7173,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848384, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x998c8e8c, 0x99868886, 0x998c8e8c, 0x998c8e8c, 0x998f8f8f, 0x99949694, 0x998f8f8f, 0x998f8f8f,
+ 0x99949094, 0x99949094, 0x99949094, 0x99949094, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x998f9091,
+ 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998f8c8f, 0x99949294,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x99868886,
+ 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99848384, 0x99848684, 0x99848684, 0x997e7f7e, 0x997e7f7e,
+ 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99767576, 0x997b7973, 0x997b7973, 0x9973706e, 0x9973706e,
+ 0x99737173, 0x99737173, 0x99656465, 0x99656465, 0x99636563, 0x99636563, 0x99636563, 0x99505150,
+ 0x99525552, 0x99525552, 0x99525552, 0x993a3b3a, 0x771b1b1b, 0x66000000, 0x77000000, 0x77000000,
+ 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x33343534, 0x99686968, 0xee9c9e9c, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad,
+ 0xffb8b9b8, 0xffb8b9b8, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c3, 0xffc5c8c3, 0xffced2ce, 0xffced2ce,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbde, 0xffd9dbde, 0xffdee3e6, 0xffdee3e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e5e6, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff1f0ef, 0xfff7f7f7, 0xfff1f0ef, 0xfff1f0ef,
+ 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff6f7f6,
+ 0xfff2f1f1, 0xffebeaea, 0xffe4e5e5, 0xffe3e1e4, 0xffe6e4e7, 0xffedeaed, 0xffefebef, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffced0ce, 0xffd6d7d6, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffb8b7b8, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xdd9c9e9c,
+ 0x88686968, 0x33343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x44080408, 0x66080408, 0x66080408, 0x771b181b, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c,
+ 0x99474947, 0x99555555, 0x99555555, 0x99555555, 0x995a5958, 0x99636565, 0x99636565, 0x99636565,
+ 0x99686868, 0x996e6f6e, 0x996e6f6e, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x99848384, 0x99848384, 0x99848384, 0x99848384,
+ 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x998f8f8f, 0x99898889, 0x998f8f8f, 0x998f8f8f,
+ 0x99949094, 0x998c8b8c, 0x99949094, 0x99949094, 0x998f908f, 0x99949694, 0x998f908f, 0x99949694,
+ 0x998f908f, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99919291, 0x99919291, 0x99919291,
+ 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99919291, 0x99919291, 0x99919291, 0x99919291,
+ 0x99949694, 0x9991908f, 0x9991908f, 0x9991908f, 0x998f9091, 0x998f9091, 0x998f9091, 0x998f9091,
+ 0x998f8e8f, 0x998f8e8f, 0x998f8e8f, 0x99949294, 0x99949294, 0x998f8c8f, 0x998f8c8f, 0x998f8c8f,
+ 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99818381,
+ 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x997e7f7e, 0x997e7f7e, 0x99797879, 0x99797879,
+ 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x9973706e, 0x9973706e, 0x996b6768, 0x996b6768,
+ 0x99656465, 0x99656465, 0x99656465, 0x99585658, 0x99505150, 0x99505150, 0x99505150, 0x99505150,
+ 0x993a3b3a, 0x993a3b3a, 0x77212221, 0x66080808, 0x77000000, 0x77000000, 0x77000000, 0x44000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x44343534, 0xaa7b797b, 0xeeadaaad, 0xffadaaad, 0xffadaaad,
+ 0xffaaabaa, 0xffaaabaa, 0xffb8b9b8, 0xffb8b9b8, 0xffbdbdb8, 0xffc5c8c3, 0xffc5c8c3, 0xffc5c8c3,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d2d6, 0xffd9dbde, 0xffd9dbde, 0xffd9dbde,
+ 0xffe1e0e1, 0xffe1e0e1, 0xffe1e0e1, 0xffe6e7e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef,
+ 0xfff1f3f1, 0xffecefec, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff1f3f1, 0xfff7f7f7,
+ 0xfff4f3f4, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff4f3f4, 0xfff7f7f7, 0xfff4f3f4,
+ 0xfff5f5f4, 0xffeeedec, 0xffe4e4e5, 0xffe1e1e2, 0xffe3e1e3, 0xffe5e4e6, 0xffe6e4e6, 0xffe1dfde,
+ 0xffe1dfde, 0xffe1dfde, 0xffe1dfde, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffced0ce,
+ 0xffced0ce, 0xffced0ce, 0xffc5c5c5, 0xffc8c9c8, 0xffc8c9c8, 0xffbabcba, 0xffbabcba, 0xffb8b7b8,
+ 0xffb8b7b8, 0xffb8b7b8, 0xffaaa9aa, 0xffb5b2b5, 0xeeb5b2b5, 0xdd7b7b7e, 0x997b7b7e, 0x33343534,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x22080408, 0x55080408, 0x66080408, 0x66101010, 0x77101010, 0x88262626, 0x883c3b3c,
+ 0x993a3d3a, 0x993a3d3a, 0x99474947, 0x99474947, 0x99524d4a, 0x99524d4a, 0x995a5958, 0x995a5958,
+ 0x99636163, 0x99636163, 0x99636163, 0x99686868, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b,
+ 0x99737173, 0x99737173, 0x99797879, 0x99797879, 0x99737573, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b,
+ 0x997b7d7b, 0x997b7d7b, 0x99818381, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684,
+ 0x99898b89, 0x99848684, 0x99898b89, 0x99898b89, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c,
+ 0x998c8684, 0x998c8684, 0x998c8684, 0x998c8684, 0x9984868c, 0x9984868c, 0x9984868c, 0x9984868c,
+ 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99898789, 0x99848284, 0x99848284, 0x99848284,
+ 0x99818381, 0x997b7d7b, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b,
+ 0x997b7c7b, 0x997b7c7b, 0x99737573, 0x99737573, 0x99737173, 0x99737173, 0x99737173, 0x99737173,
+ 0x99706d70, 0x99706d70, 0x996b656b, 0x996b656b, 0x99635d63, 0x99635d63, 0x99635d63, 0x99635d63,
+ 0x99585658, 0x99585658, 0x994a494a, 0x994a494a, 0x993c3d3c, 0x993c3d3c, 0x993c3d3c, 0x88292829,
+ 0x77080808, 0x66080808, 0x77080808, 0x77080808, 0x77000000, 0x55000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11191819, 0x33191819, 0x664a494a, 0xbb7b797b,
+ 0xdd9c9e9c, 0xee9c9e9c, 0xffaaabaa, 0xffaaabaa, 0xffb5b2ad, 0xffb5b2ad, 0xffb5b2ad, 0xffbdbdb8,
+ 0xffc5bec5, 0xffc5bec5, 0xffcbc8cb, 0xffcbc8cb, 0xffcecace, 0xffcecace, 0xffcecace, 0xffd3d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffdbd9db, 0xffdbd9db, 0xffd6dbd6, 0xffd6dbd6, 0xffdee0de, 0xffdee0de,
+ 0xffdedfde, 0xffdedfde, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e3de, 0xffe6e3de, 0xffece9e6, 0xffece9e6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffefebe6, 0xffeeeae5, 0xffdedfde, 0xffddddde, 0xffdeddde, 0xffd6d7d6, 0xffd6d7d6, 0xffdbd7d6,
+ 0xffdbd7d6, 0xffdbd7d6, 0xffd6cece, 0xffcecece, 0xffcecece, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5,
+ 0xffc5c5c5, 0xffc5c5c5, 0xffbdbabd, 0xffbabcba, 0xffadaead, 0xffadaead, 0xffadaead, 0xffaaa9aa,
+ 0xffaaa9aa, 0xee9c9a9c, 0xdd9c9a9c, 0xaa7b7b7e, 0x55424347, 0x22080c10, 0x11080c10, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x44000000, 0x55030103, 0x66050305, 0x66080408,
+ 0x66131213, 0x77131213, 0x88262326, 0x883a353a, 0x88313131, 0x99313131, 0x994a494a, 0x994a494a,
+ 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a,
+ 0x99636563, 0x99636563, 0x99636563, 0x99636563, 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d73,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x997b757b, 0x997b757b, 0x997b757b, 0x997b757b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b,
+ 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573,
+ 0x996b716b, 0x996b716b, 0x996b716b, 0x996b716b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b,
+ 0x99636563, 0x99636563, 0x99636563, 0x99636563, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a,
+ 0x99525152, 0x99525152, 0x99525152, 0x99525152, 0x994a494a, 0x994a494a, 0x994a494a, 0x994a494a,
+ 0x99313531, 0x99313531, 0x88313531, 0x88212321, 0x77191419, 0x77100d10, 0x66080708, 0x66000000,
+ 0x77000000, 0x77000000, 0x66000000, 0x55000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x11080c08,
+ 0x22000400, 0x442f312f, 0x885d5d5d, 0xbb8c8a8c, 0xdd9c9a9c, 0xdd9c9a9c, 0xee9c9a9c, 0xff9c9a9c,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcececd, 0xffcccdce, 0xffcccdcc,
+ 0xffcbc9cc, 0xffc9c8c9, 0xffc7c4c7, 0xffc2c1c3, 0xffbebdbf, 0xffb6babd, 0xffb5babd, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a2a5,
+ 0xffa5a2a5, 0xffa5a2a5, 0xffa5a2a5, 0xee9c9a9c, 0xee9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xbb7b797b,
+ 0x77525252, 0x44292b29, 0x22000400, 0x11080c08, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x44000000,
+ 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66191819, 0x77191819, 0x77191819,
+ 0x88313331, 0x88313331, 0x88313331, 0x88313331, 0x993f3d3f, 0x993f3d3f, 0x993f3d3f, 0x993f3d3f,
+ 0x99424342, 0x99424342, 0x99424342, 0x99424342, 0x99474a4d, 0x99474a4d, 0x99474a4d, 0x99474a4d,
+ 0x99504d50, 0x99504d50, 0x99504d50, 0x99504d50, 0x99555155, 0x99555155, 0x99555155, 0x99555155,
+ 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455,
+ 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455,
+ 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455,
+ 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455,
+ 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150,
+ 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x99474847, 0x99474847, 0x99474847, 0x99474847,
+ 0x99424342, 0x99424342, 0x99424342, 0x99424342, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c,
+ 0x99373737, 0x99373737, 0x88373737, 0x88373737, 0x88313131, 0x88313131, 0x77191819, 0x77191819,
+ 0x77101210, 0x66000000, 0x66000000, 0x66000000, 0x77000000, 0x77000000, 0x66000000, 0x55000000,
+ 0x44000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x11000400, 0x11000400, 0x22000400, 0x44343634, 0x77686868,
+ 0x99797b79, 0xbb797b79, 0xcc797b79, 0xcc797b79, 0xddadaead, 0xeeadaead, 0xeeadaead, 0xeeadaead,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcccbcb, 0xffc8c8c9, 0xffc6c5c6,
+ 0xffb3b2b4, 0xffadadaf, 0xffb0b0b3, 0xffafb1b4, 0xffb1b5b9, 0xffb4b9bc, 0xffb5babd, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xeeadaead, 0xeea5a6a5, 0xeea5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xcca5a2a5,
+ 0xcca5a2a5, 0xbb6e6d6e, 0x886e6d6e, 0x66343334, 0x55343334, 0x22343334, 0x11000000, 0x11000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66080408, 0x66080408, 0x77080408, 0x77242024,
+ 0x77212221, 0x77212221, 0x77212221, 0x88212221, 0x88242726, 0x88242726, 0x88242726, 0x88242726,
+ 0x882c282c, 0x882c282c, 0x882c282c, 0x882c282c, 0x882f2d2f, 0x882f2d2f, 0x882f2d2f, 0x992f2d2f,
+ 0x882f2e2f, 0x882f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f,
+ 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f,
+ 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f,
+ 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f,
+ 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x882c2d2c, 0x882c2d2c, 0x882c2d2c,
+ 0x88292829, 0x88292829, 0x88292829, 0x88292829, 0x88242624, 0x88242624, 0x88242624, 0x88242624,
+ 0x88212221, 0x88212221, 0x88212221, 0x88212221, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e,
+ 0x77000400, 0x66000400, 0x66000400, 0x66000400, 0x66000000, 0x66000000, 0x77000000, 0x77000000,
+ 0x77000000, 0x66000000, 0x66000000, 0x55000000, 0x44000000, 0x33000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x22000400, 0x443a3d3a, 0x443a3d3a, 0x663a3d3a,
+ 0x663c3f3c, 0x773c3f3c, 0x88797b79, 0xaa797b79, 0xbb7e7f7e, 0xbb7e7f7e, 0xbb7e7f7e, 0xbb7e7f7e,
+ 0xcc848684, 0xcc848684, 0xcc848684, 0xcc848684, 0xcc898889, 0xdd898889, 0xdd898889, 0xdd898889,
+ 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xee8c8b8c, 0xee8c8b8c,
+ 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c,
+ 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8b8b8b, 0xee898989,
+ 0xee878588, 0xee848285, 0xcc7e7d80, 0xbb7b7c7f, 0xbb797c7e, 0xbb797c7e, 0xaa797c7e, 0xaa737473,
+ 0x88737473, 0x77737473, 0x663a3a3a, 0x55373a37, 0x44373a37, 0x33373a37, 0x22000400, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000,
+ 0x33000000, 0x44000000, 0x44000000, 0x55000000, 0x55080408, 0x55080408, 0x66080408, 0x66080408,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000400, 0x66000400, 0x66000400, 0x66000400,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66000400, 0x66000400, 0x66000400, 0x66000400,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000,
+ 0x66000400, 0x66000400, 0x66000400, 0x55000400, 0x55000000, 0x44000000, 0x44000000, 0x33000000,
+ 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408,
+ 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408,
+ 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080407,
+ 0x00080408, 0x00060308, 0x00000400, 0x00010100, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x22000000, 0x22000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00030403,
+ 0x00050505, 0x00050505, 0x00050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00030403, 0x00030403,
+ 0x00030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x33000000,
+ 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000,
+ 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x22000000, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00050805, 0x11080c08,
+ 0x22101010, 0x22101010, 0x11101010, 0x11050505, 0x00000400, 0x00000100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050805, 0x11050805, 0x11080c08, 0x11080c08,
+ 0x11080808, 0x00030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x55050705, 0xaa101410, 0xcc191819, 0xcc191819, 0xcc191819, 0xcc191819,
+ 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19,
+ 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191819, 0xcc191819, 0xcc191819, 0xbb191819,
+ 0x66080808, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44050405, 0x66100c10,
+ 0x99101010, 0xbb191819, 0xcc191819, 0xdd191819, 0xcc191819, 0xbb191819, 0x99101010, 0x77101010,
+ 0x44080408, 0x22030103, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11080808, 0x55080808, 0xbb4a494a, 0xdd8c8a8c, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5,
+ 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad,
+ 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5, 0xee8c8e8c,
+ 0xbb3c3b3c, 0x77080808, 0x22080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x00080408, 0x00080408, 0x11080408, 0x33080408, 0x88080408, 0xcc4a464a, 0xee4a464a,
+ 0xee8c8a8c, 0xffa7a6a7, 0xffa7a6a7, 0xffa7a6a7, 0xffafb3af, 0xff898c89, 0xee898c89, 0xee636563,
+ 0xcc4a494a, 0x88080408, 0x44080408, 0x22080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22080808, 0xaa080808, 0xdd8c8a8c, 0xffcecace, 0xffcbcccb, 0xffcbcccb, 0xffcbcccb, 0xffcbcccb,
+ 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3,
+ 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffbdbebd,
+ 0xeea5a2a5, 0xbb080808, 0x33080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x110e0d0e, 0x331b1b1b,
+ 0x44212021, 0x55212021, 0x44212021, 0x22101010, 0x11100f10, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x110b0b0b, 0x110e0f0e, 0x330e0f0e, 0x441b1e1b, 0x330e0f0e,
+ 0x220b0b0b, 0x110b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x00080408, 0x11080408, 0x55080408, 0xaa4a464a, 0xee8c888c, 0xff8c888c, 0xffcecace,
+ 0xffc3c2c3, 0xffc3c2c3, 0xffc3c2c3, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffafb3af,
+ 0xff8c8e8c, 0xee8c8e8c, 0xbb4a494a, 0x66080408, 0x22000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22080808, 0xcc080808, 0xee8c8a8c, 0xffcecace, 0xffcbcccb, 0xffcbcccb, 0xffdedfde, 0xffdedfde,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffa5a2a5, 0xdd080808, 0x44080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x331b1b1b, 0x551b1b1b,
+ 0x77212021, 0x88212021, 0x88212021, 0x55212021, 0x33211e21, 0x11100f10, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x110b0b0b, 0x22161616, 0x441b1e1b, 0x661b1e1b, 0x661b1e1b, 0x551b1e1b,
+ 0x44161616, 0x220b0b0b, 0x000b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x11080408, 0x66080408, 0xcc3c3b3c, 0xee8c888c, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffced2ce, 0xffced2ce, 0xee8c8e8c, 0xcc4a494a, 0x771b1a1b, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22080808, 0xcc080808, 0xee8c8a8c, 0xffcecace, 0xffcbcccb, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffa5a2a5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x220e0d0e, 0x551b1b1b, 0x77292829,
+ 0x99313131, 0xaa313131, 0xbb313131, 0xaa313131, 0x77312d31, 0x33211e21, 0x11100f10, 0x11000000,
+ 0x00000000, 0x110b0b0b, 0x22161616, 0x44212021, 0x88292d29, 0x99292d29, 0x99292d29, 0x77292d29,
+ 0x66212021, 0x33161616, 0x110b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11080408, 0x55080408, 0xcc3c3b3c, 0xffa5aaa5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xff8c8e8c, 0xcc524d52, 0x771b1a1b, 0x22000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffd6d7d6, 0xffdedfde, 0xffdedfde, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffecedec, 0xffecedec, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffe4e5e4, 0xffe4e5e4, 0xffdedfde, 0xffdedfde,
+ 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x220e0d0e, 0x551b1b1b, 0x88292829,
+ 0xaa292d29, 0xbb292d29, 0xcc292d29, 0xcc212321, 0xbb2c2e2c, 0x882c2e2c, 0x442c2e2c, 0x22101010,
+ 0x11191419, 0x22191419, 0x44292629, 0x99292629, 0xbb292729, 0xbb313131, 0xaa313131, 0x99313131,
+ 0x77212421, 0x44161816, 0x110b0c0b, 0x00000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33080808, 0xbb4a4a4a, 0xee8c8c8c, 0xffcecece, 0xffd6d7d6, 0xffd6d7d6, 0xffdeddde, 0xffdeddde,
+ 0xffdee3de, 0xffe6e9e6, 0xffe6e9e6, 0xffe6e9e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffdedbde, 0xffdedbde, 0xffd6ced6, 0xee8c8e8c, 0xbb4a494a, 0x55080408, 0x11080408,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x00080808, 0x00080808,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffecedec, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1,
+ 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xffe9ece9, 0xffe9ece9, 0xffe4e5e4, 0xffdedfde,
+ 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x441b1b1b, 0x88292829,
+ 0xbb292d29, 0xcc212321, 0xcc212321, 0xdd191a19, 0xdd1e1f1e, 0xcc1e1f1e, 0x992c2e2c, 0x552c2e2c,
+ 0x33292629, 0x553a373a, 0x993a373a, 0xcc292629, 0xcc211e21, 0xcc292729, 0xbb292729, 0xbb292729,
+ 0x88212421, 0x33161816, 0x110b0c0b, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x88080808, 0xee8c8c8c, 0xffcecece, 0xffcecece, 0xffd6d7d6, 0xffdeddde, 0xffe6e4e6, 0xffe6e4e6,
+ 0xffe6e9e6, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef, 0xfff1f2f1, 0xffececec, 0xffececec, 0xffececec,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedbde, 0xffced2ce, 0xee8c8e8c, 0x99080408, 0x33080408,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x110e0c0e, 0x11131413, 0x22131413, 0x22131413, 0x22131413,
+ 0x110e120e, 0x110e120e, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffe6e7e6, 0xffefefef,
+ 0xfff1f4f1, 0xfff1f4f1, 0xfff1f4f1, 0xfff1f4f1, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4,
+ 0xfff4f6f4, 0xfff4f6f4, 0xfff4f6f4, 0xfff4f6f4, 0xffeff3ef, 0xffe9ece9, 0xffe9ece9, 0xffe4e5e4,
+ 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x000e0d0e, 0x221b1b1b, 0x55292829,
+ 0xaa292d29, 0xcc212321, 0xdd191a19, 0xdd191a19, 0xee101010, 0xdd101010, 0xdd1e1f1e, 0xaa3a3d3a,
+ 0x774a494a, 0x993a373a, 0xcc292629, 0xdd191419, 0xdd211e21, 0xdd211e21, 0xcc292729, 0xaa292729,
+ 0x66212421, 0x33161816, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x44050405,
+ 0xcc4a4a4a, 0xff8c8c8c, 0xffcecece, 0xffcecece, 0xffdeddde, 0xffe6e4e6, 0xffe6e4e6, 0xffefebef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1,
+ 0xffeff3ef, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffced2ce, 0xff8c8e8c, 0xcc4a494a, 0x55080408,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x110e0c0e, 0x221b181b, 0x441e201e, 0x661e201e, 0x66292d29, 0x66292d29,
+ 0x551b1f1b, 0x331b1f1b, 0x110e120e, 0x11000400, 0x00030303, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffefefef, 0xffefefef,
+ 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7,
+ 0xfff7fbf7, 0xfff7fbf7, 0xfff4f6f4, 0xfff4f6f4, 0xffeff3ef, 0xffeff3ef, 0xffe9ece9, 0xffe4e5e4,
+ 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110e0d0e, 0x221b1b1b,
+ 0x66292d29, 0xbb292d29, 0xdd191a19, 0xee101010, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1f1e,
+ 0xbb292629, 0xdd292629, 0xee191419, 0xee191419, 0xdd191419, 0xdd191419, 0xcc292729, 0x88313131,
+ 0x44212421, 0x330b0c0b, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x66100c10,
+ 0xee4a4a4a, 0xffcecece, 0xffcecece, 0xffcecece, 0xffe6e4e6, 0xffe6e4e6, 0xffefebef, 0xffefebef,
+ 0xffeff0ef, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xffeff3ef, 0xffeff3ef, 0xffe6e7e6, 0xffe6e7e6, 0xffced2ce, 0xffced2ce, 0xee4a494a, 0x88080408,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x110e0c0e, 0x331b181b, 0x66292429, 0x88292d29, 0xaa292d29, 0xaa292d29, 0xaa292d29,
+ 0x99292d29, 0x77292d29, 0x551b1f1b, 0x220e120e, 0x11080808, 0x00030303, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff1f0f1,
+ 0xfff7f7f7, 0xfffafafa, 0xfffcfcfc, 0xfffcfcfc, 0xfffffcff, 0xfffffcff, 0xfffffcff, 0xfffffcff,
+ 0xfffffcff, 0xfffffcff, 0xfffffbff, 0xfffffbff, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00050405, 0x11100c10,
+ 0x33212321, 0x77313531, 0xbb313531, 0xee101210, 0xee080808, 0xee080808, 0xee080808, 0xee080808,
+ 0xee100c10, 0xee100c10, 0xee100c10, 0xee100c10, 0xee101010, 0xdd212021, 0xaa313131, 0x55313131,
+ 0x33101010, 0x33050505, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x11000000, 0x99101310,
+ 0xee8c8e8c, 0xffc3c4c3, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffecedec, 0xffecedec, 0xfff1f4f1,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfff7f7f7,
+ 0xfffaf6fa, 0xfff4f0f4, 0xfff4f0f4, 0xffefebef, 0xffe6e7e6, 0xffe6e7e6, 0xeea2a3a2, 0xaa191c19,
+ 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030303,
+ 0x11080808, 0x221e201e, 0x66292d29, 0xaa292d29, 0xbb292d29, 0xcc262726, 0xcc262726, 0xcc262726,
+ 0xcc262726, 0xbb292d29, 0x88262726, 0x55242224, 0x220b0c0b, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xfffffeff, 0xfffffeff, 0xfffffeff, 0xfffffeff,
+ 0xfffffeff, 0xfffffeff, 0xfffffeff, 0xfffffbff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x11050405,
+ 0x11101210, 0x33212321, 0x77313531, 0xcc313531, 0xee080808, 0xee080808, 0xff080808, 0xff080808,
+ 0xff050705, 0xee050705, 0xee0b090b, 0xee100c10, 0xee101010, 0xbb313131, 0x77313131, 0x44212021,
+ 0x33050505, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0xbb191c19,
+ 0xffa7a9a7, 0xffc3c4c3, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1,
+ 0xfffafafa, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffffbff, 0xfffaf6fa, 0xfff4f0f4, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xcc191c19,
+ 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050505,
+ 0x11131413, 0x551e201e, 0x99292d29, 0xbb292d29, 0xcc242224, 0xcc242224, 0xdd242224, 0xdd242224,
+ 0xdd242224, 0xcc262726, 0xbb292d29, 0x88262726, 0x33161816, 0x110b0c0b, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff7f7f7,
+ 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x22101210, 0x44212321, 0x88313531, 0xcc2f332f, 0xee080808, 0xff080808, 0xff080808,
+ 0xff050705, 0xff050705, 0xee0b090b, 0xee100c10, 0xcc212021, 0x99424142, 0x66212021, 0x44101010,
+ 0x33000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0xcc191c19,
+ 0xffa7a9a7, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffffbff, 0xfffaf6fa, 0xfffaf6fa, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xdd191c19,
+ 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808,
+ 0x22131413, 0x66292d29, 0xaa292d29, 0xcc1e201e, 0xdd242224, 0xdd242224, 0xdd242224, 0xdd211c21,
+ 0xdd211c21, 0xcc242224, 0xbb292d29, 0x99292d29, 0x55212421, 0x220b0c0b, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffece9ec, 0xfff1f0f1, 0xfff1f0f1, 0xfff7f7f7,
+ 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x22101210, 0x55313531, 0x99424942, 0xdd1b1e1b, 0xff080808, 0xff080808,
+ 0xff000400, 0xff050705, 0xff050705, 0xee100c10, 0xcc313131, 0x99424142, 0x66212021, 0x44101010,
+ 0x33050505, 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x33000000, 0xdd191c19,
+ 0xffa7a9a7, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7,
+ 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc,
+ 0xfffffbff, 0xfffffbff, 0xfffaf6fa, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xdd191c19,
+ 0x55000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808,
+ 0x33131413, 0x77292d29, 0xbb292d29, 0xcc1e201e, 0xdd211c21, 0xdd242224, 0xdd242224, 0xdd242224,
+ 0xdd211c21, 0xdd242224, 0xcc292d29, 0xaa292d29, 0x66212421, 0x330b0c0b, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7,
+ 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x11080408, 0x22191619, 0x553a393a, 0xaa424542, 0xee1b1c1b, 0xff080808, 0xff080808,
+ 0xff000400, 0xff000400, 0xff000400, 0xee0e100e, 0xee1e1e1e, 0xbb3a393a, 0x882c2b2c, 0x551e1e1e,
+ 0x440e0d0e, 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x22000000, 0xcc191c19,
+ 0xffb8bab8, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7,
+ 0xfffffcff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a2a2, 0xdd191819,
+ 0x55000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808,
+ 0x22131713, 0x77292d29, 0xbb292d29, 0xcc1e221e, 0xdd242224, 0xdd242224, 0xdd211c21, 0xdd211c21,
+ 0xdd191c19, 0xdd1e221e, 0xcc292d29, 0xaa292d29, 0x66292429, 0x330e0c0e, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7,
+ 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0x11080408, 0x33292729, 0x773a393a, 0xdd1b1c1b, 0xee080808, 0xff080808, 0xff080808,
+ 0xff000400, 0xff000400, 0xff000400, 0xee0e100e, 0xee101010, 0xdd1e1e1e, 0xbb3a393a, 0x772c2b2c,
+ 0x441b1b1b, 0x330e0d0e, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x22000000, 0xbb191c19,
+ 0xff919291, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7,
+ 0xfffffeff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a2a2, 0xcc191819,
+ 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050505,
+ 0x22131713, 0x661e221e, 0xaa292d29, 0xcc292d29, 0xdd242224, 0xdd242224, 0xdd211c21, 0xdd211c21,
+ 0xdd1e221e, 0xdd242724, 0xcc292d29, 0x99242724, 0x551b181b, 0x330e0c0e, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7,
+ 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00030103,
+ 0x11080408, 0x22191619, 0x663a393a, 0xcc292729, 0xee080808, 0xff080808, 0xff080808, 0xff080808,
+ 0xee0e100e, 0xee0e100e, 0xee0e100e, 0xee0e100e, 0xee101010, 0xee101010, 0xdd1e1e1e, 0xaa2c2b2c,
+ 0x66292829, 0x330e0d0e, 0x220e0d0e, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0x99101310,
+ 0xee919291, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7,
+ 0xfffffcff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xeea2a2a2, 0xaa191819,
+ 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030303,
+ 0x11080c08, 0x441e221e, 0x88292d29, 0xbb292d29, 0xcc262726, 0xdd242224, 0xdd242224, 0xdd242224,
+ 0xdd1e221e, 0xcc292d29, 0xbb292d29, 0x88242724, 0x441b181b, 0x330e0c0e, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7,
+ 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00030103, 0x00080408,
+ 0x11191619, 0x44292729, 0xaa3a393a, 0xdd191619, 0xee080808, 0xee080808, 0xee080808, 0xee080808,
+ 0xdd1b1c1b, 0xdd292829, 0xee0e100e, 0xee0e100e, 0xee101010, 0xee1e1e1e, 0xdd1e1e1e, 0xcc2c2b2c,
+ 0x99292829, 0x55292829, 0x220e0d0e, 0x11000000, 0x11080908, 0x11000000, 0x11000000, 0x77080908,
+ 0xee6b696b, 0xffb8bab8, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7,
+ 0xfffffcff, 0xfffffeff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xfffcfbfc, 0xfffaf7fa, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xee5d5d5d, 0x88191819,
+ 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11080c08, 0x22131713, 0x661e221e, 0x99292d29, 0xbb292d29, 0xcc292d29, 0xcc262726, 0xcc292d29,
+ 0xcc292d29, 0xbb292d29, 0x99242724, 0x66191c19, 0x330e0c0e, 0x22000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e9e6, 0xffe6e9e6, 0xffeff0ef, 0xfff7f7f7,
+ 0xfffaf7fa, 0xfffcfbfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x110b0c0b,
+ 0x33262826, 0x88313531, 0xdd1b1c1b, 0xee101010, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1e1e,
+ 0xaa4a454a, 0x994a454a, 0xcc312f31, 0xdd191a19, 0xee191c19, 0xdd191c19, 0xdd212321, 0xcc292a29,
+ 0xbb262426, 0x88262426, 0x441b181b, 0x22100c10, 0x22080c08, 0x11030403, 0x11000000, 0x44050805,
+ 0xcc504c50, 0xff979397, 0xffdedbde, 0xffdedbde, 0xffececec, 0xffececec, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfffafbfa, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffdee3de, 0xff979897, 0xcc504e50, 0x66080408,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x110b0b0b, 0x33161616, 0x66212021, 0x88292d29, 0xaa292d29, 0xbb292d29, 0xbb292d29,
+ 0xaa292829, 0x88292829, 0x661b1b1b, 0x440e0d0e, 0x33080408, 0x22030103, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xfff7f7f7,
+ 0xfffaf7fa, 0xfffcfbfc, 0xfffcfbfc, 0xffffffff, 0xfffcfefc, 0xfffcfefc, 0xfffcfefc, 0xfffcfefc,
+ 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110b0c0b, 0x22161816,
+ 0x66262826, 0xbb262826, 0xdd1b1c1b, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1e1e, 0xaa3a393a,
+ 0x77312f31, 0x77312f31, 0x88312f31, 0xbb312f31, 0xdd212321, 0xdd212321, 0xdd292a29, 0xcc313131,
+ 0xbb313131, 0x99262426, 0x661b181b, 0x33100c10, 0x33080c08, 0x11030403, 0x00000000, 0x22000000,
+ 0x88080408, 0xee979397, 0xffdedbde, 0xffdedbde, 0xffececec, 0xffececec, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffdee3de, 0xee979897, 0x99080408, 0x44080408,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x110b0b0b, 0x33161616, 0x441e1f1e, 0x661e1f1e, 0x77292d29, 0x771e1f1e,
+ 0x661b1b1b, 0x551b1b1b, 0x440e0d0e, 0x33000000, 0x22030103, 0x22000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef,
+ 0xfffaf7fa, 0xfffaf7fa, 0xfffcfbfc, 0xfffcfbfc, 0xfffafcfa, 0xfffafcfa, 0xfffafcfa, 0xfffafcfa,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffafafa, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110b0c0b, 0x44212421,
+ 0x99262826, 0xcc262826, 0xdd1b1c1b, 0xdd1b1c1b, 0xdd101010, 0xdd1e1e1e, 0xbb3a393a, 0x772c2b2c,
+ 0x66191a19, 0x66191a19, 0x66191a19, 0x88312f31, 0xaa292a29, 0xcc292a29, 0xcc292a29, 0xbb313131,
+ 0xaa313131, 0x99262426, 0x77262426, 0x441b181b, 0x33050805, 0x22030403, 0x00000000, 0x11000000,
+ 0x44080408, 0xbb504c50, 0xee979397, 0xffdedbde, 0xffe1e1e1, 0xffececec, 0xffececec, 0xfff7f7f7,
+ 0xfff4f7f4, 0xfff4f7f4, 0xfffafbfa, 0xfffafbfa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfff7f7f7,
+ 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffe1dfe1, 0xee979897, 0xcc504e50, 0x66080408, 0x33080408,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x110b0b0b, 0x22131213, 0x33131213, 0x44131213, 0x44131213,
+ 0x440e0d0e, 0x330e0d0e, 0x33000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef,
+ 0xfff7f3f7, 0xfffaf7fa, 0xfffaf7fa, 0xfffaf7fa, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7,
+ 0xfffafafa, 0xfffafafa, 0xfff7f7f7, 0xfff7f7f7, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6,
+ 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x000b0c0b, 0x22161816, 0x66212421,
+ 0x99262826, 0xbb262826, 0xcc262826, 0xdd1b1c1b, 0xdd1e1e1e, 0xbb2c2b2c, 0x772c2b2c, 0x551e1e1e,
+ 0x55000400, 0x55000400, 0x55000400, 0x55191a19, 0x66212321, 0x99292a29, 0xaa292a29, 0xaa292a29,
+ 0x99313131, 0x88262426, 0x661b181b, 0x441b181b, 0x22050805, 0x22030403, 0x00000000, 0x00000000,
+ 0x22080408, 0x66080408, 0xcc504c50, 0xff979397, 0xffd6d7d6, 0xffe1e1e1, 0xffececec, 0xffececec,
+ 0xffeff3ef, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f3f7, 0xfff7f3f7, 0xffe1dfe1, 0xffb5b6b5, 0xdd504e50, 0x88080408, 0x44080408, 0x22080408,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11080408, 0x22080408, 0x22080408, 0x22080408,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33080808, 0xcc080808, 0xee919491, 0xffd6dbd6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xffa5a6a5, 0xdd080408, 0x55080408, 0x00080408, 0x00000000, 0x110b0b0b, 0x33161616, 0x66212021,
+ 0x88292829, 0xaa292829, 0xbb292829, 0xcc292829, 0xbb292829, 0x77292829, 0x551b1b1b, 0x550e0d0e,
+ 0x44030303, 0x44000000, 0x44030303, 0x44080808, 0x440b0b0b, 0x55212021, 0x77212021, 0x88212021,
+ 0x88212021, 0x77212021, 0x55191819, 0x44101010, 0x22080408, 0x11030103, 0x00000000, 0x00000000,
+ 0x00000000, 0x22000000, 0x771b1b1b, 0xcc525152, 0xee979397, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffdee3de, 0xffdee3de, 0xff979897, 0xdd504e50, 0x88101410, 0x44000000, 0x22000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22080808, 0xbb080808, 0xee919491, 0xffd6dbd6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef,
+ 0xeea5a6a5, 0xcc080408, 0x44080408, 0x00080408, 0x00000000, 0x110b0b0b, 0x220b0b0b, 0x44161616,
+ 0x661e1e1e, 0x77292829, 0x88292829, 0x99292829, 0x77292829, 0x551b1b1b, 0x440e0d0e, 0x44000000,
+ 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x330b0b0b, 0x44161616, 0x66161616,
+ 0x66191819, 0x66191819, 0x55101010, 0x33101010, 0x22030103, 0x11030103, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x22000000, 0x771b1b1b, 0xbb504c50, 0xee979397, 0xff979397, 0xffdedbde,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xff979897, 0xee979897, 0xcc504e50, 0x88080408, 0x44000000, 0x22000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11080808, 0x66080808, 0xbb4d4e4d, 0xee919491, 0xeea5a7a5, 0xffa5a7a5, 0xffa5a7a5, 0xffa5a7a5,
+ 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2,
+ 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffaaa7aa, 0xffaaa7aa, 0xeeaaa7aa, 0xeeaaa7aa,
+ 0xcc707070, 0x99080408, 0x33080408, 0x00080408, 0x00000000, 0x00000000, 0x110b0b0b, 0x220b0b0b,
+ 0x33131313, 0x441e1e1e, 0x441e1e1e, 0x441e1e1e, 0x440e0d0e, 0x440e0d0e, 0x44000000, 0x44000000,
+ 0x33000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x220b0b0b, 0x330b0b0b,
+ 0x44101010, 0x44101010, 0x44080808, 0x33080808, 0x11030103, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x55080408, 0x99080408, 0xcc504c50, 0xee504c50,
+ 0xeeaaa9aa, 0xffaaa9aa, 0xffaaa9aa, 0xffaaa9aa, 0xffa7a9a7, 0xffa7a9a7, 0xeea7a9a7, 0xee606260,
+ 0xcc504e50, 0x99080408, 0x66080408, 0x44080408, 0x22000000, 0x11000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080808, 0x22080808, 0x77080808, 0xbb080808, 0xdd212021, 0xdd212021, 0xdd212021, 0xdd212021,
+ 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429,
+ 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd212021, 0xdd212021, 0xdd212021, 0xcc212021,
+ 0x99080408, 0x44080408, 0x22080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x110b0b0b,
+ 0x11080808, 0x11080808, 0x22080808, 0x22080808, 0x33000000, 0x33000000, 0x33000000, 0x33000000,
+ 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x22000000,
+ 0x22080808, 0x33080808, 0x33080808, 0x22080808, 0x11000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11080408, 0x33080408, 0x55080408, 0x88080408,
+ 0xaa211c21, 0xcc211c21, 0xdd211c21, 0xdd211c21, 0xdd191c19, 0xcc191c19, 0xaa191c19, 0x88191c19,
+ 0x66080408, 0x44080408, 0x33080408, 0x22080408, 0x11000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000,
+ 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x22000000,
+ 0x33000000, 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000,
+ 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000,
+ 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x22000000, 0x22000000, 0x33000300, 0x33000300, 0x44000400, 0x44000400,
+ 0x55080808, 0x55101010, 0x66101010, 0x66191819, 0x661b1e1b, 0x661b1e1b, 0x66292d29, 0x66292d29,
+ 0x77313531, 0x77313531, 0x77313531, 0x77313531, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a,
+ 0x77424142, 0x77424142, 0x77424142, 0x77424142, 0x77424542, 0x77424542, 0x77424542, 0x77424542,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542,
+ 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542,
+ 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142,
+ 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a,
+ 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a,
+ 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a,
+ 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313131, 0x88313131, 0x88313131, 0x88313131,
+ 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31,
+ 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29,
+ 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29,
+ 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29,
+ 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29,
+ 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31,
+ 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131,
+ 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313531, 0x88313531, 0x88313531, 0x88313531,
+ 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531,
+ 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a,
+ 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a,
+ 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x88313531, 0x88313531, 0x88313531, 0x88313531,
+ 0x88313531, 0x77313531, 0x77313531, 0x88313531, 0x88313131, 0x77313131, 0x77313131, 0x77313131,
+ 0x77292d29, 0x77292d29, 0x77292d29, 0x77292d29, 0x77292829, 0x77292829, 0x77292829, 0x77292829,
+ 0x77212021, 0x77212021, 0x77212021, 0x77212021, 0x77191819, 0x77191819, 0x77191819, 0x66101010,
+ 0x66101010, 0x660b0b0b, 0x660b0b0b, 0x660b0b0b, 0x55080808, 0x55080808, 0x55050505, 0x44050505,
+ 0x33000400, 0x33000400, 0x22000400, 0x22000300, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0x22080408, 0x44080408, 0x55080408,
+ 0x66191419, 0x66191419, 0x77423f42, 0x77423f42, 0x77424542, 0x77424542, 0x77606260, 0x77606260,
+ 0x77636163, 0x77636163, 0x88636163, 0x88636163, 0x886b696b, 0x886b696b, 0x886b696b, 0x886b696b,
+ 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x9973797b, 0x9973797b, 0x9973797b, 0x9973797b,
+ 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b,
+ 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b,
+ 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b,
+ 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b7573, 0xaa7b7573, 0xaa7b7573, 0xaa7b7573,
+ 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573,
+ 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b,
+ 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0xaa736d73, 0xaa736d73, 0xaa736d73, 0xaa736d73, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737573, 0xaa737573, 0xbb737573, 0xbb737573, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b,
+ 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa636563, 0xaa636563, 0xaa636563, 0xaa636563,
+ 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x99525552, 0x99525552, 0x99525552, 0x88525552,
+ 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31,
+ 0x88191c19, 0x77191c19, 0x77191c19, 0x77191c19, 0x66080c08, 0x44080c08, 0x33080c08, 0x22080c08,
+ 0x11080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x55080408, 0x77343134, 0x88605d60, 0x88605d60,
+ 0x886b6b6b, 0x886b6b6b, 0x886b6b6b, 0x996b6b6b, 0x997e807e, 0x997e807e, 0xaa7e807e, 0xaa7e807e,
+ 0xaa898a89, 0xaa898a89, 0xaa898a89, 0xaa898a89, 0xbb8c8f8c, 0xbb8c8f8c, 0xbb8c8f8c, 0xbb8c8f8c,
+ 0xbb949494, 0xbb949494, 0xbb949494, 0xcc949494, 0xcc949797, 0xcc949797, 0xcc949797, 0xcc949797,
+ 0xcc979a97, 0xcc979a97, 0xcc979a97, 0xcc979a97, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c,
+ 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c,
+ 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c,
+ 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9b9a, 0xcc9c9b9a, 0xcc9c9b9a, 0xcc9c9b9a,
+ 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a,
+ 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f,
+ 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f,
+ 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c,
+ 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c,
+ 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f,
+ 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a,
+ 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a,
+ 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a,
+ 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc94979a, 0xcc94979a, 0xcc94979a, 0xcc94979a,
+ 0xcc979697, 0xcc979697, 0xcc979697, 0xcc979697, 0xcc919291, 0xcc919291, 0xcc919291, 0xcc919291,
+ 0xcc919291, 0xcc919291, 0xcc919291, 0xcc919291, 0xcc8f908f, 0xcc8f908f, 0xcc8f908f, 0xcc8f908f,
+ 0xcc8c8b8c, 0xcc8c8b8c, 0xcc8c8b8c, 0xcc8c8b8c, 0xbb848884, 0xbb848884, 0xbb848884, 0xbb848884,
+ 0xbb7e7d7e, 0xbb7e7d7e, 0xbb7e7d7e, 0xbb7e7d7e, 0xaa737073, 0xaa737073, 0xaa737073, 0xaa737073,
+ 0xaa6b6b6b, 0x996b6b6b, 0x99424342, 0x99424342, 0x99373937, 0x88373937, 0x77373937, 0x66080c08,
+ 0x66080408, 0x22080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x33000000, 0x77262626, 0x88605d60, 0x88605d60, 0x998c8a8c, 0xaa8c8a8c,
+ 0xaa949694, 0xaa949694, 0xbb949694, 0xbb949694, 0xbb9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9ca29c, 0xcc9ca29c, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdd9c9a9c, 0xdd9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc949294, 0xcc949294, 0xcc949294, 0xcc949294,
+ 0xcc949294, 0xcc949294, 0xcc949294, 0xbb6b6b6b, 0xbb656565, 0xbb656565, 0xaa656565, 0xaa656565,
+ 0xbb656265, 0x77373337, 0x44080408, 0x11080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x33000000, 0x884d4c4d, 0x99737173, 0xaa8c8a8c, 0xaa8c8a8c, 0xcc8c8a8c, 0xcc8c8a8c,
+ 0xcc949694, 0xcc949694, 0xdd949694, 0xdd949694, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c,
+ 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad,
+ 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5,
+ 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294,
+ 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294, 0xcc949294, 0xcc949294, 0xcc949294,
+ 0xee949294, 0xbb656265, 0x99373337, 0x55080408, 0x11080808, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11100c10, 0x773c393a, 0x9994928c, 0xbb94928c, 0xcc8f908f, 0xcc8f908f, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7,
+ 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a,
+ 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a,
+ 0xeea5a2a5, 0xdd8c8b8c, 0xbb8c8b8c, 0xaa5a5d5a, 0x662c2d2c, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x44100c10, 0x99686563, 0xbb94928c, 0xcc94928c, 0xdd9ca29c, 0xcc8f908f, 0xdd9ca29c, 0xdd9ca29c,
+ 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7,
+ 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xdda7a6a7, 0xddb5b2b5, 0xdda7a6a7, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead,
+ 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xddb5b2b5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7,
+ 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7,
+ 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdd9a9a9a,
+ 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a,
+ 0xeea5a2a5, 0xeea5a2a5, 0xdd8c8b8c, 0xcc8c8b8c, 0xbb585958, 0x332c2d2c, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050405,
+ 0x773c393a, 0xbb94928c, 0xcc94928c, 0xdd94928c, 0xdd9ca29c, 0xdd817f81, 0xff736d73, 0xff817f81,
+ 0xff847d7b, 0xff948f8f, 0xff948f8f, 0xff948f8f, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8a8c, 0xff8c8a8c, 0xff8c8a8c, 0xff8c8a8c,
+ 0xffa5a2a5, 0xeea5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd848684, 0x77585958, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11100c10,
+ 0x88686563, 0xcc94928c, 0xdd94928c, 0xdd94928c, 0xdd9ca29c, 0xdd817f81, 0xff817f81, 0xff8f908f,
+ 0xffa5a1a2, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffb5aead, 0xffb5aead, 0xffb5aead, 0xffb5aead, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5,
+ 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd,
+ 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5,
+ 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb2b3b2, 0xffb2b3b2, 0xffb2b3b2, 0xffb2b3b2,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffa7a5a7,
+ 0xffa5a2a5, 0xeea5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd848684, 0xaa585958, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22191419,
+ 0x99636163, 0xcc898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xff949294, 0xffa7a6a7,
+ 0xffbdbebd, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffbdbebd,
+ 0xffb2b2b2, 0xee9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xbb686968, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33191419,
+ 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffa7a6a7, 0xffbababa,
+ 0xffd0d2d0, 0xffe4e7e4, 0xffe4e7e4, 0xffe4e7e4, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef,
+ 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffe4e7e4, 0xffe4e7e4, 0xffe4e7e4, 0xffd0d2d0,
+ 0xffb2b2b2, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc686968, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33100d10,
+ 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffa7a6a7, 0xffcecece,
+ 0xffe4e7e4, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffe4e7e4,
+ 0xffbdbebd, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc686968, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33100d10,
+ 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffbababa, 0xffcecece,
+ 0xffe4e7e4, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffe4e7e4,
+ 0xffbdbebd, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc9c9e9c, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101010,
+ 0xaa4a5152, 0xdd868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xcc6e736e, 0x00000400, 0x00000300,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22191819,
+ 0x994a5152, 0xdd868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x994a5152, 0xcc868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x994a5152, 0xcc868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x884a494a, 0xcc868486, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11101010,
+ 0x884a494a, 0xcc868486, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x884a494a, 0xcca5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x994a494a, 0xcca5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xddaaaaaa, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310,
+ 0x995a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xdda5a2a5, 0xddb5b6b5, 0xbb797b79, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310,
+ 0x995a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xdda5a2a5, 0xddb5b6b5, 0xbb797b79, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310,
+ 0xaa5a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xddafadaf, 0xddb5b6b5, 0xcc797b79, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101310,
+ 0xaa737373, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6,
+ 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xddafadaf, 0xddb5b6b5, 0xcc797b79, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101010,
+ 0xaa606060, 0xddada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffbab7ba, 0xffcecace,
+ 0xffeff0ef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffeff0ef,
+ 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xcc737479, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080808,
+ 0xaa606060, 0xddada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffbab7ba, 0xffcecace,
+ 0xffeff0ef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffeff0ef,
+ 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xbb737479, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33191819,
+ 0x99606060, 0xccada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffa7a5a7, 0xffcecace,
+ 0xffdee1de, 0xffeff0ef, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffeff0ef, 0xffdee1de,
+ 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xbb737479, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010,
+ 0x883a3d3a, 0xbb868386, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffa7a5a7, 0xffbab7ba,
+ 0xffced2ce, 0xffdee1de, 0xffeff0ef, 0xffeff0ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff0ef, 0xffeff0ef, 0xffdee1de, 0xffced2ce,
+ 0xffbababa, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0x99737479, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11080808,
+ 0x773a3a3a, 0xaa6b6c6b, 0xcc9c9e9c, 0xdd9c9e9c, 0xddadaaad, 0xdd949294, 0xff949294, 0xffadaaad,
+ 0xffbdbebd, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce,
+ 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced1d3, 0xffced1d3, 0xffced1d3, 0xffced1d3,
+ 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0,
+ 0xffced1ce, 0xffced1ce, 0xffced1ce, 0xffced1ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce,
+ 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce,
+ 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffb8bcb8,
+ 0xffadaead, 0xeeadaead, 0xddadaead, 0xddadaead, 0xcc848a84, 0x772c2e2c, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x66080808, 0x883a3a3a, 0xaa6b6c6b, 0xcc9c9e9c, 0xddadaaad, 0xccadaaad, 0xddadaaad, 0xddadaaad,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddc5c2c5, 0xddc5c2c5, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc5c6c5, 0xddc5c6c5, 0xddc8cac8, 0xddc8cac8, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece,
+ 0xddd0d1d0, 0xddd3d0d3, 0xddd0d1d0, 0xddd0d1d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6,
+ 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd6d7d6, 0xddd6d7d6,
+ 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9,
+ 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d7d3, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xddd9d8d9, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9,
+ 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3,
+ 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd3d5d3, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0,
+ 0xddd3d5d3, 0xddd3d5d3, 0xddced2ce, 0xddced2ce, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0,
+ 0xddcecece, 0xddced0ce, 0xddcecece, 0xddcecece, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce,
+ 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5,
+ 0xddadadad, 0xddadadad, 0xddadadad, 0xddadadad, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2,
+ 0xeeadaead, 0xeeadaead, 0xcc818381, 0xbb818381, 0xaa585c58, 0x442c2e2c, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33080808, 0x883a3a3a, 0x883a3a3a, 0xaa6b6c6b, 0xcc949294, 0xbb949294, 0xccadaaad, 0xddadaaad,
+ 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddc3c2c3,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc8c8c8,
+ 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc8cac8,
+ 0xddc8cac8, 0xddc8cac8, 0xddc8cac8, 0xddcbcecb, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce,
+ 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddced0d0, 0xddced0d0, 0xddced0d0, 0xddced2d6,
+ 0xddced2ce, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6, 0xddd3d4d3,
+ 0xddd3d5d3, 0xddd3d5d3, 0xddd3d5d3, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6,
+ 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd6dbd6, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9,
+ 0xddd9d8d9, 0xddd9d8d9, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9,
+ 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d8d3, 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6,
+ 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd3d5d3, 0xddd3d5d3,
+ 0xddd3d5d3, 0xddd6d7d6, 0xddd3d5d3, 0xddd0d4d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0,
+ 0xddced0ce, 0xddced0ce, 0xddced0ce, 0xddced0ce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce,
+ 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcec6ce,
+ 0xddc8cac8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc8c8c8, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddc3c5c3, 0xddbfc0bf, 0xddc2c4c2, 0xddbebfbe, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5,
+ 0xddadadad, 0xddadadad, 0xddadadad, 0xddadadad, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2,
+ 0xeeadaead, 0xdd818381, 0xbb818381, 0x99555855, 0x772c2e2c, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11080808, 0x66080808, 0x773a3a3a, 0x773a3a3a, 0x99636163, 0x997b797b, 0xbb949294, 0xbb949294,
+ 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcca5a2a5, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddc3c2c3, 0xddc3c2c3,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc3c5c3, 0xddc3c5c3,
+ 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc8c8c8, 0xddc5c2c5, 0xddc8c8c8,
+ 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8cac8, 0xddc5c6c5, 0xddc8cac8, 0xddcbcecb,
+ 0xddcbcecb, 0xddc8cac8, 0xddc8cac8, 0xddcbcecb, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce,
+ 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddced0d0, 0xddced1d3, 0xddced1d3, 0xddced2d6,
+ 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddd3d4d3, 0xddd3d4d3, 0xddd3d4d3, 0xddd0d5d0,
+ 0xddd6d7d6, 0xddd3d5d3, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6,
+ 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6, 0xddd6dbd6, 0xddd9d8d9, 0xdddedbde, 0xdddedbde, 0xdddedbde,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xdddedfde, 0xdddedfde, 0xddd9dbd9,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xdddedfde, 0xdddedfde,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xdddedfde,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde,
+ 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd6dbd6, 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6,
+ 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd6d7d6,
+ 0xddd3d5d3, 0xddd6d7d6, 0xddd3d5d3, 0xddd0d4d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd0d1d0, 0xddd0d1d0,
+ 0xddced2ce, 0xddced1ce, 0xddced0ce, 0xddced0ce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce,
+ 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddc8cac8, 0xddc5c6c5, 0xddc8cac8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c3c6, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddc4c4c3, 0xddc4c4c3, 0xddc4c4c2, 0xddc1c0c1, 0xddbfc1bf, 0xddbdbebe, 0xddbdbebe, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5,
+ 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5,
+ 0xddadadad, 0xddadadad, 0xdd9c9a9c, 0xcc9c9a9c, 0xcca2a5a2, 0xcc8c8e8c, 0xcc8c8e8c, 0xcc8c8e8c,
+ 0xdd818381, 0xaa555855, 0x77292d29, 0x55292d29, 0x22000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x22000000, 0x77101010, 0x77313131, 0x773f3f3f, 0x773f3f3f, 0x885a5d5a, 0x995a5d5a,
+ 0x99737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa8c8a8c, 0xbb8c8a8c, 0xbb8c8a8c, 0xbb8c8a8c,
+ 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5,
+ 0xccadaead, 0xccadaead, 0xccadaead, 0xccadaead, 0xccb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5,
+ 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbec0bf, 0xddc0c2c1,
+ 0xddc7cacc, 0xddc8cccd, 0xddc0c3c5, 0xddc2c6c9, 0xddc3c5c7, 0xddc3c3c4, 0xddc0c3c2, 0xddbfc2c0,
+ 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc5cac5, 0xddc5cac5, 0xddc5cac5, 0xddc5cac5, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece,
+ 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece,
+ 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce,
+ 0xddcecfce, 0xddcfd0cf, 0xddd2d0d0, 0xddd1d3d2, 0xddd7d9d7, 0xddd9dad8, 0xdddbdddb, 0xdddde0de,
+ 0xdde0e3e2, 0xdde2e2e3, 0xdde2e3e1, 0xdde3e3e4, 0xdde5e3e5, 0xdde4e3e4, 0xdde3e0e2, 0xdddfdcdf,
+ 0xddd3d1d0, 0xddcecece, 0xddcfd0cf, 0xddd1d0d0, 0xddd5d6d4, 0xddd5d4d5, 0xddd5d4d4, 0xddd2d1d2,
+ 0xddd0cdd0, 0xddcfccd0, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace,
+ 0xddc5cace, 0xddc5cace, 0xddc5cace, 0xddc5cace, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5,
+ 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5,
+ 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd,
+ 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc8c8c9, 0xddc9c8ca, 0xddc9cbcb, 0xddcacdcc,
+ 0xddc9c7c8, 0xddc8c8c9, 0xddcac8ca, 0xddc8c7c9, 0xddc6c7c6, 0xddc2c6c3, 0xddc2c3c1, 0xddc4c7c3,
+ 0xddb9bab9, 0xddb8b6b8, 0xddb7b7b7, 0xddbababa, 0xddbcbfbc, 0xddbcc0bc, 0xddbdc2bd, 0xddbdc2bd,
+ 0xddb5b6b5, 0xddb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccadb2ad, 0xccadb2ad, 0xccadb2ad, 0xccadb2ad,
+ 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcc9c9a94, 0xcc9c9a94, 0xcc9c9a94, 0xcc9c9a94,
+ 0xbb84827b, 0xbb84827b, 0xbb84827b, 0xaa84827b, 0xaa6b6d6b, 0xaa6b6d6b, 0x996b6d6b, 0x99474947,
+ 0xbb524d52, 0x661b1a1b, 0x44000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x22000000, 0x66101010, 0x77242224, 0x663f3f3f, 0x663f3f3f, 0x663f3f3f,
+ 0x77504e50, 0x77504e50, 0x77504e50, 0x77504e50, 0x88656565, 0x88656565, 0x88656565, 0x99656565,
+ 0x99767476, 0x99767476, 0x99767476, 0xaa767476, 0xaa7e7f7e, 0xaa7e7f7e, 0xaa7e7f7e, 0xaa7e7f7e,
+ 0xaa868786, 0xaa868786, 0xbb868786, 0xbb868786, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c,
+ 0xbb949494, 0xbb949494, 0xbb949494, 0xbb949494, 0xcc9c989c, 0xcc9c989c, 0xcc9c989c, 0xcc9c989c,
+ 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5,
+ 0xccbdbabd, 0xccbdbabd, 0xccbdbabd, 0xccbdbabd, 0xccbdbebd, 0xccbdbebd, 0xccbcbdbc, 0xccb9baba,
+ 0xccb1b3b4, 0xccb2b4b4, 0xccb2b5b5, 0xccb3b5b6, 0xccb1b4b6, 0xccb3b5b6, 0xccb4b8b8, 0xccb7b9b9,
+ 0xccc0c0c2, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd,
+ 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5,
+ 0xccc5cac5, 0xccc5cac5, 0xccc5cac5, 0xccc5cac5, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace,
+ 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace,
+ 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece,
+ 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece,
+ 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce,
+ 0xcccecfce, 0xcccdcecd, 0xcccdcdcd, 0xcccbcbca, 0xccc7c8c7, 0xccc3c5c5, 0xccc3c4c4, 0xccc2c3c2,
+ 0xccbec1bf, 0xccbbbdbc, 0xccb7b8b6, 0xccb0b2b0, 0xccaeb1af, 0xccb0b1b0, 0xccb5b4b4, 0xccbcbabb,
+ 0xcca3a6a3, 0xccb8bab7, 0xccc9c9c7, 0xccc9c7c8, 0xccacacac, 0xccb5b3b7, 0xccb8b5b7, 0xccb7b5b5,
+ 0xccb0aeb1, 0xccb7b6b5, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace,
+ 0xccc5cace, 0xccc5cace, 0xccc5cace, 0xccc5cace, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5,
+ 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5,
+ 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd,
+ 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd,
+ 0xccc5c6c5, 0xccc5c6c5, 0xccabaeac, 0xcca5a6a5, 0xcca8a9a8, 0xccaeadac, 0xccaeacab, 0xccb5b5b4,
+ 0xccbcbdbd, 0xccb0b1b2, 0xcca9a9a9, 0xcca5a4a6, 0xcc9f9fa1, 0xcc9da09f, 0xcc9ca09e, 0xccafb3b1,
+ 0xccacadab, 0xcca8a9a7, 0xcca0a09f, 0xcc999a99, 0xbb939492, 0xbb8d918e, 0xbb8c908c, 0xbb8c908c,
+ 0xbb868686, 0xbb868686, 0xbb868686, 0xbb868686, 0xbb7b7f7b, 0xbb7b7f7b, 0xaa7b7f7b, 0xaa7b7f7b,
+ 0xaa737370, 0xaa737370, 0xaa737370, 0xaa737370, 0x99686763, 0x99686763, 0x99686763, 0x99686763,
+ 0x995a5955, 0x885a5955, 0x885a5955, 0x8831312f, 0x77242424, 0x77242424, 0x77242424, 0x66242424,
+ 0x661b1a1b, 0x33000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44080408, 0x66080408, 0x66242224, 0x66242224,
+ 0x662c2b2c, 0x662c2b2c, 0x662c2b2c, 0x662c2b2c, 0x663f413f, 0x663f413f, 0x663f413f, 0x663f413f,
+ 0x77504e50, 0x77504e50, 0x77504e50, 0x77504e50, 0x77585858, 0x77585858, 0x77585858, 0x77585858,
+ 0x88606060, 0x88606060, 0x88606060, 0x88606060, 0x88636563, 0x88636563, 0x88636563, 0x88636563,
+ 0x886b6b6b, 0x886b6b6b, 0x996b6b6b, 0x996b6b6b, 0x99736f73, 0x99736f73, 0x99736f73, 0x99736f73,
+ 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e,
+ 0x99707170, 0x99707170, 0x99707170, 0x99707170, 0xaa767576, 0x99767576, 0xaa767576, 0xaa767576,
+ 0xaa7b7c7e, 0xaa7b7c7e, 0xaa7b7c7f, 0xaa7d7e80, 0xaa7a7a7c, 0xaa7b7a7c, 0xaa787979, 0xaa777677,
+ 0xaa797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xaa979694, 0xaa979694, 0xaa979694, 0xaa979694,
+ 0xaa949694, 0xaa949694, 0xaa949694, 0xaa949694, 0xaa797b79, 0xaa797b79, 0xaa797b79, 0xaa797b79,
+ 0xaa797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xaa7b7976, 0xaa7b7976, 0xaa7b7976, 0xaa7b7976,
+ 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776,
+ 0xaa767576, 0x99767576, 0x99767576, 0x99767576, 0x99767876, 0x99767876, 0x99767876, 0x99767876,
+ 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576,
+ 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99707770, 0x99707770, 0x99707770, 0x99707770,
+ 0x99707370, 0x99707370, 0x99707370, 0x99717571, 0x99787c79, 0x99787d79, 0x99787d79, 0x99797d79,
+ 0x99787d79, 0x99797d79, 0x99797d78, 0x99797d79, 0x99797c79, 0x99797c79, 0x99797c79, 0x99797c78,
+ 0x99747672, 0x99727672, 0x99727371, 0x99707371, 0x99797879, 0x99797878, 0x99797879, 0x99787879,
+ 0x99777577, 0xaa777676, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476,
+ 0xaa6e7170, 0xaa6e7170, 0xaa6e7170, 0xaa6e7170, 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737373,
+ 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173,
+ 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa707070, 0xaa707070, 0xaa707070, 0xaa707070,
+ 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b,
+ 0x996e706e, 0xaa6f716f, 0x99747673, 0x99757774, 0x99767676, 0x99777876, 0x99737373, 0x99737272,
+ 0x99757577, 0x996e6e72, 0x996b6c70, 0x996b6c70, 0x99686c68, 0x99686c68, 0x99686c68, 0x996b6f6b,
+ 0x99636563, 0x995d5e5d, 0x995d5e5d, 0x995d5e5d, 0x995a5e5a, 0x885a5e5a, 0x885a5e5a, 0x885a5e5a,
+ 0x88585558, 0x88585558, 0x88585558, 0x88585558, 0x884a4c4a, 0x884a4c4a, 0x884a4c4a, 0x884a4c4a,
+ 0x77423f3c, 0x77423f3c, 0x77423f3c, 0x77423f3c, 0x77343331, 0x77343331, 0x77343331, 0x77343331,
+ 0x6631312f, 0x66080808, 0x66080808, 0x66080808, 0x66000000, 0x66000000, 0x55000000, 0x33000000,
+ 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0x11080408, 0x22080408, 0x33080408,
+ 0x44080808, 0x55080808, 0x55080808, 0x66080808, 0x66191c19, 0x66191c19, 0x66191c19, 0x66191c19,
+ 0x66292829, 0x66292829, 0x66292829, 0x66292829, 0x66313131, 0x66313131, 0x66313131, 0x66313131,
+ 0x663a393a, 0x663a393a, 0x663a393a, 0x663a393a, 0x663a3d3a, 0x663a3d3a, 0x663a3d3a, 0x663a3d3a,
+ 0x66424142, 0x66424142, 0x66424142, 0x66424142, 0x664a454a, 0x664a454a, 0x664a454a, 0x664a454a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a,
+ 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x77525152, 0x77525152, 0x77525152, 0x77525152,
+ 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152,
+ 0x77525552, 0x77525552, 0x77525552, 0x77525552, 0x774a4542, 0x774a4542, 0x774a4542, 0x774a4542,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77525552, 0x77525552, 0x77525552, 0x77525552,
+ 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x7752514a, 0x7752514a, 0x7752514a, 0x7752514a,
+ 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x77424942, 0x77424942, 0x77424942, 0x77424942,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424942, 0x77424942, 0x77424942, 0x77424942,
+ 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542,
+ 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424142, 0x77424142, 0x77424142, 0x77424142,
+ 0x773a3d42, 0x773a3d42, 0x773a3d42, 0x773a3d42, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a,
+ 0x66313531, 0x66313531, 0x66313531, 0x66313531, 0x66292d29, 0x66292d29, 0x66292d29, 0x66292d29,
+ 0x66292429, 0x66292429, 0x66292429, 0x66292429, 0x66191819, 0x66191819, 0x66191819, 0x66191819,
+ 0x66100c08, 0x66100c08, 0x66100c08, 0x66100c08, 0x66000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x66080808, 0x66080808, 0x66080808, 0x55080808, 0x44000000, 0x22000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x33000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000400, 0x55000400, 0x55000400, 0x55000400,
+ 0x55080808, 0x66080808, 0x66080808, 0x66080808, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31,
+ 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408,
+ 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080400, 0x66080400, 0x66080400, 0x66080400,
+ 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000, 0x33000000,
+ 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000400, 0x11000400, 0x11000400, 0x22000400,
+ 0x22080808, 0x22080808, 0x22080808, 0x22080808, 0x33000000, 0x33000000, 0x33000000, 0x33000000,
+ 0x33000000, 0x33000000, 0x33000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000,
+ 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55080808, 0x44080808, 0x44080808, 0x44080808,
+ 0x55080808, 0x44080808, 0x44080808, 0x55080808, 0x55080808, 0x44080808, 0x44080808, 0x44080808,
+ 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408,
+ 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408,
+ 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408,
+ 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408,
+ 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080400, 0x44080400, 0x44080400, 0x44080400,
+ 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400,
+ 0x44000000, 0x44000000, 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000,
+ 0x33000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11080808, 0x11080808, 0x11080808, 0x11080808,
+ 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808,
+ 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408,
+ 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080400, 0x11080400, 0x11080400, 0x11080400,
+ 0x11000400, 0x11000400, 0x11000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbb4d4e4d, 0xbb737573, 0xbb737573,
+ 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94,
+ 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294,
+ 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c,
+ 0xbb737573, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xcc737573, 0xcc737573, 0xcc737573,
+ 0xcca5a6a5, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff,
+ 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xcca5a6a5, 0xcca5a6a5,
+ 0xcc737173, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xdd737573, 0xdd737573, 0xddadaead,
+ 0xdda5a6a5, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff,
+ 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddbabcba, 0xdda5a6a5,
+ 0xddadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xee737573, 0xeeadaead, 0xeeadaead,
+ 0xeebabcba, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeed0d1d0, 0xeebabcba,
+ 0xeeadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xee737573, 0xeeadaead, 0xeeadaead,
+ 0xeed0d1d0, 0xeefffffe, 0xeeffffff, 0xeeffffff, 0xeefefffe, 0xfffefeff, 0xeefffeff, 0xeefefeff,
+ 0xeefeffff, 0xeefeffff, 0xeeffffff, 0xeefeffff, 0xeeffffff, 0xeefffefe, 0xeefffefe, 0xeefeffff,
+ 0xfffefefe, 0xeefefffe, 0xeefffffe, 0xeeffffff, 0xfffefffe, 0xeefffefe, 0xeeffffff, 0xeefffffe,
+ 0xfffefffe, 0xeefffeff, 0xeefeffff, 0xeefffeff, 0xffffffff, 0xeefffffe, 0xfffffefe, 0xfffffeff,
+ 0xeefeffff, 0xffffffff, 0xfffffffe, 0xeefffeff, 0xeefefffe, 0xffffffff, 0xeefffeff, 0xeefefffe,
+ 0xeefffffe, 0xeefffeff, 0xeefeffff, 0xeefeffff, 0xeefffffe, 0xeeffffff, 0xeeffffff, 0xeeffffff,
+ 0xeeffffff, 0xeefffeff, 0xfffeffff, 0xeefffffe, 0xeefffeff, 0xfffefffe, 0xeefffffe, 0xeeffffff,
+ 0xeefffefe, 0xffffffff, 0xeeffffff, 0xeefefefe, 0xeefefefe, 0xeeffffff, 0xeefffefe, 0xeefeffff,
+ 0xfffffffe, 0xeefffffe, 0xeefffefe, 0xeeffffff, 0xeefefeff, 0xeefefeff, 0xfffffeff, 0xfffffeff,
+ 0xffffffff, 0xeefeffff, 0xeefefeff, 0xeefffeff, 0xfffeffff, 0xeefffefe, 0xffffffff, 0xeefffffe,
+ 0xeeffffff, 0xfffffeff, 0xeefffffe, 0xeeffffff, 0xeefeffff, 0xfffefefe, 0xeefffeff, 0xeefffffe,
+ 0xeefffefe, 0xeefffeff, 0xfffefefe, 0xfffffffe, 0xeefffeff, 0xeefefeff, 0xeefffefe, 0xeeffffff,
+ 0xeefffeff, 0xeefefeff, 0xfffefeff, 0xeefefefe, 0xfffffffe, 0xfffefeff, 0xeefefeff, 0xeeffffff,
+ 0xeefefefe, 0xeefffffe, 0xeefefefe, 0xeefffeff, 0xfffefffe, 0xfffefefe, 0xeefefffe, 0xeefefffe,
+ 0xfffffffe, 0xffffffff, 0xeefeffff, 0xfffffefe, 0xeefefefe, 0xeefffefe, 0xfffefefe, 0xeefefeff,
+ 0xfffeffff, 0xeeffffff, 0xfffefefe, 0xfffefefe, 0xeefeffff, 0xeefeffff, 0xfffffefe, 0xeeffffff,
+ 0xeefffefe, 0xeefefffe, 0xeefefffe, 0xeefffeff, 0xfffffefe, 0xeeffffff, 0xfffefeff, 0xfffffefe,
+ 0xeefeffff, 0xeefefeff, 0xeefefeff, 0xeefffffe, 0xfffffefe, 0xeefffeff, 0xeefefffe, 0xeefefefe,
+ 0xeefeffff, 0xeefefefe, 0xeefeffff, 0xeefffeff, 0xeefeffff, 0xeeffffff, 0xfffffeff, 0xeeffffff,
+ 0xeefefffe, 0xfffefffe, 0xfffefffe, 0xeefffeff, 0xfffffeff, 0xeefefefe, 0xeefefffe, 0xeefefffe,
+ 0xeefefffe, 0xeefffeff, 0xeefffeff, 0xfffeffff, 0xeefffffe, 0xeeffffff, 0xeefffefe, 0xeefefefe,
+ 0xeefefeff, 0xeefefefe, 0xeefefeff, 0xeeffffff, 0xeeffffff, 0xfffefffe, 0xfffeffff, 0xeefffefe,
+ 0xeefffffe, 0xeefefefe, 0xeefffefe, 0xeefeffff, 0xeefffffe, 0xeefefefe, 0xeefefffe, 0xeefeffff,
+ 0xeefffeff, 0xfffffffe, 0xeefeffff, 0xeefeffff, 0xeefffffe, 0xeefffffe, 0xeefefffe, 0xeefffeff,
+ 0xeefefeff, 0xfffffffe, 0xeefefeff, 0xeefefffe, 0xeeffffff, 0xeefffefe, 0xeefefeff, 0xeefffffe,
+ 0xeefefffe, 0xeefffeff, 0xeefefeff, 0xfffeffff, 0xeefefeff, 0xeefffeff, 0xeefffffe, 0xeefffeff,
+ 0xeefffefe, 0xeefefeff, 0xeefefffe, 0xeefefeff, 0xeefffeff, 0xeefffffe, 0xeefffffe, 0xeefefeff,
+ 0xeefefefe, 0xfffffeff, 0xeefffefe, 0xeefefeff, 0xeefefefe, 0xfffeffff, 0xeee6e7e6, 0xeed0d1d0,
+ 0xeeadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffdedfde, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefeff, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefffe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefeff, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefffe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe,
+ 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xffe9e9e9, 0xffdedfde,
+ 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffdedfde, 0xfffefdfd, 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefefd,
+ 0xfffdfefe, 0xfffdfefd, 0xfffefefd, 0xfffefefd, 0xfffefefd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffefefe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfe, 0xfffefdfd, 0xfffefefd, 0xfffdfefd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefd, 0xfffdfefe, 0xfffefdfd, 0xfffefdfd, 0xfffdfdfe,
+ 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfefd, 0xfffefdfe, 0xfffefdfd,
+ 0xfffdfefd, 0xfffefdfe, 0xfffefdfd, 0xfffefefd, 0xfffefefe, 0xfffefdfe, 0xfffefefe, 0xfffdfdfd,
+ 0xfffdfefd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffefdfd, 0xfffdfefd,
+ 0xfffdfdfd, 0xfffdfefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfefd, 0xfffefdfe,
+ 0xfffdfefd, 0xfffefefd, 0xfffdfefd, 0xfffdfefd, 0xfffdfefd, 0xfffdfefe, 0xfffefdfe, 0xfffdfefd,
+ 0xfffefefe, 0xfffdfdfe, 0xfffefefd, 0xfffdfdfd, 0xfffefefd, 0xfffefdfe, 0xfffefdfd, 0xfffefefd,
+ 0xfffdfefd, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefd,
+ 0xfffdfdfe, 0xfffefdfe, 0xfffdfdfe, 0xfffdfefe, 0xfffefefe, 0xfffefefd, 0xfffefdfe, 0xfffdfdfe,
+ 0xfffdfdfd, 0xfffdfefd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefefe, 0xfffefdfd,
+ 0xfffefdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffefdfd, 0xfffefdfd, 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffefefe, 0xfffdfefe, 0xfffefdfd, 0xfffefefe, 0xfffdfdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffefdfd,
+ 0xfffefdfe, 0xfffdfefd, 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfdfd,
+ 0xfffefefe, 0xfffdfefd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfdfe, 0xfffefefd, 0xfffefdfe, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffefefe, 0xfffdfdfe, 0xfffefdfe, 0xfffdfdfd, 0xfffdfefd, 0xfffefefe, 0xfffefdfd,
+ 0xfffdfefe, 0xfffdfefe, 0xfffefefe, 0xfffdfdfe, 0xfffdfdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfd, 0xfffefdfd, 0xfffefefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfefe,
+ 0xfffefdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffefdfd, 0xfffefdfd, 0xfffdfefe,
+ 0xfffdfefd, 0xfffdfefd, 0xfffdfdfd, 0xfffefefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfdfd, 0xfffefefd,
+ 0xfffefefd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfe, 0xfffefdfe, 0xfffefdfd,
+ 0xfffdfdfd, 0xfffefefd, 0xfffefefd, 0xfffdfefd, 0xfffefefd, 0xfffefdfd, 0xfffdfefe, 0xfffdfefd,
+ 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfe, 0xfffdfdfd, 0xfffdfdfe, 0xfffefdfe, 0xfffefdfd, 0xfffdfefe,
+ 0xfffdfdfd, 0xfffefefd, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfe,
+ 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfe,
+ 0xfffefefd, 0xfffdfdfd, 0xfffefefe, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfe, 0xfff4f4f4, 0xffdedfde,
+ 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffe9e9e9, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffcfcfd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffcfdfd, 0xfffdfdfc, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfc,
+ 0xfffdfcfd, 0xfffdfcfd, 0xfffdfcfc, 0xfffcfcfc, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfcfc, 0xfffdfcfd, 0xfffcfcfd, 0xfffdfdfc, 0xfffdfcfd, 0xfffdfdfc, 0xfffdfdfd,
+ 0xfffdfdfc, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfcfd, 0xfffcfcfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfdfd, 0xfffcfcfc, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfcfd,
+ 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd,
+ 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffcfcfc, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfcfd,
+ 0xfffdfcfd, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfcfd, 0xfffcfdfd, 0xfffdfcfc, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffcfdfc, 0xfffdfdfd, 0xfffdfcfc, 0xfffdfcfc, 0xfffcfdfc, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfcfd,
+ 0xfffdfcfd, 0xfffcfcfc, 0xfffdfdfc, 0xfffcfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfd,
+ 0xfffdfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffcfcfc, 0xfffdfcfd, 0xfffcfdfd, 0xfffdfcfc,
+ 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfd,
+ 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfcfd,
+ 0xfffdfdfd, 0xfffcfcfc, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfc, 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffdfcfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffdfdfc, 0xfffdfdfc, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfd, 0xfffcfdfc, 0xfffdfdfd,
+ 0xfffdfdfd, 0xfffcfcfd, 0xfffdfcfd, 0xfffcfdfc, 0xfffdfcfd, 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd,
+ 0xfffdfcfc, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfcfd, 0xfffdfdfd,
+ 0xfffcfdfd, 0xfffdfcfd, 0xfffdfcfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfdfd,
+ 0xfffdfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfc,
+ 0xfffcfcfd, 0xfffdfcfd, 0xfffdfdfc, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfc,
+ 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfc, 0xfffdfdfd, 0xfffdfcfd, 0xfffcfdfd, 0xfffcfdfc, 0xfffdfdfd,
+ 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfff4f4f4, 0xffe9e9e9,
+ 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffe9e9e9, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc,
+ 0xfffbfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffbfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc,
+ 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfff4f4f4, 0xffe9e9e9,
+ 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffe6ebe6, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb,
+ 0xfffbfcfc, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfc,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfcfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb,
+ 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffbfcfb, 0xfffbfcfb,
+ 0xfffbfcfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffcfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffbfbfc, 0xfffbfbfb, 0xfffbfcfc, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb,
+ 0xfffbfcfb, 0xfffbfcfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffcfbfb, 0xfffbfbfc,
+ 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffcfbfb,
+ 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb,
+ 0xfffbfbfc, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfc, 0xfffcfbfb, 0xfffbfcfb,
+ 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb,
+ 0xfffbfbfc, 0xfffbfcfc, 0xfffcfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfc, 0xfffbfbfb,
+ 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb,
+ 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfcfc, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfcfc,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc,
+ 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfcfc,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfc, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb,
+ 0xfffbfbfb, 0xfffbfcfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb,
+ 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb,
+ 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb,
+ 0xfffbfbfc, 0xfffbfcfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffe6ebe6, 0xfffafafb, 0xfffafafb, 0xfffafafa, 0xfffafbfa, 0xfffbfafb, 0xfffafafa, 0xfffafafa,
+ 0xfffafbfa, 0xfffbfafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafa, 0xfffbfafb, 0xfffafafa, 0xfffbfafa,
+ 0xfffafafa, 0xfffafafb, 0xfffbfafb, 0xfffafafa, 0xfffbfbfa, 0xfffafafa, 0xfffafbfb, 0xfffafbfb,
+ 0xfffafbfa, 0xfffafafb, 0xfffafbfa, 0xfffbfafa, 0xfffbfbfa, 0xfffafbfa, 0xfffbfafa, 0xfffafbfa,
+ 0xfffafafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafb, 0xfffafafb, 0xfffafafa, 0xfffafbfa, 0xfffbfbfb,
+ 0xfffafbfa, 0xfffbfafb, 0xfffafafa, 0xfffafbfb, 0xfffafbfa, 0xfffafafa, 0xfffafafb, 0xfffafbfb,
+ 0xfffbfafa, 0xfffafbfa, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffbfbfb, 0xfffafafa,
+ 0xfffafafa, 0xfffafafb, 0xfffbfafa, 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa,
+ 0xfffafafa, 0xfffbfbfa, 0xfffbfafa, 0xfffbfafb, 0xfffafafa, 0xfffafbfa, 0xfffafafa, 0xfffafbfa,
+ 0xfffafafa, 0xfffafafa, 0xfffbfafb, 0xfffafafa, 0xfffafbfa, 0xfffafafa, 0xfffafafa, 0xfffafafa,
+ 0xfffbfbfa, 0xfffafafa, 0xfffbfafa, 0xfffafafb, 0xfffbfbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafafa,
+ 0xfffafbfb, 0xfffbfbfa, 0xfffafafa, 0xfffafafa, 0xfffbfafb, 0xfffafafb, 0xfffafbfa, 0xfffafbfa,
+ 0xfffbfbfa, 0xfffbfbfb, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa, 0xfffbfafa, 0xfffafbfa, 0xfffafafa,
+ 0xfffbfafb, 0xfffafafa, 0xfffbfafb, 0xfffbfbfb, 0xfffbfafb, 0xfffafafa, 0xfffafafa, 0xfffafbfa,
+ 0xfffafafa, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffbfafb, 0xfffbfafb, 0xfffafbfa, 0xfffbfafa,
+ 0xfffafafa, 0xfffafbfb, 0xfffbfafa, 0xfffafafb, 0xfffafbfb, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa,
+ 0xfffafbfa, 0xfffafafa, 0xfffafafb, 0xfffbfafa, 0xfffafafa, 0xfffbfafa, 0xfffbfafb, 0xfffbfafb,
+ 0xfffafafa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfa, 0xfffafbfb, 0xfffafbfa,
+ 0xfffbfbfb, 0xfffafbfb, 0xfffbfafb, 0xfffafafa, 0xfffafafa, 0xfffbfafa, 0xfffbfafa, 0xfffbfafb,
+ 0xfffbfbfa, 0xfffafbfa, 0xfffafafa, 0xfffafbfa, 0xfffbfafa, 0xfffafafb, 0xfffafbfa, 0xfffafafb,
+ 0xfffbfbfa, 0xfffbfafa, 0xfffbfbfa, 0xfffbfafb, 0xfffbfafa, 0xfffafafa, 0xfffafafa, 0xfffbfafb,
+ 0xfffafafa, 0xfffbfbfb, 0xfffbfafb, 0xfffafafb, 0xfffafafa, 0xfffbfafa, 0xfffbfafb, 0xfffbfafb,
+ 0xfffbfafa, 0xfffafafb, 0xfffbfafa, 0xfffafafb, 0xfffafafa, 0xfffafbfb, 0xfffbfbfa, 0xfffbfafa,
+ 0xfffafbfa, 0xfffafafa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfb, 0xfffafbfb, 0xfffbfafb, 0xfffafafa,
+ 0xfffafbfb, 0xfffafafb, 0xfffbfbfa, 0xfffafafa, 0xfffafafb, 0xfffafafa, 0xfffafafb, 0xfffafbfa,
+ 0xfffbfafa, 0xfffbfbfb, 0xfffafafb, 0xfffafbfb, 0xfffafbfb, 0xfffbfafa, 0xfffafbfb, 0xfffafafa,
+ 0xfffafafa, 0xfffafbfa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafb,
+ 0xfffafbfa, 0xfffafafb, 0xfffbfafa, 0xfffbfafb, 0xfffafbfb, 0xfffbfbfa, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffe6ebe6, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfff9faf9, 0xfff9faf9, 0xfffafafa, 0xfff9f9f9,
+ 0xfffaf9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9fafa, 0xfff9fafa, 0xfff9f9fa, 0xfffafaf9,
+ 0xfff9faf9, 0xfffafafa, 0xfff9f9fa, 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9fa, 0xfffaf9fa, 0xfff9f9f9,
+ 0xfffafaf9, 0xfff9f9f9, 0xfff9faf9, 0xfffaf9f9, 0xfffafaf9, 0xfffaf9f9, 0xfff9f9fa, 0xfff9f9f9,
+ 0xfffafafa, 0xfff9faf9, 0xfff9f9f9, 0xfff9fafa, 0xfffafaf9, 0xfff9f9fa, 0xfffaf9f9, 0xfff9f9fa,
+ 0xfff9faf9, 0xfffafafa, 0xfffafafa, 0xfffafaf9, 0xfff9faf9, 0xfff9f9f9, 0xfff9fafa, 0xfffafaf9,
+ 0xfffafaf9, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfffafaf9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9fafa,
+ 0xfff9fafa, 0xfff9faf9, 0xfffaf9f9, 0xfffaf9fa, 0xfffaf9f9, 0xfff9f9fa, 0xfffaf9f9, 0xfff9f9f9,
+ 0xfff9faf9, 0xfffaf9fa, 0xfffaf9f9, 0xfffaf9f9, 0xfff9faf9, 0xfffafafa, 0xfff9f9f9, 0xfff9f9fa,
+ 0xfffafafa, 0xfff9f9f9, 0xfffafaf9, 0xfffaf9f9, 0xfff9faf9, 0xfff9f9f9, 0xfffafaf9, 0xfff9f9fa,
+ 0xfff9faf9, 0xfff9fafa, 0xfffaf9fa, 0xfffafaf9, 0xfffafaf9, 0xfffaf9fa, 0xfff9f9fa, 0xfffaf9f9,
+ 0xfffaf9fa, 0xfff9fafa, 0xfffaf9f9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9f9fa, 0xfffafafa, 0xfff9fafa,
+ 0xfff9f9fa, 0xfffaf9f9, 0xfffafaf9, 0xfffafaf9, 0xfff9faf9, 0xfff9f9fa, 0xfff9fafa, 0xfffaf9fa,
+ 0xfff9f9fa, 0xfffaf9f9, 0xfffafafa, 0xfff9faf9, 0xfffafaf9, 0xfffaf9f9, 0xfff9faf9, 0xfffaf9fa,
+ 0xfffafafa, 0xfffafaf9, 0xfff9faf9, 0xfffafaf9, 0xfffafafa, 0xfffafafa, 0xfff9f9f9, 0xfff9f9fa,
+ 0xfffaf9fa, 0xfff9f9f9, 0xfffafaf9, 0xfffafaf9, 0xfffafaf9, 0xfffaf9f9, 0xfffafafa, 0xfff9f9fa,
+ 0xfff9fafa, 0xfff9faf9, 0xfffaf9f9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9fafa, 0xfff9f9fa, 0xfff9f9fa,
+ 0xfff9f9f9, 0xfffafaf9, 0xfff9f9f9, 0xfff9faf9, 0xfff9f9fa, 0xfffaf9fa, 0xfff9faf9, 0xfffafafa,
+ 0xfff9f9fa, 0xfffaf9fa, 0xfffafaf9, 0xfffaf9f9, 0xfffafafa, 0xfff9f9fa, 0xfffafaf9, 0xfffaf9f9,
+ 0xfff9faf9, 0xfffafaf9, 0xfff9faf9, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfffafaf9, 0xfffaf9fa,
+ 0xfff9faf9, 0xfffaf9f9, 0xfffafaf9, 0xfffafaf9, 0xfff9fafa, 0xfffafafa, 0xfffaf9f9, 0xfff9fafa,
+ 0xfff9f9f9, 0xfffafaf9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9faf9, 0xfffafaf9, 0xfff9f9fa, 0xfff9f9fa,
+ 0xfffafaf9, 0xfffaf9fa, 0xfff9fafa, 0xfff9f9f9, 0xfff9faf9, 0xfff9f9f9, 0xfff9f9fa, 0xfff9fafa,
+ 0xfff9f9fa, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfff9f9fa, 0xfffafaf9, 0xfff9fafa, 0xfff9f9fa,
+ 0xfff9faf9, 0xfff9f9fa, 0xfff9fafa, 0xfffaf9f9, 0xfff9f9f9, 0xfffafafa, 0xfff9f9f9, 0xfff9faf9,
+ 0xfffafaf9, 0xfff9faf9, 0xfff9f9fa, 0xfffaf9f9, 0xfffaf9fa, 0xfff9f9fa, 0xfff9f9f9, 0xfff9fafa,
+ 0xfffafafa, 0xfffafafa, 0xfff9f9f9, 0xfffafafa, 0xfff9f9f9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9fafa,
+ 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9fa, 0xfffaf9f9, 0xfffaf9f9, 0xfffaf9f9, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffe6ebe6, 0xfff8f9f9, 0xfff9f8f8, 0xfff8f9f9, 0xfff9f8f9, 0xfff8f9f9, 0xfff9f8f9, 0xfff9f8f8,
+ 0xfff8f8f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f8,
+ 0xfff9f9f9, 0xfff9f8f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f8, 0xfff8f8f9,
+ 0xfff9f8f9, 0xfff8f9f8, 0xfff9f8f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f8f8, 0xfff8f9f9, 0xfff9f9f9,
+ 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f8, 0xfff8f8f9,
+ 0xfff9f9f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f8, 0xfff9f8f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f8,
+ 0xfff9f8f9, 0xfff8f8f8, 0xfff8f9f9, 0xfff9f9f9, 0xfff8f8f8, 0xfff9f8f9, 0xfff8f8f8, 0xfff9f9f9,
+ 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f9, 0xfff8f9f8, 0xfff8f8f8,
+ 0xfff9f8f8, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f9, 0xfff9f9f8, 0xfff8f8f8,
+ 0xfff8f8f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff9f8f8, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f9f9, 0xfff9f9f8,
+ 0xfff9f8f8, 0xfff8f8f8, 0xfff8f9f9, 0xfff9f9f9, 0xfff8f9f8, 0xfff9f9f8, 0xfff8f9f9, 0xfff8f9f9,
+ 0xfff9f8f8, 0xfff9f9f9, 0xfff8f8f8, 0xfff8f8f8, 0xfff9f9f8, 0xfff9f9f8, 0xfff9f9f9, 0xfff9f9f8,
+ 0xfff8f9f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f9f8, 0xfff8f8f8, 0xfff8f8f9, 0xfff8f8f9, 0xfff8f9f9,
+ 0xfff9f9f9, 0xfff9f9f9, 0xfff8f8f9, 0xfff9f8f9, 0xfff8f8f9, 0xfff8f8f9, 0xfff9f8f8, 0xfff9f9f9,
+ 0xfff9f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f8f9, 0xfff8f8f8,
+ 0xfff9f8f9, 0xfff9f8f9, 0xfff9f9f8, 0xfff8f8f8, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f8f9, 0xfff8f8f8,
+ 0xfff8f8f9, 0xfff9f9f9, 0xfff8f8f8, 0xfff8f9f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f8f9, 0xfff9f9f9,
+ 0xfff9f9f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f8f8, 0xfff8f8f9, 0xfff8f9f8,
+ 0xfff8f9f8, 0xfff9f8f9, 0xfff9f9f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f9,
+ 0xfff9f8f8, 0xfff9f8f9, 0xfff8f8f9, 0xfff9f9f9, 0xfff9f8f9, 0xfff8f8f8, 0xfff8f9f8, 0xfff9f8f9,
+ 0xfff9f8f8, 0xfff9f9f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f8f8,
+ 0xfff8f9f9, 0xfff8f9f8, 0xfff8f8f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f9f9, 0xfff8f9f8, 0xfff8f9f8,
+ 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f8, 0xfff9f9f8, 0xfff9f9f8, 0xfff8f9f8, 0xfff9f8f8, 0xfff8f8f8,
+ 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f8f8, 0xfff9f8f8, 0xfff9f9f8, 0xfff8f9f9, 0xfff9f8f9,
+ 0xfff8f8f9, 0xfff9f9f9, 0xfff9f9f8, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f8f9, 0xfff9f9f8,
+ 0xfff9f9f9, 0xfff9f8f9, 0xfff9f9f9, 0xfff8f8f9, 0xfff9f9f8, 0xfff8f9f9, 0xfff9f8f9, 0xfff9f9f9,
+ 0xfff9f9f8, 0xfff9f8f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff8f8f9, 0xfff8f9f8, 0xfff8f8f8, 0xfff8f8f9,
+ 0xfff8f9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfff8f9f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff7f8f7, 0xffe6ebe6,
+ 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff7f8f7, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f7f8, 0xfff7f7f8, 0xfff8f8f8,
+ 0xfff8f8f8, 0xfff7f8f8, 0xfff7f7f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff8f7f7, 0xfff8f8f7,
+ 0xfff7f8f8, 0xfff7f7f7, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f8f7, 0xfff8f8f8,
+ 0xfff8f7f7, 0xfff8f7f8, 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f8f7,
+ 0xfff8f8f7, 0xfff7f8f8, 0xfff7f7f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff8f8f8, 0xfff7f7f7,
+ 0xfff7f8f8, 0xfff7f7f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f8f8,
+ 0xfff7f8f8, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f8f7, 0xfff7f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f7,
+ 0xfff7f8f7, 0xfff8f8f7, 0xfff7f8f7, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f7f7, 0xfff8f8f7, 0xfff7f8f8,
+ 0xfff7f8f7, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f7, 0xfff7f8f7, 0xfff8f8f7, 0xfff7f7f8, 0xfff8f7f8,
+ 0xfff8f8f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff7f7f7, 0xfff7f8f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f8,
+ 0xfff7f8f8, 0xfff8f8f7, 0xfff8f7f8, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f7f8, 0xfff8f8f7, 0xfff7f8f8,
+ 0xfff7f7f8, 0xfff8f8f7, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f7f7, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f8f7,
+ 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff7f8f7, 0xfff8f7f7, 0xfff8f7f8,
+ 0xfff8f8f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff7f7f8, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f7f7,
+ 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f8, 0xfff7f7f7, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f8,
+ 0xfff8f7f7, 0xfff8f7f8, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f8f7, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f8f7,
+ 0xfff8f8f8, 0xfff7f7f8, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f8f7, 0xfff7f7f8, 0xfff7f8f8,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff7f8f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f8f8,
+ 0xfff7f8f8, 0xfff8f8f8, 0xfff7f8f8, 0xfff7f8f7, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f7,
+ 0xfff7f8f7, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f7f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f7f7, 0xfff8f8f8,
+ 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f8f7,
+ 0xfff7f8f7, 0xfff7f8f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff8f8f7, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f8f7,
+ 0xfff8f8f8, 0xfff8f8f7, 0xfff8f8f8, 0xfff7f7f7, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f8f8, 0xfff8f7f8,
+ 0xfff8f8f8, 0xfff7f8f7, 0xfff7f8f7, 0xfff8f7f7, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f7,
+ 0xfff8f8f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f7f7, 0xfff8f7f7, 0xfff8f8f7,
+ 0xfff8f7f7, 0xfff8f8f8, 0xfff8f8f8, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f7f8,
+ 0xfff7f8f7, 0xfff7f8f7, 0xfff8f8f7, 0xfff8f8f8, 0xfff8f8f8, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f7f7,
+ 0xfff7f7f8, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f7, 0xfff7f8f7, 0xfff8f8f8, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f7, 0xfff6f6f7, 0xfff6f7f7,
+ 0xfff6f6f7, 0xfff7f6f7, 0xfff7f7f7, 0xfff6f7f6, 0xfff7f7f7, 0xfff6f7f7, 0xfff7f6f6, 0xfff7f7f6,
+ 0xfff6f6f6, 0xfff7f7f7, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f7f7, 0xfff6f6f7, 0xfff7f7f6,
+ 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f7,
+ 0xfff6f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff6f6f6, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f7f6, 0xfff6f7f7,
+ 0xfff7f6f7, 0xfff6f6f6, 0xfff7f7f6, 0xfff6f7f6, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f6, 0xfff7f7f7,
+ 0xfff6f6f6, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff7f7f7, 0xfff6f7f7,
+ 0xfff6f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f7f6, 0xfff7f7f7,
+ 0xfff7f7f6, 0xfff6f6f7, 0xfff6f6f7, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f7f6, 0xfff6f7f7,
+ 0xfff7f6f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6,
+ 0xfff6f7f6, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f6f7,
+ 0xfff6f6f6, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f6f7, 0xfff7f7f6,
+ 0xfff6f7f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f6f7, 0xfff7f6f7,
+ 0xfff6f7f7, 0xfff6f7f7, 0xfff6f7f6, 0xfff7f6f7, 0xfff7f7f6, 0xfff7f7f6, 0xfff6f7f7, 0xfff7f6f7,
+ 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6, 0xfff7f7f7, 0xfff6f6f7, 0xfff7f7f7, 0xfff6f6f7, 0xfff6f6f6,
+ 0xfff6f6f7, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f7, 0xfff7f7f6, 0xfff6f6f7,
+ 0xfff7f7f7, 0xfff6f7f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff7f6f7, 0xfff6f6f6, 0xfff7f7f7, 0xfff7f6f7,
+ 0xfff7f7f6, 0xfff6f6f7, 0xfff7f6f7, 0xfff6f6f7, 0xfff6f7f6, 0xfff6f7f6, 0xfff6f6f7, 0xfff7f6f7,
+ 0xfff7f6f6, 0xfff7f6f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f6,
+ 0xfff6f7f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f6f6, 0xfff7f6f7, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f7,
+ 0xfff6f6f6, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f6f7,
+ 0xfff6f6f7, 0xfff6f7f7, 0xfff6f7f7, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f7,
+ 0xfff6f7f7, 0xfff7f6f7, 0xfff6f6f6, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f7f7,
+ 0xfff6f7f7, 0xfff6f7f6, 0xfff6f7f7, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f7,
+ 0xfff7f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f7f7, 0xfff7f6f7,
+ 0xfff6f6f7, 0xfff7f7f6, 0xfff6f7f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f6,
+ 0xfff6f6f7, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff6f6f7, 0xfff7f7f6, 0xfff6f6f7, 0xfff7f6f6,
+ 0xfff6f6f7, 0xfff6f6f7, 0xfff7f7f6, 0xfff6f7f7, 0xfff7f6f6, 0xfff7f7f7, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff6f6f6, 0xfff6f6f5, 0xfff6f5f6, 0xfff5f5f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff5f6f5,
+ 0xfff6f6f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff6f5f6, 0xfff6f5f5, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f5f6,
+ 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f5f6,
+ 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f5,
+ 0xfff6f5f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f5, 0xfff5f5f6, 0xfff6f5f6, 0xfff6f6f6,
+ 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6,
+ 0xfff5f5f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f6,
+ 0xfff5f5f6, 0xfff5f6f6, 0xfff5f5f6, 0xfff5f5f5, 0xfff6f5f5, 0xfff6f6f6, 0xfff5f5f5, 0xfff5f6f6,
+ 0xfff6f5f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f5,
+ 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f5f6, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f5f6, 0xfff6f6f5,
+ 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff5f5f5, 0xfff6f6f5,
+ 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff5f5f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f6f6,
+ 0xfff5f5f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f6f5,
+ 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f5f5,
+ 0xfff5f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f5, 0xfff6f5f5, 0xfff6f6f5, 0xfff6f6f5,
+ 0xfff5f6f6, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f5f5, 0xfff5f5f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff6f6f6,
+ 0xfff5f6f5, 0xfff5f5f5, 0xfff5f6f6, 0xfff6f6f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff5f6f5,
+ 0xfff6f5f6, 0xfff6f5f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff6f5f5, 0xfff5f5f5, 0xfff6f6f6,
+ 0xfff5f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f6, 0xfff5f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f6f6,
+ 0xfff6f5f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f5, 0xfff6f6f5, 0xfff6f5f6,
+ 0xfff6f6f5, 0xfff5f6f5, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f5,
+ 0xfff6f5f6, 0xfff6f6f6, 0xfff5f6f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6,
+ 0xfff6f6f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff5f5f6, 0xfff6f5f5, 0xfff5f6f6,
+ 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f5, 0xfff5f5f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff5f6f5,
+ 0xfff5f6f5, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff6f5f6,
+ 0xfff6f6f5, 0xfff5f5f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff6f6f5,
+ 0xfff6f6f6, 0xfff5f6f5, 0xfff6f6f5, 0xfff6f6f5, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f5, 0xfff5f6f6,
+ 0xfff6f6f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f6f6, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f4f5, 0xfff5f4f4, 0xfff5f4f4, 0xfff5f4f5,
+ 0xfff4f5f4, 0xfff4f4f5, 0xfff5f4f4, 0xfff5f4f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff4f5f4, 0xfff4f4f5,
+ 0xfff5f4f5, 0xfff4f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f5f4,
+ 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5,
+ 0xfff5f5f4, 0xfff4f4f4, 0xfff4f5f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5,
+ 0xfff4f4f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f5, 0xfff5f4f4,
+ 0xfff5f4f5, 0xfff5f4f5, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f4,
+ 0xfff4f4f4, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f5f4,
+ 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f4,
+ 0xfff5f5f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f5,
+ 0xfff4f5f5, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f5, 0xfff5f5f5, 0xfff5f4f5, 0xfff4f5f5,
+ 0xfff5f5f4, 0xfff4f4f4, 0xfff4f5f5, 0xfff4f4f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f5f5,
+ 0xfff4f4f4, 0xfff4f5f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f5f4, 0xfff4f4f5,
+ 0xfff5f5f4, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f5,
+ 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f4, 0xfff4f4f5, 0xfff4f4f5,
+ 0xfff4f4f5, 0xfff5f4f5, 0xfff4f4f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f4,
+ 0xfff4f4f4, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5, 0xfff4f5f5,
+ 0xfff4f5f4, 0xfff5f4f4, 0xfff4f4f4, 0xfff5f5f4, 0xfff4f4f5, 0xfff5f4f5, 0xfff5f4f5, 0xfff5f4f5,
+ 0xfff5f5f5, 0xfff5f4f4, 0xfff4f5f4, 0xfff4f4f5, 0xfff5f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f4f5,
+ 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f4f4, 0xfff4f5f4, 0xfff5f4f4,
+ 0xfff5f5f4, 0xfff4f4f5, 0xfff5f4f4, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f5f5,
+ 0xfff4f5f4, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f5f5,
+ 0xfff5f4f4, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f4f4, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f5f5,
+ 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f5f5,
+ 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f5, 0xfff5f4f5, 0xfff5f4f4, 0xfff4f4f4, 0xfff5f5f4, 0xfff5f5f4,
+ 0xfff5f4f5, 0xfff5f5f4, 0xfff4f5f4, 0xfff4f5f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f5f5,
+ 0xfff5f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f4f5, 0xfff5f5f4,
+ 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f5f4, 0xfff4f5f5, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff3f3f4, 0xfff4f3f3,
+ 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f4f4, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f3f4,
+ 0xfff3f3f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff4f4f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff4f4f4, 0xfff3f3f4,
+ 0xfff4f4f4, 0xfff3f3f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff4f4f3,
+ 0xfff4f4f3, 0xfff3f3f3, 0xfff3f3f4, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f3f4, 0xfff3f3f3, 0xfff4f4f3,
+ 0xfff4f3f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f3f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f3f4,
+ 0xfff4f4f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f4f3,
+ 0xfff4f3f3, 0xfff4f3f4, 0xfff3f3f4, 0xfff4f4f4, 0xfff3f3f3, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f3f3,
+ 0xfff4f3f3, 0xfff3f3f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f3f3, 0xfff4f3f4,
+ 0xfff4f4f4, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f3, 0xfff4f4f4, 0xfff4f3f3,
+ 0xfff3f4f4, 0xfff3f3f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff3f4f4, 0xfff4f3f4, 0xfff4f3f3,
+ 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f3f4,
+ 0xfff3f3f3, 0xfff4f3f3, 0xfff4f3f3, 0xfff3f3f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f3f3, 0xfff3f3f3,
+ 0xfff4f4f3, 0xfff3f3f3, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f4f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff4f3f4,
+ 0xfff4f3f4, 0xfff4f4f4, 0xfff3f3f3, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f3f3, 0xfff4f4f4, 0xfff3f4f4,
+ 0xfff3f3f4, 0xfff3f3f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff3f3f3, 0xfff4f3f4, 0xfff3f4f4, 0xfff4f4f4,
+ 0xfff4f4f4, 0xfff3f4f3, 0xfff3f4f4, 0xfff3f4f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f3f4,
+ 0xfff4f3f4, 0xfff3f3f3, 0xfff3f3f4, 0xfff4f4f4, 0xfff4f3f4, 0xfff3f3f3, 0xfff3f4f4, 0xfff3f3f3,
+ 0xfff4f3f4, 0xfff3f4f4, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f4f4, 0xfff3f3f4, 0xfff4f3f3, 0xfff4f4f4,
+ 0xfff4f3f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f3, 0xfff4f3f4, 0xfff4f4f4, 0xfff4f3f3, 0xfff3f3f4,
+ 0xfff4f3f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f3,
+ 0xfff4f4f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff4f3f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff3f3f3, 0xfff4f4f4,
+ 0xfff3f3f4, 0xfff4f4f4, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f3f3, 0xfff4f4f4, 0xfff3f3f4,
+ 0xfff4f3f3, 0xfff4f3f3, 0xfff3f4f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f4, 0xfff3f3f4, 0xfff4f4f3,
+ 0xfff3f3f4, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f3f3, 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f4, 0xfff4f4f4,
+ 0xfff3f3f4, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f3f4, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f4f4,
+ 0xfff3f3f3, 0xfff4f3f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f3f4, 0xfff3f4f3,
+ 0xfff4f3f4, 0xfff4f3f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f4f4, 0xfff3f4f3, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f3f3, 0xfff3f2f2, 0xfff2f3f2,
+ 0xfff2f3f3, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f2, 0xfff2f3f3,
+ 0xfff2f3f3, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f3f3, 0xfff2f3f2, 0xfff2f2f3,
+ 0xfff3f2f3, 0xfff3f2f3, 0xfff3f3f3, 0xfff2f2f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff3f2f3, 0xfff2f2f3,
+ 0xfff2f3f3, 0xfff3f3f3, 0xfff3f2f3, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f3f3, 0xfff3f2f3, 0xfff3f2f2,
+ 0xfff2f3f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff2f2f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f2f2, 0xfff3f2f3,
+ 0xfff2f2f3, 0xfff3f2f2, 0xfff2f3f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff3f2f3,
+ 0xfff3f2f3, 0xfff2f3f2, 0xfff3f2f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff3f3f2,
+ 0xfff2f3f3, 0xfff2f3f2, 0xfff3f3f2, 0xfff3f3f2, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f3f3, 0xfff2f3f3,
+ 0xfff3f2f2, 0xfff3f2f2, 0xfff3f2f3, 0xfff3f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f2f2,
+ 0xfff3f3f2, 0xfff2f3f3, 0xfff2f3f3, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f2f3, 0xfff2f3f2,
+ 0xfff2f3f3, 0xfff2f3f2, 0xfff2f3f3, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f2f2, 0xfff2f2f3, 0xfff2f2f3,
+ 0xfff3f2f2, 0xfff3f3f2, 0xfff3f3f3, 0xfff3f3f3, 0xfff3f3f2, 0xfff2f2f2, 0xfff3f3f3, 0xfff3f2f2,
+ 0xfff3f2f2, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f2, 0xfff2f2f2, 0xfff3f3f3, 0xfff3f2f3,
+ 0xfff3f2f3, 0xfff2f2f3, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f3f3, 0xfff3f2f2, 0xfff3f2f3, 0xfff3f3f3,
+ 0xfff2f3f3, 0xfff2f2f3, 0xfff2f2f3, 0xfff2f2f2, 0xfff3f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff2f2f3,
+ 0xfff2f3f2, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f3f2, 0xfff3f3f2,
+ 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f2f2,
+ 0xfff3f2f3, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f2, 0xfff3f2f2,
+ 0xfff2f3f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f3f2,
+ 0xfff2f3f3, 0xfff2f3f3, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f2f3, 0xfff3f3f3,
+ 0xfff3f2f3, 0xfff2f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff3f3f3, 0xfff3f3f2,
+ 0xfff3f3f3, 0xfff3f2f2, 0xfff2f3f2, 0xfff3f2f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f2f2, 0xfff3f2f3,
+ 0xfff2f2f3, 0xfff2f3f3, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f2f2,
+ 0xfff2f2f2, 0xfff3f2f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff2f2f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f3f2,
+ 0xfff3f3f3, 0xfff3f3f3, 0xfff3f2f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff3f3f2,
+ 0xfff2f2f2, 0xfff3f3f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f2f3, 0xfff3f2f3, 0xfff3f2f3, 0xfff3f2f3,
+ 0xfff3f3f2, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff3f2f3, 0xfff2f3f3, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff2f1f2, 0xfff1f1f1, 0xfff2f2f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f2f1, 0xfff1f1f2,
+ 0xfff2f2f2, 0xfff1f2f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f2f1,
+ 0xfff2f2f1, 0xfff1f1f1, 0xfff2f2f1, 0xfff1f1f1, 0xfff2f1f1, 0xfff2f1f1, 0xfff1f1f1, 0xfff2f1f2,
+ 0xfff1f2f2, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f2f1, 0xfff2f1f1,
+ 0xfff2f2f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f1f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff1f1f1,
+ 0xfff1f2f2, 0xfff2f1f1, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f2f1, 0xfff2f1f2, 0xfff2f1f2, 0xfff1f2f1,
+ 0xfff1f2f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f1f2, 0xfff2f2f1, 0xfff1f2f1, 0xfff2f2f1, 0xfff1f2f2,
+ 0xfff1f2f1, 0xfff2f2f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f1,
+ 0xfff1f2f1, 0xfff2f1f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff2f1f2, 0xfff1f1f1, 0xfff2f1f1, 0xfff2f1f2,
+ 0xfff1f2f1, 0xfff2f2f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff1f1f1, 0xfff2f1f2, 0xfff2f1f2,
+ 0xfff1f2f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff2f1f1, 0xfff2f2f1, 0xfff2f2f1, 0xfff2f1f1, 0xfff1f2f1,
+ 0xfff2f1f1, 0xfff1f2f1, 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f1f1,
+ 0xfff1f2f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f1,
+ 0xfff1f1f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f2, 0xfff1f1f2,
+ 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f2f1, 0xfff2f2f2, 0xfff2f1f1,
+ 0xfff1f1f1, 0xfff1f1f2, 0xfff1f1f1, 0xfff2f1f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f2f1, 0xfff2f1f1,
+ 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f1,
+ 0xfff2f2f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f2f1,
+ 0xfff2f2f1, 0xfff1f1f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff2f1f2,
+ 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f2, 0xfff1f2f2, 0xfff2f2f1, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f2f1,
+ 0xfff1f2f2, 0xfff2f2f1, 0xfff2f2f1, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f1f2,
+ 0xfff1f2f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff2f2f2,
+ 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff2f1f1,
+ 0xfff2f1f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff1f1f1,
+ 0xfff2f1f1, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f1f2, 0xfff2f2f1, 0xfff1f1f1, 0xfff1f1f2, 0xfff2f1f1,
+ 0xfff2f1f2, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f2f1, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f1f1,
+ 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff1f1f1,
+ 0xfff2f1f2, 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f1f2, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5,
+ 0xffdedbde, 0xfff1f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f0f1,
+ 0xfff0f1f1, 0xfff0f1f0, 0xfff1f1f1, 0xfff0f1f1, 0xfff1f1f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f1,
+ 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0, 0xfff1f1f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff1f1f0,
+ 0xfff0f1f0, 0xfff1f0f1, 0xfff0f1f1, 0xfff1f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff1f0f1,
+ 0xfff0f1f1, 0xfff1f1f1, 0xfff1f1f0, 0xfff1f0f1, 0xfff0f0f0, 0xfff1f1f1, 0xfff0f0f1, 0xfff0f1f0,
+ 0xfff1f1f0, 0xfff0f0f0, 0xfff0f1f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff0f1f1, 0xfff1f1f1, 0xfff1f0f0,
+ 0xfff1f0f1, 0xfff1f0f1, 0xfff0f0f1, 0xfff1f1f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff1f1f0, 0xfff0f0f1,
+ 0xfff1f0f0, 0xfff1f1f1, 0xfff1f1f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f1f1,
+ 0xfff1f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f0f1,
+ 0xfff1f1f1, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f1f1, 0xfff0f0f0, 0xfff1f1f1, 0xfff1f1f0,
+ 0xfff1f1f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f0, 0xfff1f0f1, 0xfff1f1f0,
+ 0xfff1f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f1f0, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f0f0, 0xfff1f1f1,
+ 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff1f1f1,
+ 0xfff0f0f0, 0xfff0f1f0, 0xfff0f0f0, 0xfff1f0f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0,
+ 0xfff1f1f0, 0xfff1f1f1, 0xfff0f1f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f1,
+ 0xfff0f0f1, 0xfff1f1f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f1, 0xfff1f0f0, 0xfff1f1f1,
+ 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f0,
+ 0xfff0f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f0, 0xfff0f0f0,
+ 0xfff0f1f1, 0xfff0f0f0, 0xfff0f1f1, 0xfff0f0f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f0f0, 0xfff1f1f0,
+ 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0,
+ 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f0f0,
+ 0xfff0f0f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff1f0f1, 0xfff0f1f0, 0xfff0f1f1, 0xfff0f0f0,
+ 0xfff0f0f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff1f1f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f1,
+ 0xfff0f0f1, 0xfff1f0f0, 0xfff0f1f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f1f0, 0xfff0f1f0, 0xfff1f0f1,
+ 0xfff0f0f1, 0xfff1f1f0, 0xfff0f0f1, 0xfff0f1f0, 0xfff0f1f1, 0xfff1f0f0, 0xfff0f0f1, 0xfff1f1f0,
+ 0xfff0f1f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f1f0, 0xfff1f0f1,
+ 0xfff1f0f0, 0xfff0f0f1, 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f0f1,
+ 0xfff0f0f0, 0xfff0f0f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f1, 0xffe9e8e9, 0xffdedbde,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xfff0eff0, 0xffefeff0, 0xfff0f0ef, 0xfff0eff0, 0xfff0eff0, 0xffefefef, 0xffeff0f0,
+ 0xfff0efef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xffefeff0, 0xfff0efef, 0xffeff0f0, 0xfff0efef,
+ 0xffefefef, 0xffefefef, 0xffeff0f0, 0xfff0efef, 0xffefefef, 0xffeff0f0, 0xffefeff0, 0xffefefef,
+ 0xfff0f0f0, 0xfff0eff0, 0xfff0efef, 0xfff0eff0, 0xfff0efef, 0xfff0f0ef, 0xfff0eff0, 0xfff0efef,
+ 0xffeff0f0, 0xffefeff0, 0xfff0efef, 0xfff0f0ef, 0xffefeff0, 0xffeff0f0, 0xfff0f0f0, 0xfff0efef,
+ 0xfff0f0ef, 0xffefefef, 0xffeff0f0, 0xfff0f0ef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0eff0,
+ 0xffefefef, 0xffefefef, 0xfff0eff0, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef,
+ 0xfff0efef, 0xfff0f0f0, 0xffeff0ef, 0xffeff0f0, 0xfff0f0f0, 0xffefefef, 0xffefefef, 0xfff0f0f0,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xfff0f0f0, 0xfff0f0f0, 0xfff0efef, 0xffeff0f0,
+ 0xfff0efef, 0xffefeff0, 0xfff0eff0, 0xffeff0ef, 0xfff0eff0, 0xfff0eff0, 0xfff0eff0, 0xffeff0f0,
+ 0xffeff0ef, 0xfff0eff0, 0xffeff0f0, 0xfff0eff0, 0xffefefef, 0xfff0efef, 0xfff0f0ef, 0xffefefef,
+ 0xffeff0f0, 0xffeff0ef, 0xffefeff0, 0xffeff0ef, 0xffeff0ef, 0xffefeff0, 0xfff0f0f0, 0xffefefef,
+ 0xffefeff0, 0xfff0f0ef, 0xfff0efef, 0xfff0efef, 0xffefeff0, 0xfff0f0ef, 0xffeff0ef, 0xffefefef,
+ 0xfff0efef, 0xffefefef, 0xffefefef, 0xfff0f0f0, 0xfff0f0ef, 0xfff0f0ef, 0xffeff0f0, 0xfff0f0ef,
+ 0xffefefef, 0xfff0eff0, 0xfff0efef, 0xfff0efef, 0xffefeff0, 0xfff0efef, 0xffeff0f0, 0xfff0f0ef,
+ 0xffeff0f0, 0xffefefef, 0xffefeff0, 0xfff0eff0, 0xfff0efef, 0xfff0f0f0, 0xfff0efef, 0xfff0f0ef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffeff0f0, 0xfff0eff0, 0xffefeff0, 0xffeff0ef, 0xffefefef,
+ 0xffeff0f0, 0xffefeff0, 0xffefeff0, 0xffefeff0, 0xffeff0ef, 0xffefeff0, 0xffeff0ef, 0xfff0eff0,
+ 0xffeff0ef, 0xfff0eff0, 0xfff0efef, 0xfff0f0ef, 0xffeff0f0, 0xfff0efef, 0xffeff0f0, 0xfff0f0ef,
+ 0xfff0efef, 0xfff0efef, 0xffefefef, 0xffefeff0, 0xffefefef, 0xfff0efef, 0xffefefef, 0xfff0efef,
+ 0xfff0f0f0, 0xfff0f0ef, 0xfff0efef, 0xfff0eff0, 0xffefeff0, 0xffefefef, 0xffeff0ef, 0xffeff0ef,
+ 0xffefeff0, 0xffeff0ef, 0xfff0f0ef, 0xfff0efef, 0xffeff0ef, 0xfff0f0f0, 0xfff0f0ef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffeff0ef, 0xfff0f0ef, 0xffefeff0, 0xffefeff0, 0xffefefef, 0xffefefef,
+ 0xffefeff0, 0xfff0eff0, 0xffeff0f0, 0xffeff0ef, 0xffefefef, 0xffeff0ef, 0xffeff0ef, 0xfff0f0f0,
+ 0xfff0f0f0, 0xfff0eff0, 0xfff0efef, 0xffefefef, 0xfff0eff0, 0xffeff0f0, 0xffefeff0, 0xffefeff0,
+ 0xfff0f0ef, 0xfff0f0ef, 0xffefefef, 0xffefeff0, 0xfff0efef, 0xfff0f0f0, 0xfff0efef, 0xffefefef,
+ 0xfff0eff0, 0xffefefef, 0xffefeff0, 0xffeff0ef, 0xfff0efef, 0xffefefef, 0xffefeff0, 0xffeff0f0,
+ 0xffeff0ef, 0xfff0f0ef, 0xffeff0ef, 0xffefefef, 0xffefeff0, 0xffefefef, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffefeeee, 0xffeeeeee, 0xffeeefee, 0xffeeeeee, 0xffeeeeef, 0xffeeeeee, 0xffefefee,
+ 0xffeeefef, 0xffeeefee, 0xffefefee, 0xffefefee, 0xffefefee, 0xffeeefee, 0xffeeeeee, 0xffeeeeee,
+ 0xffefefef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeef, 0xffefeeee, 0xffefefee, 0xffeeefee, 0xffeeeeee,
+ 0xffeeeeee, 0xffeeefef, 0xffeeeeee, 0xffeeefee, 0xffeeefef, 0xffefeeee, 0xffefeeee, 0xffeeeeef,
+ 0xffeeeeee, 0xffeeefee, 0xffeeeeef, 0xffeeeeee, 0xffeeeeef, 0xffeeefee, 0xffefeeef, 0xffefeeee,
+ 0xffeeefee, 0xffefeeef, 0xffefeeee, 0xffefefee, 0xffefefef, 0xffefeeef, 0xffefefef, 0xffeeeeee,
+ 0xffeeefee, 0xffeeefee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffeeefef, 0xffefeeee, 0xffeeefee,
+ 0xffeeeeee, 0xffeeefef, 0xffeeefee, 0xffefeeee, 0xffeeefef, 0xffeeeeef, 0xffeeefee, 0xffefeeef,
+ 0xffeeefee, 0xffefefee, 0xffeeefee, 0xffeeefee, 0xffeeefee, 0xffeeefef, 0xffefeeef, 0xffeeefee,
+ 0xffefefef, 0xffeeeeef, 0xffefefee, 0xffeeeeee, 0xffefefee, 0xffefeeef, 0xffefeeee, 0xffefefee,
+ 0xffeeefee, 0xffeeefee, 0xffeeeeef, 0xffeeeeee, 0xffefeeef, 0xffeeeeef, 0xffeeeeee, 0xffeeefee,
+ 0xffeeeeef, 0xffefeeef, 0xffeeeeef, 0xffeeefef, 0xffefefef, 0xffefefee, 0xffefeeef, 0xffeeeeef,
+ 0xffeeeeee, 0xffeeefee, 0xffefeeee, 0xffeeeeee, 0xffeeeeef, 0xffeeeeee, 0xffefefef, 0xffefeeee,
+ 0xffefeeee, 0xffeeefef, 0xffeeeeef, 0xffefeeee, 0xffefeeee, 0xffefeeef, 0xffeeeeee, 0xffeeeeee,
+ 0xffefefef, 0xffeeefef, 0xffefeeee, 0xffefefef, 0xffeeeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee,
+ 0xffefeeef, 0xffeeefee, 0xffeeeeee, 0xffeeefef, 0xffeeeeee, 0xffeeefef, 0xffeeeeef, 0xffeeeeee,
+ 0xffefefef, 0xffeeefee, 0xffeeefef, 0xffeeeeef, 0xffeeeeef, 0xffefefee, 0xffefeeef, 0xffeeeeee,
+ 0xffeeeeee, 0xffefefef, 0xffeeeeef, 0xffefeeef, 0xffeeeeee, 0xffeeefee, 0xffefefef, 0xffefeeee,
+ 0xffeeefef, 0xffeeefef, 0xffefefef, 0xffeeeeef, 0xffeeeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee,
+ 0xffeeeeee, 0xffeeefee, 0xffeeeeee, 0xffefeeee, 0xffefefef, 0xffeeefee, 0xffefeeee, 0xffeeefef,
+ 0xffefeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffefeeee, 0xffefeeee, 0xffeeefef,
+ 0xffeeefee, 0xffeeefee, 0xffeeeeee, 0xffefefef, 0xffeeefee, 0xffefeeee, 0xffeeeeee, 0xffefefee,
+ 0xffefefee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeefee, 0xffeeeeef, 0xffefeeef, 0xffefeeee,
+ 0xffeeeeee, 0xffefefee, 0xffefefee, 0xffeeefee, 0xffefefee, 0xffefeeee, 0xffeeefef, 0xffeeefee,
+ 0xffeeeeee, 0xffeeeeef, 0xffeeeeef, 0xffeeeeee, 0xffeeeeef, 0xffefeeef, 0xffefeeee, 0xffeeefef,
+ 0xffeeeeee, 0xffefefee, 0xffeeeeee, 0xffefeeef, 0xffeeefef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeef,
+ 0xffefeeef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffefeeef, 0xffeeeeee, 0xffeeeeef,
+ 0xffefefee, 0xffeeeeee, 0xffefefef, 0xffeeefee, 0xffeeeeef, 0xffeeeeef, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffeeeded, 0xffeeedee, 0xffeeeded, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffedeeed,
+ 0xffedeeee, 0xffeeeded, 0xffedeeee, 0xffedeeed, 0xffeeedee, 0xffeeeeed, 0xffededed, 0xffeeeded,
+ 0xffeeeded, 0xffededee, 0xffeeeded, 0xffededed, 0xffededed, 0xffedeeed, 0xffeeedee, 0xffeeeded,
+ 0xffededee, 0xffeeeded, 0xffededed, 0xffededee, 0xffeeeeed, 0xffededed, 0xffededed, 0xffeeedee,
+ 0xffeeeded, 0xffedeeed, 0xffedeeed, 0xffededed, 0xffededed, 0xffeeeded, 0xffededed, 0xffededed,
+ 0xffeeeeed, 0xffedeeed, 0xffededed, 0xffedeeed, 0xffededed, 0xffeeeeed, 0xffeeeded, 0xffeeeded,
+ 0xffeeeeed, 0xffeeedee, 0xffeeeded, 0xffeeeeee, 0xffedeeed, 0xffeeeded, 0xffedeeee, 0xffededee,
+ 0xffeeeded, 0xffeeedee, 0xffedeeee, 0xffededee, 0xffededed, 0xffedeeee, 0xffeeeded, 0xffeeedee,
+ 0xffededed, 0xffeeedee, 0xffedeeee, 0xffeeedee, 0xffeeeeee, 0xffededee, 0xffededee, 0xffeeedee,
+ 0xffedeeed, 0xffededed, 0xffeeeded, 0xffeeedee, 0xffededee, 0xffeeeded, 0xffededee, 0xffededed,
+ 0xffedeeed, 0xffedeeed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffedeeee, 0xffededee,
+ 0xffeeeded, 0xffededed, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffeeedee, 0xffededed, 0xffedeeed,
+ 0xffeeedee, 0xffededed, 0xffeeedee, 0xffededed, 0xffededed, 0xffeeedee, 0xffedeeed, 0xffeeeded,
+ 0xffedeeed, 0xffededee, 0xffeeedee, 0xffeeeeed, 0xffedeeed, 0xffeeeeed, 0xffededee, 0xffededee,
+ 0xffedeeed, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffeeeeee, 0xffeeeded, 0xffeeeeed, 0xffeeeded,
+ 0xffeeedee, 0xffededed, 0xffeeeded, 0xffeeeeed, 0xffededee, 0xffeeeeee, 0xffededed, 0xffeeeeed,
+ 0xffeeeded, 0xffeeedee, 0xffededed, 0xffeeedee, 0xffeeeeed, 0xffedeeee, 0xffeeedee, 0xffededed,
+ 0xffeeeeed, 0xffededed, 0xffeeeded, 0xffededed, 0xffededee, 0xffedeeed, 0xffeeeeed, 0xffeeeeee,
+ 0xffedeeee, 0xffededed, 0xffeeeded, 0xffeeeeee, 0xffeeedee, 0xffededed, 0xffeeedee, 0xffedeeed,
+ 0xffeeeeed, 0xffededed, 0xffededed, 0xffedeeee, 0xffedeeed, 0xffedeeed, 0xffededee, 0xffeeeeee,
+ 0xffededed, 0xffeeeeee, 0xffedeeed, 0xffeeeded, 0xffeeeeed, 0xffeeeeee, 0xffedeeed, 0xffeeedee,
+ 0xffedeeee, 0xffededee, 0xffeeeded, 0xffedeeed, 0xffeeeded, 0xffedeeed, 0xffededee, 0xffededee,
+ 0xffeeeded, 0xffededee, 0xffededed, 0xffeeeded, 0xffedeeed, 0xffeeeeed, 0xffededee, 0xffeeedee,
+ 0xffededed, 0xffeeedee, 0xffeeedee, 0xffededed, 0xffedeeed, 0xffedeeee, 0xffeeeeee, 0xffededee,
+ 0xffededee, 0xffedeeed, 0xffeeeeed, 0xffedeeee, 0xffededed, 0xffeeeeed, 0xffedeeed, 0xffededed,
+ 0xffededee, 0xffeeedee, 0xffeeeeed, 0xffedeeee, 0xffeeedee, 0xffedeeee, 0xffededed, 0xffedeeed,
+ 0xffedeeed, 0xffededed, 0xffeeeded, 0xffedeeed, 0xffeeeded, 0xffedeeed, 0xffededed, 0xffeeeeed,
+ 0xffedeeed, 0xffeeeeee, 0xffedeeee, 0xffedeeed, 0xffedeeed, 0xffeeeded, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffecedec, 0xffedeced, 0xffededec, 0xffececec, 0xffedeced, 0xffeceded, 0xffedeced,
+ 0xffeceded, 0xffededed, 0xffedecec, 0xffecedec, 0xffececec, 0xffeceded, 0xffececec, 0xffededed,
+ 0xffeceded, 0xffeceded, 0xffededec, 0xffedeced, 0xffedeced, 0xffededec, 0xffedeced, 0xffedeced,
+ 0xffecedec, 0xffecedec, 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffececec, 0xffecedec,
+ 0xffececed, 0xffececec, 0xffededec, 0xffececed, 0xffecedec, 0xffededec, 0xffececed, 0xffedecec,
+ 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffeceded, 0xffedecec, 0xffedeced, 0xffececed,
+ 0xffecedec, 0xffedecec, 0xffeceded, 0xffececec, 0xffededed, 0xffececed, 0xffedecec, 0xffededec,
+ 0xffeceded, 0xffededed, 0xffededec, 0xffedecec, 0xffececec, 0xffececed, 0xffececed, 0xffeceded,
+ 0xffededec, 0xffececed, 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffececed, 0xffededed,
+ 0xffececec, 0xffececed, 0xffedeced, 0xffececed, 0xffecedec, 0xffedeced, 0xffececed, 0xffecedec,
+ 0xffececec, 0xffececec, 0xffedecec, 0xffededed, 0xffededec, 0xffececed, 0xffececec, 0xffececed,
+ 0xffececec, 0xffedeced, 0xffececed, 0xffececed, 0xffececec, 0xffededed, 0xffededed, 0xffedecec,
+ 0xffedeced, 0xffedecec, 0xffececec, 0xffedecec, 0xffeceded, 0xffedecec, 0xffececed, 0xffeceded,
+ 0xffececec, 0xffececed, 0xffededec, 0xffeceded, 0xffececed, 0xffececed, 0xffeceded, 0xffededec,
+ 0xffececed, 0xffeceded, 0xffedecec, 0xffececed, 0xffededec, 0xffecedec, 0xffececec, 0xffedecec,
+ 0xffedeced, 0xffececec, 0xffedecec, 0xffececed, 0xffededec, 0xffeceded, 0xffededec, 0xffececec,
+ 0xffedecec, 0xffededec, 0xffededec, 0xffececec, 0xffececed, 0xffecedec, 0xffececec, 0xffecedec,
+ 0xffececec, 0xffededec, 0xffedeced, 0xffedecec, 0xffececec, 0xffededed, 0xffecedec, 0xffededec,
+ 0xffedeced, 0xffedeced, 0xffecedec, 0xffecedec, 0xffececec, 0xffececed, 0xffedecec, 0xffececec,
+ 0xffececec, 0xffedeced, 0xffeceded, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec,
+ 0xffedeced, 0xffececed, 0xffededed, 0xffedeced, 0xffededed, 0xffedecec, 0xffececed, 0xffededed,
+ 0xffedeced, 0xffececed, 0xffedecec, 0xffececed, 0xffededec, 0xffededed, 0xffededec, 0xffecedec,
+ 0xffececec, 0xffececed, 0xffececec, 0xffedeced, 0xffededec, 0xffedeced, 0xffedecec, 0xffedeced,
+ 0xffececed, 0xffededed, 0xffececec, 0xffedeced, 0xffececed, 0xffedeced, 0xffececec, 0xffececed,
+ 0xffececed, 0xffececec, 0xffededed, 0xffedecec, 0xffecedec, 0xffecedec, 0xffededec, 0xffededed,
+ 0xffececec, 0xffececec, 0xffedeced, 0xffededec, 0xffececed, 0xffeceded, 0xffeceded, 0xffecedec,
+ 0xffeceded, 0xffececec, 0xffececec, 0xffedecec, 0xffecedec, 0xffeceded, 0xffececec, 0xffedeced,
+ 0xffedeced, 0xffecedec, 0xffededed, 0xffededec, 0xffededed, 0xffededed, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffebebeb, 0xffebebec, 0xffecebeb, 0xffebecec, 0xffebecec, 0xffececeb, 0xffebebec,
+ 0xffebecec, 0xffebebeb, 0xffebecec, 0xffecebec, 0xffecebeb, 0xffebebeb, 0xffecebec, 0xffecebeb,
+ 0xffebeceb, 0xffebebec, 0xffecebeb, 0xffececeb, 0xffecebeb, 0xffebeceb, 0xffebebec, 0xffebecec,
+ 0xffebecec, 0xffecebec, 0xffecebec, 0xffecebec, 0xffecebec, 0xffecebeb, 0xffecebec, 0xffecebec,
+ 0xffecebeb, 0xffebebeb, 0xffebeceb, 0xffececec, 0xffecebeb, 0xffecebec, 0xffebecec, 0xffebeceb,
+ 0xffebebec, 0xffececec, 0xffecebeb, 0xffecebec, 0xffececeb, 0xffececeb, 0xffebeceb, 0xffebebec,
+ 0xffececeb, 0xffebebec, 0xffecebec, 0xffececec, 0xffececeb, 0xffebeceb, 0xffebecec, 0xffecebeb,
+ 0xffebecec, 0xffebecec, 0xffececec, 0xffecebeb, 0xffecebec, 0xffececec, 0xffebecec, 0xffebecec,
+ 0xffececec, 0xffebebeb, 0xffececeb, 0xffececeb, 0xffecebec, 0xffecebeb, 0xffececeb, 0xffebebec,
+ 0xffecebec, 0xffececeb, 0xffececec, 0xffebebec, 0xffebebeb, 0xffececec, 0xffebecec, 0xffebebec,
+ 0xffececec, 0xffebebec, 0xffebecec, 0xffecebec, 0xffebebeb, 0xffecebec, 0xffebebec, 0xffececeb,
+ 0xffecebeb, 0xffececec, 0xffececeb, 0xffebebeb, 0xffecebeb, 0xffebebec, 0xffebebec, 0xffececeb,
+ 0xffececeb, 0xffebeceb, 0xffececeb, 0xffececeb, 0xffebebeb, 0xffebebec, 0xffececeb, 0xffebebec,
+ 0xffececeb, 0xffecebeb, 0xffebebec, 0xffecebec, 0xffecebec, 0xffececec, 0xffebeceb, 0xffececec,
+ 0xffebebec, 0xffebecec, 0xffebebeb, 0xffecebeb, 0xffebebeb, 0xffececec, 0xffebecec, 0xffececeb,
+ 0xffececeb, 0xffebecec, 0xffecebec, 0xffececeb, 0xffebeceb, 0xffececeb, 0xffebecec, 0xffecebec,
+ 0xffebebec, 0xffebecec, 0xffebeceb, 0xffebebeb, 0xffebecec, 0xffecebec, 0xffecebeb, 0xffebeceb,
+ 0xffebeceb, 0xffecebec, 0xffececec, 0xffecebeb, 0xffececeb, 0xffececeb, 0xffecebec, 0xffecebec,
+ 0xffebebec, 0xffebecec, 0xffececec, 0xffebebeb, 0xffecebeb, 0xffececeb, 0xffebebec, 0xffebebec,
+ 0xffecebeb, 0xffebebec, 0xffebebeb, 0xffebebeb, 0xffebecec, 0xffebecec, 0xffebeceb, 0xffececec,
+ 0xffebeceb, 0xffecebeb, 0xffecebeb, 0xffececec, 0xffebecec, 0xffebecec, 0xffebeceb, 0xffebecec,
+ 0xffebecec, 0xffebecec, 0xffebebec, 0xffebeceb, 0xffebebeb, 0xffecebeb, 0xffebebec, 0xffebecec,
+ 0xffececeb, 0xffebebec, 0xffecebec, 0xffebebeb, 0xffececec, 0xffecebeb, 0xffebebec, 0xffebecec,
+ 0xffebebec, 0xffebebeb, 0xffecebec, 0xffecebeb, 0xffebebeb, 0xffecebec, 0xffebecec, 0xffebebeb,
+ 0xffebeceb, 0xffececec, 0xffececec, 0xffecebec, 0xffebebec, 0xffececec, 0xffecebeb, 0xffebeceb,
+ 0xffebebec, 0xffececeb, 0xffebebec, 0xffebecec, 0xffecebec, 0xffebeceb, 0xffebecec, 0xffecebeb,
+ 0xffecebec, 0xffebeceb, 0xffecebec, 0xffebecec, 0xffebeceb, 0xffebeceb, 0xffecebeb, 0xffececeb,
+ 0xffebebec, 0xffececec, 0xffececeb, 0xffecebec, 0xffebebeb, 0xffebebec, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffebebeb, 0xffeaebeb, 0xffeaeaea, 0xffebebeb, 0xffebeaeb, 0xffeaeaea, 0xffebeaeb,
+ 0xffeaebea, 0xffebebea, 0xffebeaea, 0xffeaebea, 0xffebebea, 0xffebeaeb, 0xffeaebea, 0xffebeaea,
+ 0xffeaebea, 0xffeaeaeb, 0xffebeaeb, 0xffeaeaea, 0xffebebea, 0xffeaebeb, 0xffebebeb, 0xffeaebeb,
+ 0xffebebeb, 0xffebebeb, 0xffeaebeb, 0xffebeaea, 0xffebebeb, 0xffebebeb, 0xffebebeb, 0xffeaebea,
+ 0xffeaeaeb, 0xffebebeb, 0xffebebea, 0xffebebeb, 0xffebeaeb, 0xffebebeb, 0xffebebea, 0xffebebeb,
+ 0xffebebeb, 0xffebebeb, 0xffebeaea, 0xffeaebeb, 0xffeaebea, 0xffeaeaeb, 0xffeaeaeb, 0xffebebeb,
+ 0xffebeaeb, 0xffebebea, 0xffeaeaeb, 0xffebebeb, 0xffebeaeb, 0xffeaebeb, 0xffebebeb, 0xffebebea,
+ 0xffeaeaea, 0xffeaeaeb, 0xffebeaeb, 0xffebebeb, 0xffebebea, 0xffebebea, 0xffebeaea, 0xffebebeb,
+ 0xffeaebeb, 0xffebebea, 0xffebebea, 0xffebeaeb, 0xffeaebea, 0xffebebea, 0xffeaeaea, 0xffeaebea,
+ 0xffeaebea, 0xffebebea, 0xffebeaeb, 0xffebebeb, 0xffeaebea, 0xffebebea, 0xffeaeaeb, 0xffeaebeb,
+ 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffeaebeb, 0xffebebea, 0xffeaebea, 0xffebebea, 0xffeaeaeb,
+ 0xffebebeb, 0xffebebeb, 0xffeaeaea, 0xffeaebeb, 0xffebeaeb, 0xffeaebeb, 0xffeaebeb, 0xffebebeb,
+ 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffeaebea, 0xffebebea, 0xffebebeb, 0xffebebeb, 0xffeaebeb,
+ 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffebebeb, 0xffebeaeb, 0xffeaebea, 0xffeaeaea, 0xffebebea,
+ 0xffeaeaea, 0xffebebeb, 0xffeaeaeb, 0xffebeaeb, 0xffebeaeb, 0xffebeaeb, 0xffeaebea, 0xffebeaea,
+ 0xffeaeaea, 0xffebebeb, 0xffebeaea, 0xffeaeaeb, 0xffeaebeb, 0xffeaebea, 0xffeaeaea, 0xffebebea,
+ 0xffeaebea, 0xffeaebea, 0xffebebeb, 0xffebeaeb, 0xffeaebeb, 0xffebebeb, 0xffebeaeb, 0xffebeaeb,
+ 0xffeaebeb, 0xffebebea, 0xffebebea, 0xffebebea, 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffeaebea,
+ 0xffebebeb, 0xffebebeb, 0xffebeaeb, 0xffeaebea, 0xffebeaeb, 0xffebebea, 0xffebebea, 0xffebebeb,
+ 0xffebebea, 0xffeaebeb, 0xffebeaeb, 0xffeaebeb, 0xffebeaea, 0xffeaebeb, 0xffeaebea, 0xffeaeaeb,
+ 0xffebebeb, 0xffebeaea, 0xffebebea, 0xffebeaeb, 0xffebebeb, 0xffebeaea, 0xffeaeaeb, 0xffebeaeb,
+ 0xffebebea, 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffebeaea, 0xffebeaea, 0xffebeaeb, 0xffebeaeb,
+ 0xffebeaeb, 0xffeaeaeb, 0xffebeaea, 0xffebeaeb, 0xffeaebeb, 0xffeaebeb, 0xffebebeb, 0xffebebea,
+ 0xffeaebea, 0xffebeaea, 0xffeaebea, 0xffebebeb, 0xffebebeb, 0xffeaebeb, 0xffebebeb, 0xffeaeaeb,
+ 0xffeaebeb, 0xffebebeb, 0xffebebeb, 0xffeaebea, 0xffeaebeb, 0xffeaebeb, 0xffebebeb, 0xffeaebeb,
+ 0xffebebea, 0xffebebeb, 0xffeaeaeb, 0xffebebeb, 0xffebebeb, 0xffebebea, 0xffeaebeb, 0xffeaebea,
+ 0xffeaeaeb, 0xffebebea, 0xffebeaea, 0xffebebea, 0xffebeaea, 0xffebebea, 0xffebebea, 0xffebebeb,
+ 0xffebebea, 0xffebebeb, 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffebebeb, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffe9eaea,
+ 0xffeae9ea, 0xffeaeae9, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea,
+ 0xffe9eae9, 0xffeaeaea, 0xffe9e9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9,
+ 0xffeaeae9, 0xffe9e9e9, 0xffe9eaea, 0xffeae9ea, 0xffeaeaea, 0xffeae9e9, 0xffeae9ea, 0xffe9e9e9,
+ 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeaea, 0xffeae9ea, 0xffe9eaea,
+ 0xffe9eaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeae9ea, 0xffeae9ea, 0xffe9eaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeae9e9, 0xffe9eaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea,
+ 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeae9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeae9, 0xffeaeaea,
+ 0xffeaeaea, 0xffe9eaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eae9, 0xffeaeaea, 0xffe9eaea, 0xffeaeaea, 0xffeaeaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeae9, 0xffe9eaea, 0xffe9eaea, 0xffeaeaea,
+ 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffeaeae9, 0xffeaeae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea,
+ 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea,
+ 0xffeaeaea, 0xffe9eae9, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffe9eaea, 0xffe9eaea, 0xffeae9ea,
+ 0xffeaeae9, 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea,
+ 0xffe9eaea, 0xffeae9ea, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9,
+ 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, 0xffe9e9ea, 0xffe9eae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea,
+ 0xffeaeae9, 0xffeae9ea, 0xffeaeae9, 0xffeaeae9, 0xffe9eaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eaea,
+ 0xffeaeaea, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea,
+ 0xffeaeae9, 0xffeae9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffe9eaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eaea, 0xffe9e9ea,
+ 0xffeaeaea, 0xffe9e9ea, 0xffe9eaea, 0xffeae9ea, 0xffe9e9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea, 0xffeaeaea,
+ 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea,
+ 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffeae9ea, 0xffeaeae9, 0xffeaeaea, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffeae9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9,
+ 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffe8e8e8, 0xffe8e8e9, 0xffe9e9e9, 0xffe8e8e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e8e9,
+ 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e8e9, 0xffe8e9e9, 0xffe9e8e8, 0xffe9e8e8, 0xffe8e9e8,
+ 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9,
+ 0xffe9e8e8, 0xffe8e8e9, 0xffe9e8e9, 0xffe9e9e8, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8,
+ 0xffe8e9e8, 0xffe8e8e9, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e8, 0xffe8e8e8,
+ 0xffe8e9e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe9e8e9, 0xffe8e8e8,
+ 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe8e8e9, 0xffe8e8e8,
+ 0xffe8e9e8, 0xffe9e9e8, 0xffe8e8e8, 0xffe9e9e9, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9,
+ 0xffe8e9e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e9,
+ 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e8e8, 0xffe8e8e9,
+ 0xffe8e8e8, 0xffe9e9e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e9e8, 0xffe8e9e9,
+ 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe8e8e8,
+ 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e9,
+ 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe8e8e9, 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8,
+ 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8,
+ 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e9, 0xffe9e9e8,
+ 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e9, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe8e8e8, 0xffe9e8e8, 0xffe9e8e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e9e9,
+ 0xffe9e8e9, 0xffe9e8e8, 0xffe8e8e9, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e9e8,
+ 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e9,
+ 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe9e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e8,
+ 0xffe9e8e8, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8,
+ 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e8e9, 0xffe9e9e9, 0xffe8e8e8, 0xffe8e9e9, 0xffe9e8e8,
+ 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e8, 0xffe7e7e8, 0xffe7e8e8,
+ 0xffe7e7e8, 0xffe8e7e8, 0xffe8e8e8, 0xffe7e8e7, 0xffe8e8e8, 0xffe7e8e8, 0xffe8e7e7, 0xffe8e8e7,
+ 0xffe7e7e7, 0xffe8e8e8, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e8e8, 0xffe7e7e8, 0xffe8e8e7,
+ 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e8,
+ 0xffe7e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe7e7e7, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e8e7, 0xffe7e8e8,
+ 0xffe8e7e8, 0xffe7e7e7, 0xffe8e8e7, 0xffe7e8e7, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e7, 0xffe8e8e8,
+ 0xffe7e7e7, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe8e8e8, 0xffe7e8e8,
+ 0xffe7e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e8e7, 0xffe8e8e8,
+ 0xffe8e8e7, 0xffe7e7e8, 0xffe7e7e8, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e8e7, 0xffe7e8e8,
+ 0xffe8e7e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7,
+ 0xffe7e8e7, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e7e8,
+ 0xffe7e7e7, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e7e8, 0xffe8e8e7,
+ 0xffe7e8e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e7e8, 0xffe8e7e8,
+ 0xffe7e8e8, 0xffe7e8e8, 0xffe7e8e7, 0xffe8e7e8, 0xffe8e8e7, 0xffe8e8e7, 0xffe7e8e8, 0xffe8e7e8,
+ 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7, 0xffe8e8e8, 0xffe7e7e8, 0xffe8e8e8, 0xffe7e7e8, 0xffe7e7e7,
+ 0xffe7e7e8, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e8, 0xffe8e8e7, 0xffe7e7e8,
+ 0xffe8e8e8, 0xffe7e8e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe8e7e8, 0xffe7e7e7, 0xffe8e8e8, 0xffe8e7e8,
+ 0xffe8e8e7, 0xffe7e7e8, 0xffe8e7e8, 0xffe7e7e8, 0xffe7e8e7, 0xffe7e8e7, 0xffe7e7e8, 0xffe8e7e7,
+ 0xffe8e7e7, 0xffe8e7e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e7,
+ 0xffe7e8e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e7e7, 0xffe8e7e8, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e8,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e7e8,
+ 0xffe7e7e8, 0xffe7e8e8, 0xffe7e8e8, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e8,
+ 0xffe7e8e8, 0xffe8e7e8, 0xffe7e7e7, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e8e8,
+ 0xffe7e8e8, 0xffe7e8e7, 0xffe7e8e8, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e8,
+ 0xffe8e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e8e8, 0xffe8e7e8,
+ 0xffe7e7e8, 0xffe8e8e7, 0xffe7e8e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e7,
+ 0xffe7e7e8, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe7e7e8, 0xffe8e8e7, 0xffe7e7e8, 0xffe8e7e7,
+ 0xffe7e7e8, 0xffe7e7e8, 0xffe8e8e7, 0xffe7e8e8, 0xffe8e7e7, 0xffe8e8e8, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5,
+ 0xffd6dbd6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e7e6, 0xffe7e6e7, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e6e7,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e6e7,
+ 0xffe7e6e6, 0xffe6e7e7, 0xffe7e6e6, 0xffe7e7e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e7e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe6e6e6, 0xffe7e7e7,
+ 0xffe6e6e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe6e6e7, 0xffe6e7e6, 0xffe6e6e6, 0xffe7e7e7, 0xffe7e6e6,
+ 0xffe7e6e7, 0xffe7e6e7, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e6, 0xffe7e7e6, 0xffe6e6e7, 0xffe6e7e6,
+ 0xffe6e6e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe7e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e7e6,
+ 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e6e6, 0xffe6e7e7, 0xffe7e7e7,
+ 0xffe6e7e7, 0xffe7e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e6e6,
+ 0xffe7e7e6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e6e6, 0xffe6e7e6, 0xffe7e7e6, 0xffe7e7e6, 0xffe6e7e7,
+ 0xffe6e6e6, 0xffe6e7e6, 0xffe6e7e7, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e6, 0xffe6e6e6,
+ 0xffe7e7e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e6, 0xffe7e6e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe7e6e7,
+ 0xffe6e7e7, 0xffe6e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe6e6e7,
+ 0xffe6e6e6, 0xffe7e6e7, 0xffe6e6e6, 0xffe7e6e7, 0xffe6e6e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe7e6e6, 0xffe7e7e6, 0xffe7e7e7, 0xffe6e6e6, 0xffe7e7e7, 0xffe6e7e7,
+ 0xffe6e7e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe7e7e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe7e6e7, 0xffe6e6e7,
+ 0xffe6e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe7e6e6,
+ 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e6, 0xffe7e7e6, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e7e6, 0xffe7e6e6,
+ 0xffe7e7e6, 0xffe6e6e7, 0xffe6e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e7e7,
+ 0xffe7e6e6, 0xffe7e6e7, 0xffe6e6e6, 0xffe7e7e6, 0xffe7e6e6, 0xffe6e7e7, 0xffe6e7e7, 0xffe7e7e7,
+ 0xffe6e6e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe7e7e7, 0xffe6e6e7, 0xffe7e7e7, 0xffe6e6e7,
+ 0xffe6e7e6, 0xffe7e7e6, 0xffe7e6e7, 0xffe7e6e7, 0xffe7e6e6, 0xffe6e6e6, 0xffe7e7e6, 0xffe6e7e6,
+ 0xffe7e6e6, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e6e7, 0xffe6e7e7,
+ 0xffe7e7e6, 0xffe7e6e7, 0xffe7e7e7, 0xffe6e6e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e6e7, 0xffe7e7e6,
+ 0xffe7e7e7, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e7e7, 0xffe6e8e6, 0xffd6dbd6,
+ 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffd9dbd9, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6,
+ 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6ebe6, 0xffd9dbd9,
+ 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffd9dbd9, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef,
+ 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffd9dbd9,
+ 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5,
+ 0xffcbcacb, 0xffd9dbd9, 0xffe6ebe6, 0xffe6ebe6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6,
+ 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6ebe6, 0xffe6ebe6, 0xffd9dbd9, 0xffcbcacb,
+ 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0xff797879, 0xffb5b2b5,
+ 0xffbdbabd, 0xffcbcacb, 0xffd9dbd9, 0xffd9dbd9, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6,
+ 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbd9, 0xffd9dbd9, 0xffcbcacb, 0xffbdbabd,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284,
+ 0xff9c9f9c, 0xff9c9f9c, 0xff9c9f9c, 0xff9c9f9c, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2,
+ 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xff9c9e9c, 0xff9c9e9c, 0xff9c9e9c, 0x00080408,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284, 0xffc5c2c5, 0xffc5c2c5, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffbdbebd,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284, 0xff848284, 0xffc5c2c5, 0xffe6ebe6,
+ 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef,
+ 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffbdbebd,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b,
+ 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b,
+ 0xffd6756b, 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffce7163,
+ 0xffce7163, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6c63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc5645d, 0xffc56258, 0xffc56258, 0xffc56258, 0xffc56052,
+ 0xffc56052, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd5142, 0xffbd5142, 0xffba5042, 0xffba5042, 0xffba4d42,
+ 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb54a3c, 0xffb54a3c, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb54237,
+ 0xffb54237, 0xffb54131, 0xffb54131, 0xffad4131, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31,
+ 0xffad3e31, 0xffad3e31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad392f, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392f,
+ 0xffad392c, 0xffad392f, 0xffad392f, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3b2f, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3f31, 0xffad3f31,
+ 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54a3c,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffba5042, 0xffbd5045,
+ 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc35950, 0xffc35950, 0xffc35950, 0xffc55a52,
+ 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc56152, 0xffc56258,
+ 0xffc56258, 0xffc56455, 0xffc56455, 0xffcb655a, 0xffcb655a, 0xffcb655a, 0xffcb655a, 0xffce675d,
+ 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63,
+ 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd37168, 0xffd6736b,
+ 0xffd6736b, 0xffd6746b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6786b, 0xffd6796b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973,
+ 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b,
+ 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6796b, 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6746b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6c63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce685a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc56152, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd594a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb84d42,
+ 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb54a3c, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb54237,
+ 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c,
+ 0xffad3b2f, 0xffad3a2c, 0xffad3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3f31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb5413a, 0xffb5413a, 0xffb54237, 0xffb54237, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52,
+ 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce675d,
+ 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63,
+ 0xffce6f63, 0xffce6f63, 0xffce6f63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67973,
+ 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b,
+ 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6796b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce685a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56258, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc55e52,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd594a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb84d42,
+ 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54a3c, 0xffb54a3c, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb54237,
+ 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c,
+ 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a, 0xffb54a3c,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52,
+ 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffcb655a, 0xffc8655a, 0xffcb655a, 0xffce675d,
+ 0xffce6860, 0xffce6963, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63,
+ 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973,
+ 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b,
+ 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796b,
+ 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc56152, 0xffc55e52,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb84d42,
+ 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb5493a, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb54237,
+ 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c,
+ 0xffad3a2c, 0xffad3a2c, 0xffad3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd514a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc55c52,
+ 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5615a,
+ 0xffc5615a, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce675d,
+ 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6f63,
+ 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67973,
+ 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b,
+ 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc55e52,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb84e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb24137,
+ 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54131, 0xffb54234, 0xffb54337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52,
+ 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d,
+ 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e, 0xffd67970,
+ 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b,
+ 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67165, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6c63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc55e52,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb54d42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb24137,
+ 0xffb24137, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3e31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb54337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5045, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd554a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52,
+ 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a,
+ 0xffc5615a, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d,
+ 0xffce685d, 0xffce695a, 0xffce685d, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e,
+ 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b,
+ 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b,
+ 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6756b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7163,
+ 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc55e52,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb24137,
+ 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb54337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54a3c, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd5045,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52,
+ 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d,
+ 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6756b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e,
+ 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b,
+ 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b,
+ 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6786b, 0xffd6756b, 0xffd6776b, 0xffd6756b, 0xffd6756b,
+ 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7063,
+ 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63,
+ 0xffce6b63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb24137,
+ 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3a2c, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3b2f,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a,
+ 0xffb54a3c, 0xffb54a3c, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47,
+ 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc55a52,
+ 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc56258,
+ 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d,
+ 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6786b, 0xffd6776b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67970,
+ 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd07165, 0xffce7063,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6960,
+ 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55952, 0xffbd594a,
+ 0xffbd584a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42,
+ 0xffb54c42, 0xffb54c42, 0xffb54a42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137,
+ 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad3931, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffa73929, 0xffaa3929, 0xffa73929,
+ 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a31,
+ 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54a3c, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5045,
+ 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd554a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52,
+ 0xffc55a52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56258, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a,
+ 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6b63, 0xffce6960,
+ 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd584a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, 0xffb54d42,
+ 0xffb54c42, 0xffb54c42, 0xffb54c42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a,
+ 0xffb5463a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137,
+ 0xffb24137, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3e31, 0xffad3f31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad3931, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffa73929,
+ 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad3a31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54a3c, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e47,
+ 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52,
+ 0xffc55a52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56455, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a,
+ 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6c63, 0xffce6960,
+ 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd584a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54c42, 0xffb54a42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137,
+ 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929,
+ 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad3a31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3f31,
+ 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54942, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e47,
+ 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52,
+ 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56455, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc8675a,
+ 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6756b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6c63, 0xffce6960,
+ 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffc55952, 0xffbd594a,
+ 0xffbd584a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42,
+ 0xffb54c42, 0xffb54c42, 0xffb54c42, 0xffb5493f, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5483a,
+ 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137,
+ 0xffb24137, 0xffb24137, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad392f,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929,
+ 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad3a31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31,
+ 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54942, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5045,
+ 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52,
+ 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a,
+ 0xffc56258, 0xffc56258, 0xffc56258, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a,
+ 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7063,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c5d,
+ 0xffce6b60, 0xffce6963, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffaf4234,
+ 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a2c,
+ 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3931, 0xffad3931, 0xffad3a31, 0xffad3b31, 0xffad3a31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e37,
+ 0xffad3f34, 0xffad3f34, 0xffad3f34, 0xffad413a, 0xffad413a, 0xffaf423a, 0xffb2433a, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54a3f,
+ 0xffb54942, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047,
+ 0xffba5047, 0xffbd5142, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52,
+ 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a,
+ 0xffc5625a, 0xffc5625a, 0xffc5625a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d,
+ 0xffce685d, 0xffce685d, 0xffce685d, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7163, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7163,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6b60,
+ 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd584d, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337,
+ 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a2c,
+ 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c,
+ 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a31, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3e31, 0xffad3f34,
+ 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffaf423a, 0xffaf423a, 0xffaf423a, 0xffb2433a, 0xffb5453a,
+ 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047,
+ 0xffba5047, 0xffba5047, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52,
+ 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a,
+ 0xffc5625a, 0xffc5625a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d,
+ 0xffce685d, 0xffce685d, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7163, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b,
+ 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6786b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6746b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7163,
+ 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6b60,
+ 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffce695a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd584d, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd524a, 0xffbd524a, 0xffbd524a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337,
+ 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b2f,
+ 0xffad3b2f, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad392c, 0xffad392f,
+ 0xffad392c, 0xffad392f, 0xffad392f, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3b31,
+ 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3e31, 0xffad3f34,
+ 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffad413a, 0xffaf423a, 0xffaf423a, 0xffb2433a, 0xffb5453a,
+ 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54942, 0xffb54c3c, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047,
+ 0xffba5047, 0xffba5047, 0xffba5047, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd564a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52,
+ 0xffc55a52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5625a,
+ 0xffc5625a, 0xffc5645a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffce685d,
+ 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163,
+ 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b,
+ 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b,
+ 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7163,
+ 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c5d,
+ 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052,
+ 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a,
+ 0xffbd594a, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a,
+ 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55142, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42,
+ 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5483a,
+ 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337,
+ 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3d31,
+ 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a2c,
+ 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad392f, 0xffad392f, 0xffad392f, 0xffad392f, 0xffad392f,
+ 0xffad392f, 0xffad392f, 0xffad392f, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3b31,
+ 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3f31, 0xffad3f34,
+ 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffaf423a, 0xffb2433a, 0xffb2433a, 0xffb2433a, 0xffb5453a,
+ 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942,
+ 0xffb54942, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047,
+ 0xffba5047, 0xffbd5142, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd564a,
+ 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc35950, 0xffc55a52,
+ 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5625a,
+ 0xffc5625a, 0xffc5625a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d,
+ 0xffce685d, 0xffce685d, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b,
+ 0xffd6716b, 0xffd6746b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b,
+ 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e,
+ 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff473531, 0xff7e6563, 0xff7e6563, 0xffad655a,
+ 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b,
+ 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5615a,
+ 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52,
+ 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad594a,
+ 0xffad594a, 0xffad594a, 0xffad594a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad514a,
+ 0xffad514a, 0xffad514a, 0xffad514a, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa54d42,
+ 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54942,
+ 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xff9c453a,
+ 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c3d3a,
+ 0xff9c3d3a, 0xff9c3d3a, 0xff9c3d3a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c453a,
+ 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xffa54942,
+ 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54d42,
+ 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffad514a,
+ 0xffad514a, 0xffad514a, 0xffad514a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a,
+ 0xffad554a, 0xffad554a, 0xffad554a, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffb55952,
+ 0xffb55952, 0xffb55952, 0xffb55952, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d5a,
+ 0xffb55d5a, 0xffb55d5a, 0xffb55d5a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffbd655a,
+ 0xffbd655a, 0xffbd655a, 0xffbd655a, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573,
+ 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xff7e6463,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff473531, 0xff7e6563, 0xff7e6563, 0xffad655a,
+ 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b,
+ 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5615a,
+ 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52,
+ 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad594a,
+ 0xffad594a, 0xffad594a, 0xffad594a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad514a,
+ 0xffad514a, 0xffad514a, 0xffad514a, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa54d42,
+ 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54942,
+ 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xff9c453a,
+ 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c3d3a,
+ 0xff9c3d3a, 0xff9c3d3a, 0xff9c3d3a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a,
+ 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c453a,
+ 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xffa54942,
+ 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54d42,
+ 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffad514a,
+ 0xffad514a, 0xffad514a, 0xffad514a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a,
+ 0xffad554a, 0xffad554a, 0xffad554a, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffb55952,
+ 0xffb55952, 0xffb55952, 0xffb55952, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d5a,
+ 0xffb55d5a, 0xffb55d5a, 0xffb55d5a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffbd655a,
+ 0xffbd655a, 0xffbd655a, 0xffbd655a, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573,
+ 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xff7e6463,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff7e6563, 0xff7e6563, 0xff7e6563, 0xffad655a,
+ 0xffad655a, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b,
+ 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad7c76, 0xffad7c76, 0xffad7c76, 0xffad7c76, 0xffad7976,
+ 0xffad7976, 0xffad7976, 0xffad7976, 0xffad7770, 0xffad7770, 0xffad7770, 0xffad7770, 0xffad7870,
+ 0xffad7870, 0xffad7870, 0xffad7870, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa7756b,
+ 0xffa7756b, 0xffa7756b, 0xffa7756b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7706b,
+ 0xffa7706b, 0xffa7706b, 0xffa7706b, 0xffa27065, 0xffa27065, 0xffa27065, 0xffa27065, 0xffa26d65,
+ 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26b68,
+ 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xff9c6963,
+ 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6763,
+ 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763,
+ 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6463,
+ 0xff9c6463, 0xff9c6463, 0xff9c6463, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763,
+ 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6963,
+ 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xffa26c68,
+ 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26d65,
+ 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa7706b,
+ 0xffa7706b, 0xffa7706b, 0xffa7706b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b,
+ 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa77570, 0xffad7570,
+ 0xffad7570, 0xffad7570, 0xffad7570, 0xffad7870, 0xffad7870, 0xffad7870, 0xffad7870, 0xffad7776,
+ 0xffad7776, 0xffad7776, 0xffad7776, 0xffad7976, 0xffad7976, 0xffad7976, 0xffad7976, 0xffaf7c76,
+ 0xffaf7c76, 0xffaf7c76, 0xffaf7c76, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b,
+ 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b,
+ 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b,
+ 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573,
+ 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xffad655a, 0xff7e6463,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff7e6563, 0xffb59694, 0xffb59694, 0xffada6a5,
+ 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad,
+ 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caeb5,
+ 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5,
+ 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead,
+ 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caaad,
+ 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff94aaad,
+ 0xff94aaad, 0xff94aaad, 0xff94aaad, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead,
+ 0xffadaead, 0xffadaead, 0xffadaead, 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffbd9694,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff737473, 0xffadaead, 0xffadaead, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffb5b6b5,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x11000000, 0x22000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x44000000, 0x33000000,
+ 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x55000000, 0x88000000, 0xbb000000,
+ 0xdd0e0403, 0xdd0e0403, 0xee100503, 0xee100503, 0xff100503, 0xff100503, 0xff100503, 0xee100503,
+ 0xee100503, 0xee100503, 0xdd0e0403, 0xaa000000, 0x77000000, 0x44000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff737573, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5,
+ 0xffa5a6a5, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad,
+ 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5,
+ 0xffa5a6a5, 0xff737173, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x33000000, 0x880e0403, 0xcc0e0403, 0xee0e0403, 0xff1b0805, 0xff1b0805, 0xff1b0805,
+ 0xff1b0805, 0xff1b0805, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05,
+ 0xff210b05, 0xff210b05, 0xff1b0805, 0xff1b0805, 0xff1b0805, 0xee1b0805, 0xdd0b0403, 0x880b0403,
+ 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffdbbeb8, 0xffe9dfdb, 0xffe9dfdb,
+ 0xffe9dfdb, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6,
+ 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6dbd6, 0xffe6dbd6, 0xffe6dbd6,
+ 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x11080000,
+ 0x11080000, 0x22210400, 0x22210400, 0x33210400, 0x33210400, 0x33210400, 0x33210400, 0x33210400,
+ 0x22210400, 0x11100400, 0x11100400, 0x00100400, 0x00100400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x66080303,
+ 0xaa100505, 0xee190808, 0xff1b0805, 0xff1b0805, 0xff290c08, 0xff290c08, 0xff290c08, 0xff290c08,
+ 0xff290c08, 0xff290c08, 0xff311008, 0xff311008, 0xff311008, 0xff311008, 0xff311008, 0xff311008,
+ 0xff210b05, 0xff311008, 0xff290c08, 0xff290c08, 0xff290c08, 0xff290c08, 0xff210c08, 0xff210c08,
+ 0xee160805, 0xaa0b0403, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11030303, 0x22030303, 0x22080808, 0x330b0b0b, 0x44101010, 0x33101010, 0x330b0b0b, 0x33080808,
+ 0x22050505, 0x11030303, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xfff7ffff, 0xffce9e94,
+ 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xfff7ffff,
+ 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x11080000, 0x22080000,
+ 0x33080000, 0x66210400, 0x99210400, 0xaa210400, 0xbb210400, 0xbb210400, 0xbb210400, 0xaa210400,
+ 0x66210400, 0x33100400, 0x22100400, 0x11100400, 0x00100400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x66190705, 0xcc210808, 0xff340f0e,
+ 0xff340f0e, 0xff340f0e, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff4a1613,
+ 0xff4a1613, 0xff3a1010, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff3a1010, 0xff471613,
+ 0xff3a1010, 0xff3a1010, 0xff311010, 0xff311010, 0xff311010, 0xff311010, 0xff37100b, 0xff37100b,
+ 0xff290c08, 0xff290c08, 0xee160705, 0xaa160705, 0x33000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x11080808, 0x55503a37, 0x886b494a,
+ 0xbb8c6160, 0xddad7976, 0xeead7976, 0xffa57479, 0xffa57479, 0xeea57479, 0xdd9c6163, 0xcc794542,
+ 0x99794542, 0x663c2421, 0x22000400, 0x11080400, 0x11080400, 0x00080400, 0x00080400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xffc59284,
+ 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x11080000, 0x22080000, 0x44080000,
+ 0xaa080000, 0xdd55241b, 0xee894537, 0xee894537, 0xee894537, 0xee9f584d, 0xee9f584d, 0xee9f584d,
+ 0xdd9f584d, 0xbb100400, 0x55100400, 0x22100400, 0x11100400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x99190705, 0xee310d0b, 0xff340f0e, 0xff340f0e,
+ 0xff340f0e, 0xff471613, 0xff471613, 0xff471613, 0xff471613, 0xff471613, 0xff4a1613, 0xff5a1b16,
+ 0xff4a1613, 0xff5a1b16, 0xff501813, 0xff501813, 0xff501813, 0xff501813, 0xff551b16, 0xff471613,
+ 0xff471613, 0xff471613, 0xff421613, 0xff421613, 0xff421613, 0xff421613, 0xff37100b, 0xff37100b,
+ 0xff37100b, 0xff37100b, 0xff2c0d0b, 0xff2c0d0b, 0xcc160705, 0x44000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x33080808, 0x88503a37, 0xcc976c65, 0xffde9e94, 0xffce928c,
+ 0xffce928c, 0xffce928c, 0xffad7976, 0xffad878f, 0xffad878f, 0xffad878f, 0xffa57479, 0xffb56563,
+ 0xffb56563, 0xffb56563, 0xdd794542, 0x994a2019, 0x44080400, 0x11080400, 0x11080400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xffc59284,
+ 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x11080000, 0x33080000, 0xaa080000,
+ 0xee9c3d31, 0xee894537, 0xeebd6552, 0xeebd6552, 0xeebd6552, 0xee9f584d, 0xee9f584d, 0xee9f584d,
+ 0xeede8273, 0xeed6c2bd, 0xbb100400, 0x33100400, 0x11100400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x66190705, 0xdd310d0b, 0xff4a1410, 0xff4a1410, 0xff471613, 0xff471613,
+ 0xff471613, 0xff471613, 0xff551b16, 0xff551b16, 0xff551b16, 0xff551b16, 0xff5a1b16, 0xff5a1b16,
+ 0xff6b2019, 0xff5a1b16, 0xff5d1c16, 0xff5d1c16, 0xff5d1c16, 0xff5d1c16, 0xff551b16, 0xff551b16,
+ 0xff551b16, 0xff551b16, 0xff521b16, 0xff421613, 0xff421613, 0xff421613, 0xff45140e, 0xff45140e,
+ 0xff45140e, 0xff45140e, 0xff421410, 0xff421410, 0xff2c0d0b, 0xdd160705, 0x77000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x22000000, 0x884d3634, 0xdd976c65, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffce928c,
+ 0xffce928c, 0xffad7976, 0xffad7976, 0xffad878f, 0xffb59aa5, 0xffad878f, 0xffad878f, 0xffb56563,
+ 0xffb56563, 0xffb56563, 0xffb56563, 0xffce594a, 0xdd8c3d31, 0x994a2019, 0x44080400, 0x11000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9e94, 0xffce9e94, 0xffce9a8f, 0xffce9a8f, 0xffce9a94, 0xffce9a94, 0xffce9a94,
+ 0xffce9a94, 0xffce968c, 0xffc88f84, 0xffc88f84, 0xffc88f84, 0xffbd8273, 0xffbd8273, 0xffbd8273,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22210400, 0x66210400, 0xdd210400,
+ 0xee945a52, 0xeea5615a, 0xeeaa6d68, 0xeeaa6d68, 0xeeaa6d68, 0xeead6563, 0xeead6563, 0xeeaf6c68,
+ 0xeeb57973, 0xeea7938f, 0xeeefdbd6, 0x77190400, 0x22190400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x77190808, 0xee4a1410, 0xff4a1410, 0xff4a1410, 0xff4a1410, 0xff5a1c19, 0xff5a1c19,
+ 0xff5a1c19, 0xff5a1c19, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff6b2019, 0xff6b2019,
+ 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff632019, 0xff632019,
+ 0xff632019, 0xff632019, 0xff632019, 0xff521b16, 0xff521b16, 0xff521b16, 0xff521810, 0xff521810,
+ 0xff521810, 0xff45140e, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee290c08, 0x66000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x554d3634, 0xbb9a6c68, 0xffe6a29c, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffce928c,
+ 0xffce928c, 0xffad7976, 0xffad7976, 0xffad878f, 0xffb59aa5, 0xffb59aa5, 0xffad878f, 0xffb56563,
+ 0xffb56563, 0xffb56563, 0xffb56563, 0xffce594a, 0xffce594a, 0xffce594a, 0xcc8c3d31, 0x77311010,
+ 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9a8f, 0xffce9a8f, 0xffce9a8f, 0xffce9689, 0xffce9a94, 0xffdebab8, 0xffdebab8,
+ 0xffce9a94, 0xffc88f84, 0xffc88f84, 0xffc88f84, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x33210400, 0x99210400, 0xee945a52,
+ 0xee945a52, 0xeeaa6d68, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeaf6c68, 0xeeaf6c68, 0xeeaf6c68,
+ 0xeeb2736e, 0xeea7938f, 0xeeefdbd6, 0xaa190400, 0x33190400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000,
+ 0x662c0c08, 0xee501810, 0xff521819, 0xff521819, 0xff521819, 0xff631e1b, 0xff631c19, 0xff631c19,
+ 0xff6e221b, 0xff6e221b, 0xff6b2019, 0xff76241b, 0xff76241b, 0xff76241b, 0xff732421, 0xff732421,
+ 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff76241b, 0xff6b2019,
+ 0xff6b2019, 0xff6b2019, 0xff65201b, 0xff65201b, 0xff65201b, 0xff5a1c19, 0xff581c16, 0xff581c16,
+ 0xff581c16, 0xff4a1810, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff421410, 0xff34120b, 0xdd1e0b05,
+ 0x55080400, 0x11080400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x775a413a,
+ 0xddb27f76, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffd68e8c,
+ 0xffc07f7e, 0xffaa7070, 0xffaa7070, 0xffaa8e97, 0xffb8a2aa, 0xffb8a2aa, 0xffaa8e97, 0xff94696b,
+ 0xff9c5e5d, 0xff9c5e5d, 0xffa55450, 0xffbd5142, 0xffbd5142, 0xffbd493c, 0xffbd493c, 0xeeb53929,
+ 0x9942160e, 0x33080400, 0x11080400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9689, 0xffce9689, 0xffce9689, 0xffce9284, 0xffce9a94, 0xfffffbff, 0xfffffbff,
+ 0xffce9a94, 0xffc88f84, 0xffc3887b, 0xffc3887b, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x44210400, 0xbb210400, 0xee945a52,
+ 0xeece867b, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeb2736e, 0xeeb2736e, 0xeeaf6c68,
+ 0xeeb2736e, 0xeea7938f, 0xeeefdbd6, 0xcc604c47, 0x44190400, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x55080000,
+ 0xee501810, 0xff501810, 0xff631e1b, 0xff631e1b, 0xff631e1b, 0xff73231e, 0xff6e221b, 0xff6e221b,
+ 0xff79271e, 0xff6e221b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff81281e, 0xff792721, 0xff792721,
+ 0xff792721, 0xff792721, 0xff7b2721, 0xff7b2721, 0xff7b2721, 0xff7b2721, 0xff76241b, 0xff76241b,
+ 0xff76241b, 0xff76241b, 0xff70241e, 0xff70241e, 0xff70241e, 0xff65201b, 0xff65201b, 0xff65201b,
+ 0xff581c16, 0xff581c16, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff4a1810, 0xff34120b,
+ 0xcc1e0b05, 0x44080400, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7745312f, 0xeede9e94,
+ 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffd9968f, 0xffd68e8c,
+ 0xffc07f7e, 0xffaa7070, 0xffaa7070, 0xffaa8e97, 0xffb8a2aa, 0xffb8a2aa, 0xffaa8e97, 0xff9c5e5d,
+ 0xffa55450, 0xffa55450, 0xffa55450, 0xffbd5142, 0xffbd493c, 0xffbd493c, 0xffbd4137, 0xffb53929,
+ 0xeeb53929, 0x9942160e, 0x33080400, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9689, 0xffce9284, 0xffce9284, 0xffce9284, 0xffdebab8, 0xfffffbff, 0xfffffbff,
+ 0xffefdbdb, 0xffc3887b, 0xffc3887b, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x55210400, 0xcc210400, 0xeece867b,
+ 0xeece867b, 0xeeb58684, 0xeeb58684, 0xeeb58684, 0xeeaf7976, 0xeeb57973, 0xeeb57973, 0xeeb2736e,
+ 0xeeb57973, 0xeea7938f, 0xeea7938f, 0xdda7938f, 0x66190400, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080000, 0xdd501810,
+ 0xff732419, 0xff732419, 0xff73231e, 0xff73231e, 0xff73231e, 0xff73231e, 0xff79271e, 0xff79271e,
+ 0xff79271e, 0xff79271e, 0xff81281e, 0xff81281e, 0xff81281e, 0xff81281e, 0xff7e2a21, 0xff7e2a21,
+ 0xff7e2a21, 0xff7e2a21, 0xff842a21, 0xff842a21, 0xff842a21, 0xff842a21, 0xff8c2d21, 0xff81281e,
+ 0xff81281e, 0xff81281e, 0xff7b2821, 0xff70241e, 0xff70241e, 0xff70241e, 0xff732421, 0xff65201b,
+ 0xff65201b, 0xff581c16, 0xff581c16, 0xff581c16, 0xff4d1813, 0xff4d1813, 0xff4a1810, 0xff4a1810,
+ 0xff34120b, 0x99080400, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7745312f, 0xeece928c, 0xffde9e94,
+ 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffdb9a91, 0xffd9968f, 0xffd68e8c,
+ 0xffc07f7e, 0xffaa7070, 0xff946163, 0xff9c7984, 0xffc5b6bd, 0xffc5b6bd, 0xff9c7984, 0xffa55450,
+ 0xffa55450, 0xffa55450, 0xffad4942, 0xffbd493c, 0xffbd493c, 0xffbd4137, 0xffbd3931, 0xffb53929,
+ 0xffb53929, 0xeeb53929, 0x9942160e, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684,
+ 0xffce9684, 0xffce9284, 0xffce9284, 0xffce9284, 0xffce9284, 0xfffffbf7, 0xffffffff, 0xffffffff,
+ 0xfffffbf7, 0xffd3aaa2, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x66190000, 0xdd523331, 0xeec59a94,
+ 0xeec59a94, 0xeeb88e84, 0xeeb88e84, 0xeeb5867b, 0xeeb5867b, 0xeeaf7c73, 0xeead756b, 0xeead756b,
+ 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x77210800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa2c0c08, 0xff732419,
+ 0xff732419, 0xff732419, 0xff73231e, 0xff73231e, 0xff842821, 0xff842821, 0xff79271e, 0xff842d21,
+ 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff842d21, 0xff842d21,
+ 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21,
+ 0xff8c2d21, 0xff81281e, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff732421, 0xff732421,
+ 0xff732421, 0xff65201b, 0xff632019, 0xff581c16, 0xff581c16, 0xff581c16, 0xff4a1810, 0xff4a1810,
+ 0xff34120b, 0xee1e0b05, 0x66000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5545312f, 0xddce928c, 0xffce928c, 0xffde9e94,
+ 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffdb9a91, 0xffd9968f, 0xffd6928c, 0xffd68e8c,
+ 0xffc07f7e, 0xffaa7070, 0xff946163, 0xff9c7984, 0xffc5b6bd, 0xffc5b6bd, 0xff9c7984, 0xffa55450,
+ 0xffad4942, 0xffad4942, 0xffad4942, 0xffbd493c, 0xffbd4137, 0xffbd3931, 0xffbd3931, 0xffb53929,
+ 0xffb53929, 0xffb53929, 0xee7b271b, 0x88290c08, 0x33000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684,
+ 0xffce9684, 0xffce9284, 0xffce9284, 0xffce9284, 0xffefdbd6, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffe9d2d0, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77190000, 0xdd523331, 0xeec59a94,
+ 0xeec59a94, 0xeeba968c, 0xeeb88e84, 0xeeb88e84, 0xeeb5867b, 0xeeb2837b, 0xeeaf7c73, 0xeead756b,
+ 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x77210800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x44000000, 0xee6b2021, 0xff762421,
+ 0xff762421, 0xff762421, 0xff7b2421, 0xff862824, 0xff862824, 0xff912d26, 0xff943121, 0xff943121,
+ 0xff943121, 0xff943121, 0xff8c3129, 0xff8c3129, 0xff8c3129, 0xff8c3129, 0xff8c3529, 0xff8c3529,
+ 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3129, 0xff8c3129,
+ 0xff8c3129, 0xff8c3129, 0xff7b2d21, 0xff7b2d21, 0xff7b2d21, 0xff7b2d21, 0xff7b2d29, 0xff7b2d29,
+ 0xff7b2d29, 0xff7b2d29, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff4d1813,
+ 0xff4d1813, 0xff421410, 0xaa000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22191419, 0xbb976865, 0xffd6928c, 0xffd6928c, 0xffde9694,
+ 0xffde9694, 0xffde9694, 0xffde9694, 0xffde9694, 0xffde9694, 0xffdb908c, 0xffdb908c, 0xffd68a7b,
+ 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff9a7484, 0xffd6cad6, 0xffd6cad6, 0xff9a7484, 0xffad4942,
+ 0xffa2423a, 0xffad4942, 0xffad4942, 0xffc54131, 0xffbd3d2f, 0xffb5392c, 0xffb5392c, 0xffaa352c,
+ 0xffaa352c, 0xffaa352c, 0xff9f3126, 0xdd652216, 0x55080400, 0x22080400, 0x11080400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684,
+ 0xffce9684, 0xffce9284, 0xffce9284, 0xffdeb6ad, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xfffffbff, 0xffd3aaa2, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77190000, 0xee8c6763, 0xeec59a94,
+ 0xeec59a94, 0xeebd9e94, 0xeeba968c, 0xeeb88e84, 0xeeb88e84, 0xeeb2837b, 0xeeb2837b, 0xeeaf7c73,
+ 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x88210800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa31100e, 0xff812821, 0xff812821,
+ 0xff762421, 0xff812821, 0xff862824, 0xff862824, 0xff912d26, 0xff912d26, 0xff943121, 0xff9a746e,
+ 0xff9c9694, 0xff9c9694, 0xff978481, 0xff978481, 0xff978481, 0xff978481, 0xffa29391, 0xffa29391,
+ 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29291, 0xffa29291,
+ 0xffa29291, 0xffa29291, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffceb6b2, 0xfff7fbf7,
+ 0xfff7fbf7, 0xfff7fbf7, 0xffbd9694, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff581c16,
+ 0xff4d1813, 0xff4d1813, 0xee2c0d0b, 0x66000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x88583e3f, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffdb928f,
+ 0xffdb928f, 0xffdb928f, 0xffdb928f, 0xffdb908c, 0xffdb908c, 0xffdb908c, 0xffdb908c, 0xffd68a7b,
+ 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff9a7484, 0xffd6cad6, 0xffd6cad6, 0xff9a7484, 0xff973b31,
+ 0xffa2423a, 0xffa2423a, 0xffa2423a, 0xffbd3d2f, 0xffb5392c, 0xffb5392c, 0xffad3529, 0xffaa352c,
+ 0xffaa352c, 0xff9f3126, 0xff9f3126, 0xff943121, 0xaa37130b, 0x44080400, 0x11080400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684,
+ 0xffce9684, 0xffce9284, 0xffce9284, 0xffefdbd6, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xfffffbff, 0xfffffbff, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88190000, 0xee8c6763, 0xeec59a94,
+ 0xeec59a94, 0xeebd9e94, 0xeeba968c, 0xeeba968c, 0xeeb88e84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73,
+ 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x99210800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33000000, 0xee63201b, 0xff812821, 0xff812821,
+ 0xff812821, 0xff8c2d21, 0xff912d26, 0xff912d26, 0xff912d26, 0xff912d26, 0xff943121, 0xff943121,
+ 0xff9c9694, 0xff9c9694, 0xff978481, 0xff978481, 0xff978481, 0xff9caead, 0xffa29391, 0xffa29391,
+ 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29291, 0xffa29291,
+ 0xffa29291, 0xffa29291, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xfff7fbf7, 0xfff7fbf7,
+ 0xfff7fbf7, 0xfff7fbf7, 0xff864842, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff581c16,
+ 0xff581c16, 0xff4d1813, 0xff421410, 0x99000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x33211413, 0xdd976865, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd98e89,
+ 0xffd98e89, 0xffd98e89, 0xffd98e89, 0xffdb908c, 0xffdb908c, 0xffd98b84, 0xffd98b84, 0xffd68a7b,
+ 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff7b495a, 0xffd6cad6, 0xffd6cad6, 0xff7b495a, 0xff8c3529,
+ 0xff973b31, 0xff973b31, 0xff973b31, 0xffb5392c, 0xffb5392c, 0xffad3529, 0xffad3529, 0xffaa352c,
+ 0xff9f3126, 0xff9f3126, 0xff9f3126, 0xff943121, 0xee652216, 0x77080400, 0x33080400, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b,
+ 0xffc58a7b, 0xffbd8273, 0xffe9d0cb, 0xfffff7f7, 0xfffff7f7, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xfff7f3f7, 0xfff7f3f7, 0xffdec9c8, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88190000, 0xee977779, 0xeed6b2b5,
+ 0xeed6b2b5, 0xeec3a39f, 0xeec09d9a, 0xeebd9694, 0xeebd9694, 0xeeb58b84, 0xeeb5847b, 0xeeb57d73,
+ 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0x99310800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0xff4a464a, 0xff8c888c, 0xff8c888c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff949294, 0xff949294, 0xff9c9a9c, 0xff9c9a9c,
+ 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c,
+ 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694,
+ 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694,
+ 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949294,
+ 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294,
+ 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff948e94,
+ 0xff948e94, 0xff948e94, 0xff948e94, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c,
+ 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff949694,
+ 0xff949694, 0xff949694, 0xff737573, 0xff5d5c5d, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7731100e, 0xff943129, 0xff8c2d21, 0xff8c2d21,
+ 0xff8c2d21, 0xff8c2d21, 0xff912d26, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff943121, 0xff943121,
+ 0xff9a746e, 0xff9c9694, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xffadc2c5, 0xffadc2c5,
+ 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5,
+ 0xffadc2c5, 0xffadc2c5, 0xffb2aeaa, 0xffb2aeaa, 0xffceefef, 0xffceefef, 0xfff7fbf7, 0xfff7fbf7,
+ 0xfff7fbf7, 0xffa5716e, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff632019, 0xff581c16,
+ 0xff581c16, 0xff4d1813, 0xff421410, 0xcc160705, 0x44000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x88633d3a, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd98e89,
+ 0xffd98e89, 0xffd98e89, 0xffd68a84, 0xffd98b84, 0xffd98b84, 0xffd6867b, 0xffd6867b, 0xffbd776b,
+ 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff7b495a, 0xffd6cad6, 0xffd6cad6, 0xff7b495a, 0xff8c3529,
+ 0xff8c3529, 0xff8c3529, 0xff973b31, 0xffb5392c, 0xffad3529, 0xffad3529, 0xffad3529, 0xff9f3126,
+ 0xff9f3126, 0xff942d21, 0xff942d21, 0xff943121, 0xff943121, 0xbb37130b, 0x44080400, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b,
+ 0xffc58a7b, 0xffbd8273, 0xffe9d0cb, 0xfffff7f7, 0xfffff7f7, 0xffe6d2ce, 0xffe6d2ce, 0xffe6d2ce,
+ 0xffe6d2ce, 0xfff7f3f7, 0xfff7f3f7, 0xffdec9c8, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x88190000, 0xee977779, 0xeed6b2b5,
+ 0xeed6b2b5, 0xeec5aaa5, 0xeec3a39f, 0xeebd9694, 0xeebd9694, 0xeeb58b84, 0xeeb5847b, 0xeeb5847b,
+ 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0x99310800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0xff8c888c, 0xff8c888c, 0xffcecace, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffc0c0c0, 0xffc0c0c0, 0xffced0ce, 0xffcecdce,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce,
+ 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffc5c9c5,
+ 0xffc5c9c5, 0xffc5c9c5, 0xffc5c9c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5,
+ 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5,
+ 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc0c2c0, 0xffc0c2c0, 0xffc0c2c0, 0xffc0c2c0, 0xffc0bec0,
+ 0xffc0bec0, 0xffc0bec0, 0xffc0bec0, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffb5b6b5,
+ 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x11000000, 0xaa31100e, 0xff943129, 0xff8c2d21, 0xff8c2d21,
+ 0xff912f24, 0xff912f24, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffb59a9c, 0xffc8b5b5, 0xffc8b5b5, 0xffc8b5b5, 0xffc8b5b5, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffdee3de, 0xffe9ece9, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffdbb9b5, 0xff942d21, 0xff812821, 0xff812821, 0xff762421, 0xff6b2021, 0xff682019, 0xff682019,
+ 0xff5d1c19, 0xff521819, 0xff4a1810, 0xdd190805, 0x66000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0xcc8f514d, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd6827b,
+ 0xffd6827b, 0xffd6827b, 0xffd6827b, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd07970, 0xffce7573,
+ 0xffce7573, 0xffb25e5a, 0xff974842, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff862b1e,
+ 0xff9a3224, 0xff9a3224, 0xffad3929, 0xffad3529, 0xffad3529, 0xff9c3126, 0xff9c3126, 0xff943121,
+ 0xff892d21, 0xff892d21, 0xff892d21, 0xff7b2821, 0xff7b2821, 0xdd551b16, 0x66080000, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b,
+ 0xffc58a7b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffb5796b, 0xffb5796b, 0xffb5796b,
+ 0xffb5796b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977779, 0xeed6b2b5,
+ 0xeed6b2b5, 0xeec5aaa5, 0xeec3a39f, 0xeec09d9a, 0xeebd9694, 0xeeb58b84, 0xeeb58b84, 0xeeb5847b,
+ 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0xaa310800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0xff8c888c, 0xffcecace, 0xffcecace, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffe6ebe6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdee3de,
+ 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x22000000, 0xdd63201b, 0xff943129, 0xff912f24, 0xff912f24,
+ 0xff912f24, 0xff912f24, 0xffa23329, 0xffa23329, 0xffa23329, 0xffa73629, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffaf5950, 0xffc8b5b5, 0xffc8b5b5, 0xffd6dbde, 0xffd6dbde, 0xffe1dfe1, 0xffe1dfe1,
+ 0xffecebec, 0xffecebec, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1,
+ 0xfff1f0f1, 0xfff1f0f1, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffb8736b, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff762421, 0xff762421, 0xff682019, 0xff682019,
+ 0xff5d1c19, 0xff521819, 0xff4a1810, 0xee31100b, 0x88000000, 0x22000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55472826, 0xffd67973, 0xffd37f76, 0xffd37f76, 0xffd37f76, 0xffd37f76, 0xffd6827b,
+ 0xffd6827b, 0xffd6827b, 0xffd6827b, 0xffd07970, 0xffd07970, 0xffd07970, 0xffd07970, 0xffce7573,
+ 0xffb25e5a, 0xff974842, 0xff974842, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419,
+ 0xff862b1e, 0xff9a3224, 0xff9a3224, 0xff9c3126, 0xff9c3126, 0xff9c3126, 0xff8c2d24, 0xff892d21,
+ 0xff892d21, 0xff7e2821, 0xff7e2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0x992f0d0b, 0x33000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b,
+ 0xffc58a7b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffb5796b, 0xffb5796b, 0xffb5796b,
+ 0xffb5796b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977779, 0xeed6b2b5,
+ 0xeed6b2b5, 0xeec5aaa5, 0xeec5aaa5, 0xeec09d9a, 0xeebd9694, 0xeeb5928c, 0xeeb58b84, 0xeeb5847b,
+ 0xeeb5847b, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0xaa310800, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080408, 0xff8c888c, 0xffcecace, 0xffcecace, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffe6ebe6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6,
+ 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdee3de,
+ 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde,
+ 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x5531100e, 0xff943129, 0xff943129, 0xff912f24, 0xff912f24,
+ 0xff973226, 0xff973226, 0xffa23329, 0xffa23329, 0xffa73629, 0xffa73629, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffba8f8c, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffecebec, 0xffecebec,
+ 0xfff7f7f7, 0xfff7f7f7, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffdbb9b5,
+ 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff762421, 0xff682019, 0xff682019,
+ 0xff682019, 0xff5d1c19, 0xff4a1810, 0xff4a1810, 0xaa000000, 0x33000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x88472826, 0xffd67973, 0xffd07870, 0xffd07870, 0xffd07870, 0xffd07870, 0xffd37b73,
+ 0xffd37b73, 0xffd37b73, 0xffd0746b, 0xffd07970, 0xffcb6d65, 0xffcb6d65, 0xffcb6d65, 0xffb25e5a,
+ 0xffb25e5a, 0xff974842, 0xff7b3129, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419,
+ 0xff862b1e, 0xff9a3224, 0xff9a3224, 0xff9c3126, 0xff8c2d24, 0xff8c2d24, 0xff8c2d24, 0xff7e2821,
+ 0xff7e2821, 0xff7e2821, 0xff732421, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xbb2f0d0b, 0x44000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffbd8273, 0xffbd8273,
+ 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63,
+ 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63,
+ 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd,
+ 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeeba8f86, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0xff7e807e, 0xffbdbebd, 0xffbdbebd, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffd6d7d6, 0xffd6d7d6,
+ 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d2d6,
+ 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece,
+ 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecace,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace,
+ 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5,
+ 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffbdbebd,
+ 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xff848284, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x7731100e, 0xff943129, 0xff943129, 0xff973226, 0xff973226,
+ 0xff973226, 0xff973226, 0xffa23329, 0xffa73629, 0xffa73629, 0xffa73629, 0xffad3929, 0xffad3929,
+ 0xffad3929, 0xffad3929, 0xffad6963, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffecebec, 0xfff7f7f7,
+ 0xfff7f7f7, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff942d21,
+ 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff732419, 0xff682019,
+ 0xff682019, 0xff5d1c19, 0xff4a1810, 0xff4a1810, 0xbb190805, 0x44000000, 0x11000000, 0x00000000,
+ 0x11000000, 0xaa8f514d, 0xffd67973, 0xffce716b, 0xffce716b, 0xffce716b, 0xffce716b, 0xffce6d63,
+ 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffcb6d65, 0xffcb6d65, 0xffc5615a, 0xffc5615a, 0xffb25e5a,
+ 0xff974842, 0xff974842, 0xff7b3129, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419,
+ 0xff732419, 0xff862b1e, 0xff862b1e, 0xff8c2d24, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff732421,
+ 0xff732421, 0xff732421, 0xff732421, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xdd551b16, 0x55000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffbd8273, 0xffbd8273,
+ 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63,
+ 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63,
+ 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd,
+ 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0xff3f423f, 0xff7e807e, 0xff7e807e, 0xff848484, 0xff848484, 0xff848484, 0xff848484,
+ 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484,
+ 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff8f8f8f, 0xff8f8f8f,
+ 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8e8f,
+ 0xff8f8e8f, 0xff8f8e8f, 0xff8f8e8f, 0xff8f8c8f, 0xff8f8c8f, 0xff8f8c8f, 0xff8f8c8f, 0xff898a89,
+ 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89,
+ 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898789,
+ 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789,
+ 0xff898789, 0xff898789, 0xff898789, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484,
+ 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484,
+ 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff7e7f7e,
+ 0xff7e7f7e, 0xff7e7f7e, 0xff7e7f7e, 0xff585658, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x8834120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9f3229,
+ 0xff9f3229, 0xffa53529, 0xffaa362f, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffb53931, 0xffb53931,
+ 0xffb83a2f, 0xffb53931, 0xffb53d31, 0xffcba39f, 0xffd6d7d6, 0xffd6d7d6, 0xffe6e3e6, 0xffefefef,
+ 0xfff7fbf7, 0xfff7fbf7, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffd69e9c, 0xff9c3529,
+ 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff8c2b21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff651f1b,
+ 0xff651f1b, 0xff5a1c19, 0xff521810, 0xff521810, 0xcc1b0805, 0x55000000, 0x11000000, 0x00000000,
+ 0x11000000, 0xcc8f4c42, 0xffd67163, 0xffce6963, 0xffce6963, 0xffce6963, 0xffce6963, 0xffc5655a,
+ 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc55952, 0xffc55952, 0xffc55952, 0xffc55952, 0xffbd493a,
+ 0xffbd493a, 0xff7e3126, 0xff7e3126, 0xff190808, 0xffffffff, 0xffffffff, 0xff190808, 0xff581b16,
+ 0xff842821, 0xff842821, 0xff842821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff6b2019,
+ 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xee471610, 0x55000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffffffff, 0xffbd8273,
+ 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63,
+ 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xffffffff,
+ 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd,
+ 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x9934120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9c3129,
+ 0xffa23329, 0xffa53529, 0xffaf372c, 0xffaf372c, 0xffb53929, 0xffb53929, 0xffb53931, 0xffb83a2f,
+ 0xffb53931, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffd6d7d6, 0xffd6d7d6, 0xffe6e3e6, 0xffefefef,
+ 0xffefefef, 0xfff7fbf7, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff9c3529, 0xff9c3529,
+ 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e,
+ 0xff651f1b, 0xff5a1c19, 0xff521810, 0xff521810, 0xcc1b0805, 0x55000000, 0x11000000, 0x00000000,
+ 0x11000000, 0x22000000, 0x44000000, 0x66000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000,
+ 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000,
+ 0x88000000, 0x99000000, 0xaa000000, 0xcc190808, 0xffffffff, 0xffffffff, 0xbb190808, 0xaa000000,
+ 0x99000000, 0x88000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000,
+ 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x66000000, 0x44000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd,
+ 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xaa34120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9f3229,
+ 0xffa53529, 0xffa53529, 0xffaf372c, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb83a2f, 0xffb83a2f,
+ 0xffb83a2f, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffc07068, 0xffd6d7d6, 0xffded7de, 0xffe6e3e6,
+ 0xffefefef, 0xffefefef, 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffc87d76, 0xff9c3529, 0xff9c3529,
+ 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e,
+ 0xff651f1b, 0xff651f1b, 0xff521810, 0xff521810, 0xdd1b0805, 0x66000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x55000000, 0x66000000, 0x88000000, 0xaa190808, 0xffffffff, 0xffffffff, 0xaa190808, 0x88000000,
+ 0x66000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000,
+ 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x33000000, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd,
+ 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884,
+ 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0xbb68231b, 0xff9c3529, 0xff9c3529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffa53529, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb83a2f, 0xffb83a2f,
+ 0xffba3b2c, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffb53d31, 0xffcba39f, 0xffded7de, 0xffe6e3e6,
+ 0xffe6e3e6, 0xffefefef, 0xfff7f7f7, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffe4beba, 0xffad3d31, 0xff9c3529, 0xff9c3529,
+ 0xff9c3529, 0xff9c3529, 0xff9c3121, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e,
+ 0xff651f1b, 0xff651f1b, 0xff521810, 0xff521810, 0xdd1b0805, 0x66000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x22000000, 0x44000000, 0x66000000, 0x99190808, 0xffffffff, 0xffffffff, 0x88190808, 0x66000000,
+ 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd,
+ 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884,
+ 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x9937120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffaa3729, 0xffb53929, 0xffb53a2c, 0xffb53b2f, 0xffb53b2f, 0xffbd3b31, 0xffbd3b31,
+ 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd6152, 0xffdedbde, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xfff7f7f7, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, 0xffc87970, 0xffad3929, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xff9c3129, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e,
+ 0xff631f1b, 0xff631f1b, 0xff521c10, 0xff37130b, 0xdd1b0905, 0x66000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x33000000, 0x55000000, 0x88190808, 0xfffffbff, 0xfffffbff, 0x88190808, 0x55000000,
+ 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd,
+ 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884,
+ 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x8837120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529,
+ 0xffa73629, 0xffad3929, 0xffb53a2c, 0xffb53a2c, 0xffb53a2c, 0xffb53a2c, 0xffbd3b31, 0xffbd3b31,
+ 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffd3a9a7, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffefefef, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffbff, 0xffe4bab8, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xff9c3129, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e,
+ 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xcc1b0905, 0x66000000, 0x22000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x33000000, 0x55000000, 0x88190808, 0xfffffbff, 0xfffffbff, 0x88190808, 0x55000000,
+ 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd,
+ 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884,
+ 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x7737120e, 0xffa53529, 0xffa53529, 0xffa73629, 0xffa73629,
+ 0xffa53529, 0xffad3929, 0xffb53929, 0xffb53a2c, 0xffb53a2c, 0xffb53b2f, 0xffbd3a31, 0xffbd3b31,
+ 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd453a, 0xffdedbde,
+ 0xffdedbde, 0xffdedbde, 0xffefefef, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xfffffbff, 0xffad3929, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xff9f3229, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e,
+ 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xcc1b0905, 0x66000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x22000000, 0x44000000, 0x66000000, 0x99190808, 0xfffffbff, 0xfffffbff, 0x99190808, 0x66000000,
+ 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5,
+ 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x6637120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffaa3729, 0xffb53929, 0xffb53a2c, 0xffb53b2f, 0xffb53b2f, 0xffbd3b31, 0xffbd3b31,
+ 0xffbd3d31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd453a, 0xffc87770,
+ 0xffdedbde, 0xffdedbde, 0xffe6e7e6, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffc87970, 0xffad3929, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xff9f3229, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e,
+ 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xbb000000, 0x55000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x7745221e, 0xffce655a, 0xffc56152, 0xffc56152, 0xffc56152, 0xffc56152, 0xffc5594a,
+ 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffce4531,
+ 0xff892e21, 0xff892e21, 0xff892e21, 0xff190808, 0xfffffbff, 0xfffffbff, 0xff190808, 0xff581b16,
+ 0xff581b16, 0xff842821, 0xff842821, 0xff732419, 0xff732419, 0xff732419, 0xff732419, 0xff632019,
+ 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0x88210b08, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5,
+ 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x33080000, 0xee9c3529, 0xff9c3529, 0xffa53529, 0xffa53529,
+ 0xffa73629, 0xffad3929, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb2392f, 0xffba3b2f, 0xffba3b2f,
+ 0xffba3b2f, 0xffba3b2f, 0xffba3b31, 0xffb83a31, 0xffba3b31, 0xffba3b31, 0xffb53931, 0xffb53931,
+ 0xffcba7a5, 0xffd6dfde, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff,
+ 0xfffffbff, 0xfffffbff, 0xffb53d31, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffa53529, 0xffa23329,
+ 0xff9f3229, 0xff9c3129, 0xff943121, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff732421, 0xff68201b,
+ 0xff5d1c16, 0xff5d1c16, 0xff4a1810, 0xff31100b, 0xaa000000, 0x44000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x55451f1b, 0xffce5d52, 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffc5554a,
+ 0xffc5554a, 0xffc04c3f, 0xffc04c3f, 0xffc5453a, 0xffc5453a, 0xffba3e34, 0xffba3e34, 0xffad3529,
+ 0xffad3529, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819,
+ 0xff652019, 0xff652019, 0xff732419, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019,
+ 0xff5d1e16, 0xff5d1e16, 0xff5d1e16, 0xff5a1c19, 0xff5a1c19, 0xff5a1c19, 0x88240908, 0x33000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5,
+ 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x11080000, 0xcc6b231b, 0xff9c3529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffaa3729, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb2392f, 0xffb83a2c, 0xffba3b2f,
+ 0xffba3b2f, 0xffba3b2f, 0xffb83a31, 0xffb83a31, 0xffba3b31, 0xffba3b31, 0xffb53931, 0xffb53931,
+ 0xffc0706b, 0xffd6dfde, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff,
+ 0xfffffbff, 0xffc87770, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffa53529, 0xffa23329,
+ 0xffa23329, 0xff9c3129, 0xff943121, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff732421, 0xff68201b,
+ 0xff5d1c16, 0xff5d1c16, 0xff4a1810, 0xee31100b, 0x99000000, 0x33000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x22000000, 0xcc893e37, 0xffbd5042, 0xffbd5042, 0xffbd5042, 0xffbd5042, 0xffc04c3f,
+ 0xffc04c3f, 0xffba4234, 0xffba4234, 0xffba3e34, 0xffba3e34, 0xffaf372f, 0xffaf372f, 0xffad3529,
+ 0xff912e24, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819,
+ 0xff581c19, 0xff652019, 0xff652019, 0xff632019, 0xff632019, 0xff5a1e16, 0xff5a1e16, 0xff581b13,
+ 0xff581b13, 0xff581b13, 0xff581b13, 0xff5a1c19, 0xff5a1c19, 0xdd3f1310, 0x77080000, 0x44000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5,
+ 0xeed6beb5, 0xeec3abaa, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881,
+ 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x993a120e, 0xff9c3529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffa73629, 0xffaf392c, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb83a2c, 0xffba3b2f,
+ 0xffb83a2c, 0xffba3b2f, 0xffb83a31, 0xffba3b31, 0xffb83a31, 0xffba3b31, 0xffb53931, 0xffb53931,
+ 0xffb53931, 0xffcba7a5, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff,
+ 0xffe4b9b8, 0xffad3529, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffad3529, 0xffa53529, 0xffa23329,
+ 0xff9f3229, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff7b2421, 0xff732421, 0xff68201b,
+ 0xff5d1c16, 0xff521810, 0xff4a1810, 0xdd190805, 0x77000000, 0x22000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x99451f1b, 0xffbd5042, 0xffb5463a, 0xffb5463a, 0xffb5463a, 0xffba4234,
+ 0xffba4234, 0xffb53929, 0xffb53929, 0xffaf372f, 0xffaf372f, 0xffaf372f, 0xffaf372f, 0xffad3529,
+ 0xff912e24, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819,
+ 0xff4a1819, 0xff581c19, 0xff652019, 0xff5a1e16, 0xff5a1e16, 0xff521b13, 0xff521b13, 0xff581b13,
+ 0xff581b13, 0xff581b13, 0xff581b13, 0xff5a1c19, 0xff5a1c19, 0xcc240908, 0x77080000, 0x33000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x88290400, 0xee977873, 0xeeceb2ad,
+ 0xeeceb2ad, 0xeec5aead, 0xeec3a6a2, 0xeec09e97, 0xeec09e97, 0xeebd928c, 0xeeba8b84, 0xeeb8847b,
+ 0xeeb8847b, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0xaa210400, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x66080000, 0xff9c3529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffa53529, 0xffaf392c, 0xffaf392c, 0xffaf392c, 0xffb2392f, 0xffb83a2c, 0xffb83a2c,
+ 0xffb83a2c, 0xffb83a2c, 0xffb53931, 0xffb83a31, 0xffb83a31, 0xffb53931, 0xffb53931, 0xffb53931,
+ 0xffb53931, 0xffc0706b, 0xffe6e3e6, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff,
+ 0xffc87770, 0xffad3529, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffad3529, 0xffa53529, 0xffa23329,
+ 0xff9c3129, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff7b2421, 0xff68201b, 0xff5d1c16,
+ 0xff521810, 0xff521810, 0xff31100b, 0xbb000000, 0x66000000, 0x22000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x44000000, 0xddad3d31, 0xffb5463a, 0xffad3d31, 0xffad3d31, 0xffb53929,
+ 0xffb53929, 0xffb53929, 0xffb53929, 0xffaf372f, 0xffaf372f, 0xffa53129, 0xffa53129, 0xff912e24,
+ 0xff912e24, 0xff5a2019, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819,
+ 0xff4a1819, 0xff4a1819, 0xff581c19, 0xff521b13, 0xff521b13, 0xff521b13, 0xff4a1810, 0xff521810,
+ 0xff521810, 0xff521810, 0xff521810, 0xff5a1c19, 0xee3f1310, 0x99080000, 0x55080000, 0x22000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88290400, 0xee977873, 0xeeceb2ad,
+ 0xeeceb2ad, 0xeec3a6a2, 0xeec3a6a2, 0xeec09e97, 0xeebd968c, 0xeebd928c, 0xeeba8b84, 0xeeb8847b,
+ 0xeeb8847b, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x22000000, 0xdd6b2019, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa73629, 0xffa73629, 0xffa73629, 0xffb53929, 0xffb53929,
+ 0xffb53929, 0xffb53929, 0xffaf3729, 0xffb53929, 0xffaf3729, 0xffb53929, 0xffaf3729, 0xffb53929,
+ 0xffaf3729, 0xffaf3729, 0xffdbb9b5, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfffff7f7, 0xffe1b7b2,
+ 0xffa53929, 0xffa53929, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff942e26, 0xff8c2d21, 0xff8c2d21, 0xff7e271e, 0xff70221b, 0xff632019, 0xff632019,
+ 0xff471710, 0xff471710, 0xee290c08, 0xaa000000, 0x44000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x99451710, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffad3929,
+ 0xffad3929, 0xffa73629, 0xffa73629, 0xffa53529, 0xffa53529, 0xff9a3126, 0xff9a3126, 0xff842d29,
+ 0xff762824, 0xff5a2019, 0xff5a2019, 0xff6b495a, 0xffd6cad6, 0xffd6cad6, 0xff6b495a, 0xff4d1c1e,
+ 0xff4a1410, 0xff4d1c1e, 0xff4d1c1e, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810,
+ 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xcc190805, 0x77000000, 0x44000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88290400, 0xee603e3a, 0xeeceb2ad,
+ 0xeeceb2ad, 0xeec3a6a2, 0xeec09e97, 0xeec09e97, 0xeebd968c, 0xeebd928c, 0xeeba8b84, 0xeeb8847b,
+ 0xeeb57d73, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x77240b08, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffa73629, 0xffa73629, 0xffb53929, 0xffad3629,
+ 0xffad3629, 0xffad3629, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729,
+ 0xffaf3729, 0xffaf3729, 0xffa53d31, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfffff7f7, 0xffa53929,
+ 0xffa53929, 0xffa53929, 0xffa53529, 0xffa53529, 0xff9f3329, 0xff9f3329, 0xff9c3129, 0xff9c3129,
+ 0xff942e26, 0xff942e26, 0xff8c2d21, 0xff8c2d21, 0xff7e271e, 0xff70221b, 0xff632019, 0xff471710,
+ 0xff471710, 0xff471710, 0xcc0e0403, 0x88000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x44080400, 0xcc812a21, 0xffbd3d31, 0xffbd3d31, 0xffa73629,
+ 0xffa73629, 0xffa73629, 0xffa23329, 0xff9a3126, 0xff9a3126, 0xff9a3126, 0xff8f2d24, 0xff762824,
+ 0xff68241e, 0xff5a2019, 0xff5a2019, 0xff6b495a, 0xffd6cad6, 0xffd6cad6, 0xff6b495a, 0xff4d1c1e,
+ 0xff4a1410, 0xff4a1410, 0xff4d1c1e, 0xff4a1810, 0xff4a1810, 0xff471710, 0xff471710, 0xff4a1810,
+ 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xee31100b, 0x99000000, 0x55000000, 0x33000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77290400, 0xee603e3a, 0xeeceb2ad,
+ 0xeeceb2ad, 0xeec3a6a2, 0xeec09e97, 0xeebd968c, 0xeebd968c, 0xeeba8b84, 0xeeba8b84, 0xeeb8847b,
+ 0xeeb57d73, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0xcc6e221e, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffa73629, 0xffad3629, 0xffad3629,
+ 0xffad3629, 0xffad3629, 0xffaf3729, 0xffaa3629, 0xffa53529, 0xffaa3629, 0xffa53529, 0xffaf3729,
+ 0xffaa3629, 0xffa53529, 0xffa53d31, 0xffc07b73, 0xfff7f7f7, 0xfff7f7f7, 0xffc3786e, 0xffa53929,
+ 0xffa53929, 0xffa53929, 0xff9f3329, 0xff9f3329, 0xff9f3329, 0xff9a3229, 0xff9c3129, 0xff942e26,
+ 0xff942e26, 0xff942e26, 0xff7e271e, 0xff7e271e, 0xff70221b, 0xff70221b, 0xff632019, 0xff471710,
+ 0xff471710, 0xee2c0d08, 0xaa000000, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11080400, 0x77451710, 0xee812a21, 0xffbd3d31, 0xffa73629,
+ 0xffa23329, 0xffa23329, 0xffa23329, 0xff9a3126, 0xff9a3126, 0xff8f2d24, 0xff8f2d24, 0xff762824,
+ 0xff68241e, 0xff5a2019, 0xff68241e, 0xff6b495a, 0xffb29fad, 0xffb29fad, 0xff8f7484, 0xff50242c,
+ 0xff4a1410, 0xff4a1410, 0xff4a1410, 0xff471710, 0xff471710, 0xff451610, 0xff451610, 0xff4a1810,
+ 0xff4a1810, 0xff4a1810, 0xee3c130e, 0xbb190805, 0x66000000, 0x44000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xfff7ffff, 0xffce9e94,
+ 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294,
+ 0xffd39e91, 0xffce9e94, 0xffce9e94, 0xffce988c, 0xffce988c, 0xffc58e7b, 0xffc58e7b, 0xfff7ffff,
+ 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77290400, 0xdd5d3731, 0xeec59e94,
+ 0xeec59e94, 0xeebd9e9c, 0xeebd9e9c, 0xeeba9794, 0xeeb8908c, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73,
+ 0xeeaf7c73, 0xee9c7168, 0xeed6a69c, 0xee9c7168, 0x88290800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66100408, 0xee6e221e,
+ 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa53329, 0xffa53329,
+ 0xffa53329, 0xffa53329, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529,
+ 0xffa53529, 0xffa53529, 0xffa53d31, 0xffa53d31, 0xfff7f7f7, 0xfff7f7f7, 0xffa53929, 0xffa53929,
+ 0xffa53929, 0xffa53929, 0xff9a3229, 0xff9a3229, 0xff943129, 0xff943129, 0xff942e26, 0xff942e26,
+ 0xff8c2b24, 0xff842821, 0xff7e271e, 0xff70221b, 0xff70221b, 0xff631c19, 0xff471710, 0xff471710,
+ 0xff471710, 0xdd100400, 0x88000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11080400, 0x22080400, 0x99451710, 0xee812a21, 0xffa23329,
+ 0xffa23329, 0xff9c3129, 0xff9c3129, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff842821, 0xff68241e,
+ 0xff68241e, 0xff5a2019, 0xff842d29, 0xff8f7484, 0xffb29fad, 0xffb29fad, 0xff8f7484, 0xff522d3a,
+ 0xff4d1c1e, 0xff4a1410, 0xff4a1410, 0xff451610, 0xff451610, 0xff451610, 0xff451610, 0xff3c130e,
+ 0xff3c130e, 0xff3c130e, 0xcc210808, 0x77000000, 0x44000000, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffd39f91, 0xffd39f91, 0xffd39f91, 0xffd39f91, 0xffd39e91, 0xffd39e91, 0xffd39e91,
+ 0xffd39e91, 0xffce988c, 0xffce988c, 0xffce988c, 0xffce9384, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b,
+ 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x66290400, 0xdd5d3731, 0xeec59e94,
+ 0xeec59e94, 0xeebd9e9c, 0xeeba9794, 0xeeb8908c, 0xeeb58a84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73,
+ 0xeeaf7c73, 0xee9c7168, 0xeed6a69c, 0xee9c7168, 0x77290800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa2c0f0b,
+ 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xff9a3126, 0xffa53529, 0xff9a3126, 0xff9a3126, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xffbd6d6b, 0xffbd6d6b, 0xff9c3129, 0xff9c3129,
+ 0xff9c3129, 0xff9c3129, 0xff9c3121, 0xff9c3121, 0xff912d21, 0xff9c3121, 0xff842d21, 0xff842d21,
+ 0xff76271e, 0xff76271e, 0xff732421, 0xff732421, 0xff5d1e19, 0xff5d1e19, 0xff421410, 0xff421410,
+ 0xee2c0d0b, 0xaa000000, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x994a1410, 0xee942d21,
+ 0xff942d21, 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff632019,
+ 0xff632019, 0xff632019, 0xff633134, 0xff846573, 0xffa596a5, 0xffa596a5, 0xff846573, 0xff5a3d42,
+ 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410,
+ 0xff421410, 0xcc160705, 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffd39f91, 0xffd09d8f, 0xffd09d8f, 0xffd09d8f, 0xffd09a8f, 0xffd09a8f, 0xffd09a8f,
+ 0xffd09a8f, 0xffce988c, 0xffce9384, 0xffce9384, 0xffce9384, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b,
+ 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x55290400, 0xcc290400, 0xeec59e94,
+ 0xeec59e94, 0xeeba9794, 0xeeb8908c, 0xeeb8908c, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, 0xeeaf7c73,
+ 0xeead756b, 0xee9c7168, 0xeed6a69c, 0xdd633d34, 0x66290800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0xbb2c0f0b, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8f2d26, 0xff8f2d26,
+ 0xff8f2d26, 0xff9c3129, 0xff8f2d24, 0xff9a3126, 0xff9a3126, 0xff9a3126, 0xff942e26, 0xff9c3129,
+ 0xff942e26, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff942e26, 0xff942e26,
+ 0xff942e26, 0xff942e26, 0xff9c3121, 0xff912d21, 0xff912d21, 0xff912d21, 0xff842d21, 0xff76271e,
+ 0xff76271e, 0xff76271e, 0xff732421, 0xff5d1e19, 0xff5d1e19, 0xff471710, 0xff421410, 0xee2c0d0b,
+ 0xbb000000, 0x77000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x99370f0b,
+ 0xee942d21, 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff762421, 0xff632019,
+ 0xff632019, 0xff632019, 0xff633942, 0xff846573, 0xffa596a5, 0xffa596a5, 0xff846573, 0xff5a3d42,
+ 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee421410,
+ 0xcc160705, 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94,
+ 0xffce9e94, 0xffd09d8f, 0xffd09d8f, 0xffd09d8f, 0xffce9a8c, 0xffd09a8f, 0xffce968c, 0xffce968c,
+ 0xffce968c, 0xffce9384, 0xffce9384, 0xffce8e7b, 0xffce8e7b, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b,
+ 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x00000000, 0x22000000, 0x44290400, 0xbb290400, 0xee916b63,
+ 0xeec59e94, 0xeeb8908c, 0xeeb8908c, 0xeeb58a84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, 0xeead756b,
+ 0xeead756b, 0xee9c7168, 0xeed6a69c, 0xcc290800, 0x55290800, 0x22000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x33000000, 0xcc2c0f0b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff812824, 0xff812824,
+ 0xff812824, 0xff812824, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff8c2b24, 0xff8c2b24,
+ 0xff8c2b24, 0xff8c2b24, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff942e26, 0xff942e26,
+ 0xff942e26, 0xff942e26, 0xff912d21, 0xff912d21, 0xff862821, 0xff862821, 0xff76271e, 0xff76271e,
+ 0xff68221b, 0xff68221b, 0xff5d1e19, 0xff5d1e19, 0xff471710, 0xff471710, 0xff2c0d0b, 0xcc000000,
+ 0x88000000, 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33080000,
+ 0x88370f0b, 0xdd651e16, 0xff942d21, 0xff812821, 0xff812821, 0xff762421, 0xff762421, 0xff632019,
+ 0xff632019, 0xff632826, 0xff633942, 0xff846573, 0xff947d8c, 0xff947d8c, 0xff846573, 0xff5a3d42,
+ 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee2f0d0b, 0xbb160705,
+ 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffc58a7b, 0xffc58a7b, 0xffc58a7b, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x33190400, 0xaa190400, 0xee91584d,
+ 0xeece8273, 0xeeb5867b, 0xeeb5867b, 0xeeb5867b, 0xeeb5867b, 0xeead7973, 0xeead7973, 0xeeaa6d65,
+ 0xeeaa6d65, 0xeeaa7d73, 0xeeefbaad, 0xbb210400, 0x44210400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x44000000, 0xcc4a1410, 0xff76241b, 0xff76241b, 0xff76241b, 0xff732421, 0xff732421,
+ 0xff732421, 0xff812824, 0xff842821, 0xff842821, 0xff842821, 0xff842821, 0xff842821, 0xff842821,
+ 0xff8c2b24, 0xff842821, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2b24, 0xff8c2b24,
+ 0xff8c2b24, 0xff842821, 0xff862821, 0xff862821, 0xff862821, 0xff7b2421, 0xff76271e, 0xff68221b,
+ 0xff68221b, 0xff5a1c19, 0xff5d1e19, 0xff471710, 0xff311008, 0xff311008, 0xdd160705, 0x99000000,
+ 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11080000,
+ 0x33080000, 0x55080000, 0xaa370f0b, 0xee6b2021, 0xff812821, 0xff762421, 0xff762421, 0xff632019,
+ 0xff632019, 0xff632019, 0xff633134, 0xff734d5a, 0xff846573, 0xff846573, 0xff734d5a, 0xff522f31,
+ 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xee2f0d0b, 0xcc1b0705, 0x99080000, 0x66000000,
+ 0x44000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9a8c, 0xffefdbd3, 0xfffffbf7, 0xfffffbf7, 0xffefddd9, 0xffefddd9, 0xffefddd9,
+ 0xffefddd9, 0xfffffbf7, 0xfffffbf7, 0xffecd5ce, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22190400, 0x77190400, 0xdd552e26,
+ 0xeece8273, 0xeeaf7165, 0xeeaf7165, 0xeeb5867b, 0xeeaf7165, 0xeead7973, 0xeeaa6d65, 0xeeaa6d65,
+ 0xeeaa6d65, 0xeeaa7d73, 0xeeaa7d73, 0x88210400, 0x22210400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x33000000, 0x99210b08, 0xee421610, 0xff632019, 0xff632019, 0xff632019,
+ 0xff632019, 0xff632019, 0xff732419, 0xff732419, 0xff732419, 0xff732419, 0xff6b221b, 0xff7b2821,
+ 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821,
+ 0xff7b2821, 0xff7b2821, 0xff7b2421, 0xff7b2421, 0xff7b2421, 0xff7b2421, 0xff6b2019, 0xff6b2019,
+ 0xff6b2019, 0xff4a1610, 0xff421410, 0xff421410, 0xee2c0d0b, 0xcc000000, 0x99000000, 0x55000000,
+ 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x22000000, 0x44000000, 0x771e0908, 0xbb3c1310, 0xdd5a1c19, 0xff5a1c19, 0xff55221b,
+ 0xff55221b, 0xff55221b, 0xff7b3129, 0xff58373c, 0xff7b4d52, 0xff7b4d52, 0xff58373c, 0xff5a2d29,
+ 0xff3f1f1b, 0xff24120e, 0xee24120e, 0xcc210808, 0x990b0303, 0x77000000, 0x55000000, 0x44000000,
+ 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9a8c, 0xffefdbd3, 0xfffffbf7, 0xfffffbf7, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xfffffbf7, 0xfffffbf7, 0xffd9afa5, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22190400, 0x44190400, 0xbb190400,
+ 0xee91584d, 0xeeaa5d50, 0xeeaf7165, 0xeeaf7165, 0xeeaf7165, 0xeeaa6d65, 0xeea76158, 0xeea76158,
+ 0xeeaa6d65, 0xeeaa7d73, 0xcc210400, 0x55210400, 0x22210400, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x66000000, 0xcc210b08, 0xff451610, 0xff632019,
+ 0xff451610, 0xff632019, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff6b221b, 0xff6b221b,
+ 0xff6b221b, 0xff6b221b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b,
+ 0xff6e231b, 0xff6e231b, 0xff651e1b, 0xff7b2421, 0xff651e1b, 0xff651e1b, 0xff6b2019, 0xff4a1610,
+ 0xff4a1610, 0xff4a1610, 0xff2c0d0b, 0xee160705, 0xbb000000, 0x88000000, 0x55000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x11000000, 0x33000000, 0x44000000, 0x66000000, 0x991e0908, 0xbb2f130e,
+ 0xdd2f130e, 0xee55221b, 0xff55221b, 0xff58373c, 0xff58373c, 0xff58373c, 0xee342226, 0xdd3f1f1b,
+ 0xcc24120e, 0xaa080400, 0x88080400, 0x77000000, 0x55000000, 0x44000000, 0x33000000, 0x11000000,
+ 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c,
+ 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xfffffbf7, 0xfffffbf7, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xfffffbf7, 0xffecd5ce, 0xffc58a7b, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x11190400, 0x22190400, 0x77190400,
+ 0xcc190400, 0xeea5493a, 0xeeaa5d50, 0xeeaa5d50, 0xeeaa5d50, 0xeea76158, 0xeea76158, 0xeea76158,
+ 0xeea5554a, 0xcc210400, 0x77210400, 0x22210400, 0x11210400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44000000, 0x88080000, 0xdd260b08,
+ 0xee451610, 0xff451610, 0xff47140e, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff5a1b16, 0xff5a1b16,
+ 0xff5a1b16, 0xff5a1b16, 0xff601e16, 0xff601e16, 0xff6e231b, 0xff601e16, 0xff601e16, 0xff601e16,
+ 0xff601e16, 0xff601e16, 0xff651e1b, 0xff651e1b, 0xff501716, 0xff501716, 0xff4a1610, 0xff4a1610,
+ 0xff290b08, 0xee290b08, 0xdd000000, 0xaa000000, 0x77000000, 0x44000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x33000000, 0x55080400,
+ 0x66080400, 0x77080400, 0x88080400, 0x88100c10, 0x99100c10, 0x99100c10, 0x88100c10, 0x8824120e,
+ 0x77080400, 0x66080400, 0x55080400, 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284,
+ 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffd9b3a7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffcea9a2, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000,
+ 0x66000000, 0x99210400, 0xaa420800, 0xbb420800, 0xbb630c00, 0xcc520c00, 0xbb520c00, 0xbb370800,
+ 0x991b0400, 0x66000000, 0x33000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22080000, 0x44080000,
+ 0x77080000, 0xbb080000, 0xee310c08, 0xff47140e, 0xff47140e, 0xff47140e, 0xff4a1410, 0xff4a1410,
+ 0xff5a1b16, 0xff5a1b16, 0xff521810, 0xff521810, 0xff521810, 0xff521810, 0xff521810, 0xff521810,
+ 0xff521810, 0xff521810, 0xff501716, 0xff501716, 0xff501716, 0xff3a1010, 0xff290b08, 0xee290b08,
+ 0xcc080000, 0xaa080000, 0x88000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22080400,
+ 0x33080400, 0x33080400, 0x44080400, 0x44100c10, 0x55100c10, 0x55100c10, 0x44100c10, 0x44080400,
+ 0x33080400, 0x33080400, 0x22080400, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284,
+ 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffecd9d3, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffe6d4d0, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000,
+ 0x22000000, 0x22000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000,
+ 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000,
+ 0x22000000, 0x44000000, 0x66000000, 0x99000000, 0xbb080303, 0xdd190808, 0xee260b0b, 0xff3a1010,
+ 0xff3a1010, 0xff3a1010, 0xff3a1410, 0xff3a1410, 0xff3a1410, 0xff3a1410, 0xff4a1410, 0xff4a1410,
+ 0xff4a1410, 0xff4a1410, 0xff311010, 0xee210b0b, 0xdd100505, 0xcc100505, 0xbb000000, 0x99000000,
+ 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284,
+ 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffd9b3a7, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffcea9a2, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x11000000, 0x33000000, 0x44000000, 0x55000000, 0x77000000, 0x88000000,
+ 0xaa000000, 0xbb000000, 0xcc130705, 0xcc130705, 0xcc130705, 0xdd130705, 0xcc190705, 0xcc190705,
+ 0xcc000000, 0xbb000000, 0xbb000000, 0x99000000, 0x88000000, 0x66000000, 0x55000000, 0x44000000,
+ 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284,
+ 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffe9d7d3, 0xffffffff, 0xffffffff,
+ 0xffdec2bd, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000,
+ 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000, 0x66000000,
+ 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b,
+ 0xffc5867b, 0xffc58a7b, 0xffbd8376, 0xffbd8376, 0xffbd8376, 0xffc59b8f, 0xfff7e7e6, 0xfff7e7e6,
+ 0xffc59b8f, 0xffb5796b, 0xffb5796b, 0xffad7568, 0xffad7568, 0xffa56d63, 0xffa56d63, 0xffa56d63,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000,
+ 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b,
+ 0xffc5867b, 0xffbd8376, 0xffbd8376, 0xffb57c70, 0xffb57c70, 0xffad7563, 0xffdec1ba, 0xffdec1ba,
+ 0xffad7563, 0xffad7568, 0xffad7568, 0xffa57165, 0xffa57165, 0xffa56d63, 0xffa56d63, 0xffa56d63,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b,
+ 0xffc5867b, 0xffbd8376, 0xffb57c70, 0xffb57c70, 0xffb57c70, 0xffad7563, 0xffad7563, 0xffad7563,
+ 0xffad7563, 0xffa57165, 0xffa57165, 0xffa57165, 0xff9c6d63, 0xffa56d63, 0xffa56d63, 0xffa56d63,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b,
+ 0xffc5867b, 0xffb57c70, 0xffb57c70, 0xffad756b, 0xffad756b, 0xffad7563, 0xffad7563, 0xffad7563,
+ 0xffad7563, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, 0xffa56d63, 0xffa56d63, 0xffa56d63,
+ 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xffad7d73, 0xffad7d73,
+ 0xffad7d73, 0xffa57163, 0xffa57163, 0xffa57163, 0xffa57163, 0xff9c695a, 0xff9c695a, 0xff9c695a,
+ 0xff9c695a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff946d63, 0xff946d63, 0xff946d63,
+ 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xfff7ffff, 0xffad7d73,
+ 0xffad7d73, 0xffa57163, 0xffa57163, 0xffa57163, 0xffa57163, 0xff9c695a, 0xff9c695a, 0xff9c695a,
+ 0xff9c695a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff946d63, 0xff946d63, 0xffffffff,
+ 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xffded4d0, 0xffded4d0,
+ 0xffded4d0, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde,
+ 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffdbcecb, 0xffdbcecb, 0xffdbcecb,
+ 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffc5a9a2, 0xffc5a9a2, 0xffc5a9a2,
+ 0xffc5a9a2, 0xffc5b7b5, 0xffc5b7b5, 0xffc5b7b5, 0xffc5b7b5, 0xffc3b5b2, 0xffc3b5b2, 0xffc3b5b2,
+ 0xffc3b5b2, 0xffc0b3b2, 0xffc0b3b2, 0xffc0b3b2, 0xffc0b3b2, 0xffb89e97, 0xffb89e97, 0xffb89e97,
+ 0xffb89e97, 0xff6e6f6e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
+
+static const UINT g_DXUTGUITextureSrcDataSizeInBytes = 262272;
+
+static const DWORD g_DXUTArrowMeshSrcData[] =
+{
+ 0x20666f78, 0x33303330, 0x70697a62, 0x32333030, 0x000030d7, 0x087930c7, 0x59ed4b43, 0xd51c6c5d,
+ 0x71dbbe15, 0xacbbc1d6, 0xe125d493, 0xc1024e27, 0x7133f9c1, 0xec1098ec, 0x1b1daef1, 0xc6d24eb7,
+ 0xc713fa10, 0x64866f59, 0xd9aecd95, 0x694304dd, 0x4485686b, 0xad2fb6a5, 0x78df44a8, 0x6cca8828,
+ 0x20a2895a, 0x2aaf60ef, 0x905215b5, 0x4fa9515a, 0xa45b4d45, 0xa1e09548, 0x9e94d282, 0xcf5df333,
+ 0x8a3acdf1, 0xec0c5368, 0xbefec6ac, 0xf77ee733, 0xdef73bdc, 0x9d667739, 0x4a65a90a, 0xf27c81a9,
+ 0x7040d394, 0xba2785e0, 0x7e7e38ff, 0xd5bb0be5, 0xba1f17fa, 0x56a633b0, 0x1546bf79, 0x1d7cec51,
+ 0x164bef39, 0x8ec9e9f3, 0xb02e0ec9, 0x1fe77ed7, 0xbf399e4f, 0x550707f2, 0x1fceceef, 0x36a1db3e,
+ 0xdc985b93, 0x316e794e, 0xc415a965, 0x2413551a, 0xf77d749a, 0xc2d993e5, 0x29fcb983, 0xe2d5905f,
+ 0x61519a86, 0x7a942488, 0x36fb0b90, 0x1df5c9ad, 0x5cc55272, 0x188e559e, 0x4288e08d, 0x1aee41e4,
+ 0x47c0123e, 0xae72c8b5, 0x189c29ca, 0xbebca648, 0x5a643318, 0xf91567c9, 0x90e1d964, 0x933a2f93,
+ 0xe963d943, 0x52685394, 0xaeaf8a1d, 0x8bcce8e4, 0x058b45b1, 0xaa87527d, 0x2afedab9, 0x642f72d5,
+ 0x4daeacb9, 0xfc8fd936, 0x4cc6ae0c, 0x15a5ae77, 0x2018bc05, 0x8feb9b20, 0x2bdd0e02, 0x6172b81f,
+ 0x50440c73, 0xbadd3f70, 0x31c0a664, 0xadf719f7, 0xf859fa15, 0x3d721e5c, 0xc62ff55f, 0x701d670c,
+ 0x40b14754, 0x11d86164, 0x903fbd84, 0xbd058b32, 0x97d2ddcc, 0x07f2e4cb, 0x0e711307, 0x1ffd4ffb,
+ 0x09963e74, 0x6121e6c2, 0x39de5391, 0xee0f8fe6, 0xc779e395, 0x6f94fac9, 0xb4e678d3, 0x664c5c13,
+ 0xe5244e26, 0x2cfad200, 0xcdf678ff, 0x7e4e75df, 0x20317918, 0x9f274593, 0x6f58664e, 0x8c32319f,
+ 0x7b94f916, 0x550533c3, 0x761ee44c, 0x300c2e88, 0x5627aea4, 0xa7527098, 0x4a3cc933, 0x4e717354,
+ 0xf4850ba5, 0x8e6a2d19, 0x1fb81586, 0x74e1d03a, 0x26c1c8a1, 0x06890caa, 0xb1da35be, 0x9a65dc60,
+ 0x3064ce14, 0x859df497, 0xd5c55639, 0xfb0b9c1f, 0xd25ef2e9, 0x46f1ae81, 0xfebf4f1f, 0x749913d3,
+ 0xe74c592a, 0x1c8998b2, 0x6ffdd0f0, 0x3f9bfcbc, 0xa9e868fc, 0x3fcf23f3, 0xe7f1da57, 0x3f3c31f9,
+ 0xcf14f5c9, 0x8fa7c81e, 0x8cc9b3a7, 0x917c919c, 0x983a7507, 0x3fb4b2f5, 0xeb6ac50a, 0xca48c6f7,
+ 0x07633ac9, 0xb3ea3973, 0xf58d2d2b, 0x352b3f5e, 0x8ecbab65, 0x0119b7ab, 0xf3e78c30, 0xa6af87b9,
+ 0xfddef7ee, 0xe5551ece, 0xafc27690, 0x65c7aaa8, 0xfbe37375, 0x6f50c91e, 0x773bf939, 0x9bc6f87c,
+ 0xa35729f6, 0xaef0ae99, 0x256f73b6, 0x00957ff8, 0x7d46b8f8, 0x7e7fc53e, 0x5f343232, 0x75de5ead,
+ 0xc1ef61ad, 0xf59d3773, 0x3950da6a, 0x35c4aa5e, 0x8a503e1e, 0x3adebfd7, 0xb2c778cb, 0x7f9dfc62,
+ 0x97c3d8ff, 0x8ef74db6, 0x61ecbaff, 0xd5fa7db5, 0xb2fb7024, 0xd9f6ace2, 0xab34a077, 0xece692cb,
+ 0x9d93d74c, 0xfe5d9cd0, 0x4757ab7a, 0xe1efef9b, 0xbf4db7f7, 0x68719a4a, 0x498126f6, 0x7c36fe33,
+ 0x461e3348, 0x68ce20d9, 0x5a338825, 0x568ce209, 0x95a33882, 0x2568ce20, 0x095a3388, 0x82568ce2,
+ 0xc44d3d38, 0x7104ad19, 0x9c412b46, 0xf4e2269e, 0xa7a71134, 0x67c93889, 0x6bf4f0fe, 0xec3ffb7d,
+ 0x937ab0db, 0x4e8bbc62, 0x19fabd0b, 0x5b82433a, 0x075e69b0, 0x6132f9ac, 0x9b0c23e3, 0x69b0f5e6,
+ 0xcd361cbe, 0xf34d83af, 0x8f34d806, 0x1479a6c0, 0x87afcd36, 0x6c18f34d, 0x6360879a, 0x9fa74cde,
+ 0x1d7c06ca, 0x4af0166c, 0xcd87af83, 0xf0655e02, 0xc059b00d, 0xadf8359f, 0x4dc059b0, 0x360dbf06,
+ 0x0673f80b, 0x059b08df, 0x6fc1837c, 0x5e02cd87, 0xd816f06d, 0x0635e02c, 0x059b04df, 0xefc1a37c,
+ 0xbe02cd80, 0xb0ade0c9, 0x1b37c059, 0x166c337c, 0xdf062df0, 0xdc059b02, 0x7166f068, 0xb9d2d6bf,
+ 0x826dce95, 0x382ede33, 0x19c136e3, 0xe33829df, 0x6e33821d, 0x4ef19c17, 0x087719c1, 0x7053b8ce,
+ 0x6704bbc6, 0x977825dc, 0x816b5f98, 0x1bbe0b77, 0x9592aa6d, 0x5990fe2f, 0xd25cbcf0, 0xb7df7d78,
+ 0x9f46a7ec, 0xe17666e9, 0x7dced644, 0xf1995cfb, 0xf6eda1e0, 0x78f667b3, 0x2607facf, 0xf479ee9f,
+ 0xd5e045bb, 0x6fb686e5, 0xddffb878, 0x7a707746, 0x7f4fc3c4, 0xf4cdd47f, 0xa6930f2a, 0xd0339a4b,
+ 0x07b34974, 0xda692e9a, 0x26932cd0, 0xd21eeaf0, 0x9369a1b4, 0x9b4d0da6, 0x60448d34, 0x33cc45ca,
+ 0x6515c7c2, 0x8ae9a15d, 0x83115cba, 0x8b2b622b, 0x5b45bb98, 0x5b46d16c, 0x7d16ddb4, 0xb2be8b62,
+ 0x98f61f45, 0x5c652f31, 0x1ed4c87b, 0xcc87b532, 0x44c87852, 0x87eedd16, 0x084ce7bd, 0x87e93f65,
+ 0xdea666f9, 0xb3feed9b, 0x2da69e4b, 0x5f5e2238, 0x448df95e, 0xe783dd58, 0x2758b377, 0x87573af4,
+ 0xb58c2c35, 0xa4d6396a, 0x513dac06, 0x8c3131ac, 0x135815cd, 0x376e6156, 0x80de8e61, 0x7306b6b9,
+ 0xfd8c26e6, 0xffef705b, 0xf04675df, 0x0f57b05b, 0xb2a52f7b, 0x5179b5ce, 0xced6ede0, 0xe45895bd,
+ 0x7c35c54d, 0xeeaea051, 0xd7b8c145, 0x85a12ddf, 0x274a972a, 0x9ec71a13, 0xa10a254f, 0x1c69b7a2,
+ 0xb89c3b5d, 0xe1e8ba54, 0x24b5cfb3, 0xe3274e7e, 0x08ed917f, 0x413c635d, 0xf5065cbe, 0x4eb5a4bf,
+ 0xdab38a87, 0xe2e941fe, 0x49fc28ec, 0x742cee63, 0x7dee6348, 0x5cef93e8, 0xc692f516, 0xf57ecfdc,
+ 0x7db497d3, 0xcf10b492, 0xd17b3a9c, 0xf9d225c3, 0xff8c9d05, 0xc5acfa49, 0x36f924f8, 0xb7bc1952,
+ 0xc62d62e9, 0xf4e3f75f, 0xc5ece870, 0x93f861f8, 0x9d04a246, 0xbdf18a31, 0x1a4faf92, 0x57a81389,
+ 0x6fe7db1f, 0x862f0d6d, 0x36a9636b, 0x1c1bfe96, 0xead38f56, 0x9c13f474, 0x1c8a37a3, 0xba39195d,
+ 0x65727232, 0xc8cae0e4, 0x639195b9, 0x56a7232b, 0x8cad0e46, 0x3919599c, 0x740dceb2, 0xe46edc4e,
+ 0xd45f3ac0, 0x234eef39, 0xa3f9d607, 0x8c3b79ce, 0x93e7581c, 0x44ede73a, 0x2ef9206e, 0x66e02cd8,
+ 0x66c17783, 0xf833af01, 0xc059b05d, 0x1bbe0deb, 0x83780b36, 0xcd86efc1, 0xe0d5be02, 0x80b3607b,
+ 0x3df8336f, 0x1bc059b0, 0x9b0dde0d, 0xc1bb7c05, 0x80b3607b, 0xc36e0c5b, 0x326f0166, 0x166c2f78,
+ 0x8f061df0, 0xb70166c3, 0x9b013c1a, 0xe0d9bc05, 0xc059b07d, 0x0fde0c5b, 0xd5bc059b, 0xb3617be0,
+ 0x7c19b780, 0x0679ec40, 0x7c91c7b0, 0x0681ec50, 0xfc91e7b1, 0xba27b15e, 0xc9207b17, 0x691ec487,
+ 0xf25b6308, 0x79de3176, 0x3a79f4bf, 0xe33820bf, 0xef19c161, 0x7ef19c13, 0x101f19c1, 0x0517f19c,
+ 0xc125fc67, 0x9c141f19, 0x8ce088f1, 0xf19c13ef, 0x3e3382fd, 0x07e33824, 0x65fc6704, 0x457f19c1,
+ 0x155fc670, 0x04d7f19c, 0x70587c67, 0x3382a3c6, 0xe338223e, 0x1f19c131, 0x52719c15, 0x7cfa24f0,
+ 0xd59117d1, 0xfda5d892, 0xe02969e2, 0xb71fbffd, 0xdfebfe5f, 0xe5fede67, 0xbb807a5f, 0x46c64719,
+ 0x5f9b96ec, 0xf1dc61ec, 0xdafda744, 0xcc66c440, 0xae3399ff, 0xc7eceba3, 0x7971cb98, 0xc98d19e0,
+ 0xa87daca7, 0xd2cbabac, 0xd26b577f, 0x750eb775, 0xc7573951, 0x7c233c00, 0x2baca2ca, 0x97515d34,
+ 0x4570622b, 0xf16e1e6c, 0x5b457663, 0x5746d15c, 0x25d75db7, 0xa58f5337, 0xcb78798e, 0xe27adff0,
+ 0x6fb61ccf, 0x187a67cc, 0x5eedfe1f, 0x0ba97bfb, 0x9be57e1e, 0x193e6c1b, 0x31af8db3, 0xc32e5f66,
+ 0x5ec16b58, 0x2ff276d6, 0x70d27f6b, 0xdcd90eb5, 0x5f27d093, 0x1a4bd757, 0x84a72f7c, 0x59fdacbd,
+ 0x46bceb4b, 0x4577d0a7, 0xc788aebd, 0x22ba7115, 0xcbb4577e, 0x093dedd5, 0x8dfd8e7d, 0x3f7afc87,
+ 0x3ffe2f4e, 0x624b5c0a, 0x2d6c496b, 0xb125ad89, 0xd3f624b5, 0xe95ec49e, 0xd638c743, 0x829fa3a9,
+ 0x0fb51d0f, 0x9887fe31, 0xb4bfd863, 0x621f847f, 0xdec7c59a, 0xecc3e20d, 0x7511f146, 0xa9e0f893,
+ 0x156e5c3f, 0xc4db201f, 0x7b8fc5c7, 0xf7e2221b, 0x0000001f
+};
+
+static const UINT g_DXUTArrowMeshSrcDataSizeInBytes = 2193;
+
+//-----------------------------------------------------------------------------
+HRESULT WINAPI DXUTCreateGUITextureFromInternalArray9( LPDIRECT3DDEVICE9 pd3dDevice, IDirect3DTexture9** ppTexture, D3DXIMAGE_INFO* pInfo )
+{
+ return D3DXCreateTextureFromFileInMemoryEx( pd3dDevice, g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes,
+ D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
+ D3DX_DEFAULT, D3DX_DEFAULT, 0, pInfo, NULL, ppTexture );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT WINAPI DXUTCreateGUITextureFromInternalArray11(ID3D11Device* pd3dDevice, ID3D11Texture2D** ppTexture, D3DX11_IMAGE_INFO* pInfo)
+{
+ HRESULT hr;
+
+ D3DX11_IMAGE_INFO SrcInfo;
+ if( !pInfo )
+ {
+ D3DX11GetImageInfoFromMemory( g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes, NULL, &SrcInfo, NULL );
+ pInfo = &SrcInfo;
+ }
+
+ ID3D11Resource *pRes;
+ D3DX11_IMAGE_LOAD_INFO loadInfo;
+ loadInfo.Width = D3DX11_DEFAULT;
+ loadInfo.Height = D3DX11_DEFAULT;
+ loadInfo.Depth = D3DX11_DEFAULT;
+ loadInfo.FirstMipLevel = 0;
+ loadInfo.MipLevels = 1;
+ loadInfo.Usage = D3D11_USAGE_DEFAULT;
+ loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+ loadInfo.CpuAccessFlags = 0;
+ loadInfo.MiscFlags = 0;
+ //loadInfo.Format = MAKE_TYPELESS( pInfo->Format );
+ loadInfo.Format = MAKE_SRGB( pInfo->Format );
+ loadInfo.Filter = D3DX11_FILTER_NONE;
+ loadInfo.MipFilter = D3DX11_FILTER_NONE;
+ loadInfo.pSrcInfo = pInfo;
+
+ hr = D3DX11CreateTextureFromMemory( pd3dDevice, g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes, &loadInfo, NULL, &pRes, NULL );
+ if( FAILED( hr ) )
+ return hr;
+ DXUT_SetDebugName( pRes, "DXUT" );
+ hr = pRes->QueryInterface( __uuidof( ID3D11Texture2D ), (LPVOID*)ppTexture );
+ SAFE_RELEASE( pRes );
+
+ return S_OK;
+}
+
+//-----------------------------------------------------------------------------
+HRESULT WINAPI DXUTCreateArrowMeshFromInternalArray( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh** ppMesh )
+{
+ return D3DXLoadMeshFromXInMemory( g_DXUTArrowMeshSrcData, g_DXUTArrowMeshSrcDataSizeInBytes,
+ D3DXMESH_MANAGED, pd3dDevice, NULL, NULL, NULL, NULL, ppMesh );
+}
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTres.h b/samples/DX_APIUsage/DXUT/Optional/DXUTres.h
new file mode 100644
index 0000000..a3e851f
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTres.h
@@ -0,0 +1,18 @@
+//----------------------------------------------------------------------------
+// File: dxutres.h
+//
+// Functions to create DXUT media from arrays in memory
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#pragma once
+#ifndef DXUT_RES_H
+#define DXUT_RES_H
+
+HRESULT WINAPI DXUTCreateGUITextureFromInternalArray9( LPDIRECT3DDEVICE9 pd3dDevice, IDirect3DTexture9** ppTexture,
+ D3DXIMAGE_INFO* pInfo );
+HRESULT WINAPI DXUTCreateGUITextureFromInternalArray11( ID3D11Device* pd3dDevice, ID3D11Texture2D** ppTexture,
+ D3DX11_IMAGE_INFO* pInfo );
+HRESULT WINAPI DXUTCreateArrowMeshFromInternalArray( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh** ppMesh );
+
+#endif
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.cpp b/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.cpp
new file mode 100644
index 0000000..6cf495b
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.cpp
@@ -0,0 +1,2853 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTSettingsDlg.cpp
+//
+// Dialog for selection of device settings
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#include "DXUT.h"
+#include "DXUTgui.h"
+#include "DXUTsettingsDlg.h"
+#undef min // use __min instead
+#undef max // use __max instead
+
+
+//--------------------------------------------------------------------------------------
+// Internal functions forward declarations
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTAPIVersionToString( DXUTDeviceVersion version );
+WCHAR* DXUTPresentIntervalToString( UINT pi );
+WCHAR* DXUTMultisampleTypeToString( D3DMULTISAMPLE_TYPE MultiSampleType );
+WCHAR* DXUTD3DDeviceTypeToString( D3DDEVTYPE devType );
+WCHAR* DXUTD3DX11DeviceTypeToString( D3D_DRIVER_TYPE devType );
+WCHAR* DXUTVertexProcessingTypeToString( DWORD vpt );
+
+
+HRESULT DXUTSnapDeviceSettingsToEnumDevice( DXUTDeviceSettings* pDeviceSettings, bool forceEnum, D3D_FEATURE_LEVEL forceFL = D3D_FEATURE_LEVEL(0) );
+
+//--------------------------------------------------------------------------------------
+// Global state
+//--------------------------------------------------------------------------------------
+DXUTDeviceSettings g_DeviceSettings;
+
+CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog()
+{
+ // Using an accessor function gives control of the construction order
+ static CD3DSettingsDlg dlg;
+ return &dlg;
+}
+
+
+//--------------------------------------------------------------------------------------
+CD3DSettingsDlg::CD3DSettingsDlg()
+{
+ m_pStateBlock = NULL;
+ m_bActive = false;
+ m_pActiveDialog = NULL;
+
+ m_Levels[0] = D3D_FEATURE_LEVEL_9_1;
+ m_Levels[1] = D3D_FEATURE_LEVEL_9_2;
+ m_Levels[2] = D3D_FEATURE_LEVEL_9_3;
+ m_Levels[3] = D3D_FEATURE_LEVEL_10_0;
+ m_Levels[4] = D3D_FEATURE_LEVEL_10_1;
+ m_Levels[5] = D3D_FEATURE_LEVEL_11_0;
+
+}
+
+
+//--------------------------------------------------------------------------------------
+CD3DSettingsDlg::~CD3DSettingsDlg()
+{
+ // Release the memory used to hold the D3D11 refresh data in the combo box
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE );
+ if( pComboBox )
+ for( UINT i = 0; i < pComboBox->GetNumItems(); ++i )
+ {
+ DXGI_RATIONAL* pRate = reinterpret_cast<DXGI_RATIONAL*>( pComboBox->GetItemData( i ) );
+ delete pRate;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager )
+{
+ assert( pManager );
+ m_Dialog.Init( pManager, false ); // Don't register this dialog.
+ m_RevertModeDialog.Init( pManager, false ); // Don't register this dialog.
+ m_pActiveDialog = &m_Dialog;
+ CreateControls();
+}
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName )
+{
+ assert( pManager );
+ m_Dialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog.
+ m_RevertModeDialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog.
+ m_pActiveDialog = &m_Dialog;
+ CreateControls();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR pszControlTextureResourcename,
+ HMODULE hModule )
+{
+ assert( pManager );
+ m_Dialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog.
+ m_RevertModeDialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog
+ m_pActiveDialog = &m_Dialog;
+ CreateControls();
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::CreateControls()
+{
+ // Set up main settings dialog
+ m_Dialog.EnableKeyboardInput( true );
+ m_Dialog.SetFont( 0, L"Arial", 15, FW_NORMAL );
+ m_Dialog.SetFont( 1, L"Arial", 28, FW_BOLD );
+
+ // Right-justify static controls
+ CDXUTElement* pElement = m_Dialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 );
+ if( pElement )
+ {
+ pElement->dwTextFormat = DT_VCENTER | DT_RIGHT;
+
+ // Title
+ CDXUTStatic* pStatic = NULL;
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Direct3D Settings", 10, 5, 400, 50, false, &pStatic );
+ pElement = pStatic->GetElement( 0 );
+ pElement->iFont = 1;
+ pElement->dwTextFormat = DT_TOP | DT_LEFT;
+ }
+
+ // DXUTSETTINGSDLG_API_VERSION
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"API Version", 10, 35, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_API_VERSION, 200, 35, 300, 23 );
+
+
+ //DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL, L"Feature Level", 10, 60, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL, 200, 60, 300, 23 );
+ m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetDropHeight( 106 );
+
+
+ // DXUTSETTINGSDLG_ADAPTER
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Display Adapter", 10, 85, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER, 200, 85, 300, 23 );
+
+ // DXUTSETTINGSDLG_DEVICE_TYPE
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Render Device", 10, 110, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEVICE_TYPE, 200, 110, 300, 23 );
+
+ // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN
+ m_Dialog.AddCheckBox( DXUTSETTINGSDLG_DEVICECLIP, L"Clip to device when window spans across multiple monitors",
+ 250, 136, 500, 16 );
+ m_Dialog.AddRadioButton( DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Windowed",
+ 360, 157, 100, 16 );
+ m_Dialog.AddRadioButton( DXUTSETTINGSDLG_FULLSCREEN, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Full Screen",
+ 220, 157, 100, 16 );
+
+ // DXUTSETTINGSDLG_ADAPTER_FORMAT
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, L"Adapter Format", 10, 175, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT, 200, 175, 300, 23 );
+
+ // DXUTSETTINGSDLG_RESOLUTION
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_RESOLUTION, 200, 200, 200, 23 );
+ m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION )->SetDropHeight( 106 );
+
+ // DXUTSETTINGSDLG_RES_SHOW_ALL
+ m_Dialog.AddCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, L"Show All Aspect Ratios", 420, 200, 200, 23, false );
+
+ // DXUTSETTINGSDLG_REFRESH_RATE
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_REFRESH_RATE, 200, 225, 300, 23 );
+
+ // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT, 200, 260, 300, 23 );
+
+ // DXUTSETTINGSDLG_DEPTH_STENCIL
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL, L"Depth/Stencil Format", 10, 285, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL, 200, 285, 300, 23 );
+
+ // DXUTSETTINGSDLG_MULTISAMPLE_TYPE
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL, L"Multisample Type", 10, 310, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE, 200, 310, 300, 23 );
+
+ // DXUTSETTINGSDLG_MULTISAMPLE_QUALITY
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 335, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY, 200, 335, 300, 23 );
+
+ // DXUTSETTINGSDLG_VERTEX_PROCESSING
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL, L"Vertex Processing", 10, 360, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING, 200, 360, 300, 23 );
+
+ // DXUTSETTINGSDLG_PRESENT_INTERVAL
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 385, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL, 200, 385, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL, L"Adapter Output", 10, 175, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, 200, 175, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_RESOLUTION
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION, 200, 200, 200, 23 );
+ m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetDropHeight( 106 );
+
+ // DXUTSETTINGSDLG_D3D11_REFRESH_RATE
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE, 200, 225, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT, 200, 260, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL, L"Multisample Count", 10, 285, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT, 200, 285, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 310, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY, 200, 310, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL
+ m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 335, 180, 23 );
+ m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL, 200, 335, 300, 23 );
+
+ // DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE
+ m_Dialog.AddCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE, L"Create Debug Device", 200, 365, 180, 23 );
+
+ // DXUTSETTINGSDLG_OK, DXUTSETTINGSDLG_CANCEL
+ m_Dialog.AddButton( DXUTSETTINGSDLG_OK, L"OK", 230, 440, 73, 31 );
+ m_Dialog.AddButton( DXUTSETTINGSDLG_CANCEL, L"Cancel", 315, 440, 73, 31, 0, true );
+
+ // Set up mode change dialog
+ m_RevertModeDialog.EnableKeyboardInput( true );
+ m_RevertModeDialog.EnableNonUserEvents( true );
+ m_RevertModeDialog.SetFont( 0, L"Arial", 15, FW_NORMAL );
+ m_RevertModeDialog.SetFont( 1, L"Arial", 28, FW_BOLD );
+
+ pElement = m_RevertModeDialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 );
+ if( pElement )
+ {
+ pElement->dwTextFormat = DT_VCENTER | DT_RIGHT;
+
+ // Title
+ CDXUTStatic* pStatic = NULL;
+ m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Do you want to keep these display settings?", 10, 5,
+ 640, 50, false, &pStatic );
+ pElement = pStatic->GetElement( 0 );
+ pElement->iFont = 1;
+ pElement->dwTextFormat = DT_TOP | DT_LEFT;
+
+ // Timeout static text control
+ m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT, L"", 10, 90, 640, 30,
+ false, &pStatic );
+ pElement = pStatic->GetElement( 0 );
+ pElement->iFont = 0;
+ pElement->dwTextFormat = DT_TOP | DT_LEFT;
+ }
+
+ // DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, DXUTSETTINGSDLG_MODE_CHANGE_REVERT
+ m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, L"Yes", 230, 50, 73, 31 );
+ m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_REVERT, L"No", 315, 50, 73, 31, 0, true );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice )
+{
+ if( pd3dDevice == NULL )
+ return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG );
+
+ // Create the fonts/textures
+ m_Dialog.SetCallback( StaticOnEvent, ( void* )this );
+ m_RevertModeDialog.SetCallback( StaticOnEvent, ( void* )this );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Changes the UI defaults to the current device settings
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::Refresh()
+{
+ HRESULT hr = S_OK;
+
+ g_DeviceSettings = DXUTGetDeviceSettings();
+
+ CDXUTComboBox* pAPIComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION );
+ pAPIComboBox->RemoveAllItems();
+ if( DXUTDoesAppSupportD3D9() )
+ {
+ // Ensure that at least one adapter got enumerated.
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+ if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 )
+ AddAPIVersion( DXUT_D3D9_DEVICE );
+ }
+ if( DXUTDoesAppSupportD3D11() && DXUTIsD3D11Available() )
+ {
+ // Ensure that at least one adapter got enumerated.
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 )
+ AddAPIVersion( DXUT_D3D11_DEVICE );
+ }
+
+ // If no API has been added, something has gone wrong. Exit the dialog.
+ if( pAPIComboBox->GetNumItems() == 0 )
+ {
+ SetActive( false );
+ return S_OK;
+ }
+
+ pAPIComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.ver ) );
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ // Show all D3D9-specific controls and hide controls for all other D3D versions.
+ ShowControlSet( DXUT_D3D9_DEVICE );
+
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+
+ // Fill the UI with the current settings
+ AddDeviceType( g_DeviceSettings.d3d9.DeviceType );
+ SetWindowed( FALSE != g_DeviceSettings.d3d9.pp.Windowed );
+ SetDeviceClip( 0 != ( g_DeviceSettings.d3d9.pp.Flags & D3DPRESENTFLAG_DEVICECLIP ) );
+ AddAdapterFormat( g_DeviceSettings.d3d9.AdapterFormat );
+ AddResolution( g_DeviceSettings.d3d9.pp.BackBufferWidth, g_DeviceSettings.d3d9.pp.BackBufferHeight );
+ AddRefreshRate( g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz );
+ AddBackBufferFormat( g_DeviceSettings.d3d9.pp.BackBufferFormat );
+ AddDepthStencilBufferFormat( g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat );
+ AddMultisampleType( g_DeviceSettings.d3d9.pp.MultiSampleType );
+ AddMultisampleQuality( g_DeviceSettings.d3d9.pp.MultiSampleQuality );
+
+ if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_PUREDEVICE )
+ AddVertexProcessingType( D3DCREATE_PUREDEVICE );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
+ AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING )
+ AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING )
+ AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING );
+
+ CD3D9EnumDeviceSettingsCombo* pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo(
+ g_DeviceSettings.d3d9.AdapterOrdinal, g_DeviceSettings.d3d9.DeviceType,
+ g_DeviceSettings.d3d9.AdapterFormat, g_DeviceSettings.d3d9.pp.BackBufferFormat,
+ ( g_DeviceSettings.d3d9.pp.Windowed != 0 ) );
+ if( NULL == pBestDeviceSettingsCombo )
+ return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG );
+
+ // Get the adapters list from CD3D9Enumeration object
+ CGrowableArray <CD3D9EnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
+
+ if( pAdapterInfoList->GetSize() == 0 )
+ return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES );
+
+ CDXUTComboBox* pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+ pAdapterCombo->RemoveAllItems();
+
+ // Add adapters
+ for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); iAdapter++ )
+ {
+ CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter );
+ AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
+ }
+
+ pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.AdapterOrdinal ) );
+
+ hr = OnAPIVersionChanged( true );
+ if( FAILED( hr ) )
+ return hr;
+
+ //m_Dialog.Refresh();
+ CDXUTDialog::SetRefreshTime( ( float )DXUTGetTime() );
+ break;
+ }
+ case DXUT_D3D11_DEVICE:
+ {
+ // Show all D3D11-specific controls and hide controls for all other D3D versions.
+ ShowControlSet( DXUT_D3D11_DEVICE );
+
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+
+ // Fill the UI with the current settings
+ AddD3D11DeviceType( g_DeviceSettings.d3d11.DriverType );
+ SetWindowed( FALSE != g_DeviceSettings.d3d11.sd.Windowed );
+ CD3D11EnumOutputInfo* pOutputInfo = GetCurrentD3D11OutputInfo();
+ AddD3D11AdapterOutput( pOutputInfo->Desc.DeviceName, g_DeviceSettings.d3d11.Output );
+
+
+
+ AddD3D11Resolution( g_DeviceSettings.d3d11.sd.BufferDesc.Width,
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height );
+ AddD3D11RefreshRate( g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate );
+ AddD3D11BackBufferFormat( g_DeviceSettings.d3d11.sd.BufferDesc.Format );
+ AddD3D11MultisampleCount( g_DeviceSettings.d3d11.sd.SampleDesc.Count );
+ AddD3D11MultisampleQuality( g_DeviceSettings.d3d11.sd.SampleDesc.Quality );
+
+ CD3D11EnumDeviceSettingsCombo* pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo(
+ g_DeviceSettings.d3d11.AdapterOrdinal, g_DeviceSettings.d3d11.DriverType,
+ g_DeviceSettings.d3d11.Output, g_DeviceSettings.d3d11.sd.BufferDesc.Format,
+ ( g_DeviceSettings.d3d11.sd.Windowed != 0 ) );
+
+ if( NULL == pBestDeviceSettingsCombo )
+ return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG );
+
+ CDXUTComboBox *pFeatureLevelBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL );
+ pFeatureLevelBox->RemoveAllItems();
+ for (int fli = 0; fli < TOTAL_FEATURE_LEVLES; fli++) {
+ if (m_Levels[fli] >= g_DeviceSettings.MinimumFeatureLevel
+ && m_Levels[fli] <=pBestDeviceSettingsCombo->pDeviceInfo->MaxLevel) {
+ AddD3D11FeatureLevel( m_Levels[fli] );
+ }
+ }
+ pFeatureLevelBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DeviceFeatureLevel ) );
+
+
+ // Get the adapters list from CD3D11Enumeration object
+ CGrowableArray <CD3D11EnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
+
+ if( pAdapterInfoList->GetSize() == 0 )
+ return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES );
+
+ CDXUTComboBox* pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+ pAdapterCombo->RemoveAllItems();
+
+ // Add adapters
+ for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); iAdapter++ )
+ {
+ CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter );
+ AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
+ }
+
+ pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) );
+
+ hr = OnAPIVersionChanged( true );
+ if( FAILED( hr ) )
+ return hr;
+
+ //m_Dialog.Refresh();
+ CDXUTDialog::SetRefreshTime( ( float )DXUTGetTime() );
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnD3D9ResetDevice()
+{
+ const D3DSURFACE_DESC* pDesc = DXUTGetD3D9BackBufferSurfaceDesc();
+ m_Dialog.SetLocation( 0, 0 );
+ m_Dialog.SetSize( pDesc->Width, pDesc->Height );
+ m_Dialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 10, 73, 179 ) );
+
+ m_RevertModeDialog.SetLocation( 0, 0 );
+ m_RevertModeDialog.SetSize( pDesc->Width, pDesc->Height );
+ m_RevertModeDialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 10, 73, 179 ) );
+
+ IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device();
+ pd3dDevice->BeginStateBlock();
+ pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
+ pd3dDevice->EndStateBlock( &m_pStateBlock );
+
+ return S_OK;
+}
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::SetSelectedD3D11RefreshRate( DXGI_RATIONAL RefreshRate )
+{
+ CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE );
+
+ for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i )
+ {
+ DXGI_RATIONAL* pRate = ( DXGI_RATIONAL* )pRefreshRateComboBox->GetItemData( i );
+
+ if( pRate && pRate->Numerator == RefreshRate.Numerator && pRate->Denominator == RefreshRate.Denominator )
+ {
+ pRefreshRateComboBox->SetSelectedByIndex( i );
+ return;
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnRender( float fElapsedTime )
+{
+ if( DXUTGetD3D11Device() )
+ OnRender11( fElapsedTime );
+ else
+ OnRender9( fElapsedTime );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnRender9( float fElapsedTime )
+{
+ IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device();
+
+ // Clear the render target and the zbuffer
+ pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00003F3F, 1.0f, 0 );
+
+ // Render the scene
+ if( SUCCEEDED( pd3dDevice->BeginScene() ) )
+ {
+ m_pStateBlock->Capture();
+ pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
+ m_pActiveDialog->OnRender( fElapsedTime );
+ m_pStateBlock->Apply();
+ pd3dDevice->EndScene();
+ }
+}
+
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnRender11( float fElapsedTime )
+{
+ // Render the scene
+ m_pActiveDialog->OnRender( fElapsedTime );
+}
+
+
+//--------------------------------------------------------------------------------------
+LRESULT CD3DSettingsDlg::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ m_pActiveDialog->MsgProc( hWnd, uMsg, wParam, lParam );
+ if( uMsg == WM_KEYDOWN && wParam == VK_F2 )
+ SetActive( false );
+ return 0;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnD3D9LostDevice()
+{
+ SAFE_RELEASE( m_pStateBlock );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnD3D9DestroyDevice()
+{
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnD3D11CreateDevice( ID3D11Device* pd3dDevice )
+{
+ //HRESULT hr;
+
+ if( pd3dDevice == NULL )
+ return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG );
+
+ // Create the fonts/textures
+ m_Dialog.SetCallback( StaticOnEvent, ( void* )this );
+ m_RevertModeDialog.SetCallback( StaticOnEvent, ( void* )this );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice,
+ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc )
+{
+ m_Dialog.SetLocation( 0, 0 );
+ m_Dialog.SetSize( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
+ m_Dialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 10, 73, 179 ) );
+
+ m_RevertModeDialog.SetLocation( 0, 0 );
+ m_RevertModeDialog.SetSize( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
+ m_RevertModeDialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 54, 105, 192 ),
+ D3DCOLOR_ARGB( 255, 10, 73, 179 ) );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnD3D11DestroyDevice()
+{
+
+
+}
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::ShowControlSet( DXUTDeviceVersion ver )
+{
+ switch( ver )
+ {
+ case DXUT_D3D9_DEVICE:
+
+ m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEVICECLIP )->SetVisible( true );
+
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE )->SetVisible( false );
+
+ break;
+
+ case DXUT_D3D11_DEVICE:
+ m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL )->SetVisible( false );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_DEVICECLIP )->SetVisible( false );
+
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL )->SetVisible( true );
+ m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE )->SetVisible( true );
+ break;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void WINAPI CD3DSettingsDlg::StaticOnEvent( UINT nEvent, int nControlID,
+ CDXUTControl* pControl, void* pUserData )
+{
+ CD3DSettingsDlg* pD3DSettings = ( CD3DSettingsDlg* )pUserData;
+ if( pD3DSettings )
+ pD3DSettings->OnEvent( nEvent, nControlID, pControl );
+}
+
+//--------------------------------------------------------------------------------------
+// Name: CD3DSettingsDlg::StaticOnModeChangeTimer()
+// Desc: Timer callback registered by a call to DXUTSetTimer. It is called each second
+// until mode change timeout limit.
+//--------------------------------------------------------------------------------------
+void WINAPI CD3DSettingsDlg::StaticOnModeChangeTimer( UINT nIDEvent, void* pUserContext )
+{
+ CD3DSettingsDlg* pD3DSettings = ( CD3DSettingsDlg* )pUserContext;
+ assert( pD3DSettings );
+ assert( pD3DSettings->m_pActiveDialog == &pD3DSettings->m_RevertModeDialog );
+ assert( pD3DSettings->m_nIDEvent == nIDEvent );
+
+ if( 0 == --pD3DSettings->m_nRevertModeTimeout )
+ {
+ CDXUTControl* pControl = pD3DSettings->m_RevertModeDialog.GetControl( DXUTSETTINGSDLG_MODE_CHANGE_REVERT );
+ assert( pControl );
+ pD3DSettings->m_RevertModeDialog.SendEvent( EVENT_BUTTON_CLICKED, false, pControl );
+ }
+ pD3DSettings->UpdateModeChangeTimeoutText( pD3DSettings->m_nRevertModeTimeout );
+}
+
+//--------------------------------------------------------------------------------------
+void CD3DSettingsDlg::OnEvent( UINT nEvent, int nControlID,
+ CDXUTControl* pControl )
+{
+ switch( nControlID )
+ {
+ case DXUTSETTINGSDLG_ADAPTER:
+ OnAdapterChanged(); break;
+ case DXUTSETTINGSDLG_DEVICE_TYPE:
+ OnDeviceTypeChanged(); break;
+ case DXUTSETTINGSDLG_WINDOWED:
+ OnWindowedFullScreenChanged(); break;
+ case DXUTSETTINGSDLG_FULLSCREEN:
+ OnWindowedFullScreenChanged(); break;
+ case DXUTSETTINGSDLG_ADAPTER_FORMAT:
+ OnAdapterFormatChanged(); break;
+ case DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL:
+ {
+ if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE )
+ {
+ OnAdapterFormatChanged();
+ }
+ else
+ {
+ OnBackBufferFormatChanged();
+ }
+ break;
+ }
+ case DXUTSETTINGSDLG_D3D11_RESOLUTION:
+ OnD3D11ResolutionChanged(); break;
+ case DXUTSETTINGSDLG_RESOLUTION:
+ OnResolutionChanged(); break;
+ case DXUTSETTINGSDLG_REFRESH_RATE:
+ OnRefreshRateChanged(); break;
+ case DXUTSETTINGSDLG_BACK_BUFFER_FORMAT:
+ OnBackBufferFormatChanged(); break;
+ case DXUTSETTINGSDLG_DEPTH_STENCIL:
+ OnDepthStencilBufferFormatChanged(); break;
+ case DXUTSETTINGSDLG_MULTISAMPLE_TYPE:
+ OnMultisampleTypeChanged(); break;
+ case DXUTSETTINGSDLG_MULTISAMPLE_QUALITY:
+ OnMultisampleQualityChanged(); break;
+ case DXUTSETTINGSDLG_VERTEX_PROCESSING:
+ OnVertexProcessingChanged(); break;
+ case DXUTSETTINGSDLG_PRESENT_INTERVAL:
+ OnPresentIntervalChanged(); break;
+ case DXUTSETTINGSDLG_DEVICECLIP:
+ OnDeviceClipChanged(); break;
+ case DXUTSETTINGSDLG_API_VERSION:
+ OnAPIVersionChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL:
+ OnFeatureLevelChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT:
+ OnAdapterOutputChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_REFRESH_RATE:
+ OnRefreshRateChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT:
+ OnBackBufferFormatChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT:
+ OnMultisampleTypeChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY:
+ OnMultisampleQualityChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL:
+ OnPresentIntervalChanged(); break;
+ case DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE:
+ OnDebugDeviceChanged(); break;
+
+ case DXUTSETTINGSDLG_OK:
+ {
+ bool bFullScreenModeChange = false;
+ DXUTDeviceSettings currentSettings = DXUTGetDeviceSettings();
+ g_DeviceSettings.MinimumFeatureLevel = currentSettings.MinimumFeatureLevel;
+ if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE )
+ {
+ if( g_DeviceSettings.d3d9.pp.Windowed )
+ {
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = 0;
+
+ RECT rcClient;
+ if( DXUTIsWindowed() )
+ GetClientRect( DXUTGetHWND(), &rcClient );
+ else
+ rcClient = DXUTGetWindowClientRectAtModeChange();
+ DWORD dwWindowWidth = rcClient.right - rcClient.left;
+ DWORD dwWindowHeight = rcClient.bottom - rcClient.top;
+
+ g_DeviceSettings.d3d9.pp.BackBufferWidth = dwWindowWidth;
+ g_DeviceSettings.d3d9.pp.BackBufferHeight = dwWindowHeight;
+ }
+ else
+ {
+ // Check for fullscreen mode change
+ bFullScreenModeChange = g_DeviceSettings.d3d9.pp.BackBufferWidth !=
+ currentSettings.d3d9.pp.BackBufferWidth ||
+ g_DeviceSettings.d3d9.pp.BackBufferHeight != currentSettings.d3d9.pp.BackBufferHeight ||
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz !=
+ currentSettings.d3d9.pp.FullScreen_RefreshRateInHz;
+ }
+
+ if( g_DeviceSettings.d3d9.pp.MultiSampleType != D3DMULTISAMPLE_NONE )
+ {
+ g_DeviceSettings.d3d9.pp.Flags &= ~D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
+ }
+ }
+ else // D3D11
+ {
+ if( g_DeviceSettings.d3d11.sd.Windowed )
+ {
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator =
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator = 0;
+
+ RECT rcClient;
+ if( DXUTIsWindowed() )
+ GetClientRect( DXUTGetHWND(), &rcClient );
+ else
+ rcClient = DXUTGetWindowClientRectAtModeChange();
+ DWORD dwWindowWidth = rcClient.right - rcClient.left;
+ DWORD dwWindowHeight = rcClient.bottom - rcClient.top;
+
+ g_DeviceSettings.d3d11.sd.BufferDesc.Width = dwWindowWidth;
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height = dwWindowHeight;
+ }
+ else
+ {
+ // Check for fullscreen mode change
+ bFullScreenModeChange = g_DeviceSettings.d3d11.sd.BufferDesc.Width !=
+ currentSettings.d3d11.sd.BufferDesc.Width ||
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height != currentSettings.d3d11.sd.BufferDesc.Height ||
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator !=
+ currentSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator ||
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator !=
+ currentSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator;
+ }
+ }
+
+ if( bFullScreenModeChange )
+ {
+ // set appropriate global device settings to that of the current device
+ // settings. These will get set to the user-defined settings once the
+ // user accepts the mode change
+ DXUTDeviceSettings tSettings = g_DeviceSettings;
+ if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE )
+ {
+ g_DeviceSettings.d3d9.pp.BackBufferWidth =
+ currentSettings.d3d9.pp.BackBufferWidth;
+ g_DeviceSettings.d3d9.pp.BackBufferHeight =
+ currentSettings.d3d9.pp.BackBufferHeight;
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz =
+ currentSettings.d3d9.pp.FullScreen_RefreshRateInHz;
+ g_DeviceSettings.d3d9.pp.Windowed =
+ currentSettings.d3d9.pp.Windowed;
+ }
+ else
+ {
+
+ g_DeviceSettings.d3d11.sd.BufferDesc.Width =
+ currentSettings.d3d11.sd.BufferDesc.Width;
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height =
+ currentSettings.d3d11.sd.BufferDesc.Height;
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator =
+ currentSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator;
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator =
+ currentSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator;
+ g_DeviceSettings.d3d11.sd.Windowed = currentSettings.d3d11.sd.Windowed;
+
+ }
+
+ // apply the user-defined settings
+ DXUTCreateDeviceFromSettings( &tSettings );
+ // create the mode change timeout dialog
+ m_pActiveDialog = &m_RevertModeDialog;
+ m_nRevertModeTimeout = 15;
+ UpdateModeChangeTimeoutText( m_nRevertModeTimeout );
+ // activate a timer for 1-second updates
+ DXUTSetTimer( StaticOnModeChangeTimer, 1.0f, &m_nIDEvent, ( void* )this );
+ }
+ else
+ {
+ DXUTCreateDeviceFromSettings( &g_DeviceSettings );
+ SetActive( false );
+ }
+ break;
+ }
+
+ case DXUTSETTINGSDLG_CANCEL:
+ {
+ SetActive( false );
+ break;
+ }
+
+ case DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT:
+ {
+ DXUTKillTimer( m_nIDEvent );
+ g_DeviceSettings = DXUTGetDeviceSettings();
+ m_pActiveDialog = &m_Dialog;
+ SetActive( false );
+ break;
+ }
+
+ case DXUTSETTINGSDLG_MODE_CHANGE_REVERT:
+ {
+ DXUTKillTimer( m_nIDEvent );
+ m_pActiveDialog = &m_Dialog;
+ m_nIDEvent = 0;
+ m_nRevertModeTimeout = 0;
+ DXUTCreateDeviceFromSettings( &g_DeviceSettings );
+ Refresh();
+ break;
+ }
+ }
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::SetDeviceSettingsFromUI()
+{
+ CDXUTComboBox* pComboBox;
+ CDXUTRadioButton* pRadioButton;
+
+ // DXUTSETTINGSDLG_DEVICE_TYPE
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+ g_DeviceSettings.d3d9.DeviceType = ( D3DDEVTYPE )PtrToUlong( pComboBox->GetSelectedData() );
+
+ // DXUTSETTINGSDLG_WINDOWED
+ pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED );
+ g_DeviceSettings.d3d9.pp.Windowed = pRadioButton->GetChecked();
+
+ // DXUTSETTINGSDLG_ADAPTER_FORMAT
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT );
+ g_DeviceSettings.d3d9.AdapterFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+
+ if( g_DeviceSettings.d3d9.pp.Windowed )
+ {
+ g_DeviceSettings.d3d9.pp.BackBufferFormat = D3DFMT_UNKNOWN;
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = 0;
+ }
+ else
+ {
+ // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT );
+ g_DeviceSettings.d3d9.pp.BackBufferFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+
+ // DXUTSETTINGSDLG_RESOLUTION
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION );
+ DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() );
+ g_DeviceSettings.d3d9.pp.BackBufferWidth = HIWORD( dwResolution );
+ g_DeviceSettings.d3d9.pp.BackBufferHeight = LOWORD( dwResolution );
+
+ // DXUTSETTINGSDLG_REFRESH_RATE
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = PtrToUlong( pComboBox->GetSelectedData() );
+ }
+
+ // DXUTSETTINGSDLG_DEPTH_STENCIL
+ pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL );
+ g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+CD3D9EnumAdapterInfo* CD3DSettingsDlg::GetCurrentAdapterInfo()
+{
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+ return pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d9.AdapterOrdinal );
+}
+
+
+//-------------------------------------------------------------------------------------
+CD3D9EnumDeviceInfo* CD3DSettingsDlg::GetCurrentDeviceInfo()
+{
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+ return pD3DEnum->GetDeviceInfo( g_DeviceSettings.d3d9.AdapterOrdinal,
+ g_DeviceSettings.d3d9.DeviceType );
+}
+
+//-------------------------------------------------------------------------------------
+CD3D11EnumAdapterInfo* CD3DSettingsDlg::GetCurrentD3D11AdapterInfo()
+{
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ return pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal );
+}
+
+
+//-------------------------------------------------------------------------------------
+CD3D11EnumDeviceInfo* CD3DSettingsDlg::GetCurrentD3D11DeviceInfo()
+{
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ return pD3DEnum->GetDeviceInfo( g_DeviceSettings.d3d11.AdapterOrdinal,
+ g_DeviceSettings.d3d11.DriverType );
+}
+
+
+//-------------------------------------------------------------------------------------
+CD3D11EnumOutputInfo* CD3DSettingsDlg::GetCurrentD3D11OutputInfo()
+{
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ return pD3DEnum->GetOutputInfo( g_DeviceSettings.d3d11.AdapterOrdinal,
+ g_DeviceSettings.d3d11.Output );
+}
+
+
+//-------------------------------------------------------------------------------------
+CD3D9EnumDeviceSettingsCombo* CD3DSettingsDlg::GetCurrentDeviceSettingsCombo()
+{
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+ return pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.d3d9.AdapterOrdinal,
+ g_DeviceSettings.d3d9.DeviceType,
+ g_DeviceSettings.d3d9.AdapterFormat,
+ g_DeviceSettings.d3d9.pp.BackBufferFormat,
+ ( g_DeviceSettings.d3d9.pp.Windowed == TRUE ) );
+}
+
+//-------------------------------------------------------------------------------------
+CD3D11EnumDeviceSettingsCombo* CD3DSettingsDlg::GetCurrentD3D11DeviceSettingsCombo()
+{
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ return pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.d3d11.AdapterOrdinal,
+ g_DeviceSettings.d3d11.DriverType,
+ g_DeviceSettings.d3d11.Output,
+ g_DeviceSettings.d3d11.sd.BufferDesc.Format,
+ ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) );
+}
+
+HRESULT CD3DSettingsDlg::OnD3D11ResolutionChanged () {
+ DWORD dwWidth, dwHeight;
+ GetSelectedD3D11Resolution( &dwWidth, &dwHeight );
+ g_DeviceSettings.d3d11.sd.BufferDesc.Width= dwWidth;
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height = dwHeight;
+
+ return S_OK;
+}
+
+HRESULT CD3DSettingsDlg::OnFeatureLevelChanged () {
+ HRESULT hr = E_FAIL;
+ if (g_DeviceSettings.ver == DXUT_D3D11_DEVICE) {
+ if (g_DeviceSettings.d3d11.DeviceFeatureLevel == GetSelectedFeatureLevel()) return S_OK;
+ //if( !bRefresh )
+ //{
+ // Obtain a set of valid D3D10 device settings.
+ UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags;
+ ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) );
+
+ DXUTApplyDefaultDeviceSettings(&g_DeviceSettings);
+ g_DeviceSettings.d3d11.CreateFlags = CreateFlags;
+ g_DeviceSettings.ver = DXUT_D3D11_DEVICE;
+ //g_DeviceSettings.d3d11.fl = GetSelectedFeatureLevel();
+ hr = DXUTSnapDeviceSettingsToEnumDevice(&g_DeviceSettings, true, GetSelectedFeatureLevel());
+
+ //}
+
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ CGrowableArray <CD3D11EnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
+
+ CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+ pAdapterComboBox->RemoveAllItems();
+
+ for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter )
+ {
+ CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter );
+ AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
+ }
+
+ pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) );
+
+ CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE );
+ pCheckBox->SetChecked( 0 != ( g_DeviceSettings.d3d11.CreateFlags & D3D11_CREATE_DEVICE_DEBUG ) );
+
+ hr = OnAdapterChanged();
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ return hr;
+}
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnAPIVersionChanged( bool bRefresh )
+{
+ HRESULT hr;
+
+ // Store the API version
+ g_DeviceSettings.ver = GetSelectedAPIVersion();
+
+ // Show/hide appropriate dialog controls based on version.
+ ShowControlSet( g_DeviceSettings.ver );
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ if( !bRefresh )
+ {
+ // Obtain a set of valid D3D9 device settings.
+ UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags;
+ ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) );
+ // We want a specific API version, so set up match option to preserve it.
+ DXUTApplyDefaultDeviceSettings(&g_DeviceSettings);
+ g_DeviceSettings.d3d11.CreateFlags = CreateFlags;
+ g_DeviceSettings.ver = DXUT_D3D9_DEVICE;
+ DXUTSnapDeviceSettingsToEnumDevice ( &g_DeviceSettings, true);
+ }
+
+ CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration();
+ CGrowableArray <CD3D9EnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
+
+ CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+ pAdapterComboBox->RemoveAllItems();
+
+ for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter )
+ {
+ CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter );
+ AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
+ }
+
+ pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.AdapterOrdinal ) );
+
+ hr = OnAdapterChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+
+ case DXUT_D3D11_DEVICE:
+ {
+ if( !bRefresh )
+ {
+ // Obtain a set of valid D3D10 device settings.
+ UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags;
+ ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) );
+ // We want a specific API version, so set up match option to preserve it.
+ DXUTApplyDefaultDeviceSettings(&g_DeviceSettings);
+ g_DeviceSettings.d3d11.CreateFlags = CreateFlags;
+ g_DeviceSettings.ver = DXUT_D3D11_DEVICE;
+ DXUTSnapDeviceSettingsToEnumDevice(&g_DeviceSettings, true);
+
+ }
+
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+ CGrowableArray <CD3D11EnumAdapterInfo*>* pAdapterInfoList = pD3DEnum->GetAdapterInfoList();
+
+ CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+ pAdapterComboBox->RemoveAllItems();
+
+ for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter )
+ {
+ CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter );
+ AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal );
+ }
+
+ pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) );
+
+ CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE );
+ pCheckBox->SetChecked( 0 != ( g_DeviceSettings.d3d11.CreateFlags & D3D11_CREATE_DEVICE_DEBUG ) );
+
+ hr = OnAdapterChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnAdapterChanged()
+{
+ HRESULT hr = S_OK;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ // Store the adapter index
+ g_DeviceSettings.d3d9.AdapterOrdinal = GetSelectedAdapter();
+
+ // DXUTSETTINGSDLG_DEVICE_TYPE
+ CDXUTComboBox* pDeviceTypeComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+ pDeviceTypeComboBox->RemoveAllItems();
+
+ CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ )
+ {
+ CD3D9EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo );
+ AddDeviceType( pDeviceInfo->DeviceType );
+ }
+
+ pDeviceTypeComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.DeviceType ) );
+
+ hr = OnDeviceTypeChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+
+ case DXUT_D3D11_DEVICE:
+ {
+ // Store the adapter index
+ g_DeviceSettings.d3d11.AdapterOrdinal = GetSelectedAdapter();
+
+ // DXUTSETTINGSDLG_DEVICE_TYPE
+ CDXUTComboBox* pDeviceTypeComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+ pDeviceTypeComboBox->RemoveAllItems();
+
+ CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ )
+ {
+ CD3D11EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo );
+ AddD3D11DeviceType( pDeviceInfo->DeviceType );
+ }
+
+ pDeviceTypeComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DriverType ) );
+
+ hr = OnDeviceTypeChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnDeviceTypeChanged()
+{
+ HRESULT hr = S_OK;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ g_DeviceSettings.d3d9.DeviceType = GetSelectedDeviceType();
+
+ // Update windowed/full screen radio buttons
+ bool bHasWindowedDeviceCombo = false;
+ bool bHasFullScreenDeviceCombo = false;
+
+ CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
+ if( pDeviceInfo == NULL )
+ return E_FAIL;
+
+ for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ )
+ {
+ CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc );
+
+ if( pDeviceSettingsCombo->Windowed )
+ bHasWindowedDeviceCombo = true;
+ else
+ bHasFullScreenDeviceCombo = true;
+ }
+
+ // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, bHasWindowedDeviceCombo );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_FULLSCREEN, bHasFullScreenDeviceCombo );
+
+ SetWindowed( g_DeviceSettings.d3d9.pp.Windowed && bHasWindowedDeviceCombo );
+
+ hr = OnWindowedFullScreenChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ case DXUT_D3D11_DEVICE:
+ {
+ g_DeviceSettings.d3d11.DriverType = GetSelectedD3D11DeviceType();
+
+ // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, true );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_FULLSCREEN, true );
+
+ SetWindowed( g_DeviceSettings.d3d11.sd.Windowed != 0 );
+
+ hr = OnWindowedFullScreenChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnWindowedFullScreenChanged()
+{
+ HRESULT hr = S_OK;
+ bool bWindowed = IsWindowed();
+
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION_LABEL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL, !bWindowed );
+
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_ADAPTER_FORMAT, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_REFRESH_RATE, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_DEVICECLIP, bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_RESOLUTION, !bWindowed );
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_REFRESH_RATE, !bWindowed );
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ g_DeviceSettings.d3d9.pp.Windowed = bWindowed;
+ bool bDeviceClip = ( 0x0 != ( g_DeviceSettings.d3d9.pp.Flags & D3DPRESENTFLAG_DEVICECLIP ) );
+
+ // If windowed, get the appropriate adapter format from Direct3D
+ if( g_DeviceSettings.d3d9.pp.Windowed )
+ {
+ IDirect3D9* pD3D = DXUTGetD3D9Object();
+ if( pD3D == NULL )
+ return DXTRACE_ERR( L"DXUTGetD3DObject", E_FAIL );
+
+ D3DDISPLAYMODE mode;
+ hr = pD3D->GetAdapterDisplayMode( g_DeviceSettings.d3d9.AdapterOrdinal, &mode );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"GetAdapterDisplayMode", hr );
+
+ // Default resolution to the fullscreen res that was last used
+ RECT rc = DXUTGetFullsceenClientRectAtModeChange();
+ if( rc.right == 0 || rc.bottom == 0 )
+ {
+ // If nothing last used, then default to the adapter desktop res
+ g_DeviceSettings.d3d9.pp.BackBufferWidth = mode.Width;
+ g_DeviceSettings.d3d9.pp.BackBufferHeight = mode.Height;
+ }
+ else
+ {
+ g_DeviceSettings.d3d9.pp.BackBufferWidth = rc.right;
+ g_DeviceSettings.d3d9.pp.BackBufferHeight = rc.bottom;
+ }
+
+ g_DeviceSettings.d3d9.AdapterFormat = mode.Format;
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = mode.RefreshRate;
+ }
+
+ const D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat;
+ const DWORD dwWidth = g_DeviceSettings.d3d9.pp.BackBufferWidth;
+ const DWORD dwHeight = g_DeviceSettings.d3d9.pp.BackBufferHeight;
+ const DWORD dwRefreshRate = g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz;
+
+ // DXUTSETTINGSDLG_DEVICECLIP
+ SetDeviceClip( bDeviceClip );
+
+ // DXUTSETTINGSDLG_ADAPTER_FORMAT
+ CDXUTComboBox* pAdapterFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT );
+ if( pAdapterFormatComboBox == NULL )
+ return E_FAIL;
+ pAdapterFormatComboBox->RemoveAllItems();
+
+ CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
+ if( pDeviceInfo == NULL )
+ return E_FAIL;
+
+ if( bWindowed )
+ {
+ AddAdapterFormat( adapterFormat );
+ }
+ else
+ {
+ for( int iSettingsCombo = 0; iSettingsCombo < pDeviceInfo->deviceSettingsComboList.GetSize();
+ iSettingsCombo++ )
+ {
+ CD3D9EnumDeviceSettingsCombo* pSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt(
+ iSettingsCombo );
+ AddAdapterFormat( pSettingsCombo->AdapterFormat );
+ }
+ }
+
+ pAdapterFormatComboBox->SetSelectedByData( ULongToPtr( adapterFormat ) );
+
+ hr = OnAdapterFormatChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ // DXUTSETTINGSDLG_RESOLUTION
+ CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION );
+
+ if( bWindowed )
+ {
+ pResolutionComboBox->RemoveAllItems();
+ AddResolution( dwWidth, dwHeight );
+ }
+
+ pResolutionComboBox->SetSelectedByData( ULongToPtr( MAKELONG( dwWidth, dwHeight ) ) );
+
+ hr = OnResolutionChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ // DXUTSETTINGSDLG_REFRESH_RATE
+ CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
+
+ if( bWindowed )
+ {
+ pRefreshRateComboBox->RemoveAllItems();
+ AddRefreshRate( dwRefreshRate );
+ }
+
+ pRefreshRateComboBox->SetSelectedByData( ULongToPtr( dwRefreshRate ) );
+
+ hr = OnRefreshRateChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+
+ case DXUT_D3D11_DEVICE:
+ {
+ g_DeviceSettings.d3d11.sd.Windowed = bWindowed;
+
+ // Get available adapter output
+ CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration();
+
+ CDXUTComboBox* pOutputComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT );
+ pOutputComboBox->RemoveAllItems();
+
+ CD3D11EnumAdapterInfo* pAdapterInfo = pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal );
+ for( int ioutput = 0; ioutput < pAdapterInfo->outputInfoList.GetSize(); ++ioutput )
+ {
+ CD3D11EnumOutputInfo* pOutputInfo = pAdapterInfo->outputInfoList.GetAt( ioutput );
+ AddD3D11AdapterOutput( pOutputInfo->Desc.DeviceName, pOutputInfo->Output );
+ }
+
+ pOutputComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.Output ) );
+
+ hr = OnAdapterOutputChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnAdapterOutputChanged()
+{
+ HRESULT hr;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D11_DEVICE:
+ {
+ bool bWindowed = IsWindowed();
+ g_DeviceSettings.d3d11.sd.Windowed = bWindowed;
+
+ // If windowed, get the appropriate adapter format from Direct3D
+ if( g_DeviceSettings.d3d11.sd.Windowed )
+ {
+ DXGI_MODE_DESC mode;
+ hr = DXUTGetD3D11AdapterDisplayMode( g_DeviceSettings.d3d11.AdapterOrdinal,
+ g_DeviceSettings.d3d11.Output, &mode );
+ if( FAILED( hr ) )
+ return DXTRACE_ERR( L"GetD3D11AdapterDisplayMode", hr );
+
+ // Default resolution to the fullscreen res that was last used
+ RECT rc = DXUTGetFullsceenClientRectAtModeChange();
+ if( rc.right == 0 || rc.bottom == 0 )
+ {
+ // If nothing last used, then default to the adapter desktop res
+ g_DeviceSettings.d3d11.sd.BufferDesc.Width = mode.Width;
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height = mode.Height;
+ }
+ else
+ {
+ g_DeviceSettings.d3d11.sd.BufferDesc.Width = rc.right;
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height = rc.bottom;
+ }
+
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = mode.RefreshRate;
+ }
+
+ const DXGI_RATIONAL RefreshRate = g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate;
+
+ CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ // DXUTSETTINGSDLG_D3D11_RESOLUTION
+ hr = UpdateD3D11Resolutions();
+ if( FAILED( hr ) )
+ return hr;
+
+ // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT
+ CDXUTComboBox* pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT
+ );
+ pBackBufferFormatComboBox->RemoveAllItems();
+
+ for( int idc = 0; idc < pAdapterInfo->deviceSettingsComboList.GetSize(); idc++ )
+ {
+ CD3D11EnumDeviceSettingsCombo* pDeviceCombo = pAdapterInfo->deviceSettingsComboList.GetAt( idc );
+ if( ( pDeviceCombo->Windowed == TRUE ) == bWindowed )
+ {
+ AddD3D11BackBufferFormat( pDeviceCombo->BackBufferFormat );
+ }
+ }
+
+ pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.sd.BufferDesc.Format ) );
+
+ hr = OnBackBufferFormatChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ // DXUTSETTINGSDLG_D3D11_REFRESH_RATE
+ if( bWindowed )
+ {
+ CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE );
+ for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i )
+ {
+ DXGI_RATIONAL* pRefreshRate = reinterpret_cast<DXGI_RATIONAL*>(
+ pRefreshRateComboBox->GetItemData( i ) );
+ delete pRefreshRate;
+ }
+ pRefreshRateComboBox->RemoveAllItems();
+ AddD3D11RefreshRate( RefreshRate );
+ }
+
+ SetSelectedD3D11RefreshRate( RefreshRate );
+ break;
+ }
+ };
+
+ hr = OnRefreshRateChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnAdapterFormatChanged()
+{
+ HRESULT hr = S_OK;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ // DXUTSETTINGSDLG_ADAPTER_FORMAT
+ D3DFORMAT adapterFormat = GetSelectedAdapterFormat();
+ g_DeviceSettings.d3d9.AdapterFormat = adapterFormat;
+
+ // DXUTSETTINGSDLG_RESOLUTION
+ CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION );
+ pResolutionComboBox->RemoveAllItems();
+
+ CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ bool bShowAll = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL )->GetChecked();
+
+ // Get the desktop aspect ratio
+ D3DDISPLAYMODE dmDesktop;
+ DXUTGetDesktopResolution( g_DeviceSettings.d3d9.AdapterOrdinal, &dmDesktop.Width, &dmDesktop.Height );
+ float fDesktopAspectRatio = dmDesktop.Width / ( float )dmDesktop.Height;
+
+ for( int idm = 0; idm < pAdapterInfo->displayModeList.GetSize(); idm++ )
+ {
+ D3DDISPLAYMODE DisplayMode = pAdapterInfo->displayModeList.GetAt( idm );
+ float fAspect = ( float )DisplayMode.Width / ( float )DisplayMode.Height;
+
+ if( DisplayMode.Format == g_DeviceSettings.d3d9.AdapterFormat )
+ {
+ // If "Show All" is not checked, then hide all resolutions
+ // that don't match the aspect ratio of the desktop resolution
+ if( bShowAll || ( !bShowAll && fabsf( fDesktopAspectRatio - fAspect ) < 0.05f ) )
+ {
+ AddResolution( DisplayMode.Width, DisplayMode.Height );
+ }
+ }
+ }
+
+ const DWORD dwCurResolution = MAKELONG( g_DeviceSettings.d3d9.pp.BackBufferWidth,
+ g_DeviceSettings.d3d9.pp.BackBufferHeight );
+
+ pResolutionComboBox->SetSelectedByData( ULongToPtr( dwCurResolution ) );
+
+ hr = OnResolutionChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT
+ CDXUTComboBox* pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT );
+ pBackBufferFormatComboBox->RemoveAllItems();
+
+ CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
+ if( pDeviceInfo == NULL )
+ return E_FAIL;
+
+ const BOOL bWindowed = IsWindowed();
+ bool bHasWindowedBackBuffer = false;
+
+ for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ )
+ {
+ CD3D9EnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc );
+ if( pDeviceCombo->Windowed == bWindowed &&
+ pDeviceCombo->AdapterFormat == g_DeviceSettings.d3d9.AdapterFormat )
+ {
+ AddBackBufferFormat( pDeviceCombo->BackBufferFormat );
+ bHasWindowedBackBuffer = true;
+ }
+ }
+
+ pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.BackBufferFormat ) );
+
+ hr = OnBackBufferFormatChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ if( !bHasWindowedBackBuffer )
+ {
+ m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, false );
+
+ if( g_DeviceSettings.d3d9.pp.Windowed )
+ {
+ SetWindowed( false );
+
+ hr = OnWindowedFullScreenChanged();
+ if( FAILED( hr ) )
+ return hr;
+ }
+ }
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnResolutionChanged()
+{
+ HRESULT hr = S_OK;
+
+ CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ // Set resolution
+ DWORD dwWidth, dwHeight;
+ GetSelectedResolution( &dwWidth, &dwHeight );
+ g_DeviceSettings.d3d9.pp.BackBufferWidth = dwWidth;
+ g_DeviceSettings.d3d9.pp.BackBufferHeight = dwHeight;
+
+ DWORD dwRefreshRate = g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz;
+
+ // Update the refresh rate list
+ CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
+ pRefreshRateComboBox->RemoveAllItems();
+
+ D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat;
+ for( int idm = 0; idm < pAdapterInfo->displayModeList.GetSize(); idm++ )
+ {
+ D3DDISPLAYMODE displayMode = pAdapterInfo->displayModeList.GetAt( idm );
+
+ if( displayMode.Format == adapterFormat &&
+ displayMode.Width == dwWidth &&
+ displayMode.Height == dwHeight )
+ {
+ AddRefreshRate( displayMode.RefreshRate );
+ }
+ }
+
+ pRefreshRateComboBox->SetSelectedByData( ULongToPtr( dwRefreshRate ) );
+
+ hr = OnRefreshRateChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ return S_OK;
+}
+
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnRefreshRateChanged()
+{
+ // Set refresh rate
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = GetSelectedRefreshRate();
+ break;
+
+ case DXUT_D3D11_DEVICE:
+ g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = GetSelectedD3D11RefreshRate();
+ break;
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnBackBufferFormatChanged()
+{
+ HRESULT hr = S_OK;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ g_DeviceSettings.d3d9.pp.BackBufferFormat = GetSelectedBackBufferFormat();
+
+ D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat;
+ D3DFORMAT backBufferFormat = g_DeviceSettings.d3d9.pp.BackBufferFormat;
+
+ CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo();
+ if( pDeviceInfo == NULL )
+ return E_FAIL;
+
+ bool bAllowSoftwareVP, bAllowHardwareVP, bAllowPureHardwareVP, bAllowMixedVP;
+ DXUTGetD3D9Enumeration()->GetPossibleVertexProcessingList( &bAllowSoftwareVP, &bAllowHardwareVP,
+ &bAllowPureHardwareVP, &bAllowMixedVP );
+
+ for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ )
+ {
+ CD3D9EnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc );
+
+ if( pDeviceCombo->Windowed == ( g_DeviceSettings.d3d9.pp.Windowed == TRUE ) &&
+ pDeviceCombo->AdapterFormat == adapterFormat &&
+ pDeviceCombo->BackBufferFormat == backBufferFormat )
+ {
+ CDXUTComboBox* pDepthStencilComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL );
+ pDepthStencilComboBox->RemoveAllItems();
+ pDepthStencilComboBox->SetEnabled( ( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil == TRUE ) );
+
+ if( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil )
+ {
+ for( int ifmt = 0; ifmt < pDeviceCombo->depthStencilFormatList.GetSize(); ifmt++ )
+ {
+ D3DFORMAT fmt = pDeviceCombo->depthStencilFormatList.GetAt( ifmt );
+
+ AddDepthStencilBufferFormat( fmt );
+ }
+
+ pDepthStencilComboBox->SetSelectedByData( ULongToPtr(
+ g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat ) );
+ }
+ else
+ {
+ if( !pDepthStencilComboBox->ContainsItem( L"(not used)" ) )
+ pDepthStencilComboBox->AddItem( L"(not used)", NULL );
+ }
+
+ hr = OnDepthStencilBufferFormatChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ CDXUTComboBox* pVertexProcessingComboBox =
+ m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING );
+ pVertexProcessingComboBox->RemoveAllItems();
+
+ // Add valid vertex processing types
+ if( bAllowSoftwareVP )
+ AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING );
+
+ if( bAllowHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
+ AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING );
+
+ if( bAllowPureHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_PUREDEVICE )
+ AddVertexProcessingType( D3DCREATE_PUREDEVICE );
+
+ if( bAllowMixedVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
+ AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING );
+
+ if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_PUREDEVICE )
+ pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( D3DCREATE_PUREDEVICE ) );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING )
+ pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(
+ D3DCREATE_SOFTWARE_VERTEXPROCESSING ) );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
+ pVertexProcessingComboBox->SetSelectedByData( ULongToPtr(
+ D3DCREATE_HARDWARE_VERTEXPROCESSING ) );
+ else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING )
+ pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( D3DCREATE_MIXED_VERTEXPROCESSING ) );
+
+ hr = OnVertexProcessingChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ CDXUTComboBox* pPresentIntervalComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL );
+ pPresentIntervalComboBox->RemoveAllItems();
+ pPresentIntervalComboBox->AddItem( L"On", ULongToPtr( D3DPRESENT_INTERVAL_DEFAULT ) );
+ pPresentIntervalComboBox->AddItem( L"Off", ULongToPtr( D3DPRESENT_INTERVAL_IMMEDIATE ) );
+
+ pPresentIntervalComboBox->SetSelectedByData( ULongToPtr(
+ g_DeviceSettings.d3d9.pp.PresentationInterval ) );
+
+ hr = OnPresentIntervalChanged();
+ if( FAILED( hr ) )
+ return hr;
+ }
+ }
+
+ break;
+ }
+
+ case DXUT_D3D11_DEVICE:
+ {
+ g_DeviceSettings.d3d11.sd.BufferDesc.Format = GetSelectedD3D11BackBufferFormat();
+
+ DXGI_FORMAT backBufferFormat = g_DeviceSettings.d3d11.sd.BufferDesc.Format;
+
+ CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo();
+ if( pAdapterInfo == NULL )
+ return E_FAIL;
+
+ for( int idc = 0; idc < pAdapterInfo->deviceSettingsComboList.GetSize(); idc++ )
+ {
+ CD3D11EnumDeviceSettingsCombo* pDeviceCombo = pAdapterInfo->deviceSettingsComboList.GetAt( idc );
+
+ if( pDeviceCombo->Windowed == ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) &&
+ pDeviceCombo->BackBufferFormat == backBufferFormat &&
+ pDeviceCombo->DeviceType == g_DeviceSettings.d3d11.DriverType )
+ {
+ CDXUTComboBox* pMultisampleCountCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT
+ );
+ pMultisampleCountCombo->RemoveAllItems();
+ for( int i = 0; i < pDeviceCombo->multiSampleCountList.GetSize(); ++i )
+ AddD3D11MultisampleCount( pDeviceCombo->multiSampleCountList.GetAt( i ) );
+ pMultisampleCountCombo->SetSelectedByData( ULongToPtr(
+ g_DeviceSettings.d3d11.sd.SampleDesc.Count ) );
+
+ hr = OnMultisampleTypeChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ CDXUTComboBox* pPresentIntervalComboBox =
+ m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL );
+ pPresentIntervalComboBox->RemoveAllItems();
+ pPresentIntervalComboBox->AddItem( L"On", ULongToPtr( 1 ) );
+ pPresentIntervalComboBox->AddItem( L"Off", ULongToPtr( 0 ) );
+
+ pPresentIntervalComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.SyncInterval ) );
+
+ hr = OnPresentIntervalChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ hr = UpdateD3D11Resolutions();
+ if( FAILED( hr ) )
+ return hr;
+ }
+ }
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnDepthStencilBufferFormatChanged()
+{
+ HRESULT hr = S_OK;
+
+ D3DFORMAT depthStencilBufferFormat = GetSelectedDepthStencilBufferFormat();
+
+ if( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil )
+ g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat = depthStencilBufferFormat;
+
+ CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo();
+ if( pDeviceSettingsCombo == NULL )
+ return E_FAIL;
+
+ CDXUTComboBox* pMultisampleTypeCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
+ pMultisampleTypeCombo->RemoveAllItems();
+
+ for( int ims = 0; ims < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); ims++ )
+ {
+ D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( ims );
+
+ bool bConflictFound = false;
+ for( int iConf = 0; iConf < pDeviceSettingsCombo->DSMSConflictList.GetSize(); iConf++ )
+ {
+ CD3D9EnumDSMSConflict DSMSConf = pDeviceSettingsCombo->DSMSConflictList.GetAt( iConf );
+ if( DSMSConf.DSFormat == depthStencilBufferFormat &&
+ DSMSConf.MSType == msType )
+ {
+ bConflictFound = true;
+ break;
+ }
+ }
+
+ if( !bConflictFound )
+ AddMultisampleType( msType );
+ }
+
+ CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
+ pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.MultiSampleType ) );
+
+ hr = OnMultisampleTypeChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnMultisampleTypeChanged()
+{
+ HRESULT hr = S_OK;
+
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ {
+ D3DMULTISAMPLE_TYPE multisampleType = GetSelectedMultisampleType();
+ g_DeviceSettings.d3d9.pp.MultiSampleType = multisampleType;
+
+ CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo();
+ if( pDeviceSettingsCombo == NULL )
+ return E_FAIL;
+
+ DWORD dwMaxQuality = 0;
+ for( int iType = 0; iType < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); iType++ )
+ {
+ D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( iType );
+ if( msType == multisampleType )
+ {
+ dwMaxQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( iType );
+ break;
+ }
+ }
+
+ // DXUTSETTINGSDLG_MULTISAMPLE_QUALITY
+ CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY );
+ pMultisampleQualityCombo->RemoveAllItems();
+
+ for( UINT iQuality = 0; iQuality < dwMaxQuality; iQuality++ )
+ {
+ AddMultisampleQuality( iQuality );
+ }
+
+ pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.MultiSampleQuality ) );
+
+ hr = OnMultisampleQualityChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ case DXUT_D3D11_DEVICE:
+ {
+ UINT multisampleCount = GetSelectedD3D11MultisampleCount();
+ g_DeviceSettings.d3d11.sd.SampleDesc.Count = multisampleCount;
+
+ CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentD3D11DeviceSettingsCombo();
+ if( pDeviceSettingsCombo == NULL )
+ return E_FAIL;
+
+ UINT MaxQuality = 0;
+ for( int iCount = 0; iCount < pDeviceSettingsCombo->multiSampleCountList.GetSize(); iCount++ )
+ {
+ UINT Count = pDeviceSettingsCombo->multiSampleCountList.GetAt( iCount );
+ if( Count == multisampleCount )
+ {
+ MaxQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( iCount );
+ break;
+ }
+ }
+
+ // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY
+ CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY
+ );
+ pMultisampleQualityCombo->RemoveAllItems();
+
+ for( UINT iQuality = 0; iQuality < MaxQuality; iQuality++ )
+ {
+ AddD3D11MultisampleQuality( iQuality );
+ }
+
+ pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.sd.SampleDesc.Quality ) );
+
+ hr = OnMultisampleQualityChanged();
+ if( FAILED( hr ) )
+ return hr;
+
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnMultisampleQualityChanged()
+{
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ g_DeviceSettings.d3d9.pp.MultiSampleQuality = GetSelectedMultisampleQuality();
+ break;
+
+ case DXUT_D3D11_DEVICE:
+ g_DeviceSettings.d3d11.sd.SampleDesc.Quality = GetSelectedD3D11MultisampleQuality();
+ break;
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnVertexProcessingChanged()
+{
+ DWORD dwBehavior = g_DeviceSettings.d3d9.BehaviorFlags;
+
+ // Clear vertex processing flags
+ dwBehavior &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
+ dwBehavior &= ~D3DCREATE_SOFTWARE_VERTEXPROCESSING;
+ dwBehavior &= ~D3DCREATE_MIXED_VERTEXPROCESSING;
+ dwBehavior &= ~D3DCREATE_PUREDEVICE;
+
+ // Determine new flags
+ DWORD dwNewFlags = GetSelectedVertexProcessingType();
+ if( dwNewFlags & D3DCREATE_PUREDEVICE )
+ dwNewFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
+
+ // Make changes
+ g_DeviceSettings.d3d9.BehaviorFlags = dwBehavior | dwNewFlags;
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnPresentIntervalChanged()
+{
+ switch( g_DeviceSettings.ver )
+ {
+ case DXUT_D3D9_DEVICE:
+ g_DeviceSettings.d3d9.pp.PresentationInterval = GetSelectedPresentInterval();
+ break;
+
+ case DXUT_D3D11_DEVICE:
+ g_DeviceSettings.d3d11.SyncInterval = GetSelectedD3D11PresentInterval();
+ break;
+ }
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnDebugDeviceChanged()
+{
+ bool bDebugDevice = GetSelectedDebugDeviceValue();
+
+ if( bDebugDevice )
+ g_DeviceSettings.d3d11.CreateFlags |= D3D11_CREATE_DEVICE_DEBUG;
+ else
+ g_DeviceSettings.d3d11.CreateFlags &= ~D3D11_CREATE_DEVICE_DEBUG;
+
+ return S_OK;
+}
+
+//-------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::OnDeviceClipChanged()
+{
+ if( IsDeviceClip() )
+ g_DeviceSettings.d3d9.pp.Flags |= D3DPRESENTFLAG_DEVICECLIP;
+ else
+ g_DeviceSettings.d3d9.pp.Flags &= ~D3DPRESENTFLAG_DEVICECLIP;
+
+ return S_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddAPIVersion( DXUTDeviceVersion version )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION );
+
+ if( !pComboBox->ContainsItem( DXUTAPIVersionToString( version ) ) )
+ pComboBox->AddItem( DXUTAPIVersionToString( version ), ULongToPtr( version ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+DXUTDeviceVersion CD3DSettingsDlg::GetSelectedAPIVersion()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION );
+
+ return ( DXUTDeviceVersion )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddAdapter( const WCHAR* strDescription, UINT iAdapter )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+
+ if( !pComboBox->ContainsItem( strDescription ) )
+ pComboBox->AddItem( strDescription, ULongToPtr( iAdapter ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+UINT CD3DSettingsDlg::GetSelectedAdapter()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddDeviceType( D3DDEVTYPE devType )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+
+ if( !pComboBox->ContainsItem( DXUTD3DDeviceTypeToString( devType ) ) )
+ pComboBox->AddItem( DXUTD3DDeviceTypeToString( devType ), ULongToPtr( devType ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3DDEVTYPE CD3DSettingsDlg::GetSelectedDeviceType()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+
+ return ( D3DDEVTYPE )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::SetWindowed( bool bWindowed )
+{
+ CDXUTRadioButton* pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED );
+ pRadioButton->SetChecked( bWindowed );
+
+ pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_FULLSCREEN );
+ pRadioButton->SetChecked( !bWindowed );
+}
+
+
+//-------------------------------------------------------------------------------------
+bool CD3DSettingsDlg::IsWindowed()
+{
+ CDXUTRadioButton* pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED );
+ return pRadioButton->GetChecked();
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddAdapterFormat( D3DFORMAT format )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT );
+
+ if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) )
+ pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3DFORMAT CD3DSettingsDlg::GetSelectedAdapterFormat()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT );
+
+ return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11AdapterOutput( const WCHAR* strName, UINT Output )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT );
+
+ if( !pComboBox->ContainsItem( strName ) )
+ pComboBox->AddItem( strName, ULongToPtr( Output ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+UINT CD3DSettingsDlg::GetSelectedD3D11AdapterOutput()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddResolution( DWORD dwWidth, DWORD dwHeight )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION );
+
+ DWORD dwResolutionData;
+ WCHAR strResolution[50];
+ dwResolutionData = MAKELONG( dwWidth, dwHeight );
+ swprintf_s( strResolution, 50, L"%d by %d", dwWidth, dwHeight );
+
+ if( !pComboBox->ContainsItem( strResolution ) )
+ pComboBox->AddItem( strResolution, ULongToPtr( dwResolutionData ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::GetSelectedResolution( DWORD* pdwWidth, DWORD* pdwHeight )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION );
+
+ DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() );
+
+ *pdwWidth = LOWORD( dwResolution );
+ *pdwHeight = HIWORD( dwResolution );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11Resolution( DWORD dwWidth, DWORD dwHeight )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION );
+
+ DWORD dwResolutionData;
+ WCHAR strResolution[50];
+ dwResolutionData = MAKELONG( dwWidth, dwHeight );
+ swprintf_s( strResolution, 50, L"%d by %d", dwWidth, dwHeight );
+
+ if( !pComboBox->ContainsItem( strResolution ) )
+ pComboBox->AddItem( strResolution, ULongToPtr( dwResolutionData ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::GetSelectedD3D11Resolution( DWORD* pdwWidth, DWORD* pdwHeight )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION );
+
+ DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() );
+
+ *pdwWidth = LOWORD( dwResolution );
+ *pdwHeight = HIWORD( dwResolution );
+}
+
+void CD3DSettingsDlg::AddD3D11FeatureLevel(D3D_FEATURE_LEVEL fl) {
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL );
+ switch( fl )
+ {
+ case D3D_FEATURE_LEVEL_9_1:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_1" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_1", ULongToPtr( D3D_FEATURE_LEVEL_9_1 ) );
+ }
+ break;
+ case D3D_FEATURE_LEVEL_9_2:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_2" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_2", ULongToPtr( D3D_FEATURE_LEVEL_9_2 ) );
+ }
+ break;
+ case D3D_FEATURE_LEVEL_9_3:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_3" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_3", ULongToPtr( D3D_FEATURE_LEVEL_9_3 ) );
+ }
+ break;
+ case D3D_FEATURE_LEVEL_10_0:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_10_0" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_10_0", ULongToPtr( D3D_FEATURE_LEVEL_10_0 ) );
+ }
+ break;
+ case D3D_FEATURE_LEVEL_10_1:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_10_1" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_10_1", ULongToPtr( D3D_FEATURE_LEVEL_10_1 ) );
+ }
+ break;
+ case D3D_FEATURE_LEVEL_11_0:
+ {
+ if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_11_0" ) )
+ pComboBox->AddItem( L"D3D_FEATURE_LEVEL_11_0", ULongToPtr( D3D_FEATURE_LEVEL_11_0 ) );
+ }
+ break;
+ }
+
+}
+
+D3D_FEATURE_LEVEL CD3DSettingsDlg::GetSelectedFeatureLevel() {
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL );
+
+ return (D3D_FEATURE_LEVEL)PtrToUlong( pComboBox->GetSelectedData() );
+}
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddRefreshRate( DWORD dwRate )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
+
+ WCHAR strRefreshRate[50];
+
+ if( dwRate == 0 )
+ wcscpy_s( strRefreshRate, 50, L"Default Rate" );
+ else
+ swprintf_s( strRefreshRate, 50, L"%d Hz", dwRate );
+
+ if( !pComboBox->ContainsItem( strRefreshRate ) )
+ pComboBox->AddItem( strRefreshRate, ULongToPtr( dwRate ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+DWORD CD3DSettingsDlg::GetSelectedRefreshRate()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11RefreshRate( DXGI_RATIONAL RefreshRate )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE );
+
+ WCHAR strRefreshRate[50];
+
+ if( RefreshRate.Numerator == 0 && RefreshRate.Denominator == 0 )
+ wcscpy_s( strRefreshRate, 50, L"Default Rate" );
+ else
+ swprintf_s( strRefreshRate, 50, L"%d Hz", RefreshRate.Numerator / RefreshRate.Denominator );
+
+ if( !pComboBox->ContainsItem( strRefreshRate ) )
+ {
+ DXGI_RATIONAL* pNewRate = new DXGI_RATIONAL;
+ if( pNewRate )
+ {
+ *pNewRate = RefreshRate;
+ pComboBox->AddItem( strRefreshRate, pNewRate );
+ }
+ }
+}
+
+
+//-------------------------------------------------------------------------------------
+DXGI_RATIONAL CD3DSettingsDlg::GetSelectedD3D11RefreshRate()
+{
+ DXGI_RATIONAL dxgiR;
+ dxgiR.Numerator = 0;
+ dxgiR.Denominator = 1;
+
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE );
+
+ return *reinterpret_cast<DXGI_RATIONAL*>( pComboBox->GetSelectedData() );
+
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddBackBufferFormat( D3DFORMAT format )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT );
+
+ if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) )
+ pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3DFORMAT CD3DSettingsDlg::GetSelectedBackBufferFormat()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT );
+
+ return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11BackBufferFormat( DXGI_FORMAT format )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT );
+
+ if( !pComboBox->ContainsItem( DXUTDXGIFormatToString( format, TRUE ) ) )
+ pComboBox->AddItem( DXUTDXGIFormatToString( format, TRUE ), ULongToPtr( format ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+DXGI_FORMAT CD3DSettingsDlg::GetSelectedD3D11BackBufferFormat()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT );
+
+ return ( DXGI_FORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddDepthStencilBufferFormat( D3DFORMAT format )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL );
+
+ if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) )
+ pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3DFORMAT CD3DSettingsDlg::GetSelectedDepthStencilBufferFormat()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL );
+
+ return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddMultisampleType( D3DMULTISAMPLE_TYPE type )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
+
+ if( !pComboBox->ContainsItem( DXUTMultisampleTypeToString( type ) ) )
+ pComboBox->AddItem( DXUTMultisampleTypeToString( type ), ULongToPtr( type ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3DMULTISAMPLE_TYPE CD3DSettingsDlg::GetSelectedMultisampleType()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE );
+
+ return ( D3DMULTISAMPLE_TYPE )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddMultisampleQuality( DWORD dwQuality )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY );
+
+ WCHAR strQuality[50];
+ swprintf_s( strQuality, 50, L"%d", dwQuality );
+
+ if( !pComboBox->ContainsItem( strQuality ) )
+ pComboBox->AddItem( strQuality, ULongToPtr( dwQuality ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+DWORD CD3DSettingsDlg::GetSelectedMultisampleQuality()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11MultisampleCount( UINT Count )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT );
+
+ WCHAR str[50];
+ swprintf_s( str, 50, L"%u", Count );
+
+ if( !pComboBox->ContainsItem( str ) )
+ pComboBox->AddItem( str, ULongToPtr( Count ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+UINT CD3DSettingsDlg::GetSelectedD3D11MultisampleCount()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT );
+
+ return ( UINT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11MultisampleQuality( UINT Quality )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY );
+
+ WCHAR strQuality[50];
+ swprintf_s( strQuality, 50, L"%d", Quality );
+
+ if( !pComboBox->ContainsItem( strQuality ) )
+ pComboBox->AddItem( strQuality, ULongToPtr( Quality ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+UINT CD3DSettingsDlg::GetSelectedD3D11MultisampleQuality()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY );
+
+ return ( UINT )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddVertexProcessingType( DWORD dwType )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING );
+
+ if( !pComboBox->ContainsItem( DXUTVertexProcessingTypeToString( dwType ) ) )
+ pComboBox->AddItem( DXUTVertexProcessingTypeToString( dwType ), ULongToPtr( dwType ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+DWORD CD3DSettingsDlg::GetSelectedVertexProcessingType()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+DWORD CD3DSettingsDlg::GetSelectedPresentInterval()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+//-------------------------------------------------------------------------------------
+DWORD CD3DSettingsDlg::GetSelectedD3D11PresentInterval()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL );
+
+ return PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+//-------------------------------------------------------------------------------------
+bool CD3DSettingsDlg::GetSelectedDebugDeviceValue()
+{
+ CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE );
+
+ return pCheckBox->GetChecked();
+}
+
+
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::SetDeviceClip( bool bDeviceClip )
+{
+ CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_DEVICECLIP );
+ pCheckBox->SetChecked( bDeviceClip );
+}
+
+
+//-------------------------------------------------------------------------------------
+bool CD3DSettingsDlg::IsDeviceClip()
+{
+ CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_DEVICECLIP );
+ return pCheckBox->GetChecked();
+}
+
+//--------------------------------------------------------------------------------------
+// Updates the resolution list for D3D11
+//--------------------------------------------------------------------------------------
+HRESULT CD3DSettingsDlg::UpdateD3D11Resolutions()
+{
+
+ const DWORD dwWidth = g_DeviceSettings.d3d11.sd.BufferDesc.Width;
+ const DWORD dwHeight = g_DeviceSettings.d3d11.sd.BufferDesc.Height;
+
+ // DXUTSETTINGSDLG_D3D11_RESOLUTION
+ CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION );
+ pResolutionComboBox->RemoveAllItems();
+
+ CD3D11EnumOutputInfo* pOutputInfo = GetCurrentD3D11OutputInfo();
+ if( pOutputInfo == NULL )
+ return E_FAIL;
+
+ bool bShowAll = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL )->GetChecked();
+
+ // Get the desktop aspect ratio
+ DXGI_MODE_DESC dmDesktop;
+ DXUTGetDesktopResolution( g_DeviceSettings.d3d11.AdapterOrdinal, &dmDesktop.Width, &dmDesktop.Height );
+ float fDesktopAspectRatio = dmDesktop.Width / ( float )dmDesktop.Height;
+
+ for( int idm = 0; idm < pOutputInfo->displayModeList.GetSize(); idm++ )
+ {
+ DXGI_MODE_DESC DisplayMode = pOutputInfo->displayModeList.GetAt( idm );
+ float fAspect = ( float )DisplayMode.Width / ( float )DisplayMode.Height;
+
+ if( DisplayMode.Format == g_DeviceSettings.d3d11.sd.BufferDesc.Format )
+ {
+ // If "Show All" is not checked, then hide all resolutions
+ // that don't match the aspect ratio of the desktop resolution
+ if( bShowAll || ( !bShowAll && fabsf( fDesktopAspectRatio - fAspect ) < 0.05f ) )
+ {
+ AddD3D11Resolution( DisplayMode.Width, DisplayMode.Height );
+ }
+ }
+ }
+
+ const DWORD dwCurResolution = MAKELONG( g_DeviceSettings.d3d11.sd.BufferDesc.Width,
+ g_DeviceSettings.d3d11.sd.BufferDesc.Height );
+
+ pResolutionComboBox->SetSelectedByData( ULongToPtr( dwCurResolution ) );
+
+
+ bool bWindowed = IsWindowed();
+ if( bWindowed )
+ {
+ pResolutionComboBox->RemoveAllItems();
+ AddD3D11Resolution( dwWidth, dwHeight );
+
+ pResolutionComboBox->SetSelectedByData( ULongToPtr( MAKELONG( dwWidth, dwHeight ) ) );
+
+
+ }
+
+ return S_OK;
+}
+
+
+//
+//-------------------------------------------------------------------------------------
+void CD3DSettingsDlg::AddD3D11DeviceType( D3D_DRIVER_TYPE devType )
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+
+ if( !pComboBox->ContainsItem( DXUTD3DX11DeviceTypeToString( devType ) ) )
+ pComboBox->AddItem( DXUTD3DX11DeviceTypeToString( devType ), ULongToPtr( devType ) );
+}
+
+
+//-------------------------------------------------------------------------------------
+D3D_DRIVER_TYPE CD3DSettingsDlg::GetSelectedD3D11DeviceType()
+{
+ CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE );
+
+ return ( D3D_DRIVER_TYPE )PtrToUlong( pComboBox->GetSelectedData() );
+}
+
+
+void CD3DSettingsDlg::UpdateModeChangeTimeoutText( int nSecRemaining )
+{
+ const WCHAR StrTimeout[] = L"Reverting to previous display settings in %d seconds";
+ const DWORD CchBuf = sizeof( StrTimeout ) / sizeof( WCHAR ) + 16;
+ WCHAR buf[CchBuf];
+
+ swprintf_s( buf, CchBuf, StrTimeout, nSecRemaining );
+
+ CDXUTStatic* pStatic = m_RevertModeDialog.GetStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT );
+ pStatic->SetText( buf );
+}
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given DXUTDeviceVersion.
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTAPIVersionToString( DXUTDeviceVersion version )
+{
+ switch( version )
+ {
+ case DXUT_D3D9_DEVICE:
+ return L"Direct3D 9";
+ case DXUT_D3D11_DEVICE:
+ return L"Direct3D 11";
+ default:
+ return L"Unknown version";
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given D3DDEVTYPE.
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTD3DDeviceTypeToString( D3DDEVTYPE devType )
+{
+ switch( devType )
+ {
+ case D3DDEVTYPE_HAL:
+ return L"D3DDEVTYPE_HAL";
+ case D3DDEVTYPE_SW:
+ return L"D3DDEVTYPE_SW";
+ case D3DDEVTYPE_REF:
+ return L"D3DDEVTYPE_REF";
+ default:
+ return L"Unknown devType";
+ }
+}
+
+
+
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given D3D_DRIVER_TYPE.
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTD3DX11DeviceTypeToString( D3D_DRIVER_TYPE devType )
+{
+ switch( devType )
+ {
+ case D3D_DRIVER_TYPE_HARDWARE:
+ return L"D3D_DRIVER_TYPE_HARDWARE";
+ case D3D_DRIVER_TYPE_REFERENCE:
+ return L"D3D_DRIVER_TYPE_REFERENCE";
+ case D3D_DRIVER_TYPE_NULL:
+ return L"D3D_DRIVER_TYPE_NULL";
+ case D3D_DRIVER_TYPE_WARP:
+ return L"D3D_DRIVER_TYPE_WARP";
+ default:
+ return L"Unknown devType";
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given D3DMULTISAMPLE_TYPE.
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTMultisampleTypeToString( D3DMULTISAMPLE_TYPE MultiSampleType )
+{
+ switch( MultiSampleType )
+ {
+ case D3DMULTISAMPLE_NONE:
+ return L"D3DMULTISAMPLE_NONE";
+ case D3DMULTISAMPLE_NONMASKABLE:
+ return L"D3DMULTISAMPLE_NONMASKABLE";
+ case D3DMULTISAMPLE_2_SAMPLES:
+ return L"D3DMULTISAMPLE_2_SAMPLES";
+ case D3DMULTISAMPLE_3_SAMPLES:
+ return L"D3DMULTISAMPLE_3_SAMPLES";
+ case D3DMULTISAMPLE_4_SAMPLES:
+ return L"D3DMULTISAMPLE_4_SAMPLES";
+ case D3DMULTISAMPLE_5_SAMPLES:
+ return L"D3DMULTISAMPLE_5_SAMPLES";
+ case D3DMULTISAMPLE_6_SAMPLES:
+ return L"D3DMULTISAMPLE_6_SAMPLES";
+ case D3DMULTISAMPLE_7_SAMPLES:
+ return L"D3DMULTISAMPLE_7_SAMPLES";
+ case D3DMULTISAMPLE_8_SAMPLES:
+ return L"D3DMULTISAMPLE_8_SAMPLES";
+ case D3DMULTISAMPLE_9_SAMPLES:
+ return L"D3DMULTISAMPLE_9_SAMPLES";
+ case D3DMULTISAMPLE_10_SAMPLES:
+ return L"D3DMULTISAMPLE_10_SAMPLES";
+ case D3DMULTISAMPLE_11_SAMPLES:
+ return L"D3DMULTISAMPLE_11_SAMPLES";
+ case D3DMULTISAMPLE_12_SAMPLES:
+ return L"D3DMULTISAMPLE_12_SAMPLES";
+ case D3DMULTISAMPLE_13_SAMPLES:
+ return L"D3DMULTISAMPLE_13_SAMPLES";
+ case D3DMULTISAMPLE_14_SAMPLES:
+ return L"D3DMULTISAMPLE_14_SAMPLES";
+ case D3DMULTISAMPLE_15_SAMPLES:
+ return L"D3DMULTISAMPLE_15_SAMPLES";
+ case D3DMULTISAMPLE_16_SAMPLES:
+ return L"D3DMULTISAMPLE_16_SAMPLES";
+ default:
+ return L"Unknown Multisample Type";
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given vertex processing type
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTVertexProcessingTypeToString( DWORD vpt )
+{
+ switch( vpt )
+ {
+ case D3DCREATE_SOFTWARE_VERTEXPROCESSING:
+ return L"Software vertex processing";
+ case D3DCREATE_MIXED_VERTEXPROCESSING:
+ return L"Mixed vertex processing";
+ case D3DCREATE_HARDWARE_VERTEXPROCESSING:
+ return L"Hardware vertex processing";
+ case D3DCREATE_PUREDEVICE:
+ return L"Pure hardware vertex processing";
+ default:
+ return L"Unknown vertex processing type";
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// Returns the string for the given present interval.
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTPresentIntervalToString( UINT pi )
+{
+ switch( pi )
+ {
+ case D3DPRESENT_INTERVAL_IMMEDIATE:
+ return L"D3DPRESENT_INTERVAL_IMMEDIATE";
+ case D3DPRESENT_INTERVAL_DEFAULT:
+ return L"D3DPRESENT_INTERVAL_DEFAULT";
+ case D3DPRESENT_INTERVAL_ONE:
+ return L"D3DPRESENT_INTERVAL_ONE";
+ case D3DPRESENT_INTERVAL_TWO:
+ return L"D3DPRESENT_INTERVAL_TWO";
+ case D3DPRESENT_INTERVAL_THREE:
+ return L"D3DPRESENT_INTERVAL_THREE";
+ case D3DPRESENT_INTERVAL_FOUR:
+ return L"D3DPRESENT_INTERVAL_FOUR";
+ default:
+ return L"Unknown PresentInterval";
+ }
+}
+
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.h b/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.h
new file mode 100644
index 0000000..5d4db4f
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/DXUTsettingsdlg.h
@@ -0,0 +1,248 @@
+//--------------------------------------------------------------------------------------
+// File: DXUTSettingsDlg.cpp
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef DXUT_SETTINGS_H
+#define DXUT_SETTINGS_H
+
+//--------------------------------------------------------------------------------------
+// Header Includes
+//--------------------------------------------------------------------------------------
+#include "DXUTgui.h"
+//--------------------------------------------------------------------------------------
+// Control IDs
+//--------------------------------------------------------------------------------------
+#define DXUTSETTINGSDLG_STATIC -1
+#define DXUTSETTINGSDLG_OK 1
+#define DXUTSETTINGSDLG_CANCEL 2
+#define DXUTSETTINGSDLG_ADAPTER 3
+#define DXUTSETTINGSDLG_DEVICE_TYPE 4
+#define DXUTSETTINGSDLG_WINDOWED 5
+#define DXUTSETTINGSDLG_FULLSCREEN 6
+#define DXUTSETTINGSDLG_ADAPTER_FORMAT 7
+#define DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL 8
+#define DXUTSETTINGSDLG_RESOLUTION 9
+#define DXUTSETTINGSDLG_RESOLUTION_LABEL 10
+#define DXUTSETTINGSDLG_REFRESH_RATE 11
+#define DXUTSETTINGSDLG_REFRESH_RATE_LABEL 12
+#define DXUTSETTINGSDLG_BACK_BUFFER_FORMAT 13
+#define DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL 14
+#define DXUTSETTINGSDLG_DEPTH_STENCIL 15
+#define DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL 16
+#define DXUTSETTINGSDLG_MULTISAMPLE_TYPE 17
+#define DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL 18
+#define DXUTSETTINGSDLG_MULTISAMPLE_QUALITY 19
+#define DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL 20
+#define DXUTSETTINGSDLG_VERTEX_PROCESSING 21
+#define DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL 22
+#define DXUTSETTINGSDLG_PRESENT_INTERVAL 23
+#define DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL 24
+#define DXUTSETTINGSDLG_DEVICECLIP 25
+#define DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL 26
+#define DXUTSETTINGSDLG_API_VERSION 27
+#define DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT 28
+#define DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL 29
+#define DXUTSETTINGSDLG_D3D11_RESOLUTION 30
+#define DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL 31
+#define DXUTSETTINGSDLG_D3D11_REFRESH_RATE 32
+#define DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL 33
+#define DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT 34
+#define DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL 35
+#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT 36
+#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL 37
+#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY 38
+#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL 39
+#define DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL 40
+#define DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL 41
+#define DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE 42
+#define DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL 43
+#define DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL 44
+
+#define DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT 58
+#define DXUTSETTINGSDLG_MODE_CHANGE_REVERT 59
+#define DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT 60
+#define DXUTSETTINGSDLG_WINDOWED_GROUP 0x0100
+
+#define TOTAL_FEATURE_LEVLES 6
+//--------------------------------------------------------------------------------------
+// Dialog for selection of device settings
+// Use DXUTGetD3DSettingsDialog() to access global instance
+// To control the contents of the dialog, use the CD3D9Enumeration class.
+//--------------------------------------------------------------------------------------
+class CD3DSettingsDlg
+{
+public:
+ CD3DSettingsDlg();
+ ~CD3DSettingsDlg();
+
+ void Init( CDXUTDialogResourceManager* pManager );
+ void Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName );
+ void Init( CDXUTDialogResourceManager* pManager, LPCWSTR pszControlTextureResourcename,
+ HMODULE hModule );
+
+ HRESULT Refresh();
+ void OnRender( float fElapsedTime );
+ void OnRender9( float fElapsedTime );
+ void OnRender10( float fElapsedTime );
+ void OnRender11( float fElapsedTime );
+
+ HRESULT OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice );
+ HRESULT OnD3D9ResetDevice();
+ void OnD3D9LostDevice();
+ void OnD3D9DestroyDevice();
+
+ HRESULT OnD3D11CreateDevice( ID3D11Device* pd3dDevice );
+ HRESULT OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice,
+ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc );
+ void OnD3D11DestroyDevice();
+
+ CDXUTDialog* GetDialogControl()
+ {
+ return &m_Dialog;
+ }
+ bool IsActive()
+ {
+ return m_bActive;
+ }
+ void SetActive( bool bActive )
+ {
+ m_bActive = bActive; if( bActive ) Refresh();
+ }
+ void ShowControlSet( DXUTDeviceVersion ver );
+
+ LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+protected:
+ friend CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog();
+
+ void CreateControls();
+ HRESULT SetDeviceSettingsFromUI();
+ void SetSelectedD3D11RefreshRate( DXGI_RATIONAL RefreshRate );
+ HRESULT UpdateD3D11Resolutions();
+
+ void OnEvent( UINT nEvent, int nControlID, CDXUTControl* pControl );
+ static void WINAPI StaticOnEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserData );
+ static void WINAPI StaticOnModeChangeTimer( UINT nIDEvent, void* pUserContext );
+
+ CD3D9EnumAdapterInfo* GetCurrentAdapterInfo();
+ CD3D9EnumDeviceInfo* GetCurrentDeviceInfo();
+ CD3D9EnumDeviceSettingsCombo* GetCurrentDeviceSettingsCombo();
+
+ CD3D11EnumAdapterInfo* GetCurrentD3D11AdapterInfo();
+ CD3D11EnumDeviceInfo* GetCurrentD3D11DeviceInfo();
+ CD3D11EnumOutputInfo* GetCurrentD3D11OutputInfo();
+ CD3D11EnumDeviceSettingsCombo* GetCurrentD3D11DeviceSettingsCombo();
+
+ void AddAPIVersion( DXUTDeviceVersion version );
+ DXUTDeviceVersion GetSelectedAPIVersion();
+
+ void AddAdapter( const WCHAR* strDescription, UINT iAdapter );
+ UINT GetSelectedAdapter();
+
+ void AddDeviceType( D3DDEVTYPE devType );
+ D3DDEVTYPE GetSelectedDeviceType();
+
+ void SetWindowed( bool bWindowed );
+ bool IsWindowed();
+
+ void AddAdapterFormat( D3DFORMAT format );
+ D3DFORMAT GetSelectedAdapterFormat();
+
+ void AddResolution( DWORD dwWidth, DWORD dwHeight );
+ void GetSelectedResolution( DWORD* pdwWidth, DWORD* pdwHeight );
+
+ void AddRefreshRate( DWORD dwRate );
+ DWORD GetSelectedRefreshRate();
+
+ void AddBackBufferFormat( D3DFORMAT format );
+ D3DFORMAT GetSelectedBackBufferFormat();
+
+ void AddDepthStencilBufferFormat( D3DFORMAT format );
+ D3DFORMAT GetSelectedDepthStencilBufferFormat();
+
+ void AddMultisampleType( D3DMULTISAMPLE_TYPE type );
+ D3DMULTISAMPLE_TYPE GetSelectedMultisampleType();
+
+ void AddMultisampleQuality( DWORD dwQuality );
+ DWORD GetSelectedMultisampleQuality();
+
+ void AddVertexProcessingType( DWORD dwType );
+ DWORD GetSelectedVertexProcessingType();
+
+ DWORD GetSelectedPresentInterval();
+
+ void SetDeviceClip( bool bDeviceClip );
+ bool IsDeviceClip();
+
+ // D3D11
+ void AddD3D11DeviceType( D3D_DRIVER_TYPE devType );
+ D3D_DRIVER_TYPE GetSelectedD3D11DeviceType();
+
+ void AddD3D11AdapterOutput( const WCHAR* strName, UINT nOutput );
+ UINT GetSelectedD3D11AdapterOutput();
+
+ void AddD3D11Resolution( DWORD dwWidth, DWORD dwHeight );
+ void GetSelectedD3D11Resolution( DWORD* pdwWidth, DWORD* pdwHeight );
+
+ void AddD3D11FeatureLevel(D3D_FEATURE_LEVEL);
+ D3D_FEATURE_LEVEL GetSelectedFeatureLevel();
+
+ void AddD3D11RefreshRate( DXGI_RATIONAL RefreshRate );
+ DXGI_RATIONAL GetSelectedD3D11RefreshRate();
+
+ void AddD3D11BackBufferFormat( DXGI_FORMAT format );
+ DXGI_FORMAT GetSelectedD3D11BackBufferFormat();
+
+ void AddD3D11MultisampleCount( UINT count );
+ UINT GetSelectedD3D11MultisampleCount();
+
+ void AddD3D11MultisampleQuality( UINT Quality );
+ UINT GetSelectedD3D11MultisampleQuality();
+
+ DWORD GetSelectedD3D11PresentInterval();
+ bool GetSelectedDebugDeviceValue();
+
+
+
+ HRESULT OnD3D11ResolutionChanged ();
+ HRESULT OnAPIVersionChanged( bool bRefresh=false );
+ HRESULT OnFeatureLevelChanged();
+ HRESULT OnAdapterChanged();
+ HRESULT OnDeviceTypeChanged();
+ HRESULT OnWindowedFullScreenChanged();
+ HRESULT OnAdapterOutputChanged();
+ HRESULT OnAdapterFormatChanged();
+ HRESULT OnResolutionChanged();
+ HRESULT OnRefreshRateChanged();
+ HRESULT OnBackBufferFormatChanged();
+ HRESULT OnDepthStencilBufferFormatChanged();
+ HRESULT OnMultisampleTypeChanged();
+ HRESULT OnMultisampleQualityChanged();
+ HRESULT OnVertexProcessingChanged();
+ HRESULT OnPresentIntervalChanged();
+ HRESULT OnDebugDeviceChanged();
+ HRESULT OnDeviceClipChanged();
+
+ void UpdateModeChangeTimeoutText( int nSecRemaining );
+
+ IDirect3DStateBlock9* m_pStateBlock;
+ CDXUTDialog* m_pActiveDialog;
+ CDXUTDialog m_Dialog;
+ CDXUTDialog m_RevertModeDialog;
+ int m_nRevertModeTimeout;
+ UINT m_nIDEvent;
+ bool m_bActive;
+
+ D3D_FEATURE_LEVEL m_Levels[TOTAL_FEATURE_LEVLES];
+
+};
+
+
+CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog();
+
+
+
+#endif
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/ImeUi.cpp b/samples/DX_APIUsage/DXUT/Optional/ImeUi.cpp
new file mode 100644
index 0000000..f7a0cb2
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/ImeUi.cpp
@@ -0,0 +1,3662 @@
+//--------------------------------------------------------------------------------------
+// File: ImeUi.cpp
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#include "dxut.h"
+#include "ImeUi.h"
+#include <math.h>
+#include <msctf.h>
+#include <malloc.h>
+#include <strsafe.h>
+
+// Ignore typecast warnings
+#pragma warning( disable : 4312 )
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4311 )
+
+
+#define MAX_CANDIDATE_LENGTH 256
+#define COUNTOF(a) ( sizeof( a ) / sizeof( ( a )[0] ) )
+#define POSITION_UNINITIALIZED ((DWORD)-1)
+
+#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
+#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
+
+#define MAKEIMEVERSION(major,minor) ( (DWORD)( ( (BYTE)( major ) << 24 ) | ( (BYTE)( minor ) << 16 ) ) )
+#define IMEID_VER(dwId) ( ( dwId ) & 0xffff0000 )
+#define IMEID_LANG(dwId) ( ( dwId ) & 0x0000ffff )
+
+#define _CHT_HKL_DAYI ( (HKL)0xE0060404 ) // DaYi
+#define _CHT_HKL_NEW_PHONETIC ( (HKL)0xE0080404 ) // New Phonetic
+#define _CHT_HKL_NEW_CHANG_JIE ( (HKL)0xE0090404 ) // New Chang Jie
+#define _CHT_HKL_NEW_QUICK ( (HKL)0xE00A0404 ) // New Quick
+#define _CHT_HKL_HK_CANTONESE ( (HKL)0xE00B0404 ) // Hong Kong Cantonese
+#define _CHT_IMEFILENAME "TINTLGNT.IME" // New Phonetic
+#define _CHT_IMEFILENAME2 "CINTLGNT.IME" // New Chang Jie
+#define _CHT_IMEFILENAME3 "MSTCIPHA.IME" // Phonetic 5.1
+#define IMEID_CHT_VER42 ( LANG_CHT | MAKEIMEVERSION( 4, 2 ) ) // New(Phonetic/ChanJie)IME98 : 4.2.x.x // Win98
+#define IMEID_CHT_VER43 ( LANG_CHT | MAKEIMEVERSION( 4, 3 ) ) // New(Phonetic/ChanJie)IME98a : 4.3.x.x // Win2k
+#define IMEID_CHT_VER44 ( LANG_CHT | MAKEIMEVERSION( 4, 4 ) ) // New ChanJie IME98b : 4.4.x.x // WinXP
+#define IMEID_CHT_VER50 ( LANG_CHT | MAKEIMEVERSION( 5, 0 ) ) // New(Phonetic/ChanJie)IME5.0 : 5.0.x.x // WinME
+#define IMEID_CHT_VER51 ( LANG_CHT | MAKEIMEVERSION( 5, 1 ) ) // New(Phonetic/ChanJie)IME5.1 : 5.1.x.x // IME2002(w/OfficeXP)
+#define IMEID_CHT_VER52 ( LANG_CHT | MAKEIMEVERSION( 5, 2 ) ) // New(Phonetic/ChanJie)IME5.2 : 5.2.x.x // IME2002a(w/WinXP)
+#define IMEID_CHT_VER60 ( LANG_CHT | MAKEIMEVERSION( 6, 0 ) ) // New(Phonetic/ChanJie)IME6.0 : 6.0.x.x // New IME 6.0(web download)
+#define IMEID_CHT_VER_VISTA ( LANG_CHT | MAKEIMEVERSION( 7, 0 ) ) // All TSF TIP under Cicero UI-less mode: a hack to make GetImeId() return non-zero value
+
+#define _CHS_HKL ( (HKL)0xE00E0804 ) // MSPY
+#define _CHS_IMEFILENAME "PINTLGNT.IME" // MSPY1.5/2/3
+#define _CHS_IMEFILENAME2 "MSSCIPYA.IME" // MSPY3 for OfficeXP
+#define IMEID_CHS_VER41 ( LANG_CHS | MAKEIMEVERSION( 4, 1 ) ) // MSPY1.5 // SCIME97 or MSPY1.5 (w/Win98, Office97)
+#define IMEID_CHS_VER42 ( LANG_CHS | MAKEIMEVERSION( 4, 2 ) ) // MSPY2 // Win2k/WinME
+#define IMEID_CHS_VER53 ( LANG_CHS | MAKEIMEVERSION( 5, 3 ) ) // MSPY3 // WinXP
+
+static CHAR signature[] = "%%%IMEUILIB:070111%%%";
+
+static IMEUI_APPEARANCE gSkinIME =
+{
+ 0, // symbolColor;
+ 0x404040, // symbolColorOff;
+ 0xff000000, // symbolColorText;
+ 24, // symbolHeight;
+ 0xa0, // symbolTranslucence;
+ 0, // symbolPlacement;
+ NULL, // symbolFont;
+ 0xffffffff, // candColorBase;
+ 0xff000000, // candColorBorder;
+ 0, // candColorText;
+ 0x00ffff00, // compColorInput;
+ 0x000000ff, // compColorTargetConv;
+ 0x0000ff00, // compColorConverted;
+ 0x00ff0000, // compColorTargetNotConv;
+ 0x00ff0000, // compColorInputErr;
+ 0x80, // compTranslucence;
+ 0, // compColorText;
+ 2, // caretWidth;
+ 1, // caretYMargin;
+};
+
+struct _SkinCompStr
+{
+ DWORD colorInput;
+ DWORD colorTargetConv;
+ DWORD colorConverted;
+ DWORD colorTargetNotConv;
+ DWORD colorInputErr;
+};
+
+_SkinCompStr gSkinCompStr;
+
+// Definition from Win98DDK version of IMM.H
+typedef struct
+tagINPUTCONTEXT2
+{
+ HWND hWnd;
+ BOOL fOpen;
+ POINT ptStatusWndPos;
+ POINT ptSoftKbdPos;
+ DWORD fdwConversion;
+ DWORD fdwSentence;
+ union
+ {
+ LOGFONTA A;
+ LOGFONTW W;
+ } lfFont;
+ COMPOSITIONFORM cfCompForm;
+ CANDIDATEFORM cfCandForm[4];
+ HIMCC hCompStr;
+ HIMCC hCandInfo;
+ HIMCC hGuideLine;
+ HIMCC hPrivate;
+ DWORD dwNumMsgBuf;
+ HIMCC hMsgBuf;
+ DWORD fdwInit;
+ DWORD dwReserve[3];
+}
+INPUTCONTEXT2, *PINPUTCONTEXT2, NEAR *NPINPUTCONTEXT2,
+FAR* LPINPUTCONTEXT2;
+
+
+// Class to disable Cicero in case ImmDisableTextFrameService() doesn't disable it completely
+class CDisableCicero
+{
+public:
+ CDisableCicero() : m_ptim( NULL ),
+ m_bComInit( false )
+ {
+ }
+ ~CDisableCicero()
+ {
+ Uninitialize();
+ }
+ void Initialize()
+ {
+ if( m_bComInit )
+ {
+ return;
+ }
+ HRESULT hr;
+ hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
+ if( SUCCEEDED( hr ) )
+ {
+ m_bComInit = true;
+ hr = CoCreateInstance( CLSID_TF_ThreadMgr,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ __uuidof( ITfThreadMgr ),
+ ( void** )&m_ptim );
+ }
+ }
+ void Uninitialize()
+ {
+ if( m_ptim )
+ {
+ m_ptim->Release();
+ m_ptim = NULL;
+ }
+ if( m_bComInit )
+ CoUninitialize();
+ m_bComInit = false;
+ }
+
+ void DisableCiceroOnThisWnd( HWND hwnd )
+ {
+ if( m_ptim == NULL )
+ return;
+ ITfDocumentMgr* pdimPrev; // the dim that is associated previously.
+ // Associate NULL dim to the window.
+ // When this window gets the focus, Cicero does not work and IMM32 IME
+ // will be activated.
+ if( SUCCEEDED( m_ptim->AssociateFocus( hwnd, NULL, &pdimPrev ) ) )
+ {
+ if( pdimPrev )
+ pdimPrev->Release();
+ }
+ }
+private:
+ ITfThreadMgr* m_ptim;
+ bool m_bComInit;
+};
+static CDisableCicero g_disableCicero;
+
+#define _IsLeadByte(x) ( LeadByteTable[(BYTE)( x )] )
+static void _PumpMessage();
+static BYTE LeadByteTable[256];
+#define _ImmGetContext ImmGetContext
+#define _ImmReleaseContext ImmReleaseContext
+#define _ImmAssociateContext ImmAssociateContext
+static LONG ( WINAPI* _ImmGetCompositionString )( HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen );
+#define _ImmGetOpenStatus ImmGetOpenStatus
+#define _ImmSetOpenStatus ImmSetOpenStatus
+#define _ImmGetConversionStatus ImmGetConversionStatus
+static DWORD ( WINAPI* _ImmGetCandidateList )( HIMC himc, DWORD deIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen );
+static LPINPUTCONTEXT2 ( WINAPI* _ImmLockIMC )( HIMC hIMC );
+static BOOL ( WINAPI* _ImmUnlockIMC )( HIMC hIMC );
+static LPVOID ( WINAPI* _ImmLockIMCC )( HIMCC hIMCC );
+static BOOL ( WINAPI* _ImmUnlockIMCC )( HIMCC hIMCC );
+#define _ImmGetDefaultIMEWnd ImmGetDefaultIMEWnd
+#define _ImmGetIMEFileNameA ImmGetIMEFileNameA
+#define _ImmGetVirtualKey ImmGetVirtualKey
+#define _ImmNotifyIME ImmNotifyIME
+#define _ImmSetConversionStatus ImmSetConversionStatus
+#define _ImmSimulateHotKey ImmSimulateHotKey
+#define _ImmIsIME ImmIsIME
+
+// private API provided by CHT IME. Available on version 6.0 or later.
+UINT ( WINAPI*_GetReadingString )( HIMC himc, UINT uReadingBufLen, LPWSTR lpwReadingBuf, PINT pnErrorIndex,
+ BOOL* pfIsVertical, PUINT puMaxReadingLen );
+BOOL ( WINAPI*_ShowReadingWindow )( HIMC himc, BOOL bShow );
+
+// Callbacks
+void ( CALLBACK*ImeUiCallback_DrawRect )( int x1, int y1, int x2, int y2, DWORD color );
+void ( CALLBACK*ImeUiCallback_DrawFans )( const IMEUI_VERTEX* paVertex, UINT uNum );
+void* ( __cdecl*ImeUiCallback_Malloc )( size_t bytes );
+void ( __cdecl*ImeUiCallback_Free )( void* ptr );
+void ( CALLBACK*ImeUiCallback_OnChar )( WCHAR wc );
+
+static void (*_SendCompString )();
+static LRESULT ( WINAPI* _SendMessage )( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) = SendMessageA;
+static DWORD (* _GetCandidateList )( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList );
+
+static HWND g_hwndMain;
+static HWND g_hwndCurr;
+static HIMC g_himcOrg;
+static bool g_bImeEnabled = false;
+static TCHAR g_szCompositionString[256];
+static BYTE g_szCompAttrString[256];
+static DWORD g_IMECursorBytes = 0;
+static DWORD g_IMECursorChars = 0;
+static TCHAR g_szCandidate[MAX_CANDLIST][MAX_CANDIDATE_LENGTH];
+static DWORD g_dwSelection, g_dwCount;
+static UINT g_uCandPageSize;
+static DWORD g_bDisableImeCompletely = false;
+static DWORD g_dwIMELevel;
+static DWORD g_dwIMELevelSaved;
+static TCHAR g_szMultiLineCompString[ 256 *( 3 - sizeof( TCHAR ) ) ];
+static bool g_bReadingWindow = false;
+static bool g_bHorizontalReading = false;
+static bool g_bVerticalCand = true;
+static UINT g_uCaretBlinkTime = 0;
+static UINT g_uCaretBlinkLast = 0;
+static bool g_bCaretDraw = false;
+static bool g_bChineseIME;
+static bool g_bInsertMode = true;
+static TCHAR g_szReadingString[32]; // Used only in case of horizontal reading window
+static int g_iReadingError; // Used only in case of horizontal reading window
+static UINT g_screenWidth, g_screenHeight;
+static DWORD g_dwPrevFloat;
+static bool bIsSendingKeyMessage = false;
+static OSVERSIONINFOA g_osi;
+static bool g_bInitialized = false;
+static bool g_bCandList = false;
+static DWORD g_dwCandX, g_dwCandY;
+static DWORD g_dwCaretX, g_dwCaretY;
+static DWORD g_hCompChar;
+static int g_iCandListIndexBase;
+static DWORD g_dwImeUiFlags = IMEUI_FLAG_SUPPORT_CARET;
+static bool g_bUILessMode = false;
+static HMODULE g_hImmDll = NULL;
+
+#define IsNT() (g_osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
+
+struct CompStringAttribute
+{
+ UINT caretX;
+ UINT caretY;
+ CImeUiFont_Base* pFont;
+ DWORD colorComp;
+ DWORD colorCand;
+ RECT margins;
+};
+
+static CompStringAttribute g_CaretInfo;
+static DWORD g_dwState = IMEUI_STATE_OFF;
+static DWORD swirl = 0;
+static double lastSwirl;
+
+#define INDICATOR_NON_IME 0
+#define INDICATOR_CHS 1
+#define INDICATOR_CHT 2
+#define INDICATOR_KOREAN 3
+#define INDICATOR_JAPANESE 4
+
+#define GETLANG() LOWORD(g_hklCurrent)
+#define GETPRIMLANG() ((WORD)PRIMARYLANGID(GETLANG()))
+#define GETSUBLANG() SUBLANGID(GETLANG())
+
+#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
+#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
+
+static HKL g_hklCurrent = 0;
+static UINT g_uCodePage = 0;
+static LPTSTR g_aszIndicator[] =
+{
+ TEXT( "A" ),
+#ifdef UNICODE
+ L"\x7B80",
+ L"\x7E41",
+ L"\xac00",
+ L"\x3042",
+#else
+ "\xd6\xd0",
+ "\xa4\xa4",
+ "\xb0\xa1",
+ "\x82\xa0",
+#endif
+};
+static LPTSTR g_pszIndicatior = g_aszIndicator[0];
+
+static void GetReadingString( HWND hWnd );
+static DWORD GetImeId( UINT uIndex = 0 );
+static void CheckToggleState();
+static void DrawImeIndicator();
+static void DrawCandidateList();
+static void DrawCompositionString( bool bDrawCompAttr );
+static void GetReadingWindowOrientation( DWORD dwId );
+static void OnInputLangChangeWorker();
+static void OnInputLangChange();
+static void SetImeApi();
+static void CheckInputLocale();
+static void SetSupportLevel( DWORD dwImeLevel );
+void ImeUi_SetSupportLevel( DWORD dwImeLevel );
+
+
+//
+// local helper functions
+//
+inline LRESULT SendKeyMsg( HWND hwnd, UINT msg, WPARAM wp )
+{
+ bIsSendingKeyMessage = true;
+ LRESULT lRc = _SendMessage( hwnd, msg, wp, 1 );
+ bIsSendingKeyMessage = false;
+ return lRc;
+}
+#define SendKeyMsg_DOWN(hwnd,vk) SendKeyMsg(hwnd, WM_KEYDOWN, vk)
+#define SendKeyMsg_UP(hwnd,vk) SendKeyMsg(hwnd, WM_KEYUP, vk)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CTsfUiLessMode
+// Handles IME events using Text Service Framework (TSF). Before Vista,
+// IMM (Input Method Manager) API has been used to handle IME events and
+// inqueries. Some IMM functions lose backward compatibility due to design
+// of TSF, so we have to use new TSF interfaces.
+//
+///////////////////////////////////////////////////////////////////////////////
+class CTsfUiLessMode
+{
+protected:
+ // Sink receives event notifications
+ class CUIElementSink : public ITfUIElementSink,
+ public ITfInputProcessorProfileActivationSink,
+ public ITfCompartmentEventSink
+ {
+ public:
+ CUIElementSink();
+ ~CUIElementSink();
+
+ // IUnknown
+ STDMETHODIMP QueryInterface( REFIID riid, void** ppvObj );
+ STDMETHODIMP_( ULONG )
+ AddRef( void );
+ STDMETHODIMP_( ULONG )
+ Release( void );
+
+ // ITfUIElementSink
+ // Notifications for Reading Window events. We could process candidate as well, but we'll use IMM for simplicity sake.
+ STDMETHODIMP BeginUIElement( DWORD dwUIElementId, BOOL* pbShow );
+ STDMETHODIMP UpdateUIElement( DWORD dwUIElementId );
+ STDMETHODIMP EndUIElement( DWORD dwUIElementId );
+
+ // ITfInputProcessorProfileActivationSink
+ // Notification for keyboard input locale change
+ STDMETHODIMP OnActivated( DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid,
+ REFGUID guidProfile, HKL hkl, DWORD dwFlags );
+
+ // ITfCompartmentEventSink
+ // Notification for open mode (toggle state) change
+ STDMETHODIMP OnChange( REFGUID rguid );
+
+ private:
+ LONG _cRef;
+ };
+
+ static void MakeReadingInformationString( ITfReadingInformationUIElement* preading );
+ static void MakeCandidateStrings( ITfCandidateListUIElement* pcandidate );
+ static ITfUIElement* GetUIElement( DWORD dwUIElementId );
+ static BOOL GetCompartments( ITfCompartmentMgr** ppcm, ITfCompartment** ppTfOpenMode,
+ ITfCompartment** ppTfConvMode );
+ static BOOL SetupCompartmentSinks( BOOL bResetOnly = FALSE, ITfCompartment* pTfOpenMode = NULL,
+ ITfCompartment* ppTfConvMode = NULL );
+
+ static ITfThreadMgrEx* m_tm;
+ static DWORD m_dwUIElementSinkCookie;
+ static DWORD m_dwAlpnSinkCookie;
+ static DWORD m_dwOpenModeSinkCookie;
+ static DWORD m_dwConvModeSinkCookie;
+ static CUIElementSink* m_TsfSink;
+ static int m_nCandidateRefCount; // Some IME shows multiple candidate lists but the Library doesn't support multiple candidate list.
+ // So track open / close events to make sure the candidate list opened last is shown.
+ CTsfUiLessMode()
+ {
+ } // this class can't be instanciated
+
+public:
+ static BOOL SetupSinks();
+ static void ReleaseSinks();
+ static BOOL CurrentInputLocaleIsIme();
+ static void UpdateImeState( BOOL bResetCompartmentEventSink = FALSE );
+ static void EnableUiUpdates( bool bEnable );
+};
+
+ITfThreadMgrEx* CTsfUiLessMode::m_tm;
+DWORD CTsfUiLessMode::m_dwUIElementSinkCookie = TF_INVALID_COOKIE;
+DWORD CTsfUiLessMode::m_dwAlpnSinkCookie = TF_INVALID_COOKIE;
+DWORD CTsfUiLessMode::m_dwOpenModeSinkCookie = TF_INVALID_COOKIE;
+DWORD CTsfUiLessMode::m_dwConvModeSinkCookie = TF_INVALID_COOKIE;
+CTsfUiLessMode::CUIElementSink* CTsfUiLessMode::m_TsfSink = NULL;
+int CTsfUiLessMode::m_nCandidateRefCount = NULL;
+
+static unsigned long _strtoul( LPCSTR psz, LPTSTR*, int )
+{
+ if( !psz )
+ return 0;
+
+ ULONG ulRet = 0;
+ if( psz[0] == '0' && ( psz[1] == 'x' || psz[1] == 'X' ) )
+ {
+ psz += 2;
+ ULONG ul = 0;
+ while( *psz )
+ {
+ if( '0' <= *psz && *psz <= '9' )
+ ul = *psz - '0';
+ else if( 'A' <= *psz && *psz <= 'F' )
+ ul = *psz - 'A' + 10;
+ else if( 'a' <= *psz && *psz <= 'f' )
+ ul = *psz - 'a' + 10;
+ else
+ break;
+ ulRet = ulRet * 16 + ul;
+ psz++;
+ }
+ }
+ else
+ {
+ while( *psz && ( '0' <= *psz && *psz <= '9' ) )
+ {
+ ulRet = ulRet * 10 + ( *psz - '0' );
+ psz++;
+ }
+ }
+ return ulRet;
+}
+
+#ifdef UNICODE
+#define GetCharCount(psz) lstrlen(psz)
+#define GetCharCountFromBytes(psz,iBytes) (iBytes)
+static void AW_SendCompString()
+{
+ int i, iLen;
+ if ( ImeUiCallback_OnChar )
+ {
+ for ( i = 0; g_szCompositionString[i]; i++ )
+ {
+ ImeUiCallback_OnChar( g_szCompositionString[i] );
+ }
+ return;
+ }
+
+ BYTE szCompStr[COUNTOF(g_szCompositionString) * 2];
+ iLen = WideCharToMultiByte(g_uCodePage, 0, g_szCompositionString, -1,
+ (LPSTR)szCompStr, COUNTOF(szCompStr), NULL, NULL) - 1; // don't need to send NUL terminator;
+ for (i = 0; i < iLen; i++)
+ {
+ SendKeyMsg(g_hwndCurr, WM_CHAR, szCompStr[i]);
+ }
+}
+
+// The following AW_Imm* functions are there to support Win95/98 first version.
+// They can be deleted if the game doesn't supports them (i.e. games requires Win98 SE or later).
+static DWORD AW_GetCandidateList(HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList)
+{
+ DWORD dwBufLen = ImmGetCandidateListA( himc, dwIndex, NULL, 0 );
+ if (dwBufLen)
+ {
+ LPCANDIDATELIST pCandList = (LPCANDIDATELIST)ImeUiCallback_Malloc(dwBufLen);
+ if (pCandList) {
+ dwBufLen = ImmGetCandidateListA( himc, dwIndex, pCandList, dwBufLen );
+ if (dwBufLen) {
+ int i;
+ int wideBufLen = 0;
+ for (i = 0; i < (int)pCandList->dwCount; i++) {
+ wideBufLen += MultiByteToWideChar(g_uCodePage, 0, (LPSTR)pCandList + pCandList->dwOffset[i], -1, NULL, 0) * sizeof(WCHAR);
+ }
+ wideBufLen += pCandList->dwOffset[0];
+ *ppCandList = (LPCANDIDATELIST)ImeUiCallback_Malloc(wideBufLen);
+ LPCANDIDATELIST pCandListW = *ppCandList;
+ memcpy(pCandListW, pCandList, pCandList->dwOffset[0]);
+ LPWSTR pwz = (LPWSTR)((LPSTR)pCandListW + pCandList->dwOffset[0]);
+ for (i = 0; i < (int)pCandList->dwCount; i++) {
+ pCandListW->dwOffset[i] = (LPSTR)pwz - (LPSTR)pCandListW;
+ pwz += MultiByteToWideChar(g_uCodePage, 0, (LPSTR)pCandList + pCandList->dwOffset[i], -1, pwz, 256);
+ }
+ dwBufLen = wideBufLen;
+ }
+ ImeUiCallback_Free(pCandList);
+ }
+ }
+ return dwBufLen;
+}
+
+static LONG WINAPI AW_ImmGetCompositionString(HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
+{
+ char pszMb[COUNTOF(g_szCompositionString) * 2];
+ DWORD dwRet = ImmGetCompositionStringA(himc, dwIndex, pszMb, sizeof(pszMb));
+ switch (dwIndex) {
+ case GCS_RESULTSTR:
+ case GCS_COMPSTR:
+ if (dwRet) {
+ pszMb[dwRet] = 0;
+ dwRet = (DWORD)MultiByteToWideChar(g_uCodePage, 0, pszMb, -1, (LPWSTR)lpBuf, dwBufLen);
+ if (dwRet) {
+ // Note that ImmGetCompositionString() returns number of bytes copied, regardless of the width of character.
+ dwRet = (dwRet - 1) * sizeof(WCHAR);
+ }
+ }
+ break;
+ case GCS_CURSORPOS:
+ dwRet /= 2;
+ break;
+ case GCS_COMPATTR: {
+ char pszMb2[COUNTOF(g_szCompositionString) * 2];
+ DWORD dwRet2 = ImmGetCompositionStringA(himc, GCS_COMPSTR, pszMb2, sizeof(pszMb2));
+ if (!dwRet2) {
+ dwRet2 = ImmGetCompositionStringA(himc, GCS_RESULTSTR, pszMb2, sizeof(pszMb2));
+ if (!dwRet2) {
+ return 0;
+ }
+ }
+ char* pOut = (char*)lpBuf;
+ for (DWORD i = 0; i < dwRet; i++) {
+ *pOut++ = pszMb[i]; // copy attribute
+ if (_IsLeadByte(pszMb2[i]))
+ i++;
+ }
+ dwRet = pOut - (char*)lpBuf;
+ }
+ break;
+ }
+ return dwRet;
+}
+
+#else // !UNICODE
+// returns number of characters from number of bytes
+static int GetCharCountFromBytes( LPCSTR pszString, int iBytes )
+{
+ int iCount = 0;
+ int i;
+ for( i = 0; pszString[i] && i < iBytes; i++ )
+ {
+ iCount++;
+ if( _IsLeadByte(pszString[i]) )
+ i++;
+ }
+ if( i != iBytes )
+ iCount = -iCount; // indicate error - iBytes specifies wrong boundary (i.e. the last byte is leadbyte)
+ return iCount;
+}
+
+static int GetCharCount( LPTSTR psz )
+{
+ int i = 0;
+ while( *psz )
+ {
+ if( _IsLeadByte(*psz) )
+ {
+ psz++;
+ }
+ psz++;
+ i++;
+ }
+ return i;
+}
+
+static DWORD WA_GetCandidateList( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList )
+{
+ DWORD dwBufLen = ImmGetCandidateListW( himc, dwIndex, NULL, 0 );
+ if( dwBufLen )
+ {
+ LPCANDIDATELIST pCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( dwBufLen );
+ if( pCandList )
+ {
+ dwBufLen = ImmGetCandidateListW( himc, dwIndex, pCandList, dwBufLen );
+ if( dwBufLen )
+ {
+ int i;
+ int mbBufLen = 0;
+ for( i = 0; i < ( int )pCandList->dwCount; i++ )
+ {
+ mbBufLen += WideCharToMultiByte( g_uCodePage, 0, ( LPWSTR )( ( LPSTR )pCandList +
+ pCandList->dwOffset[i] ), -1, NULL, 0,
+ NULL, NULL );
+ }
+ mbBufLen += pCandList->dwOffset[0];
+ *ppCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( mbBufLen );
+ LPCANDIDATELIST pCandListA = *ppCandList;
+ memcpy( pCandListA, pCandList, pCandList->dwOffset[0] );
+ LPSTR psz = ( LPSTR )pCandListA + pCandList->dwOffset[0];
+ for( i = 0; i < ( int )pCandList->dwCount; i++ )
+ {
+ pCandListA->dwOffset[i] = ( LPSTR )psz - ( LPSTR )pCandListA;
+ psz += WideCharToMultiByte( g_uCodePage, 0, ( LPWSTR )( ( LPSTR )pCandList +
+ pCandList->dwOffset[i] ), -1, psz, 256,
+ NULL, NULL );
+ }
+ dwBufLen = mbBufLen;
+ }
+ ImeUiCallback_Free( pCandList );
+ }
+ }
+ return dwBufLen;
+}
+
+static LONG WINAPI WA_ImmGetCompositionString( HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen )
+{
+ WCHAR pwzUc[COUNTOF(g_szCompositionString)];
+ DWORD dwRet = ImmGetCompositionStringW( himc, dwIndex, pwzUc, sizeof( pwzUc ) );
+ switch( dwIndex )
+ {
+ case GCS_RESULTSTR:
+ case GCS_COMPSTR:
+ if( dwRet )
+ {
+ pwzUc[dwRet / sizeof( WCHAR )] = 0;
+ dwRet = ( DWORD )WideCharToMultiByte( g_uCodePage, 0, pwzUc, -1, ( LPSTR )lpBuf, dwBufLen, NULL,
+ NULL );
+ if( dwRet )
+ {
+ dwRet = dwRet - 1;
+ }
+ }
+ break;
+
+ case GCS_CURSORPOS:
+ {
+ WCHAR pwzUc2[COUNTOF(g_szCompositionString)];
+ DWORD dwRet2 = ImmGetCompositionStringW( himc, GCS_COMPSTR, pwzUc2, sizeof( pwzUc2 ) );
+ if( !dwRet2 )
+ {
+ dwRet2 = ImmGetCompositionStringW( himc, GCS_RESULTSTR, pwzUc2, sizeof( pwzUc2 ) );
+ if( !dwRet2 )
+ {
+ return 0;
+ }
+ }
+ dwRet2 /= 2;
+ //The return value of WideCharToMultiByte() should probably be checked/asserted for success.
+ //bounds violation (overflow) 'pszMb[iRc]'
+ const int bufSize = COUNTOF(g_szCompositionString) * 2;
+ char pszMb[bufSize];
+ int iRc = WideCharToMultiByte( g_uCodePage, 0, pwzUc2, dwRet2, pszMb, sizeof( pszMb ), NULL, NULL );
+ assert( iRc > 0 ); //WideCharToMultiByte returns 0 if it failed, and it should *never* be negative in the first place
+ if( iRc >= bufSize ) //if we wrote more bytes than the length of the buffer, we need to terminate it
+ {
+ pszMb[ bufSize - 1] = 0; //0 terminate the end of the buffer
+ }
+ else
+ {
+ pszMb[ iRc ] = 0;
+ }
+ char* psz = pszMb;
+ for( dwRet2 = 0; dwRet2 != dwRet; dwRet2++ )
+ {
+ if( _IsLeadByte( *psz ) )
+ psz++;
+ psz++;
+ }
+ dwRet = psz - pszMb;
+ }
+ break;
+
+ case GCS_COMPATTR:
+ {
+ WCHAR pwzUc2[COUNTOF(g_szCompositionString)];
+ DWORD dwRet2 = ImmGetCompositionStringW( himc, GCS_COMPSTR, pwzUc2, sizeof( pwzUc2 ) );
+ if( !dwRet2 )
+ {
+ dwRet2 = ImmGetCompositionStringW( himc, GCS_RESULTSTR, pwzUc2, sizeof( pwzUc2 ) );
+ if( !dwRet2 )
+ {
+ return 0;
+ }
+ }
+ dwRet2 /= 2;
+ const int bufSize = COUNTOF(g_szCompositionString) * 2;
+ char pszMb[bufSize];
+ int iRc = WideCharToMultiByte( g_uCodePage, 0, pwzUc2, dwRet2, pszMb, sizeof( pszMb ), NULL, NULL );
+ assert( iRc > 0 ); //WideCharToMultiByte returns 0 if it failed, and it should *never* be negative in the first place
+ if( iRc >= bufSize ) //if we wrote more bytes than the length of the buffer, we need to terminate it
+ {
+ pszMb[ bufSize - 1] = 0; //0 terminate the end of the buffer
+ }
+ else
+ {
+ pszMb[ iRc ] = 0;
+ }
+ char* pSrc = ( char* )pwzUc;
+ char* pOut = ( char* )lpBuf;
+ for( char* psz = pszMb; *psz; psz++, pSrc++ )
+ {
+ *pOut++ = *pSrc; // copy attribute
+ if( _IsLeadByte( *psz ) )
+ {
+ *pOut++ = *pSrc;
+ psz++;
+ }
+ // buffer overrun protection, pOut is incremented in the loop, but not part of the
+ // loop invariant test. To make the code more readable we have a test rather than
+ // rolling this into the for stmt.
+ if( ( DWORD )( pOut - ( char* )lpBuf ) >= dwBufLen )
+ break;
+ }
+ dwRet = pOut - ( char* )lpBuf;
+ }
+ break;
+ }
+ return dwRet;
+}
+
+#endif // UNICODE
+
+static void ComposeCandidateLine( int index, LPCTSTR pszCandidate )
+{
+ LPTSTR psz = g_szCandidate[index];
+ *psz++ = ( TCHAR )( TEXT( '0' ) + ( ( index + g_iCandListIndexBase ) % 10 ) );
+ if( g_bVerticalCand )
+ {
+ *psz++ = TEXT( ' ' );
+ }
+ while( *pszCandidate && ( COUNTOF(g_szCandidate[index]) > ( psz - g_szCandidate[index] ) ) )
+ {
+ *psz++ = *pszCandidate++;
+ }
+ *psz = 0;
+}
+
+static void SendCompString()
+{
+ int i, iLen = lstrlen( g_szCompositionString );
+ if( ImeUiCallback_OnChar )
+ {
+ LPCWSTR pwz;
+#ifdef UNICODE
+ pwz = g_szCompositionString;
+#else
+ WCHAR szUnicode[COUNTOF( g_szCompositionString ) ];
+ pwz = szUnicode;
+ iLen = MultiByteToWideChar( g_uCodePage, 0, g_szCompositionString, -1, szUnicode, COUNTOF(szUnicode) ) - 1;
+#endif
+ for( i = 0; i < iLen; i++ )
+ {
+ ImeUiCallback_OnChar( pwz[i] );
+ }
+ return;
+ }
+ for( i = 0; i < iLen; i++ )
+ {
+ SendKeyMsg( g_hwndCurr, WM_CHAR,
+#ifdef UNICODE
+ (WPARAM)g_szCompositionString[i]
+#else
+ ( WPARAM )( BYTE )g_szCompositionString[i]
+#endif
+ );
+ }
+}
+
+static DWORD GetCandidateList( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList )
+{
+ DWORD dwBufLen = _ImmGetCandidateList( himc, dwIndex, NULL, 0 );
+ if( dwBufLen )
+ {
+ *ppCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( dwBufLen );
+ dwBufLen = _ImmGetCandidateList( himc, dwIndex, *ppCandList, dwBufLen );
+ }
+ return dwBufLen;
+}
+
+static void SendControlKeys( UINT vk, UINT num )
+{
+ if( num == 0 )
+ return;
+ for( UINT i = 0; i < num; i++ )
+ {
+ SendKeyMsg_DOWN(g_hwndCurr, vk);
+ }
+ SendKeyMsg_UP(g_hwndCurr, vk);
+}
+
+// send key messages to erase composition string.
+static void CancelCompString( HWND hwnd, bool bUseBackSpace = true, int iNewStrLen = 0 )
+{
+ if( g_dwIMELevel != 3 )
+ return;
+ int cc = GetCharCount( g_szCompositionString );
+ int i;
+ // move caret to the end of composition string
+ SendControlKeys( VK_RIGHT, cc - g_IMECursorChars );
+
+ if( bUseBackSpace || g_bInsertMode )
+ iNewStrLen = 0;
+
+ // The caller sets bUseBackSpace to false if there's possibility of sending
+ // new composition string to the app right after this function call.
+ //
+ // If the app is in overwriting mode and new comp string is
+ // shorter than current one, delete previous comp string
+ // till it's same long as the new one. Then move caret to the beginning of comp string.
+ // New comp string will overwrite old one.
+ if( iNewStrLen < cc )
+ {
+ for( i = 0; i < cc - iNewStrLen; i++ )
+ {
+ SendKeyMsg_DOWN(hwnd, VK_BACK);
+ SendKeyMsg( hwnd, WM_CHAR, 8 ); //Backspace character
+ }
+ SendKeyMsg_UP(hwnd, VK_BACK);
+ }
+ else
+ iNewStrLen = cc;
+
+ SendControlKeys( VK_LEFT, iNewStrLen );
+}
+
+// initialize composition string data.
+static void InitCompStringData( void )
+{
+ g_IMECursorBytes = 0;
+ g_IMECursorChars = 0;
+ memset( &g_szCompositionString, 0, sizeof( g_szCompositionString ) );
+ memset( &g_szCompAttrString, 0, sizeof( g_szCompAttrString ) );
+}
+
+static void DrawCaret( DWORD x, DWORD y, DWORD height )
+{
+ if( g_bCaretDraw && ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( x, y + gSkinIME.caretYMargin, x + gSkinIME.caretWidth,
+ y + height - gSkinIME.caretYMargin, g_CaretInfo.colorComp );
+}
+
+//
+// Apps that draw the composition string on top of composition string attribute
+// in level 3 support should call this function twice in rendering a frame.
+// // Draw edit box UI;
+// ImeUi_RenderUI(true, false); // paint composition string attribute;
+// // Draw text in the edit box;
+// ImeUi_RenderUi(false, true); // paint the rest of IME UI;
+//
+void ImeUi_RenderUI( bool bDrawCompAttr, bool bDrawOtherUi )
+{
+ if( !g_bInitialized || !g_bImeEnabled || !g_CaretInfo.pFont )
+ return;
+ if( !bDrawCompAttr && !bDrawOtherUi )
+ return; // error case
+ if( g_dwIMELevel == 2 )
+ {
+ if( !bDrawOtherUi )
+ return; // 1st call for level 3 support
+ }
+
+ if( bDrawOtherUi )
+ DrawImeIndicator();
+
+ DrawCompositionString( bDrawCompAttr );
+
+ if( bDrawOtherUi )
+ DrawCandidateList();
+}
+
+static void DrawImeIndicator()
+{
+ bool bOn = g_dwState != IMEUI_STATE_OFF;
+
+ IMEUI_VERTEX PieData[17];
+ float SizeOfPie = ( float )gSkinIME.symbolHeight;
+
+ memset( PieData, 0, sizeof( PieData ) );
+
+ switch( gSkinIME.symbolPlacement )
+ {
+ case 0: // vertical centering IME indicator
+ {
+ if( SizeOfPie + g_CaretInfo.margins.right + 4 > g_screenWidth )
+ {
+ PieData[0].sx = ( -SizeOfPie / 2 ) + g_CaretInfo.margins.left - 4;
+ PieData[0].sy = ( float )g_CaretInfo.margins.top + ( g_CaretInfo.margins.bottom -
+ g_CaretInfo.margins.top ) / 2;
+ }
+ else
+ {
+ PieData[0].sx = -( SizeOfPie / 2 ) + g_CaretInfo.margins.right + gSkinIME.symbolHeight + 4;
+ PieData[0].sy = ( float )g_CaretInfo.margins.top + ( g_CaretInfo.margins.bottom -
+ g_CaretInfo.margins.top ) / 2;
+ }
+ break;
+ }
+ case 1: // upperleft
+ PieData[0].sx = 4 + ( SizeOfPie / 2 );
+ PieData[0].sy = 4 + ( SizeOfPie / 2 );
+ break;
+ case 2: // upperright
+ PieData[0].sx = g_screenWidth - ( 4 + ( SizeOfPie / 2 ) );
+ PieData[0].sy = 4 + ( SizeOfPie / 2 );
+ break;
+ case 3: // lowerright
+ PieData[0].sx = g_screenWidth - ( 4 + ( SizeOfPie / 2 ) );
+ PieData[0].sy = g_screenHeight - ( 4 + ( SizeOfPie / 2 ) );
+ break;
+ case 4: // lowerleft
+ PieData[0].sx = 4 + ( SizeOfPie / 2 );
+ PieData[0].sy = g_screenHeight - ( 4 + ( SizeOfPie / 2 ) );
+ break;
+ }
+ PieData[0].rhw = 1.0f;
+ if( bOn )
+ {
+ if( GetTickCount() - lastSwirl > 250 )
+ {
+ swirl++;
+ lastSwirl = GetTickCount();
+ if( swirl > 13 )
+ swirl = 0;
+ }
+ }
+ else
+ swirl = 0;
+ for( int t1 = 1; t1 < 16; t1++ )
+ {
+ float radian = 2.0f * 3.1415926f * ( t1 - 1 + ( bOn * swirl ) ) / 14.0f;
+ PieData[t1].sx = ( float )( PieData[0].sx + SizeOfPie / 2 * cos( radian ) );
+ PieData[t1].sy = ( float )( PieData[0].sy + SizeOfPie / 2 * sin( radian ) );
+ PieData[t1].rhw = 1.0f;
+ }
+
+ PieData[0].color = 0xffffff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ if( !gSkinIME.symbolColor && bOn )
+ {
+ {
+ PieData[1].color = 0xff0000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[2].color = 0xff3000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[3].color = 0xff6000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[4].color = 0xff9000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[5].color = 0xffC000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[6].color = 0xffff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[7].color = 0xC0ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[8].color = 0x90ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[9].color = 0x60ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[10].color = 0x30c0ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[11].color = 0x00a0ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[12].color = 0x3090ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[13].color = 0x6060ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[14].color = 0x9030ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ PieData[15].color = 0xc000ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ }
+ }
+ else
+ {
+ DWORD dwColor = bOn ? gSkinIME.symbolColor : gSkinIME.symbolColorOff;
+ for( int t1 = 1; t1 < 16; t1++ )
+ {
+ PieData[t1].color = dwColor + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 );
+ }
+ }
+ PieData[16] = PieData[1];
+
+ if( ImeUiCallback_DrawFans )
+ ImeUiCallback_DrawFans( PieData, 17 );
+
+ float fHeight = gSkinIME.symbolHeight * 0.625f;
+
+ // fix for Ent Gen #120 - reduce the height of character when Korean IME is on
+ if( GETPRIMLANG() == LANG_KOREAN && bOn )
+ {
+ fHeight *= 0.8f;
+ }
+
+ if( gSkinIME.symbolFont )
+ {
+#ifdef DS2
+ // save the font height here since DS2 shares editbox font and indicator font
+ DWORD _w, _h;
+ g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h );
+#endif //DS2
+
+ // GOS deals height in points that is 1/72nd inch and assumes display device is 96dpi.
+ fHeight = fHeight * 96 / 72;
+ gSkinIME.symbolFont->SetHeight( ( UINT )fHeight );
+ gSkinIME.symbolFont->SetColor( ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ) | gSkinIME.symbolColorText );
+
+ //
+ // draw the proper symbol over the fan
+ //
+ DWORD w, h;
+ LPCTSTR cszSymbol = ( g_dwState == IMEUI_STATE_ON ) ? g_pszIndicatior : g_aszIndicator[0];
+
+ gSkinIME.symbolFont->GetTextExtent( cszSymbol, &w, &h );
+ gSkinIME.symbolFont->SetPosition( ( int )( PieData[0].sx ) - w / 2, ( int )( PieData[0].sy ) - h / 2 );
+ gSkinIME.symbolFont->DrawText( cszSymbol );
+
+#ifdef DS2
+ // revert the height.
+ g_CaretInfo.pFont->SetHeight( _h );
+
+ // Double-check: Confirm match by testing a range of font heights to find best fit
+ DWORD _h2;
+ g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 );
+ if ( _h2 < _h )
+ {
+ for ( int i=1; _h2<_h && i<10; i++ )
+ {
+ g_CaretInfo.pFont->SetHeight( _h+i );
+ g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 );
+ }
+ }
+ else if ( _h2 > _h )
+ {
+ for ( int i=1; _h2>_h && i<10; i++ )
+ {
+ g_CaretInfo.pFont->SetHeight( _h-i );
+ g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 );
+ }
+ }
+#endif //DS2
+ }
+}
+
+static void DrawCompositionString( bool bDrawCompAttr )
+{
+ // Process timer for caret blink
+ UINT uCurrentTime = GetTickCount();
+ if( uCurrentTime - g_uCaretBlinkLast > g_uCaretBlinkTime )
+ {
+ g_uCaretBlinkLast = uCurrentTime;
+ g_bCaretDraw = !g_bCaretDraw;
+ }
+
+ int i = 0;
+
+ g_CaretInfo.pFont->SetColor( g_CaretInfo.colorComp );
+
+ DWORD uDummy;
+
+ int len = lstrlen( g_szCompositionString );
+
+ DWORD bgX = g_CaretInfo.caretX;
+ DWORD bgY = g_CaretInfo.caretY;
+ g_dwCaretX = POSITION_UNINITIALIZED;
+ g_dwCaretY = POSITION_UNINITIALIZED;
+ DWORD candX = POSITION_UNINITIALIZED;
+ DWORD candY = 0;
+ LPTSTR pszMlcs = g_szMultiLineCompString;
+
+ DWORD wCompChar = 0;
+ DWORD hCompChar = 0;
+ g_CaretInfo.pFont->GetTextExtent( TEXT( " " ), &uDummy, &hCompChar );
+ if( g_dwIMELevel == 3 && g_IMECursorBytes && g_szCompositionString[0] )
+ {
+ // shift starting point of drawing composition string according to the current caret position.
+ TCHAR temp = g_szCompositionString[g_IMECursorBytes];
+ g_szCompositionString[g_IMECursorBytes] = 0;
+ g_CaretInfo.pFont->GetTextExtent( g_szCompositionString, &wCompChar, &hCompChar );
+ g_szCompositionString[g_IMECursorBytes] = temp;
+ bgX -= wCompChar;
+ }
+
+ //
+ // Draw the background colors for IME text nuggets
+ //
+ bool saveCandPos = false;
+ DWORD cType = 1;
+ LPTSTR pszCurrentCompLine = g_szCompositionString;
+ DWORD dwCompLineStart = bgX;
+ DWORD bgXnext = bgX;
+
+ if( GETPRIMLANG() != LANG_KOREAN || g_bCaretDraw ) // Korean uses composition attribute as blinking block caret
+ for( i = 0; i < len; i += cType )
+ {
+ DWORD bgColor = 0x00000000;
+ TCHAR szChar[3];
+ szChar[0] = g_szCompositionString[i];
+ szChar[1] = szChar[2] = 0;
+#ifndef UNICODE
+ cType = 1 + ( ( _IsLeadByte(g_szCompositionString[i]) ) ? 1 : 0 );
+ if( cType == 2 && g_szCompositionString[i + 1] ) // in case we have 0 in trailbyte, we don't count it.
+ szChar[1] = g_szCompositionString[i + 1];
+#endif
+ bgX = bgXnext;
+ TCHAR cSave = g_szCompositionString[i + cType];
+ g_szCompositionString[i + cType] = 0;
+ g_CaretInfo.pFont->GetTextExtent( pszCurrentCompLine, &bgXnext, &hCompChar );
+ g_szCompositionString[i + cType] = cSave;
+ bgXnext += dwCompLineStart;
+ wCompChar = bgXnext - bgX;
+
+ switch( g_szCompAttrString[i] )
+ {
+ case ATTR_INPUT:
+ bgColor = gSkinCompStr.colorInput;
+ break;
+ case ATTR_TARGET_CONVERTED:
+ bgColor = gSkinCompStr.colorTargetConv;
+ if( IMEID_LANG( GetImeId() ) != LANG_CHS )
+ saveCandPos = true;
+ break;
+ case ATTR_CONVERTED:
+ bgColor = gSkinCompStr.colorConverted;
+ break;
+ case ATTR_TARGET_NOTCONVERTED:
+ //
+ // This is the one the user is working with currently
+ //
+ bgColor = gSkinCompStr.colorTargetNotConv;
+ break;
+ case ATTR_INPUT_ERROR:
+ bgColor = gSkinCompStr.colorInputErr;
+ break;
+ default:
+ // STOP( TEXT( "Attributes on IME characters are wrong" ) );
+ break;
+ }
+
+ if( g_dwIMELevel == 3 && bDrawCompAttr )
+ {
+ if( ( LONG )bgX >= g_CaretInfo.margins.left && ( LONG )bgX <= g_CaretInfo.margins.right )
+ {
+ if( g_dwImeUiFlags & IMEUI_FLAG_SUPPORT_CARET )
+ {
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( bgX, bgY, bgX + wCompChar, bgY + hCompChar, bgColor );
+ }
+ else
+ {
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( bgX - wCompChar, bgY, bgX, bgY + hCompChar, bgColor );
+ }
+ }
+ }
+ else if( g_dwIMELevel == 2 )
+ {
+ // make sure enough buffer space (possible space, NUL for current line, possible DBCS, 2 more NUL)
+ // are available in multiline composition string buffer
+ bool bWrite = ( pszMlcs - g_szMultiLineCompString <
+ COUNTOF( g_szMultiLineCompString ) - 5 * ( 3 - sizeof( TCHAR ) ) );
+
+ if( ( LONG )( bgX + wCompChar ) >= g_CaretInfo.margins.right )
+ {
+ bgX = dwCompLineStart = bgXnext = g_CaretInfo.margins.left;
+ bgY = bgY + hCompChar;
+ pszCurrentCompLine = g_szCompositionString + i;
+ if( bWrite )
+ {
+ if( pszMlcs == g_szMultiLineCompString || pszMlcs[-1] == 0 )
+ *pszMlcs++ = ' '; // to avoid zero length line
+ *pszMlcs++ = 0;
+ }
+ }
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( bgX, bgY, bgX + wCompChar, bgY + hCompChar, bgColor );
+ if( bWrite )
+ {
+ *pszMlcs++ = g_szCompositionString[i];
+#ifndef UNICODE
+ if( cType == 2 )
+ *pszMlcs++ = g_szCompositionString[i + 1];
+#endif
+ }
+ if( ( DWORD )i == g_IMECursorBytes )
+ {
+ g_dwCaretX = bgX;
+ g_dwCaretY = bgY;
+ }
+ }
+ if( ( saveCandPos && candX == POSITION_UNINITIALIZED ) ||
+ ( IMEID_LANG( GetImeId() ) == LANG_CHS && i / ( 3 - sizeof( TCHAR ) ) == ( int )g_IMECursorChars ) )
+ {
+ candX = bgX;
+ candY = bgY;
+ }
+ saveCandPos = false;
+ }
+
+ bgX = bgXnext;
+ if( g_dwIMELevel == 2 )
+ {
+ // in case the caret in composition string is at the end of it, draw it here
+ if( len != 0 && ( DWORD )i == g_IMECursorBytes )
+ {
+ g_dwCaretX = bgX;
+ g_dwCaretY = bgY;
+ }
+
+ // Draw composition string.
+ //assert(pszMlcs - g_szMultiLineCompString <=
+ // sizeof(g_szMultiLineCompString) / sizeof(g_szMultiLineCompString[0]) - 2);
+ *pszMlcs++ = 0;
+ *pszMlcs++ = 0;
+ DWORD x, y;
+ x = g_CaretInfo.caretX;
+ y = g_CaretInfo.caretY;
+ pszMlcs = g_szMultiLineCompString;
+ while( *pszMlcs &&
+ pszMlcs - g_szMultiLineCompString < sizeof( g_szMultiLineCompString ) / sizeof
+ ( g_szMultiLineCompString[0] ) )
+ {
+ g_CaretInfo.pFont->SetPosition( x, y );
+ g_CaretInfo.pFont->DrawText( pszMlcs );
+ pszMlcs += lstrlen( pszMlcs ) + 1;
+ x = g_CaretInfo.margins.left;
+ y += hCompChar;
+ }
+ }
+ // for changing z-order of caret
+ if( g_dwCaretX != POSITION_UNINITIALIZED && g_dwCaretY != POSITION_UNINITIALIZED )
+ {
+ DrawCaret( g_dwCaretX, g_dwCaretY, hCompChar );
+ }
+ g_dwCandX = candX;
+ g_dwCandY = candY;
+ g_hCompChar = hCompChar;
+}
+
+static void DrawCandidateList()
+{
+ DWORD candX = g_dwCandX;
+ DWORD candY = g_dwCandY;
+ DWORD hCompChar = g_hCompChar;
+ int i;
+
+ // draw candidate list / reading window
+ if( !g_dwCount || g_szCandidate[0][0] == 0 )
+ {
+ return;
+ }
+
+ // If position of candidate list is not initialized yet, set it here.
+ if( candX == POSITION_UNINITIALIZED )
+ {
+ // CHT IME in Vista doesn't have ATTR_TARGET_CONVERTED attribute while typing,
+ // so display the candidate list near the caret in the composition string
+ if( GETLANG() == LANG_CHT && GetImeId() != 0 && g_dwCaretX != POSITION_UNINITIALIZED )
+ {
+ candX = g_dwCaretX;
+ candY = g_dwCaretY;
+ }
+ else
+ {
+ candX = g_CaretInfo.caretX;
+ candY = g_CaretInfo.caretY;
+ }
+ }
+
+ SIZE largest =
+ {
+ 0,0
+ };
+
+ static DWORD uDigitWidth = 0;
+ DWORD uSpaceWidth = 0;
+ static DWORD uDigitWidthList[10];
+ static CImeUiFont_Base* pPrevFont = NULL;
+ // find out the widest width of the digits
+ if( pPrevFont != g_CaretInfo.pFont )
+ {
+ pPrevFont = g_CaretInfo.pFont;
+ for( int cnt = 0; cnt <= 9; cnt++ )
+ {
+ DWORD uDW = 0;
+ DWORD uDH = 0;
+ TCHAR ss[8];
+ swprintf_s( ss, COUNTOF(ss), TEXT( "%d" ), cnt );
+ g_CaretInfo.pFont->GetTextExtent( ss, &uDW, &uDH );
+ uDigitWidthList[cnt] = uDW;
+ if( uDW > uDigitWidth )
+ uDigitWidth = uDW;
+ if( ( signed )uDH > largest.cy )
+ largest.cy = uDH;
+ }
+ }
+ uSpaceWidth = uDigitWidth;
+ DWORD dwMarginX = ( uSpaceWidth + 1 ) / 2;
+ DWORD adwCandWidth[ MAX_CANDLIST ];
+
+ // Find out the widest width of the candidate strings
+ DWORD dwCandWidth = 0;
+ if( g_bReadingWindow && g_bHorizontalReading )
+ g_CaretInfo.pFont->GetTextExtent( g_szReadingString, ( DWORD* )&largest.cx, ( DWORD* )&largest.cy );
+ else
+ {
+ for( i = 0; g_szCandidate[i][0] && i < ( int )g_uCandPageSize; i++ )
+ {
+ DWORD tx = 0;
+ DWORD ty = 0;
+
+ if( g_bReadingWindow )
+ g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i], &tx, &ty );
+ else
+ {
+ if( g_bVerticalCand )
+ g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i] + 2, &tx, &ty );
+ else
+ g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i] + 1, &tx, &ty );
+ tx = tx + uDigitWidth + uSpaceWidth;
+ }
+
+ if( ( signed )tx > largest.cx )
+ largest.cx = tx;
+ if( ( signed )ty > largest.cy )
+ largest.cy = ty;
+ adwCandWidth[ i ] = tx;
+ dwCandWidth += tx;
+ }
+ }
+
+ DWORD slotsUsed;
+ if( g_bReadingWindow && g_dwCount < g_uCandPageSize )
+ slotsUsed = g_dwCount;
+ else
+ slotsUsed = g_uCandPageSize;
+
+ // Show candidate list above composition string if there isn't enough room below.
+ DWORD dwCandHeight;
+ if( g_bVerticalCand && !( g_bReadingWindow && g_bHorizontalReading ) )
+ dwCandHeight = slotsUsed * largest.cy + 2;
+ else
+ dwCandHeight = largest.cy + 2;
+ if( candY + hCompChar + dwCandHeight > g_screenHeight )
+ candY -= dwCandHeight;
+ else
+ candY += hCompChar;
+ if( ( int )candY < 0 )
+ candY = 0;
+
+ // Move candidate list horizontally to keep it inside of screen
+ if( !g_bReadingWindow && IMEID_LANG( GetImeId() ) == LANG_CHS )
+ dwCandWidth += dwMarginX * ( slotsUsed - 1 );
+ else if( g_bReadingWindow && g_bHorizontalReading )
+ dwCandWidth = largest.cx + 2 + dwMarginX * 2;
+ else if( g_bVerticalCand || g_bReadingWindow )
+ dwCandWidth = largest.cx + 2 + dwMarginX * 2;
+ else
+ dwCandWidth = slotsUsed * ( largest.cx + 1 ) + 1;
+ if( candX + dwCandWidth > g_screenWidth )
+ candX = g_screenWidth - dwCandWidth;
+ if( ( int )candX < 0 )
+ candX = 0;
+
+ // Draw frame and background of candidate list / reading window
+ int seperateLineX = 0;
+ int left = candX;
+ int top = candY;
+ int right = candX + dwCandWidth;
+ int bottom = candY + dwCandHeight;
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( left, top, right, bottom, gSkinIME.candColorBorder );
+ left++;
+ top++;
+ right--;
+ bottom--;
+ if( g_bReadingWindow || IMEID_LANG( GetImeId() ) == LANG_CHS )
+ {
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( left, top, right, bottom, gSkinIME.candColorBase );
+ }
+ else if( g_bVerticalCand )
+ {
+ // uDigitWidth is the max width of all digits.
+ if( !g_bReadingWindow )
+ {
+ seperateLineX = left + dwMarginX + uDigitWidth + uSpaceWidth / 2;
+ if( ImeUiCallback_DrawRect )
+ {
+ ImeUiCallback_DrawRect( left, top, seperateLineX - 1, bottom, gSkinIME.candColorBase );
+ ImeUiCallback_DrawRect( seperateLineX, top, right, bottom, gSkinIME.candColorBase );
+ }
+ }
+ }
+ else
+ {
+ for( i = 0; ( DWORD )i < slotsUsed; i++ )
+ {
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( left, top, left + largest.cx, bottom, gSkinIME.candColorBase );
+ left += largest.cx + 1;
+ }
+ }
+
+ // Draw candidates / reading strings
+ candX++;
+ candY++;
+ if( g_bReadingWindow && g_bHorizontalReading )
+ {
+ int iStart = -1, iEnd = -1, iDummy;
+ candX += dwMarginX;
+
+ // draw background of error character if it exists
+ TCHAR szTemp[COUNTOF( g_szReadingString ) ];
+ if( g_iReadingError >= 0 )
+ {
+ StringCchCopy( szTemp, COUNTOF(szTemp), g_szReadingString );
+ LPTSTR psz = szTemp + g_iReadingError;
+#ifdef UNICODE
+ psz++;
+#else
+ psz += ( _IsLeadByte( szTemp[g_iReadingError] ) ) ? 2 : 1;
+#endif
+ *psz = 0;
+ g_CaretInfo.pFont->GetTextExtent( szTemp, ( DWORD* )&iEnd, ( DWORD* )&iDummy );
+ TCHAR cSave = szTemp[ g_iReadingError ];
+ szTemp[g_iReadingError] = 0;
+ g_CaretInfo.pFont->GetTextExtent( szTemp, ( DWORD* )&iStart, ( DWORD* )&iDummy );
+ szTemp[g_iReadingError] = cSave;
+ if( ImeUiCallback_DrawRect )
+ ImeUiCallback_DrawRect( candX + iStart, candY, candX + iEnd, candY + largest.cy,
+ gSkinIME.candColorBorder );
+ }
+
+ g_CaretInfo.pFont->SetPosition( candX, candY );
+ g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand );
+ g_CaretInfo.pFont->DrawText( g_szReadingString );
+
+ // draw error character if it exists
+ if( iStart >= 0 )
+ {
+ g_CaretInfo.pFont->SetPosition( candX + iStart, candY );
+ if( gSkinIME.candColorBase != 0xffffffff || gSkinIME.candColorBorder != 0xff000000 )
+ g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand );
+ else
+ g_CaretInfo.pFont->SetColor( 0xff000000 + ( ~( ( 0x00ffffff ) & g_CaretInfo.colorCand ) ) );
+ g_CaretInfo.pFont->DrawText( szTemp + g_iReadingError );
+ }
+ }
+ else
+ {
+ for( i = 0; i < ( int )g_uCandPageSize && ( DWORD )i < g_dwCount; i++ )
+ {
+ if( g_dwSelection == ( DWORD )i )
+ {
+ if( gSkinIME.candColorBase != 0xffffffff || gSkinIME.candColorBorder != 0xff000000 )
+ g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand );
+ else
+ g_CaretInfo.pFont->SetColor( 0xff000000 + ( ~( ( 0x00ffffff ) & g_CaretInfo.colorCand ) ) );
+
+ if( ImeUiCallback_DrawRect )
+ {
+ if( g_bReadingWindow || g_bVerticalCand )
+ ImeUiCallback_DrawRect( candX, candY + i * largest.cy,
+ candX - 1 + dwCandWidth, candY + ( i + 1 ) * largest.cy,
+ gSkinIME.candColorBorder );
+ else
+ ImeUiCallback_DrawRect( candX, candY,
+ candX + adwCandWidth[i], candY + largest.cy,
+ gSkinIME.candColorBorder );
+ }
+ }
+ else
+ g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand );
+ if( g_szCandidate[i][0] != 0 )
+ {
+ if( !g_bReadingWindow && g_bVerticalCand )
+ {
+ TCHAR szOneDigit[2] =
+ {
+ g_szCandidate[i][0], 0
+ };
+ int nOneDigit = g_szCandidate[i][0] - TEXT( '0' );
+ TCHAR* szCandidateBody = g_szCandidate[i] + 2;
+
+ int dx = candX + ( seperateLineX - candX - uDigitWidthList[nOneDigit] ) / 2;
+ int dy = candY + largest.cy * i;
+
+ g_CaretInfo.pFont->SetPosition( dx, dy );
+ g_CaretInfo.pFont->DrawText( szOneDigit );
+ g_CaretInfo.pFont->SetPosition( seperateLineX + dwMarginX, dy );
+ g_CaretInfo.pFont->DrawText( szCandidateBody );
+ }
+ else if( g_bReadingWindow )
+ {
+ g_CaretInfo.pFont->SetPosition( dwMarginX + candX, candY + i * largest.cy );
+ g_CaretInfo.pFont->DrawText( g_szCandidate[i] );
+ }
+ else
+ {
+ g_CaretInfo.pFont->SetPosition( uSpaceWidth / 2 + candX, candY );
+ g_CaretInfo.pFont->DrawText( g_szCandidate[i] );
+ }
+ }
+ if( !g_bReadingWindow && !g_bVerticalCand )
+ {
+ if( IMEID_LANG( GetImeId() ) == LANG_CHS )
+ candX += adwCandWidth[i] + dwMarginX;
+ else
+ candX += largest.cx + 1;
+ }
+ }
+ }
+}
+
+static void CloseCandidateList()
+{
+ g_bCandList = false;
+ if( !g_bReadingWindow ) // fix for Ent Gen #120.
+ {
+ g_dwCount = 0;
+ memset( &g_szCandidate, 0, sizeof( g_szCandidate ) );
+ }
+}
+
+//
+// ProcessIMEMessages()
+// Processes IME related messages and acquire information
+//
+LPARAM ImeUi_ProcessMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM& lParam, bool* trapped )
+{
+ HIMC himc;
+ int len;
+ static LPARAM lAlt = 0x80000000, lCtrl = 0x80000000, lShift = 0x80000000;
+
+ *trapped = false;
+ if( !g_bInitialized || g_bDisableImeCompletely )
+ {
+ return 0;
+ }
+
+ switch( uMsg )
+ {
+ //
+ // IME Handling
+ //
+ case WM_INPUTLANGCHANGE:
+ OnInputLangChange();
+ break;
+
+ case WM_IME_SETCONTEXT:
+ //
+ // We don't want anything to display, so we have to clear lParam and pass it to DefWindowProc().
+ // Expecially important in Vista to receive IMN_CHANGECANDIDATE correctly.
+ //
+ lParam = 0;
+ break;
+
+ case WM_IME_STARTCOMPOSITION:
+ InitCompStringData();
+ *trapped = true;
+ break;
+
+ case WM_IME_COMPOSITION:
+ {
+ LONG lRet;
+ TCHAR szCompStr[COUNTOF(g_szCompositionString)];
+
+ *trapped = true;
+ if( NULL == ( himc = _ImmGetContext( hWnd ) ) )
+ {
+ break;
+ }
+
+ // ResultStr must be processed before composition string.
+ if( lParam & GCS_RESULTSTR )
+ {
+ lRet = ( LONG )_ImmGetCompositionString( himc, GCS_RESULTSTR, szCompStr,
+ COUNTOF( szCompStr ) ) / sizeof( TCHAR );
+ szCompStr[lRet] = 0;
+ CancelCompString( g_hwndCurr, false, GetCharCount( szCompStr ) );
+ StringCchCopy( g_szCompositionString, COUNTOF(g_szCompositionString), szCompStr );
+ _SendCompString();
+ InitCompStringData();
+ }
+ //
+ // Reads in the composition string.
+ //
+ if( lParam & GCS_COMPSTR )
+ {
+ //////////////////////////////////////////////////////
+ // Retrieve the latest user-selected IME candidates
+ lRet = ( LONG )_ImmGetCompositionString( himc, GCS_COMPSTR, szCompStr,
+ COUNTOF( szCompStr ) ) / sizeof( TCHAR );
+ szCompStr[lRet] = 0;
+ //
+ // Remove the whole of the string
+ //
+ CancelCompString( g_hwndCurr, false, GetCharCount( szCompStr ) );
+
+ StringCchCopy( g_szCompositionString, COUNTOF(g_szCompositionString), szCompStr );
+ lRet = _ImmGetCompositionString( himc, GCS_COMPATTR, g_szCompAttrString,
+ COUNTOF( g_szCompAttrString ) );
+ g_szCompAttrString[lRet] = 0;
+ // Older CHT IME uses composition string for reading string
+ if( GETLANG() == LANG_CHT && !GetImeId() )
+ {
+ int i, chars = lstrlen( g_szCompositionString ) / ( 3 - sizeof( TCHAR ) );
+ if( chars )
+ {
+ g_dwCount = 4;
+ g_dwSelection = ( DWORD )-1; // don't select any candidate
+
+ for( i = 3; i >= 0; i-- )
+ {
+ if( i > chars - 1 )
+ g_szCandidate[i][0] = 0;
+ else
+ {
+#ifdef UNICODE
+ g_szCandidate[i][0] = g_szCompositionString[i];
+ g_szCandidate[i][1] = 0;
+#else
+ g_szCandidate[i][0] = g_szCompositionString[i * 2];
+ g_szCandidate[i][1] = g_szCompositionString[i * 2 + 1];
+ g_szCandidate[i][2] = 0;
+#endif
+ }
+ }
+ g_uCandPageSize = MAX_CANDLIST;
+ memset( g_szCompositionString, 0, 8 );
+ g_bReadingWindow = true;
+ GetReadingWindowOrientation( 0 );
+ if( g_bHorizontalReading )
+ {
+ g_iReadingError = -1;
+ g_szReadingString[0] = 0;
+ for( i = 0; i < ( int )g_dwCount; i++ )
+ {
+ if( g_dwSelection == ( DWORD )i )
+ g_iReadingError = lstrlen( g_szReadingString );
+ LPCTSTR pszTmp = g_szCandidate[i];
+ wcscat_s( g_szReadingString, COUNTOF(g_szReadingString), pszTmp );
+ }
+ }
+ }
+ else
+ g_dwCount = 0;
+ }
+
+ // get caret position in composition string
+ g_IMECursorBytes = _ImmGetCompositionString( himc, GCS_CURSORPOS, NULL, 0 );
+ g_IMECursorChars = GetCharCountFromBytes( g_szCompositionString, g_IMECursorBytes );
+
+ if( g_dwIMELevel == 3 )
+ {
+ // send composition string via WM_CHAR
+ _SendCompString();
+ // move caret to appropreate location
+ len = GetCharCount( g_szCompositionString + g_IMECursorBytes );
+ SendControlKeys( VK_LEFT, len );
+ }
+ }
+ _ImmReleaseContext( hWnd, himc );
+ }
+ break;
+
+ case WM_IME_ENDCOMPOSITION:
+ CancelCompString( g_hwndCurr );
+ InitCompStringData();
+ break;
+
+ case WM_IME_NOTIFY:
+ switch( wParam )
+ {
+ case IMN_SETCONVERSIONMODE:
+ {
+ // Disable CHT IME software keyboard.
+ static bool bNoReentrance = false;
+ if( LANG_CHT == GETLANG() && !bNoReentrance )
+ {
+ bNoReentrance = true;
+ DWORD dwConvMode, dwSentMode;
+ _ImmGetConversionStatus( g_himcOrg, &dwConvMode, &dwSentMode );
+ const DWORD dwFlag = IME_CMODE_SOFTKBD | IME_CMODE_SYMBOL;
+ if( dwConvMode & dwFlag )
+ _ImmSetConversionStatus( g_himcOrg, dwConvMode & ~dwFlag, dwSentMode );
+ }
+ bNoReentrance = false;
+ }
+ // fall through
+ case IMN_SETOPENSTATUS:
+ if( g_bUILessMode )
+ break;
+ CheckToggleState();
+ break;
+
+ case IMN_OPENCANDIDATE:
+ case IMN_CHANGECANDIDATE:
+ if( g_bUILessMode )
+ {
+ break;
+ }
+ {
+ g_bCandList = true;
+ *trapped = true;
+ if( NULL == ( himc = _ImmGetContext( hWnd ) ) )
+ break;
+
+ LPCANDIDATELIST lpCandList;
+ DWORD dwIndex, dwBufLen;
+
+ g_bReadingWindow = false;
+ dwIndex = 0;
+ dwBufLen = _GetCandidateList( himc, dwIndex, &lpCandList );
+
+ if( dwBufLen )
+ {
+ g_dwSelection = lpCandList->dwSelection;
+ g_dwCount = lpCandList->dwCount;
+
+ int startOfPage = 0;
+ if( GETLANG() == LANG_CHS && GetImeId() )
+ {
+ // MSPY (CHS IME) has variable number of candidates in candidate window
+ // find where current page starts, and the size of current page
+ const int maxCandChar = 18 * ( 3 - sizeof( TCHAR ) );
+ UINT cChars = 0;
+ UINT i;
+ for( i = 0; i < g_dwCount; i++ )
+ {
+ UINT uLen = lstrlen(
+ ( LPTSTR )( ( DWORD )lpCandList + lpCandList->dwOffset[i] ) ) +
+ ( 3 - sizeof( TCHAR ) );
+ if( uLen + cChars > maxCandChar )
+ {
+ if( i > g_dwSelection )
+ {
+ break;
+ }
+ startOfPage = i;
+ cChars = uLen;
+ }
+ else
+ {
+ cChars += uLen;
+ }
+ }
+ g_uCandPageSize = i - startOfPage;
+ }
+ else
+ {
+ g_uCandPageSize = min( lpCandList->dwPageSize, MAX_CANDLIST );
+ startOfPage = g_bUILessMode ? lpCandList->dwPageStart :
+ ( g_dwSelection / g_uCandPageSize ) * g_uCandPageSize;
+ }
+
+ g_dwSelection = ( GETLANG() == LANG_CHS && !GetImeId() ) ? ( DWORD )-1
+ : g_dwSelection - startOfPage;
+
+ memset( &g_szCandidate, 0, sizeof( g_szCandidate ) );
+ for( UINT i = startOfPage, j = 0;
+ ( DWORD )i < lpCandList->dwCount && j < g_uCandPageSize;
+ i++, j++ )
+ {
+ ComposeCandidateLine( j,
+ ( LPTSTR )( ( DWORD )lpCandList + lpCandList->dwOffset[i] ) );
+ }
+ ImeUiCallback_Free( ( HANDLE )lpCandList );
+ _ImmReleaseContext( hWnd, himc );
+
+ // don't display selection in candidate list in case of Korean and old Chinese IME.
+ if( GETPRIMLANG() == LANG_KOREAN ||
+ GETLANG() == LANG_CHT && !GetImeId() )
+ g_dwSelection = ( DWORD )-1;
+ }
+ break;
+ }
+
+ case IMN_CLOSECANDIDATE:
+ if( g_bUILessMode )
+ {
+ break;
+ }
+ CloseCandidateList();
+ *trapped = true;
+ break;
+
+ // Jun.16,2000 05:21 by yutaka.
+ case IMN_PRIVATE:
+ {
+ if( !g_bCandList )
+ {
+ GetReadingString( hWnd );
+ }
+ // Trap some messages to hide reading window
+ DWORD dwId = GetImeId();
+ switch( dwId )
+ {
+ case IMEID_CHT_VER42:
+ case IMEID_CHT_VER43:
+ case IMEID_CHT_VER44:
+ case IMEID_CHS_VER41:
+ case IMEID_CHS_VER42:
+ if( ( lParam == 1 ) || ( lParam == 2 ) )
+ {
+ *trapped = true;
+ }
+ break;
+ case IMEID_CHT_VER50:
+ case IMEID_CHT_VER51:
+ case IMEID_CHT_VER52:
+ case IMEID_CHT_VER60:
+ case IMEID_CHS_VER53:
+ if( ( lParam == 16 ) || ( lParam == 17 ) || ( lParam == 26 ) || ( lParam == 27 ) ||
+ ( lParam == 28 ) )
+ {
+ *trapped = true;
+ }
+ break;
+ }
+ }
+ break;
+
+ default:
+ *trapped = true;
+ break;
+ }
+ break;
+
+ // fix for #15386 - When Text Service Framework is installed in Win2K, Alt+Shift and Ctrl+Shift combination (to switch
+ // input locale / keyboard layout) doesn't send WM_KEYUP message for the key that is released first. We need to check
+ // if these keys are actually up whenever we receive key up message for other keys.
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ if( !( lAlt & 0x80000000 ) && wParam != VK_MENU && ( GetAsyncKeyState( VK_MENU ) & 0x8000 ) == 0 )
+ {
+ PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_MENU, ( lAlt & 0x01ff0000 ) | 0xC0000001 );
+ }
+ else if( !( lCtrl & 0x80000000 ) && wParam != VK_CONTROL &&
+ ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) == 0 )
+ {
+ PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_CONTROL, ( lCtrl & 0x01ff0000 ) | 0xC0000001 );
+ }
+ else if( !( lShift & 0x80000000 ) && wParam != VK_SHIFT && ( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) == 0 )
+ {
+ PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_SHIFT, ( lShift & 0x01ff0000 ) | 0xC0000001 );
+ }
+ // fall through WM_KEYDOWN / WM_SYSKEYDOWN
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ {
+ switch( wParam )
+ {
+ case VK_MENU:
+ lAlt = lParam;
+ break;
+ case VK_SHIFT:
+ lShift = lParam;
+ break;
+ case VK_CONTROL:
+ lCtrl = lParam;
+ break;
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+void ImeUi_SetCaretPosition( UINT x, UINT y )
+{
+ if( !g_bInitialized )
+ return;
+ g_CaretInfo.caretX = x;
+ g_CaretInfo.caretY = y;
+}
+
+void ImeUi_SetCompStringAppearance( CImeUiFont_Base* pFont, DWORD color, const RECT* prc )
+{
+ if( !g_bInitialized )
+ return;
+ g_CaretInfo.pFont = pFont;
+ g_CaretInfo.margins = *prc;
+
+ if( 0 == gSkinIME.candColorText )
+ g_CaretInfo.colorCand = color;
+ else
+ g_CaretInfo.colorCand = gSkinIME.candColorText;
+ if( 0 == gSkinIME.compColorText )
+ g_CaretInfo.colorComp = color;
+ else
+ g_CaretInfo.colorComp = gSkinIME.compColorText;
+}
+
+void ImeUi_SetState( DWORD dwState )
+{
+ if( !g_bInitialized )
+ return;
+ HIMC himc;
+ if( dwState == IMEUI_STATE_ON )
+ {
+ ImeUi_EnableIme( true );
+ }
+ if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) )
+ {
+ if( g_bDisableImeCompletely )
+ dwState = IMEUI_STATE_OFF;
+
+ bool bOn = dwState == IMEUI_STATE_ON; // for non-Chinese IME
+ switch( GETPRIMLANG() )
+ {
+ case LANG_CHINESE:
+ {
+ // toggle Chinese IME
+ DWORD dwId;
+ DWORD dwConvMode = 0, dwSentMode = 0;
+ if( ( g_bChineseIME && dwState == IMEUI_STATE_OFF ) ||
+ ( !g_bChineseIME && dwState != IMEUI_STATE_OFF ) )
+ {
+ _ImmSimulateHotKey( g_hwndCurr, IME_THOTKEY_IME_NONIME_TOGGLE );
+ _PumpMessage();
+ }
+ if( dwState != IMEUI_STATE_OFF )
+ {
+ dwId = GetImeId();
+ if( dwId )
+ {
+ _ImmGetConversionStatus( himc, &dwConvMode, &dwSentMode );
+ dwConvMode = ( dwState == IMEUI_STATE_ON )
+ ? ( dwConvMode | IME_CMODE_NATIVE )
+ : ( dwConvMode & ~IME_CMODE_NATIVE );
+ _ImmSetConversionStatus( himc, dwConvMode, dwSentMode );
+ }
+ }
+ break;
+ }
+ case LANG_KOREAN:
+ // toggle Korean IME
+ if( ( bOn && g_dwState != IMEUI_STATE_ON ) || ( !bOn && g_dwState == IMEUI_STATE_ON ) )
+ {
+ _ImmSimulateHotKey( g_hwndCurr, IME_KHOTKEY_ENGLISH );
+ }
+ break;
+ case LANG_JAPANESE:
+ _ImmSetOpenStatus( himc, bOn );
+ break;
+ }
+ _ImmReleaseContext( g_hwndCurr, himc );
+ CheckToggleState();
+ }
+}
+
+DWORD ImeUi_GetState()
+{
+ if( !g_bInitialized )
+ return IMEUI_STATE_OFF;
+ CheckToggleState();
+ return g_dwState;
+}
+
+void ImeUi_EnableIme( bool bEnable )
+{
+ if( !g_bInitialized || !g_hwndCurr )
+ return;
+ if( g_bDisableImeCompletely )
+ bEnable = false;
+
+ if( g_hwndCurr == g_hwndMain )
+ {
+ HIMC himcDbg;
+ himcDbg = _ImmAssociateContext( g_hwndCurr, bEnable? g_himcOrg : NULL );
+ }
+ g_bImeEnabled = bEnable;
+ if( bEnable )
+ {
+ CheckToggleState();
+ }
+ CTsfUiLessMode::EnableUiUpdates( bEnable );
+}
+
+bool ImeUi_IsEnabled( void )
+{
+ return g_bImeEnabled;
+}
+
+bool ImeUi_Initialize( HWND hwnd, bool bDisable )
+{
+ if( g_bInitialized )
+ {
+ return true;
+ }
+ g_hwndMain = hwnd;
+ g_disableCicero.Initialize();
+
+ g_osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOA );
+ GetVersionExA( &g_osi );
+
+ bool bUnicodeImm = false;
+ // IMM in NT or Win98 supports Unicode
+ if( g_osi.dwPlatformId == VER_PLATFORM_WIN32_NT ||
+ ( g_osi.dwMajorVersion > 4 ) ||
+ ( g_osi.dwMajorVersion == 4 ) && ( g_osi.dwMinorVersion > 0 ) )
+ {
+ bUnicodeImm = true;
+ }
+
+ g_hImmDll = LoadLibraryA( "imm32.dll" );
+ g_bDisableImeCompletely = false;
+
+ if( g_hImmDll )
+ {
+ _ImmLockIMC = ( LPINPUTCONTEXT2 ( WINAPI* )( HIMC hIMC ) )GetProcAddress( g_hImmDll, "ImmLockIMC" );
+ _ImmUnlockIMC = ( BOOL ( WINAPI* )( HIMC hIMC ) )GetProcAddress( g_hImmDll, "ImmUnlockIMC" );
+ _ImmLockIMCC = ( LPVOID ( WINAPI* )( HIMCC hIMCC ) )GetProcAddress( g_hImmDll, "ImmLockIMCC" );
+ _ImmUnlockIMCC = ( BOOL ( WINAPI* )( HIMCC hIMCC ) )GetProcAddress( g_hImmDll, "ImmUnlockIMCC" );
+ BOOL ( WINAPI* _ImmDisableTextFrameService )( DWORD ) = ( BOOL ( WINAPI* )( DWORD ) )GetProcAddress( g_hImmDll,
+ "ImmDisableTextFrameService" );
+ if( _ImmDisableTextFrameService )
+ {
+ _ImmDisableTextFrameService( ( DWORD )-1 );
+ }
+ }
+ else
+ {
+ g_bDisableImeCompletely = true;
+ return false;
+ }
+#ifdef UNICODE
+ if ( bUnicodeImm )
+ {
+ _ImmGetCompositionString = ImmGetCompositionStringW;
+ _ImmGetCandidateList = ImmGetCandidateListW;
+ _GetCandidateList = GetCandidateList;
+ }
+ else
+ {
+ _ImmGetCandidateList = ImmGetCandidateListA;
+ _ImmGetCompositionString = AW_ImmGetCompositionString;
+ _GetCandidateList = AW_GetCandidateList;
+ }
+#else
+ if( bUnicodeImm )
+ {
+ _ImmGetCompositionString = WA_ImmGetCompositionString;
+ _ImmGetCandidateList = ImmGetCandidateListA;
+ _GetCandidateList = WA_GetCandidateList;
+ }
+ else
+ {
+ _ImmGetCompositionString = ImmGetCompositionStringA;
+ _ImmGetCandidateList = ImmGetCandidateListA;
+ _GetCandidateList = GetCandidateList;
+ }
+#endif
+
+ // There are the following combinations of code config, window type, and the method of sending characters.
+ // Wnd: Unicode, Code: Unicode, Method: SendMessageW (SendMessageW must be supported since RegisterClassW is successful)
+ // Wnd: non Uni, Code: Unicode, Method: AW_SendCompString (Send characters in multibyte after W->A conversion)
+ // Wnd: Unicode, Code: non Uni, Method: SendMessageA (System does A->W conversion) - possible, but unlikely to be used.
+ // Wnd: non Uni, Code: non Uni, Method: SendMessageA
+#ifdef UNICODE
+ if ( !IsWindowUnicode( hwnd ) )
+ {
+ _SendCompString = AW_SendCompString;
+ }
+ else
+#endif
+ {
+ _SendCompString = SendCompString;
+#ifdef UNICODE
+ _SendMessage = SendMessageW;
+#endif
+ }
+
+ // turn init flag on so that subsequent calls to ImeUi functions work.
+ g_bInitialized = true;
+
+ ImeUi_SetWindow( g_hwndMain );
+ g_himcOrg = _ImmGetContext( g_hwndMain );
+ _ImmReleaseContext( g_hwndMain, g_himcOrg );
+
+ if( !g_himcOrg )
+ {
+ bDisable = true;
+ }
+
+ // the following pointers to function has to be initialized before this function is called.
+ if( bDisable ||
+ !ImeUiCallback_Malloc ||
+ !ImeUiCallback_Free
+ )
+ {
+ g_bDisableImeCompletely = true;
+ ImeUi_EnableIme( false );
+ g_bInitialized = bDisable;
+ return false;
+ }
+
+ g_uCaretBlinkTime = GetCaretBlinkTime();
+
+#ifndef UNICODE
+ // Check if system is SBCS system
+ CPINFO cpi;
+ BOOL bRc = GetCPInfo( CP_ACP, &cpi );
+ if( bRc )
+ {
+ if( cpi.MaxCharSize == 1 )
+ {
+ g_bDisableImeCompletely = true; // SBCS system. Disable IME.
+ }
+ }
+#endif
+
+ g_CaretInfo.caretX = 0;
+ g_CaretInfo.caretY = 0;
+ g_CaretInfo.pFont = 0;
+ g_CaretInfo.colorComp = 0;
+ g_CaretInfo.colorCand = 0;
+ g_CaretInfo.margins.left = 0;
+ g_CaretInfo.margins.right = 640;
+ g_CaretInfo.margins.top = 0;
+ g_CaretInfo.margins.bottom = 480;
+
+ CheckInputLocale();
+ OnInputLangChangeWorker();
+ ImeUi_SetSupportLevel( 2 );
+
+ // SetupTSFSinks has to be called before CheckToggleState to make it work correctly.
+ g_bUILessMode = CTsfUiLessMode::SetupSinks() != FALSE;
+ CheckToggleState();
+ if( g_bUILessMode )
+ {
+ g_bChineseIME = ( GETPRIMLANG() == LANG_CHINESE ) && CTsfUiLessMode::CurrentInputLocaleIsIme();
+ CTsfUiLessMode::UpdateImeState();
+ }
+ ImeUi_EnableIme( false );
+
+ return true;
+}
+
+void ImeUi_Uninitialize()
+{
+ if( !g_bInitialized )
+ {
+ return;
+ }
+ CTsfUiLessMode::ReleaseSinks();
+ if( g_hwndMain )
+ {
+ ImmAssociateContext( g_hwndMain, g_himcOrg );
+ }
+ g_hwndMain = NULL;
+ g_himcOrg = NULL;
+ if( g_hImmDll )
+ {
+ FreeLibrary( g_hImmDll );
+ g_hImmDll = NULL;
+ }
+ g_disableCicero.Uninitialize();
+ g_bInitialized = false;
+}
+
+//
+// GetImeId( UINT uIndex )
+// returns
+// returned value:
+// 0: In the following cases
+// - Non Chinese IME input locale
+// - Older Chinese IME
+// - Other error cases
+//
+// Othewise:
+// When uIndex is 0 (default)
+// bit 31-24: Major version
+// bit 23-16: Minor version
+// bit 15-0: Language ID
+// When uIndex is 1
+// pVerFixedInfo->dwFileVersionLS
+//
+// Use IMEID_VER and IMEID_LANG macro to extract version and language information.
+//
+static DWORD GetImeId( UINT uIndex )
+{
+ static HKL hklPrev = 0;
+ static DWORD dwRet[2] =
+ {
+ 0, 0
+ };
+
+ DWORD dwVerSize;
+ DWORD dwVerHandle;
+ LPVOID lpVerBuffer;
+ LPVOID lpVerData;
+ UINT cbVerData;
+ char szTmp[1024];
+
+ if( uIndex >= sizeof( dwRet ) / sizeof( dwRet[0] ) )
+ return 0;
+
+ HKL kl = g_hklCurrent;
+ if( hklPrev == kl )
+ {
+ return dwRet[uIndex];
+ }
+ hklPrev = kl;
+ DWORD dwLang = ( ( DWORD )kl & 0xffff );
+
+ if( g_bUILessMode && GETLANG() == LANG_CHT )
+ {
+ // In case of Vista, artifitial value is returned so that it's not considered as older IME.
+ dwRet[0] = IMEID_CHT_VER_VISTA;
+ dwRet[1] = 0;
+ return dwRet[0];
+ }
+
+ if( kl != _CHT_HKL_NEW_PHONETIC && kl != _CHT_HKL_NEW_CHANG_JIE
+ && kl != _CHT_HKL_NEW_QUICK && kl != _CHT_HKL_HK_CANTONESE && kl != _CHS_HKL )
+ {
+ goto error;
+ }
+
+ if( _ImmGetIMEFileNameA( kl, szTmp, sizeof( szTmp ) - 1 ) <= 0 )
+ {
+ goto error;
+ }
+
+ if( !_GetReadingString ) // IME that doesn't implement private API
+ {
+#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
+ if( ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME, -1 ) != 2 )
+ && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME2, -1 ) != 2 )
+ && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME3, -1 ) != 2 )
+ && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHS_IMEFILENAME, -1 ) != 2 )
+ && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHS_IMEFILENAME2, -1 ) != 2 )
+ )
+ {
+ goto error;
+ }
+ }
+
+ dwVerSize = GetFileVersionInfoSizeA( szTmp, &dwVerHandle );
+ if( dwVerSize )
+ {
+ lpVerBuffer = ( LPVOID )ImeUiCallback_Malloc( dwVerSize );
+ if( lpVerBuffer )
+ {
+ if( GetFileVersionInfoA( szTmp, dwVerHandle, dwVerSize, lpVerBuffer ) )
+ {
+ if( VerQueryValueA( lpVerBuffer, "\\", &lpVerData, &cbVerData ) )
+ {
+#define pVerFixedInfo ((VS_FIXEDFILEINFO FAR*)lpVerData)
+ DWORD dwVer = pVerFixedInfo->dwFileVersionMS;
+ dwVer = ( dwVer & 0x00ff0000 ) << 8 | ( dwVer & 0x000000ff ) << 16;
+ if( _GetReadingString ||
+ dwLang == LANG_CHT && (
+ dwVer == MAKEIMEVERSION(4, 2) ||
+ dwVer == MAKEIMEVERSION(4, 3) ||
+ dwVer == MAKEIMEVERSION(4, 4) ||
+ dwVer == MAKEIMEVERSION(5, 0) ||
+ dwVer == MAKEIMEVERSION(5, 1) ||
+ dwVer == MAKEIMEVERSION(5, 2) ||
+ dwVer == MAKEIMEVERSION(6, 0) )
+ ||
+ dwLang == LANG_CHS && (
+ dwVer == MAKEIMEVERSION(4, 1) ||
+ dwVer == MAKEIMEVERSION(4, 2) ||
+ dwVer == MAKEIMEVERSION(5, 3) ) )
+ {
+ dwRet[0] = dwVer | dwLang;
+ dwRet[1] = pVerFixedInfo->dwFileVersionLS;
+ ImeUiCallback_Free( lpVerBuffer );
+ return dwRet[0];
+ }
+#undef pVerFixedInfo
+ }
+ }
+ }
+ ImeUiCallback_Free( lpVerBuffer );
+ }
+
+ // The flow comes here in the following conditions
+ // - Non Chinese IME input locale
+ // - Older Chinese IME
+ // - Other error cases
+error:
+ dwRet[0] = dwRet[1] = 0;
+ return dwRet[uIndex];
+}
+
+static void GetReadingString( HWND hWnd )
+{
+ if( g_bUILessMode )
+ {
+ return;
+ }
+ DWORD dwId = GetImeId();
+ if( !dwId )
+ {
+ return;
+ }
+
+ HIMC himc;
+ himc = _ImmGetContext( hWnd );
+ if( !himc )
+ return;
+
+ DWORD dwlen = 0;
+ DWORD dwerr = 0;
+ WCHAR wzBuf[16]; // We believe 16 wchars are big enough to hold reading string after having discussion with CHT IME team.
+ WCHAR* wstr = wzBuf;
+ bool unicode = FALSE;
+ LPINPUTCONTEXT2 lpIMC = NULL;
+
+ if( _GetReadingString )
+ {
+ BOOL bVertical;
+ UINT uMaxUiLen;
+ dwlen = _GetReadingString( himc, 0, NULL, ( PINT )&dwerr, &bVertical, &uMaxUiLen );
+ if( dwlen )
+ {
+ if( dwlen > COUNTOF(wzBuf) )
+ {
+ dwlen = COUNTOF(wzBuf);
+ }
+ dwlen = _GetReadingString( himc, dwlen, wstr, ( PINT )&dwerr, &bVertical, &uMaxUiLen );
+ }
+
+ g_bHorizontalReading = bVertical == 0;
+ unicode = true;
+ }
+ else // IMEs that doesn't implement Reading String API
+ {
+ lpIMC = _ImmLockIMC( himc );
+
+ // *** hacking code from Michael Yang ***
+
+ LPBYTE p = 0;
+
+ switch( dwId )
+ {
+
+ case IMEID_CHT_VER42: // New(Phonetic/ChanJie)IME98 : 4.2.x.x // Win98
+ case IMEID_CHT_VER43: // New(Phonetic/ChanJie)IME98a : 4.3.x.x // WinMe, Win2k
+ case IMEID_CHT_VER44: // New ChanJie IME98b : 4.4.x.x // WinXP
+
+ p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 24 );
+ if( !p ) break;
+ dwlen = *( DWORD* )( p + 7 * 4 + 32 * 4 ); //m_dwInputReadStrLen
+ dwerr = *( DWORD* )( p + 8 * 4 + 32 * 4 ); //m_dwErrorReadStrStart
+ wstr = ( WCHAR* )( p + 56 );
+ unicode = TRUE;
+ break;
+
+ case IMEID_CHT_VER50: // 5.0.x.x // WinME
+
+ p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 3 * 4 ); // PCKeyCtrlManager
+ if( !p ) break;
+ p = *( LPBYTE* )( ( LPBYTE )p + 1 * 4 + 5 * 4 + 4 * 2 ); // = PCReading = &STypingInfo
+ if( !p ) break;
+ dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 ); //m_dwDisplayStringLength;
+ dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 + 1 * 4 ); //m_dwDisplayErrorStart;
+ wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 );
+ unicode = FALSE;
+ break;
+
+ case IMEID_CHT_VER51: // 5.1.x.x // IME2002(w/OfficeXP)
+ case IMEID_CHT_VER52: // 5.2.x.x // (w/whistler)
+ case IMEID_CHS_VER53: // 5.3.x.x // SCIME2k or MSPY3 (w/OfficeXP and Whistler)
+
+ p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 4 ); // PCKeyCtrlManager
+ if( !p ) break;
+ p = *( LPBYTE* )( ( LPBYTE )p + 1 * 4 + 5 * 4 ); // = PCReading = &STypingInfo
+ if( !p ) break;
+ dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * 2 ); //m_dwDisplayStringLength;
+ dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * 2 + 1 * 4 ); //m_dwDisplayErrorStart;
+ wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 );
+ unicode = TRUE;
+ break;
+
+ // the code tested only with Win 98 SE (MSPY 1.5/ ver 4.1.0.21)
+ case IMEID_CHS_VER41:
+ {
+ int offset;
+ offset = ( GetImeId( 1 ) >= 0x00000002 ) ? 8 : 7;
+
+ p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + offset * 4 );
+ if( !p ) break;
+ dwlen = *( DWORD* )( p + 7 * 4 + 16 * 2 * 4 );
+ dwerr = *( DWORD* )( p + 8 * 4 + 16 * 2 * 4 );
+ dwerr = min( dwerr, dwlen );
+ wstr = ( WCHAR* )( p + 6 * 4 + 16 * 2 * 1 );
+ unicode = TRUE;
+ break;
+ }
+
+ case IMEID_CHS_VER42: // 4.2.x.x // SCIME98 or MSPY2 (w/Office2k, Win2k, WinME, etc)
+ {
+ int nTcharSize = IsNT() ? sizeof( WCHAR ) : sizeof( char );
+ p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 1 * 4 + 1 * 4 + 6 * 4 ); // = PCReading = &STypintInfo
+ if( !p ) break;
+ dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * nTcharSize ); //m_dwDisplayStringLength;
+ dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * nTcharSize + 1 * 4 ); //m_dwDisplayErrorStart;
+ wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 ); //m_tszDisplayString
+ unicode = IsNT() ? TRUE : FALSE;
+ }
+ } // switch
+
+ g_szCandidate[0][0] = 0;
+ g_szCandidate[1][0] = 0;
+ g_szCandidate[2][0] = 0;
+ g_szCandidate[3][0] = 0;
+ }
+ g_dwCount = dwlen;
+ g_dwSelection = ( DWORD )-1; // do not select any char
+ if( unicode )
+ {
+ int i;
+ for( i = 0; ( DWORD )i < dwlen; i++ ) // dwlen > 0, if known IME : yutakah
+ {
+ if( dwerr <= ( DWORD )i && g_dwSelection == ( DWORD )-1 )
+ { // select error char
+ g_dwSelection = i;
+ }
+#ifdef UNICODE
+ g_szCandidate[i][0] = wstr[i];
+ g_szCandidate[i][1] = 0;
+#else
+ char mbc[3];
+ mbc[1] = 0;
+ mbc[2] = 0;
+ WideCharToMultiByte( g_uCodePage, 0, wstr + i, 1, mbc, sizeof( mbc ), NULL, NULL );
+
+ g_szCandidate[i][0] = mbc[0];
+ g_szCandidate[i][1] = mbc[1];
+ g_szCandidate[i][2] = 0;
+#endif
+ }
+ g_szCandidate[i][0] = 0;
+ }
+ else
+ {
+ char* p = ( char* )wstr;
+ int i, j;
+ for( i = 0, j = 0; ( DWORD )i < dwlen; i++, j++ ) // dwlen > 0, if known IME : yutakah
+ {
+ if( dwerr <= ( DWORD )i && g_dwSelection == ( DWORD )-1 )
+ {
+ g_dwSelection = ( DWORD )j;
+ }
+#ifdef UNICODE
+ MultiByteToWideChar( g_uCodePage, 0, p + i, 1 + ( _IsLeadByte( p[i] ) ? 1 : 0 ),
+ g_szCandidate[j], 1 );
+ if ( _IsLeadByte( p[i] ) )
+ {
+ i++;
+ }
+#else
+ g_szCandidate[j][0] = p[i];
+ g_szCandidate[j][1] = 0;
+ g_szCandidate[j][2] = 0;
+ if( _IsLeadByte(p[i]) )
+ {
+ i++;
+ g_szCandidate[j][1] = p[i];
+ }
+#endif
+ }
+ g_szCandidate[j][0] = 0;
+ g_dwCount = j;
+ }
+ if( !_GetReadingString )
+ {
+ _ImmUnlockIMCC( lpIMC->hPrivate );
+ _ImmUnlockIMC( himc );
+ GetReadingWindowOrientation( dwId );
+ }
+ _ImmReleaseContext( hWnd, himc );
+
+ g_bReadingWindow = true;
+ if( g_bHorizontalReading )
+ {
+ g_iReadingError = -1;
+ g_szReadingString[0] = 0;
+ for( UINT i = 0; i < g_dwCount; i++ )
+ {
+ if( g_dwSelection == ( DWORD )i )
+ g_iReadingError = lstrlen( g_szReadingString );
+ LPCTSTR pszTmp = g_szCandidate[i];
+ wcscat_s( g_szReadingString, COUNTOF(g_szReadingString), pszTmp );
+ }
+ }
+ g_uCandPageSize = MAX_CANDLIST;
+}
+
+
+static struct
+{
+ bool m_bCtrl;
+ bool m_bShift;
+ bool m_bAlt;
+ UINT m_uVk;
+}
+ aHotKeys[] =
+{
+ false, false, false, VK_APPS,
+ true, false, false, '8',
+ true, false, false, 'Y',
+ true, false, false, VK_DELETE,
+ true, false, false, VK_F7,
+ true, false, false, VK_F9,
+ true, false, false, VK_F10,
+ true, false, false, VK_F11,
+ true, false, false, VK_F12,
+ false, false, false, VK_F2,
+ false, false, false, VK_F3,
+ false, false, false, VK_F4,
+ false, false, false, VK_F5,
+ false, false, false, VK_F10,
+ false, true, false, VK_F6,
+ false, true, false, VK_F7,
+ false, true, false, VK_F8,
+ true, true, false, VK_F10,
+ true, true, false, VK_F11,
+ true, false, false, VK_CONVERT,
+ true, false, false, VK_SPACE,
+ true, false, true, 0xbc, // Alt + Ctrl + ',': SW keyboard for Trad. Chinese IME
+ true, false, false, VK_TAB, // ATOK2005's Ctrl+TAB
+};
+
+//
+// Ignores specific keys when IME is on. Returns true if the message is a hot key to ignore.
+// - Caller doesn't have to check whether IME is on.
+// - This function must be called before TranslateMessage() is called.
+//
+bool ImeUi_IgnoreHotKey( const MSG* pmsg )
+{
+ if( !g_bInitialized || !pmsg )
+ return false;
+
+ if( pmsg->wParam == VK_PROCESSKEY && ( pmsg->message == WM_KEYDOWN || pmsg->message == WM_SYSKEYDOWN ) )
+ {
+ bool bCtrl, bShift, bAlt;
+ UINT uVkReal = _ImmGetVirtualKey( pmsg->hwnd );
+ // special case #1 - VK_JUNJA toggles half/full width input mode in Korean IME.
+ // This VK (sent by Alt+'=' combo) is ignored regardless of the modifier state.
+ if( uVkReal == VK_JUNJA )
+ {
+ return true;
+ }
+ // special case #2 - disable right arrow key that switches the candidate list to expanded mode in CHT IME.
+ if( uVkReal == VK_RIGHT && g_bCandList && GETLANG() == LANG_CHT )
+ {
+ return true;
+ }
+#ifndef ENABLE_HANJA_KEY
+ // special case #3 - we disable VK_HANJA key because 1. some Korean fonts don't Hanja and 2. to reduce testing cost.
+ if( uVkReal == VK_HANJA && GETPRIMLANG() == LANG_KOREAN )
+ {
+ return true;
+ }
+#endif
+ bCtrl = ( GetKeyState( VK_CONTROL ) & 0x8000 ) ? true : false;
+ bShift = ( GetKeyState( VK_SHIFT ) & 0x8000 ) ? true : false;
+ bAlt = ( GetKeyState( VK_MENU ) & 0x8000 ) ? true : false;
+ for( int i = 0; i < COUNTOF(aHotKeys); i++ )
+ {
+ if( aHotKeys[i].m_bCtrl == bCtrl &&
+ aHotKeys[i].m_bShift == bShift &&
+ aHotKeys[i].m_bAlt == bAlt &&
+ aHotKeys[i].m_uVk == uVkReal )
+ return true;
+ }
+ }
+ return false;
+}
+
+void ImeUi_FinalizeString( bool bSend )
+{
+ HIMC himc;
+ static bool bProcessing = false; // to avoid infinite recursion
+ if( !g_bInitialized || bProcessing || NULL == ( himc = _ImmGetContext( g_hwndCurr ) ) )
+ return;
+ bProcessing = true;
+
+ if( g_dwIMELevel == 2 && bSend )
+ {
+ // Send composition string to app.
+ LONG lRet = lstrlen( g_szCompositionString );
+ assert( lRet >= 2 );
+ // In case of CHT IME, don't send the trailing double byte space, if it exists.
+#ifdef UNICODE
+ if ( GETLANG() == LANG_CHT && (lRet >= 1)
+ && g_szCompositionString[lRet - 1] == 0x3000 )
+ {
+ lRet--;
+ }
+#else
+ if( GETLANG() == LANG_CHT && ( lRet >= 2 )
+ && ( BYTE )( g_szCompositionString[lRet - 2] ) == 0xa1
+ && ( BYTE )( g_szCompositionString[lRet - 1] ) == 0x40 )
+ {
+ lRet -= 2;
+ }
+#endif
+ _SendCompString();
+ }
+
+ InitCompStringData();
+ // clear composition string in IME
+ _ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 );
+ if( g_bUILessMode )
+ {
+ // For some reason ImmNotifyIME doesn't work on DaYi and Array CHT IMEs. Cancel composition string by setting zero-length string.
+ ImmSetCompositionString( himc, SCS_SETSTR, TEXT( "" ), sizeof( TCHAR ), TEXT( "" ), sizeof( TCHAR ) );
+ }
+ // the following line is necessary as Korean IME doesn't close cand list when comp string is cancelled.
+ _ImmNotifyIME( himc, NI_CLOSECANDIDATE, 0, 0 );
+ _ImmReleaseContext( g_hwndCurr, himc );
+ // Zooty2 RAID #4759: Sometimes application doesn't receive IMN_CLOSECANDIDATE on Alt+Tab
+ // So the same code for IMN_CLOSECANDIDATE is replicated here.
+ CloseCandidateList();
+ bProcessing = false;
+ return;
+}
+
+static void SetCompStringColor()
+{
+ // change color setting according to current IME level.
+ DWORD dwTranslucency = ( g_dwIMELevel == 2 ) ? 0xff000000 : ( ( DWORD )gSkinIME.compTranslucence << 24 );
+ gSkinCompStr.colorInput = dwTranslucency | gSkinIME.compColorInput;
+ gSkinCompStr.colorTargetConv = dwTranslucency | gSkinIME.compColorTargetConv;
+ gSkinCompStr.colorConverted = dwTranslucency | gSkinIME.compColorConverted;
+ gSkinCompStr.colorTargetNotConv = dwTranslucency | gSkinIME.compColorTargetNotConv;
+ gSkinCompStr.colorInputErr = dwTranslucency | gSkinIME.compColorInputErr;
+}
+
+static void SetSupportLevel( DWORD dwImeLevel )
+{
+ if( dwImeLevel < 2 || 3 < dwImeLevel )
+ return;
+ if( GETPRIMLANG() == LANG_KOREAN )
+ {
+ dwImeLevel = 3;
+ }
+ g_dwIMELevel = dwImeLevel;
+ // cancel current composition string.
+ ImeUi_FinalizeString();
+ SetCompStringColor();
+}
+
+void ImeUi_SetSupportLevel( DWORD dwImeLevel )
+{
+ if( !g_bInitialized )
+ return;
+ g_dwIMELevelSaved = dwImeLevel;
+ SetSupportLevel( dwImeLevel );
+}
+
+void ImeUi_SetAppearance( const IMEUI_APPEARANCE* pia )
+{
+ if( !g_bInitialized || NULL == pia )
+ return;
+ gSkinIME = *pia;
+ gSkinIME.symbolColor &= 0xffffff; // mask translucency
+ gSkinIME.symbolColorOff &= 0xffffff; // mask translucency
+ gSkinIME.symbolColorText &= 0xffffff; // mask translucency
+ gSkinIME.compColorInput &= 0xffffff; // mask translucency
+ gSkinIME.compColorTargetConv &= 0xffffff; // mask translucency
+ gSkinIME.compColorConverted &= 0xffffff; // mask translucency
+ gSkinIME.compColorTargetNotConv &= 0xffffff; // mask translucency
+ gSkinIME.compColorInputErr &= 0xffffff; // mask translucency
+ SetCompStringColor();
+}
+
+void ImeUi_GetAppearance( IMEUI_APPEARANCE* pia )
+{
+ if( g_bInitialized && pia )
+ {
+ *pia = gSkinIME;
+ }
+}
+
+static void CheckToggleState()
+{
+ CheckInputLocale();
+
+ // In Vista, we have to use TSF since few IMM functions don't work as expected.
+ // WARNING: Because of timing, g_dwState and g_bChineseIME may not be updated
+ // immediately after the change on IME states by user.
+ if( g_bUILessMode )
+ {
+ return;
+ }
+
+ bool bIme = _ImmIsIME( g_hklCurrent ) != 0
+ && ( ( 0xF0000000 & ( DWORD )g_hklCurrent ) == 0xE0000000 ); // Hack to detect IME correctly. When IME is running as TIP, ImmIsIME() returns true for CHT US keyboard.
+ g_bChineseIME = ( GETPRIMLANG() == LANG_CHINESE ) && bIme;
+
+ HIMC himc;
+ if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) )
+ {
+ if( g_bChineseIME )
+ {
+ DWORD dwConvMode, dwSentMode;
+ _ImmGetConversionStatus( himc, &dwConvMode, &dwSentMode );
+ g_dwState = ( dwConvMode & IME_CMODE_NATIVE ) ? IMEUI_STATE_ON : IMEUI_STATE_ENGLISH;
+ }
+ else
+ {
+ g_dwState = ( bIme && _ImmGetOpenStatus( himc ) != 0 ) ? IMEUI_STATE_ON : IMEUI_STATE_OFF;
+ }
+ _ImmReleaseContext( g_hwndCurr, himc );
+ }
+ else
+ g_dwState = IMEUI_STATE_OFF;
+}
+
+void ImeUi_SetInsertMode( bool bInsert )
+{
+ if( !g_bInitialized )
+ return;
+ g_bInsertMode = bInsert;
+}
+
+bool ImeUi_GetCaretStatus()
+{
+ return !g_bInitialized || !g_szCompositionString[0];
+}
+
+void ImeUi_SetScreenDimension( UINT width, UINT height )
+{
+ if( !g_bInitialized )
+ return;
+ g_screenWidth = width;
+ g_screenHeight = height;
+}
+
+// this function is used only in brief time in CHT IME handling, so accelerator isn't processed.
+static void _PumpMessage()
+{
+ MSG msg;
+ while( PeekMessageA( &msg, NULL, 0, 0, PM_NOREMOVE ) )
+ {
+ if( !GetMessageA( &msg, NULL, 0, 0 ) )
+ {
+ PostQuitMessage( msg.wParam );
+ return;
+ }
+ // if (0 == TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
+ TranslateMessage( &msg );
+ DispatchMessageA( &msg );
+ // }
+ }
+}
+
+static void GetReadingWindowOrientation( DWORD dwId )
+{
+ g_bHorizontalReading = ( g_hklCurrent == _CHS_HKL ) || ( g_hklCurrent == _CHT_HKL_NEW_CHANG_JIE ) || ( dwId == 0 );
+ if( !g_bHorizontalReading && IMEID_LANG( dwId ) == LANG_CHT )
+ {
+ char szRegPath[MAX_PATH];
+ HKEY hkey;
+ DWORD dwVer = IMEID_VER( dwId );
+ StringCchCopyA( szRegPath, COUNTOF(szRegPath), "software\\microsoft\\windows\\currentversion\\" );
+ strcat_s( szRegPath, COUNTOF(szRegPath), ( dwVer >= MAKEIMEVERSION(5, 1) ) ? "MSTCIPH" : "TINTLGNT" );
+ LONG lRc = RegOpenKeyExA( HKEY_CURRENT_USER, szRegPath, 0, KEY_READ, &hkey );
+ if( lRc == ERROR_SUCCESS )
+ {
+ DWORD dwSize = sizeof( DWORD ), dwMapping, dwType;
+ lRc = RegQueryValueExA( hkey, "keyboard mapping", NULL, &dwType, ( PBYTE )&dwMapping, &dwSize );
+ if( lRc == ERROR_SUCCESS )
+ {
+ if(
+ ( dwVer <= MAKEIMEVERSION( 5, 0 ) &&
+ ( ( BYTE )dwMapping == 0x22 || ( BYTE )dwMapping == 0x23 )
+ ) ||
+ ( ( dwVer == MAKEIMEVERSION( 5, 1 ) || dwVer == MAKEIMEVERSION( 5, 2 ) ) &&
+ ( ( BYTE )dwMapping >= 0x22 && ( BYTE )dwMapping <= 0x24 )
+ )
+ )
+ {
+ g_bHorizontalReading = true;
+ }
+ }
+ RegCloseKey( hkey );
+ }
+ }
+}
+
+void ImeUi_ToggleLanguageBar( BOOL bRestore )
+{
+ static BOOL prevRestore = TRUE;
+ bool bCheck = ( prevRestore == TRUE || bRestore == TRUE );
+ prevRestore = bRestore;
+ if( !bCheck )
+ return;
+
+ static int iShowStatusWindow = -1;
+ if( iShowStatusWindow == -1 )
+ {
+ iShowStatusWindow = IsNT() && g_osi.dwMajorVersion >= 5 &&
+ ( g_osi.dwMinorVersion > 1 || ( g_osi.dwMinorVersion == 1 && lstrlenA( g_osi.szCSDVersion ) ) ) ? 1 : 0;
+ }
+ HWND hwndImeDef = _ImmGetDefaultIMEWnd( g_hwndCurr );
+ if( hwndImeDef && bRestore && iShowStatusWindow )
+ SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 );
+ HRESULT hr;
+ hr = CoInitialize( NULL );
+ if( SUCCEEDED( hr ) )
+ {
+ ITfLangBarMgr* plbm = NULL;
+ hr = CoCreateInstance( CLSID_TF_LangBarMgr, NULL, CLSCTX_INPROC_SERVER, __uuidof( ITfLangBarMgr ),
+ ( void** )&plbm );
+ if( SUCCEEDED( hr ) && plbm )
+ {
+ DWORD dwCur;
+ ULONG uRc;
+ if( SUCCEEDED( hr ) )
+ {
+ if( bRestore )
+ {
+ if( g_dwPrevFloat )
+ hr = plbm->ShowFloating( g_dwPrevFloat );
+ }
+ else
+ {
+ hr = plbm->GetShowFloatingStatus( &dwCur );
+ if( SUCCEEDED( hr ) )
+ g_dwPrevFloat = dwCur;
+ if( !( g_dwPrevFloat & TF_SFT_DESKBAND ) )
+ {
+ hr = plbm->ShowFloating( TF_SFT_HIDDEN );
+ }
+ }
+ }
+ uRc = plbm->Release();
+ }
+ CoUninitialize();
+ }
+ if( hwndImeDef && !bRestore )
+ {
+ // The following OPENSTATUSWINDOW is required to hide ATOK16 toolbar (FS9:#7546)
+ SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 );
+ SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0 );
+ }
+}
+
+bool ImeUi_IsSendingKeyMessage()
+{
+ return bIsSendingKeyMessage;
+}
+
+static void OnInputLangChangeWorker()
+{
+ if( !g_bUILessMode )
+ {
+ g_iCandListIndexBase = ( g_hklCurrent == _CHT_HKL_DAYI ) ? 0 : 1;
+ }
+ SetImeApi();
+}
+
+static void OnInputLangChange()
+{
+ UINT uLang = GETPRIMLANG();
+ CheckToggleState();
+ OnInputLangChangeWorker();
+ if( uLang != GETPRIMLANG() )
+ {
+ // Korean IME always uses level 3 support.
+ // Other languages use the level that is specified by ImeUi_SetSupportLevel()
+ SetSupportLevel( ( GETPRIMLANG() == LANG_KOREAN ) ? 3 : g_dwIMELevelSaved );
+ }
+ HWND hwndImeDef = _ImmGetDefaultIMEWnd( g_hwndCurr );
+ if( hwndImeDef )
+ {
+ // Fix for Zooty #3995: prevent CHT IME toobar from showing up
+ SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 );
+ SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0 );
+ }
+}
+
+static void SetImeApi()
+{
+ _GetReadingString = NULL;
+ _ShowReadingWindow = NULL;
+ if( g_bUILessMode )
+ return;
+
+ char szImeFile[MAX_PATH + 1];
+ HKL kl = g_hklCurrent;
+ if( _ImmGetIMEFileNameA( kl, szImeFile, sizeof( szImeFile ) - 1 ) <= 0 )
+ return;
+ HMODULE hIme = LoadLibraryA( szImeFile );
+ if( !hIme )
+ return;
+ _GetReadingString = ( UINT ( WINAPI* )( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT ) )
+ ( GetProcAddress( hIme, "GetReadingString" ) );
+ _ShowReadingWindow = ( BOOL ( WINAPI* )( HIMC himc, BOOL ) )
+ ( GetProcAddress( hIme, "ShowReadingWindow" ) );
+ if( _ShowReadingWindow )
+ {
+ HIMC himc;
+ if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) )
+ {
+ _ShowReadingWindow( himc, false );
+ _ImmReleaseContext( g_hwndCurr, himc );
+ }
+ }
+}
+
+static void CheckInputLocale()
+{
+ static HKL hklPrev = 0;
+ g_hklCurrent = GetKeyboardLayout( 0 );
+ if( hklPrev == g_hklCurrent )
+ {
+ return;
+ }
+ hklPrev = g_hklCurrent;
+ switch( GETPRIMLANG() )
+ {
+ // Simplified Chinese
+ case LANG_CHINESE:
+ g_bVerticalCand = true;
+ switch( GETSUBLANG() )
+ {
+ case SUBLANG_CHINESE_SIMPLIFIED:
+ g_pszIndicatior = g_aszIndicator[INDICATOR_CHS];
+ //g_bVerticalCand = GetImeId() == 0;
+ g_bVerticalCand = false;
+ break;
+ case SUBLANG_CHINESE_TRADITIONAL:
+ g_pszIndicatior = g_aszIndicator[INDICATOR_CHT];
+ break;
+ default: // unsupported sub-language
+ g_pszIndicatior = g_aszIndicator[INDICATOR_NON_IME];
+ break;
+ }
+ break;
+ // Korean
+ case LANG_KOREAN:
+ g_pszIndicatior = g_aszIndicator[INDICATOR_KOREAN];
+ g_bVerticalCand = false;
+ break;
+ // Japanese
+ case LANG_JAPANESE:
+ g_pszIndicatior = g_aszIndicator[INDICATOR_JAPANESE];
+ g_bVerticalCand = true;
+ break;
+ default:
+ g_pszIndicatior = g_aszIndicator[INDICATOR_NON_IME];
+ }
+ char szCodePage[8];
+ int iRc = GetLocaleInfoA( MAKELCID( GETLANG(), SORT_DEFAULT ), LOCALE_IDEFAULTANSICODEPAGE, szCodePage,
+ COUNTOF( szCodePage ) ); iRc;
+ g_uCodePage = _strtoul( szCodePage, NULL, 0 );
+ for( int i = 0; i < 256; i++ )
+ {
+ LeadByteTable[i] = ( BYTE )IsDBCSLeadByteEx( g_uCodePage, ( BYTE )i );
+ }
+}
+
+void ImeUi_SetWindow( HWND hwnd )
+{
+ g_hwndCurr = hwnd;
+ g_disableCicero.DisableCiceroOnThisWnd( hwnd );
+}
+
+UINT ImeUi_GetInputCodePage()
+{
+ return g_uCodePage;
+}
+
+DWORD ImeUi_GetFlags()
+{
+ return g_dwImeUiFlags;
+}
+
+void ImeUi_SetFlags( DWORD dwFlags, bool bSet )
+{
+ if( bSet )
+ {
+ g_dwImeUiFlags |= dwFlags;
+ }
+ else
+ {
+ g_dwImeUiFlags &= ~dwFlags;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CTsfUiLessMode methods
+//
+///////////////////////////////////////////////////////////////////////////////
+
+//
+// SetupSinks()
+// Set up sinks. A sink is used to receive a Text Service Framework event.
+// CUIElementSink implements multiple sink interfaces to receive few different TSF events.
+//
+BOOL CTsfUiLessMode::SetupSinks()
+{
+ // ITfThreadMgrEx is available on Vista or later.
+ HRESULT hr;
+ hr = CoCreateInstance( CLSID_TF_ThreadMgr,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ __uuidof( ITfThreadMgrEx ),
+ ( void** )&m_tm );
+
+ if( hr != S_OK )
+ {
+ return FALSE;
+ }
+
+ // ready to start interacting
+ TfClientId cid; // not used
+ if( FAILED( m_tm->ActivateEx( &cid, TF_TMAE_UIELEMENTENABLEDONLY ) ) )
+ {
+ return FALSE;
+ }
+
+ // Setup sinks
+ BOOL bRc = FALSE;
+ m_TsfSink = new CUIElementSink();
+ if( m_TsfSink )
+ {
+ ITfSource* srcTm;
+ if( SUCCEEDED( hr = m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&srcTm ) ) )
+ {
+ // Sink for reading window change
+ if( SUCCEEDED( hr = srcTm->AdviseSink( __uuidof( ITfUIElementSink ), ( ITfUIElementSink* )m_TsfSink,
+ &m_dwUIElementSinkCookie ) ) )
+ {
+ // Sink for input locale change
+ if( SUCCEEDED( hr = srcTm->AdviseSink( __uuidof( ITfInputProcessorProfileActivationSink ),
+ ( ITfInputProcessorProfileActivationSink* )m_TsfSink,
+ &m_dwAlpnSinkCookie ) ) )
+ {
+ if( SetupCompartmentSinks() ) // Setup compartment sinks for the first time
+ {
+ bRc = TRUE;
+ }
+ }
+ }
+ srcTm->Release();
+ }
+ }
+ return bRc;
+}
+
+void CTsfUiLessMode::ReleaseSinks()
+{
+ HRESULT hr;
+ ITfSource* source;
+
+ // Remove all sinks
+ if( m_tm && SUCCEEDED( m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&source ) ) )
+ {
+ hr = source->UnadviseSink( m_dwUIElementSinkCookie );
+ hr = source->UnadviseSink( m_dwAlpnSinkCookie );
+ source->Release();
+ SetupCompartmentSinks( TRUE ); // Remove all compartment sinks
+ m_tm->Deactivate();
+ SAFE_RELEASE( m_tm );
+ SAFE_RELEASE( m_TsfSink );
+ }
+}
+
+CTsfUiLessMode::CUIElementSink::CUIElementSink()
+{
+ _cRef = 1;
+}
+
+
+CTsfUiLessMode::CUIElementSink::~CUIElementSink()
+{
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::QueryInterface( REFIID riid, void** ppvObj )
+{
+ if( ppvObj == NULL )
+ return E_INVALIDARG;
+
+ *ppvObj = NULL;
+
+ if( IsEqualIID( riid, IID_IUnknown ) )
+ {
+ *ppvObj = reinterpret_cast<IUnknown*>( this );
+ }
+ else if( IsEqualIID( riid, __uuidof( ITfUIElementSink ) ) )
+ {
+ *ppvObj = ( ITfUIElementSink* )this;
+ }
+ else if( IsEqualIID( riid, __uuidof( ITfInputProcessorProfileActivationSink ) ) )
+ {
+ *ppvObj = ( ITfInputProcessorProfileActivationSink* )this;
+ }
+ else if( IsEqualIID( riid, __uuidof( ITfCompartmentEventSink ) ) )
+ {
+ *ppvObj = ( ITfCompartmentEventSink* )this;
+ }
+
+ if( *ppvObj )
+ {
+ AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+STDAPI_( ULONG )
+CTsfUiLessMode::CUIElementSink::AddRef()
+{
+ return ++_cRef;
+}
+
+STDAPI_( ULONG )
+CTsfUiLessMode::CUIElementSink::Release()
+{
+ LONG cr = --_cRef;
+
+ if( _cRef == 0 )
+ {
+ delete this;
+ }
+
+ return cr;
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::BeginUIElement( DWORD dwUIElementId, BOOL* pbShow )
+{
+ ITfUIElement* pElement = GetUIElement( dwUIElementId );
+ if( !pElement )
+ return E_INVALIDARG;
+
+ ITfReadingInformationUIElement* preading = NULL;
+ ITfCandidateListUIElement* pcandidate = NULL;
+ *pbShow = FALSE;
+ if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ),
+ ( void** )&preading ) ) )
+ {
+ MakeReadingInformationString( preading );
+ preading->Release();
+ }
+ else if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ),
+ ( void** )&pcandidate ) ) )
+ {
+ m_nCandidateRefCount++;
+ MakeCandidateStrings( pcandidate );
+ pcandidate->Release();
+ }
+
+ pElement->Release();
+ return S_OK;
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::UpdateUIElement( DWORD dwUIElementId )
+{
+ ITfUIElement* pElement = GetUIElement( dwUIElementId );
+ if( !pElement )
+ return E_INVALIDARG;
+
+ ITfReadingInformationUIElement* preading = NULL;
+ ITfCandidateListUIElement* pcandidate = NULL;
+ if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ),
+ ( void** )&preading ) ) )
+ {
+ MakeReadingInformationString( preading );
+ preading->Release();
+ }
+ else if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ),
+ ( void** )&pcandidate ) ) )
+ {
+ MakeCandidateStrings( pcandidate );
+ pcandidate->Release();
+ }
+
+ pElement->Release();
+ return S_OK;
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::EndUIElement( DWORD dwUIElementId )
+{
+ ITfUIElement* pElement = GetUIElement( dwUIElementId );
+ if( !pElement )
+ return E_INVALIDARG;
+
+ ITfReadingInformationUIElement* preading = NULL;
+ if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ),
+ ( void** )&preading ) ) )
+ {
+ g_dwCount = 0;
+ preading->Release();
+ }
+
+ ITfCandidateListUIElement* pcandidate = NULL;
+ if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ),
+ ( void** )&pcandidate ) ) )
+ {
+ m_nCandidateRefCount--;
+ if( m_nCandidateRefCount == 0 )
+ CloseCandidateList();
+ pcandidate->Release();
+ }
+
+ pElement->Release();
+ return S_OK;
+}
+
+void CTsfUiLessMode::UpdateImeState( BOOL bResetCompartmentEventSink )
+{
+ ITfCompartmentMgr* pcm;
+ ITfCompartment* pTfOpenMode = NULL;
+ ITfCompartment* pTfConvMode = NULL;
+ if( GetCompartments( &pcm, &pTfOpenMode, &pTfConvMode ) )
+ {
+ VARIANT valOpenMode;
+ VARIANT valConvMode;
+ pTfOpenMode->GetValue( &valOpenMode );
+ pTfConvMode->GetValue( &valConvMode );
+ if( valOpenMode.vt == VT_I4 )
+ {
+ if( g_bChineseIME )
+ {
+ g_dwState = valOpenMode.lVal != 0 && valConvMode.lVal != 0 ? IMEUI_STATE_ON : IMEUI_STATE_ENGLISH;
+ }
+ else
+ {
+ g_dwState = valOpenMode.lVal != 0 ? IMEUI_STATE_ON : IMEUI_STATE_OFF;
+ }
+ }
+ VariantClear( &valOpenMode );
+ VariantClear( &valConvMode );
+
+ if( bResetCompartmentEventSink )
+ {
+ SetupCompartmentSinks( FALSE, pTfOpenMode, pTfConvMode ); // Reset compartment sinks
+ }
+ pTfOpenMode->Release();
+ pTfConvMode->Release();
+ pcm->Release();
+ }
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::OnActivated( DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid,
+ REFGUID guidProfile, HKL hkl, DWORD dwFlags )
+{
+ static GUID TF_PROFILE_DAYI =
+ {
+ 0x037B2C25, 0x480C, 0x4D7F, 0xB0, 0x27, 0xD6, 0xCA, 0x6B, 0x69, 0x78, 0x8A
+ };
+ g_iCandListIndexBase = IsEqualGUID( TF_PROFILE_DAYI, guidProfile ) ? 0 : 1;
+ if( IsEqualIID( catid, GUID_TFCAT_TIP_KEYBOARD ) && ( dwFlags & TF_IPSINK_FLAG_ACTIVE ) )
+ {
+ g_bChineseIME = ( dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR ) && langid == LANG_CHT;
+ if( dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR )
+ {
+ UpdateImeState( TRUE );
+ }
+ else
+ g_dwState = IMEUI_STATE_OFF;
+ OnInputLangChange();
+ }
+ return S_OK;
+}
+
+STDAPI CTsfUiLessMode::CUIElementSink::OnChange( REFGUID rguid )
+{
+ UpdateImeState();
+ return S_OK;
+}
+
+void CTsfUiLessMode::MakeReadingInformationString( ITfReadingInformationUIElement* preading )
+{
+ UINT cchMax;
+ UINT uErrorIndex = 0;
+ BOOL fVertical;
+ DWORD dwFlags;
+
+ preading->GetUpdatedFlags( &dwFlags );
+ preading->GetMaxReadingStringLength( &cchMax );
+ preading->GetErrorIndex( &uErrorIndex ); // errorIndex is zero-based
+ preading->IsVerticalOrderPreferred( &fVertical );
+ g_iReadingError = ( int )uErrorIndex;
+ g_bHorizontalReading = !fVertical;
+ g_bReadingWindow = true;
+ g_uCandPageSize = MAX_CANDLIST;
+ g_dwSelection = g_iReadingError ? g_iReadingError - 1 : ( DWORD )-1;
+ g_iReadingError--; // g_iReadingError is used only in horizontal window, and has to be -1 if there's no error.
+#ifndef UNICODE
+ if( g_iReadingError > 0 )
+ {
+ // convert g_iReadingError to byte based
+ LPCSTR pszNext = g_szReadingString;
+ for( int i = 0; i < g_iReadingError && pszNext && *pszNext; ++i )
+ {
+ pszNext = CharNext( pszNext );
+ }
+ if( pszNext ) // should be non-NULL, but just in case
+ {
+ g_iReadingError = pszNext - g_szReadingString;
+ }
+ }
+#endif
+
+ BSTR bstr;
+ if( SUCCEEDED( preading->GetString( &bstr ) ) )
+ {
+ if( bstr )
+ {
+#ifndef UNICODE
+ char szStr[COUNTOF(g_szReadingString)*2];
+ szStr[0] = 0;
+ int iRc = WideCharToMultiByte( CP_ACP, 0, bstr, -1, szStr, sizeof( szStr ), NULL, NULL );
+ if( iRc >= sizeof( szStr ) )
+ {
+ szStr[sizeof( szStr ) - 1] = 0;
+ }
+ StringCchCopy( g_szReadingString, COUNTOF(g_szReadingString), szStr );
+#else
+ StringCchCopy( g_szReadingString, COUNTOF(g_szReadingString), bstr );
+#endif
+ g_dwCount = cchMax;
+ LPCTSTR pszSource = g_szReadingString;
+ if( fVertical )
+ {
+ // for vertical reading window, copy each character to g_szCandidate array.
+ for( UINT i = 0; i < cchMax; i++ )
+ {
+ LPTSTR pszDest = g_szCandidate[i];
+ if( *pszSource )
+ {
+ LPTSTR pszNextSrc = CharNext( pszSource );
+ SIZE_T size = ( LPSTR )pszNextSrc - ( LPSTR )pszSource;
+ CopyMemory( pszDest, pszSource, size );
+ pszSource = pszNextSrc;
+ pszDest += size;
+ }
+ *pszDest = 0;
+ }
+ }
+ else
+ {
+ g_szCandidate[0][0] = TEXT( ' ' ); // hack to make rendering happen
+ }
+ SysFreeString( bstr );
+ }
+ }
+}
+
+void CTsfUiLessMode::MakeCandidateStrings( ITfCandidateListUIElement* pcandidate )
+{
+ UINT uIndex = 0;
+ UINT uCount = 0;
+ UINT uCurrentPage = 0;
+ UINT* IndexList = NULL;
+ UINT uPageCnt = 0;
+ DWORD dwPageStart = 0;
+ DWORD dwPageSize = 0;
+ BSTR bstr;
+
+ pcandidate->GetSelection( &uIndex );
+ pcandidate->GetCount( &uCount );
+ pcandidate->GetCurrentPage( &uCurrentPage );
+ g_dwSelection = ( DWORD )uIndex;
+ g_dwCount = ( DWORD )uCount;
+ g_bCandList = true;
+ g_bReadingWindow = false;
+
+ pcandidate->GetPageIndex( NULL, 0, &uPageCnt );
+ if( uPageCnt > 0 )
+ {
+ IndexList = ( UINT* )ImeUiCallback_Malloc( sizeof( UINT ) * uPageCnt );
+ if( IndexList )
+ {
+ pcandidate->GetPageIndex( IndexList, uPageCnt, &uPageCnt );
+ dwPageStart = IndexList[uCurrentPage];
+ dwPageSize = ( uCurrentPage < uPageCnt - 1 ) ?
+ min( uCount, IndexList[uCurrentPage + 1] ) - dwPageStart:
+ uCount - dwPageStart;
+ }
+ }
+
+ g_uCandPageSize = min( dwPageSize, MAX_CANDLIST );
+ g_dwSelection = g_dwSelection - dwPageStart;
+
+ memset( &g_szCandidate, 0, sizeof( g_szCandidate ) );
+ for( UINT i = dwPageStart, j = 0; ( DWORD )i < g_dwCount && j < g_uCandPageSize; i++, j++ )
+ {
+ if( SUCCEEDED( pcandidate->GetString( i, &bstr ) ) )
+ {
+ if( bstr )
+ {
+#ifndef UNICODE
+ char szStr[COUNTOF(g_szCandidate[0])*2];
+ szStr[0] = 0;
+ int iRc = WideCharToMultiByte( CP_ACP, 0, bstr, -1, szStr, sizeof( szStr ), NULL, NULL );
+ if( iRc >= sizeof( szStr ) )
+ {
+ szStr[sizeof( szStr ) - 1] = 0;
+ }
+ ComposeCandidateLine( j, szStr );
+#else
+ ComposeCandidateLine( j, bstr );
+#endif
+ SysFreeString( bstr );
+ }
+ }
+ }
+
+ if( GETPRIMLANG() == LANG_KOREAN )
+ {
+ g_dwSelection = ( DWORD )-1;
+ }
+
+ if( IndexList )
+ {
+ ImeUiCallback_Free( IndexList );
+ }
+}
+
+ITfUIElement* CTsfUiLessMode::GetUIElement( DWORD dwUIElementId )
+{
+ ITfUIElementMgr* puiem;
+ ITfUIElement* pElement = NULL;
+
+ if( SUCCEEDED( m_tm->QueryInterface( __uuidof( ITfUIElementMgr ), ( void** )&puiem ) ) )
+ {
+ puiem->GetUIElement( dwUIElementId, &pElement );
+ puiem->Release();
+ }
+
+ return pElement;
+}
+
+BOOL CTsfUiLessMode::CurrentInputLocaleIsIme()
+{
+ BOOL ret = FALSE;
+ HRESULT hr;
+
+ ITfInputProcessorProfiles* pProfiles;
+ hr = CoCreateInstance( CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER,
+ __uuidof( ITfInputProcessorProfiles ), ( LPVOID* )&pProfiles );
+ if( SUCCEEDED( hr ) )
+ {
+ ITfInputProcessorProfileMgr* pProfileMgr;
+ hr = pProfiles->QueryInterface( __uuidof( ITfInputProcessorProfileMgr ), ( LPVOID* )&pProfileMgr );
+ if( SUCCEEDED( hr ) )
+ {
+ TF_INPUTPROCESSORPROFILE tip;
+ hr = pProfileMgr->GetActiveProfile( GUID_TFCAT_TIP_KEYBOARD, &tip );
+ if( SUCCEEDED( hr ) )
+ {
+ ret = ( tip.dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR ) != 0;
+ }
+ pProfileMgr->Release();
+ }
+ pProfiles->Release();
+ }
+ return ret;
+}
+
+// Sets up or removes sink for UI element.
+// UI element sink should be removed when IME is disabled,
+// otherwise the sink can be triggered when a game has multiple instances of IME UI library.
+void CTsfUiLessMode::EnableUiUpdates( bool bEnable )
+{
+ if( m_tm == NULL ||
+ ( bEnable && m_dwUIElementSinkCookie != TF_INVALID_COOKIE ) ||
+ ( !bEnable && m_dwUIElementSinkCookie == TF_INVALID_COOKIE ) )
+ {
+ return;
+ }
+ ITfSource* srcTm = NULL;
+ HRESULT hr = E_FAIL;
+ if( SUCCEEDED( hr = m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&srcTm ) ) )
+ {
+ if( bEnable )
+ {
+ hr = srcTm->AdviseSink( __uuidof( ITfUIElementSink ), ( ITfUIElementSink* )m_TsfSink,
+ &m_dwUIElementSinkCookie );
+ }
+ else
+ {
+ hr = srcTm->UnadviseSink( m_dwUIElementSinkCookie );
+ m_dwUIElementSinkCookie = TF_INVALID_COOKIE;
+ }
+ srcTm->Release();
+ }
+}
+
+// Returns open mode compartments and compartment manager.
+// Function fails if it fails to acquire any of the objects to be returned.
+BOOL CTsfUiLessMode::GetCompartments( ITfCompartmentMgr** ppcm, ITfCompartment** ppTfOpenMode,
+ ITfCompartment** ppTfConvMode )
+{
+ ITfCompartmentMgr* pcm = NULL;
+ ITfCompartment* pTfOpenMode = NULL;
+ ITfCompartment* pTfConvMode = NULL;
+
+ static GUID _GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION =
+ {
+ 0xCCF05DD8, 0x4A87, 0x11D7, 0xA6, 0xE2, 0x00, 0x06, 0x5B, 0x84, 0x43, 0x5C
+ };
+
+ HRESULT hr;
+ if( SUCCEEDED( hr = m_tm->QueryInterface( IID_ITfCompartmentMgr, ( void** )&pcm ) ) )
+ {
+ if( SUCCEEDED( hr = pcm->GetCompartment( GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pTfOpenMode ) ) )
+ {
+ if( SUCCEEDED( hr = pcm->GetCompartment( _GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION,
+ &pTfConvMode ) ) )
+ {
+ *ppcm = pcm;
+ *ppTfOpenMode = pTfOpenMode;
+ *ppTfConvMode = pTfConvMode;
+ return TRUE;
+ }
+ pTfOpenMode->Release();
+ }
+ pcm->Release();
+ }
+ return FALSE;
+}
+
+// There are three ways to call this function:
+// SetupCompartmentSinks() : initialization
+// SetupCompartmentSinks(FALSE, openmode, convmode) : Resetting sinks. This is necessary as DaYi and Array IME resets compartment on switching input locale
+// SetupCompartmentSinks(TRUE) : clean up sinks
+BOOL CTsfUiLessMode::SetupCompartmentSinks( BOOL bRemoveOnly, ITfCompartment* pTfOpenMode,
+ ITfCompartment* pTfConvMode )
+{
+ bool bLocalCompartments = false;
+ ITfCompartmentMgr* pcm = NULL;
+ BOOL bRc = FALSE;
+ HRESULT hr = E_FAIL;
+
+ if( !pTfOpenMode && !pTfConvMode )
+ {
+ bLocalCompartments = true;
+ GetCompartments( &pcm, &pTfOpenMode, &pTfConvMode );
+ }
+ if( !( pTfOpenMode && pTfConvMode ) )
+ {
+ // Invalid parameters or GetCompartments() has failed.
+ return FALSE;
+ }
+ ITfSource* srcOpenMode = NULL;
+ if( SUCCEEDED( hr = pTfOpenMode->QueryInterface( IID_ITfSource, ( void** )&srcOpenMode ) ) )
+ {
+ // Remove existing sink for open mode
+ if( m_dwOpenModeSinkCookie != TF_INVALID_COOKIE )
+ {
+ srcOpenMode->UnadviseSink( m_dwOpenModeSinkCookie );
+ m_dwOpenModeSinkCookie = TF_INVALID_COOKIE;
+ }
+ // Setup sink for open mode (toggle state) change
+ if( bRemoveOnly || SUCCEEDED( hr = srcOpenMode->AdviseSink( IID_ITfCompartmentEventSink,
+ ( ITfCompartmentEventSink* )m_TsfSink,
+ &m_dwOpenModeSinkCookie ) ) )
+ {
+ ITfSource* srcConvMode = NULL;
+ if( SUCCEEDED( hr = pTfConvMode->QueryInterface( IID_ITfSource, ( void** )&srcConvMode ) ) )
+ {
+ // Remove existing sink for open mode
+ if( m_dwConvModeSinkCookie != TF_INVALID_COOKIE )
+ {
+ srcConvMode->UnadviseSink( m_dwConvModeSinkCookie );
+ m_dwConvModeSinkCookie = TF_INVALID_COOKIE;
+ }
+ // Setup sink for open mode (toggle state) change
+ if( bRemoveOnly || SUCCEEDED( hr = srcConvMode->AdviseSink( IID_ITfCompartmentEventSink,
+ ( ITfCompartmentEventSink* )m_TsfSink,
+ &m_dwConvModeSinkCookie ) ) )
+ {
+ bRc = TRUE;
+ }
+ srcConvMode->Release();
+ }
+ }
+ srcOpenMode->Release();
+ }
+ if( bLocalCompartments )
+ {
+ pTfOpenMode->Release();
+ pTfConvMode->Release();
+ pcm->Release();
+ }
+ return bRc;
+}
+
+
+WORD ImeUi_GetPrimaryLanguage()
+{
+ return GETPRIMLANG();
+};
+
+DWORD ImeUi_GetImeId( UINT uIndex )
+{
+ return GetImeId( uIndex );
+};
+
+WORD ImeUi_GetLanguage()
+{
+ return GETLANG();
+};
+
+PTSTR ImeUi_GetIndicatior()
+{
+ return g_pszIndicatior;
+};
+
+
+bool ImeUi_IsShowReadingWindow()
+{
+ return g_bReadingWindow;
+};
+
+bool ImeUi_IsShowCandListWindow()
+{
+ return g_bCandList;
+};
+
+bool ImeUi_IsVerticalCand()
+{
+ return g_bVerticalCand;
+};
+
+bool ImeUi_IsHorizontalReading()
+{
+ return g_bHorizontalReading;
+};
+
+TCHAR* ImeUi_GetCandidate( UINT idx )
+{
+ if( idx < MAX_CANDLIST )
+ return g_szCandidate[idx];
+ else
+ return g_szCandidate[0];
+}
+
+DWORD ImeUi_GetCandidateSelection()
+{
+ return g_dwSelection;
+}
+
+DWORD ImeUi_GetCandidateCount()
+{
+ return g_dwCount;
+}
+
+TCHAR* ImeUi_GetCompositionString()
+{
+ return g_szCompositionString;
+}
+
+BYTE* ImeUi_GetCompStringAttr()
+{
+ return g_szCompAttrString;
+}
+
+DWORD ImeUi_GetImeCursorChars()
+{
+ return g_IMECursorChars;
+}
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/ImeUi.h b/samples/DX_APIUsage/DXUT/Optional/ImeUi.h
new file mode 100644
index 0000000..deae8f4
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/ImeUi.h
@@ -0,0 +1,124 @@
+//--------------------------------------------------------------------------------------
+// File: ImeUi.h
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#ifndef _IMEUI_H_
+#define _IMEUI_H_
+#if _WIN32_WINNT < 0x0400
+#error IMEUI requires _WIN32_WINNT to be 0x0400 or higher. Please add "_WIN32_WINNT=0x0400" to your project's preprocessor setting.
+#endif
+#include <windows.h>
+
+class CImeUiFont_Base
+{
+public:
+ virtual void SetHeight( UINT uHeight )
+ {
+ uHeight;
+ }; // for backward compatibility
+ virtual void SetColor( DWORD color ) = 0;
+ virtual void SetPosition( int x, int y ) = 0;
+ virtual void GetTextExtent( LPCTSTR szText, DWORD* puWidth, DWORD* puHeight ) = 0;
+ virtual void DrawText( LPCTSTR pszText ) = 0;
+};
+
+typedef struct
+{
+ // symbol (Henkan-kyu)
+ DWORD symbolColor;
+ DWORD symbolColorOff;
+ DWORD symbolColorText;
+ BYTE symbolHeight;
+ BYTE symbolTranslucence;
+ BYTE symbolPlacement;
+ CImeUiFont_Base* symbolFont;
+
+ // candidate list
+ DWORD candColorBase;
+ DWORD candColorBorder;
+ DWORD candColorText;
+
+ // composition string
+ DWORD compColorInput;
+ DWORD compColorTargetConv;
+ DWORD compColorConverted;
+ DWORD compColorTargetNotConv;
+ DWORD compColorInputErr;
+ BYTE compTranslucence;
+ DWORD compColorText;
+
+ // caret
+ BYTE caretWidth;
+ BYTE caretYMargin;
+} IMEUI_APPEARANCE;
+
+typedef struct // D3DTLVERTEX compatible
+{
+ float sx;
+ float sy;
+ float sz;
+ float rhw;
+ DWORD color;
+ DWORD specular;
+ float tu;
+ float tv;
+} IMEUI_VERTEX;
+
+// IME States
+#define IMEUI_STATE_OFF 0
+#define IMEUI_STATE_ON 1
+#define IMEUI_STATE_ENGLISH 2
+
+// IME const
+#define MAX_CANDLIST 10
+
+// IME Flags
+#define IMEUI_FLAG_SUPPORT_CARET 0x00000001
+
+bool ImeUi_Initialize( HWND hwnd, bool bDisable = false );
+void ImeUi_Uninitialize();
+void ImeUi_SetAppearance( const IMEUI_APPEARANCE* pia );
+void ImeUi_GetAppearance( IMEUI_APPEARANCE* pia );
+bool ImeUi_IgnoreHotKey( const MSG* pmsg );
+LPARAM ImeUi_ProcessMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM& lParam, bool* trapped );
+void ImeUi_SetScreenDimension( UINT width, UINT height );
+void ImeUi_RenderUI( bool bDrawCompAttr = true, bool bDrawOtherUi = true );
+void ImeUi_SetCaretPosition( UINT x, UINT y );
+void ImeUi_SetCompStringAppearance( CImeUiFont_Base* pFont, DWORD color, const RECT* prc );
+bool ImeUi_GetCaretStatus();
+void ImeUi_SetInsertMode( bool bInsert );
+void ImeUi_SetState( DWORD dwState );
+DWORD ImeUi_GetState();
+void ImeUi_EnableIme( bool bEnable );
+bool ImeUi_IsEnabled( void );
+void ImeUi_FinalizeString( bool bSend = false );
+void ImeUi_ToggleLanguageBar( BOOL bRestore );
+bool ImeUi_IsSendingKeyMessage();
+void ImeUi_SetWindow( HWND hwnd );
+UINT ImeUi_GetInputCodePage();
+DWORD ImeUi_GetFlags();
+void ImeUi_SetFlags( DWORD dwFlags, bool bSet );
+
+WORD ImeUi_GetPrimaryLanguage();
+DWORD ImeUi_GetImeId( UINT uIndex );
+WORD ImeUi_GetLanguage();
+LPTSTR ImeUi_GetIndicatior();
+bool ImeUi_IsShowReadingWindow();
+bool ImeUi_IsShowCandListWindow();
+bool ImeUi_IsVerticalCand();
+bool ImeUi_IsHorizontalReading();
+TCHAR* ImeUi_GetCandidate( UINT idx );
+TCHAR* ImeUi_GetCompositionString();
+DWORD ImeUi_GetCandidateSelection();
+DWORD ImeUi_GetCandidateCount();
+BYTE* ImeUi_GetCompStringAttr();
+DWORD ImeUi_GetImeCursorChars();
+
+extern void ( CALLBACK*ImeUiCallback_DrawRect )( int x1, int y1, int x2, int y2, DWORD color );
+extern void* ( __cdecl*ImeUiCallback_Malloc )( size_t bytes );
+extern void ( __cdecl*ImeUiCallback_Free )( void* ptr );
+extern void ( CALLBACK*ImeUiCallback_DrawFans )( const IMEUI_VERTEX* paVertex, UINT uNum );
+extern void ( CALLBACK*ImeUiCallback_OnChar )( WCHAR wc );
+
+#endif //_IMEUI_H_
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKmesh.cpp b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.cpp
new file mode 100644
index 0000000..5002d74
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.cpp
@@ -0,0 +1,2349 @@
+//--------------------------------------------------------------------------------------
+// File: SDKMesh.cpp
+//
+// The SDK Mesh format (.sdkmesh) is not a recommended file format for games.
+// It was designed to meet the specific needs of the SDK samples. Any real-world
+// applications should avoid this file format in favor of a destination format that
+// meets the specific needs of the application.
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#include "DXUT.h"
+#include "SDKMesh.h"
+#include "SDKMisc.h"
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::LoadMaterials( ID3D11Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks )
+{
+ char strPath[MAX_PATH];
+
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile )
+ {
+ for( UINT m = 0; m < numMaterials; m++ )
+ {
+ pMaterials[m].pDiffuseTexture11 = NULL;
+ pMaterials[m].pNormalTexture11 = NULL;
+ pMaterials[m].pSpecularTexture11 = NULL;
+ pMaterials[m].pDiffuseRV11 = NULL;
+ pMaterials[m].pNormalRV11 = NULL;
+ pMaterials[m].pSpecularRV11 = NULL;
+
+ // load textures
+ if( pMaterials[m].DiffuseTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].DiffuseTexture, &pMaterials[m].pDiffuseRV11,
+ pLoaderCallbacks->pContext );
+ }
+ if( pMaterials[m].NormalTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].NormalTexture, &pMaterials[m].pNormalRV11,
+ pLoaderCallbacks->pContext );
+ }
+ if( pMaterials[m].SpecularTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].SpecularTexture, &pMaterials[m].pSpecularRV11,
+ pLoaderCallbacks->pContext );
+ }
+ }
+ }
+ else
+ {
+ for( UINT m = 0; m < numMaterials; m++ )
+ {
+ pMaterials[m].pDiffuseTexture11 = NULL;
+ pMaterials[m].pNormalTexture11 = NULL;
+ pMaterials[m].pSpecularTexture11 = NULL;
+ pMaterials[m].pDiffuseRV11 = NULL;
+ pMaterials[m].pNormalRV11 = NULL;
+ pMaterials[m].pSpecularRV11 = NULL;
+
+ // load textures
+ if( pMaterials[m].DiffuseTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(),
+ strPath, &pMaterials[m].pDiffuseRV11,
+ true ) ) )
+ pMaterials[m].pDiffuseRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
+
+ }
+ if( pMaterials[m].NormalTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(),
+ strPath,
+ &pMaterials[m].pNormalRV11 ) ) )
+ pMaterials[m].pNormalRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
+ }
+ if( pMaterials[m].SpecularTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(),
+ strPath,
+ &pMaterials[m].pSpecularRV11 ) ) )
+ pMaterials[m].pSpecularRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE;
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks )
+{
+ char strPath[MAX_PATH];
+
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile )
+ {
+ for( UINT m = 0; m < numMaterials; m++ )
+ {
+ pMaterials[m].pDiffuseTexture9 = NULL;
+ pMaterials[m].pNormalTexture9 = NULL;
+ pMaterials[m].pSpecularTexture9 = NULL;
+
+ // load textures
+ if( pMaterials[m].DiffuseTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].DiffuseTexture,
+ &pMaterials[m].pDiffuseTexture9,
+ pLoaderCallbacks->pContext );
+ }
+ if( pMaterials[m].NormalTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].NormalTexture, &pMaterials[m].pNormalTexture9,
+ pLoaderCallbacks->pContext );
+ }
+ if( pMaterials[m].SpecularTexture[0] != 0 )
+ {
+ pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice,
+ pMaterials[m].SpecularTexture,
+ &pMaterials[m].pSpecularTexture9,
+ pLoaderCallbacks->pContext );
+ }
+ }
+ }
+ else
+ {
+ for( UINT m = 0; m < numMaterials; m++ )
+ {
+ pMaterials[m].pDiffuseTexture9 = NULL;
+ pMaterials[m].pNormalTexture9 = NULL;
+ pMaterials[m].pSpecularTexture9 = NULL;
+ pMaterials[m].pDiffuseRV11 = NULL;
+ pMaterials[m].pNormalRV11 = NULL;
+ pMaterials[m].pSpecularRV11 = NULL;
+
+ // load textures
+ if( pMaterials[m].DiffuseTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice,
+ strPath,
+ &pMaterials[m].pDiffuseTexture9 ) ) )
+ pMaterials[m].pDiffuseTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE;
+ }
+ if( pMaterials[m].NormalTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice,
+ strPath,
+ &pMaterials[m].pNormalTexture9 ) ) )
+ pMaterials[m].pNormalTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE;
+ }
+ if( pMaterials[m].SpecularTexture[0] != 0 )
+ {
+ sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture );
+ if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice,
+ strPath,
+ &pMaterials[m].pSpecularTexture9 ) ) )
+ pMaterials[m].pSpecularTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE;
+ }
+
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::CreateVertexBuffer( ID3D11Device* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader,
+ void* pVertices, SDKMESH_CALLBACKS11* pLoaderCallbacks )
+{
+ HRESULT hr = S_OK;
+ pHeader->DataOffset = 0;
+ //Vertex Buffer
+ D3D11_BUFFER_DESC bufferDesc;
+ bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes );
+ bufferDesc.Usage = D3D11_USAGE_DEFAULT;
+ bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bufferDesc.CPUAccessFlags = 0;
+ bufferDesc.MiscFlags = 0;
+
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
+ {
+ pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB11, bufferDesc, pVertices,
+ pLoaderCallbacks->pContext );
+ }
+ else
+ {
+ D3D11_SUBRESOURCE_DATA InitData;
+ InitData.pSysMem = pVertices;
+ hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pVB11 );
+ DXUT_SetDebugName( pHeader->pVB11, "CDXUTSDKMesh" );
+ }
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::CreateIndexBuffer( ID3D11Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader,
+ void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks )
+{
+ HRESULT hr = S_OK;
+ pHeader->DataOffset = 0;
+ //Index Buffer
+ D3D11_BUFFER_DESC bufferDesc;
+ bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes );
+ bufferDesc.Usage = D3D11_USAGE_DEFAULT;
+ bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
+ bufferDesc.CPUAccessFlags = 0;
+ bufferDesc.MiscFlags = 0;
+
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer )
+ {
+ pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB11, bufferDesc, pIndices,
+ pLoaderCallbacks->pContext );
+ }
+ else
+ {
+ D3D11_SUBRESOURCE_DATA InitData;
+ InitData.pSysMem = pIndices;
+ hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pIB11 );
+ DXUT_SetDebugName( pHeader->pIB11, "CDXUTSDKMesh" );
+ }
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::CreateVertexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader,
+ void* pVertices, SDKMESH_CALLBACKS9* pLoaderCallbacks )
+{
+ HRESULT hr = S_OK;
+
+ pHeader->DataOffset = 0;
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
+ {
+ pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB9, ( UINT )pHeader->SizeBytes,
+ D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, pVertices,
+ pLoaderCallbacks->pContext );
+ }
+ else
+ {
+ hr = pd3dDevice->CreateVertexBuffer( ( UINT )pHeader->SizeBytes,
+ D3DUSAGE_WRITEONLY,
+ 0,
+ D3DPOOL_DEFAULT,
+ &pHeader->pVB9,
+ NULL );
+
+ //lock
+ if( SUCCEEDED( hr ) )
+ {
+ void* pLockedVerts = NULL;
+ V_RETURN( pHeader->pVB9->Lock( 0, 0, &pLockedVerts, 0 ) );
+ CopyMemory( pLockedVerts, pVertices, ( size_t )pHeader->SizeBytes );
+ pHeader->pVB9->Unlock();
+ }
+ }
+
+ return hr;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::CreateIndexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader,
+ void* pIndices, SDKMESH_CALLBACKS9* pLoaderCallbacks )
+{
+ HRESULT hr = S_OK;
+
+ pHeader->DataOffset = 0;
+
+ D3DFORMAT ibFormat = D3DFMT_INDEX16;
+ switch( pHeader->IndexType )
+ {
+ case IT_16BIT:
+ ibFormat = D3DFMT_INDEX16;
+ break;
+ case IT_32BIT:
+ ibFormat = D3DFMT_INDEX32;
+ break;
+ };
+
+ if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer )
+ {
+ pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB9, ( UINT )pHeader->SizeBytes,
+ D3DUSAGE_WRITEONLY, ibFormat, D3DPOOL_DEFAULT, pIndices,
+ pLoaderCallbacks->pContext );
+ }
+ else
+ {
+ hr = pd3dDevice->CreateIndexBuffer( ( UINT )( pHeader->SizeBytes ),
+ D3DUSAGE_WRITEONLY,
+ ibFormat,
+ D3DPOOL_DEFAULT,
+ &pHeader->pIB9,
+ NULL );
+
+ if( SUCCEEDED( hr ) )
+ {
+ void* pLockedIndices = NULL;
+ V_RETURN( pHeader->pIB9->Lock( 0, 0, &pLockedIndices, 0 ) );
+ CopyMemory( pLockedIndices, pIndices, ( size_t )( pHeader->SizeBytes ) );
+ pHeader->pIB9->Unlock();
+ }
+ }
+
+ return hr;
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::CreateFromFile( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ LPCTSTR szFileName,
+ bool bCreateAdjacencyIndices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 )
+{
+ HRESULT hr = S_OK;
+
+ // Find the path for the file
+ V_RETURN( DXUTFindDXSDKMediaFileCch( m_strPathW, sizeof( m_strPathW ) / sizeof( WCHAR ), szFileName ) );
+
+ // Open the file
+ m_hFile = CreateFile( m_strPathW, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,
+ NULL );
+ if( INVALID_HANDLE_VALUE == m_hFile )
+ return DXUTERR_MEDIANOTFOUND;
+
+ // Change the path to just the directory
+ WCHAR* pLastBSlash = wcsrchr( m_strPathW, L'\\' );
+ if( pLastBSlash )
+ *( pLastBSlash + 1 ) = L'\0';
+ else
+ *m_strPathW = L'\0';
+
+ WideCharToMultiByte( CP_ACP, 0, m_strPathW, -1, m_strPath, MAX_PATH, NULL, FALSE );
+
+ // Get the file size
+ LARGE_INTEGER FileSize;
+ GetFileSizeEx( m_hFile, &FileSize );
+ UINT cBytes = FileSize.LowPart;
+
+ // Allocate memory
+ m_pStaticMeshData = new BYTE[ cBytes ];
+ if( !m_pStaticMeshData )
+ {
+ CloseHandle( m_hFile );
+ return E_OUTOFMEMORY;
+ }
+
+ // Read in the file
+ DWORD dwBytesRead;
+ if( !ReadFile( m_hFile, m_pStaticMeshData, cBytes, &dwBytesRead, NULL ) )
+ hr = E_FAIL;
+
+ CloseHandle( m_hFile );
+
+ if( SUCCEEDED( hr ) )
+ {
+ hr = CreateFromMemory( pDev11,
+ pDev9,
+ m_pStaticMeshData,
+ cBytes,
+ bCreateAdjacencyIndices,
+ false,
+ pLoaderCallbacks11,
+ pLoaderCallbacks9 );
+ if( FAILED( hr ) )
+ delete []m_pStaticMeshData;
+ }
+
+ return hr;
+}
+
+HRESULT CDXUTSDKMesh::CreateFromMemory( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ BYTE* pData,
+ UINT DataBytes,
+ bool bCreateAdjacencyIndices,
+ bool bCopyStatic,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 )
+{
+ HRESULT hr = E_FAIL;
+ D3DXVECTOR3 lower;
+ D3DXVECTOR3 upper;
+
+ m_pDev9 = pDev9;
+ m_pDev11 = pDev11;
+
+ // Set outstanding resources to zero
+ m_NumOutstandingResources = 0;
+
+ if( bCopyStatic )
+ {
+ SDKMESH_HEADER* pHeader = ( SDKMESH_HEADER* )pData;
+
+ SIZE_T StaticSize = ( SIZE_T )( pHeader->HeaderSize + pHeader->NonBufferDataSize );
+ m_pHeapData = new BYTE[ StaticSize ];
+ if( !m_pHeapData )
+ return hr;
+
+ m_pStaticMeshData = m_pHeapData;
+
+ CopyMemory( m_pStaticMeshData, pData, StaticSize );
+ }
+ else
+ {
+ m_pHeapData = pData;
+ m_pStaticMeshData = pData;
+ }
+
+ // Pointer fixup
+ m_pMeshHeader = ( SDKMESH_HEADER* )m_pStaticMeshData;
+ m_pVertexBufferArray = ( SDKMESH_VERTEX_BUFFER_HEADER* )( m_pStaticMeshData +
+ m_pMeshHeader->VertexStreamHeadersOffset );
+ m_pIndexBufferArray = ( SDKMESH_INDEX_BUFFER_HEADER* )( m_pStaticMeshData +
+ m_pMeshHeader->IndexStreamHeadersOffset );
+ m_pMeshArray = ( SDKMESH_MESH* )( m_pStaticMeshData + m_pMeshHeader->MeshDataOffset );
+ m_pSubsetArray = ( SDKMESH_SUBSET* )( m_pStaticMeshData + m_pMeshHeader->SubsetDataOffset );
+ m_pFrameArray = ( SDKMESH_FRAME* )( m_pStaticMeshData + m_pMeshHeader->FrameDataOffset );
+ m_pMaterialArray = ( SDKMESH_MATERIAL* )( m_pStaticMeshData + m_pMeshHeader->MaterialDataOffset );
+
+ // Setup subsets
+ for( UINT i = 0; i < m_pMeshHeader->NumMeshes; i++ )
+ {
+ m_pMeshArray[i].pSubsets = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].SubsetOffset );
+ m_pMeshArray[i].pFrameInfluences = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].FrameInfluenceOffset );
+ }
+
+ // error condition
+ if( m_pMeshHeader->Version != SDKMESH_FILE_VERSION )
+ {
+ hr = E_NOINTERFACE;
+ goto Error;
+ }
+
+ // Setup buffer data pointer
+ BYTE* pBufferData = pData + m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize;
+
+ // Get the start of the buffer data
+ UINT64 BufferDataStart = m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize;
+
+ // Create VBs
+ m_ppVertices = new BYTE*[m_pMeshHeader->NumVertexBuffers];
+ for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
+ {
+ BYTE* pVertices = NULL;
+ pVertices = ( BYTE* )( pBufferData + ( m_pVertexBufferArray[i].DataOffset - BufferDataStart ) );
+
+ if( pDev11 )
+ CreateVertexBuffer( pDev11, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks11 );
+ else if( pDev9 )
+ CreateVertexBuffer( pDev9, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks9 );
+
+ m_ppVertices[i] = pVertices;
+ }
+
+ // Create IBs
+ m_ppIndices = new BYTE*[m_pMeshHeader->NumIndexBuffers];
+ for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
+ {
+ BYTE* pIndices = NULL;
+ pIndices = ( BYTE* )( pBufferData + ( m_pIndexBufferArray[i].DataOffset - BufferDataStart ) );
+
+ if( pDev11 )
+ CreateIndexBuffer( pDev11, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks11 );
+ else if( pDev9 )
+ CreateIndexBuffer( pDev9, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks9 );
+
+ m_ppIndices[i] = pIndices;
+ }
+
+ // Load Materials
+ if( pDev11 )
+ LoadMaterials( pDev11, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks11 );
+ else if( pDev9 )
+ LoadMaterials( pDev9, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks9 );
+
+ // Create a place to store our bind pose frame matrices
+ m_pBindPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
+ if( !m_pBindPoseFrameMatrices )
+ goto Error;
+
+ // Create a place to store our transformed frame matrices
+ m_pTransformedFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
+ if( !m_pTransformedFrameMatrices )
+ goto Error;
+ m_pWorldPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ];
+ if( !m_pWorldPoseFrameMatrices )
+ goto Error;
+
+ SDKMESH_SUBSET* pSubset = NULL;
+ D3D11_PRIMITIVE_TOPOLOGY PrimType;
+
+ // update bounding volume
+ SDKMESH_MESH* currentMesh = &m_pMeshArray[0];
+ int tris = 0;
+ for (UINT meshi=0; meshi < m_pMeshHeader->NumMeshes; ++meshi) {
+ lower.x = FLT_MAX; lower.y = FLT_MAX; lower.z = FLT_MAX;
+ upper.x = -FLT_MAX; upper.y = -FLT_MAX; upper.z = -FLT_MAX;
+ currentMesh = GetMesh( meshi );
+ INT indsize;
+ if (m_pIndexBufferArray[currentMesh->IndexBuffer].IndexType == IT_16BIT ) {
+ indsize = 2;
+ }else {
+ indsize = 4;
+ }
+
+ for( UINT subset = 0; subset < currentMesh->NumSubsets; subset++ )
+ {
+ pSubset = GetSubset( meshi, subset ); //&m_pSubsetArray[ currentMesh->pSubsets[subset] ];
+
+ PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
+ assert( PrimType == D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );// only triangle lists are handled.
+
+ UINT IndexCount = ( UINT )pSubset->IndexCount;
+ UINT IndexStart = ( UINT )pSubset->IndexStart;
+
+ /*if( bAdjacent )
+ {
+ IndexCount *= 2;
+ IndexStart *= 2;
+ }*/
+
+ //BYTE* pIndices = NULL;
+ //m_ppIndices[i]
+ UINT *ind = ( UINT * )m_ppIndices[currentMesh->IndexBuffer];
+ FLOAT *verts = ( FLOAT* )m_ppVertices[currentMesh->VertexBuffers[0]];
+ UINT stride = (UINT)m_pVertexBufferArray[currentMesh->VertexBuffers[0]].StrideBytes;
+ assert (stride % 4 == 0);
+ stride /=4;
+ for (UINT vertind = IndexStart; vertind < IndexStart + IndexCount; ++vertind) {
+ UINT current_ind=0;
+ if (indsize == 2) {
+ UINT ind_div2 = vertind / 2;
+ current_ind = ind[ind_div2];
+ if (vertind %2 ==0) {
+ current_ind = current_ind << 16;
+ current_ind = current_ind >> 16;
+ }else {
+ current_ind = current_ind >> 16;
+ }
+ }else {
+ current_ind = ind[vertind];
+ }
+ tris++;
+ D3DXVECTOR3 *pt = (D3DXVECTOR3*)&(verts[stride * current_ind]);
+ if (pt->x < lower.x) {
+ lower.x = pt->x;
+ }
+ if (pt->y < lower.y) {
+ lower.y = pt->y;
+ }
+ if (pt->z < lower.z) {
+ lower.z = pt->z;
+ }
+ if (pt->x > upper.x) {
+ upper.x = pt->x;
+ }
+ if (pt->y > upper.y) {
+ upper.y = pt->y;
+ }
+ if (pt->z > upper.z) {
+ upper.z = pt->z;
+ }
+ //BYTE** m_ppVertices;
+ //BYTE** m_ppIndices;
+ }
+ //pd3dDeviceContext->DrawIndexed( IndexCount, IndexStart, VertexStart );
+ }
+
+ D3DXVECTOR3 half = upper - lower;
+ half *=0.5f;
+
+ currentMesh->BoundingBoxCenter = lower + half;
+ currentMesh->BoundingBoxExtents = half;
+
+ }
+ // Update
+
+
+
+ hr = S_OK;
+Error:
+
+ if( !pLoaderCallbacks9 )
+ {
+ CheckLoadDone();
+ }
+
+ return hr;
+}
+
+//--------------------------------------------------------------------------------------
+// transform bind pose frame using a recursive traversal
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld )
+{
+ if( !m_pBindPoseFrameMatrices )
+ return;
+
+ // Transform ourselves
+ D3DXMATRIX LocalWorld;
+ D3DXMatrixMultiply( &LocalWorld, &m_pFrameArray[iFrame].Matrix, pParentWorld );
+ m_pBindPoseFrameMatrices[iFrame] = LocalWorld;
+
+ // Transform our siblings
+ if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
+ TransformBindPoseFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld );
+
+ // Transform our children
+ if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
+ TransformBindPoseFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld );
+}
+
+//--------------------------------------------------------------------------------------
+// transform frame using a recursive traversal
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime )
+{
+ // Get the tick data
+ D3DXMATRIX LocalTransform;
+ UINT iTick = GetAnimationKeyFromTime( fTime );
+
+ if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex )
+ {
+ SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ];
+ SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ];
+
+ // turn it into a matrix (Ignore scaling for now)
+ D3DXVECTOR3 parentPos = pData->Translation;
+ D3DXMATRIX mTranslate;
+ D3DXMatrixTranslation( &mTranslate, parentPos.x, parentPos.y, parentPos.z );
+
+ D3DXQUATERNION quat;
+ D3DXMATRIX mQuat;
+ quat.w = pData->Orientation.w;
+ quat.x = pData->Orientation.x;
+ quat.y = pData->Orientation.y;
+ quat.z = pData->Orientation.z;
+ if( quat.w == 0 && quat.x == 0 && quat.y == 0 && quat.z == 0 )
+ D3DXQuaternionIdentity( &quat );
+ D3DXQuaternionNormalize( &quat, &quat );
+ D3DXMatrixRotationQuaternion( &mQuat, &quat );
+ LocalTransform = ( mQuat * mTranslate );
+ }
+ else
+ {
+ LocalTransform = m_pFrameArray[iFrame].Matrix;
+ }
+
+ // Transform ourselves
+ D3DXMATRIX LocalWorld;
+ D3DXMatrixMultiply( &LocalWorld, &LocalTransform, pParentWorld );
+ m_pTransformedFrameMatrices[iFrame] = LocalWorld;
+ m_pWorldPoseFrameMatrices[iFrame] = LocalWorld;
+
+ // Transform our siblings
+ if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
+ TransformFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld, fTime );
+
+ // Transform our children
+ if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
+ TransformFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld, fTime );
+}
+
+//--------------------------------------------------------------------------------------
+// transform frame assuming that it is an absolute transformation
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::TransformFrameAbsolute( UINT iFrame, double fTime )
+{
+ D3DXMATRIX mTrans1;
+ D3DXMATRIX mTrans2;
+ D3DXMATRIX mRot1;
+ D3DXMATRIX mRot2;
+ D3DXQUATERNION quat1;
+ D3DXQUATERNION quat2;
+ D3DXMATRIX mTo;
+ D3DXMATRIX mInvTo;
+ D3DXMATRIX mFrom;
+
+ UINT iTick = GetAnimationKeyFromTime( fTime );
+
+ if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex )
+ {
+ SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ];
+ SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ];
+ SDKANIMATION_DATA* pDataOrig = &pFrameData->pAnimationData[ 0 ];
+
+ D3DXMatrixTranslation( &mTrans1, -pDataOrig->Translation.x,
+ -pDataOrig->Translation.y,
+ -pDataOrig->Translation.z );
+ D3DXMatrixTranslation( &mTrans2, pData->Translation.x,
+ pData->Translation.y,
+ pData->Translation.z );
+
+ quat1.x = pDataOrig->Orientation.x;
+ quat1.y = pDataOrig->Orientation.y;
+ quat1.z = pDataOrig->Orientation.z;
+ quat1.w = pDataOrig->Orientation.w;
+ D3DXQuaternionInverse( &quat1, &quat1 );
+ D3DXMatrixRotationQuaternion( &mRot1, &quat1 );
+ mInvTo = mTrans1 * mRot1;
+
+ quat2.x = pData->Orientation.x;
+ quat2.y = pData->Orientation.y;
+ quat2.z = pData->Orientation.z;
+ quat2.w = pData->Orientation.w;
+ D3DXMatrixRotationQuaternion( &mRot2, &quat2 );
+ mFrom = mRot2 * mTrans2;
+
+ D3DXMATRIX mOutput = mInvTo * mFrom;
+ m_pTransformedFrameMatrices[iFrame] = mOutput;
+ }
+}
+
+#define MAX_D3D11_VERTEX_STREAMS D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::RenderMesh( UINT iMesh,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot )
+{
+ if( 0 < GetOutstandingBufferResources() )
+ return;
+
+ SDKMESH_MESH* pMesh = &m_pMeshArray[iMesh];
+
+ UINT Strides[MAX_D3D11_VERTEX_STREAMS];
+ UINT Offsets[MAX_D3D11_VERTEX_STREAMS];
+ ID3D11Buffer* pVB[MAX_D3D11_VERTEX_STREAMS];
+
+ if( pMesh->NumVertexBuffers > MAX_D3D11_VERTEX_STREAMS )
+ return;
+
+ for( UINT64 i = 0; i < pMesh->NumVertexBuffers; i++ )
+ {
+ pVB[i] = m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].pVB11;
+ Strides[i] = ( UINT )m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].StrideBytes;
+ Offsets[i] = 0;
+ }
+
+ SDKMESH_INDEX_BUFFER_HEADER* pIndexBufferArray;
+ if( bAdjacent )
+ pIndexBufferArray = m_pAdjacencyIndexBufferArray;
+ else
+ pIndexBufferArray = m_pIndexBufferArray;
+
+ ID3D11Buffer* pIB = pIndexBufferArray[ pMesh->IndexBuffer ].pIB11;
+ DXGI_FORMAT ibFormat = DXGI_FORMAT_R16_UINT;
+ switch( pIndexBufferArray[ pMesh->IndexBuffer ].IndexType )
+ {
+ case IT_16BIT:
+ ibFormat = DXGI_FORMAT_R16_UINT;
+ break;
+ case IT_32BIT:
+ ibFormat = DXGI_FORMAT_R32_UINT;
+ break;
+ };
+
+ pd3dDeviceContext->IASetVertexBuffers( 0, pMesh->NumVertexBuffers, pVB, Strides, Offsets );
+ pd3dDeviceContext->IASetIndexBuffer( pIB, ibFormat, 0 );
+
+ SDKMESH_SUBSET* pSubset = NULL;
+ SDKMESH_MATERIAL* pMat = NULL;
+ D3D11_PRIMITIVE_TOPOLOGY PrimType;
+
+ for( UINT subset = 0; subset < pMesh->NumSubsets; subset++ )
+ {
+ pSubset = &m_pSubsetArray[ pMesh->pSubsets[subset] ];
+
+ PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
+ if( bAdjacent )
+ {
+ switch( PrimType )
+ {
+ case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST:
+ PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ;
+ break;
+ case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP:
+ PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ;
+ break;
+ case D3D11_PRIMITIVE_TOPOLOGY_LINELIST:
+ PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;
+ break;
+ case D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP:
+ PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ;
+ break;
+ }
+ }
+
+ pd3dDeviceContext->IASetPrimitiveTopology( PrimType );
+
+ pMat = &m_pMaterialArray[ pSubset->MaterialID ];
+ if( iDiffuseSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pDiffuseRV11 ) )
+ pd3dDeviceContext->PSSetShaderResources( iDiffuseSlot, 1, &pMat->pDiffuseRV11 );
+ if( iNormalSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pNormalRV11 ) )
+ pd3dDeviceContext->PSSetShaderResources( iNormalSlot, 1, &pMat->pNormalRV11 );
+ if( iSpecularSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pSpecularRV11 ) )
+ pd3dDeviceContext->PSSetShaderResources( iSpecularSlot, 1, &pMat->pSpecularRV11 );
+
+ UINT IndexCount = ( UINT )pSubset->IndexCount;
+ UINT IndexStart = ( UINT )pSubset->IndexStart;
+ UINT VertexStart = ( UINT )pSubset->VertexStart;
+ if( bAdjacent )
+ {
+ IndexCount *= 2;
+ IndexStart *= 2;
+ }
+
+ pd3dDeviceContext->DrawIndexed( IndexCount, IndexStart, VertexStart );
+ }
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::RenderFrame( UINT iFrame,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot )
+{
+ if( !m_pStaticMeshData || !m_pFrameArray )
+ return;
+
+ if( m_pFrameArray[iFrame].Mesh != INVALID_MESH )
+ {
+ RenderMesh( m_pFrameArray[iFrame].Mesh,
+ bAdjacent,
+ pd3dDeviceContext,
+ iDiffuseSlot,
+ iNormalSlot,
+ iSpecularSlot );
+ }
+
+ // Render our children
+ if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
+ RenderFrame( m_pFrameArray[iFrame].ChildFrame, bAdjacent, pd3dDeviceContext, iDiffuseSlot,
+ iNormalSlot, iSpecularSlot );
+
+ // Render our siblings
+ if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
+ RenderFrame( m_pFrameArray[iFrame].SiblingFrame, bAdjacent, pd3dDeviceContext, iDiffuseSlot,
+ iNormalSlot, iSpecularSlot );
+}
+
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::RenderMesh( UINT iMesh,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular )
+{
+ if( 0 < GetOutstandingBufferResources() )
+ return;
+
+ SDKMESH_MESH* pMesh = &m_pMeshArray[iMesh];
+
+ // set vb streams
+ for( UINT i = 0; i < ( UINT )pMesh->NumVertexBuffers; i++ )
+ {
+ pd3dDevice->SetStreamSource( i,
+ m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].pVB9,
+ 0,
+ ( UINT )m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].StrideBytes );
+ }
+
+ // Set our index buffer as well
+ pd3dDevice->SetIndices( m_pIndexBufferArray[ pMesh->IndexBuffer ].pIB9 );
+
+ // Render the scene with this technique
+ pEffect->SetTechnique( hTechnique );
+
+ SDKMESH_SUBSET* pSubset = NULL;
+ SDKMESH_MATERIAL* pMat = NULL;
+ D3DPRIMITIVETYPE PrimType;
+ UINT cPasses = 0;
+ pEffect->Begin( &cPasses, 0 );
+
+ for( UINT p = 0; p < cPasses; ++p )
+ {
+ pEffect->BeginPass( p );
+
+ for( UINT subset = 0; subset < pMesh->NumSubsets; subset++ )
+ {
+ pSubset = &m_pSubsetArray[ pMesh->pSubsets[subset] ];
+
+ PrimType = GetPrimitiveType9( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
+
+ if( INVALID_MATERIAL != pSubset->MaterialID && m_pMeshHeader->NumMaterials > 0 )
+ {
+ pMat = &m_pMaterialArray[ pSubset->MaterialID ];
+ if( htxDiffuse && !IsErrorResource( pMat->pDiffuseTexture9 ) )
+ pEffect->SetTexture( htxDiffuse, pMat->pDiffuseTexture9 );
+ if( htxNormal && !IsErrorResource( pMat->pNormalTexture9 ) )
+ pEffect->SetTexture( htxNormal, pMat->pNormalTexture9 );
+ if( htxSpecular && !IsErrorResource( pMat->pSpecularTexture9 ) )
+ pEffect->SetTexture( htxSpecular, pMat->pSpecularTexture9 );
+ }
+
+ pEffect->CommitChanges();
+
+ UINT PrimCount = ( UINT )pSubset->IndexCount;
+ UINT IndexStart = ( UINT )pSubset->IndexStart;
+ UINT VertexStart = ( UINT )pSubset->VertexStart;
+ UINT VertexCount = ( UINT )pSubset->VertexCount;
+ if( D3DPT_TRIANGLELIST == PrimType )
+ PrimCount /= 3;
+ if( D3DPT_LINELIST == PrimType )
+ PrimCount /= 2;
+ if( D3DPT_TRIANGLESTRIP == PrimType )
+ PrimCount = ( PrimCount - 3 ) + 1;
+ if( D3DPT_LINESTRIP == PrimType )
+ PrimCount -= 1;
+
+ pd3dDevice->DrawIndexedPrimitive( PrimType, VertexStart, 0, VertexCount, IndexStart, PrimCount );
+ }
+
+ pEffect->EndPass();
+ }
+
+ pEffect->End();
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::RenderFrame( UINT iFrame,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular )
+{
+ if( !m_pStaticMeshData || !m_pFrameArray )
+ return;
+
+ if( m_pFrameArray[iFrame].Mesh != INVALID_MESH )
+ {
+ RenderMesh( m_pFrameArray[iFrame].Mesh,
+ pd3dDevice,
+ pEffect,
+ hTechnique,
+ htxDiffuse,
+ htxNormal,
+ htxSpecular );
+ }
+
+ // Render our children
+ if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME )
+ RenderFrame( m_pFrameArray[iFrame].ChildFrame, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal,
+ htxSpecular );
+
+ // Render our siblings
+ if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME )
+ RenderFrame( m_pFrameArray[iFrame].SiblingFrame, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal,
+ htxSpecular );
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTSDKMesh::CDXUTSDKMesh() : m_NumOutstandingResources( 0 ),
+ m_bLoading( false ),
+ m_hFile( 0 ),
+ m_hFileMappingObject( 0 ),
+ m_pMeshHeader( NULL ),
+ m_pStaticMeshData( NULL ),
+ m_pHeapData( NULL ),
+ m_pAdjacencyIndexBufferArray( NULL ),
+ m_pAnimationData( NULL ),
+ m_pAnimationHeader( NULL ),
+ m_ppVertices( NULL ),
+ m_ppIndices( NULL ),
+ m_pBindPoseFrameMatrices( NULL ),
+ m_pTransformedFrameMatrices( NULL ),
+ m_pWorldPoseFrameMatrices( NULL ),
+ m_pDev9( NULL ),
+ m_pDev11( NULL )
+{
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTSDKMesh::~CDXUTSDKMesh()
+{
+ Destroy();
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks )
+{
+ return CreateFromFile( pDev11, NULL, szFileName, bCreateAdjacencyIndices, pLoaderCallbacks, NULL );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::Create( IDirect3DDevice9* pDev9, LPCTSTR szFileName, bool bCreateAdjacencyIndices,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks )
+{
+ return CreateFromFile( NULL, pDev9, szFileName, bCreateAdjacencyIndices, NULL, pLoaderCallbacks );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, BYTE* pData, UINT DataBytes, bool bCreateAdjacencyIndices,
+ bool bCopyStatic, SDKMESH_CALLBACKS11* pLoaderCallbacks )
+{
+ return CreateFromMemory( pDev11, NULL, pData, DataBytes, bCreateAdjacencyIndices, bCopyStatic,
+ pLoaderCallbacks, NULL );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::Create( IDirect3DDevice9* pDev9, BYTE* pData, UINT DataBytes, bool bCreateAdjacencyIndices,
+ bool bCopyStatic, SDKMESH_CALLBACKS9* pLoaderCallbacks )
+{
+ return CreateFromMemory( NULL, pDev9, pData, DataBytes, bCreateAdjacencyIndices, bCopyStatic, NULL,
+ pLoaderCallbacks );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTSDKMesh::LoadAnimation( WCHAR* szFileName )
+{
+ HRESULT hr = E_FAIL;
+ DWORD dwBytesRead = 0;
+ LARGE_INTEGER liMove;
+ WCHAR strPath[MAX_PATH];
+
+ // Find the path for the file
+ V_RETURN( DXUTFindDXSDKMediaFileCch( strPath, MAX_PATH, szFileName ) );
+
+ // Open the file
+ HANDLE hFile = CreateFile( strPath, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING,
+ FILE_FLAG_SEQUENTIAL_SCAN, NULL );
+ if( INVALID_HANDLE_VALUE == hFile )
+ return DXUTERR_MEDIANOTFOUND;
+
+ /////////////////////////
+ // Header
+ SDKANIMATION_FILE_HEADER fileheader;
+ if( !ReadFile( hFile, &fileheader, sizeof( SDKANIMATION_FILE_HEADER ), &dwBytesRead, NULL ) )
+ goto Error;
+
+ //allocate
+ m_pAnimationData = new BYTE[ ( size_t )( sizeof( SDKANIMATION_FILE_HEADER ) + fileheader.AnimationDataSize ) ];
+ if( !m_pAnimationData )
+ {
+ hr = E_OUTOFMEMORY;
+ goto Error;
+ }
+
+ // read it all in
+ liMove.QuadPart = 0;
+ if( !SetFilePointerEx( hFile, liMove, NULL, FILE_BEGIN ) )
+ goto Error;
+ if( !ReadFile( hFile, m_pAnimationData, ( DWORD )( sizeof( SDKANIMATION_FILE_HEADER ) +
+ fileheader.AnimationDataSize ), &dwBytesRead, NULL ) )
+ goto Error;
+
+ // pointer fixup
+ m_pAnimationHeader = ( SDKANIMATION_FILE_HEADER* )m_pAnimationData;
+ m_pAnimationFrameData = ( SDKANIMATION_FRAME_DATA* )( m_pAnimationData + m_pAnimationHeader->AnimationDataOffset );
+
+ UINT64 BaseOffset = sizeof( SDKANIMATION_FILE_HEADER );
+ for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ )
+ {
+ m_pAnimationFrameData[i].pAnimationData = ( SDKANIMATION_DATA* )( m_pAnimationData +
+ m_pAnimationFrameData[i].DataOffset +
+ BaseOffset );
+ SDKMESH_FRAME* pFrame = FindFrame( m_pAnimationFrameData[i].FrameName );
+ if( pFrame )
+ {
+ pFrame->AnimationDataIndex = i;
+ }
+ }
+
+ hr = S_OK;
+Error:
+ CloseHandle( hFile );
+ return hr;
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::Destroy()
+{
+ if( !CheckLoadDone() )
+ return;
+
+ if( m_pStaticMeshData )
+ {
+ if( m_pMaterialArray )
+ {
+ for( UINT64 m = 0; m < m_pMeshHeader->NumMaterials; m++ )
+ {
+ if( m_pDev9 )
+ {
+ if( !IsErrorResource( m_pMaterialArray[m].pDiffuseTexture9 ) )
+ SAFE_RELEASE( m_pMaterialArray[m].pDiffuseTexture9 );
+ if( !IsErrorResource( m_pMaterialArray[m].pNormalTexture9 ) )
+ SAFE_RELEASE( m_pMaterialArray[m].pNormalTexture9 );
+ if( !IsErrorResource( m_pMaterialArray[m].pSpecularTexture9 ) )
+ SAFE_RELEASE( m_pMaterialArray[m].pSpecularTexture9 );
+ }
+ else if( m_pDev11 )
+ {
+ //ID3D11Resource* pRes = NULL;
+ if( m_pMaterialArray[m].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[m].pDiffuseRV11 ) )
+ {
+ //m_pMaterialArray[m].pDiffuseRV11->GetResource( &pRes );
+ //SAFE_RELEASE( pRes );
+
+ SAFE_RELEASE( m_pMaterialArray[m].pDiffuseRV11 );
+ }
+ if( m_pMaterialArray[m].pNormalRV11 && !IsErrorResource( m_pMaterialArray[m].pNormalRV11 ) )
+ {
+ //m_pMaterialArray[m].pNormalRV11->GetResource( &pRes );
+ //SAFE_RELEASE( pRes );
+
+ SAFE_RELEASE( m_pMaterialArray[m].pNormalRV11 );
+ }
+ if( m_pMaterialArray[m].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[m].pSpecularRV11 ) )
+ {
+ //m_pMaterialArray[m].pSpecularRV11->GetResource( &pRes );
+ //SAFE_RELEASE( pRes );
+
+ SAFE_RELEASE( m_pMaterialArray[m].pSpecularRV11 );
+ }
+ }
+ }
+ }
+
+ for( UINT64 i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
+ {
+ if( !IsErrorResource( m_pVertexBufferArray[i].pVB9 ) )
+ SAFE_RELEASE( m_pVertexBufferArray[i].pVB9 );
+ }
+
+ for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
+ {
+ if( !IsErrorResource( m_pIndexBufferArray[i].pIB9 ) )
+ SAFE_RELEASE( m_pIndexBufferArray[i].pIB9 );
+ }
+ }
+
+ if( m_pAdjacencyIndexBufferArray )
+ {
+ for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
+ {
+ SAFE_RELEASE( m_pAdjacencyIndexBufferArray[i].pIB11 );
+ }
+ }
+ SAFE_DELETE_ARRAY( m_pAdjacencyIndexBufferArray );
+
+ SAFE_DELETE_ARRAY( m_pHeapData );
+ m_pStaticMeshData = NULL;
+ SAFE_DELETE_ARRAY( m_pAnimationData );
+ SAFE_DELETE_ARRAY( m_pBindPoseFrameMatrices );
+ SAFE_DELETE_ARRAY( m_pTransformedFrameMatrices );
+ SAFE_DELETE_ARRAY( m_pWorldPoseFrameMatrices );
+
+ SAFE_DELETE_ARRAY( m_ppVertices );
+ SAFE_DELETE_ARRAY( m_ppIndices );
+
+ m_pMeshHeader = NULL;
+ m_pVertexBufferArray = NULL;
+ m_pIndexBufferArray = NULL;
+ m_pMeshArray = NULL;
+ m_pSubsetArray = NULL;
+ m_pFrameArray = NULL;
+ m_pMaterialArray = NULL;
+
+ m_pAnimationHeader = NULL;
+ m_pAnimationFrameData = NULL;
+
+}
+
+//--------------------------------------------------------------------------------------
+// transform the bind pose
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::TransformBindPose( D3DXMATRIX* pWorld )
+{
+ TransformBindPoseFrame( 0, pWorld );
+}
+
+//--------------------------------------------------------------------------------------
+// transform the mesh frames according to the animation for time fTime
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::TransformMesh( D3DXMATRIX* pWorld, double fTime )
+{
+ if( m_pAnimationHeader == NULL || FTT_RELATIVE == m_pAnimationHeader->FrameTransformType )
+ {
+ TransformFrame( 0, pWorld, fTime );
+
+ // For each frame, move the transform to the bind pose, then
+ // move it to the final position
+ D3DXMATRIX mInvBindPose;
+ D3DXMATRIX mFinal;
+ for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ )
+ {
+ D3DXMatrixInverse( &mInvBindPose, NULL, &m_pBindPoseFrameMatrices[i] );
+ mFinal = mInvBindPose * m_pTransformedFrameMatrices[i];
+ m_pTransformedFrameMatrices[i] = mFinal;
+ }
+ }
+ else if( FTT_ABSOLUTE == m_pAnimationHeader->FrameTransformType )
+ {
+ for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ )
+ TransformFrameAbsolute( i, fTime );
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::Render( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot )
+{
+ RenderFrame( 0, false, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot );
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot )
+{
+ RenderFrame( 0, true, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot );
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular )
+{
+ RenderFrame( 0, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal, htxSpecular );
+}
+
+//--------------------------------------------------------------------------------------
+D3D11_PRIMITIVE_TOPOLOGY CDXUTSDKMesh::GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType )
+{
+ D3D11_PRIMITIVE_TOPOLOGY retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
+
+ switch( PrimType )
+ {
+ case PT_TRIANGLE_LIST:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
+ break;
+ case PT_TRIANGLE_STRIP:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
+ break;
+ case PT_LINE_LIST:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST;
+ break;
+ case PT_LINE_STRIP:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP;
+ break;
+ case PT_POINT_LIST:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
+ break;
+ case PT_TRIANGLE_LIST_ADJ:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ;
+ break;
+ case PT_TRIANGLE_STRIP_ADJ:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ;
+ break;
+ case PT_LINE_LIST_ADJ:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;
+ break;
+ case PT_LINE_STRIP_ADJ:
+ retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ;
+ break;
+ };
+
+ return retType;
+}
+
+//--------------------------------------------------------------------------------------
+DXGI_FORMAT CDXUTSDKMesh::GetIBFormat11( UINT iMesh )
+{
+ switch( m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].IndexType )
+ {
+ case IT_16BIT:
+ return DXGI_FORMAT_R16_UINT;
+ case IT_32BIT:
+ return DXGI_FORMAT_R32_UINT;
+ };
+ return DXGI_FORMAT_R16_UINT;
+}
+
+//--------------------------------------------------------------------------------------
+ID3D11Buffer* CDXUTSDKMesh::GetVB11( UINT iMesh, UINT iVB )
+{
+ return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB11;
+}
+
+//--------------------------------------------------------------------------------------
+ID3D11Buffer* CDXUTSDKMesh::GetIB11( UINT iMesh )
+{
+ return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11;
+}
+SDKMESH_INDEX_TYPE CDXUTSDKMesh::GetIndexType( UINT iMesh )
+{
+ return ( SDKMESH_INDEX_TYPE ) m_pIndexBufferArray[m_pMeshArray[ iMesh ].IndexBuffer].IndexType;
+}
+//--------------------------------------------------------------------------------------
+ID3D11Buffer* CDXUTSDKMesh::GetAdjIB11( UINT iMesh )
+{
+ return m_pAdjacencyIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11;
+}
+
+//--------------------------------------------------------------------------------------
+D3DPRIMITIVETYPE CDXUTSDKMesh::GetPrimitiveType9( SDKMESH_PRIMITIVE_TYPE PrimType )
+{
+ D3DPRIMITIVETYPE retType = D3DPT_TRIANGLELIST;
+
+ switch( PrimType )
+ {
+ case PT_TRIANGLE_LIST:
+ retType = D3DPT_TRIANGLELIST;
+ break;
+ case PT_TRIANGLE_STRIP:
+ retType = D3DPT_TRIANGLESTRIP;
+ break;
+ case PT_LINE_LIST:
+ retType = D3DPT_LINELIST;
+ break;
+ case PT_LINE_STRIP:
+ retType = D3DPT_LINESTRIP;
+ break;
+ case PT_POINT_LIST:
+ retType = D3DPT_POINTLIST;
+ break;
+ };
+
+ return retType;
+}
+
+//--------------------------------------------------------------------------------------
+D3DFORMAT CDXUTSDKMesh::GetIBFormat9( UINT iMesh )
+{
+ switch( m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].IndexType )
+ {
+ case IT_16BIT:
+ return D3DFMT_INDEX16;
+ case IT_32BIT:
+ return D3DFMT_INDEX32;
+ };
+ return D3DFMT_INDEX16;
+}
+
+//--------------------------------------------------------------------------------------
+IDirect3DVertexBuffer9* CDXUTSDKMesh::GetVB9( UINT iMesh, UINT iVB )
+{
+ return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB9;
+}
+
+//--------------------------------------------------------------------------------------
+IDirect3DIndexBuffer9* CDXUTSDKMesh::GetIB9( UINT iMesh )
+{
+ return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB9;
+}
+
+//--------------------------------------------------------------------------------------
+char* CDXUTSDKMesh::GetMeshPathA()
+{
+ return m_strPath;
+}
+
+//--------------------------------------------------------------------------------------
+WCHAR* CDXUTSDKMesh::GetMeshPathW()
+{
+ return m_strPathW;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumMeshes()
+{
+ if( !m_pMeshHeader )
+ return 0;
+ return m_pMeshHeader->NumMeshes;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumMaterials()
+{
+ if( !m_pMeshHeader )
+ return 0;
+ return m_pMeshHeader->NumMaterials;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumVBs()
+{
+ if( !m_pMeshHeader )
+ return 0;
+ return m_pMeshHeader->NumVertexBuffers;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumIBs()
+{
+ if( !m_pMeshHeader )
+ return 0;
+ return m_pMeshHeader->NumIndexBuffers;
+}
+
+//--------------------------------------------------------------------------------------
+ID3D11Buffer* CDXUTSDKMesh::GetVB11At( UINT iVB )
+{
+ return m_pVertexBufferArray[ iVB ].pVB11;
+}
+
+//--------------------------------------------------------------------------------------
+ID3D11Buffer* CDXUTSDKMesh::GetIB11At( UINT iIB )
+{
+ return m_pIndexBufferArray[ iIB ].pIB11;
+}
+
+//--------------------------------------------------------------------------------------
+IDirect3DVertexBuffer9* CDXUTSDKMesh::GetVB9At( UINT iVB )
+{
+ return m_pVertexBufferArray[ iVB ].pVB9;
+}
+
+//--------------------------------------------------------------------------------------
+IDirect3DIndexBuffer9* CDXUTSDKMesh::GetIB9At( UINT iIB )
+{
+ return m_pIndexBufferArray[ iIB ].pIB9;
+}
+
+//--------------------------------------------------------------------------------------
+BYTE* CDXUTSDKMesh::GetRawVerticesAt( UINT iVB )
+{
+ return m_ppVertices[iVB];
+}
+
+//--------------------------------------------------------------------------------------
+BYTE* CDXUTSDKMesh::GetRawIndicesAt( UINT iIB )
+{
+ return m_ppIndices[iIB];
+}
+
+//--------------------------------------------------------------------------------------
+SDKMESH_MATERIAL* CDXUTSDKMesh::GetMaterial( UINT iMaterial )
+{
+ return &m_pMaterialArray[ iMaterial ];
+}
+
+//--------------------------------------------------------------------------------------
+SDKMESH_MESH* CDXUTSDKMesh::GetMesh( UINT iMesh )
+{
+ return &m_pMeshArray[ iMesh ];
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumSubsets( UINT iMesh )
+{
+ return m_pMeshArray[ iMesh ].NumSubsets;
+}
+
+//--------------------------------------------------------------------------------------
+SDKMESH_SUBSET* CDXUTSDKMesh::GetSubset( UINT iMesh, UINT iSubset )
+{
+ return &m_pSubsetArray[ m_pMeshArray[ iMesh ].pSubsets[iSubset] ];
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetVertexStride( UINT iMesh, UINT iVB )
+{
+ return ( UINT )m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].StrideBytes;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumFrames()
+{
+ return m_pMeshHeader->NumFrames;
+}
+
+//--------------------------------------------------------------------------------------
+SDKMESH_FRAME* CDXUTSDKMesh::GetFrame( UINT iFrame )
+{
+ assert( iFrame < m_pMeshHeader->NumFrames );
+ return &m_pFrameArray[ iFrame ];
+}
+
+//--------------------------------------------------------------------------------------
+SDKMESH_FRAME* CDXUTSDKMesh::FindFrame( char* pszName )
+{
+ for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ )
+ {
+ if( _stricmp( m_pFrameArray[i].Name, pszName ) == 0 )
+ {
+ return &m_pFrameArray[i];
+ }
+ }
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------
+UINT64 CDXUTSDKMesh::GetNumVertices( UINT iMesh, UINT iVB )
+{
+ return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].NumVertices;
+}
+
+//--------------------------------------------------------------------------------------
+UINT64 CDXUTSDKMesh::GetNumIndices( UINT iMesh )
+{
+ return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].NumIndices;
+}
+
+//--------------------------------------------------------------------------------------
+D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxCenter( UINT iMesh )
+{
+ return m_pMeshArray[iMesh].BoundingBoxCenter;
+}
+
+//--------------------------------------------------------------------------------------
+D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxExtents( UINT iMesh )
+{
+ return m_pMeshArray[iMesh].BoundingBoxExtents;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetOutstandingResources()
+{
+ UINT outstandingResources = 0;
+ if( !m_pMeshHeader )
+ return 1;
+
+ outstandingResources += GetOutstandingBufferResources();
+
+ if( m_pDev11 )
+ {
+ for( UINT i = 0; i < m_pMeshHeader->NumMaterials; i++ )
+ {
+ if( m_pMaterialArray[i].DiffuseTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[i].pDiffuseRV11 ) )
+ outstandingResources ++;
+ }
+
+ if( m_pMaterialArray[i].NormalTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pNormalRV11 && !IsErrorResource( m_pMaterialArray[i].pNormalRV11 ) )
+ outstandingResources ++;
+ }
+
+ if( m_pMaterialArray[i].SpecularTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[i].pSpecularRV11 ) )
+ outstandingResources ++;
+ }
+ }
+ }
+ else
+ {
+ for( UINT i = 0; i < m_pMeshHeader->NumMaterials; i++ )
+ {
+ if( m_pMaterialArray[i].DiffuseTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pDiffuseTexture9 && !IsErrorResource( m_pMaterialArray[i].pDiffuseTexture9 ) )
+ outstandingResources ++;
+ }
+
+ if( m_pMaterialArray[i].NormalTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pNormalTexture9 && !IsErrorResource( m_pMaterialArray[i].pNormalTexture9 ) )
+ outstandingResources ++;
+ }
+
+ if( m_pMaterialArray[i].SpecularTexture[0] != 0 )
+ {
+ if( !m_pMaterialArray[i].pSpecularTexture9 &&
+ !IsErrorResource( m_pMaterialArray[i].pSpecularTexture9 ) )
+ outstandingResources ++;
+ }
+ }
+ }
+
+ return outstandingResources;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetOutstandingBufferResources()
+{
+ UINT outstandingResources = 0;
+ if( !m_pMeshHeader )
+ return 1;
+
+ for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
+ {
+ if( !m_pVertexBufferArray[i].pVB9 && !IsErrorResource( m_pVertexBufferArray[i].pVB9 ) )
+ outstandingResources ++;
+ }
+
+ for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
+ {
+ if( !m_pIndexBufferArray[i].pIB9 && !IsErrorResource( m_pIndexBufferArray[i].pIB9 ) )
+ outstandingResources ++;
+ }
+
+ return outstandingResources;
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTSDKMesh::CheckLoadDone()
+{
+ if( 0 == GetOutstandingResources() )
+ {
+ m_bLoading = false;
+ return true;
+ }
+
+ return false;
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTSDKMesh::IsLoaded()
+{
+ if( m_pStaticMeshData && !m_bLoading )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+//--------------------------------------------------------------------------------------
+bool CDXUTSDKMesh::IsLoading()
+{
+ return m_bLoading;
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTSDKMesh::SetLoading( bool bLoading )
+{
+ m_bLoading = bLoading;
+}
+
+//--------------------------------------------------------------------------------------
+BOOL CDXUTSDKMesh::HadLoadingError()
+{
+ if( m_pMeshHeader )
+ {
+ for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ )
+ {
+ if( IsErrorResource( m_pVertexBufferArray[i].pVB9 ) )
+ return TRUE;
+ }
+
+ for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ )
+ {
+ if( IsErrorResource( m_pIndexBufferArray[i].pIB9 ) )
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetNumInfluences( UINT iMesh )
+{
+ return m_pMeshArray[iMesh].NumFrameInfluences;
+}
+
+//--------------------------------------------------------------------------------------
+const D3DXMATRIX* CDXUTSDKMesh::GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence )
+{
+ UINT iFrame = m_pMeshArray[iMesh].pFrameInfluences[ iInfluence ];
+ return &m_pTransformedFrameMatrices[iFrame];
+}
+
+const D3DXMATRIX* CDXUTSDKMesh::GetWorldMatrix( UINT iFrameIndex )
+{
+ return &m_pWorldPoseFrameMatrices[iFrameIndex];
+}
+
+const D3DXMATRIX* CDXUTSDKMesh::GetInfluenceMatrix( UINT iFrameIndex )
+{
+ return &m_pTransformedFrameMatrices[iFrameIndex];
+}
+
+//--------------------------------------------------------------------------------------
+UINT CDXUTSDKMesh::GetAnimationKeyFromTime( double fTime )
+{
+ if( m_pAnimationHeader == NULL )
+ {
+ return 0;
+ }
+
+ UINT iTick = ( UINT )( m_pAnimationHeader->AnimationFPS * fTime );
+
+ iTick = iTick % ( m_pAnimationHeader->NumAnimationKeys - 1 );
+ iTick ++;
+
+ return iTick;
+}
+
+bool CDXUTSDKMesh::GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime )
+{
+ if( m_pAnimationHeader == NULL )
+ {
+ return false;
+ }
+
+ *pNumKeys = m_pAnimationHeader->NumAnimationKeys;
+ *pFrameTime = 1.0f / (FLOAT)m_pAnimationHeader->AnimationFPS;
+
+ return true;
+}
+
+
+//-------------------------------------------------------------------------------------
+// CDXUTXFileMesh implementation.
+//-------------------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+CDXUTXFileMesh::CDXUTXFileMesh( LPCWSTR strName )
+{
+ wcscpy_s( m_strName, 512, strName );
+ m_pMesh = NULL;
+ m_pMaterials = NULL;
+ m_pTextures = NULL;
+ m_bUseMaterials = TRUE;
+ m_pVB = NULL;
+ m_pIB = NULL;
+ m_pDecl = NULL;
+ m_strMaterials = NULL;
+ m_dwNumMaterials = 0;
+ m_dwNumVertices = 0;
+ m_dwNumFaces = 0;
+ m_dwBytesPerVertex = 0;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+CDXUTXFileMesh::~CDXUTXFileMesh()
+{
+ Destroy();
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename )
+{
+ WCHAR strPath[MAX_PATH];
+ LPD3DXBUFFER pAdjacencyBuffer = NULL;
+ LPD3DXBUFFER pMtrlBuffer = NULL;
+ HRESULT hr;
+
+ // Cleanup previous mesh if any
+ Destroy();
+
+ // Find the path for the file, and convert it to ANSI (for the D3DX API)
+ DXUTFindDXSDKMediaFileCch( strPath, sizeof( strPath ) / sizeof( WCHAR ), strFilename );
+
+ // Load the mesh
+ if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_MANAGED, pd3dDevice,
+ &pAdjacencyBuffer, &pMtrlBuffer, NULL,
+ &m_dwNumMaterials, &m_pMesh ) ) )
+ {
+ return hr;
+ }
+
+ // Optimize the mesh for performance
+ if( FAILED( hr = m_pMesh->OptimizeInplace(
+ D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
+ ( DWORD* )pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
+ {
+ SAFE_RELEASE( pAdjacencyBuffer );
+ SAFE_RELEASE( pMtrlBuffer );
+ return hr;
+ }
+
+ // Set strPath to the path of the mesh file
+ WCHAR* pLastBSlash = wcsrchr( strPath, L'\\' );
+ if( pLastBSlash )
+ *( pLastBSlash + 1 ) = L'\0';
+ else
+ *strPath = L'\0';
+
+ D3DXMATERIAL* d3dxMtrls = ( D3DXMATERIAL* )pMtrlBuffer->GetBufferPointer();
+ hr = CreateMaterials( strPath, pd3dDevice, d3dxMtrls, m_dwNumMaterials );
+
+ SAFE_RELEASE( pAdjacencyBuffer );
+ SAFE_RELEASE( pMtrlBuffer );
+
+ // Extract data from m_pMesh for easy access
+ D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
+ m_dwNumVertices = m_pMesh->GetNumVertices();
+ m_dwNumFaces = m_pMesh->GetNumFaces();
+ m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex();
+ m_pMesh->GetIndexBuffer( &m_pIB );
+ m_pMesh->GetVertexBuffer( &m_pVB );
+ m_pMesh->GetDeclaration( decl );
+ pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl );
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXFILEDATA pFileData )
+{
+ LPD3DXBUFFER pMtrlBuffer = NULL;
+ LPD3DXBUFFER pAdjacencyBuffer = NULL;
+ HRESULT hr;
+
+ // Cleanup previous mesh if any
+ Destroy();
+
+ // Load the mesh from the DXFILEDATA object
+ if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_MANAGED, pd3dDevice,
+ &pAdjacencyBuffer, &pMtrlBuffer, NULL,
+ &m_dwNumMaterials, &m_pMesh ) ) )
+ {
+ return hr;
+ }
+
+ // Optimize the mesh for performance
+ if( FAILED( hr = m_pMesh->OptimizeInplace(
+ D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
+ ( DWORD* )pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
+ {
+ SAFE_RELEASE( pAdjacencyBuffer );
+ SAFE_RELEASE( pMtrlBuffer );
+ return hr;
+ }
+
+ D3DXMATERIAL* d3dxMtrls = ( D3DXMATERIAL* )pMtrlBuffer->GetBufferPointer();
+ hr = CreateMaterials( L"", pd3dDevice, d3dxMtrls, m_dwNumMaterials );
+
+ SAFE_RELEASE( pAdjacencyBuffer );
+ SAFE_RELEASE( pMtrlBuffer );
+
+ // Extract data from m_pMesh for easy access
+ D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
+ m_dwNumVertices = m_pMesh->GetNumVertices();
+ m_dwNumFaces = m_pMesh->GetNumFaces();
+ m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex();
+ m_pMesh->GetIndexBuffer( &m_pIB );
+ m_pMesh->GetVertexBuffer( &m_pVB );
+ m_pMesh->GetDeclaration( decl );
+ pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl );
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh,
+ D3DXMATERIAL* pd3dxMaterials, DWORD dwMaterials )
+{
+ // Cleanup previous mesh if any
+ Destroy();
+
+ // Optimize the mesh for performance
+ DWORD* rgdwAdjacency = NULL;
+ rgdwAdjacency = new DWORD[pInMesh->GetNumFaces() * 3];
+ if( rgdwAdjacency == NULL )
+ return E_OUTOFMEMORY;
+ pInMesh->GenerateAdjacency( 1e-6f, rgdwAdjacency );
+
+ D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
+ pInMesh->GetDeclaration( decl );
+
+ DWORD dwOptions = pInMesh->GetOptions();
+ dwOptions &= ~( D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM | D3DXMESH_WRITEONLY );
+ dwOptions |= D3DXMESH_MANAGED;
+ dwOptions |= D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE;
+
+ ID3DXMesh* pTempMesh = NULL;
+ if( FAILED( pInMesh->Optimize( dwOptions, rgdwAdjacency, NULL, NULL, NULL, &pTempMesh ) ) )
+ {
+ SAFE_DELETE_ARRAY( rgdwAdjacency );
+ return E_FAIL;
+ }
+
+ SAFE_DELETE_ARRAY( rgdwAdjacency );
+ SAFE_RELEASE( m_pMesh );
+ m_pMesh = pTempMesh;
+
+ HRESULT hr;
+ hr = CreateMaterials( L"", pd3dDevice, pd3dxMaterials, dwMaterials );
+
+ // Extract data from m_pMesh for easy access
+ m_dwNumVertices = m_pMesh->GetNumVertices();
+ m_dwNumFaces = m_pMesh->GetNumFaces();
+ m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex();
+ m_pMesh->GetIndexBuffer( &m_pIB );
+ m_pMesh->GetVertexBuffer( &m_pVB );
+ m_pMesh->GetDeclaration( decl );
+ pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl );
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::CreateMaterials( LPCWSTR strPath, IDirect3DDevice9* pd3dDevice, D3DXMATERIAL* d3dxMtrls,
+ DWORD dwNumMaterials )
+{
+ // Get material info for the mesh
+ // Get the array of materials out of the buffer
+ m_dwNumMaterials = dwNumMaterials;
+ if( d3dxMtrls && m_dwNumMaterials > 0 )
+ {
+ // Allocate memory for the materials and textures
+ m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials];
+ if( m_pMaterials == NULL )
+ return E_OUTOFMEMORY;
+ m_pTextures = new LPDIRECT3DBASETEXTURE9[m_dwNumMaterials];
+ if( m_pTextures == NULL )
+ return E_OUTOFMEMORY;
+ m_strMaterials = new CHAR[m_dwNumMaterials][MAX_PATH];
+ if( m_strMaterials == NULL )
+ return E_OUTOFMEMORY;
+
+ // Copy each material and create its texture
+ for( DWORD i = 0; i < m_dwNumMaterials; i++ )
+ {
+ // Copy the material
+ m_pMaterials[i] = d3dxMtrls[i].MatD3D;
+ m_pTextures[i] = NULL;
+
+ // Create a texture
+ if( d3dxMtrls[i].pTextureFilename )
+ {
+ strcpy_s( m_strMaterials[i], MAX_PATH, d3dxMtrls[i].pTextureFilename );
+
+ WCHAR strTexture[MAX_PATH];
+ WCHAR strTextureTemp[MAX_PATH];
+ D3DXIMAGE_INFO ImgInfo;
+
+ // First attempt to look for texture in the same folder as the input folder.
+ MultiByteToWideChar( CP_ACP, 0, d3dxMtrls[i].pTextureFilename, -1, strTextureTemp, MAX_PATH );
+ strTextureTemp[MAX_PATH - 1] = 0;
+
+ wcscpy_s( strTexture, MAX_PATH, strPath );
+ wcscat_s( strTexture, MAX_PATH, strTextureTemp );
+
+ // Inspect the texture file to determine the texture type.
+ if( FAILED( D3DXGetImageInfoFromFile( strTexture, &ImgInfo ) ) )
+ {
+ // Search the media folder
+ if( FAILED( DXUTFindDXSDKMediaFileCch( strTexture, MAX_PATH, strTextureTemp ) ) )
+ continue; // Can't find. Skip.
+
+ D3DXGetImageInfoFromFile( strTexture, &ImgInfo );
+ }
+
+ // Call the appropriate loader according to the texture type.
+ switch( ImgInfo.ResourceType )
+ {
+ case D3DRTYPE_TEXTURE:
+ {
+ IDirect3DTexture9* pTex;
+ if( SUCCEEDED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, &pTex ) ) )
+ {
+ // Obtain the base texture interface
+ pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] );
+ // Release the specialized instance
+ pTex->Release();
+ }
+ break;
+ }
+ case D3DRTYPE_CUBETEXTURE:
+ {
+ IDirect3DCubeTexture9* pTex;
+ if( SUCCEEDED( D3DXCreateCubeTextureFromFile( pd3dDevice, strTexture, &pTex ) ) )
+ {
+ // Obtain the base texture interface
+ pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] );
+ // Release the specialized instance
+ pTex->Release();
+ }
+ break;
+ }
+ case D3DRTYPE_VOLUMETEXTURE:
+ {
+ IDirect3DVolumeTexture9* pTex;
+ if( SUCCEEDED( D3DXCreateVolumeTextureFromFile( pd3dDevice, strTexture, &pTex ) ) )
+ {
+ // Obtain the base texture interface
+ pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] );
+ // Release the specialized instance
+ pTex->Release();
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF )
+{
+ LPD3DXMESH pTempMesh = NULL;
+
+ if( m_pMesh )
+ {
+ if( FAILED( m_pMesh->CloneMeshFVF( m_pMesh->GetOptions(), dwFVF,
+ pd3dDevice, &pTempMesh ) ) )
+ {
+ SAFE_RELEASE( pTempMesh );
+ return E_FAIL;
+ }
+
+ DWORD dwOldFVF = 0;
+ dwOldFVF = m_pMesh->GetFVF();
+ SAFE_RELEASE( m_pMesh );
+ m_pMesh = pTempMesh;
+
+ // Compute normals if they are being requested and
+ // the old mesh does not have them.
+ if( !( dwOldFVF & D3DFVF_NORMAL ) && dwFVF & D3DFVF_NORMAL )
+ {
+ D3DXComputeNormals( m_pMesh, NULL );
+ }
+ }
+
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Convert the mesh to the format specified by the given vertex declarations.
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9* pDecl,
+ bool bAutoComputeNormals, bool bAutoComputeTangents,
+ bool bSplitVertexForOptimalTangents )
+{
+ LPD3DXMESH pTempMesh = NULL;
+
+ if( m_pMesh )
+ {
+ if( FAILED( m_pMesh->CloneMesh( m_pMesh->GetOptions(), pDecl,
+ pd3dDevice, &pTempMesh ) ) )
+ {
+ SAFE_RELEASE( pTempMesh );
+ return E_FAIL;
+ }
+ }
+
+
+ // Check if the old declaration contains a normal.
+ bool bHadNormal = false;
+ bool bHadTangent = false;
+ D3DVERTEXELEMENT9 aOldDecl[MAX_FVF_DECL_SIZE];
+ if( m_pMesh && SUCCEEDED( m_pMesh->GetDeclaration( aOldDecl ) ) )
+ {
+ for( UINT index = 0; index < D3DXGetDeclLength( aOldDecl ); ++index )
+ {
+ if( aOldDecl[index].Usage == D3DDECLUSAGE_NORMAL )
+ {
+ bHadNormal = true;
+ }
+ if( aOldDecl[index].Usage == D3DDECLUSAGE_TANGENT )
+ {
+ bHadTangent = true;
+ }
+ }
+ }
+
+ // Check if the new declaration contains a normal.
+ bool bHaveNormalNow = false;
+ bool bHaveTangentNow = false;
+ D3DVERTEXELEMENT9 aNewDecl[MAX_FVF_DECL_SIZE];
+ if( pTempMesh && SUCCEEDED( pTempMesh->GetDeclaration( aNewDecl ) ) )
+ {
+ for( UINT index = 0; index < D3DXGetDeclLength( aNewDecl ); ++index )
+ {
+ if( aNewDecl[index].Usage == D3DDECLUSAGE_NORMAL )
+ {
+ bHaveNormalNow = true;
+ }
+ if( aNewDecl[index].Usage == D3DDECLUSAGE_TANGENT )
+ {
+ bHaveTangentNow = true;
+ }
+ }
+ }
+
+ SAFE_RELEASE( m_pMesh );
+
+ if( pTempMesh )
+ {
+ m_pMesh = pTempMesh;
+
+ if( !bHadNormal && bHaveNormalNow && bAutoComputeNormals )
+ {
+ // Compute normals in case the meshes have them
+ D3DXComputeNormals( m_pMesh, NULL );
+ }
+
+ if( bHaveNormalNow && !bHadTangent && bHaveTangentNow && bAutoComputeTangents )
+ {
+ ID3DXMesh* pNewMesh;
+ HRESULT hr;
+
+ DWORD* rgdwAdjacency = NULL;
+ rgdwAdjacency = new DWORD[m_pMesh->GetNumFaces() * 3];
+ if( rgdwAdjacency == NULL )
+ return E_OUTOFMEMORY;
+ V( m_pMesh->GenerateAdjacency( 1e-6f, rgdwAdjacency ) );
+
+ float fPartialEdgeThreshold;
+ float fSingularPointThreshold;
+ float fNormalEdgeThreshold;
+ if( bSplitVertexForOptimalTangents )
+ {
+ fPartialEdgeThreshold = 0.01f;
+ fSingularPointThreshold = 0.25f;
+ fNormalEdgeThreshold = 0.01f;
+ }
+ else
+ {
+ fPartialEdgeThreshold = -1.01f;
+ fSingularPointThreshold = 0.01f;
+ fNormalEdgeThreshold = -1.01f;
+ }
+
+ // Compute tangents, which are required for normal mapping
+ hr = D3DXComputeTangentFrameEx( m_pMesh,
+ D3DDECLUSAGE_TEXCOORD, 0,
+ D3DDECLUSAGE_TANGENT, 0,
+ D3DX_DEFAULT, 0,
+ D3DDECLUSAGE_NORMAL, 0,
+ 0, rgdwAdjacency,
+ fPartialEdgeThreshold, fSingularPointThreshold, fNormalEdgeThreshold,
+ &pNewMesh, NULL );
+
+ SAFE_DELETE_ARRAY( rgdwAdjacency );
+ if( FAILED( hr ) )
+ return hr;
+
+ SAFE_RELEASE( m_pMesh );
+ m_pMesh = pNewMesh;
+ }
+ }
+
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
+{
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::InvalidateDeviceObjects()
+{
+ SAFE_RELEASE( m_pIB );
+ SAFE_RELEASE( m_pVB );
+ SAFE_RELEASE( m_pDecl );
+
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Destroy()
+{
+ InvalidateDeviceObjects();
+ for( UINT i = 0; i < m_dwNumMaterials; i++ )
+ SAFE_RELEASE( m_pTextures[i] );
+ SAFE_DELETE_ARRAY( m_pTextures );
+ SAFE_DELETE_ARRAY( m_pMaterials );
+ SAFE_DELETE_ARRAY( m_strMaterials );
+
+ SAFE_RELEASE( m_pMesh );
+
+ m_dwNumMaterials = 0L;
+
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice, bool bDrawOpaqueSubsets,
+ bool bDrawAlphaSubsets )
+{
+ if( NULL == m_pMesh )
+ return E_FAIL;
+
+ // Frist, draw the subsets without alpha
+ if( bDrawOpaqueSubsets )
+ {
+ for( DWORD i = 0; i < m_dwNumMaterials; i++ )
+ {
+ if( m_bUseMaterials )
+ {
+ if( m_pMaterials[i].Diffuse.a < 1.0f )
+ continue;
+ pd3dDevice->SetMaterial( &m_pMaterials[i] );
+ pd3dDevice->SetTexture( 0, m_pTextures[i] );
+ }
+ m_pMesh->DrawSubset( i );
+ }
+ }
+
+ // Then, draw the subsets with alpha
+ if( bDrawAlphaSubsets && m_bUseMaterials )
+ {
+ for( DWORD i = 0; i < m_dwNumMaterials; i++ )
+ {
+ if( m_pMaterials[i].Diffuse.a == 1.0f )
+ continue;
+
+ // Set the material and texture
+ pd3dDevice->SetMaterial( &m_pMaterials[i] );
+ pd3dDevice->SetTexture( 0, m_pTextures[i] );
+ m_pMesh->DrawSubset( i );
+ }
+ }
+
+ return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+HRESULT CDXUTXFileMesh::Render( ID3DXEffect* pEffect,
+ D3DXHANDLE hTexture,
+ D3DXHANDLE hDiffuse,
+ D3DXHANDLE hAmbient,
+ D3DXHANDLE hSpecular,
+ D3DXHANDLE hEmissive,
+ D3DXHANDLE hPower,
+ bool bDrawOpaqueSubsets,
+ bool bDrawAlphaSubsets )
+{
+ if( NULL == m_pMesh )
+ return E_FAIL;
+
+ UINT cPasses;
+ // Frist, draw the subsets without alpha
+ if( bDrawOpaqueSubsets )
+ {
+ pEffect->Begin( &cPasses, 0 );
+ for( UINT p = 0; p < cPasses; ++p )
+ {
+ pEffect->BeginPass( p );
+ for( DWORD i = 0; i < m_dwNumMaterials; i++ )
+ {
+ if( m_bUseMaterials )
+ {
+ if( m_pMaterials[i].Diffuse.a < 1.0f )
+ continue;
+ if( hTexture )
+ pEffect->SetTexture( hTexture, m_pTextures[i] );
+ // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical.
+ // No conversion is needed.
+ if( hDiffuse )
+ pEffect->SetVector( hDiffuse, ( D3DXVECTOR4* )&m_pMaterials[i].Diffuse );
+ if( hAmbient )
+ pEffect->SetVector( hAmbient, ( D3DXVECTOR4* )&m_pMaterials[i].Ambient );
+ if( hSpecular )
+ pEffect->SetVector( hSpecular, ( D3DXVECTOR4* )&m_pMaterials[i].Specular );
+ if( hEmissive )
+ pEffect->SetVector( hEmissive, ( D3DXVECTOR4* )&m_pMaterials[i].Emissive );
+ if( hPower )
+ pEffect->SetFloat( hPower, m_pMaterials[i].Power );
+ pEffect->CommitChanges();
+ }
+ m_pMesh->DrawSubset( i );
+ }
+ pEffect->EndPass();
+ }
+ pEffect->End();
+ }
+
+ // Then, draw the subsets with alpha
+ if( bDrawAlphaSubsets && m_bUseMaterials )
+ {
+ pEffect->Begin( &cPasses, 0 );
+ for( UINT p = 0; p < cPasses; ++p )
+ {
+ pEffect->BeginPass( p );
+ for( DWORD i = 0; i < m_dwNumMaterials; i++ )
+ {
+ if( m_bUseMaterials )
+ {
+ if( m_pMaterials[i].Diffuse.a == 1.0f )
+ continue;
+ if( hTexture )
+ pEffect->SetTexture( hTexture, m_pTextures[i] );
+ // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical.
+ // No conversion is needed.
+ if( hDiffuse )
+ pEffect->SetVector( hDiffuse, ( D3DXVECTOR4* )&m_pMaterials[i].Diffuse );
+ if( hAmbient )
+ pEffect->SetVector( hAmbient, ( D3DXVECTOR4* )&m_pMaterials[i].Ambient );
+ if( hSpecular )
+ pEffect->SetVector( hSpecular, ( D3DXVECTOR4* )&m_pMaterials[i].Specular );
+ if( hEmissive )
+ pEffect->SetVector( hEmissive, ( D3DXVECTOR4* )&m_pMaterials[i].Emissive );
+ if( hPower )
+ pEffect->SetFloat( hPower, m_pMaterials[i].Power );
+ pEffect->CommitChanges();
+ }
+ m_pMesh->DrawSubset( i );
+ }
+ pEffect->EndPass();
+ }
+ pEffect->End();
+ }
+
+ return S_OK;
+}
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
new file mode 100644
index 0000000..2032c52
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKmesh.h
@@ -0,0 +1,589 @@
+//--------------------------------------------------------------------------------------
+// File: SDKMesh.h
+//
+// Disclaimer:
+// The SDK Mesh format (.sdkmesh) is not a recommended file format for shipping titles.
+// It was designed to meet the specific needs of the SDK samples. Any real-world
+// applications should avoid this file format in favor of a destination format that
+// meets the specific needs of the application.
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef _SDKMESH_
+#define _SDKMESH_
+
+//--------------------------------------------------------------------------------------
+// Hard Defines for the various structures
+//--------------------------------------------------------------------------------------
+#define SDKMESH_FILE_VERSION 101
+#define MAX_VERTEX_ELEMENTS 32
+#define MAX_VERTEX_STREAMS 16
+#define MAX_FRAME_NAME 100
+#define MAX_MESH_NAME 100
+#define MAX_SUBSET_NAME 100
+#define MAX_MATERIAL_NAME 100
+#define MAX_TEXTURE_NAME MAX_PATH
+#define MAX_MATERIAL_PATH MAX_PATH
+#define INVALID_FRAME ((UINT)-1)
+#define INVALID_MESH ((UINT)-1)
+#define INVALID_MATERIAL ((UINT)-1)
+#define INVALID_SUBSET ((UINT)-1)
+#define INVALID_ANIMATION_DATA ((UINT)-1)
+#define INVALID_SAMPLER_SLOT ((UINT)-1)
+#define ERROR_RESOURCE_VALUE 1
+
+template<typename TYPE> BOOL IsErrorResource( TYPE data )
+{
+ if( ( TYPE )ERROR_RESOURCE_VALUE == data )
+ return TRUE;
+ return FALSE;
+}
+//--------------------------------------------------------------------------------------
+// Enumerated Types. These will have mirrors in both D3D9 and D3D11
+//--------------------------------------------------------------------------------------
+enum SDKMESH_PRIMITIVE_TYPE
+{
+ PT_TRIANGLE_LIST = 0,
+ PT_TRIANGLE_STRIP,
+ PT_LINE_LIST,
+ PT_LINE_STRIP,
+ PT_POINT_LIST,
+ PT_TRIANGLE_LIST_ADJ,
+ PT_TRIANGLE_STRIP_ADJ,
+ PT_LINE_LIST_ADJ,
+ PT_LINE_STRIP_ADJ,
+ PT_QUAD_PATCH_LIST,
+ PT_TRIANGLE_PATCH_LIST,
+};
+
+enum SDKMESH_INDEX_TYPE
+{
+ IT_16BIT = 0,
+ IT_32BIT,
+};
+
+enum FRAME_TRANSFORM_TYPE
+{
+ FTT_RELATIVE = 0,
+ FTT_ABSOLUTE, //This is not currently used but is here to support absolute transformations in the future
+};
+
+//--------------------------------------------------------------------------------------
+// Structures. Unions with pointers are forced to 64bit.
+//--------------------------------------------------------------------------------------
+struct SDKMESH_HEADER
+{
+ //Basic Info and sizes
+ UINT Version;
+ BYTE IsBigEndian;
+ UINT64 HeaderSize;
+ UINT64 NonBufferDataSize;
+ UINT64 BufferDataSize;
+
+ //Stats
+ UINT NumVertexBuffers;
+ UINT NumIndexBuffers;
+ UINT NumMeshes;
+ UINT NumTotalSubsets;
+ UINT NumFrames;
+ UINT NumMaterials;
+
+ //Offsets to Data
+ UINT64 VertexStreamHeadersOffset;
+ UINT64 IndexStreamHeadersOffset;
+ UINT64 MeshDataOffset;
+ UINT64 SubsetDataOffset;
+ UINT64 FrameDataOffset;
+ UINT64 MaterialDataOffset;
+};
+
+struct SDKMESH_VERTEX_BUFFER_HEADER
+{
+ UINT64 NumVertices;
+ UINT64 SizeBytes;
+ UINT64 StrideBytes;
+ D3DVERTEXELEMENT9 Decl[MAX_VERTEX_ELEMENTS];
+ union
+ {
+ UINT64 DataOffset; //(This also forces the union to 64bits)
+ IDirect3DVertexBuffer9* pVB9;
+ ID3D11Buffer* pVB11;
+ };
+};
+
+struct SDKMESH_INDEX_BUFFER_HEADER
+{
+ UINT64 NumIndices;
+ UINT64 SizeBytes;
+ UINT IndexType;
+ union
+ {
+ UINT64 DataOffset; //(This also forces the union to 64bits)
+ IDirect3DIndexBuffer9* pIB9;
+ ID3D11Buffer* pIB11;
+ };
+};
+
+struct SDKMESH_MESH
+{
+ char Name[MAX_MESH_NAME];
+ BYTE NumVertexBuffers;
+ UINT VertexBuffers[MAX_VERTEX_STREAMS];
+ UINT IndexBuffer;
+ UINT NumSubsets;
+ UINT NumFrameInfluences; //aka bones
+
+ D3DXVECTOR3 BoundingBoxCenter;
+ D3DXVECTOR3 BoundingBoxExtents;
+
+ union
+ {
+ UINT64 SubsetOffset; //Offset to list of subsets (This also forces the union to 64bits)
+ UINT* pSubsets; //Pointer to list of subsets
+ };
+ union
+ {
+ UINT64 FrameInfluenceOffset; //Offset to list of frame influences (This also forces the union to 64bits)
+ UINT* pFrameInfluences; //Pointer to list of frame influences
+ };
+};
+
+struct SDKMESH_SUBSET
+{
+ char Name[MAX_SUBSET_NAME];
+ UINT MaterialID;
+ UINT PrimitiveType;
+ UINT64 IndexStart;
+ UINT64 IndexCount;
+ UINT64 VertexStart;
+ UINT64 VertexCount;
+};
+
+struct SDKMESH_FRAME
+{
+ char Name[MAX_FRAME_NAME];
+ UINT Mesh;
+ UINT ParentFrame;
+ UINT ChildFrame;
+ UINT SiblingFrame;
+ D3DXMATRIX Matrix;
+ UINT AnimationDataIndex; //Used to index which set of keyframes transforms this frame
+};
+
+struct SDKMESH_MATERIAL
+{
+ char Name[MAX_MATERIAL_NAME];
+
+ // Use MaterialInstancePath
+ char MaterialInstancePath[MAX_MATERIAL_PATH];
+
+ // Or fall back to d3d8-type materials
+ char DiffuseTexture[MAX_TEXTURE_NAME];
+ char NormalTexture[MAX_TEXTURE_NAME];
+ char SpecularTexture[MAX_TEXTURE_NAME];
+
+ D3DXVECTOR4 Diffuse;
+ D3DXVECTOR4 Ambient;
+ D3DXVECTOR4 Specular;
+ D3DXVECTOR4 Emissive;
+ FLOAT Power;
+
+ union
+ {
+ UINT64 Force64_1; //Force the union to 64bits
+ IDirect3DTexture9* pDiffuseTexture9;
+ ID3D11Texture2D* pDiffuseTexture11;
+ };
+ union
+ {
+ UINT64 Force64_2; //Force the union to 64bits
+ IDirect3DTexture9* pNormalTexture9;
+ ID3D11Texture2D* pNormalTexture11;
+ };
+ union
+ {
+ UINT64 Force64_3; //Force the union to 64bits
+ IDirect3DTexture9* pSpecularTexture9;
+ ID3D11Texture2D* pSpecularTexture11;
+ };
+
+ union
+ {
+ UINT64 Force64_4; //Force the union to 64bits
+ ID3D11ShaderResourceView* pDiffuseRV11;
+ };
+ union
+ {
+ UINT64 Force64_5; //Force the union to 64bits
+ ID3D11ShaderResourceView* pNormalRV11;
+ };
+ union
+ {
+ UINT64 Force64_6; //Force the union to 64bits
+ ID3D11ShaderResourceView* pSpecularRV11;
+ };
+
+};
+
+struct SDKANIMATION_FILE_HEADER
+{
+ UINT Version;
+ BYTE IsBigEndian;
+ UINT FrameTransformType;
+ UINT NumFrames;
+ UINT NumAnimationKeys;
+ UINT AnimationFPS;
+ UINT64 AnimationDataSize;
+ UINT64 AnimationDataOffset;
+};
+
+struct SDKANIMATION_DATA
+{
+ D3DXVECTOR3 Translation;
+ D3DXVECTOR4 Orientation;
+ D3DXVECTOR3 Scaling;
+};
+
+struct SDKANIMATION_FRAME_DATA
+{
+ char FrameName[MAX_FRAME_NAME];
+ union
+ {
+ UINT64 DataOffset;
+ SDKANIMATION_DATA* pAnimationData;
+ };
+};
+
+#ifndef _CONVERTER_APP_
+
+//--------------------------------------------------------------------------------------
+// AsyncLoading callbacks
+//--------------------------------------------------------------------------------------
+typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE9 )( IDirect3DDevice9* pDev, char* szFileName,
+ IDirect3DTexture9** ppTexture, void* pContext );
+typedef void ( CALLBACK*LPCREATEVERTEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DVertexBuffer9** ppBuffer,
+ UINT iSizeBytes, DWORD Usage, DWORD FVF, D3DPOOL Pool, void* pData,
+ void* pContext );
+typedef void ( CALLBACK*LPCREATEINDEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DIndexBuffer9** ppBuffer,
+ UINT iSizeBytes, DWORD Usage, D3DFORMAT ibFormat, D3DPOOL Pool,
+ void* pData, void* pContext );
+struct SDKMESH_CALLBACKS9
+{
+ LPCREATETEXTUREFROMFILE9 pCreateTextureFromFile;
+ LPCREATEVERTEXBUFFER9 pCreateVertexBuffer;
+ LPCREATEINDEXBUFFER9 pCreateIndexBuffer;
+ void* pContext;
+};
+
+
+typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE11 )( ID3D11Device* pDev, char* szFileName,
+ ID3D11ShaderResourceView** ppRV, void* pContext );
+typedef void ( CALLBACK*LPCREATEVERTEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer,
+ D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext );
+typedef void ( CALLBACK*LPCREATEINDEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer,
+ D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext );
+struct SDKMESH_CALLBACKS11
+{
+ LPCREATETEXTUREFROMFILE11 pCreateTextureFromFile;
+ LPCREATEVERTEXBUFFER11 pCreateVertexBuffer;
+ LPCREATEINDEXBUFFER11 pCreateIndexBuffer;
+ void* pContext;
+};
+
+//--------------------------------------------------------------------------------------
+// CDXUTSDKMesh class. This class reads the sdkmesh file format for use by the samples
+//--------------------------------------------------------------------------------------
+class CDXUTSDKMesh
+{
+private:
+ UINT m_NumOutstandingResources;
+ bool m_bLoading;
+ //BYTE* m_pBufferData;
+ HANDLE m_hFile;
+ HANDLE m_hFileMappingObject;
+ CGrowableArray <BYTE*> m_MappedPointers;
+ IDirect3DDevice9* m_pDev9;
+ ID3D11Device* m_pDev11;
+ ID3D11DeviceContext* m_pDevContext11;
+
+protected:
+ //These are the pointers to the two chunks of data loaded in from the mesh file
+ BYTE* m_pStaticMeshData;
+ BYTE* m_pHeapData;
+ BYTE* m_pAnimationData;
+ BYTE** m_ppVertices;
+ BYTE** m_ppIndices;
+
+ //Keep track of the path
+ WCHAR m_strPathW[MAX_PATH];
+ char m_strPath[MAX_PATH];
+
+ //General mesh info
+ SDKMESH_HEADER* m_pMeshHeader;
+ SDKMESH_VERTEX_BUFFER_HEADER* m_pVertexBufferArray;
+ SDKMESH_INDEX_BUFFER_HEADER* m_pIndexBufferArray;
+ SDKMESH_MESH* m_pMeshArray;
+ SDKMESH_SUBSET* m_pSubsetArray;
+ SDKMESH_FRAME* m_pFrameArray;
+ SDKMESH_MATERIAL* m_pMaterialArray;
+
+ // Adjacency information (not part of the m_pStaticMeshData, so it must be created and destroyed separately )
+ SDKMESH_INDEX_BUFFER_HEADER* m_pAdjacencyIndexBufferArray;
+
+ //Animation (TODO: Add ability to load/track multiple animation sets)
+ SDKANIMATION_FILE_HEADER* m_pAnimationHeader;
+ SDKANIMATION_FRAME_DATA* m_pAnimationFrameData;
+ D3DXMATRIX* m_pBindPoseFrameMatrices;
+ D3DXMATRIX* m_pTransformedFrameMatrices;
+ D3DXMATRIX* m_pWorldPoseFrameMatrices;
+
+protected:
+ void LoadMaterials( ID3D11Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials,
+ UINT NumMaterials, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+
+ void LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials,
+ UINT NumMaterials, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ HRESULT CreateVertexBuffer( ID3D11Device* pd3dDevice,
+ SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ HRESULT CreateVertexBuffer( IDirect3DDevice9* pd3dDevice,
+ SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ HRESULT CreateIndexBuffer( ID3D11Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader,
+ void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ HRESULT CreateIndexBuffer( IDirect3DDevice9* pd3dDevice,
+ SDKMESH_INDEX_BUFFER_HEADER* pHeader, void* pIndices,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+
+ virtual HRESULT CreateFromFile( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ LPCTSTR szFileName,
+ bool bCreateAdjacencyIndices,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL );
+
+ virtual HRESULT CreateFromMemory( ID3D11Device* pDev11,
+ IDirect3DDevice9* pDev9,
+ BYTE* pData,
+ UINT DataBytes,
+ bool bCreateAdjacencyIndices,
+ bool bCopyStatic,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL );
+
+ //frame manipulation
+ void TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld );
+ void TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime );
+ void TransformFrameAbsolute( UINT iFrame, double fTime );
+
+ //Direct3D 11 rendering helpers
+ void RenderMesh( UINT iMesh,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot );
+ void RenderFrame( UINT iFrame,
+ bool bAdjacent,
+ ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot,
+ UINT iNormalSlot,
+ UINT iSpecularSlot );
+
+
+ //Direct3D 9 rendering helpers
+ void RenderMesh( UINT iMesh,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular );
+ void RenderFrame( UINT iFrame,
+ LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse,
+ D3DXHANDLE htxNormal,
+ D3DXHANDLE htxSpecular );
+
+public:
+ CDXUTSDKMesh();
+ virtual ~CDXUTSDKMesh();
+
+ virtual HRESULT Create( ID3D11Device* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices=
+ false, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( IDirect3DDevice9* pDev9, LPCTSTR szFileName, bool bCreateAdjacencyIndices=
+ false, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( ID3D11Device* pDev11, BYTE* pData, UINT DataBytes,
+ bool bCreateAdjacencyIndices=false, bool bCopyStatic=false,
+ SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL );
+ virtual HRESULT Create( IDirect3DDevice9* pDev9, BYTE* pData, UINT DataBytes,
+ bool bCreateAdjacencyIndices=false, bool bCopyStatic=false,
+ SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL );
+ virtual HRESULT LoadAnimation( WCHAR* szFileName );
+ virtual void Destroy();
+
+ //Frame manipulation
+ void TransformBindPose( D3DXMATRIX* pWorld );
+ void TransformMesh( D3DXMATRIX* pWorld, double fTime );
+
+
+ //Direct3D 11 Rendering
+ virtual void Render( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT,
+ UINT iNormalSlot = INVALID_SAMPLER_SLOT,
+ UINT iSpecularSlot = INVALID_SAMPLER_SLOT );
+ virtual void RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext,
+ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT,
+ UINT iNormalSlot = INVALID_SAMPLER_SLOT,
+ UINT iSpecularSlot = INVALID_SAMPLER_SLOT );
+
+ //Direct3D 9 Rendering
+ virtual void Render( LPDIRECT3DDEVICE9 pd3dDevice,
+ LPD3DXEFFECT pEffect,
+ D3DXHANDLE hTechnique,
+ D3DXHANDLE htxDiffuse = 0,
+ D3DXHANDLE htxNormal = 0,
+ D3DXHANDLE htxSpecular = 0 );
+
+ //Helpers (D3D11 specific)
+ static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType );
+ DXGI_FORMAT GetIBFormat11( UINT iMesh );
+ ID3D11Buffer* GetVB11( UINT iMesh, UINT iVB );
+ ID3D11Buffer* GetIB11( UINT iMesh );
+ SDKMESH_INDEX_TYPE GetIndexType( UINT iMesh );
+
+ ID3D11Buffer* GetAdjIB11( UINT iMesh );
+
+ //Helpers (D3D9 specific)
+ static D3DPRIMITIVETYPE GetPrimitiveType9( SDKMESH_PRIMITIVE_TYPE PrimType );
+ D3DFORMAT GetIBFormat9( UINT iMesh );
+ IDirect3DVertexBuffer9* GetVB9( UINT iMesh, UINT iVB );
+ IDirect3DIndexBuffer9* GetIB9( UINT iMesh );
+
+ //Helpers (general)
+ char* GetMeshPathA();
+ WCHAR* GetMeshPathW();
+ UINT GetNumMeshes();
+ UINT GetNumMaterials();
+ UINT GetNumVBs();
+ UINT GetNumIBs();
+
+ ID3D11Buffer* GetVB11At( UINT iVB );
+ ID3D11Buffer* GetIB11At( UINT iIB );
+
+ IDirect3DVertexBuffer9* GetVB9At( UINT iVB );
+ IDirect3DIndexBuffer9* GetIB9At( UINT iIB );
+
+ BYTE* GetRawVerticesAt( UINT iVB );
+ BYTE* GetRawIndicesAt( UINT iIB );
+ SDKMESH_MATERIAL* GetMaterial( UINT iMaterial );
+ SDKMESH_MESH* GetMesh( UINT iMesh );
+ UINT GetNumSubsets( UINT iMesh );
+ SDKMESH_SUBSET* GetSubset( UINT iMesh, UINT iSubset );
+ UINT GetVertexStride( UINT iMesh, UINT iVB );
+ UINT GetNumFrames();
+ SDKMESH_FRAME* GetFrame( UINT iFrame );
+ SDKMESH_FRAME* FindFrame( char* pszName );
+ UINT64 GetNumVertices( UINT iMesh, UINT iVB );
+ UINT64 GetNumIndices( UINT iMesh );
+ D3DXVECTOR3 GetMeshBBoxCenter( UINT iMesh );
+ D3DXVECTOR3 GetMeshBBoxExtents( UINT iMesh );
+ UINT GetOutstandingResources();
+ UINT GetOutstandingBufferResources();
+ bool CheckLoadDone();
+ bool IsLoaded();
+ bool IsLoading();
+ void SetLoading( bool bLoading );
+ BOOL HadLoadingError();
+
+ //Animation
+ UINT GetNumInfluences( UINT iMesh );
+ const D3DXMATRIX* GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence );
+ UINT GetAnimationKeyFromTime( double fTime );
+ const D3DXMATRIX* GetWorldMatrix( UINT iFrameIndex );
+ const D3DXMATRIX* GetInfluenceMatrix( UINT iFrameIndex );
+ bool GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime );
+};
+
+//-----------------------------------------------------------------------------
+// Name: class CDXUTXFileMesh
+// Desc: Class for loading and rendering file-based meshes
+//-----------------------------------------------------------------------------
+class CDXUTXFileMesh
+{
+public:
+ WCHAR m_strName[512];
+ LPD3DXMESH m_pMesh; // Managed mesh
+
+ // Cache of data in m_pMesh for easy access
+ IDirect3DVertexBuffer9* m_pVB;
+ IDirect3DIndexBuffer9* m_pIB;
+ IDirect3DVertexDeclaration9* m_pDecl;
+ DWORD m_dwNumVertices;
+ DWORD m_dwNumFaces;
+ DWORD m_dwBytesPerVertex;
+
+ DWORD m_dwNumMaterials; // Materials for the mesh
+ D3DMATERIAL9* m_pMaterials;
+ CHAR (*m_strMaterials )[MAX_PATH];
+ IDirect3DBaseTexture9** m_pTextures;
+ bool m_bUseMaterials;
+
+public:
+ // Rendering
+ HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice,
+ bool bDrawOpaqueSubsets = true,
+ bool bDrawAlphaSubsets = true );
+ HRESULT Render( ID3DXEffect* pEffect,
+ D3DXHANDLE hTexture = NULL,
+ D3DXHANDLE hDiffuse = NULL,
+ D3DXHANDLE hAmbient = NULL,
+ D3DXHANDLE hSpecular = NULL,
+ D3DXHANDLE hEmissive = NULL,
+ D3DXHANDLE hPower = NULL,
+ bool bDrawOpaqueSubsets = true,
+ bool bDrawAlphaSubsets = true );
+
+ // Mesh access
+ LPD3DXMESH GetMesh()
+ {
+ return m_pMesh;
+ }
+
+ // Rendering options
+ void UseMeshMaterials( bool bFlag )
+ {
+ m_bUseMaterials = bFlag;
+ }
+ HRESULT SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF );
+ HRESULT SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9* pDecl,
+ bool bAutoComputeNormals = true, bool bAutoComputeTangents = true,
+ bool bSplitVertexForOptimalTangents = false );
+
+ // Initializing
+ HRESULT RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice );
+ HRESULT InvalidateDeviceObjects();
+
+ // Creation/destruction
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename );
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData );
+ HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh, D3DXMATERIAL* pd3dxMaterials,
+ DWORD dwMaterials );
+ HRESULT CreateMaterials( LPCWSTR strPath, IDirect3DDevice9* pd3dDevice, D3DXMATERIAL* d3dxMtrls,
+ DWORD dwNumMaterials );
+ HRESULT Destroy();
+
+ CDXUTXFileMesh( LPCWSTR strName = L"CDXUTXMeshFile_Mesh" );
+ virtual ~CDXUTXFileMesh();
+};
+
+
+#endif
+
+#endif
+
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKmisc.cpp b/samples/DX_APIUsage/DXUT/Optional/SDKmisc.cpp
new file mode 100644
index 0000000..e81ce83
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKmisc.cpp
@@ -0,0 +1,1713 @@
+//--------------------------------------------------------------------------------------
+// File: SDKmisc.cpp
+//
+// Various helper functionality that is shared between SDK samples
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#include "dxut.h"
+#include "SDKmisc.h"
+#include "DXUTres.h"
+#undef min // use __min instead
+#undef max // use __max instead
+
+#include "DXUTGui.h"
+
+//--------------------------------------------------------------------------------------
+// Global/Static Members
+//--------------------------------------------------------------------------------------
+CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache()
+{
+ // Using an accessor function gives control of the construction order
+ static CDXUTResourceCache cache;
+ return cache;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Internal functions forward declarations
+//--------------------------------------------------------------------------------------
+bool DXUTFindMediaSearchTypicalDirs( __out_ecount(cchSearch) WCHAR* strSearchPath,
+ __in int cchSearch,
+ __in LPCWSTR strLeaf,
+ __in WCHAR* strExePath,
+ __in WCHAR* strExeName );
+bool DXUTFindMediaSearchParentDirs( __out_ecount(cchSearch) WCHAR* strSearchPath,
+ __in int cchSearch,
+ __in WCHAR* strStartAt,
+ __in WCHAR* strLeafName );
+INT_PTR CALLBACK DisplaySwitchToREFWarningProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam );
+
+
+//--------------------------------------------------------------------------------------
+// Shared code for samples to ask user if they want to use a REF device or quit
+//--------------------------------------------------------------------------------------
+void WINAPI DXUTDisplaySwitchingToREFWarning( DXUTDeviceVersion ver )
+{
+ if( DXUTGetShowMsgBoxOnError() )
+ {
+ DWORD dwSkipWarning = 0, dwRead = 0, dwWritten = 0;
+ HANDLE hFile = NULL;
+
+ // Read previous user settings
+ WCHAR strPath[MAX_PATH];
+ SHGetFolderPath( DXUTGetHWND(), CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, strPath );
+ wcscat_s( strPath, MAX_PATH, L"\\DXUT\\SkipRefWarning.dat" );
+ if( ( hFile = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0,
+ NULL ) ) != INVALID_HANDLE_VALUE )
+ {
+ ReadFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwRead, NULL );
+ CloseHandle( hFile );
+ }
+
+ if( dwSkipWarning == 0 )
+ {
+ // Compact code to create a custom dialog box without using a template in a resource file.
+ // If this dialog were in a .rc file, this would be a lot simpler but every sample calling this function would
+ // need a copy of the dialog in its own .rc file. Also MessageBox API could be used here instead, but
+ // the MessageBox API is simpler to call but it can't provide a "Don't show again" checkbox
+ typedef struct
+ {
+ DLGITEMTEMPLATE a;
+ WORD b;
+ WORD c;
+ WORD d;
+ WORD e;
+ WORD f;
+ } DXUT_DLG_ITEM;
+ typedef struct
+ {
+ DLGTEMPLATE a;
+ WORD b;
+ WORD c;
+ WCHAR d[2];
+ WORD e;
+ WCHAR f[16];
+ DXUT_DLG_ITEM i1;
+ DXUT_DLG_ITEM i2;
+ DXUT_DLG_ITEM i3;
+ DXUT_DLG_ITEM i4;
+ DXUT_DLG_ITEM i5;
+ } DXUT_DLG_DATA;
+
+ DXUT_DLG_DATA dtp =
+ {
+ {WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_SYSMENU | DS_ABSALIGN | DS_3DLOOK | DS_SETFONT |
+ DS_MODALFRAME | DS_CENTER,0,5,0,0,269,82},0,0,L" ",8,L"MS Shell Dlg 2",
+ { {WS_CHILD | WS_VISIBLE | SS_ICON | SS_CENTERIMAGE,0,7,7,24,24,0x100},0xFFFF,0x0082,0,0,0}, // icon
+ { {WS_CHILD | WS_VISIBLE,0,40,7,230,25,0x101},0xFFFF,0x0082,0,0,0}, // static text
+ { {WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,0,80,39,50,14,IDYES},0xFFFF,0x0080,0,0,0}, // Yes button
+ { {WS_CHILD | WS_VISIBLE | WS_TABSTOP,0,133,39,50,14,IDNO},0xFFFF,0x0080,0,0,0}, // No button
+ { {WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_CHECKBOX,0,7,59,70,16,IDIGNORE},0xFFFF,0x0080,0,0,0}, // checkbox
+ };
+
+ LPARAM lParam;
+ if( ver == DXUT_D3D9_DEVICE )
+ lParam = 9;
+ else
+ lParam = 11;
+ int nResult = ( int )DialogBoxIndirectParam( DXUTGetHINSTANCE(), ( DLGTEMPLATE* )&dtp, DXUTGetHWND(),
+ DisplaySwitchToREFWarningProc, lParam );
+
+ if( ( nResult & 0x80 ) == 0x80 ) // "Don't show again" checkbox was checked
+ {
+ // Save user settings
+ dwSkipWarning = 1;
+ SHGetFolderPath( DXUTGetHWND(), CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, strPath );
+ wcscat_s( strPath, MAX_PATH, L"\\DXUT" );
+ CreateDirectory( strPath, NULL );
+ wcscat_s( strPath, MAX_PATH, L"\\SkipRefWarning.dat" );
+ if( ( hFile = CreateFile( strPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0,
+ NULL ) ) != INVALID_HANDLE_VALUE )
+ {
+ WriteFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwWritten, NULL );
+ CloseHandle( hFile );
+ }
+ }
+
+ // User choose not to continue
+ if( ( nResult & 0x0F ) == IDNO )
+ DXUTShutdown( 1 );
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------------------
+// MsgProc for DXUTDisplaySwitchingToREFWarning() dialog box
+//--------------------------------------------------------------------------------------
+INT_PTR CALLBACK DisplaySwitchToREFWarningProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch( message )
+ {
+ case WM_INITDIALOG:
+ // Easier to set text here than in the DLGITEMTEMPLATE
+ SetWindowText( hDlg, DXUTGetWindowTitle() );
+ SendMessage( GetDlgItem( hDlg, 0x100 ), STM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadIcon( 0, IDI_QUESTION ) );
+ WCHAR sz[512];
+ swprintf_s( sz, 512,
+ L"This program needs to use the Direct3D %d reference device. This device implements the entire Direct3D %d feature set, but runs very slowly. Do you wish to continue?", lParam, lParam );
+ SetDlgItemText( hDlg, 0x101, sz );
+ SetDlgItemText( hDlg, IDYES, L"&Yes" );
+ SetDlgItemText( hDlg, IDNO, L"&No" );
+ SetDlgItemText( hDlg, IDIGNORE, L"&Don't show again" );
+ break;
+
+ case WM_COMMAND:
+ switch( LOWORD( wParam ) )
+ {
+ case IDIGNORE:
+ CheckDlgButton( hDlg, IDIGNORE, ( IsDlgButtonChecked( hDlg,
+ IDIGNORE ) == BST_CHECKED ) ? BST_UNCHECKED :
+ BST_CHECKED );
+ EnableWindow( GetDlgItem( hDlg, IDNO ), ( IsDlgButtonChecked( hDlg, IDIGNORE ) != BST_CHECKED ) );
+ break;
+ case IDNO:
+ EndDialog( hDlg, ( IsDlgButtonChecked( hDlg, IDIGNORE ) == BST_CHECKED ) ? IDNO | 0x80 : IDNO |
+ 0x00 ); return TRUE;
+ case IDCANCEL:
+ case IDYES:
+ EndDialog( hDlg, ( IsDlgButtonChecked( hDlg, IDIGNORE ) == BST_CHECKED ) ? IDYES | 0x80 : IDYES |
+ 0x00 ); return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Returns pointer to static media search buffer
+//--------------------------------------------------------------------------------------
+WCHAR* DXUTMediaSearchPath()
+{
+ static WCHAR s_strMediaSearchPath[MAX_PATH] =
+ {
+ 0
+ };
+ return s_strMediaSearchPath;
+
+}
+
+//--------------------------------------------------------------------------------------
+LPCWSTR WINAPI DXUTGetMediaSearchPath()
+{
+ return DXUTMediaSearchPath();
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT WINAPI DXUTSetMediaSearchPath( LPCWSTR strPath )
+{
+ HRESULT hr;
+
+ WCHAR* s_strSearchPath = DXUTMediaSearchPath();
+
+ hr = wcscpy_s( s_strSearchPath, MAX_PATH, strPath );
+ if( SUCCEEDED( hr ) )
+ {
+ // append slash if needed
+ size_t ch = 0;
+ ch = wcsnlen( s_strSearchPath, MAX_PATH);
+ if( SUCCEEDED( hr ) && s_strSearchPath[ch - 1] != L'\\' )
+ {
+ hr = wcscat_s( s_strSearchPath, MAX_PATH, L"\\" );
+ }
+ }
+
+ return hr;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Tries to find the location of a SDK media file
+// cchDest is the size in WCHARs of strDestPath. Be careful not to
+// pass in sizeof(strDest) on UNICODE builds.
+//--------------------------------------------------------------------------------------
+HRESULT WINAPI DXUTFindDXSDKMediaFileCch( WCHAR* strDestPath, int cchDest,
+ LPCWSTR strFilename )
+{
+ bool bFound;
+ WCHAR strSearchFor[MAX_PATH];
+
+ if( NULL == strFilename || strFilename[0] == 0 || NULL == strDestPath || cchDest < 10 )
+ return E_INVALIDARG;
+
+ // Get the exe name, and exe path
+ WCHAR strExePath[MAX_PATH] =
+ {
+ 0
+ };
+ WCHAR strExeName[MAX_PATH] =
+ {
+ 0
+ };
+ WCHAR* strLastSlash = NULL;
+ GetModuleFileName( NULL, strExePath, MAX_PATH );
+ strExePath[MAX_PATH - 1] = 0;
+ strLastSlash = wcsrchr( strExePath, TEXT( '\\' ) );
+ if( strLastSlash )
+ {
+ wcscpy_s( strExeName, MAX_PATH, &strLastSlash[1] );
+
+ // Chop the exe name from the exe path
+ *strLastSlash = 0;
+
+ // Chop the .exe from the exe name
+ strLastSlash = wcsrchr( strExeName, TEXT( '.' ) );
+ if( strLastSlash )
+ *strLastSlash = 0;
+ }
+
+ // Typical directories:
+ // .\
+ // ..\
+ // ..\..\
+ // %EXE_DIR%\
+ // %EXE_DIR%\..\
+ // %EXE_DIR%\..\..\
+ // %EXE_DIR%\..\%EXE_NAME%
+ // %EXE_DIR%\..\..\%EXE_NAME%
+
+ // Typical directory search
+ bFound = DXUTFindMediaSearchTypicalDirs( strDestPath, cchDest, strFilename, strExePath, strExeName );
+ if( bFound )
+ return S_OK;
+
+ // Typical directory search again, but also look in a subdir called "\media\"
+ swprintf_s( strSearchFor, MAX_PATH, L"media\\%s", strFilename );
+ bFound = DXUTFindMediaSearchTypicalDirs( strDestPath, cchDest, strSearchFor, strExePath, strExeName );
+ if( bFound )
+ return S_OK;
+
+ WCHAR strLeafName[MAX_PATH] =
+ {
+ 0
+ };
+
+ // Search all parent directories starting at .\ and using strFilename as the leaf name
+ wcscpy_s( strLeafName, MAX_PATH, strFilename );
+ bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, L".", strLeafName );
+ if( bFound )
+ return S_OK;
+
+ // Search all parent directories starting at the exe's dir and using strFilename as the leaf name
+ bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, strExePath, strLeafName );
+ if( bFound )
+ return S_OK;
+
+ // Search all parent directories starting at .\ and using "media\strFilename" as the leaf name
+ swprintf_s( strLeafName, MAX_PATH, L"media\\%s", strFilename );
+ bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, L".", strLeafName );
+ if( bFound )
+ return S_OK;
+
+ // Search all parent directories starting at the exe's dir and using "media\strFilename" as the leaf name
+ bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, strExePath, strLeafName );
+ if( bFound )
+ return S_OK;
+
+ // On failure, return the file as the path but also return an error code
+ wcscpy_s( strDestPath, cchDest, strFilename );
+
+ return DXUTERR_MEDIANOTFOUND;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Search a set of typical directories
+//--------------------------------------------------------------------------------------
+bool DXUTFindMediaSearchTypicalDirs( WCHAR* strSearchPath, int cchSearch, LPCWSTR strLeaf,
+ WCHAR* strExePath, WCHAR* strExeName )
+{
+ // Typical directories:
+ // .\
+ // ..\
+ // ..\..\
+ // %EXE_DIR%\
+ // %EXE_DIR%\..\
+ // %EXE_DIR%\..\..\
+ // %EXE_DIR%\..\%EXE_NAME%
+ // %EXE_DIR%\..\..\%EXE_NAME%
+ // DXSDK media path
+
+ // Search in .\
+ wcscpy_s( strSearchPath, cchSearch, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in ..\
+ swprintf_s( strSearchPath, cchSearch, L"..\\%s", strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in ..\..\
+ swprintf_s( strSearchPath, cchSearch, L"..\\..\\%s", strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in ..\..\
+ swprintf_s( strSearchPath, cchSearch, L"..\\..\\%s", strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in the %EXE_DIR%\
+ swprintf_s( strSearchPath, cchSearch, L"%s\\%s", strExePath, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in the %EXE_DIR%\..\
+ swprintf_s( strSearchPath, cchSearch, L"%s\\..\\%s", strExePath, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in the %EXE_DIR%\..\..\
+ swprintf_s( strSearchPath, cchSearch, L"%s\\..\\..\\%s", strExePath, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in "%EXE_DIR%\..\%EXE_NAME%\". This matches the DirectX SDK layout
+ swprintf_s( strSearchPath, cchSearch, L"%s\\..\\%s\\%s", strExePath, strExeName, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in "%EXE_DIR%\..\..\%EXE_NAME%\". This matches the DirectX SDK layout
+ swprintf_s( strSearchPath, cchSearch, L"%s\\..\\..\\%s\\%s", strExePath, strExeName, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+
+ // Search in media search dir
+ WCHAR* s_strSearchPath = DXUTMediaSearchPath();
+ if( s_strSearchPath[0] != 0 )
+ {
+ swprintf_s( strSearchPath, cchSearch, L"%s%s", s_strSearchPath, strLeaf );
+ if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF )
+ return true;
+ }
+
+ return false;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+// Search parent directories starting at strStartAt, and appending strLeafName
+// at each parent directory. It stops at the root directory.
+//--------------------------------------------------------------------------------------
+bool DXUTFindMediaSearchParentDirs( WCHAR* strSearchPath, int cchSearch, WCHAR* strStartAt,
+ WCHAR* strLeafName )
+{
+ WCHAR strFullPath[MAX_PATH] =
+ {
+ 0
+ };
+ WCHAR strFullFileName[MAX_PATH] =
+ {
+ 0
+ };
+ WCHAR strSearch[MAX_PATH] =
+ {
+ 0
+ };
+ WCHAR* strFilePart = NULL;
+
+ GetFullPathName( strStartAt, MAX_PATH, strFullPath, &strFilePart );
+ if( strFilePart == NULL )
+ return false;
+
+ while( strFilePart != NULL && *strFilePart != '\0' )
+ {
+ swprintf_s( strFullFileName, MAX_PATH, L"%s\\%s", strFullPath, strLeafName );
+ if( GetFileAttributes( strFullFileName ) != 0xFFFFFFFF )
+ {
+ wcscpy_s( strSearchPath, cchSearch, strFullFileName );
+ return true;
+ }
+
+ swprintf_s( strSearch, MAX_PATH, L"%s\\..", strFullPath );
+ GetFullPathName( strSearch, MAX_PATH, strFullPath, &strFilePart );
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------
+// CDXUTResourceCache
+//--------------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------------
+CDXUTResourceCache::~CDXUTResourceCache()
+{
+ OnDestroyDevice();
+
+ m_TextureCache.RemoveAll();
+ m_EffectCache.RemoveAll();
+ m_FontCache.RemoveAll();
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DTEXTURE9* ppTexture )
+{
+ return CreateTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, NULL, NULL, ppTexture );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile,
+ LPDIRECT3DTEXTURE9* ppTexture )
+{
+ WCHAR szSrcFile[MAX_PATH];
+ MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, szSrcFile, MAX_PATH );
+ szSrcFile[MAX_PATH - 1] = 0;
+
+ return CreateTextureFromFile( pDevice, szSrcFile, ppTexture );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCTSTR pSrcFile,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB )
+{
+ return CreateTextureFromFileEx( pDevice, pContext, pSrcFile, NULL, NULL, ppOutputRV, bSRGB );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCSTR pSrcFile,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB )
+{
+ WCHAR szSrcFile[MAX_PATH];
+ MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, szSrcFile, MAX_PATH );
+ szSrcFile[MAX_PATH - 1] = 0;
+
+ return CreateTextureFromFile( pDevice, pContext, szSrcFile, ppOutputRV, bSRGB );
+}
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,
+ UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format,
+ D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DTEXTURE9* ppTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_FILE &&
+ !lstrcmpW( Entry.wszSource, pSrcFile ) &&
+ Entry.Width == Width &&
+ Entry.Height == Height &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_TEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DTexture9, ( LPVOID* )ppTexture );
+ }
+ }
+
+#if defined(PROFILE) || defined(DEBUG)
+ CHAR strFileA[MAX_PATH];
+ WideCharToMultiByte( CP_ACP, 0, pSrcFile, -1, strFileA, MAX_PATH, NULL, FALSE );
+ CHAR* pstrName = strrchr( strFileA, '\\' );
+ if( pstrName == NULL )
+ pstrName = strFileA;
+ else
+ pstrName++;
+#endif
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateTextureFromFileEx( pDevice, pSrcFile, Width, Height, MipLevels, Usage, Format,
+ Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_FILE;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile );
+ NewEntry.Width = Width;
+ NewEntry.Height = Height;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_TEXTURE;
+ ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ DXUT_SetDebugName( *ppTexture, pstrName );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromFileEx( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, LPCTSTR pSrcFile,
+ D3DX11_IMAGE_LOAD_INFO* pLoadInfo, ID3DX11ThreadPump* pPump,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB )
+{
+
+ bool is10L9 = DXUTGetDeviceSettings().d3d11.DeviceFeatureLevel < D3D_FEATURE_LEVEL_10_0;
+ HRESULT hr = S_OK;
+ D3DX11_IMAGE_LOAD_INFO ZeroInfo; //D3DX11_IMAGE_LOAD_INFO has a default constructor
+ D3DX11_IMAGE_INFO SrcInfo;
+
+ if( !pLoadInfo )
+ {
+ pLoadInfo = &ZeroInfo;
+ }
+
+ if( !pLoadInfo->pSrcInfo )
+ {
+ D3DX11GetImageInfoFromFile( pSrcFile, NULL, &SrcInfo, NULL );
+ pLoadInfo->pSrcInfo = &SrcInfo;
+
+ pLoadInfo->Format = pLoadInfo->pSrcInfo->Format;
+ }
+
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_FILE &&
+ !lstrcmpW( Entry.wszSource, pSrcFile ) &&
+ Entry.Width == pLoadInfo->Width &&
+ Entry.Height == pLoadInfo->Height &&
+ Entry.MipLevels == pLoadInfo->MipLevels &&
+ Entry.Usage11 == pLoadInfo->Usage &&
+ Entry.Format == pLoadInfo->Format &&
+ Entry.CpuAccessFlags == pLoadInfo->CpuAccessFlags &&
+ Entry.BindFlags == pLoadInfo->BindFlags &&
+ Entry.MiscFlags == pLoadInfo->MiscFlags )
+ {
+ // A match is found. Obtain the IDirect3DTexture9 interface and return that.
+ return Entry.pSRV11->QueryInterface( __uuidof( ID3D11ShaderResourceView ), ( LPVOID* )ppOutputRV );
+ }
+ }
+
+#if defined(PROFILE) || defined(DEBUG)
+ CHAR strFileA[MAX_PATH];
+ WideCharToMultiByte( CP_ACP, 0, pSrcFile, -1, strFileA, MAX_PATH, NULL, FALSE );
+ CHAR* pstrName = strrchr( strFileA, '\\' );
+ if( pstrName == NULL )
+ pstrName = strFileA;
+ else
+ pstrName++;
+#endif
+
+ //Ready a new entry to the texture cache
+ //Do this before creating the texture since pLoadInfo may be volatile
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_FILE;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile );
+ NewEntry.Width = pLoadInfo->Width;
+ NewEntry.Height = pLoadInfo->Height;
+ NewEntry.MipLevels = pLoadInfo->MipLevels;
+ NewEntry.Usage11 = pLoadInfo->Usage;
+ // 10L9 can't handle typesless, so we cant make a typesless format
+ if (is10L9 && bSRGB) {
+ NewEntry.Format = MAKE_SRGB(pLoadInfo->Format);
+ }else {
+ NewEntry.Format = pLoadInfo->Format;
+ }
+ NewEntry.CpuAccessFlags = pLoadInfo->CpuAccessFlags;
+ NewEntry.BindFlags = pLoadInfo->BindFlags;
+ NewEntry.MiscFlags = pLoadInfo->MiscFlags;
+
+ //Create the rexture
+ ID3D11Texture2D* pRes = NULL;
+ hr = D3DX11CreateTextureFromFile( pDevice, pSrcFile, pLoadInfo, pPump, ( ID3D11Resource** )&pRes, NULL );
+
+ if( FAILED( hr ) )
+ return hr;
+ D3D11_TEXTURE2D_DESC tex_dsc;
+ pRes->GetDesc(&tex_dsc);
+
+
+
+ if (bSRGB ) {
+ // This is a workaround so that we can load linearly, but sample in SRGB. Right now, we can't load
+ // as linear since D3DX will try to do conversion on load. Loading as TYPELESS doesn't work either, and
+ // loading as typed _UNORM doesn't allow us to create an SRGB view.
+
+ // on d3d11 featuer levels this is just a copy, but on 10L9 we must use a cpu side copy with 2 staging resources.
+ ID3D11Texture2D* unormStaging = NULL;
+ ID3D11Texture2D* srgbStaging = NULL;
+
+ D3D11_TEXTURE2D_DESC CopyDesc;
+ pRes->GetDesc( &CopyDesc );
+
+ pLoadInfo->BindFlags = 0;
+ pLoadInfo->CpuAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
+ pLoadInfo->Depth = 0;
+ pLoadInfo->Filter = D3DX11_FILTER_LINEAR;
+ pLoadInfo->FirstMipLevel = 0;
+ pLoadInfo->Format = CopyDesc.Format;
+ pLoadInfo->Height = CopyDesc.Height;
+ pLoadInfo->MipFilter = D3DX11_FILTER_LINEAR;
+ pLoadInfo->MiscFlags = CopyDesc.MiscFlags;
+ pLoadInfo->Usage = D3D11_USAGE_STAGING;
+ pLoadInfo->Width = CopyDesc.Width;
+
+ CopyDesc.BindFlags = 0;
+ CopyDesc.Usage = D3D11_USAGE_STAGING;
+ CopyDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
+ CopyDesc.Format = MAKE_SRGB(CopyDesc.Format);
+
+ hr = D3DX11CreateTextureFromFile( pDevice, pSrcFile, pLoadInfo, pPump, ( ID3D11Resource** )&unormStaging, NULL );
+ DXUT_SetDebugName( unormStaging, "CDXUTResourceCache" );
+
+ hr = pDevice->CreateTexture2D(&CopyDesc, NULL, &srgbStaging);
+ DXUT_SetDebugName( srgbStaging, "CDXUTResourceCache" );
+ pContext->CopyResource( srgbStaging, unormStaging );
+ ID3D11Texture2D* srgbGPU;
+
+ pRes->GetDesc( &CopyDesc );
+ CopyDesc.Format = MAKE_SRGB(CopyDesc.Format);
+ hr = pDevice->CreateTexture2D(&CopyDesc, NULL, &srgbGPU);
+ pContext->CopyResource( srgbGPU, srgbStaging );
+
+ SAFE_RELEASE(pRes);
+ SAFE_RELEASE(srgbStaging);
+ SAFE_RELEASE(unormStaging);
+ pRes = srgbGPU;
+ }
+
+ DXUT_SetDebugName( pRes, pstrName );
+
+ D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
+ if( bSRGB )
+ SRVDesc.Format = MAKE_SRGB( ZeroInfo.Format );
+ else
+ SRVDesc.Format = ZeroInfo.Format;
+ if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE1D )
+ {
+ SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
+ SRVDesc.Texture1D.MostDetailedMip = 0;
+ SRVDesc.Texture1D.MipLevels = pLoadInfo->pSrcInfo->MipLevels;
+ }
+ else if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE2D )
+ {
+ SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
+ SRVDesc.Texture2D.MostDetailedMip = 0;
+ SRVDesc.Texture2D.MipLevels = pLoadInfo->pSrcInfo->MipLevels;
+
+ if( pLoadInfo->pSrcInfo->MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE )
+ {
+ SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+ SRVDesc.TextureCube.MostDetailedMip = 0;
+ SRVDesc.TextureCube.MipLevels = pLoadInfo->pSrcInfo->MipLevels;
+ }
+ }
+ else if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE3D )
+ {
+ SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
+ SRVDesc.Texture3D.MostDetailedMip = 0;
+ SRVDesc.Texture3D.MipLevels = pLoadInfo->pSrcInfo->MipLevels;
+ }
+ if (bSRGB) {
+ SRVDesc.Format = MAKE_SRGB(tex_dsc.Format);
+ }else {
+ SRVDesc.Format = tex_dsc.Format;
+ }
+ SRVDesc.Texture2D.MipLevels = tex_dsc.MipLevels;
+ SRVDesc.Texture2D.MostDetailedMip = 0;
+ hr = pDevice->CreateShaderResourceView( pRes, &SRVDesc, ppOutputRV );
+ pRes->Release();
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUT_SetDebugName( *ppOutputRV, pstrName );
+
+ ( *ppOutputRV )->QueryInterface( __uuidof( ID3D11ShaderResourceView ), ( LPVOID* )&NewEntry.pSRV11 );
+
+ m_TextureCache.Add( NewEntry );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, LPDIRECT3DTEXTURE9* ppTexture )
+{
+ return CreateTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT,
+ D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT,
+ D3DX_DEFAULT, 0, NULL, NULL, ppTexture );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Width, UINT Height, UINT MipLevels,
+ DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo,
+ PALETTEENTRY* pPalette, LPDIRECT3DTEXTURE9* ppTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE &&
+ Entry.hSrcModule == hSrcModule &&
+ !lstrcmpW( Entry.wszSource, pSrcResource ) &&
+ Entry.Width == Width &&
+ Entry.Height == Height &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_TEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DTexture9, ( LPVOID* )ppTexture );
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Width, Height, MipLevels, Usage,
+ Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE;
+ NewEntry.hSrcModule = hSrcModule;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource );
+ NewEntry.Width = Width;
+ NewEntry.Height = Height;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_TEXTURE;
+ ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateCubeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture )
+{
+ return CreateCubeTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, 0,
+ D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, NULL, NULL, ppCubeTexture );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateCubeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Size,
+ UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,
+ DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_FILE &&
+ !lstrcmpW( Entry.wszSource, pSrcFile ) &&
+ Entry.Width == Size &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_CUBETEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DCubeTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DCubeTexture9, ( LPVOID* )ppCubeTexture );
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateCubeTextureFromFileEx( pDevice, pSrcFile, Size, MipLevels, Usage, Format, Pool, Filter,
+ MipFilter, ColorKey, pSrcInfo, pPalette, ppCubeTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_FILE;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile );
+ NewEntry.Width = Size;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_CUBETEXTURE;
+ ( *ppCubeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateCubeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture )
+{
+ return CreateCubeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, NULL, NULL, ppCubeTexture );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateCubeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Size, UINT MipLevels,
+ DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE &&
+ Entry.hSrcModule == hSrcModule &&
+ !lstrcmpW( Entry.wszSource, pSrcResource ) &&
+ Entry.Width == Size &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_CUBETEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DCubeTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DCubeTexture9, ( LPVOID* )ppCubeTexture );
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateCubeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Size, MipLevels, Usage, Format,
+ Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppCubeTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE;
+ NewEntry.hSrcModule = hSrcModule;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource );
+ NewEntry.Width = Size;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_CUBETEXTURE;
+ ( *ppCubeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateVolumeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture )
+{
+ return CreateVolumeTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
+ 0, NULL, NULL, ppVolumeTexture );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateVolumeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,
+ UINT Height, UINT Depth, UINT MipLevels, DWORD Usage,
+ D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DVOLUMETEXTURE9* ppTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_FILE &&
+ !lstrcmpW( Entry.wszSource, pSrcFile ) &&
+ Entry.Width == Width &&
+ Entry.Height == Height &&
+ Entry.Depth == Depth &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_VOLUMETEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DVolumeTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DVolumeTexture9, ( LPVOID* )ppTexture );
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateVolumeTextureFromFileEx( pDevice, pSrcFile, Width, Height, Depth, MipLevels, Usage, Format,
+ Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_FILE;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile );
+ NewEntry.Width = Width;
+ NewEntry.Height = Height;
+ NewEntry.Depth = Depth;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_VOLUMETEXTURE;
+ ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateVolumeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture )
+{
+ return CreateVolumeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT,
+ D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
+ D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppVolumeTexture );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateVolumeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Width, UINT Height,
+ UINT Depth, UINT MipLevels, DWORD Usage,
+ D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_TextureCache.GetSize(); ++i )
+ {
+ DXUTCache_Texture& Entry = m_TextureCache[i];
+ if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE &&
+ Entry.hSrcModule == hSrcModule &&
+ !lstrcmpW( Entry.wszSource, pSrcResource ) &&
+ Entry.Width == Width &&
+ Entry.Height == Height &&
+ Entry.Depth == Depth &&
+ Entry.MipLevels == MipLevels &&
+ Entry.Usage9 == Usage &&
+ Entry.Format9 == Format &&
+ Entry.Pool9 == Pool &&
+ Entry.Type9 == D3DRTYPE_VOLUMETEXTURE )
+ {
+ // A match is found. Obtain the IDirect3DVolumeTexture9 interface and return that.
+ return Entry.pTexture9->QueryInterface( IID_IDirect3DVolumeTexture9, ( LPVOID* )ppVolumeTexture );
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateVolumeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Width, Height, Depth, MipLevels,
+ Usage,
+ Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette,
+ ppVolumeTexture );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Texture NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE;
+ NewEntry.hSrcModule = hSrcModule;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource );
+ NewEntry.Width = Width;
+ NewEntry.Height = Height;
+ NewEntry.Depth = Depth;
+ NewEntry.MipLevels = MipLevels;
+ NewEntry.Usage9 = Usage;
+ NewEntry.Format9 = Format;
+ NewEntry.Pool9 = Pool;
+ NewEntry.Type9 = D3DRTYPE_VOLUMETEXTURE;
+ ( *ppVolumeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 );
+
+ m_TextureCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateFont( LPDIRECT3DDEVICE9 pDevice, UINT Height, UINT Width, UINT Weight,
+ UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision,
+ DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT* ppFont )
+{
+ D3DXFONT_DESCW Desc;
+
+ Desc.Height = Height;
+ Desc.Width = Width;
+ Desc.Weight = Weight;
+ Desc.MipLevels = MipLevels;
+ Desc.Italic = Italic;
+ Desc.CharSet = ( BYTE )CharSet;
+ Desc.OutputPrecision = ( BYTE )OutputPrecision;
+ Desc.Quality = ( BYTE )Quality;
+ Desc.PitchAndFamily = ( BYTE )PitchAndFamily;
+ wcscpy_s( Desc.FaceName, LF_FACESIZE, pFacename );
+
+ return CreateFontIndirect( pDevice, &Desc, ppFont );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateFontIndirect( LPDIRECT3DDEVICE9 pDevice, CONST D3DXFONT_DESC *pDesc, LPD3DXFONT *ppFont )
+ {
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_FontCache.GetSize(); ++i )
+ {
+ DXUTCache_Font &Entry = m_FontCache[i];
+
+ if( Entry.Width == pDesc->Width &&
+ Entry.Height == pDesc->Height &&
+ Entry.Weight == pDesc->Weight &&
+ Entry.MipLevels == pDesc->MipLevels &&
+ Entry.Italic == pDesc->Italic &&
+ Entry.CharSet == pDesc->CharSet &&
+ Entry.OutputPrecision == pDesc->OutputPrecision &&
+ Entry.Quality == pDesc->Quality &&
+ Entry.PitchAndFamily == pDesc->PitchAndFamily &&
+ CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE,
+ Entry.FaceName, -1,
+ pDesc->FaceName, -1 ) == CSTR_EQUAL )
+ {
+ // A match is found. Increment the reference and return the ID3DXFont object.
+ Entry.pFont->AddRef();
+ *ppFont = Entry.pFont;
+ return S_OK;
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+ hr = D3DXCreateFontIndirect( pDevice, pDesc, ppFont );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Font NewEntry;
+ ( D3DXFONT_DESC & )NewEntry = *pDesc;
+ NewEntry.pFont = *ppFont;
+ NewEntry.pFont->AddRef();
+
+ m_FontCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags,
+ LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect,
+ LPD3DXBUFFER* ppCompilationErrors )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_EffectCache.GetSize(); ++i )
+ {
+ DXUTCache_Effect& Entry = m_EffectCache[i];
+
+ if( Entry.Location == DXUTCACHE_LOCATION_FILE &&
+ !lstrcmpW( Entry.wszSource, pSrcFile ) &&
+ Entry.dwFlags == Flags )
+ {
+ // A match is found. Increment the ref coutn and return the ID3DXEffect object.
+ *ppEffect = Entry.pEffect;
+ ( *ppEffect )->AddRef();
+ return S_OK;
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+#ifdef D3DXFX_LARGEADDRESS_HANDLE
+ Flags |= D3DXFX_LARGEADDRESSAWARE;
+#endif
+
+ hr = D3DXCreateEffectFromFile( pDevice, pSrcFile, pDefines, pInclude, Flags, pPool, ppEffect,
+ ppCompilationErrors );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Effect NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_FILE;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile );
+ NewEntry.dwFlags = Flags;
+ NewEntry.pEffect = *ppEffect;
+ NewEntry.pEffect->AddRef();
+
+ m_EffectCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::CreateEffectFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, const D3DXMACRO* pDefines,
+ LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool,
+ LPD3DXEFFECT* ppEffect, LPD3DXBUFFER* ppCompilationErrors )
+{
+ // Search the cache for a matching entry.
+ for( int i = 0; i < m_EffectCache.GetSize(); ++i )
+ {
+ DXUTCache_Effect& Entry = m_EffectCache[i];
+
+ if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE &&
+ Entry.hSrcModule == hSrcModule &&
+ !lstrcmpW( Entry.wszSource, pSrcResource ) &&
+ Entry.dwFlags == Flags )
+ {
+ // A match is found. Increment the ref coutn and return the ID3DXEffect object.
+ *ppEffect = Entry.pEffect;
+ ( *ppEffect )->AddRef();
+ return S_OK;
+ }
+ }
+
+ HRESULT hr;
+
+ // No matching entry. Load the resource and create a new entry.
+#ifdef D3DXFX_LARGEADDRESS_HANDLE
+ Flags |= D3DXFX_LARGEADDRESSAWARE;
+#endif
+
+ hr = D3DXCreateEffectFromResource( pDevice, hSrcModule, pSrcResource, pDefines, pInclude, Flags,
+ pPool, ppEffect, ppCompilationErrors );
+ if( FAILED( hr ) )
+ return hr;
+
+ DXUTCache_Effect NewEntry;
+ NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE;
+ NewEntry.hSrcModule = hSrcModule;
+ wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource );
+ NewEntry.dwFlags = Flags;
+ NewEntry.pEffect = *ppEffect;
+ NewEntry.pEffect->AddRef();
+
+ m_EffectCache.Add( NewEntry );
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Device event callbacks
+//--------------------------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::OnCreateDevice( IDirect3DDevice9* pd3dDevice )
+{
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::OnResetDevice( IDirect3DDevice9* pd3dDevice )
+{
+ // Call OnResetDevice on all effect and font objects
+ for( int i = 0; i < m_EffectCache.GetSize(); ++i )
+ m_EffectCache[i].pEffect->OnResetDevice();
+ for( int i = 0; i < m_FontCache.GetSize(); ++i )
+ m_FontCache[i].pFont->OnResetDevice();
+
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::OnLostDevice()
+{
+ // Call OnLostDevice on all effect and font objects
+ for( int i = 0; i < m_EffectCache.GetSize(); ++i )
+ m_EffectCache[i].pEffect->OnLostDevice();
+ for( int i = 0; i < m_FontCache.GetSize(); ++i )
+ m_FontCache[i].pFont->OnLostDevice();
+
+ // Release all the default pool textures
+ for( int i = m_TextureCache.GetSize() - 1; i >= 0; --i )
+ if( m_TextureCache[i].Pool9 == D3DPOOL_DEFAULT )
+ {
+ SAFE_RELEASE( m_TextureCache[i].pTexture9 );
+ m_TextureCache.Remove( i ); // Remove the entry
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTResourceCache::OnDestroyDevice()
+{
+ // Release all resources
+ for( int i = m_EffectCache.GetSize() - 1; i >= 0; --i )
+ {
+ SAFE_RELEASE( m_EffectCache[i].pEffect );
+ m_EffectCache.Remove( i );
+ }
+ for( int i = m_FontCache.GetSize() - 1; i >= 0; --i )
+ {
+ SAFE_RELEASE( m_FontCache[i].pFont );
+ m_FontCache.Remove( i );
+ }
+ for( int i = m_TextureCache.GetSize() - 1; i >= 0; --i )
+ {
+ SAFE_RELEASE( m_TextureCache[i].pTexture9 );
+ SAFE_RELEASE( m_TextureCache[i].pSRV11 );
+ m_TextureCache.Remove( i );
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Desc: Returns a view matrix for rendering to a face of a cubemap.
+//--------------------------------------------------------------------------------------
+D3DXMATRIX WINAPI DXUTGetCubeMapViewMatrix( DWORD dwFace )
+{
+ D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
+ D3DXVECTOR3 vLookDir;
+ D3DXVECTOR3 vUpDir;
+
+ switch( dwFace )
+ {
+ case D3DCUBEMAP_FACE_POSITIVE_X:
+ vLookDir = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
+ break;
+ case D3DCUBEMAP_FACE_NEGATIVE_X:
+ vLookDir = D3DXVECTOR3( -1.0f, 0.0f, 0.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
+ break;
+ case D3DCUBEMAP_FACE_POSITIVE_Y:
+ vLookDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
+ break;
+ case D3DCUBEMAP_FACE_NEGATIVE_Y:
+ vLookDir = D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
+ break;
+ case D3DCUBEMAP_FACE_POSITIVE_Z:
+ vLookDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
+ break;
+ case D3DCUBEMAP_FACE_NEGATIVE_Z:
+ vLookDir = D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
+ vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
+ break;
+ }
+
+ // Set the view transform for this cubemap surface
+ D3DXMATRIXA16 mView;
+ D3DXMatrixLookAtLH( &mView, &vEyePt, &vLookDir, &vUpDir );
+ return mView;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTLineManager::CDXUTLineManager()
+{
+ m_pd3dDevice = NULL;
+ m_pD3DXLine = NULL;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTLineManager::~CDXUTLineManager()
+{
+ OnDeletedDevice();
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::OnCreatedDevice( IDirect3DDevice9* pd3dDevice )
+{
+ m_pd3dDevice = pd3dDevice;
+
+ HRESULT hr;
+ hr = D3DXCreateLine( m_pd3dDevice, &m_pD3DXLine );
+ if( FAILED( hr ) )
+ return hr;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::OnResetDevice()
+{
+ if( m_pD3DXLine )
+ m_pD3DXLine->OnResetDevice();
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::OnRender()
+{
+ HRESULT hr;
+ if( NULL == m_pD3DXLine )
+ return E_INVALIDARG;
+
+ bool bDrawingHasBegun = false;
+ float fLastWidth = 0.0f;
+ bool bLastAntiAlias = false;
+
+ for( int i = 0; i < m_LinesList.GetSize(); i++ )
+ {
+ LINE_NODE* pLineNode = m_LinesList.GetAt( i );
+ if( pLineNode )
+ {
+ if( !bDrawingHasBegun ||
+ fLastWidth != pLineNode->fWidth ||
+ bLastAntiAlias != pLineNode->bAntiAlias )
+ {
+ if( bDrawingHasBegun )
+ {
+ hr = m_pD3DXLine->End();
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ m_pD3DXLine->SetWidth( pLineNode->fWidth );
+ m_pD3DXLine->SetAntialias( pLineNode->bAntiAlias );
+
+ fLastWidth = pLineNode->fWidth;
+ bLastAntiAlias = pLineNode->bAntiAlias;
+
+ hr = m_pD3DXLine->Begin();
+ if( FAILED( hr ) )
+ return hr;
+ bDrawingHasBegun = true;
+ }
+
+ hr = m_pD3DXLine->Draw( pLineNode->pVertexList, pLineNode->dwVertexListCount, pLineNode->Color );
+ if( FAILED( hr ) )
+ return hr;
+ }
+ }
+
+ if( bDrawingHasBegun )
+ {
+ hr = m_pD3DXLine->End();
+ if( FAILED( hr ) )
+ return hr;
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::OnLostDevice()
+{
+ if( m_pD3DXLine )
+ m_pD3DXLine->OnLostDevice();
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::OnDeletedDevice()
+{
+ RemoveAllLines();
+ SAFE_RELEASE( m_pD3DXLine );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color,
+ float fWidth, float fScaleRatio, bool bAntiAlias )
+{
+ if( pVertexList == NULL || dwVertexListCount == 0 )
+ return E_INVALIDARG;
+
+ LINE_NODE* pLineNode = new LINE_NODE;
+ if( pLineNode == NULL )
+ return E_OUTOFMEMORY;
+ ZeroMemory( pLineNode, sizeof( LINE_NODE ) );
+
+ pLineNode->nLineID = m_LinesList.GetSize();
+ pLineNode->Color = Color;
+ pLineNode->fWidth = fWidth;
+ pLineNode->bAntiAlias = bAntiAlias;
+ pLineNode->dwVertexListCount = dwVertexListCount;
+
+ if( pnLineID )
+ *pnLineID = pLineNode->nLineID;
+
+ pLineNode->pVertexList = new D3DXVECTOR2[dwVertexListCount];
+ if( pLineNode->pVertexList == NULL )
+ {
+ delete pLineNode;
+ return E_OUTOFMEMORY;
+ }
+ for( DWORD i = 0; i < dwVertexListCount; i++ )
+ {
+ pLineNode->pVertexList[i] = pVertexList[i] * fScaleRatio;
+ }
+
+ m_LinesList.Add( pLineNode );
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio,
+ bool bAntiAlias )
+{
+ if( fWidth > 2.0f )
+ {
+ D3DXVECTOR2 vertexList[8];
+
+ vertexList[0].x = ( float )rc.left;
+ vertexList[0].y = ( float )rc.top - ( fWidth / 2.0f );
+
+ vertexList[1].x = ( float )rc.left;
+ vertexList[1].y = ( float )rc.bottom + ( fWidth / 2.0f );
+
+ vertexList[2].x = ( float )rc.left;
+ vertexList[2].y = ( float )rc.bottom - 0.5f;
+
+ vertexList[3].x = ( float )rc.right;
+ vertexList[3].y = ( float )rc.bottom - 0.5f;
+
+ vertexList[4].x = ( float )rc.right;
+ vertexList[4].y = ( float )rc.bottom + ( fWidth / 2.0f );
+
+ vertexList[5].x = ( float )rc.right;
+ vertexList[5].y = ( float )rc.top - ( fWidth / 2.0f );
+
+ vertexList[6].x = ( float )rc.right;
+ vertexList[6].y = ( float )rc.top;
+
+ vertexList[7].x = ( float )rc.left;
+ vertexList[7].y = ( float )rc.top;
+
+ return AddLine( pnLineID, vertexList, 8, Color, fWidth, fScaleRatio, bAntiAlias );
+ }
+ else
+ {
+ D3DXVECTOR2 vertexList[5];
+ vertexList[0].x = ( float )rc.left;
+ vertexList[0].y = ( float )rc.top;
+
+ vertexList[1].x = ( float )rc.left;
+ vertexList[1].y = ( float )rc.bottom;
+
+ vertexList[2].x = ( float )rc.right;
+ vertexList[2].y = ( float )rc.bottom;
+
+ vertexList[3].x = ( float )rc.right;
+ vertexList[3].y = ( float )rc.top;
+
+ vertexList[4].x = ( float )rc.left;
+ vertexList[4].y = ( float )rc.top;
+
+ return AddLine( pnLineID, vertexList, 5, Color, fWidth, fScaleRatio, bAntiAlias );
+ }
+}
+
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::RemoveLine( int nLineID )
+{
+ for( int i = 0; i < m_LinesList.GetSize(); i++ )
+ {
+ LINE_NODE* pLineNode = m_LinesList.GetAt( i );
+ if( pLineNode && pLineNode->nLineID == nLineID )
+ {
+ SAFE_DELETE_ARRAY( pLineNode->pVertexList );
+ delete pLineNode;
+ m_LinesList.SetAt( i, NULL );
+ }
+ }
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTLineManager::RemoveAllLines()
+{
+ for( int i = 0; i < m_LinesList.GetSize(); i++ )
+ {
+ LINE_NODE* pLineNode = m_LinesList.GetAt( i );
+ if( pLineNode )
+ {
+ SAFE_DELETE_ARRAY( pLineNode->pVertexList );
+ delete pLineNode;
+ }
+ }
+ m_LinesList.RemoveAll();
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+CDXUTTextHelper::CDXUTTextHelper( ID3DXFont* pFont9, ID3DXSprite* pSprite9, int nLineHeight )
+{
+ Init( pFont9, pSprite9, nLineHeight );
+}
+
+CDXUTTextHelper::CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3d11DeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight )
+{
+ Init( NULL, NULL, nLineHeight );
+ m_pd3d11Device = pd3d11Device;
+ m_pd3d11DeviceContext = pd3d11DeviceContext;
+ m_pManager = pManager;
+}
+CDXUTTextHelper::~CDXUTTextHelper()
+{
+
+}
+
+//--------------------------------------------------------------------------------------
+void CDXUTTextHelper::Init( ID3DXFont* pFont9, ID3DXSprite* pSprite9,
+ int nLineHeight )
+{
+ m_pFont9 = pFont9;
+ m_pSprite9 = pSprite9;
+ m_clr = D3DXCOLOR( 1, 1, 1, 1 );
+ m_pt.x = 0;
+ m_pt.y = 0;
+ m_nLineHeight = nLineHeight;
+ m_pd3d11Device = NULL;
+ m_pd3d11DeviceContext = NULL;
+ m_pManager = NULL;
+
+ // Create a blend state if a sprite is passed in
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTTextHelper::DrawFormattedTextLine( const WCHAR* strMsg, ... )
+{
+ WCHAR strBuffer[512];
+
+ va_list args;
+ va_start( args, strMsg );
+ vswprintf_s( strBuffer, 512, strMsg, args );
+ strBuffer[511] = L'\0';
+ va_end( args );
+
+ return DrawTextLine( strBuffer );
+}
+
+
+//--------------------------------------------------------------------------------------
+HRESULT CDXUTTextHelper::DrawTextLine( const WCHAR* strMsg )
+{
+ if( NULL == m_pFont9 && NULL == m_pd3d11DeviceContext )
+ return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );
+
+ HRESULT hr = S_OK;
+ RECT rc;
+ SetRect( &rc, m_pt.x, m_pt.y, 0, 0 );
+ if( m_pFont9 )
+ hr = m_pFont9->DrawText( m_pSprite9, strMsg, -1, &rc, DT_NOCLIP, m_clr );
+ else if( m_pd3d11DeviceContext )
+ DrawText11DXUT( m_pd3d11Device, m_pd3d11DeviceContext, strMsg, rc, m_clr,
+ (float)m_pManager->m_nBackBufferWidth, (float)m_pManager->m_nBackBufferHeight, false );
+
+ if( FAILED( hr ) )
+ return DXTRACE_ERR_MSGBOX( L"DrawText", hr );
+
+ m_pt.y += m_nLineHeight;
+
+ return S_OK;
+}
+
+
+HRESULT CDXUTTextHelper::DrawFormattedTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg, ... )
+{
+ WCHAR strBuffer[512];
+
+ va_list args;
+ va_start( args, strMsg );
+ vswprintf_s( strBuffer, 512, strMsg, args );
+ strBuffer[511] = L'\0';
+ va_end( args );
+
+ return DrawTextLine( rc, dwFlags, strBuffer );
+}
+
+
+HRESULT CDXUTTextHelper::DrawTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg )
+{
+ if( NULL == m_pFont9 && NULL == m_pd3d11DeviceContext )
+ return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG );
+
+ HRESULT hr = S_OK;
+ if( m_pFont9 )
+ hr = m_pFont9->DrawText( m_pSprite9, strMsg, -1, &rc, dwFlags, m_clr );
+ else if( m_pd3d11DeviceContext )
+ DrawText11DXUT( m_pd3d11Device, m_pd3d11DeviceContext, strMsg, rc, m_clr,
+ (float)m_pManager->m_nBackBufferWidth, (float)m_pManager->m_nBackBufferHeight, false );
+
+ if( FAILED( hr ) )
+ return DXTRACE_ERR_MSGBOX( L"DrawText", hr );
+
+ m_pt.y += m_nLineHeight;
+
+ return S_OK;
+}
+
+
+//--------------------------------------------------------------------------------------
+void CDXUTTextHelper::Begin()
+{
+ if( m_pSprite9 )
+ m_pSprite9->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );
+
+ if( m_pd3d11DeviceContext )
+ {
+ m_pManager->StoreD3D11State( m_pd3d11DeviceContext );
+ m_pManager->ApplyRenderUI11( m_pd3d11DeviceContext );
+ }
+
+
+}
+void CDXUTTextHelper::End()
+{
+ if( m_pSprite9 )
+ m_pSprite9->End();
+
+ if( m_pd3d11DeviceContext )
+ {
+ m_pManager->RestoreD3D11State( m_pd3d11DeviceContext );
+ }
+}
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKmisc.h b/samples/DX_APIUsage/DXUT/Optional/SDKmisc.h
new file mode 100644
index 0000000..b625b87
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKmisc.h
@@ -0,0 +1,368 @@
+//--------------------------------------------------------------------------------------
+// File: SDKMisc.h
+//
+// Various helper functionality that is shared between SDK samples
+//
+// Copyright (c) Microsoft Corporation. All rights reserved
+//--------------------------------------------------------------------------------------
+#pragma once
+#ifndef SDKMISC_H
+#define SDKMISC_H
+
+
+//-----------------------------------------------------------------------------
+// Resource cache for textures, fonts, meshs, and effects.
+// Use DXUTGetGlobalResourceCache() to access the global cache
+//-----------------------------------------------------------------------------
+
+enum DXUTCACHE_SOURCELOCATION
+{
+ DXUTCACHE_LOCATION_FILE,
+ DXUTCACHE_LOCATION_RESOURCE
+};
+
+struct DXUTCache_Texture
+{
+ DXUTCACHE_SOURCELOCATION Location;
+ WCHAR wszSource[MAX_PATH];
+ HMODULE hSrcModule;
+ UINT Width;
+ UINT Height;
+ UINT Depth;
+ UINT MipLevels;
+ UINT MiscFlags;
+ union
+ {
+ DWORD Usage9;
+ D3D11_USAGE Usage11;
+ };
+ union
+ {
+ D3DFORMAT Format9;
+ DXGI_FORMAT Format;
+ };
+ union
+ {
+ D3DPOOL Pool9;
+ UINT CpuAccessFlags;
+ };
+ union
+ {
+ D3DRESOURCETYPE Type9;
+ UINT BindFlags;
+ };
+ IDirect3DBaseTexture9* pTexture9;
+ ID3D11ShaderResourceView* pSRV11;
+
+ DXUTCache_Texture()
+ {
+ pTexture9 = NULL;
+ pSRV11 = NULL;
+ }
+};
+
+struct DXUTCache_Font : public D3DXFONT_DESC
+{
+ ID3DXFont* pFont;
+};
+
+struct DXUTCache_Effect
+{
+ DXUTCACHE_SOURCELOCATION Location;
+ WCHAR wszSource[MAX_PATH];
+ HMODULE hSrcModule;
+ DWORD dwFlags;
+ ID3DXEffect* pEffect;
+};
+
+
+class CDXUTResourceCache
+{
+public:
+ ~CDXUTResourceCache();
+
+ HRESULT CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DTEXTURE9* ppTexture );
+ HRESULT CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile,
+ LPDIRECT3DTEXTURE9* ppTexture );
+ HRESULT CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCTSTR pSrcFile,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false );
+ HRESULT CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCSTR pSrcFile,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false );
+ HRESULT CreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,
+ UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format,
+ D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DTEXTURE9* ppTexture );
+ HRESULT CreateTextureFromFileEx( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, LPCTSTR pSrcFile,
+ D3DX11_IMAGE_LOAD_INFO* pLoadInfo, ID3DX11ThreadPump* pPump,
+ ID3D11ShaderResourceView** ppOutputRV, bool bSRGB );
+ HRESULT CreateTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, LPDIRECT3DTEXTURE9* ppTexture );
+ HRESULT CreateTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Width, UINT Height, UINT MipLevels,
+ DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo,
+ PALETTEENTRY* pPalette, LPDIRECT3DTEXTURE9* ppTexture );
+ HRESULT CreateCubeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture );
+ HRESULT CreateCubeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Size,
+ UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,
+ DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture );
+ HRESULT CreateCubeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture );
+ HRESULT CreateCubeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Size, UINT MipLevels,
+ DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DCUBETEXTURE9* ppCubeTexture );
+ HRESULT CreateVolumeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );
+ HRESULT CreateVolumeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,
+ UINT Height, UINT Depth, UINT MipLevels, DWORD Usage,
+ D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DVOLUMETEXTURE9* ppTexture );
+ HRESULT CreateVolumeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );
+ HRESULT CreateVolumeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, UINT Width, UINT Height,
+ UINT Depth, UINT MipLevels, DWORD Usage,
+ D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,
+ DWORD MipFilter, D3DCOLOR ColorKey,
+ D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,
+ LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );
+ HRESULT CreateFont( LPDIRECT3DDEVICE9 pDevice, UINT Height, UINT Width, UINT Weight,
+ UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision,
+ DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT* ppFont );
+ HRESULT CreateFontIndirect( LPDIRECT3DDEVICE9 pDevice, CONST D3DXFONT_DESC *pDesc, LPD3DXFONT *ppFont );
+ HRESULT CreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,
+ const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags,
+ LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect,
+ LPD3DXBUFFER* ppCompilationErrors );
+ HRESULT CreateEffectFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,
+ LPCTSTR pSrcResource, const D3DXMACRO* pDefines,
+ LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool,
+ LPD3DXEFFECT* ppEffect, LPD3DXBUFFER* ppCompilationErrors );
+
+public:
+ HRESULT OnCreateDevice( IDirect3DDevice9* pd3dDevice );
+ HRESULT OnResetDevice( IDirect3DDevice9* pd3dDevice );
+ HRESULT OnLostDevice();
+ HRESULT OnDestroyDevice();
+
+protected:
+ friend CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache();
+ friend HRESULT WINAPI DXUTInitialize3DEnvironment();
+ friend HRESULT WINAPI DXUTReset3DEnvironment();
+ friend void WINAPI DXUTCleanup3DEnvironment( bool bReleaseSettings );
+
+ CDXUTResourceCache()
+ {
+ }
+
+ CGrowableArray <DXUTCache_Texture> m_TextureCache;
+ CGrowableArray <DXUTCache_Effect> m_EffectCache;
+ CGrowableArray <DXUTCache_Font> m_FontCache;
+};
+
+CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache();
+
+
+//--------------------------------------------------------------------------------------
+// Manages the insertion point when drawing text
+//--------------------------------------------------------------------------------------
+class CDXUTDialogResourceManager;
+class CDXUTTextHelper
+{
+public:
+ CDXUTTextHelper( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL,
+ int nLineHeight = 15 );
+ CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3dDeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight );
+ ~CDXUTTextHelper();
+
+ void Init( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL,
+ int nLineHeight = 15 );
+
+ void SetInsertionPos( int x, int y )
+ {
+ m_pt.x = x; m_pt.y = y;
+ }
+ void SetForegroundColor( D3DXCOLOR clr )
+ {
+ m_clr = clr;
+ }
+
+ void Begin();
+ HRESULT DrawFormattedTextLine( const WCHAR* strMsg, ... );
+ HRESULT DrawTextLine( const WCHAR* strMsg );
+ HRESULT DrawFormattedTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg, ... );
+ HRESULT DrawTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg );
+ void End();
+
+protected:
+ ID3DXFont* m_pFont9;
+ ID3DXSprite* m_pSprite9;
+ D3DXCOLOR m_clr;
+ POINT m_pt;
+ int m_nLineHeight;
+
+ // D3D11 font
+ ID3D11Device* m_pd3d11Device;
+ ID3D11DeviceContext* m_pd3d11DeviceContext;
+ CDXUTDialogResourceManager* m_pManager;
+};
+
+
+//--------------------------------------------------------------------------------------
+// Manages a persistent list of lines and draws them using ID3DXLine
+//--------------------------------------------------------------------------------------
+class CDXUTLineManager
+{
+public:
+ CDXUTLineManager();
+ ~CDXUTLineManager();
+
+ HRESULT OnCreatedDevice( IDirect3DDevice9* pd3dDevice );
+ HRESULT OnResetDevice();
+ HRESULT OnRender();
+ HRESULT OnLostDevice();
+ HRESULT OnDeletedDevice();
+
+ HRESULT AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color, float fWidth,
+ float fScaleRatio, bool bAntiAlias );
+ HRESULT AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio, bool bAntiAlias );
+ HRESULT RemoveLine( int nLineID );
+ HRESULT RemoveAllLines();
+
+protected:
+ struct LINE_NODE
+ {
+ int nLineID;
+ D3DCOLOR Color;
+ float fWidth;
+ bool bAntiAlias;
+ float fScaleRatio;
+ D3DXVECTOR2* pVertexList;
+ DWORD dwVertexListCount;
+ };
+
+ CGrowableArray <LINE_NODE*> m_LinesList;
+ IDirect3DDevice9* m_pd3dDevice;
+ ID3DXLine* m_pD3DXLine;
+};
+
+
+//--------------------------------------------------------------------------------------
+// Shared code for samples to ask user if they want to use a REF device or quit
+//--------------------------------------------------------------------------------------
+void WINAPI DXUTDisplaySwitchingToREFWarning( DXUTDeviceVersion ver );
+
+//--------------------------------------------------------------------------------------
+// Tries to finds a media file by searching in common locations
+//--------------------------------------------------------------------------------------
+HRESULT WINAPI DXUTFindDXSDKMediaFileCch( __out_ecount(cchDest) WCHAR* strDestPath,
+ __in int cchDest,
+ __in LPCWSTR strFilename );
+HRESULT WINAPI DXUTSetMediaSearchPath( LPCWSTR strPath );
+LPCWSTR WINAPI DXUTGetMediaSearchPath();
+
+
+//--------------------------------------------------------------------------------------
+// Returns a view matrix for rendering to a face of a cubemap.
+//--------------------------------------------------------------------------------------
+D3DXMATRIX WINAPI DXUTGetCubeMapViewMatrix( DWORD dwFace );
+
+
+//--------------------------------------------------------------------------------------
+// Simple helper stack class
+//--------------------------------------------------------------------------------------
+template <class T> class CDXUTStack
+{
+private:
+ UINT m_MemorySize;
+ UINT m_NumElements;
+ T* m_pData;
+
+ bool EnsureStackSize( UINT64 iElements )
+ {
+ if( m_MemorySize > iElements )
+ return true;
+
+ T* pTemp = new T[ ( size_t )( iElements * 2 + 256 ) ];
+ if( !pTemp )
+ return false;
+
+ if( m_NumElements )
+ {
+ CopyMemory( pTemp, m_pData, ( size_t )( m_NumElements * sizeof( T ) ) );
+ }
+
+ if( m_pData ) delete []m_pData;
+ m_pData = pTemp;
+ return true;
+ }
+
+public:
+ CDXUTStack()
+ {
+ m_pData = NULL; m_NumElements = 0; m_MemorySize = 0;
+ }
+ ~CDXUTStack()
+ {
+ if( m_pData ) delete []m_pData;
+ }
+
+ UINT GetCount()
+ {
+ return m_NumElements;
+ }
+ T GetAt( UINT i )
+ {
+ return m_pData[i];
+ }
+ T GetTop()
+ {
+ if( m_NumElements < 1 )
+ return NULL;
+
+ return m_pData[ m_NumElements - 1 ];
+ }
+
+ T GetRelative( INT i )
+ {
+ INT64 iVal = m_NumElements - 1 + i;
+ if( iVal < 0 )
+ return NULL;
+ return m_pData[ iVal ];
+ }
+
+ bool Push( T pElem )
+ {
+ if( !EnsureStackSize( m_NumElements + 1 ) )
+ return false;
+
+ m_pData[m_NumElements] = pElem;
+ m_NumElements++;
+
+ return true;
+ }
+
+ T Pop()
+ {
+ if( m_NumElements < 1 )
+ return NULL;
+
+ m_NumElements --;
+ return m_pData[m_NumElements];
+ }
+};
+
+
+#endif
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKsound.cpp b/samples/DX_APIUsage/DXUT/Optional/SDKsound.cpp
new file mode 100644
index 0000000..a124c77
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKsound.cpp
@@ -0,0 +1,1053 @@
+//-----------------------------------------------------------------------------
+// File: DXUTsound.cpp
+//
+// Desc: DirectSound framework classes for playing wav files in DirectSound
+// buffers. Feel free to use these classes as a starting point for adding
+// extra functionality.
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#define STRICT
+#include "DXUT.h"
+#include <mmsystem.h>
+#include <dsound.h>
+#include "SDKsound.h"
+#include "SDKwavefile.h"
+#undef min // use __min instead
+#undef max // use __max instead
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::CSoundManager()
+// Desc: Constructs the class
+//-----------------------------------------------------------------------------
+CSoundManager::CSoundManager()
+{
+ m_pDS = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::~CSoundManager()
+// Desc: Destroys the class
+//-----------------------------------------------------------------------------
+CSoundManager::~CSoundManager()
+{
+ SAFE_RELEASE( m_pDS );
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::Initialize()
+// Desc: Initializes the IDirectSound object and also sets the primary buffer
+// format. This function must be called before any others.
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::Initialize( HWND hWnd,
+ DWORD dwCoopLevel )
+{
+ HRESULT hr;
+
+ SAFE_RELEASE( m_pDS );
+
+ // Create IDirectSound using the primary sound device
+ if( FAILED( hr = DirectSoundCreate8( NULL, &m_pDS, NULL ) ) )
+ return DXUT_ERR( L"DirectSoundCreate8", hr );
+
+ // Set DirectSound coop level
+ if( FAILED( hr = m_pDS->SetCooperativeLevel( hWnd, dwCoopLevel ) ) )
+ return DXUT_ERR( L"SetCooperativeLevel", hr );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::SetPrimaryBufferFormat()
+// Desc: Set primary buffer to a specified format
+// !WARNING! - Setting the primary buffer format and then using this
+// same DirectSound object for DirectMusic messes up
+// DirectMusic!
+// For example, to set the primary buffer format to 22kHz stereo, 16-bit
+// then: dwPrimaryChannels = 2
+// dwPrimaryFreq = 22050,
+// dwPrimaryBitRate = 16
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::SetPrimaryBufferFormat( DWORD dwPrimaryChannels,
+ DWORD dwPrimaryFreq,
+ DWORD dwPrimaryBitRate )
+{
+ HRESULT hr;
+ LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
+
+ if( m_pDS == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ // Get the primary buffer
+ DSBUFFERDESC dsbd;
+ ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) );
+ dsbd.dwSize = sizeof( DSBUFFERDESC );
+ dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
+ dsbd.dwBufferBytes = 0;
+ dsbd.lpwfxFormat = NULL;
+
+ if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL ) ) )
+ return DXUT_ERR( L"CreateSoundBuffer", hr );
+
+ WAVEFORMATEX wfx;
+ ZeroMemory( &wfx, sizeof( WAVEFORMATEX ) );
+ wfx.wFormatTag = ( WORD )WAVE_FORMAT_PCM;
+ wfx.nChannels = ( WORD )dwPrimaryChannels;
+ wfx.nSamplesPerSec = ( DWORD )dwPrimaryFreq;
+ wfx.wBitsPerSample = ( WORD )dwPrimaryBitRate;
+ wfx.nBlockAlign = ( WORD )( wfx.wBitsPerSample / 8 * wfx.nChannels );
+ wfx.nAvgBytesPerSec = ( DWORD )( wfx.nSamplesPerSec * wfx.nBlockAlign );
+
+ if( FAILED( hr = pDSBPrimary->SetFormat( &wfx ) ) )
+ return DXUT_ERR( L"SetFormat", hr );
+
+ SAFE_RELEASE( pDSBPrimary );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::Get3DListenerInterface()
+// Desc: Returns the 3D listener interface associated with primary buffer.
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener )
+{
+ HRESULT hr;
+ DSBUFFERDESC dsbdesc;
+ LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
+
+ if( ppDSListener == NULL )
+ return E_INVALIDARG;
+ if( m_pDS == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ *ppDSListener = NULL;
+
+ // Obtain primary buffer, asking it for 3D control
+ ZeroMemory( &dsbdesc, sizeof( DSBUFFERDESC ) );
+ dsbdesc.dwSize = sizeof( DSBUFFERDESC );
+ dsbdesc.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER;
+ if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbdesc, &pDSBPrimary, NULL ) ) )
+ return DXUT_ERR( L"CreateSoundBuffer", hr );
+
+ if( FAILED( hr = pDSBPrimary->QueryInterface( IID_IDirectSound3DListener,
+ ( VOID** )ppDSListener ) ) )
+ {
+ SAFE_RELEASE( pDSBPrimary );
+ return DXUT_ERR( L"QueryInterface", hr );
+ }
+
+ // Release the primary buffer, since it is not need anymore
+ SAFE_RELEASE( pDSBPrimary );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::Create()
+// Desc:
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::Create( CSound** ppSound,
+ LPWSTR strWaveFileName,
+ DWORD dwCreationFlags,
+ GUID guid3DAlgorithm,
+ DWORD dwNumBuffers )
+{
+ HRESULT hr;
+ HRESULT hrRet = S_OK;
+ DWORD i;
+ LPDIRECTSOUNDBUFFER* apDSBuffer = NULL;
+ DWORD dwDSBufferSize = NULL;
+ CWaveFile* pWaveFile = NULL;
+
+ if( m_pDS == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( strWaveFileName == NULL || ppSound == NULL || dwNumBuffers < 1 )
+ return E_INVALIDARG;
+
+ apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers];
+ if( apDSBuffer == NULL )
+ {
+ hr = E_OUTOFMEMORY;
+ goto LFail;
+ }
+
+ pWaveFile = new CWaveFile();
+ if( pWaveFile == NULL )
+ {
+ hr = E_OUTOFMEMORY;
+ goto LFail;
+ }
+
+ pWaveFile->Open( strWaveFileName, NULL, WAVEFILE_READ );
+
+ if( pWaveFile->GetSize() == 0 )
+ {
+ // Wave is blank, so don't create it.
+ hr = E_FAIL;
+ goto LFail;
+ }
+
+ // Make the DirectSound buffer the same size as the wav file
+ dwDSBufferSize = pWaveFile->GetSize();
+
+ // Create the direct sound buffer, and only request the flags needed
+ // since each requires some overhead and limits if the buffer can
+ // be hardware accelerated
+ DSBUFFERDESC dsbd;
+ ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) );
+ dsbd.dwSize = sizeof( DSBUFFERDESC );
+ dsbd.dwFlags = dwCreationFlags;
+ dsbd.dwBufferBytes = dwDSBufferSize;
+ dsbd.guid3DAlgorithm = guid3DAlgorithm;
+ dsbd.lpwfxFormat = pWaveFile->m_pwfx;
+
+ // DirectSound is only guarenteed to play PCM data. Other
+ // formats may or may not work depending the sound card driver.
+ hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[0], NULL );
+
+ // Be sure to return this error code if it occurs so the
+ // callers knows this happened.
+ if( hr == DS_NO_VIRTUALIZATION )
+ hrRet = DS_NO_VIRTUALIZATION;
+
+ if( FAILED( hr ) )
+ {
+ // DSERR_BUFFERTOOSMALL will be returned if the buffer is
+ // less than DSBSIZE_FX_MIN and the buffer is created
+ // with DSBCAPS_CTRLFX.
+
+ // It might also fail if hardware buffer mixing was requested
+ // on a device that doesn't support it.
+ DXUT_ERR( L"CreateSoundBuffer", hr );
+
+ goto LFail;
+ }
+
+ // Default to use DuplicateSoundBuffer() when created extra buffers since always
+ // create a buffer that uses the same memory however DuplicateSoundBuffer() will fail if
+ // DSBCAPS_CTRLFX is used, so use CreateSoundBuffer() instead in this case.
+ if( ( dwCreationFlags & DSBCAPS_CTRLFX ) == 0 )
+ {
+ for( i = 1; i < dwNumBuffers; i++ )
+ {
+ if( FAILED( hr = m_pDS->DuplicateSoundBuffer( apDSBuffer[0], &apDSBuffer[i] ) ) )
+ {
+ DXUT_ERR( L"DuplicateSoundBuffer", hr );
+ goto LFail;
+ }
+ }
+ }
+ else
+ {
+ for( i = 1; i < dwNumBuffers; i++ )
+ {
+ hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[i], NULL );
+ if( FAILED( hr ) )
+ {
+ DXUT_ERR( L"CreateSoundBuffer", hr );
+ goto LFail;
+ }
+ }
+ }
+
+ // Create the sound
+ *ppSound = new CSound( apDSBuffer, dwDSBufferSize, dwNumBuffers, pWaveFile, dwCreationFlags );
+
+ SAFE_DELETE_ARRAY( apDSBuffer );
+ return hrRet;
+
+LFail:
+ // Cleanup
+ SAFE_DELETE( pWaveFile );
+ SAFE_DELETE_ARRAY( apDSBuffer );
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::CreateFromMemory()
+// Desc:
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::CreateFromMemory( CSound** ppSound,
+ BYTE* pbData,
+ ULONG ulDataSize,
+ LPWAVEFORMATEX pwfx,
+ DWORD dwCreationFlags,
+ GUID guid3DAlgorithm,
+ DWORD dwNumBuffers )
+{
+ HRESULT hr;
+ DWORD i;
+ LPDIRECTSOUNDBUFFER* apDSBuffer = NULL;
+ DWORD dwDSBufferSize = NULL;
+ CWaveFile* pWaveFile = NULL;
+
+ if( m_pDS == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( pbData == NULL || ppSound == NULL || dwNumBuffers < 1 )
+ return E_INVALIDARG;
+
+ apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers];
+ if( apDSBuffer == NULL )
+ {
+ hr = E_OUTOFMEMORY;
+ goto LFail;
+ }
+
+ pWaveFile = new CWaveFile();
+ if( pWaveFile == NULL )
+ {
+ hr = E_OUTOFMEMORY;
+ goto LFail;
+ }
+
+ pWaveFile->OpenFromMemory( pbData, ulDataSize, pwfx, WAVEFILE_READ );
+
+
+ // Make the DirectSound buffer the same size as the wav file
+ dwDSBufferSize = ulDataSize;
+
+ // Create the direct sound buffer, and only request the flags needed
+ // since each requires some overhead and limits if the buffer can
+ // be hardware accelerated
+ DSBUFFERDESC dsbd;
+ ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) );
+ dsbd.dwSize = sizeof( DSBUFFERDESC );
+ dsbd.dwFlags = dwCreationFlags;
+ dsbd.dwBufferBytes = dwDSBufferSize;
+ dsbd.guid3DAlgorithm = guid3DAlgorithm;
+ dsbd.lpwfxFormat = pwfx;
+
+ if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[0], NULL ) ) )
+ {
+ DXUT_ERR( L"CreateSoundBuffer", hr );
+ goto LFail;
+ }
+
+ // Default to use DuplicateSoundBuffer() when created extra buffers since always
+ // create a buffer that uses the same memory however DuplicateSoundBuffer() will fail if
+ // DSBCAPS_CTRLFX is used, so use CreateSoundBuffer() instead in this case.
+ if( ( dwCreationFlags & DSBCAPS_CTRLFX ) == 0 )
+ {
+ for( i = 1; i < dwNumBuffers; i++ )
+ {
+ if( FAILED( hr = m_pDS->DuplicateSoundBuffer( apDSBuffer[0], &apDSBuffer[i] ) ) )
+ {
+ DXUT_ERR( L"DuplicateSoundBuffer", hr );
+ goto LFail;
+ }
+ }
+ }
+ else
+ {
+ for( i = 1; i < dwNumBuffers; i++ )
+ {
+ hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[i], NULL );
+ if( FAILED( hr ) )
+ {
+ DXUT_ERR( L"CreateSoundBuffer", hr );
+ goto LFail;
+ }
+ }
+ }
+
+ // Create the sound
+ *ppSound = new CSound( apDSBuffer, dwDSBufferSize, dwNumBuffers, pWaveFile, dwCreationFlags );
+
+ SAFE_DELETE_ARRAY( apDSBuffer );
+ return S_OK;
+
+LFail:
+ // Cleanup
+
+ SAFE_DELETE_ARRAY( apDSBuffer );
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSoundManager::CreateStreaming()
+// Desc:
+//-----------------------------------------------------------------------------
+HRESULT CSoundManager::CreateStreaming( CStreamingSound** ppStreamingSound,
+ LPWSTR strWaveFileName,
+ DWORD dwCreationFlags,
+ GUID guid3DAlgorithm,
+ DWORD dwNotifyCount,
+ DWORD dwNotifySize,
+ HANDLE hNotifyEvent )
+{
+ HRESULT hr;
+
+ if( m_pDS == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( strWaveFileName == NULL || ppStreamingSound == NULL || hNotifyEvent == NULL )
+ return E_INVALIDARG;
+
+ LPDIRECTSOUNDBUFFER pDSBuffer = NULL;
+ DWORD dwDSBufferSize = NULL;
+ CWaveFile* pWaveFile = NULL;
+ DSBPOSITIONNOTIFY* aPosNotify = NULL;
+ LPDIRECTSOUNDNOTIFY pDSNotify = NULL;
+
+ pWaveFile = new CWaveFile();
+ if( pWaveFile == NULL )
+ return E_OUTOFMEMORY;
+ pWaveFile->Open( strWaveFileName, NULL, WAVEFILE_READ );
+
+ // Figure out how big the DirectSound buffer should be
+ dwDSBufferSize = dwNotifySize * dwNotifyCount;
+
+ // Set up the direct sound buffer. Request the NOTIFY flag, so
+ // that we are notified as the sound buffer plays. Note, that using this flag
+ // may limit the amount of hardware acceleration that can occur.
+ DSBUFFERDESC dsbd;
+ ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) );
+ dsbd.dwSize = sizeof( DSBUFFERDESC );
+ dsbd.dwFlags = dwCreationFlags |
+ DSBCAPS_CTRLPOSITIONNOTIFY |
+ DSBCAPS_GETCURRENTPOSITION2;
+ dsbd.dwBufferBytes = dwDSBufferSize;
+ dsbd.guid3DAlgorithm = guid3DAlgorithm;
+ dsbd.lpwfxFormat = pWaveFile->m_pwfx;
+
+ if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBuffer, NULL ) ) )
+ {
+ // If wave format isn't then it will return
+ // either DSERR_BADFORMAT or E_INVALIDARG
+ if( hr == DSERR_BADFORMAT || hr == E_INVALIDARG )
+ return DXUT_ERR( L"CreateSoundBuffer", hr );
+
+ return DXUT_ERR( L"CreateSoundBuffer", hr );
+ }
+
+ // Create the notification events, so that we know when to fill
+ // the buffer as the sound plays.
+ if( FAILED( hr = pDSBuffer->QueryInterface( IID_IDirectSoundNotify,
+ ( VOID** )&pDSNotify ) ) )
+ {
+ SAFE_DELETE_ARRAY( aPosNotify );
+ return DXUT_ERR( L"QueryInterface", hr );
+ }
+
+ aPosNotify = new DSBPOSITIONNOTIFY[ dwNotifyCount ];
+ if( aPosNotify == NULL )
+ return E_OUTOFMEMORY;
+
+ for( DWORD i = 0; i < dwNotifyCount; i++ )
+ {
+ aPosNotify[i].dwOffset = ( dwNotifySize * i ) + dwNotifySize - 1;
+ aPosNotify[i].hEventNotify = hNotifyEvent;
+ }
+
+ // Tell DirectSound when to notify us. The notification will come in the from
+ // of signaled events that are handled in WinMain()
+ if( FAILED( hr = pDSNotify->SetNotificationPositions( dwNotifyCount,
+ aPosNotify ) ) )
+ {
+ SAFE_RELEASE( pDSNotify );
+ SAFE_DELETE_ARRAY( aPosNotify );
+ return DXUT_ERR( L"SetNotificationPositions", hr );
+ }
+
+ SAFE_RELEASE( pDSNotify );
+ SAFE_DELETE_ARRAY( aPosNotify );
+
+ // Create the sound
+ *ppStreamingSound = new CStreamingSound( pDSBuffer, dwDSBufferSize, pWaveFile, dwNotifySize );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::CSound()
+// Desc: Constructs the class
+//-----------------------------------------------------------------------------
+CSound::CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize,
+ DWORD dwNumBuffers, CWaveFile* pWaveFile, DWORD dwCreationFlags )
+{
+ DWORD i;
+
+ if( dwNumBuffers <= 0 )
+ return;
+
+ m_apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers];
+ if( NULL != m_apDSBuffer )
+ {
+ for( i = 0; i < dwNumBuffers; i++ )
+ m_apDSBuffer[i] = apDSBuffer[i];
+
+ m_dwDSBufferSize = dwDSBufferSize;
+ m_dwNumBuffers = dwNumBuffers;
+ m_pWaveFile = pWaveFile;
+ m_dwCreationFlags = dwCreationFlags;
+
+ FillBufferWithSound( m_apDSBuffer[0], FALSE );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::~CSound()
+// Desc: Destroys the class
+//-----------------------------------------------------------------------------
+CSound::~CSound()
+{
+ for( DWORD i = 0; i < m_dwNumBuffers; i++ )
+ {
+ SAFE_RELEASE( m_apDSBuffer[i] );
+ }
+
+ SAFE_DELETE_ARRAY( m_apDSBuffer );
+ SAFE_DELETE( m_pWaveFile );
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::FillBufferWithSound()
+// Desc: Fills a DirectSound buffer with a sound file
+//-----------------------------------------------------------------------------
+HRESULT CSound::FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger )
+{
+ HRESULT hr;
+ VOID* pDSLockedBuffer = NULL; // Pointer to locked buffer memory
+ DWORD dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
+ DWORD dwWavDataRead = 0; // Amount of data read from the wav file
+
+ if( pDSB == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ // Make sure we have focus, and we didn't just switch in from
+ // an app which had a DirectSound device
+ if( FAILED( hr = RestoreBuffer( pDSB, NULL ) ) )
+ return DXUT_ERR( L"RestoreBuffer", hr );
+
+ // Lock the buffer down
+ if( FAILED( hr = pDSB->Lock( 0, m_dwDSBufferSize,
+ &pDSLockedBuffer, &dwDSLockedBufferSize,
+ NULL, NULL, 0L ) ) )
+ return DXUT_ERR( L"Lock", hr );
+
+ // Reset the wave file to the beginning
+ m_pWaveFile->ResetFile();
+
+ if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer,
+ dwDSLockedBufferSize,
+ &dwWavDataRead ) ) )
+ return DXUT_ERR( L"Read", hr );
+
+ if( dwWavDataRead == 0 )
+ {
+ // Wav is blank, so just fill with silence
+ FillMemory( ( BYTE* )pDSLockedBuffer,
+ dwDSLockedBufferSize,
+ ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );
+ }
+ else if( dwWavDataRead < dwDSLockedBufferSize )
+ {
+ // If the wav file was smaller than the DirectSound buffer,
+ // we need to fill the remainder of the buffer with data
+ if( bRepeatWavIfBufferLarger )
+ {
+ // Reset the file and fill the buffer with wav data
+ DWORD dwReadSoFar = dwWavDataRead; // From previous call above.
+ while( dwReadSoFar < dwDSLockedBufferSize )
+ {
+ // This will keep reading in until the buffer is full
+ // for very short files
+ if( FAILED( hr = m_pWaveFile->ResetFile() ) )
+ return DXUT_ERR( L"ResetFile", hr );
+
+ hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer + dwReadSoFar,
+ dwDSLockedBufferSize - dwReadSoFar,
+ &dwWavDataRead );
+ if( FAILED( hr ) )
+ return DXUT_ERR( L"Read", hr );
+
+ dwReadSoFar += dwWavDataRead;
+ }
+ }
+ else
+ {
+ // Don't repeat the wav file, just fill in silence
+ FillMemory( ( BYTE* )pDSLockedBuffer + dwWavDataRead,
+ dwDSLockedBufferSize - dwWavDataRead,
+ ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );
+ }
+ }
+
+ // Unlock the buffer, we don't need it anymore.
+ pDSB->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::RestoreBuffer()
+// Desc: Restores the lost buffer. *pbWasRestored returns TRUE if the buffer was
+// restored. It can also NULL if the information is not needed.
+//-----------------------------------------------------------------------------
+HRESULT CSound::RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored )
+{
+ HRESULT hr;
+
+ if( pDSB == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( pbWasRestored )
+ *pbWasRestored = FALSE;
+
+ DWORD dwStatus;
+ if( FAILED( hr = pDSB->GetStatus( &dwStatus ) ) )
+ return DXUT_ERR( L"GetStatus", hr );
+
+ if( dwStatus & DSBSTATUS_BUFFERLOST )
+ {
+ // Since the app could have just been activated, then
+ // DirectSound may not be giving us control yet, so
+ // the restoring the buffer may fail.
+ // If it does, sleep until DirectSound gives us control.
+ do
+ {
+ hr = pDSB->Restore();
+ if( hr == DSERR_BUFFERLOST )
+ Sleep( 10 );
+ } while( ( hr = pDSB->Restore() ) == DSERR_BUFFERLOST );
+
+ if( pbWasRestored != NULL )
+ *pbWasRestored = TRUE;
+
+ return S_OK;
+ }
+ else
+ {
+ return S_FALSE;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::GetFreeBuffer()
+// Desc: Finding the first buffer that is not playing and return a pointer to
+// it, or if all are playing return a pointer to a randomly selected buffer.
+//-----------------------------------------------------------------------------
+LPDIRECTSOUNDBUFFER CSound::GetFreeBuffer()
+{
+ if( m_apDSBuffer == NULL )
+ return FALSE;
+
+ DWORD i;
+ for( i = 0; i < m_dwNumBuffers; i++ )
+ {
+ if( m_apDSBuffer[i] )
+ {
+ DWORD dwStatus = 0;
+ m_apDSBuffer[i]->GetStatus( &dwStatus );
+ if( ( dwStatus & DSBSTATUS_PLAYING ) == 0 )
+ break;
+ }
+ }
+
+ if( i != m_dwNumBuffers )
+ return m_apDSBuffer[ i ];
+ else
+ return m_apDSBuffer[ rand() % m_dwNumBuffers ];
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::GetBuffer()
+// Desc:
+//-----------------------------------------------------------------------------
+LPDIRECTSOUNDBUFFER CSound::GetBuffer( DWORD dwIndex )
+{
+ if( m_apDSBuffer == NULL )
+ return NULL;
+ if( dwIndex >= m_dwNumBuffers )
+ return NULL;
+
+ return m_apDSBuffer[dwIndex];
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::Get3DBufferInterface()
+// Desc:
+//-----------------------------------------------------------------------------
+HRESULT CSound::Get3DBufferInterface( DWORD dwIndex, LPDIRECTSOUND3DBUFFER* ppDS3DBuffer )
+{
+ if( m_apDSBuffer == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( dwIndex >= m_dwNumBuffers )
+ return E_INVALIDARG;
+
+ *ppDS3DBuffer = NULL;
+
+ return m_apDSBuffer[dwIndex]->QueryInterface( IID_IDirectSound3DBuffer,
+ ( VOID** )ppDS3DBuffer );
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::Play()
+// Desc: Plays the sound using voice management flags. Pass in DSBPLAY_LOOPING
+// in the dwFlags to loop the sound
+//-----------------------------------------------------------------------------
+HRESULT CSound::Play( DWORD dwPriority, DWORD dwFlags, LONG lVolume, LONG lFrequency, LONG lPan )
+{
+ HRESULT hr;
+ BOOL bRestored;
+
+ if( m_apDSBuffer == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ LPDIRECTSOUNDBUFFER pDSB = GetFreeBuffer();
+
+ if( pDSB == NULL )
+ return DXUT_ERR( L"GetFreeBuffer", E_FAIL );
+
+ // Restore the buffer if it was lost
+ if( FAILED( hr = RestoreBuffer( pDSB, &bRestored ) ) )
+ return DXUT_ERR( L"RestoreBuffer", hr );
+
+ if( bRestored )
+ {
+ // The buffer was restored, so we need to fill it with new data
+ if( FAILED( hr = FillBufferWithSound( pDSB, FALSE ) ) )
+ return DXUT_ERR( L"FillBufferWithSound", hr );
+ }
+
+ if( m_dwCreationFlags & DSBCAPS_CTRLVOLUME )
+ {
+ pDSB->SetVolume( lVolume );
+ }
+
+ if( lFrequency != -1 &&
+ ( m_dwCreationFlags & DSBCAPS_CTRLFREQUENCY ) )
+ {
+ pDSB->SetFrequency( lFrequency );
+ }
+
+ if( m_dwCreationFlags & DSBCAPS_CTRLPAN )
+ {
+ pDSB->SetPan( lPan );
+ }
+
+ return pDSB->Play( 0, dwPriority, dwFlags );
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::Play3D()
+// Desc: Plays the sound using voice management flags. Pass in DSBPLAY_LOOPING
+// in the dwFlags to loop the sound
+//-----------------------------------------------------------------------------
+HRESULT CSound::Play3D( LPDS3DBUFFER p3DBuffer, DWORD dwPriority, DWORD dwFlags, LONG lFrequency )
+{
+ HRESULT hr;
+ BOOL bRestored;
+ DWORD dwBaseFrequency;
+
+ if( m_apDSBuffer == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ LPDIRECTSOUNDBUFFER pDSB = GetFreeBuffer();
+ if( pDSB == NULL )
+ return DXUT_ERR( L"GetFreeBuffer", E_FAIL );
+
+ // Restore the buffer if it was lost
+ if( FAILED( hr = RestoreBuffer( pDSB, &bRestored ) ) )
+ return DXUT_ERR( L"RestoreBuffer", hr );
+
+ if( bRestored )
+ {
+ // The buffer was restored, so we need to fill it with new data
+ if( FAILED( hr = FillBufferWithSound( pDSB, FALSE ) ) )
+ return DXUT_ERR( L"FillBufferWithSound", hr );
+ }
+
+ if( m_dwCreationFlags & DSBCAPS_CTRLFREQUENCY )
+ {
+ pDSB->GetFrequency( &dwBaseFrequency );
+ pDSB->SetFrequency( dwBaseFrequency + lFrequency );
+ }
+
+ // QI for the 3D buffer
+ LPDIRECTSOUND3DBUFFER pDS3DBuffer;
+ hr = pDSB->QueryInterface( IID_IDirectSound3DBuffer, ( VOID** )&pDS3DBuffer );
+ if( SUCCEEDED( hr ) )
+ {
+ hr = pDS3DBuffer->SetAllParameters( p3DBuffer, DS3D_IMMEDIATE );
+ if( SUCCEEDED( hr ) )
+ {
+ hr = pDSB->Play( 0, dwPriority, dwFlags );
+ }
+
+ pDS3DBuffer->Release();
+ }
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::Stop()
+// Desc: Stops the sound from playing
+//-----------------------------------------------------------------------------
+HRESULT CSound::Stop()
+{
+ if( m_apDSBuffer == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ HRESULT hr = 0;
+
+ for( DWORD i = 0; i < m_dwNumBuffers; i++ )
+ hr |= m_apDSBuffer[i]->Stop();
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::Reset()
+// Desc: Reset all of the sound buffers
+//-----------------------------------------------------------------------------
+HRESULT CSound::Reset()
+{
+ if( m_apDSBuffer == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ HRESULT hr = 0;
+
+ for( DWORD i = 0; i < m_dwNumBuffers; i++ )
+ hr |= m_apDSBuffer[i]->SetCurrentPosition( 0 );
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CSound::IsSoundPlaying()
+// Desc: Checks to see if a buffer is playing and returns TRUE if it is.
+//-----------------------------------------------------------------------------
+BOOL CSound::IsSoundPlaying()
+{
+ BOOL bIsPlaying = FALSE;
+
+ if( m_apDSBuffer == NULL )
+ return FALSE;
+
+ for( DWORD i = 0; i < m_dwNumBuffers; i++ )
+ {
+ if( m_apDSBuffer[i] )
+ {
+ DWORD dwStatus = 0;
+ m_apDSBuffer[i]->GetStatus( &dwStatus );
+ bIsPlaying |= ( ( dwStatus & DSBSTATUS_PLAYING ) != 0 );
+ }
+ }
+
+ return bIsPlaying;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CStreamingSound::CStreamingSound()
+// Desc: Setups up a buffer so data can be streamed from the wave file into
+// a buffer. This is very useful for large wav files that would take a
+// while to load. The buffer is initially filled with data, then
+// as sound is played the notification events are signaled and more data
+// is written into the buffer by calling HandleWaveStreamNotification()
+//-----------------------------------------------------------------------------
+CStreamingSound::CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize,
+ CWaveFile* pWaveFile, DWORD dwNotifySize ) : CSound( &pDSBuffer, dwDSBufferSize, 1,
+ pWaveFile, 0 )
+{
+ m_dwLastPlayPos = 0;
+ m_dwPlayProgress = 0;
+ m_dwNotifySize = dwNotifySize;
+ m_dwNextWriteOffset = 0;
+ m_bFillNextNotificationWithSilence = FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CStreamingSound::~CStreamingSound()
+// Desc: Destroys the class
+//-----------------------------------------------------------------------------
+CStreamingSound::~CStreamingSound()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CStreamingSound::HandleWaveStreamNotification()
+// Desc: Handle the notification that tells us to put more wav data in the
+// circular buffer
+//-----------------------------------------------------------------------------
+HRESULT CStreamingSound::HandleWaveStreamNotification( BOOL bLoopedPlay )
+{
+ HRESULT hr;
+ DWORD dwCurrentPlayPos;
+ DWORD dwPlayDelta;
+ DWORD dwBytesWrittenToBuffer;
+ VOID* pDSLockedBuffer = NULL;
+ VOID* pDSLockedBuffer2 = NULL;
+ DWORD dwDSLockedBufferSize;
+ DWORD dwDSLockedBufferSize2;
+
+ if( m_apDSBuffer == NULL || m_pWaveFile == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ // Restore the buffer if it was lost
+ BOOL bRestored;
+ if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) )
+ return DXUT_ERR( L"RestoreBuffer", hr );
+
+ if( bRestored )
+ {
+ // The buffer was restored, so we need to fill it with new data
+ if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) )
+ return DXUT_ERR( L"FillBufferWithSound", hr );
+ return S_OK;
+ }
+
+ // Lock the DirectSound buffer
+ if( FAILED( hr = m_apDSBuffer[0]->Lock( m_dwNextWriteOffset, m_dwNotifySize,
+ &pDSLockedBuffer, &dwDSLockedBufferSize,
+ &pDSLockedBuffer2, &dwDSLockedBufferSize2, 0L ) ) )
+ return DXUT_ERR( L"Lock", hr );
+
+ // m_dwDSBufferSize and m_dwNextWriteOffset are both multiples of m_dwNotifySize,
+ // it should the second buffer, so it should never be valid
+ if( pDSLockedBuffer2 != NULL )
+ return E_UNEXPECTED;
+
+ if( !m_bFillNextNotificationWithSilence )
+ {
+ // Fill the DirectSound buffer with wav data
+ if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer,
+ dwDSLockedBufferSize,
+ &dwBytesWrittenToBuffer ) ) )
+ return DXUT_ERR( L"Read", hr );
+ }
+ else
+ {
+ // Fill the DirectSound buffer with silence
+ FillMemory( pDSLockedBuffer, dwDSLockedBufferSize,
+ ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );
+ dwBytesWrittenToBuffer = dwDSLockedBufferSize;
+ }
+
+ // If the number of bytes written is less than the
+ // amount we requested, we have a short file.
+ if( dwBytesWrittenToBuffer < dwDSLockedBufferSize )
+ {
+ if( !bLoopedPlay )
+ {
+ // Fill in silence for the rest of the buffer.
+ FillMemory( ( BYTE* )pDSLockedBuffer + dwBytesWrittenToBuffer,
+ dwDSLockedBufferSize - dwBytesWrittenToBuffer,
+ ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );
+
+ // Any future notifications should just fill the buffer with silence
+ m_bFillNextNotificationWithSilence = TRUE;
+ }
+ else
+ {
+ // We are looping, so reset the file and fill the buffer with wav data
+ DWORD dwReadSoFar = dwBytesWrittenToBuffer; // From previous call above.
+ while( dwReadSoFar < dwDSLockedBufferSize )
+ {
+ // This will keep reading in until the buffer is full (for very short files).
+ if( FAILED( hr = m_pWaveFile->ResetFile() ) )
+ return DXUT_ERR( L"ResetFile", hr );
+
+ if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer + dwReadSoFar,
+ dwDSLockedBufferSize - dwReadSoFar,
+ &dwBytesWrittenToBuffer ) ) )
+ return DXUT_ERR( L"Read", hr );
+
+ dwReadSoFar += dwBytesWrittenToBuffer;
+ }
+ }
+ }
+
+ // Unlock the DirectSound buffer
+ m_apDSBuffer[0]->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 );
+
+ // Figure out how much data has been played so far. When we have played
+ // past the end of the file, we will either need to start filling the
+ // buffer with silence or starting reading from the beginning of the file,
+ // depending if the user wants to loop the sound
+ if( FAILED( hr = m_apDSBuffer[0]->GetCurrentPosition( &dwCurrentPlayPos, NULL ) ) )
+ return DXUT_ERR( L"GetCurrentPosition", hr );
+
+ // Check to see if the position counter looped
+ if( dwCurrentPlayPos < m_dwLastPlayPos )
+ dwPlayDelta = ( m_dwDSBufferSize - m_dwLastPlayPos ) + dwCurrentPlayPos;
+ else
+ dwPlayDelta = dwCurrentPlayPos - m_dwLastPlayPos;
+
+ m_dwPlayProgress += dwPlayDelta;
+ m_dwLastPlayPos = dwCurrentPlayPos;
+
+ // If we are now filling the buffer with silence, then we have found the end so
+ // check to see if the entire sound has played, if it has then stop the buffer.
+ if( m_bFillNextNotificationWithSilence )
+ {
+ // We don't want to cut off the sound before it's done playing.
+ if( m_dwPlayProgress >= m_pWaveFile->GetSize() )
+ {
+ m_apDSBuffer[0]->Stop();
+ }
+ }
+
+ // Update where the buffer will lock (for next time)
+ m_dwNextWriteOffset += dwDSLockedBufferSize;
+ m_dwNextWriteOffset %= m_dwDSBufferSize; // Circular buffer
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CStreamingSound::Reset()
+// Desc: Resets the sound so it will begin playing at the beginning
+//-----------------------------------------------------------------------------
+HRESULT CStreamingSound::Reset()
+{
+ HRESULT hr;
+
+ if( m_apDSBuffer[0] == NULL || m_pWaveFile == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ m_dwLastPlayPos = 0;
+ m_dwPlayProgress = 0;
+ m_dwNextWriteOffset = 0;
+ m_bFillNextNotificationWithSilence = FALSE;
+
+ // Restore the buffer if it was lost
+ BOOL bRestored;
+ if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) )
+ return DXUT_ERR( L"RestoreBuffer", hr );
+
+ if( bRestored )
+ {
+ // The buffer was restored, so we need to fill it with new data
+ if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) )
+ return DXUT_ERR( L"FillBufferWithSound", hr );
+ }
+
+ m_pWaveFile->ResetFile();
+
+ return m_apDSBuffer[0]->SetCurrentPosition( 0L );
+}
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKsound.h b/samples/DX_APIUsage/DXUT/Optional/SDKsound.h
new file mode 100644
index 0000000..d505ed7
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKsound.h
@@ -0,0 +1,124 @@
+//-----------------------------------------------------------------------------
+// File: DXUTsound.h
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#ifndef DXUTSOUND_H
+#define DXUTSOUND_H
+
+//-----------------------------------------------------------------------------
+// Header Includes
+//-----------------------------------------------------------------------------
+#include <dsound.h>
+#include <ks.h>
+
+//-----------------------------------------------------------------------------
+// Classes used by this header
+//-----------------------------------------------------------------------------
+class CSoundManager;
+class CSound;
+class CStreamingSound;
+class CWaveFile;
+
+
+//-----------------------------------------------------------------------------
+// Typing macros
+//-----------------------------------------------------------------------------
+#define DXUT_StopSound(s) { if(s) s->Stop(); }
+#define DXUT_PlaySound(s) { if(s) s->Play( 0, 0 ); }
+#define DXUT_PlaySoundLooping(s) { if(s) s->Play( 0, DSBPLAY_LOOPING ); }
+
+
+//-----------------------------------------------------------------------------
+// Name: class CSoundManager
+// Desc:
+//-----------------------------------------------------------------------------
+class CSoundManager
+{
+protected:
+ IDirectSound8* m_pDS;
+
+public:
+ CSoundManager();
+ ~CSoundManager();
+
+ HRESULT Initialize( HWND hWnd, DWORD dwCoopLevel );
+ inline LPDIRECTSOUND8 GetDirectSound()
+ {
+ return m_pDS;
+ }
+ HRESULT SetPrimaryBufferFormat( DWORD dwPrimaryChannels, DWORD dwPrimaryFreq,
+ DWORD dwPrimaryBitRate );
+ HRESULT Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener );
+
+ HRESULT Create( CSound** ppSound, LPWSTR strWaveFileName, DWORD dwCreationFlags = 0,
+ GUID guid3DAlgorithm = GUID_NULL, DWORD dwNumBuffers = 1 );
+ HRESULT CreateFromMemory( CSound** ppSound, BYTE* pbData, ULONG ulDataSize, LPWAVEFORMATEX pwfx,
+ DWORD dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL,
+ DWORD dwNumBuffers = 1 );
+ HRESULT CreateStreaming( CStreamingSound** ppStreamingSound, LPWSTR strWaveFileName,
+ DWORD dwCreationFlags, GUID guid3DAlgorithm, DWORD dwNotifyCount,
+ DWORD dwNotifySize, HANDLE hNotifyEvent );
+};
+
+
+//-----------------------------------------------------------------------------
+// Name: class CSound
+// Desc: Encapsulates functionality of a DirectSound buffer.
+//-----------------------------------------------------------------------------
+class CSound
+{
+protected:
+ LPDIRECTSOUNDBUFFER* m_apDSBuffer;
+ DWORD m_dwDSBufferSize;
+ CWaveFile* m_pWaveFile;
+ DWORD m_dwNumBuffers;
+ DWORD m_dwCreationFlags;
+
+ HRESULT RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored );
+
+public:
+ CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize, DWORD dwNumBuffers,
+ CWaveFile* pWaveFile, DWORD dwCreationFlags );
+ virtual ~CSound();
+
+ HRESULT Get3DBufferInterface( DWORD dwIndex, LPDIRECTSOUND3DBUFFER* ppDS3DBuffer );
+ HRESULT FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger );
+ LPDIRECTSOUNDBUFFER GetFreeBuffer();
+ LPDIRECTSOUNDBUFFER GetBuffer( DWORD dwIndex );
+
+ HRESULT Play( DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lVolume = 0, LONG lFrequency = -1,
+ LONG lPan = 0 );
+ HRESULT Play3D( LPDS3DBUFFER p3DBuffer, DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lFrequency = 0 );
+ HRESULT Stop();
+ HRESULT Reset();
+ BOOL IsSoundPlaying();
+};
+
+
+//-----------------------------------------------------------------------------
+// Name: class CStreamingSound
+// Desc: Encapsulates functionality to play a wave file with DirectSound.
+// The Create() method loads a chunk of wave file into the buffer,
+// and as sound plays more is written to the buffer by calling
+// HandleWaveStreamNotification() whenever hNotifyEvent is signaled.
+//-----------------------------------------------------------------------------
+class CStreamingSound : public CSound
+{
+protected:
+ DWORD m_dwLastPlayPos;
+ DWORD m_dwPlayProgress;
+ DWORD m_dwNotifySize;
+ DWORD m_dwNextWriteOffset;
+ BOOL m_bFillNextNotificationWithSilence;
+
+public:
+ CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize, CWaveFile* pWaveFile,
+ DWORD dwNotifySize );
+ ~CStreamingSound();
+
+ HRESULT HandleWaveStreamNotification( BOOL bLoopedPlay );
+ HRESULT Reset();
+};
+
+#endif // DXUTSOUND_H
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.cpp b/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.cpp
new file mode 100644
index 0000000..f60bf78
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.cpp
@@ -0,0 +1,546 @@
+//-----------------------------------------------------------------------------
+// File: SDKWaveFile.cpp
+//
+// Desc: Classes for reading and writing wav files. Feel free to use this class
+// as a starting point for adding extra functionality.
+//
+// XNA Developer Connection
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#define STRICT
+#include "DXUT.h"
+#include "SDKwavefile.h"
+#undef min // use __min instead
+#undef max // use __max instead
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::CWaveFile()
+// Desc: Constructs the class. Call Open() to open a wave file for reading.
+// Then call Read() as needed. Calling the destructor or Close()
+// will close the file.
+//-----------------------------------------------------------------------------
+CWaveFile::CWaveFile()
+{
+ m_pwfx = NULL;
+ m_hmmio = NULL;
+ m_pResourceBuffer = NULL;
+ m_dwSize = 0;
+ m_bIsReadingFromMemory = FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::~CWaveFile()
+// Desc: Destructs the class
+//-----------------------------------------------------------------------------
+CWaveFile::~CWaveFile()
+{
+ Close();
+
+ if( !m_bIsReadingFromMemory )
+ SAFE_DELETE_ARRAY( m_pwfx );
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::Open()
+// Desc: Opens a wave file for reading
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags )
+{
+ HRESULT hr;
+
+ m_dwFlags = dwFlags;
+ m_bIsReadingFromMemory = FALSE;
+
+ if( m_dwFlags == WAVEFILE_READ )
+ {
+ if( strFileName == NULL )
+ return E_INVALIDARG;
+ SAFE_DELETE_ARRAY( m_pwfx );
+
+ m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );
+
+ if( NULL == m_hmmio )
+ {
+ HRSRC hResInfo;
+ HGLOBAL hResData;
+ DWORD dwSize;
+ VOID* pvRes;
+
+ // Loading it as a file failed, so try it as a resource
+ if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAVE" ) ) )
+ {
+ if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAV" ) ) )
+ return DXTRACE_ERR( L"FindResource", E_FAIL );
+ }
+
+ if( NULL == ( hResData = LoadResource( GetModuleHandle( NULL ), hResInfo ) ) )
+ return DXTRACE_ERR( L"LoadResource", E_FAIL );
+
+ if( 0 == ( dwSize = SizeofResource( GetModuleHandle( NULL ), hResInfo ) ) )
+ return DXTRACE_ERR( L"SizeofResource", E_FAIL );
+
+ if( NULL == ( pvRes = LockResource( hResData ) ) )
+ return DXTRACE_ERR( L"LockResource", E_FAIL );
+
+ m_pResourceBuffer = new CHAR[ dwSize ];
+ if( m_pResourceBuffer == NULL )
+ return DXTRACE_ERR( L"new", E_OUTOFMEMORY );
+ memcpy( m_pResourceBuffer, pvRes, dwSize );
+
+ MMIOINFO mmioInfo;
+ ZeroMemory( &mmioInfo, sizeof( mmioInfo ) );
+ mmioInfo.fccIOProc = FOURCC_MEM;
+ mmioInfo.cchBuffer = dwSize;
+ mmioInfo.pchBuffer = ( CHAR* )m_pResourceBuffer;
+
+ m_hmmio = mmioOpen( NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ );
+ }
+
+ if( FAILED( hr = ReadMMIO() ) )
+ {
+ // ReadMMIO will fail if its an not a wave file
+ mmioClose( m_hmmio, 0 );
+ return DXTRACE_ERR( L"ReadMMIO", hr );
+ }
+
+ if( FAILED( hr = ResetFile() ) )
+ return DXTRACE_ERR( L"ResetFile", hr );
+
+ // After the reset, the size of the wav file is m_ck.cksize so store it now
+ m_dwSize = m_ck.cksize;
+ }
+ else
+ {
+ m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF |
+ MMIO_READWRITE |
+ MMIO_CREATE );
+ if( NULL == m_hmmio )
+ return DXTRACE_ERR( L"mmioOpen", E_FAIL );
+
+ if( FAILED( hr = WriteMMIO( pwfx ) ) )
+ {
+ mmioClose( m_hmmio, 0 );
+ return DXTRACE_ERR( L"WriteMMIO", hr );
+ }
+
+ if( FAILED( hr = ResetFile() ) )
+ return DXTRACE_ERR( L"ResetFile", hr );
+ }
+
+ return hr;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::OpenFromMemory()
+// Desc: copy data to CWaveFile member variable from memory
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::OpenFromMemory( BYTE* pbData, ULONG ulDataSize,
+ WAVEFORMATEX* pwfx, DWORD dwFlags )
+{
+ m_pwfx = pwfx;
+ m_ulDataSize = ulDataSize;
+ m_pbData = pbData;
+ m_pbDataCur = m_pbData;
+ m_bIsReadingFromMemory = TRUE;
+
+ if( dwFlags != WAVEFILE_READ )
+ return E_NOTIMPL;
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::ReadMMIO()
+// Desc: Support function for reading from a multimedia I/O stream.
+// m_hmmio must be valid before calling. This function uses it to
+// update m_ckRiff, and m_pwfx.
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::ReadMMIO()
+{
+ MMCKINFO ckIn; // chunk info. for general use.
+ PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in.
+
+ memset( &ckIn, 0, sizeof(ckIn) );
+
+ m_pwfx = NULL;
+
+ if( ( 0 != mmioDescend( m_hmmio, &m_ckRiff, NULL, 0 ) ) )
+ return DXTRACE_ERR( L"mmioDescend", E_FAIL );
+
+ // Check to make sure this is a valid wave file
+ if( ( m_ckRiff.ckid != FOURCC_RIFF ) ||
+ ( m_ckRiff.fccType != mmioFOURCC( 'W', 'A', 'V', 'E' ) ) )
+ return DXTRACE_ERR( L"mmioFOURCC", E_FAIL );
+
+ // Search the input file for for the 'fmt ' chunk.
+ ckIn.ckid = mmioFOURCC( 'f', 'm', 't', ' ' );
+ if( 0 != mmioDescend( m_hmmio, &ckIn, &m_ckRiff, MMIO_FINDCHUNK ) )
+ return DXTRACE_ERR( L"mmioDescend", E_FAIL );
+
+ // Expect the 'fmt' chunk to be at least as large as <PCMWAVEFORMAT>;
+ // if there are extra parameters at the end, we'll ignore them
+ if( ckIn.cksize < ( LONG )sizeof( PCMWAVEFORMAT ) )
+ return DXTRACE_ERR( L"sizeof(PCMWAVEFORMAT)", E_FAIL );
+
+ // Read the 'fmt ' chunk into <pcmWaveFormat>.
+ if( mmioRead( m_hmmio, ( HPSTR )&pcmWaveFormat,
+ sizeof( pcmWaveFormat ) ) != sizeof( pcmWaveFormat ) )
+ return DXTRACE_ERR( L"mmioRead", E_FAIL );
+
+ // Allocate the waveformatex, but if its not pcm format, read the next
+ // word, and thats how many extra bytes to allocate.
+ if( pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM )
+ {
+ m_pwfx = ( WAVEFORMATEX* )new CHAR[ sizeof( WAVEFORMATEX ) ];
+ if( NULL == m_pwfx )
+ return DXTRACE_ERR( L"m_pwfx", E_FAIL );
+
+ // Copy the bytes from the pcm structure to the waveformatex structure
+ memcpy( m_pwfx, &pcmWaveFormat, sizeof( pcmWaveFormat ) );
+ m_pwfx->cbSize = 0;
+ }
+ else
+ {
+ // Read in length of extra bytes.
+ WORD cbExtraBytes = 0L;
+ if( mmioRead( m_hmmio, ( CHAR* )&cbExtraBytes, sizeof( WORD ) ) != sizeof( WORD ) )
+ return DXTRACE_ERR( L"mmioRead", E_FAIL );
+
+ m_pwfx = ( WAVEFORMATEX* )new CHAR[ sizeof( WAVEFORMATEX ) + cbExtraBytes ];
+ if( NULL == m_pwfx )
+ return DXTRACE_ERR( L"new", E_FAIL );
+
+ // Copy the bytes from the pcm structure to the waveformatex structure
+ memcpy( m_pwfx, &pcmWaveFormat, sizeof( pcmWaveFormat ) );
+ m_pwfx->cbSize = cbExtraBytes;
+
+ // Now, read those extra bytes into the structure, if cbExtraAlloc != 0.
+ if( mmioRead( m_hmmio, ( CHAR* )( ( ( BYTE* )&( m_pwfx->cbSize ) ) + sizeof( WORD ) ),
+ cbExtraBytes ) != cbExtraBytes )
+ {
+ SAFE_DELETE( m_pwfx );
+ return DXTRACE_ERR( L"mmioRead", E_FAIL );
+ }
+ }
+
+ // Ascend the input file out of the 'fmt ' chunk.
+ if( 0 != mmioAscend( m_hmmio, &ckIn, 0 ) )
+ {
+ SAFE_DELETE( m_pwfx );
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+ }
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::GetSize()
+// Desc: Retuns the size of the read access wave file
+//-----------------------------------------------------------------------------
+DWORD CWaveFile::GetSize()
+{
+ return m_dwSize;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::ResetFile()
+// Desc: Resets the internal m_ck pointer so reading starts from the
+// beginning of the file again
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::ResetFile()
+{
+ if( m_bIsReadingFromMemory )
+ {
+ m_pbDataCur = m_pbData;
+ }
+ else
+ {
+ if( m_hmmio == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ if( m_dwFlags == WAVEFILE_READ )
+ {
+ // Seek to the data
+ if( -1 == mmioSeek( m_hmmio, m_ckRiff.dwDataOffset + sizeof( FOURCC ),
+ SEEK_SET ) )
+ return DXTRACE_ERR( L"mmioSeek", E_FAIL );
+
+ // Search the input file for the 'data' chunk.
+ m_ck.ckid = mmioFOURCC( 'd', 'a', 't', 'a' );
+ if( 0 != mmioDescend( m_hmmio, &m_ck, &m_ckRiff, MMIO_FINDCHUNK ) )
+ return DXTRACE_ERR( L"mmioDescend", E_FAIL );
+ }
+ else
+ {
+ // Create the 'data' chunk that holds the waveform samples.
+ m_ck.ckid = mmioFOURCC( 'd', 'a', 't', 'a' );
+ m_ck.cksize = 0;
+
+ if( 0 != mmioCreateChunk( m_hmmio, &m_ck, 0 ) )
+ return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL );
+
+ if( 0 != mmioGetInfo( m_hmmio, &m_mmioinfoOut, 0 ) )
+ return DXTRACE_ERR( L"mmioGetInfo", E_FAIL );
+ }
+ }
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::Read()
+// Desc: Reads section of data from a wave file into pBuffer and returns
+// how much read in pdwSizeRead, reading not more than dwSizeToRead.
+// This uses m_ck to determine where to start reading from. So
+// subsequent calls will be continue where the last left off unless
+// Reset() is called.
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead )
+{
+ if( m_bIsReadingFromMemory )
+ {
+ if( m_pbDataCur == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( pdwSizeRead != NULL )
+ *pdwSizeRead = 0;
+
+ if( ( BYTE* )( m_pbDataCur + dwSizeToRead ) >
+ ( BYTE* )( m_pbData + m_ulDataSize ) )
+ {
+ dwSizeToRead = m_ulDataSize - ( DWORD )( m_pbDataCur - m_pbData );
+ }
+
+#pragma warning( disable: 4616 ) // disable warning about warning number '22104' being out of range
+#pragma warning( disable: 22104 ) // disable PREfast warning during static code analysis
+ CopyMemory( pBuffer, m_pbDataCur, dwSizeToRead );
+#pragma warning( default: 22104 )
+#pragma warning( default: 4616 )
+
+ if( pdwSizeRead != NULL )
+ *pdwSizeRead = dwSizeToRead;
+
+ return S_OK;
+ }
+ else
+ {
+ MMIOINFO mmioinfoIn; // current status of m_hmmio
+
+ if( m_hmmio == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( pBuffer == NULL || pdwSizeRead == NULL )
+ return E_INVALIDARG;
+
+ *pdwSizeRead = 0;
+
+ if( 0 != mmioGetInfo( m_hmmio, &mmioinfoIn, 0 ) )
+ return DXTRACE_ERR( L"mmioGetInfo", E_FAIL );
+
+ UINT cbDataIn = dwSizeToRead;
+ if( cbDataIn > m_ck.cksize )
+ cbDataIn = m_ck.cksize;
+
+ m_ck.cksize -= cbDataIn;
+
+ for( DWORD cT = 0; cT < cbDataIn; cT++ )
+ {
+ // Copy the bytes from the io to the buffer.
+ if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
+ {
+ if( 0 != mmioAdvance( m_hmmio, &mmioinfoIn, MMIO_READ ) )
+ return DXTRACE_ERR( L"mmioAdvance", E_FAIL );
+
+ if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead )
+ return DXTRACE_ERR( L"mmioinfoIn.pchNext", E_FAIL );
+ }
+
+ // Actual copy.
+ *( ( BYTE* )pBuffer + cT ) = *( ( BYTE* )mmioinfoIn.pchNext );
+ mmioinfoIn.pchNext++;
+ }
+
+ if( 0 != mmioSetInfo( m_hmmio, &mmioinfoIn, 0 ) )
+ return DXTRACE_ERR( L"mmioSetInfo", E_FAIL );
+
+ *pdwSizeRead = cbDataIn;
+
+ return S_OK;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::Close()
+// Desc: Closes the wave file
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::Close()
+{
+ if( m_dwFlags == WAVEFILE_READ )
+ {
+ if ( m_hmmio != NULL )
+ {
+ mmioClose( m_hmmio, 0 );
+ m_hmmio = NULL;
+ }
+ SAFE_DELETE_ARRAY( m_pResourceBuffer );
+ }
+ else
+ {
+ m_mmioinfoOut.dwFlags |= MMIO_DIRTY;
+
+ if( m_hmmio == NULL )
+ return CO_E_NOTINITIALIZED;
+
+ if( 0 != mmioSetInfo( m_hmmio, &m_mmioinfoOut, 0 ) )
+ return DXTRACE_ERR( L"mmioSetInfo", E_FAIL );
+
+ // Ascend the output file out of the 'data' chunk -- this will cause
+ // the chunk size of the 'data' chunk to be written.
+ if( 0 != mmioAscend( m_hmmio, &m_ck, 0 ) )
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+
+ // Do this here instead...
+ if( 0 != mmioAscend( m_hmmio, &m_ckRiff, 0 ) )
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+
+ mmioSeek( m_hmmio, 0, SEEK_SET );
+
+ if( 0 != ( INT )mmioDescend( m_hmmio, &m_ckRiff, NULL, 0 ) )
+ return DXTRACE_ERR( L"mmioDescend", E_FAIL );
+
+ m_ck.ckid = mmioFOURCC( 'f', 'a', 'c', 't' );
+
+ if( 0 == mmioDescend( m_hmmio, &m_ck, &m_ckRiff, MMIO_FINDCHUNK ) )
+ {
+ DWORD dwSamples = 0;
+ mmioWrite( m_hmmio, ( HPSTR )&dwSamples, sizeof( DWORD ) );
+ mmioAscend( m_hmmio, &m_ck, 0 );
+ }
+
+ // Ascend the output file out of the 'RIFF' chunk -- this will cause
+ // the chunk size of the 'RIFF' chunk to be written.
+ if( 0 != mmioAscend( m_hmmio, &m_ckRiff, 0 ) )
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+
+ mmioClose( m_hmmio, 0 );
+ m_hmmio = NULL;
+ }
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::WriteMMIO()
+// Desc: Support function for reading from a multimedia I/O stream
+// pwfxDest is the WAVEFORMATEX for this new wave file.
+// m_hmmio must be valid before calling. This function uses it to
+// update m_ckRiff, and m_ck.
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::WriteMMIO( WAVEFORMATEX* pwfxDest )
+{
+ DWORD dwFactChunk; // Contains the actual fact chunk. Garbage until WaveCloseWriteFile.
+ MMCKINFO ckOut1;
+
+ memset( &ckOut1, 0, sizeof(ckOut1) );
+
+ dwFactChunk = ( DWORD )-1;
+
+ // Create the output file RIFF chunk of form type 'WAVE'.
+ m_ckRiff.fccType = mmioFOURCC( 'W', 'A', 'V', 'E' );
+ m_ckRiff.cksize = 0;
+
+ if( 0 != mmioCreateChunk( m_hmmio, &m_ckRiff, MMIO_CREATERIFF ) )
+ return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL );
+
+ // We are now descended into the 'RIFF' chunk we just created.
+ // Now create the 'fmt ' chunk. Since we know the size of this chunk,
+ // specify it in the MMCKINFO structure so MMIO doesn't have to seek
+ // back and set the chunk size after ascending from the chunk.
+ m_ck.ckid = mmioFOURCC( 'f', 'm', 't', ' ' );
+ m_ck.cksize = sizeof( PCMWAVEFORMAT );
+
+ if( 0 != mmioCreateChunk( m_hmmio, &m_ck, 0 ) )
+ return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL );
+
+ // Write the PCMWAVEFORMAT structure to the 'fmt ' chunk if its that type.
+ if( pwfxDest->wFormatTag == WAVE_FORMAT_PCM )
+ {
+ if( mmioWrite( m_hmmio, ( HPSTR )pwfxDest,
+ sizeof( PCMWAVEFORMAT ) ) != sizeof( PCMWAVEFORMAT ) )
+ return DXTRACE_ERR( L"mmioWrite", E_FAIL );
+ }
+ else
+ {
+ // Write the variable length size.
+ if( ( UINT )mmioWrite( m_hmmio, ( HPSTR )pwfxDest,
+ sizeof( *pwfxDest ) + pwfxDest->cbSize ) !=
+ ( sizeof( *pwfxDest ) + pwfxDest->cbSize ) )
+ return DXTRACE_ERR( L"mmioWrite", E_FAIL );
+ }
+
+ // Ascend out of the 'fmt ' chunk, back into the 'RIFF' chunk.
+ if( 0 != mmioAscend( m_hmmio, &m_ck, 0 ) )
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+
+ // Now create the fact chunk, not required for PCM but nice to have. This is filled
+ // in when the close routine is called.
+ ckOut1.ckid = mmioFOURCC( 'f', 'a', 'c', 't' );
+ ckOut1.cksize = 0;
+
+ if( 0 != mmioCreateChunk( m_hmmio, &ckOut1, 0 ) )
+ return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL );
+
+ if( mmioWrite( m_hmmio, ( HPSTR )&dwFactChunk, sizeof( dwFactChunk ) ) !=
+ sizeof( dwFactChunk ) )
+ return DXTRACE_ERR( L"mmioWrite", E_FAIL );
+
+ // Now ascend out of the fact chunk...
+ if( 0 != mmioAscend( m_hmmio, &ckOut1, 0 ) )
+ return DXTRACE_ERR( L"mmioAscend", E_FAIL );
+
+ return S_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Name: CWaveFile::Write()
+// Desc: Writes data to the open wave file
+//-----------------------------------------------------------------------------
+HRESULT CWaveFile::Write( UINT nSizeToWrite, BYTE* pbSrcData, UINT* pnSizeWrote )
+{
+ UINT cT;
+
+ if( m_bIsReadingFromMemory )
+ return E_NOTIMPL;
+ if( m_hmmio == NULL )
+ return CO_E_NOTINITIALIZED;
+ if( pnSizeWrote == NULL || pbSrcData == NULL )
+ return E_INVALIDARG;
+
+ *pnSizeWrote = 0;
+
+ for( cT = 0; cT < nSizeToWrite; cT++ )
+ {
+ if( m_mmioinfoOut.pchNext == m_mmioinfoOut.pchEndWrite )
+ {
+ m_mmioinfoOut.dwFlags |= MMIO_DIRTY;
+ if( 0 != mmioAdvance( m_hmmio, &m_mmioinfoOut, MMIO_WRITE ) )
+ return DXTRACE_ERR( L"mmioAdvance", E_FAIL );
+ }
+
+ *( ( BYTE* )m_mmioinfoOut.pchNext ) = *( ( BYTE* )pbSrcData + cT );
+ ( BYTE* )m_mmioinfoOut.pchNext++;
+
+ ( *pnSizeWrote )++;
+ }
+
+ return S_OK;
+}
diff --git a/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.h b/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.h
new file mode 100644
index 0000000..66f6fbf
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/SDKwavefile.h
@@ -0,0 +1,59 @@
+//-----------------------------------------------------------------------------
+// File: WaveFile.h
+//
+// Copyright (c) Microsoft Corp. All rights reserved.
+//-----------------------------------------------------------------------------
+#ifndef DXUTWAVEFILE_H
+#define DXUTWAVEFILE_H
+
+//-----------------------------------------------------------------------------
+// Typing macros
+//-----------------------------------------------------------------------------
+#define WAVEFILE_READ 1
+#define WAVEFILE_WRITE 2
+
+//-----------------------------------------------------------------------------
+// Name: class CWaveFile
+// Desc: Encapsulates reading or writing sound data to or from a wave file
+//-----------------------------------------------------------------------------
+class CWaveFile
+{
+public:
+ WAVEFORMATEX* m_pwfx; // Pointer to WAVEFORMATEX structure
+ HMMIO m_hmmio; // MM I/O handle for the WAVE
+ MMCKINFO m_ck; // Multimedia RIFF chunk
+ MMCKINFO m_ckRiff; // Use in opening a WAVE file
+ DWORD m_dwSize; // The size of the wave file
+ MMIOINFO m_mmioinfoOut;
+ DWORD m_dwFlags;
+ BOOL m_bIsReadingFromMemory;
+ BYTE* m_pbData;
+ BYTE* m_pbDataCur;
+ ULONG m_ulDataSize;
+ CHAR* m_pResourceBuffer;
+
+protected:
+ HRESULT ReadMMIO();
+ HRESULT WriteMMIO( WAVEFORMATEX* pwfxDest );
+
+public:
+ CWaveFile();
+ ~CWaveFile();
+
+ HRESULT Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags );
+ HRESULT OpenFromMemory( BYTE* pbData, ULONG ulDataSize, WAVEFORMATEX* pwfx, DWORD dwFlags );
+ HRESULT Close();
+
+ HRESULT Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead );
+ HRESULT Write( UINT nSizeToWrite, BYTE* pbData, UINT* pnSizeWrote );
+
+ DWORD GetSize();
+ HRESULT ResetFile();
+ WAVEFORMATEX* GetFormat()
+ {
+ return m_pwfx;
+ };
+};
+
+
+#endif // DXUTWAVEFILE_H
diff --git a/samples/DX_APIUsage/DXUT/Optional/directx.ico b/samples/DX_APIUsage/DXUT/Optional/directx.ico
new file mode 100644
index 0000000..bc43c1b
--- /dev/null
+++ b/samples/DX_APIUsage/DXUT/Optional/directx.ico
Binary files differ